SMS conversation list doesn't mantain scroll position

Bug 7585885

Change-Id: Ic500e0b3245b5f42a9e7994827a3825b041b1c01
diff --git a/src/com/android/mms/ui/ConversationList.java b/src/com/android/mms/ui/ConversationList.java
index 4d5ca6b..ac71baa 100644
--- a/src/com/android/mms/ui/ConversationList.java
+++ b/src/com/android/mms/ui/ConversationList.java
@@ -109,6 +109,12 @@
     private TextView mUnreadConvCount;
     private MenuItem mSearchItem;
     private SearchView mSearchView;
+    private int mSavedFirstVisiblePosition = AdapterView.INVALID_POSITION;
+    private int mSavedFirstItemOffset;
+
+    // keys for extras and icicles
+    private final static String LAST_LIST_POS = "last_list_pos";
+    private final static String LAST_LIST_OFFSET = "last_list_offset";
 
     static private final String CHECKED_MESSAGE_LIMITS = "checked_message_limits";
 
@@ -142,6 +148,36 @@
         if (!checkedMessageLimits || DEBUG) {
             runOneTimeStorageLimitCheckForLegacyMessages();
         }
+
+        if (savedInstanceState != null) {
+            mSavedFirstVisiblePosition = savedInstanceState.getInt(LAST_LIST_POS,
+                    AdapterView.INVALID_POSITION);
+            mSavedFirstItemOffset = savedInstanceState.getInt(LAST_LIST_OFFSET, 0);
+        } else {
+            mSavedFirstVisiblePosition = AdapterView.INVALID_POSITION;
+            mSavedFirstItemOffset = 0;
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+
+        outState.putInt(LAST_LIST_POS, mSavedFirstVisiblePosition);
+        outState.putInt(LAST_LIST_OFFSET, mSavedFirstItemOffset);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+
+        // Remember where the list is scrolled to so we can restore the scroll position
+        // when we come back to this activity and *after* we complete querying for the
+        // conversations.
+        ListView listView = getListView();
+        mSavedFirstVisiblePosition = listView.getFirstVisiblePosition();
+        View firstChild = listView.getChildAt(0);
+        mSavedFirstItemOffset = (firstChild == null) ? 0 : firstChild.getTop();
     }
 
     private void setupActionBar() {
@@ -756,6 +792,12 @@
                     // 2. Mark all the conversations as seen.
                     Conversation.markAllConversationsAsSeen(getApplicationContext());
                 }
+                if (mSavedFirstVisiblePosition != AdapterView.INVALID_POSITION) {
+                    // Restore the list to its previous position.
+                    getListView().setSelectionFromTop(mSavedFirstVisiblePosition,
+                            mSavedFirstItemOffset);
+                    mSavedFirstVisiblePosition = AdapterView.INVALID_POSITION;
+                }
                 break;
 
             case UNREAD_THREADS_QUERY_TOKEN: