Browse Source

REFACTORING: fix layout problems in orientation changes after removing FileDetailActivity

David A. Velasco 12 năm trước cách đây
mục cha
commit
c70f333358

+ 2 - 1
.classpath

@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="gen"/>
+	<classpathentry kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
 	<classpathentry kind="output" path="bin/classes"/>
 </classpath>

+ 0 - 42
res/layout-large-land/files.xml

@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ownCloud Android client application
-
-  Copyright (C) 2011  Bartek Przybylski
-  Copyright (C) 2012-2013 ownCloud Inc.
-
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License version 2,
-  as published by the Free Software Foundation.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@color/owncloud_white"
-    android:orientation="horizontal"
-    android:baselineAligned="false" 
-    >
-
-	<fragment
-		android:id="@+id/list_of_files_fragment"
-		android:layout_width="0dp"
-		android:layout_height="match_parent"
-		android:layout_weight="1"
-		class="com.owncloud.android.ui.fragment.OCFileListFragment" 
-		/>
-
-    <FrameLayout android:id="@+id/right_fragment_container"
-        android:layout_width="0dp"
-        android:layout_weight="2" 
-        android:layout_height="match_parent"
-        />
-
-</LinearLayout>

+ 2 - 2
res/layout/file_details_empty.xml

@@ -18,8 +18,8 @@
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
     android:background="#F7F7F7"
     android:orientation="vertical" >
 

+ 3 - 2
res/layout/file_details_fragment.xml

@@ -19,8 +19,9 @@
 -->
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 	android:id="@+id/fdScrollView"
-	android:layout_width="fill_parent"
-	android:layout_height="fill_parent" >
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	>
 
 	<RelativeLayout
 		android:layout_width="match_parent"

+ 19 - 12
res/layout/files.xml

@@ -17,19 +17,26 @@
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  -->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/owncloud_white"
-    android:id="@+id/single_fragment_container">
+    android:orientation="horizontal"
+    android:baselineAligned="false"
+    >
 
-    <!-- 
-    <fragment
-        android:id="@+id/fileList"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        class="com.owncloud.android.ui.fragment.OCFileListFragment" >
-    </fragment>
-     -->
-
-</FrameLayout>
+	<FrameLayout 
+		android:layout_width="0dp"
+		android:layout_height="match_parent"
+		android:layout_weight="1"
+		android:id="@+id/left_fragment_container"
+	    />
+	
+	<FrameLayout 
+		android:layout_width="0dp"
+		android:layout_height="match_parent"
+		android:layout_weight="2"
+		android:id="@+id/right_fragment_container"
+	    />
+	
+ </LinearLayout>

+ 4 - 3
res/layout/list_fragment.xml

@@ -18,9 +18,10 @@
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-	android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical" >
+	android:layout_width="0dp"
+	android:layout_height="match_parent"
+	android:layout_weight="1"
+	android:orientation="vertical" >
 
 	<com.owncloud.android.ui.ExtendedListView
         android:id="@+id/list_root"

+ 22 - 0
res/values-large-land/bools.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ownCloud Android client application
+
+  Copyright (C) 2012-2013 ownCloud Inc.
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License version 2,
+  as published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<!-- Large screen, landscape orientation boolean values -->
+<resources>
+    <bool name="large_land_layout">true</bool>
+</resources>

+ 0 - 4
res/values-large/bools.xml

@@ -1,4 +0,0 @@
-<!-- Large screen boolean values -->
-<resources>
-    <bool name="large_layout">true</bool>
-</resources>

+ 1 - 1
res/values/bools.xml

@@ -18,5 +18,5 @@
 -->
 <!-- Default boolean values -->
 <resources>
-    <bool name="large_layout">false</bool>
+    <bool name="large_land_layout">false</bool>
 </resources>

+ 8 - 6
src/com/owncloud/android/AccountUtils.java

