Merge pull request #186 from owncloud/fixed_contradicted_messages_in_login_view
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / activity / FileDisplayActivity.java
index 210a3d2..bcd62a3 100644 (file)
@@ -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
@@ -178,7 +186,9 @@ public class FileDisplayActivity extends FileActivity implements
         OCFile currFile = getFile();
         if (mStorageManager != null) {
             while(currFile != null && currFile.getFileName() != OCFile.PATH_SEPARATOR) {
-                mDirectories.add(currFile.getFileName());
+                if (currFile.isDirectory()) {
+                    mDirectories.add(currFile.getFileName());
+                }
                 currFile = mStorageManager.getFileById(currFile.getParentId());
             }
         }
@@ -191,29 +201,88 @@ 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) {
+                if (file.isDown() && file.getLastSyncDateForProperties() == 0) {
+                    // upload in progress - right now, files are not inserted in the local cache until the upload is successful
+                    if (mStorageManager.getFileById(file.getParentId()) == null) {
+                        file = null;    // not able to know the directory where the file is uploading
+                    }
+                } else {
+                    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.isDown() && PreviewMediaFragment.canBePreviewed(file)) {
+        if (file != null && !file.isDirectory()) {
+            if (file.isDown() && PreviewMediaFragment.canBePreviewed(file) 
+                    && file.getLastSyncDateForProperties() > 0  // temporal fix
+                    ) {
                 int startPlaybackPosition = getIntent().getIntExtra(PreviewVideoActivity.EXTRA_START_POSITION, 0);
                 boolean autoplay = getIntent().getBooleanExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, true);
                 secondFragment = new PreviewMediaFragment(file, getAccount(), startPlaybackPosition, autoplay);
@@ -221,30 +290,131 @@ 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.replace(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
+                boolean detailsFragmentChanged = false;
+                if (waitedPreview) {
+                    if (success) {
+                        mWaitingToPreview = mStorageManager.getFileById(mWaitingToPreview.getFileId());   // update the file from database, for the local storage path
+                        if (PreviewMediaFragment.canBePreviewed(mWaitingToPreview)) {
+                            startMediaPreview(mWaitingToPreview, 0, true);
+                            detailsFragmentChanged = true;
+                        } else {
+                            openFile(mWaitingToPreview);
+                        }
+                    }
+                    mWaitingToPreview = null;
+                }
+                if (!detailsFragmentChanged) {
+                    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
@@ -271,7 +441,8 @@ public class FileDisplayActivity extends FileActivity implements
             }
             case android.R.id.home: {
                 FileFragment second = getSecondFragment();
-                if((getFile() != null && getFile().getParentId() != 0) || 
+                OCFile currentDir = getCurrentDir();
+                if((currentDir != null && currentDir.getParentId() != 0) || 
                         (second != null && second.getFile() != null)) {
                     onBackPressed(); 
                 }
@@ -399,64 +570,26 @@ 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) {
+            if (listOfFiles != null) {  // should never be null, indeed
+                if (mDirectories.getCount() <= 1) {
+                    finish();
+                    return;
+                }
+                popDirname();
+                listOfFiles.onBrowseUp();
             }
-            popDirname();
-            listOfFiles.onBrowseUp();
-            setFile(listOfFiles.getCurrentFile());
-            cleanSecondFragment();
-            
-        } else {
-            super.onBackPressed();
         }
-        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();
-            }
+        if (listOfFiles != null) {  // should never be null, indeed
+            setFile(listOfFiles.getCurrentFile());
         }
+        cleanSecondFragment();
+        updateNavigationElementsInActionBar(null);
     }
 
-
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         // responsibility of restore is preferred in onCreate() before than in onRestoreInstanceState when there are Fragments involved
@@ -470,7 +603,8 @@ public class FileDisplayActivity extends FileActivity implements
     protected void onStart() {
         super.onStart();
         FileFragment second = getSecondFragment();
-        updateNavigationElementsInActionBar(getFile(), (second == null) ? null : second.getFile());
+        updateFragmentsVisibility(second != null);
+        updateNavigationElementsInActionBar((second == null) ? null : second.getFile());
     }
     
     @Override
@@ -497,7 +631,7 @@ public class FileDisplayActivity extends FileActivity implements
         // List current directory
         OCFileListFragment listOfFiles = getListOfFilesFragment(); 
         if (listOfFiles != null) {
-            listOfFiles.listDirectory(getFile());   // TODO we should find the way to avoid the need of this (maybe it's not necessary yet; to check)
+            listOfFiles.listDirectory(getCurrentDir());   // TODO we should find the way to avoid the need of this (maybe it's not necessary yet; to check)
         }
     
         Log_OC.d(TAG, "onResume() end");
@@ -700,7 +834,7 @@ public class FileDisplayActivity extends FileActivity implements
                 String synchFolderRemotePath = intent.getStringExtra(FileSyncService.SYNC_FOLDER_REMOTE_PATH); 
                  
                 boolean fillBlankRoot = false;
-                OCFile currentDir = getFile();
+                OCFile currentDir = getCurrentDir();
                 if (currentDir == null) {
                     currentDir = mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR);
                     fillBlankRoot = (currentDir != null);
@@ -744,7 +878,8 @@ public class FileDisplayActivity extends FileActivity implements
             String uploadedRemotePath = intent.getStringExtra(FileDownloader.EXTRA_REMOTE_PATH);
             String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME);
             boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name);
-            boolean isDescendant = (getFile() != null) && (uploadedRemotePath != null) && (uploadedRemotePath.startsWith(getFile().getRemotePath()));
+            OCFile currentDir = getCurrentDir();
+            boolean isDescendant = (currentDir != null) && (uploadedRemotePath != null) && (uploadedRemotePath.startsWith(currentDir.getRemotePath()));
             if (sameAccount && isDescendant) {
                 refeshListOfFilesFragment();
             }
@@ -768,14 +903,15 @@ 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);
         }
 
         private boolean isDescendant(String downloadedRemotePath) {
-            return (getFile() != null && downloadedRemotePath != null && downloadedRemotePath.startsWith(getFile().getRemotePath()));
+            OCFile currentDir = getCurrentDir();
+            return (currentDir != null && downloadedRemotePath != null && downloadedRemotePath.startsWith(currentDir.getRemotePath()));
         }
 
         private boolean isSameAccount(Context context, Intent intent) {
@@ -785,49 +921,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}
      */
