Merged with owncloud develop
authorSam <odeh_sam@hotmail.com>
Wed, 3 Dec 2014 09:04:39 +0000 (10:04 +0100)
committerSam <odeh_sam@hotmail.com>
Wed, 3 Dec 2014 09:04:39 +0000 (10:04 +0100)
1  2 
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@@ -25,14 -25,13 +25,15 @@@ import android.accounts.Account
  import android.accounts.AccountManager;
  import android.accounts.AuthenticatorException;
  import android.accounts.OperationCanceledException;
 +import android.annotation.SuppressLint;
 +import android.annotation.TargetApi;
  import android.app.AlertDialog;
  import android.app.Dialog;
  import android.app.ProgressDialog;
  import android.content.BroadcastReceiver;
  import android.content.ComponentName;
  import android.content.ContentResolver;
+ import android.content.ContentUris;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.Intent;
@@@ -45,12 -44,16 +46,16 @@@ import android.database.Cursor
  import android.net.Uri;
  import android.os.Build;
  import android.os.Bundle;
+ import android.os.Environment;
  import android.os.IBinder;
  import android.preference.PreferenceManager;
+ import android.provider.DocumentsContract;
  import android.provider.MediaStore;
+ import android.provider.OpenableColumns;
  import android.support.v4.app.Fragment;
  import android.support.v4.app.FragmentManager;
  import android.support.v4.app.FragmentTransaction;
+ import android.util.Log;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.ArrayAdapter;
@@@ -104,6 -107,7 +109,7 @@@ import com.owncloud.android.ui.preview.
  import com.owncloud.android.ui.preview.PreviewVideoActivity;
  import com.owncloud.android.utils.DisplayUtils;
  import com.owncloud.android.utils.ErrorMessageAdapter;
