Files list position is kept when the orientation changes
authorDavid A. Velasco <dvelasco@solidgear.es>
Wed, 3 Oct 2012 14:48:06 +0000 (16:48 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Wed, 3 Oct 2012 14:48:06 +0000 (16:48 +0200)
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/activity/UploadFilesActivity.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
src/com/owncloud/android/ui/fragment/LocalFileListFragment.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java

index fb310ec..64098f7 100644 (file)
@@ -421,7 +421,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
             registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);\r
         \r
             // List current directory\r
             registerReceiver(mDownloadFinishReceiver, downloadIntentFilter);\r
         \r
             // List current directory\r
-            mFileList.listDirectory(mCurrentDir);\r
+            //mFileList.listDirectory(mCurrentDir);\r
             \r
         } else {\r
             \r
             \r
         } else {\r
             \r
@@ -857,6 +857,15 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
      * {@inheritDoc}\r
      */\r
     @Override\r
      * {@inheritDoc}\r
      */\r
     @Override\r
+    public OCFile getInitialDirectory() {\r
+        return mCurrentDir;\r
+    }\r
+    \r
+    \r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
+    @Override\r
     public void onFileStateChanged() {\r
         OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);\r
         if (fileListFragment != null) { \r
     public void onFileStateChanged() {\r
         OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList);\r
         if (fileListFragment != null) { \r
index aca4d89..7382d79 100644 (file)
@@ -88,6 +88,7 @@ public class UploadFilesActivity extends SherlockFragmentActivity implements
         setContentView(R.layout.upload_files_layout);
         mFileListFragment = (LocalFileListFragment) getSupportFragmentManager().findFragmentById(R.id.local_files_list);
         
         setContentView(R.layout.upload_files_layout);
         mFileListFragment = (LocalFileListFragment) getSupportFragmentManager().findFragmentById(R.id.local_files_list);
         
+        
         // Set input controllers
         mCancelBtn = (Button) findViewById(R.id.upload_files_btn_cancel);
         mCancelBtn.setOnClickListener(this);
         // Set input controllers
         mCancelBtn = (Button) findViewById(R.id.upload_files_btn_cancel);
         mCancelBtn.setOnClickListener(this);
@@ -164,17 +165,6 @@ public class UploadFilesActivity extends SherlockFragmentActivity implements
         Log.d(TAG, "onSaveInstanceState() end");
     }
 
         Log.d(TAG, "onSaveInstanceState() end");
     }
 
-    @Override
-    protected void onResume() {
-        Log.d(TAG, "onResume() start");
-        super.onResume();
-
-        // List current directory
-        mFileListFragment.listDirectory(mCurrentDir);
-            
-        Log.d(TAG, "onResume() end");
-    }
-
     
     /**
      * Pushes a directory to the drop down list
     
     /**
      * Pushes a directory to the drop down list
@@ -244,6 +234,14 @@ public class UploadFilesActivity extends SherlockFragmentActivity implements
     public void onFileClick(File file) {
         // nothing to do
     }
     public void onFileClick(File file) {
         // nothing to do
     }
+    
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getInitialDirectory() {
+        return mCurrentDir;
+    }
 
 
     /**
 
 
     /**
index da4f815..fb39313 100644 (file)
@@ -30,10 +30,10 @@ import com.owncloud.android.R;
 \r
 import android.accounts.Account;\r
 import android.content.Context;\r
 \r
 import android.accounts.Account;\r
 import android.content.Context;\r
-import android.database.DataSetObserver;\r
 import android.view.LayoutInflater;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
 import android.view.LayoutInflater;\r
 import android.view.View;\r
 import android.view.ViewGroup;\r
+import android.widget.BaseAdapter;\r
 import android.widget.ImageView;\r
 import android.widget.ListAdapter;\r
 import android.widget.ListView;\r
 import android.widget.ImageView;\r
 import android.widget.ListAdapter;\r
 import android.widget.ListView;\r
@@ -46,7 +46,7 @@ import android.widget.TextView;
  * @author Bartek Przybylski\r
  * \r
  */\r
  * @author Bartek Przybylski\r
  * \r
  */\r
-public class FileListListAdapter implements ListAdapter {\r
+public class FileListListAdapter extends BaseAdapter implements ListAdapter {\r
     private Context mContext;\r
     private OCFile mFile;\r
     private Vector<OCFile> mFiles;\r
     private Context mContext;\r
     private OCFile mFile;\r
     private Vector<OCFile> mFiles;\r
@@ -79,7 +79,7 @@ public class FileListListAdapter implements ListAdapter {
 \r
     @Override\r
     public Object getItem(int position) {\r
 \r
     @Override\r
     public Object getItem(int position) {\r
-        if (mFiles.size() <= position)\r
+        if (mFiles == null || mFiles.size() <= position)\r
             return null;\r
         return mFiles.get(position);\r
     }\r
             return null;\r
         return mFiles.get(position);\r
     }\r
@@ -102,7 +102,7 @@ public class FileListListAdapter implements ListAdapter {
                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
             view = inflator.inflate(R.layout.list_layout, null);\r
         }\r
                     .getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r
             view = inflator.inflate(R.layout.list_layout, null);\r
         }\r
-        if (mFiles.size() > position) {\r
+        if (mFiles != null && mFiles.size() > position) {\r
             OCFile file = mFiles.get(position);\r
             TextView fileName = (TextView) view.findViewById(R.id.Filename);\r
             String name = file.getFileName();\r
             OCFile file = mFiles.get(position);\r
             TextView fileName = (TextView) view.findViewById(R.id.Filename);\r
             String name = file.getFileName();\r
@@ -184,11 +184,14 @@ public class FileListListAdapter implements ListAdapter {
         return mFiles != null ? mFiles.isEmpty() : false;\r
     }\r
 \r
         return mFiles != null ? mFiles.isEmpty() : false;\r
     }\r
 \r
-    @Override\r
-    public void registerDataSetObserver(DataSetObserver observer) {\r
-    }\r
-\r
-    @Override\r
-    public void unregisterDataSetObserver(DataSetObserver observer) {\r
+    /**\r
+     * Change the adapted directory for a new one\r
+     * @param directory     New file to adapt. Can be NULL, meaning "no content to adapt".\r
+     */\r
+    public void swapDirectory(OCFile directory) {\r
+        mFile = directory;\r
+        mFiles = mStorageManager.getDirectoryContent(mFile);\r
+        notifyDataSetChanged();\r
     }\r
     }\r
+    \r
 }\r
 }\r
index 690832a..d5db648 100644 (file)
@@ -20,15 +20,11 @@ package com.owncloud.android.ui.adapter;
 import java.io.File;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.io.File;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
 
 import com.owncloud.android.DisplayUtils;
 import com.owncloud.android.R;
 
 import android.content.Context;
 
 import com.owncloud.android.DisplayUtils;
 import com.owncloud.android.R;
 
 import android.content.Context;
-import android.database.DataSetObserver;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -50,7 +46,6 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
     private Context mContext;
     private File mDirectory;
     private File[] mFiles = null;
     private Context mContext;
     private File mDirectory;
     private File[] mFiles = null;
-    private Set<DataSetObserver> mObservers = new HashSet<DataSetObserver>();
 
     public LocalFileListAdapter(File directory, Context context) {
         mContext = context;
 
     public LocalFileListAdapter(File directory, Context context) {
         mContext = context;
@@ -159,23 +154,13 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
         return (mFiles == null || mFiles.length == 0);
     }
 
         return (mFiles == null || mFiles.length == 0);
     }
 
-    @Override
-    public void registerDataSetObserver(DataSetObserver observer) {
-        mObservers.add(observer);
-    }
-
-    @Override
-    public void unregisterDataSetObserver(DataSetObserver observer) {
-        mObservers.remove(observer);
-    }
-
     /**
      * Change the adapted directory for a new one
     /**
      * Change the adapted directory for a new one
-     * @param directory     New file to adapt. 
+     * @param directory     New file to adapt. Can be NULL, meaning "no content to adapt".
      */
     public void swapDirectory(File directory) {
         mDirectory = directory;
      */
     public void swapDirectory(File directory) {
         mDirectory = directory;
-        mFiles = mDirectory.listFiles();
+        mFiles = (mDirectory != null ? mDirectory.listFiles() : null);
         if (mFiles != null) {
             Arrays.sort(mFiles, new Comparator<File>() {
                 @Override
         if (mFiles != null) {
             Arrays.sort(mFiles, new Comparator<File>() {
                 @Override
@@ -194,9 +179,6 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter {
             
             });
         }
             
             });
         }
-        Iterator<DataSetObserver> it = mObservers.iterator();
-        while (it.hasNext()) {
-            it.next().onChanged();
-        }
+        notifyDataSetChanged();
     }
 }
     }
 }
index eaab80f..d60adbd 100644 (file)
@@ -74,17 +74,13 @@ public class LocalFileListFragment extends FragmentListView {
      */
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      */
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        Log.i(getClass().toString(), "onCreateView() start");
+        Log.i(TAG, "onCreateView() start");
         super.onCreateView(inflater, container, savedInstanceState);
         getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
         getListView().setDividerHeight(1);
         getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
         
         super.onCreateView(inflater, container, savedInstanceState);
         getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
         getListView().setDividerHeight(1);
         getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
         
-        if (savedInstanceState != null) {
-            // TODO recover previous state; or maybe in onActivityCreated
-        }
-        
-        Log.i(getClass().toString(), "onCreateView() end");
+        Log.i(TAG, "onCreateView() end");
         return getListView();
     }    
 
         return getListView();
     }    
 
