Fix bug: Folder is created in the wrong account
authormasensio <masensio@solidgear.es>
Fri, 20 Mar 2015 14:12:33 +0000 (15:12 +0100)
committermasensio <masensio@solidgear.es>
Fri, 20 Mar 2015 14:12:33 +0000 (15:12 +0100)
src/com/owncloud/android/ui/activity/FileActivity.java
src/com/owncloud/android/ui/activity/Uploader.java

index 7f48b9e..a566ccd 100644 (file)
@@ -98,10 +98,10 @@ public class FileActivity extends SherlockFragmentActivity
     private boolean mRedirectingToSetupAccount = false;
     
     /** Flag to signal when the value of mAccount was set */ 
-    private boolean mAccountWasSet;
+    protected boolean mAccountWasSet;
     
     /** Flag to signal when the value of mAccount was restored from a saved state */ 
-    private boolean mAccountWasRestored;
+    protected boolean mAccountWasRestored;
     
     /** Flag to signal if the activity is launched by a notification */
     private boolean mFromNotification;
@@ -243,7 +243,7 @@ public class FileActivity extends SherlockFragmentActivity
      *  @param account          New {@link Account} to set.
      *  @param savedAccount     When 'true', account was retrieved from a saved instance state.
      */
-    private void setAccount(Account account, boolean savedAccount) {
+    protected void setAccount(Account account, boolean savedAccount) {
         Account oldAccount = mAccount;
         boolean validAccount = (account != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name));
         if (validAccount) {
@@ -341,6 +341,10 @@ public class FileActivity extends SherlockFragmentActivity
         return mAccount;
     }
 
+    protected void setAccount(Account account) {
+        mAccount = account;
+    }
+
     /**
      * @return Value of mFromNotification: True if the Activity is launched by a notification
      */
index edd2f5d..452647d 100644 (file)
@@ -64,7 +64,6 @@ import com.actionbarsherlock.view.MenuItem;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountAuthenticator;
-import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
@@ -84,13 +83,13 @@ public class Uploader extends FileActivity
 
     private static final String TAG = Uploader.class.getSimpleName();
 
-    private Account mAccount;
+    //private Account mAccount;
     private AccountManager mAccountManager;
     private Stack<String> mParents;
     private ArrayList<Parcelable> mStreamsToUpload;
     private boolean mCreateDir;
     private String mUploadPath;
-    private FileDataStorageManager mStorageManager;
+    //private FileDataStorageManager mStorageManager;
     private OCFile mFile;
     private boolean mAccountSelected = false;
     
@@ -108,22 +107,52 @@ public class Uploader extends FileActivity
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
+        prepareStreamsToUpload();
+
         super.onCreate(savedInstanceState);
 
         if (savedInstanceState == null) {
             mParents = new Stack<String>();
         } else {
             mParents = (Stack<String>) savedInstanceState.getSerializable(KEY_PARENTS);
-            mAccount = savedInstanceState.getParcelable(KEY_ACCOUNT);
+//            mAccount = savedInstanceState.getParcelable(KEY_ACCOUNT);
             mFile = savedInstanceState.getParcelable(KEY_FILE);
-            mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+//            mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
             mAccountSelected = savedInstanceState.getBoolean(KEY_ACCOUNT_SELECTED);
         }
 
         ActionBar actionBar = getSupportActionBar();
         actionBar.setIcon(DisplayUtils.getSeasonalIconId());
 
-        if (prepareStreamsToUpload()) {
+
+//        if (somethingToUpload()) {
+//            mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
+//            Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType());
+//            if (accounts.length == 0) {
+//                Log_OC.i(TAG, "No ownCloud account is available");
+//                showDialog(DIALOG_NO_ACCOUNT);
+//            } else if (accounts.length > 1 && !mAccountSelected) {
+//                Log_OC.i(TAG, "More than one ownCloud is available");
+//                showDialog(DIALOG_MULTIPLE_ACCOUNT);
+//            } else {
+//                if (savedInstanceState == null) {
+//                    mAccount = accounts[0];
+//                    mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+//                }
+//                initTargetFolder();
+//                populateDirectoryList();
+//
+//            }
+//
+//        } else {
+//            showDialog(DIALOG_NO_STREAM);
+//        }
+
+    }
+
+    @Override
+    protected void setAccount(Account account, boolean savedAccount) {
+        if (somethingToUpload()) {
             mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
             Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType());
             if (accounts.length == 0) {
@@ -133,19 +162,47 @@ public class Uploader extends FileActivity
                 Log_OC.i(TAG, "More than one ownCloud is available");
                 showDialog(DIALOG_MULTIPLE_ACCOUNT);
             } else {
-                if (savedInstanceState == null) {
-                    mAccount = accounts[0];
-                    mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+                if (!savedAccount) {
+                    //mAccount = accounts[0];
+                    //mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+                    setAccount(accounts[0]);
                 }
-                initTargetFolder();
-                populateDirectoryList();
-                
+                // Part in onAccountSet
+//                initTargetFolder();
+//                populateDirectoryList();
+
             }
-            
+
         } else {
             showDialog(DIALOG_NO_STREAM);
         }
 
+        super.setAccount(account, savedAccount);
+
+//        Account oldAccount = mAccount;
+//        boolean validAccount = (account != null &&
+//                AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name));
+//        if (validAccount) {
+//            mAccount = account;
+//            mAccountWasSet = true;
+//            mAccountWasRestored = (savedAccount || mAccount.equals(oldAccount));
+//
+//        } else {
+//            swapToDefaultAccount();
+//        }
+    }
+
+    @Override
+    protected void onAccountSet(boolean stateWasRecovered) {
+        super.onAccountSet(mAccountWasRestored);
+        initTargetFolder();
+        populateDirectoryList();
+//        if (getAccount() != null) {
+//            mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
+//
+//        } else {
+//            Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
+//        }
     }
 
     @Override
@@ -153,7 +210,7 @@ public class Uploader extends FileActivity
          Log_OC.d(TAG, "onSaveInstanceState() start");
         super.onSaveInstanceState(outState);
         outState.putSerializable(KEY_PARENTS, mParents);
-        outState.putParcelable(KEY_ACCOUNT, mAccount);
+        //outState.putParcelable(KEY_ACCOUNT, mAccount);
         outState.putParcelable(KEY_FILE, mFile);
         outState.putBoolean(KEY_ACCOUNT_SELECTED, mAccountSelected);
 
@@ -217,10 +274,11 @@ public class Uploader extends FileActivity
             builder.setItems(ac, new OnClickListener() {
                 @Override
                 public void onClick(DialogInterface dialog, int which) {
-                    mAccount = mAccountManager.getAccountsByType(MainApp.getAccountType())[which];
-                    mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
-                    initTargetFolder();
-                    populateDirectoryList();
+                    setAccount(mAccountManager.getAccountsByType(MainApp.getAccountType())[which]);
+                    onAccountSet(mAccountWasRestored);
+//                    mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
+//                    initTargetFolder();
+//                    populateDirectoryList();
                     dialog.dismiss();
                     mAccountSelected = true;
                 }
@@ -284,7 +342,7 @@ public class Uploader extends FileActivity
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         // click on folder in the list
         Log_OC.d(TAG, "on item click");
-        Vector<OCFile> tmpfiles = mStorageManager.getFolderContent(mFile);
+        Vector<OCFile> tmpfiles = getStorageManager().getFolderContent(mFile);
         if (tmpfiles.size() <= 0) return;
         // filter on dirtype
         Vector<OCFile> files = new Vector<OCFile>();
@@ -339,7 +397,7 @@ public class Uploader extends FileActivity
                 // there is no need for checking for is there more then one
                 // account at this point
                 // since account setup can set only one account at time
-                mAccount = accounts[0];
+                setAccount(accounts[0]);
                 populateDirectoryList();
             }
         }
@@ -366,9 +424,9 @@ public class Uploader extends FileActivity
         
         Log_OC.d(TAG, "Populating view with content of : " + full_path);
 
-        mFile = mStorageManager.getFileByPath(full_path);
+        mFile = getStorageManager().getFileByPath(full_path);
         if (mFile != null) {
-            Vector<OCFile> files = mStorageManager.getFolderContent(mFile);
+            Vector<OCFile> files = getStorageManager().getFolderContent(mFile);
             List<HashMap<String, Object>> data = new LinkedList<HashMap<String,Object>>();
             for (OCFile f : files) {
                 HashMap<String, Object> h = new HashMap<String, Object>();
@@ -402,13 +460,16 @@ public class Uploader extends FileActivity
         return full_path;
     }
 
-    private boolean prepareStreamsToUpload() {
+    private void prepareStreamsToUpload() {
         if (getIntent().getAction().equals(Intent.ACTION_SEND)) {
             mStreamsToUpload = new ArrayList<Parcelable>();
             mStreamsToUpload.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM));
         } else if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
             mStreamsToUpload = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
         }
+    }
+
+    private boolean somethingToUpload() {
         return (mStreamsToUpload != null && mStreamsToUpload.get(0) != null);
     }
 
@@ -507,7 +568,7 @@ public class Uploader extends FileActivity
             intent.putExtra(FileUploader.KEY_LOCAL_FILE, local.toArray(new String[local.size()]));
             intent.putExtra(FileUploader.KEY_REMOTE_FILE,
                     remote.toArray(new String[remote.size()]));
-            intent.putExtra(FileUploader.KEY_ACCOUNT, mAccount);
+            intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
             startService(intent);
 
             //Save the path to shared preferences
@@ -570,7 +631,7 @@ public class Uploader extends FileActivity
      *  The target account has to be chosen before this method is called. 
      */
     private void initTargetFolder() {
-        if (mStorageManager == null) {
+        if (getStorageManager() == null) {
             throw new IllegalStateException("Do not call this method before " +
                     "initializing mStorageManager");
         }
@@ -589,7 +650,7 @@ public class Uploader extends FileActivity
                 mParents.add(dir);
         }
         //Make sure that path still exists, if it doesn't pop the stack and try the previous path
-            while(!mStorageManager.fileExists(generatePath(mParents)) && mParents.size() > 1){
+            while(!getStorageManager().fileExists(generatePath(mParents)) && mParents.size() > 1){
                 mParents.pop();
             }
     }