From c38384e134e741450d8636418bf7e1c2d96b40d6 Mon Sep 17 00:00:00 2001 From: Jesse Vincent Date: Sat, 30 Jan 2010 03:26:45 +0000 Subject: [PATCH] Further refactoring to MessageList and FolderList to (hopefully) address force-closes and inconsistent data on activity reuse. Also, removing broken/unused code to preserve activity state across invocations. across invocations. --- src/com/fsck/k9/activity/FolderList.java | 32 +---- src/com/fsck/k9/activity/MessageList.java | 150 ++++++++-------------- 2 files changed, 60 insertions(+), 122 deletions(-) diff --git a/src/com/fsck/k9/activity/FolderList.java b/src/com/fsck/k9/activity/FolderList.java index c7538e2b6..4604b93e5 100644 --- a/src/com/fsck/k9/activity/FolderList.java +++ b/src/com/fsck/k9/activity/FolderList.java @@ -60,7 +60,7 @@ public class FolderList extends K9ListActivity private FolderListHandler mHandler = new FolderListHandler(); - private int mUnreadMessageCount = 0; + private int mUnreadMessageCount; class FolderListHandler extends Handler { @@ -244,18 +244,19 @@ public class FolderList extends K9ListActivity @Override public void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); onNewIntent(getIntent()); } - public void onNewIntent (Intent intent) { + public void onNewIntent(Intent intent) + { String savedFolderName = null; String initialFolder; + + mUnreadMessageCount = 0; mAccount = (Account)intent.getSerializableExtra(EXTRA_ACCOUNT); - initialFolder = intent.getStringExtra(EXTRA_INITIAL_FOLDER); + initialFolder = intent.getStringExtra(EXTRA_INITIAL_FOLDER); if ( initialFolder != null && !K9.FOLDER_NONE.equals(initialFolder)) @@ -270,11 +271,6 @@ public class FolderList extends K9ListActivity } } - /* There are two times when we might need to initialize the activity view - * onCreate - * OR - * onResume if the initial onCreate opened a folder directly - */ private void initializeActivityView() { requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); @@ -292,11 +288,7 @@ public class FolderList extends K9ListActivity } }); registerForContextMenu(mListView); - - /* - * We manually save and restore the list's state because our adapter is - * slow. - */ + mListView.setSaveEnabled(true); mInflater = getLayoutInflater(); @@ -353,16 +345,6 @@ public class FolderList extends K9ListActivity } - @Override - public void onSaveInstanceState(Bundle outState) - { - super.onSaveInstanceState(outState); - if (mSelectedContextFolder != null) - { - outState.putString(STATE_CURRENT_FOLDER, mSelectedContextFolder.name); - } - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java index a6dfaaffd..ce7aa91a3 100644 --- a/src/com/fsck/k9/activity/MessageList.java +++ b/src/com/fsck/k9/activity/MessageList.java @@ -70,7 +70,7 @@ public class MessageList private static final String STATE_KEY_LIST = "com.fsck.k9.activity.messagelist_state"; private static final String STATE_CURRENT_FOLDER = "com.fsck.k9.activity.messagelist_folder"; private static final String STATE_QUERY = "com.fsck.k9.activity.query"; - private static final String STATE_KEY_SELECTION = "com.fsck.k9.activity.messagelist_selection"; + private static final String STATE_CURRENT_ITEM = "com.fsck.k9.activity.messagelist_selection"; private static final String STATE_KEY_SELECTED_COUNT = "com.fsck.k9.activity.messagelist_selected_count"; @@ -330,83 +330,26 @@ public class MessageList // Debug.startMethodTracing("k9"); super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - requestWindowFeature(Window.FEATURE_PROGRESS); - setContentView(R.layout.message_list); - - mListView = (ListView) findViewById(R.id.message_list); - mListView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET); - mListView.setLongClickable(true); - mListView.setFastScrollEnabled(true); - mListView.setScrollingCacheEnabled(true); - mListView.setOnItemClickListener(this); - - - registerForContextMenu(mListView); - - /* - * We manually save and restore the list's state because our adapter is - * slow. - */ - mListView.setSaveEnabled(false); - mInflater = getLayoutInflater(); - - mBatchButtonArea = findViewById(R.id.batch_button_area); - mBatchReadButton = (Button) findViewById(R.id.batch_read_button); - mBatchReadButton.setOnClickListener(this); - mBatchDeleteButton = (Button) findViewById(R.id.batch_delete_button); - mBatchDeleteButton.setOnClickListener(this); - mBatchFlagButton = (Button) findViewById(R.id.batch_flag_button); - mBatchFlagButton.setOnClickListener(this); - mBatchDoneButton = (Button) findViewById(R.id.batch_done_button); - - mBatchDoneButton.setOnClickListener(this); - - // Gesture detection - gestureDetector = new GestureDetector(new MyGestureDetector()); - gestureListener = new View.OnTouchListener() - { - public boolean onTouch(View v, MotionEvent event) - { - if (gestureDetector.onTouchEvent(event)) - { - return true; - } - return false; - } - }; - - mListView.setOnTouchListener(gestureListener); - - if (savedInstanceState != null) - { - mFolderName = savedInstanceState.getString(STATE_CURRENT_FOLDER); - mQueryString = savedInstanceState.getString(STATE_QUERY); - mSelectedCount = savedInstanceState.getInt(STATE_KEY_SELECTED_COUNT); - onRestoreListState(savedInstanceState); - } + initializeLayout(); onNewIntent(getIntent()); } - public void onNewIntent(Intent intent) { + public void onNewIntent(Intent intent) + { mAccount = (Account)intent.getSerializableExtra(EXTRA_ACCOUNT); + mFolderName = intent.getStringExtra(EXTRA_FOLDER); + mQueryString = intent.getStringExtra(EXTRA_QUERY); // Take the initial folder into account only if we are *not* restoring the // activity already - mFolderName = intent.getStringExtra(EXTRA_FOLDER); - mQueryString = intent.getStringExtra(EXTRA_QUERY); - - - - if (mFolderName == null && mQueryString == null) - { - mFolderName = mAccount.getAutoExpandFolderName(); - } + if (mFolderName == null && mQueryString == null) + { + mFolderName = mAccount.getAutoExpandFolderName(); + } mAdapter = new MessageListAdapter(); - final Object previousData = getLastNonConfigurationInstance(); if (previousData != null) @@ -421,32 +364,11 @@ public class MessageList } mController = MessagingController.getInstance(getApplication()); - mListView.setAdapter(mAdapter); } - private void onRestoreListState(Bundle savedInstanceState) - { - mFolderName = savedInstanceState.getString(STATE_CURRENT_FOLDER); - mQueryString = savedInstanceState.getString(STATE_QUERY); - - int selectedChild = savedInstanceState.getInt(STATE_KEY_SELECTION, -1); - - if (selectedChild != 0) - { - mListView.setSelection(selectedChild); - } - if (mFolderName != null) - { - mCurrentFolder = mAdapter.getFolder(mFolderName, mAccount); - } - - - mListView.onRestoreInstanceState(savedInstanceState.getParcelable(STATE_KEY_LIST)); - } - @Override public void onPause() { @@ -455,6 +377,7 @@ public class MessageList mController.removeListener(mAdapter.mListener); } + /** * On resume we refresh * messages for the folder that is currently open. This guarantees that things @@ -497,17 +420,50 @@ public class MessageList } - @Override - public void onSaveInstanceState(Bundle outState) + private void initializeLayout () { - super.onSaveInstanceState(outState); - outState.putParcelable(STATE_KEY_LIST, mListView.onSaveInstanceState()); - outState.putInt(STATE_KEY_SELECTION, mListView .getSelectedItemPosition()); - outState.putString(STATE_CURRENT_FOLDER, mFolderName); - outState.putString(STATE_QUERY, mQueryString); - outState.putInt(STATE_KEY_SELECTED_COUNT, mSelectedCount); - } + requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + requestWindowFeature(Window.FEATURE_PROGRESS); + setContentView(R.layout.message_list); + mListView = (ListView) findViewById(R.id.message_list); + mListView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_INSET); + mListView.setLongClickable(true); + mListView.setFastScrollEnabled(true); + mListView.setScrollingCacheEnabled(true); + mListView.setOnItemClickListener(this); + + + registerForContextMenu(mListView); + + + mBatchButtonArea = findViewById(R.id.batch_button_area); + mBatchReadButton = (Button) findViewById(R.id.batch_read_button); + mBatchReadButton.setOnClickListener(this); + mBatchDeleteButton = (Button) findViewById(R.id.batch_delete_button); + mBatchDeleteButton.setOnClickListener(this); + mBatchFlagButton = (Button) findViewById(R.id.batch_flag_button); + mBatchFlagButton.setOnClickListener(this); + mBatchDoneButton = (Button) findViewById(R.id.batch_done_button); + + mBatchDoneButton.setOnClickListener(this); + + // Gesture detection + gestureDetector = new GestureDetector(new MyGestureDetector()); + gestureListener = new View.OnTouchListener() + { + public boolean onTouch(View v, MotionEvent event) + { + if (gestureDetector.onTouchEvent(event)) + { + return true; + } + return false; + } + }; + + mListView.setOnTouchListener(gestureListener); + } @Override public Object onRetainNonConfigurationInstance() {