@@ -37,12 +37,13 @@ public class AccountUtils {
     public static final String STATUS_PATH = "/status.php";
 
     /**
-     * Can be used to get the currently selected ownCloud account in the
-     * preferences
+     * Can be used to get the currently selected ownCloud {@link Account} in the
+     * application preferences.
      * 
-     * @param context The current appContext
-     * @return The current account or first available, if none is available,
-     *         then null.
+     * @param   context     The current application {@link Context}
+     * @return              The ownCloud {@link Account} currently saved in preferences, or the first 
+     *                      {@link Account} available, if valid (still registered in the system as ownCloud 
+     *                      account). If none is available and valid, returns null.
      */
     public static Account getCurrentOwnCloudAccount(Context context) {
         Account[] ocAccounts = AccountManager.get(context).getAccountsByType(
@@ -54,6 +55,7 @@ public class AccountUtils {
         String accountName = appPreferences
                 .getString("select_oc_account", null);
 
+        // account validation: the saved account MUST be in the list of ownCloud Accounts known by the AccountManager
         if (accountName != null) {
             for (Account account : ocAccounts) {
                 if (account.name.equals(accountName)) {
@@ -64,7 +66,7 @@ public class AccountUtils {
         }
         
         if (defaultAccount == null && ocAccounts.length != 0) {
-            // we at least need to take first account as fallback
+            // take first account as fallback
             defaultAccount = ocAccounts[0];
         }
 

+ 45 - 25
src/com/owncloud/android/ui/activity/FileActivity.java

@@ -46,7 +46,7 @@ public abstract class FileActivity extends SherlockFragmentActivity {
 
     public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
     public static final String EXTRA_ACCOUNT = "com.owncloud.android.ui.activity.ACCOUNT";
-    public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.ACCOUNT";
+    public static final String EXTRA_WAITING_TO_PREVIEW = "com.owncloud.android.ui.activity.WAITING_TO_PREVIEW";
     
     public static final String TAG = FileActivity.class.getSimpleName(); 
     
@@ -60,12 +60,18 @@ public abstract class FileActivity extends SherlockFragmentActivity {
     /** Flag to signal that the activity will is finishing to enforce the creation of an ownCloud {@link Account} */
     private boolean mRedirectingToSetupAccount = false;
     
-    
+
+    /**
+     * Loads the cownCloud {@link Account} and main {@link OCFile} to be handled by the instance of 
+     * the {@link FileActivity}.
+     * 
+     * Grants that a valid ownCloud {@link Account} is associated to the instance, or that the user 
+     * is requested to create a new one.
+     */
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        
-        /// Load of saved instance state: keep this always before initDataFromCurrentAccount()
+
         if(savedInstanceState != null) {
             mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
             mAccount = savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT);
@@ -73,39 +79,53 @@ public abstract class FileActivity extends SherlockFragmentActivity {
             mAccount = getIntent().getParcelableExtra(FileActivity.EXTRA_ACCOUNT);
             mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
         }
-        
-        if (mAccount != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), mAccount.name)) {
-            onAccountChanged();
+
+        grantValidAccount();
+        if (mAccount != null) {
+            onAccountSet(savedInstanceState != null);
         }
-        
     }
 
     
     /**
-     * Validate the ownCloud {@link Account} associated to the Activity any time it is 
-     * started, and if not valid tries to move to a different Account.
+     *  Since ownCloud {@link Account}s can be managed from the system setting menu, 
+     *  the existence of the {@link Account} associated to the instance must be checked 
+     *  every time it is restarted.
      */
     @Override
-    protected void onStart() {
-        Log_OC.d(TAG, "onStart en FileActivity");
-        super.onStart();
-        /// Validate account, and try to fix if wrong
-        if (mAccount == null || !AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), mAccount.name)) {
-            if (!AccountUtils.accountsAreSetup(getApplicationContext())) {
+    protected void onRestart() {
+        super.onRestart();
+        
+        Account oldAccount = mAccount;
+        grantValidAccount();
+        if (mAccount != null && !mAccount.equals(oldAccount)) {
+            onAccountSet(false);
+        }
+    }
+    
+        
+    /**
+     *  Validates the ownCloud {@link Account} associated to the Activity any time it is restarted.
+     * 
+     *  If not valid, tries to swap it for other valid and existing ownCloud {@link Account}.
+     * 
+     *  If no valid ownCloud {@link Account} exists, mAccount is set to NULL and the user is requested 
+     *  to create a new ownCloud {@link Account}.
+     */
+    private void grantValidAccount() {
+        boolean validAccount = (mAccount != null && AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), mAccount.name));
+        if (!validAccount) {
+            // get most recently used account as default account
+            mAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
+            if (mAccount == null) {
                 /// no account available: force account creation
-                mAccount = null;
                 createFirstAccount();
                 mRedirectingToSetupAccount = true;
-                
-            } else {
-                /// get 'last current account' as default account
-                mAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
-                onAccountChanged();
             }
         }
     }
     
-        
+    
     /**
      * Launches the account creation activity. To use when no ownCloud account is available
      */
@@ -191,7 +211,7 @@ public abstract class FileActivity extends SherlockFragmentActivity {
                     String type = result.getString(AccountManager.KEY_ACCOUNT_TYPE);
                     if (AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), name)) {
                         FileActivity.this.mAccount = new Account(name, type);
-                        FileActivity.this.onAccountChanged();
+                        FileActivity.this.onAccountSet(false);
                     }
                 } catch (OperationCanceledException e) {
                     Log_OC.e(TAG, "Account creation canceled");
@@ -216,7 +236,7 @@ public abstract class FileActivity extends SherlockFragmentActivity {
      * 
      *  Child classes must grant that state depending on the {@link Account} is updated.
      */
-    protected abstract void onAccountChanged();
+    protected abstract void onAccountSet(boolean stateWasRecovered);
     
     
 

+ 217 - 205
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -42,8 +42,8 @@ import android.os.IBinder;
 import android.preference.PreferenceManager;
 import android.provider.MediaStore;
 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;
@@ -98,7 +98,6 @@ public class FileDisplayActivity extends FileActivity implements
     OCFileListFragment.ContainerActivity, FileDetailFragment.ContainerActivity, OnNavigationListener, OnSslValidatorListener, OnRemoteOperationListener, EditNameDialogListener {
     
     private ArrayAdapter<String> mDirectories;
-    private OCFile mChosenFile = null;
 
     /** Access point to the cached database for the current ownCloud {@link Account} */
     private DataStorageManager mStorageManager = null;
@@ -112,6 +111,8 @@ public class FileDisplayActivity extends FileActivity implements
     private RemoteOperationResult mLastSslUntrustedServerResult = null;
     
     private boolean mDualPane;
+    private View mLeftFragmentContainer;
+    private View mRightFragmentContainer;
     
     private static final String KEY_WAITING_TO_PREVIEW = "WAITING_TO_PREVIEW";
     
@@ -127,13 +128,18 @@ public class FileDisplayActivity extends FileActivity implements
     
     private static final String TAG = FileDisplayActivity.class.getSimpleName();
 
+    private static final String TAG_LIST_OF_FILES = "LIST_OF_FILES";
+    private static final String TAG_SECOND_FRAGMENT = "SECOND_FRAGMENT";
+
     private OCFile mWaitingToPreview;
     private Handler mHandler;
-    
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         Log_OC.d(TAG, "onCreate() start");
-        super.onCreate(savedInstanceState);
+        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+        
+        super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
         
         mHandler = new Handler();
 
@@ -148,7 +154,7 @@ public class FileDisplayActivity extends FileActivity implements
             requestPinCode();
         }
 
-        // file observer
+        /// file observer
         Intent observer_intent = new Intent(this, FileObserverService.class);
         observer_intent.putExtra(FileObserverService.KEY_FILE_CMD, FileObserverService.CMD_INIT_OBSERVED_LIST);
         startService(observer_intent);
@@ -162,15 +168,17 @@ public class FileDisplayActivity extends FileActivity implements
         }
         
         /// USER INTERFACE
-        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
             
         // Inflate and set the layout view
         setContentView(R.layout.files);    
-        mDualPane = (findViewById(R.id.right_fragment_container) != null);
+        mDualPane = getResources().getBoolean(R.bool.large_land_layout);
+        mLeftFragmentContainer = findViewById(R.id.left_fragment_container);
+        mRightFragmentContainer = findViewById(R.id.right_fragment_container);
         if (savedInstanceState == null) {
-            Fragment secondFragment = chooseSecondFragment(mChosenFile);
-            mChosenFile = null;
-            initFragments(secondFragment);
+            createMinFragments();
+            if (!isRedirectingToSetupAccount()) {
+                initFragmentsWithFile();
+            }
         }
         
         // Action bar setup
@@ -191,28 +199,78 @@ public class FileDisplayActivity extends FileActivity implements
     }
 
     
-    private void initFragments(Fragment secondFragment) {
-        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
-        if (!mDualPane) {
-            transaction.add(R.id.single_fragment_container, new OCFileListFragment());
-        } // else: for dual pane, the fragment for list of files is inflated directly from the layout ; see res\larg-land\files.xml
-        
-        /// Second fragment
-        if (secondFragment != null) {
-            if (mDualPane) {
-                transaction.add(R.id.right_fragment_container, secondFragment);
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (mDownloadConnection != null)
+            unbindService(mDownloadConnection);
+        if (mUploadConnection != null)
+            unbindService(mUploadConnection);
+    }
+    
+    
+    /**
+     *  Called when the ownCloud {@link Account} associated to the Activity was just updated.
+     */ 
+    @Override
+    protected void onAccountSet(boolean stateWasRecovered) {
+        if (getAccount() != null) {
+            mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
+            
+            /// Check whether the 'main' OCFile handled by the Activity is contained in the current Account
+            OCFile file = getFile();
+            if (file != null) {
+                file = mStorageManager.getFileByPath(file.getRemotePath());   // currentDir = null if not in the current Account
+            }
+            if (file == null) {
+                // fall back to root folder
+                file = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR);  // never should return null
+            }
+            setFile(file);
+            
+            if (findViewById(android.R.id.content) != null && !stateWasRecovered) {
+                Log_OC.e(TAG, "Initializing Fragments in onAccountChanged..");
+                initFragmentsWithFile();
             } else {
-                transaction.replace(R.id.single_fragment_container, secondFragment);
-                transaction.addToBackStack(null);
+                Log_OC.e(TAG, "Fragment initializacion ignored in onAccountChanged due to lack of CONTENT VIEW");
             }
+            
+        } else {
+            Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
         }
+    }
+    
+    
+    private void createMinFragments() {
+        OCFileListFragment listOfFiles = new OCFileListFragment();
+        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+        transaction.add(R.id.left_fragment_container, listOfFiles, TAG_LIST_OF_FILES);
         transaction.commit();
     }
 
+    private void initFragmentsWithFile() {
+        if (getAccount() != null && getFile() != null) {
+            /// Second fragment
+            OCFile file = getFile(); 
+            Fragment secondFragment = chooseInitialSecondFragment(file);
+            if (secondFragment != null) {
+                setSecondFragment(secondFragment);
+            }
+            
+        } else {
+            Log.wtf(TAG, "initFragments() called with invalid NULLs!");
+            if (getAccount() == null) {
+                Log.wtf(TAG, "\t account is NULL");
+            }
+            if (getFile() == null) {
+                Log.wtf(TAG, "\t file is NULL");
+            }
+        }
+    }
 
-    private Fragment chooseSecondFragment(OCFile file) {
+    private Fragment chooseInitialSecondFragment(OCFile file) {
         Fragment secondFragment = null;
-        if (file != null) {
+        if (file != null && !file.isDirectory()) {
             if (file.isDown() && PreviewMediaFragment.canBePreviewed(file)) {
                 int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
                 boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
@@ -221,30 +279,129 @@ public class FileDisplayActivity extends FileActivity implements
             } else {
                 secondFragment = new FileDetailFragment(file, getAccount());
             }
-                
-        } else if (mDualPane) {
-            secondFragment = new FileDetailFragment(null, null); // empty FileDetailFragment
         }
         return secondFragment;
     }
 
+    
+    /**
+     * Replaces the second fragment managed by the activity with the received as
+     * a parameter.
+     * 
+     * Assumes never will be more than two fragments managed at the same time. 
+     * 
+     * @param fragment      New second Fragment to set.
+     */
+    private void setSecondFragment(Fragment fragment) {
+        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
+        transaction.add(R.id.right_fragment_container, fragment, TAG_SECOND_FRAGMENT);
+        transaction.commit();
+    }
+    
+    
+    private void updateFragmentsVisibility(boolean existsSecondFragment) {
+        if (mDualPane) {
+            if (mLeftFragmentContainer.getVisibility() != View.VISIBLE) {
+                mLeftFragmentContainer.setVisibility(View.VISIBLE);
+            }
+            if (mRightFragmentContainer.getVisibility() != View.VISIBLE) {
+                mRightFragmentContainer.setVisibility(View.VISIBLE);
+            }
+            
+        } else if (existsSecondFragment) {
+            if (mLeftFragmentContainer.getVisibility() != View.GONE) {
+                mLeftFragmentContainer.setVisibility(View.GONE);
+            }
+            if (mRightFragmentContainer.getVisibility() != View.VISIBLE) {
+                mRightFragmentContainer.setVisibility(View.VISIBLE);
+            }
+            
+        } else {
+            if (mLeftFragmentContainer.getVisibility() != View.VISIBLE) {
+                mLeftFragmentContainer.setVisibility(View.VISIBLE);
+            }
+            if (mRightFragmentContainer.getVisibility() != View.GONE) {
+                mRightFragmentContainer.setVisibility(View.GONE);
+            }
+        }
+    }
 
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        if (mDownloadConnection != null)
-            unbindService(mDownloadConnection);
-        if (mUploadConnection != null)
-            unbindService(mUploadConnection);
+    
+    private OCFileListFragment getListOfFilesFragment() {
+        Fragment listOfFiles = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_LIST_OF_FILES);
+        if (listOfFiles != null) {
+            return (OCFileListFragment)listOfFiles;
+        }
+        Log_OC.wtf(TAG, "Access to unexisting list of files fragment!!");
+        return null;
+    }
+    
+    protected FileFragment getSecondFragment() {
+        Fragment second = getSupportFragmentManager().findFragmentByTag(FileDisplayActivity.TAG_SECOND_FRAGMENT);
+        if (second != null) {
+            return (FileFragment)second;
+        }
+        return null;
     }
 
+    public void cleanSecondFragment() {
+        Fragment second = getSecondFragment();
+        if (second != null) {
+            FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
+            tr.remove(second);
+            tr.commit();
+            updateFragmentsVisibility(false);
+        }
+    }
     
+    protected void refeshListOfFilesFragment() {
+        OCFileListFragment fileListFragment = getListOfFilesFragment();
+        if (fileListFragment != null) { 
+            fileListFragment.listDirectory();
+        }
+    }
+
+    protected void refreshSecondFragment(String downloadEvent, String downloadedRemotePath, boolean success) {
+        FileFragment secondFragment = getSecondFragment();
+        boolean waitedPreview = (mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(downloadedRemotePath));
+        if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
+            FileDetailFragment detailsFragment = (FileDetailFragment) secondFragment;
+            OCFile fileInFragment = detailsFragment.getFile();
+            if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
+                // the user browsed to other file ; forget the automatic preview 
+                mWaitingToPreview = null;
+                
+            } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_ADDED_MESSAGE)) {
+                // grant that the right panel updates the progress bar
+                detailsFragment.listenForTransferProgress();
+                detailsFragment.updateFileDetails(true, false);
+                
+            } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {
+                //  update the right panel 
+                if (success && waitedPreview) {
+                    mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId());   // update the file from database, for the local storage path
+                    if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
+                        startMediaPreview(mWaitingToPreview, 0, true);
+                       
+                    } else {
+                        detailsFragment.updateFileDetails(false, (success));
+                        openFile(mWaitingToPreview);
+                    }
+                    mWaitingToPreview = null;
+                    
+                } else {
+                    detailsFragment.updateFileDetails(false, (success));
+                }
+            }
+        }
+    }
+
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         MenuInflater inflater = getSherlock().getMenuInflater();
-            inflater.inflate(R.menu.main_menu, menu);
-            
-            return true;
+        inflater.inflate(R.menu.main_menu, menu);
+        return true;
     }
 
     @Override
