From: David A. Velasco Date: Wed, 3 Oct 2012 14:48:06 +0000 (+0200) Subject: Files list position is kept when the orientation changes X-Git-Tag: oc-android-1.4.3~168 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/a2d4e98a7e831cde099fa7185c8553998aa76cf4?ds=inline;hp=--cc Files list position is kept when the orientation changes --- a2d4e98a7e831cde099fa7185c8553998aa76cf4 diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index fb310ecc..64098f70 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -421,7 +421,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements registerReceiver(mDownloadFinishReceiver, downloadIntentFilter); // List current directory - mFileList.listDirectory(mCurrentDir); + //mFileList.listDirectory(mCurrentDir); } else { @@ -857,6 +857,15 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements * {@inheritDoc} */ @Override + public OCFile getInitialDirectory() { + return mCurrentDir; + } + + + /** + * {@inheritDoc} + */ + @Override public void onFileStateChanged() { OCFileListFragment fileListFragment = (OCFileListFragment) getSupportFragmentManager().findFragmentById(R.id.fileList); if (fileListFragment != null) { diff --git a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java index aca4d896..7382d798 100644 --- a/src/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/src/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -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); + // 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"); } - @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 @@ -244,6 +234,14 @@ public class UploadFilesActivity extends SherlockFragmentActivity implements public void onFileClick(File file) { // nothing to do } + + /** + * {@inheritDoc} + */ + @Override + public File getInitialDirectory() { + return mCurrentDir; + } /** diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index da4f8159..fb393135 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -30,10 +30,10 @@ import com.owncloud.android.R; import android.accounts.Account; import android.content.Context; -import android.database.DataSetObserver; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; @@ -46,7 +46,7 @@ import android.widget.TextView; * @author Bartek Przybylski * */ -public class FileListListAdapter implements ListAdapter { +public class FileListListAdapter extends BaseAdapter implements ListAdapter { private Context mContext; private OCFile mFile; private Vector mFiles; @@ -79,7 +79,7 @@ public class FileListListAdapter implements ListAdapter { @Override public Object getItem(int position) { - if (mFiles.size() <= position) + if (mFiles == null || mFiles.size() <= position) return null; return mFiles.get(position); } @@ -102,7 +102,7 @@ public class FileListListAdapter implements ListAdapter { .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflator.inflate(R.layout.list_layout, null); } - if (mFiles.size() > position) { + if (mFiles != null && mFiles.size() > position) { OCFile file = mFiles.get(position); TextView fileName = (TextView) view.findViewById(R.id.Filename); String name = file.getFileName(); @@ -184,11 +184,14 @@ public class FileListListAdapter implements ListAdapter { return mFiles != null ? mFiles.isEmpty() : false; } - @Override - public void registerDataSetObserver(DataSetObserver observer) { - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { + /** + * Change the adapted directory for a new one + * @param directory New file to adapt. Can be NULL, meaning "no content to adapt". + */ + public void swapDirectory(OCFile directory) { + mFile = directory; + mFiles = mStorageManager.getDirectoryContent(mFile); + notifyDataSetChanged(); } + } diff --git a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index 690832a7..d5db6489 100644 --- a/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -20,15 +20,11 @@ package com.owncloud.android.ui.adapter; 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 android.database.DataSetObserver; 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 Set mObservers = new HashSet(); 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); } - @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 - * @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; - mFiles = mDirectory.listFiles(); + mFiles = (mDirectory != null ? mDirectory.listFiles() : null); if (mFiles != null) { Arrays.sort(mFiles, new Comparator() { @Override @@ -194,9 +179,6 @@ public class LocalFileListAdapter extends BaseAdapter implements ListAdapter { }); } - Iterator it = mObservers.iterator(); - while (it.hasNext()) { - it.next().onChanged(); - } + notifyDataSetChanged(); } } diff --git a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java index eaab80f5..d60adbde 100644 --- a/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -74,17 +74,13 @@ public class LocalFileListFragment extends FragmentListView { */ @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); - if (savedInstanceState != null) { - // TODO recover previous state; or maybe in onActivityCreated - } - - Log.i(getClass().toString(), "onCreateView() end"); + Log.i(TAG, "onCreateView() end"); return getListView(); } @@ -94,11 +90,29 @@ public class LocalFileListFragment extends FragmentListView { */ @Override public void onActivityCreated(Bundle savedInstanceState) { - Log.i(getClass().toString(), "onActivityCreated() start"); + Log.i(TAG, "onActivityCreated() start"); 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 - 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; - 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); + + + /** + * 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(); } diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 15c36d1a..77cd78a1 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -55,32 +55,53 @@ public class OCFileListFragment extends FragmentListView { 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) { - 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); - Log.i(getClass().toString(), "onCreateView() end"); + Log.i(TAG, "onCreateView() end"); return getListView(); } @Override public void onActivityCreated(Bundle savedInstanceState) { - Log.i(getClass().toString(), "onActivityCreated() start"); + Log.i(TAG, "onActivityCreated() start"); 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(); - 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) { - DataStorageManager storageManager = mContainerActivity.getStorageManager(); // Check input parameters for null @@ -165,9 +185,8 @@ public class OCFileListFragment extends FragmentListView { } 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(); + + /** + * 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(); + + } }