@@ -94,11 +90,29 @@ public class LocalFileListFragment extends FragmentListView {
      */
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
      */
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-        Log.i(getClass().toString(), "onActivityCreated() start");
+        Log.i(TAG, "onActivityCreated() start");
         
         super.onCreate(savedInstanceState);
         
         super.onCreate(savedInstanceState);
+        mAdapter = new LocalFileListAdapter(mContainerActivity.getInitialDirectory(), getActivity());
+        setListAdapter(mAdapter);
+        
+        if (savedInstanceState != null) {
+            Log.i(TAG, "savedInstanceState is not null");
+            int position = savedInstanceState.getInt("LIST_POSITION");
+            getListView().setSelectionFromTop(position, 0);
+        }
         
         
-        Log.i(getClass().toString(), "onActivityCreated() stop");
+        Log.i(TAG, "onActivityCreated() stop");
+    }
+    
+    
+    @Override
+    public void onSaveInstanceState(Bundle savedInstanceState) {
+        Log.i(TAG, "onSaveInstanceState() start");
+        
+        savedInstanceState.putInt("LIST_POSITION", getListView().getFirstVisiblePosition());
+        
+        Log.i(TAG, "onSaveInstanceState() stop");
     }
     
     
     }
     
     
@@ -182,7 +196,7 @@ public class LocalFileListFragment extends FragmentListView {
                 directory = mDirectory;
             } else {
                 directory = Environment.getExternalStorageDirectory();  // TODO be careful with the state of the storage; could not be available
                 directory = mDirectory;
             } else {
                 directory = Environment.getExternalStorageDirectory();  // TODO be careful with the state of the storage; could not be available
-                if (directory == null) return; // no files, wait for sync
+                if (directory == null) return; // no files to show
             }
         }
         
             }
         }
         