@@ -399,64 +556,24 @@ public class FileDisplayActivity extends FileActivity implements
         startService(i);
     }
 
-    private OCFileListFragment getListOfFilesFragment() {
-        if (mDualPane) {
-            return (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.list_of_files_fragment);
-        } else {
-            Fragment singleFragment = getSupportFragmentManager().findFragmentById(R.id.single_fragment_container);
-            if (singleFragment instanceof OCFileListFragment) {
-                return (OCFileListFragment)singleFragment;
-            } else {
-                return null;
-            }
-        }
-    }
-    
-    protected FileFragment getSecondFragment() {
-        if (mDualPane) {
-            return (FileFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment_container);
-        } else {
-            Fragment singleFragment = getSupportFragmentManager().findFragmentById(R.id.single_fragment_container);
-            if (singleFragment != null && !(singleFragment instanceof OCFileListFragment)) {
-                return (FileFragment)singleFragment;
-            } else {
-                return null;
-            }
-        }
-    }
-
     @Override
     public void onBackPressed() {
-        OCFileListFragment listOfFiles = getListOfFilesFragment(); 
-        if (listOfFiles != null) {
-            if (mDirectories.getCount() <= 1) {
-                finish();
-                return;
+        if (mDualPane || getSecondFragment() == null) {
+            OCFileListFragment listOfFiles = getListOfFilesFragment(); 
+            if (listOfFiles != null) {  // should never be null, indeed
+                if (mDirectories.getCount() <= 1) {
+                    finish();
+                    return;
+                }
+                popDirname();
+                listOfFiles.onBrowseUp();
+                setFile(listOfFiles.getCurrentFile());
             }
-            popDirname();
-            listOfFiles.onBrowseUp();
-            setFile(listOfFiles.getCurrentFile());
-            cleanSecondFragment();
-            
-        } else {
-            super.onBackPressed();
         }
+        cleanSecondFragment();
         updateNavigationElementsInActionBar(getFile(), null);
     }
 
-    private void cleanSecondFragment() {
-        if (mDualPane) {
-            // Resets the FileDetailsFragment on tablets
-            Fragment fileFragment = getSupportFragmentManager().findFragmentById(R.id.right_fragment_container);
-            if (fileFragment != null && (fileFragment instanceof PreviewMediaFragment || !((FileDetailFragment) fileFragment).isEmpty())) {
-                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
-                transaction.replace(R.id.right_fragment_container, new FileDetailFragment(null, null)); // empty FileDetailFragment                
-                transaction.commit();
-            }
-        }
-    }
-
-
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         // responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved
@@ -470,6 +587,7 @@ public class FileDisplayActivity extends FileActivity implements
     protected void onStart() {
         super.onStart();
         FileFragment second = getSecondFragment();
+        updateFragmentsVisibility(second != null);
         updateNavigationElementsInActionBar(getFile(), (second == null) ? null : second.getFile());
     }
     
@@ -768,7 +886,7 @@ public class FileDisplayActivity extends FileActivity implements
             
             if (sameAccount && isDescendant) {
                 refeshListOfFilesFragment();
-                updateSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
+                refreshSecondFragment(intent.getAction(), downloadedRemotePath, intent.getBooleanExtra(FileDownloader.EXTRA_DOWNLOAD_RESULT, false));
             }
             
             removeStickyBroadcast(intent);
@@ -785,49 +903,6 @@ public class FileDisplayActivity extends FileActivity implements
     }
     
     
-    protected void refeshListOfFilesFragment() {
-        OCFileListFragment fileListFragment = getListOfFilesFragment();
-        if (fileListFragment != null) { 
-            fileListFragment.listDirectory();
-        }
-    }
-
-    protected void updateSecondFragment(String downloadEvent, String downloadedRemotePath, boolean success) {
-        FileFragment secondFragment = getSecondFragment();
-        boolean waitedPreview = (mWaitingToPreview != null && mWaitingToPreview.getRemotePath().equals(downloadedRemotePath));
-        if (secondFragment != null && secondFragment instanceof FileDetailFragment) {
-            FileDetailFragment detailsFragment = (FileDetailFragment) secondFragment;
-            OCFile fileInFragment = detailsFragment.getFile();
-            if (fileInFragment != null && !downloadedRemotePath.equals(fileInFragment.getRemotePath())) {
-                // the user browsed to other file ; forget the automatic preview 
-                mWaitingToPreview = null;
-                
-            } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_ADDED_MESSAGE)) {
-                // grant that the right panel updates the progress bar
-                detailsFragment.listenForTransferProgress();
-                detailsFragment.updateFileDetails(true, false);
-                
-            } else if (downloadEvent.equals(FileDownloader.DOWNLOAD_FINISH_MESSAGE)) {
-                //  update the right panel 
-                if (success && waitedPreview) {
-                    mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId());   // update the file from database, for the local storage path
-                    if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
-                        startMediaPreview(mWaitingToPreview, 0, true);
-                       
-                    } else {
-                        detailsFragment.updateFileDetails(false, (success));
-                        openFile(mWaitingToPreview);
-                    }
-                    mWaitingToPreview = null;
-                    
-                } else {
-                    detailsFragment.updateFileDetails(false, (success));
-                }
-            }
-        }
-    }
-
-
     /**
      * {@inheritDoc}
      */
