Read settings and keep them up to date.

Change-Id: I8d41e460b2c0c462edc6a877edc4189c675cef1f
diff --git a/src/com/android/mail/providers/Account.java b/src/com/android/mail/providers/Account.java
index 0e99fab..50170bb 100644
--- a/src/com/android/mail/providers/Account.java
+++ b/src/com/android/mail/providers/Account.java
@@ -92,12 +92,12 @@
      * Uri for EDIT intent that will cause the settings screens for this account type to be
      * shown.
      */
-    public final Uri settingIntentUri;
+    public final Uri settingsIntentUri;
 
     /**
      * The content provider uri that can be used to query user settings/preferences
      */
-    public final Uri settingQueryUri;
+    public final Uri settingsQueryUri;
 
     /**
      * Uri for VIEW intent that will cause the help screens for this account type to be
@@ -154,8 +154,8 @@
         out.append(sendMessageUri).append(ACCOUNT_COMPONENT_SEPARATOR);
         out.append(expungeMessageUri).append(ACCOUNT_COMPONENT_SEPARATOR);
         out.append(undoUri).append(ACCOUNT_COMPONENT_SEPARATOR);
-        out.append(settingIntentUri).append(ACCOUNT_COMPONENT_SEPARATOR);
-        out.append(settingQueryUri).append(ACCOUNT_COMPONENT_SEPARATOR);
+        out.append(settingsIntentUri).append(ACCOUNT_COMPONENT_SEPARATOR);
+        out.append(settingsQueryUri).append(ACCOUNT_COMPONENT_SEPARATOR);
         out.append(helpIntentUri).append(ACCOUNT_COMPONENT_SEPARATOR);
         out.append(syncStatus).append(ACCOUNT_COMPONENT_SEPARATOR);
         out.append(composeIntentUri);
@@ -185,8 +185,8 @@
         sendMessageUri = Uri.parse(accountMembers[9]);
         expungeMessageUri = Uri.parse(accountMembers[10]);
         undoUri = Uri.parse(accountMembers[11]);
-        settingIntentUri = Uri.parse(accountMembers[12]);
-        settingQueryUri = Uri.parse(accountMembers[13]);
+        settingsIntentUri = Uri.parse(accountMembers[12]);
+        settingsQueryUri = Uri.parse(accountMembers[13]);
         helpIntentUri = Uri.parse(accountMembers[14]);
         syncStatus = Integer.valueOf(accountMembers[15]);
         composeIntentUri = Uri.parse(accountMembers[16]);
@@ -204,8 +204,8 @@
         sendMessageUri = in.readParcelable(null);
         expungeMessageUri = in.readParcelable(null);
         undoUri = in.readParcelable(null);
-        settingIntentUri = in.readParcelable(null);
-        settingQueryUri = in.readParcelable(null);
+        settingsIntentUri = in.readParcelable(null);
+        settingsQueryUri = in.readParcelable(null);
         helpIntentUri = in.readParcelable(null);
         syncStatus = in.readInt();
         composeIntentUri = in.readParcelable(null);
@@ -230,9 +230,9 @@
         final String undo = cursor.getString(UIProvider.ACCOUNT_UNDO_URI_COLUMN);
         undoUri = !TextUtils.isEmpty(undo) ? Uri.parse(undo) : null;
         final String settings = cursor.getString(UIProvider.ACCOUNT_SETTINGS_INTENT_URI_COLUMN);
-        settingIntentUri = !TextUtils.isEmpty(settings) ? Uri.parse(settings) : null;
+        settingsIntentUri = !TextUtils.isEmpty(settings) ? Uri.parse(settings) : null;
         final String settingsQuery = cursor.getString(UIProvider.ACCOUNT_SETTINGS_QUERY_URI_COLUMN);
-        settingQueryUri = !TextUtils.isEmpty(settingsQuery) ? Uri.parse(settingsQuery) : null;
+        settingsQueryUri = !TextUtils.isEmpty(settingsQuery) ? Uri.parse(settingsQuery) : null;
         final String help = cursor.getString(UIProvider.ACCOUNT_HELP_INTENT_URI_COLUMN);
         helpIntentUri = !TextUtils.isEmpty(help) ? Uri.parse(help) : null;
         syncStatus = cursor.getInt(UIProvider.ACCOUNT_SYNC_STATUS_COLUMN);
@@ -281,8 +281,8 @@
         dest.writeParcelable(sendMessageUri, 0);
         dest.writeParcelable(expungeMessageUri, 0);
         dest.writeParcelable(undoUri, 0);
-        dest.writeParcelable(settingIntentUri, 0);
-        dest.writeParcelable(settingQueryUri, 0);
+        dest.writeParcelable(settingsIntentUri, 0);
+        dest.writeParcelable(settingsQueryUri, 0);
         dest.writeParcelable(helpIntentUri, 0);
         dest.writeInt(syncStatus);
         dest.writeParcelable(composeIntentUri, 0);
diff --git a/src/com/android/mail/providers/AccountCacheProvider.java b/src/com/android/mail/providers/AccountCacheProvider.java
index 7fbc6de..84754d5 100644
--- a/src/com/android/mail/providers/AccountCacheProvider.java
+++ b/src/com/android/mail/providers/AccountCacheProvider.java
@@ -276,8 +276,8 @@
             mSendMailUri = acct.sendMessageUri;
             mExpungeMessageUri = acct.expungeMessageUri;
             mUndoUri = acct.undoUri;
-            mSettingsIntentUri = acct.settingIntentUri;
-            mSettingsQueryUri = acct.settingQueryUri;
+            mSettingsIntentUri = acct.settingsIntentUri;
+            mSettingsQueryUri = acct.settingsQueryUri;
             mHelpIntentUri = acct.helpIntentUri;
             mSyncStatus = acct.syncStatus;
             mComposeIntentUri = acct.composeIntentUri;
diff --git a/src/com/android/mail/providers/Settings.java b/src/com/android/mail/providers/Settings.java
index de7dfa7..2b581c8 100644
--- a/src/com/android/mail/providers/Settings.java
+++ b/src/com/android/mail/providers/Settings.java
@@ -17,8 +17,10 @@
 package com.android.mail.providers;
 
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.text.TextUtils;
 
 /**
  * Model to hold Settings for an account.
@@ -33,7 +35,7 @@
     public boolean confirmDelete;
     public boolean confirmArchive;
     public boolean confirmSend;
-    public Folder defaultInbox;
+    public Uri defaultInbox;
 
     public Settings(Parcel inParcel) {
         signature = inParcel.readString();
@@ -45,7 +47,8 @@
         confirmDelete = inParcel.readInt() != 0;
         confirmArchive = inParcel.readInt() != 0;
         confirmSend = inParcel.readInt() != 0;
-        defaultInbox = new Folder(inParcel.readString());
+        final String inbox = inParcel.readString();
+        defaultInbox = !TextUtils.isEmpty(inbox) ? Uri.parse(inbox) : null;
     }
 
     public Settings(Cursor cursor) {
@@ -58,7 +61,8 @@
         confirmDelete = cursor.getInt(UIProvider.SETTINGS_CONFIRM_DELETE_COLUMN) != 0;
         confirmArchive = cursor.getInt(UIProvider.SETTINGS_CONFIRM_ARCHIVE_COLUMN) != 0;
         confirmSend = cursor.getInt(UIProvider.SETTINGS_CONFIRM_SEND_COLUMN) != 0;
-        defaultInbox = new Folder(cursor.getString(UIProvider.SETTINGS_DEFAULT_INBOX_COLUMN));
+        final String inbox = cursor.getString(UIProvider.SETTINGS_DEFAULT_INBOX_COLUMN);
+        defaultInbox = !TextUtils.isEmpty(inbox) ? Uri.parse(inbox) : null;
     }
 
     @Override
@@ -77,7 +81,7 @@
         dest.writeInt(confirmDelete ? 1 : 0);
         dest.writeInt(confirmArchive? 1 : 0);
         dest.writeInt(confirmSend? 1 : 0);
-        dest.writeString(defaultInbox.serialize());
+        dest.writeString(defaultInbox.toString());
     }
 
     @SuppressWarnings("hiding")
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 01ef42b..66f6be9 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -49,6 +49,7 @@
 import com.android.mail.providers.AccountCacheProvider;
 import com.android.mail.providers.Conversation;
 import com.android.mail.providers.Folder;
+import com.android.mail.providers.Settings;
 import com.android.mail.providers.UIProvider;
 import com.android.mail.providers.UIProvider.AccountCapabilities;
 import com.android.mail.providers.UIProvider.LastSyncResult;
@@ -123,9 +124,12 @@
         }
     };
     private final Set<Uri> mCurrentAccountUris = Sets.newHashSet();
+    private Settings mCachedSettings;
+
     protected static final String LOG_TAG = new LogUtils().getLogTag();
     private static final int ACCOUNT_CURSOR_LOADER = 0;
-    private static final int FOLDER_CURSOR_LOADER = 1;
+    private static final int ACCOUNT_SETTINGS_LOADER = 1;
+    private static final int FOLDER_CURSOR_LOADER = 2;
 
     public AbstractActivityController(MailActivity activity, ViewMode viewMode) {
         mActivity = activity;
@@ -249,6 +253,8 @@
     public void onAccountChanged(Account account) {
         if (!account.equals(mAccount)) {
             mAccount = account;
+            onSettingsChanged(null);
+            restartSettingsLoader();
             mActionBarView.setAccount(mAccount);
             // Account changed; existing folder is invalid.
             mFolder = null;
@@ -257,6 +263,17 @@
         }
     }
 
+
+    private void restartSettingsLoader() {
+        if (mAccount.settingsQueryUri != null) {
+            mActivity.getLoaderManager().restartLoader(ACCOUNT_SETTINGS_LOADER, null, this);
+        }
+    }
+
+    public void onSettingsChanged(Settings settings) {
+        mCachedSettings = settings;
+    }
+
     private void fetchAccountFolderInfo() {
         if (mFetchAccountFolderTask != null) {
             mFetchAccountFolderTask.cancel(true);
@@ -486,7 +503,7 @@
 
     @Override
     public void showPreferences() {
-        final Intent preferenceIntent = new Intent(Intent.ACTION_EDIT, mAccount.settingIntentUri);
+        final Intent preferenceIntent = new Intent(Intent.ACTION_EDIT, mAccount.settingsIntentUri);
         mActivity.startActivity(preferenceIntent);
     }
 
@@ -558,6 +575,7 @@
         Bundle listContextBundle = savedState.getBundle(SAVED_LIST_CONTEXT);
         if (listContextBundle != null) {
             mConvListContext = ConversationListContext.forBundle(listContextBundle);
+            mFolder = mConvListContext.folder;
         }
     }
 
@@ -571,13 +589,14 @@
     protected void restoreState(Bundle savedState) {
         if (savedState != null) {
             restoreListContext(savedState);
-            mViewMode.handleRestore(savedState);
             mAccount = savedState.getParcelable(SAVED_ACCOUNT);
+            restartSettingsLoader();
         } else {
             final Intent intent = mActivity.getIntent();
             if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction())) {
                 if (intent.hasExtra(Utils.EXTRA_ACCOUNT)) {
                     mAccount = ((Account) intent.getParcelableExtra(Utils.EXTRA_ACCOUNT));
+                    mActivity.getLoaderManager().restartLoader(ACCOUNT_SETTINGS_LOADER, null, this);
                     updateHelpMenuItem();
                 }
                 if (intent.hasExtra(Utils.EXTRA_FOLDER)) {
@@ -639,6 +658,11 @@
         } else if (id == FOLDER_CURSOR_LOADER) {
             return new CursorLoader(mActivity.getActivityContext(), mFolder.uri,
                     UIProvider.FOLDERS_PROJECTION, null, null, null);
+        } else if (id == ACCOUNT_SETTINGS_LOADER) {
+            if (mAccount.settingsQueryUri != null) {
+                return new CursorLoader(mActivity.getActivityContext(), mAccount.settingsQueryUri,
+                        UIProvider.SETTINGS_PROJECTION, null, null, null);
+            }
         }
         return null;
     }
@@ -742,6 +766,11 @@
                 }
                 LogUtils.v(LOG_TAG, "FOLDER STATUS = " + folder.syncStatus);
             }
+        } else if (id == ACCOUNT_SETTINGS_LOADER) {
+            if (data != null) {
+                data.moveToFirst();
+                onSettingsChanged(new Settings(data));
+            }
         }
     }