@@ -194,14 +208,9 @@ public class LocalFileListFragment extends FragmentListView {
         }
 
         mDirectory = directory;
         }
 
         mDirectory = directory;
-        if (mAdapter == null) {
-            mAdapter = new LocalFileListAdapter(mDirectory, getActivity());
-            setListAdapter(mAdapter);
-        } else {
-            mList.clearChoices();   // by now, only files in the same directory will be kept as selected
-            mAdapter.swapDirectory(mDirectory);
-        }
-        
+        mList.clearChoices();   // by now, only files in the same directory will be kept as selected
+        mAdapter.swapDirectory(mDirectory);
+        mList.setSelectionFromTop(0, 0);
     }
     
 
     }
     
 
@@ -244,6 +253,14 @@ public class LocalFileListFragment extends FragmentListView {
          * @param file
          */
         public void onFileClick(File file);
          * @param file
          */
         public void onFileClick(File file);
+        
+        
+        /**
+         * Callback method invoked when the parent activity is fully created to get the directory to list firstly.
+         * 
+         * @return  Directory to list firstly. Can be NULL.
+         */
+        public File getInitialDirectory();
 
     }
 
 
     }
 
index 15c36d1..77cd78a 100644 (file)
@@ -55,32 +55,53 @@ public class OCFileListFragment extends FragmentListView {
         try {
             mContainerActivity = (ContainerActivity) activity;
         } catch (ClassCastException e) {
         try {
             mContainerActivity = (ContainerActivity) activity;
         } catch (ClassCastException e) {
-            throw new ClassCastException(activity.toString() + " must implement FileListFragment.ContainerActivity");
+            throw new ClassCastException(activity.toString() + " must implement " + OCFileListFragment.ContainerActivity.class.getCanonicalName());
         }
     }
     
     
         }
     }
     
     
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
-        Log.i(getClass().toString(), "onCreateView() start");
+        Log.i(TAG, "onCreateView() start");
         super.onCreateView(inflater, container, savedInstanceState);
         getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
         getListView().setDividerHeight(1);
         
         super.onCreateView(inflater, container, savedInstanceState);
         getListView().setDivider(getResources().getDrawable(R.drawable.uploader_list_separator));
         getListView().setDividerHeight(1);
         