@@ -873,6 +948,7 @@ public class FileDisplayActivity extends FileActivity implements
     public void startMediaPreview(OCFile file, int startPlaybackPosition, boolean autoplay) {
         Fragment mediaFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
         setSecondFragment(mediaFragment);
+        updateFragmentsVisibility(true);
         updateNavigationElementsInActionBar(getFile(), file);
     }
     
@@ -889,6 +965,7 @@ public class FileDisplayActivity extends FileActivity implements
         setSecondFragment(detailFragment);
         mWaitingToPreview = file;
         requestForDownload();
+        updateFragmentsVisibility(true);
         updateNavigationElementsInActionBar(getFile(), file);
     }
 
@@ -903,47 +980,22 @@ public class FileDisplayActivity extends FileActivity implements
     public void showDetails(OCFile file) {
         Fragment detailFragment = new FileDetailFragment(file, getAccount());
         setSecondFragment(detailFragment);
+        updateFragmentsVisibility(true);
         updateNavigationElementsInActionBar(getFile(), file);
     }
     
     
-    /**
-     * Replaces the second fragment managed by the activity with the received as
-     * a parameter.
-     * 
-     * Assumes never will be more than two fragments managed at the same time. 
-     * 
-     * @param fragment      New second Fragment to set.
-     */
-    private void setSecondFragment(Fragment fragment) {
-        FragmentManager fm = getSupportFragmentManager();
-        FragmentTransaction transaction = fm.beginTransaction();
-        if (mDualPane) {
-            transaction.replace(R.id.right_fragment_container, fragment);
-        } else {
-            transaction.replace(R.id.single_fragment_container, fragment);
-            while (fm.getBackStackEntryCount() > 0) {
-                fm.popBackStackImmediate();
-            }
-            transaction.addToBackStack(null);
-        }
-        transaction.commit();
-        
-        /// TODO UPDATE ACTION BAR ACCORDING TO SECONDFRAGMENT!!
-    }
-    
-    
     /**
      * TODO
      */
     private void updateNavigationElementsInActionBar(OCFile currentDir, OCFile currentFile) {
         ActionBar actionBar = getSupportActionBar(); 
-        if (currentFile == null) {
+        if (currentFile == null || mDualPane) {
             // only list of files - set for browsing through folders
             actionBar.setDisplayHomeAsUpEnabled(currentDir != null && currentDir.getParentId() != 0);
             actionBar.setDisplayShowTitleEnabled(false);
             actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
-            actionBar.setListNavigationCallbacks(mDirectories, this);   // assuming mDirectoris is updated
+            actionBar.setListNavigationCallbacks(mDirectories, this);   // assuming mDirectories is updated
             
         } else {
             actionBar.setDisplayHomeAsUpEnabled(true);
@@ -1100,11 +1152,9 @@ public class FileDisplayActivity extends FileActivity implements
             msg.show();
             OCFile removedFile = operation.getFile();
             getSecondFragment();
-            if (mDualPane) {
-                FileFragment second = getSecondFragment();
-                if (second != null && removedFile.equals(second.getFile())) {
-                    cleanSecondFragment();  // TODO this only cleans in DUAL PANE!!
-                }
+            FileFragment second = getSecondFragment();
+            if (second != null && removedFile.equals(second.getFile())) {
+                cleanSecondFragment();
             }
             if (mStorageManager.getFileById(removedFile.getParentId()).equals(getFile())) {
                 refeshListOfFilesFragment();
@@ -1156,7 +1206,7 @@ public class FileDisplayActivity extends FileActivity implements
         OCFile renamedFile = operation.getFile();
         if (result.isSuccess()) {
             if (mDualPane) {
-                FileFragment details = (FileFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment_container);
+                FileFragment details = getSecondFragment();
                 if (details != null && details instanceof FileDetailFragment && renamedFile.equals(details.getFile()) ) {
                     ((FileDetailFragment) details).updateFileDetails(renamedFile, getAccount());
                 }
@@ -1216,7 +1266,7 @@ public class FileDisplayActivity extends FileActivity implements
     @Override
     public void onTransferStateChanged(OCFile file, boolean downloading, boolean uploading) {
         if (mDualPane) {
-            FileFragment details = (FileFragment) getSupportFragmentManager().findFragmentById(R.id.right_fragment_container);
+            FileFragment details = getSecondFragment();
             if (details != null && details instanceof FileDetailFragment && file.equals(details.getFile()) ) {
                 if (downloading || uploading) {
                     ((FileDetailFragment)details).updateFileDetails(file, getAccount());
@@ -1270,42 +1320,4 @@ public class FileDisplayActivity extends FileActivity implements
     }
 
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected void onAccountChanged() {
-        if (getAccount() != null) {
-            mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
-            
-            /// Check if the 'main' @OCFile handled by the Activity is a directory
-            OCFile currentDir = getFile();
-            if(currentDir != null && !currentDir.isDirectory()) {
-                mChosenFile = getFile();
-                currentDir = mStorageManager.getFileById(currentDir.getParentId());
-            }
-            
-            /// Check if currentDir and mChosenFile are in the current account, and update them
-            if (currentDir != null) {
-                currentDir = mStorageManager.getFileByPath(currentDir.getRemotePath());   // currentDir = null if not in the current Account
-            }
-            if (mChosenFile != null) {
-                if (mChosenFile.fileExists()) {
-                    mChosenFile = mStorageManager.getFileByPath(mChosenFile.getRemotePath());   // mChosenFile = null if not in the current Account
-                }   // else : keep mChosenFile with the received value; this is currently the case of an upload in progress, when the user presses the status notification in a landscape tablet
-            }
-            
-            /// Default to root if mCurrentDir was not found
-            if (currentDir == null) {
-                currentDir = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR);  // never returns null
-            }
-            
-            setFile(currentDir);
-            
-        } else {
-            Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
-        }
-    }
-
-    
 }

+ 6 - 24
src/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -137,7 +137,7 @@ public class FileDetailFragment extends FileFragment implements
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
-        super.onCreateView(inflater, container, savedInstanceState);
+        //super.onCreateView(inflater, container, savedInstanceState);
         
         if (savedInstanceState != null) {
             setFile((OCFile)savedInstanceState.getParcelable(FileActivity.EXTRA_FILE));
@@ -149,7 +149,8 @@ public class FileDetailFragment extends FileFragment implements
         }
         
         View view = null;
-        view = inflater.inflate(mLayout, container, false);
+        //view = inflater.inflate(mLayout, container, false);
+        view = inflater.inflate(mLayout, null);
         mView = view;
         
         if (mLayout == R.layout.file_details_fragment) {
@@ -438,15 +439,7 @@ public class FileDetailFragment extends FileFragment implements
             uploaderBinder.cancel(mAccount, file);
             if (!file.fileExists()) {
                 // TODO make something better
-                if (getActivity() instanceof FileDisplayActivity) {
-                    // double pane
-                    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
-                    transaction.replace(R.id.right_fragment_container, new FileDetailFragment(null, null)); // empty FileDetailFragment
-                    transaction.commit();
-                    mContainerActivity.onFileStateChanged();
-                } else {
-                    getActivity().finish();
-                }
+                ((FileDisplayActivity)getActivity()).cleanSecondFragment();
                 
             } else if (file.isDown()) {
                 setButtonsForDown();
@@ -794,22 +787,13 @@ public class FileDetailFragment extends FileFragment implements
     
     
     private void onRemoveFileOperationFinish(RemoveFileOperation operation, RemoteOperationResult result) {
-        boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
         getActivity().dismissDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
         
         if (result.isSuccess()) {
             Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);
             msg.show();
-            if (inDisplayActivity) {
-                // double pane
-                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
-                transaction.replace(R.id.right_fragment_container, new FileDetailFragment(null, null)); // empty FileDetailFragment
-                transaction.commit();
-                mContainerActivity.onFileStateChanged();
-            } else {
-                getActivity().finish();
-            }
-                
+            ((FileDisplayActivity)getActivity()).cleanSecondFragment();
+
         } else {
             Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); 
             msg.show();
@@ -820,7 +804,6 @@ public class FileDetailFragment extends FileFragment implements
     }
     
     private void onRenameFileOperationFinish(RenameFileOperation operation, RemoteOperationResult result) {
-        boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
         getActivity().dismissDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
         
         if (result.isSuccess()) {
@@ -843,7 +826,6 @@ public class FileDetailFragment extends FileFragment implements
     }
     
     private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) {
-        boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;
         getActivity().dismissDialog(FileDisplayActivity.DIALOG_SHORT_WAIT);
         OCFile file = getFile();
         if (!result.isSuccess()) {

+ 1 - 1
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -61,8 +61,8 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
  * 
  */
 public class OCFileListFragment extends ExtendedListFragment implements EditNameDialogListener, ConfirmationDialogFragmentListener {
+    
     private static final String TAG = OCFileListFragment.class.getSimpleName();
-    private static final String SAVED_LIST_POSITION = "LIST_POSITION"; 
     
     private OCFileListFragment.ContainerActivity mContainerActivity;
     

+ 1 - 1
src/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -442,7 +442,7 @@ public class PreviewImageActivity extends FileActivity implements FileFragment.C
     }
 
     @Override
-    protected void onAccountChanged() {
+    protected void onAccountSet(boolean stateWasRecovered) {
         // TODO
     }