@@ -846,7 +939,7 @@ public class FileDisplayActivity extends FileActivity implements
     public void onBrowsedDownTo(OCFile directory) {
         pushDirname(directory);
         cleanSecondFragment();
-        updateNavigationElementsInActionBar(directory, null);
+        updateNavigationElementsInActionBar(null);
     }
     
     /**
@@ -873,7 +966,9 @@ 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);
-        updateNavigationElementsInActionBar(getFile(), file);
+        updateFragmentsVisibility(true);
+        updateNavigationElementsInActionBar(file);
+        setFile(file);
     }
     
     /**
@@ -889,7 +984,9 @@ public class FileDisplayActivity extends FileActivity implements
         setSecondFragment(detailFragment);
         mWaitingToPreview = file;
         requestForDownload();
-        updateNavigationElementsInActionBar(getFile(), file);
+        updateFragmentsVisibility(true);
+        updateNavigationElementsInActionBar(file);
+        setFile(file);
     }
 
     
@@ -903,47 +1000,24 @@ public class FileDisplayActivity extends FileActivity implements
     public void showDetails(OCFile file) {
         Fragment detailFragment = new FileDetailFragment(file, getAccount());
         setSecondFragment(detailFragment);
-        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!!
+        updateFragmentsVisibility(true);
+        updateNavigationElementsInActionBar(file);
+        setFile(file);
     }
     
     
     /**
      * TODO
      */
-    private void updateNavigationElementsInActionBar(OCFile currentDir, OCFile currentFile) {
+    private void updateNavigationElementsInActionBar(OCFile currentFile) {
         ActionBar actionBar = getSupportActionBar(); 
-        if (currentFile == null) {
+        if (currentFile == null || mDualPane) {
             // only list of files - set for browsing through folders
+            OCFile currentDir = getCurrentDir();
             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);
@@ -959,7 +1033,7 @@ public class FileDisplayActivity extends FileActivity implements
      */
     @Override
     public OCFile getInitialDirectory() {
-        return getFile();
+        return getCurrentDir();
     }
     
     
@@ -1100,13 +1174,11 @@ 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())) {
+            if (mStorageManager.getFileById(removedFile.getParentId()).equals(getCurrentDir())) {
                 refeshListOfFilesFragment();
             }
                 
@@ -1156,12 +1228,12 @@ 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());
                 }
             }
-            if (mStorageManager.getFileById(renamedFile.getParentId()).equals(getFile())) {
+            if (mStorageManager.getFileById(renamedFile.getParentId()).equals(getCurrentDir())) {
                 refeshListOfFilesFragment();
             }
             
@@ -1216,7 +1288,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());
@@ -1233,20 +1305,11 @@ public class FileDisplayActivity extends FileActivity implements
             String newDirectoryName = dialog.getNewFilename().trim();
             Log_OC.d(TAG, "'create directory' dialog dismissed with new name " + newDirectoryName);
             if (newDirectoryName.length() > 0) {
-                String path;
-                if (getFile() == null) {
-                    // this is just a patch; we should ensure that mCurrentDir never is null
-                    if (!mStorageManager.fileExists(OCFile.PATH_SEPARATOR)) {
-                        OCFile file = new OCFile(OCFile.PATH_SEPARATOR);
-                        mStorageManager.saveFile(file);
-                    }
-                    setFile(mStorageManager.getFileByPath(OCFile.PATH_SEPARATOR));
-                }
-                path = FileDisplayActivity.this.getFile().getRemotePath();
+                String path = getCurrentDir().getRemotePath();
                 
                 // Create directory
                 path += newDirectoryName + OCFile.PATH_SEPARATOR;
-                RemoteOperation operation = new CreateFolderOperation(path, getFile().getFileId(), mStorageManager);
+                RemoteOperation operation = new CreateFolderOperation(path, getCurrentDir().getFileId(), mStorageManager);
                 operation.execute(  getAccount(), 
                                     FileDisplayActivity.this, 
                                     FileDisplayActivity.this, 
@@ -1268,44 +1331,19 @@ public class FileDisplayActivity extends FileActivity implements
             startService(i);
         }
     }
-
-
-    /**
-     * {@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
+    
+    
+    private OCFile getCurrentDir() {
+        OCFile file = getFile();
+        if (file != null) {
+            if (file.isDirectory()) {
+                return file;
+            } else {
+                return mStorageManager.getFileById(file.getParentId());
             }
-            
-            setFile(currentDir);
-            
         } else {
-            Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
+            return null;
         }
     }
 
-    
 }