-        Log.i(getClass().toString(), "onCreateView() end");
+        Log.i(TAG, "onCreateView() end");
         return getListView();
     }    
 
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         return getListView();
     }    
 
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-        Log.i(getClass().toString(), "onActivityCreated() start");
+        Log.i(TAG, "onActivityCreated() start");
         
         super.onCreate(savedInstanceState);
         
         super.onCreate(savedInstanceState);
+        mAdapter = new FileListListAdapter(mContainerActivity.getInitialDirectory(), mContainerActivity.getStorageManager(), getActivity());
+        setListAdapter(mAdapter);
+        
+        if (savedInstanceState != null) {
+            Log.i(TAG, "savedInstanceState is not null");
+            int position = savedInstanceState.getInt("LIST_POSITION");
+            getListView().setSelectionFromTop(position, 0);
+        }
         //mAdapter = new FileListListAdapter();
         
         //mAdapter = new FileListListAdapter();
         
-        Log.i(getClass().toString(), "onActivityCreated() stop");
+        Log.i(TAG, "onActivityCreated() stop");
+    }
+    
+    
+    @Override
+    public void onSaveInstanceState(Bundle savedInstanceState) {
+        Log.i(TAG, "onSaveInstanceState() start");
+        
+        savedInstanceState.putInt("LIST_POSITION", getListView().getFirstVisiblePosition());
+        
+        Log.i(TAG, "onSaveInstanceState() stop");
     }
     
     
     }
     
     
@@ -144,7 +165,6 @@ public class OCFileListFragment extends FragmentListView {
      * @param directory File to be listed
      */
     public void listDirectory(OCFile directory) {
      * @param directory File to be listed
      */
     public void listDirectory(OCFile directory) {
-        
         DataStorageManager storageManager = mContainerActivity.getStorageManager();
 
         // Check input parameters for null
         DataStorageManager storageManager = mContainerActivity.getStorageManager();
 
         // Check input parameters for null
@@ -165,9 +185,8 @@ public class OCFileListFragment extends FragmentListView {
         }
 
         mFile = directory;
         }
 
         mFile = directory;
-        
-        mAdapter = new FileListListAdapter(directory, storageManager, getActivity());
-        setListAdapter(mAdapter);
+        mAdapter.swapDirectory(mFile);
+        mList.setSelectionFromTop(0, 0);
     }
     
     
     }
     
     
@@ -198,6 +217,15 @@ public class OCFileListFragment extends FragmentListView {
          */
         public DataStorageManager getStorageManager();
         
          */
         public DataStorageManager getStorageManager();
         
+        
+        /**
+         * Callback method invoked when the parent activity is fully created to get the directory to list firstly.
+         * 
+         * @return  Directory to list firstly. Can be NULL.
+         */
+        public OCFile getInitialDirectory();
+        
+        
     }
 
 }
     }
 
 }