+ import com.owncloud.android.utils.UriUtils;
  
  
  /**
@@@ -154,7 -158,7 +160,7 @@@ OnSslUntrustedCertListener, OnEnforceab
      private String DIALOG_UNTRUSTED_CERT;
      
      private OCFile mWaitingToSend;
-     
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          Log_OC.d(TAG, "onCreate() start");
              builder.setExpedited(true);
              builder.setManual(true);
              builder.syncOnce();
+             // Fix bug in Android Lollipop when you click on refresh the whole account
+             Bundle extras = new Bundle();
+             builder.setExtras(extras);
              SyncRequest request = builder.build();
              ContentResolver.requestSync(request);
          }
  
      /**
       * Called, when the user selected something for uploading
 +     *
       */
 +    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
  
          if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
 -            requestSimpleUpload(data, resultCode);
 -
 +            //getClipData is only supported on api level 16+, Jelly Bean
 +            if (data.getData() == null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
 +                for( int i = 0; i < data.getClipData().getItemCount(); i++){
 +                    Intent intent = new Intent();
 +                    intent.setData(data.getClipData().getItemAt(i).getUri());
 +                    requestSimpleUpload(intent, resultCode);
 +                }
 +            }else {
 +                requestSimpleUpload(data, resultCode);
 +            }
          } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {
              requestMultipleUpload(data, resultCode);
  
  
      private void requestSimpleUpload(Intent data, int resultCode) {
          String filepath = null;
+         String mimeType = null;
+         Uri selectedImageUri = data.getData();
          try {
-             Uri selectedImageUri = data.getData();
+             mimeType = getContentResolver().getType(selectedImageUri);
  
              String filemanagerstring = selectedImageUri.getPath();
              String selectedImagePath = getPath(selectedImageUri);
          }
          if (!remotepath.endsWith(OCFile.PATH_SEPARATOR))
              remotepath += OCFile.PATH_SEPARATOR;
-         remotepath += new File(filepath).getName();
+         if (filepath.startsWith(UriUtils.URI_CONTENT_SCHEME)) {
+             Cursor cursor = MainApp.getAppContext().getContentResolver()
+                     .query(Uri.parse(filepath), null, null, null, null, null);
+             try {
+                 if (cursor != null && cursor.moveToFirst()) {
+                     String displayName = cursor.getString(
+                             cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
+                     Log.i(TAG, "Display Name: " + displayName + "; mimeType: " + mimeType);
+                     displayName.replace(File.separatorChar, '_');
+                     displayName.replace(File.pathSeparatorChar, '_');
+                     remotepath += displayName + DisplayUtils.getComposedFileExtension(filepath);
+                 }
+             } finally {
+                 cursor.close();
+             }
+         } else {
+             remotepath += new File(filepath).getName();
+         }
  
          i.putExtra(FileUploader.KEY_LOCAL_FILE, filepath);
          i.putExtra(FileUploader.KEY_REMOTE_FILE, remotepath);
+         i.putExtra(FileUploader.KEY_MIME_TYPE, mimeType);
          i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);
          if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)
              i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);
                      } else if (item == 1) {
                          Intent action = new Intent(Intent.ACTION_GET_CONTENT);
                          action = action.setType("*/*").addCategory(Intent.CATEGORY_OPENABLE);
 +                        //Intent.EXTRA_ALLOW_MULTIPLE is only supported on api level 18+, Jelly Bean
 +                        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
 +                            action.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
 +                        }
                          startActivityForResult(Intent.createChooser(action, getString(R.string.upload_chooser_title)),
                                  ACTION_SELECT_CONTENT_FROM_APPS);
                      }
          return dialog;
      }
  
      /**
-      * Translates a content URI of an image to a physical path
-      * on the disk
+      * Translates a content URI of an content to a physical path on the disk
+      * 
       * @param uri The URI to resolve
-      * @return The path to the image or null if it could not be found
+      * @return The path to the content or null if it could not be found
       */
      public String getPath(Uri uri) {
-         String[] projection = { MediaStore.Images.Media.DATA };
-         Cursor cursor = managedQuery(uri, projection, null, null, null);
-         if (cursor != null) {
-             int column_index = cursor
-                     .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
-             cursor.moveToFirst();
-             return cursor.getString(column_index);
-         } 
+         final boolean isKitKatOrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+         // DocumentProvider
+         if (isKitKatOrLater && DocumentsContract.isDocumentUri(getApplicationContext(), uri)) {
+             // ExternalStorageProvider
+             if (UriUtils.isExternalStorageDocument(uri)) {
+                 final String docId = DocumentsContract.getDocumentId(uri);
+                 final String[] split = docId.split(":");
+                 final String type = split[0];
+                 if ("primary".equalsIgnoreCase(type)) {
+                     return Environment.getExternalStorageDirectory() + "/" + split[1];
+                 }
+             }
+             // DownloadsProvider
+             else if (UriUtils.isDownloadsDocument(uri)) {
+                 final String id = DocumentsContract.getDocumentId(uri);
+                 final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),
+                         Long.valueOf(id));
+                 return UriUtils.getDataColumn(getApplicationContext(), contentUri, null, null);
+             }
+             // MediaProvider
+             else if (UriUtils.isMediaDocument(uri)) {
+                 final String docId = DocumentsContract.getDocumentId(uri);
+                 final String[] split = docId.split(":");
+                 final String type = split[0];
+                 Uri contentUri = null;
+                 if ("image".equals(type)) {
+                     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+                 } else if ("video".equals(type)) {
+                     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
+                 } else if ("audio".equals(type)) {
+                     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
+                 }
+                 final String selection = "_id=?";
+                 final String[] selectionArgs = new String[] { split[1] };
+                 return UriUtils.getDataColumn(getApplicationContext(), contentUri, selection, selectionArgs);
+             }
+             // Documents providers returned as content://...
+             else if (UriUtils.isContentDocument(uri)) {
+                 return uri.toString();
+             }
+         }
+         // MediaStore (and general)
+         else if ("content".equalsIgnoreCase(uri.getScheme())) {
+             // Return the remote address
+             if (UriUtils.isGooglePhotosUri(uri))
+                 return uri.getLastPathSegment();
+             return UriUtils.getDataColumn(getApplicationContext(), uri, null, null);
+         }
+         // File
+         else if ("file".equalsIgnoreCase(uri.getScheme())) {
+             return uri.getPath();
+         }
          return null;
      }