Merge "This CL makes the widget launch correctly"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 95fc926..b9739ad 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -48,15 +48,15 @@
         <activity android:name="LabelSynchronizationActivity"
             android:theme="@android:style/Theme.Holo.Light.Dialog" />
 
-        <activity android:name="CreateShortcutActivity"
+        <activity android:name=".ui.CreateShortcutActivity"
             android:theme="@style/ShortcutWidgetTheme"
             android:label="@string/activity_folder_selection" />
 
-        <activity android:name="FolderSelectionActivity"
+        <activity android:name=".ui.FolderSelectionActivity"
             android:theme="@style/ShortcutWidgetTheme"
             android:label="@string/activity_folder_selection" />
 
-        <activity android:name="MailboxSelectionActivity"
+        <activity android:name=".ui.MailboxSelectionActivity"
             android:theme="@style/InvisibleShortcutWidgetTheme"
             android:label="@string/app_name" >
             <intent-filter>
@@ -107,7 +107,7 @@
         <service android:name=".compose.EmptyService"/>
 
         <!-- Widget -->
-        <receiver android:name=".widget.WidgetProvider"  android:label="@string/app_name">
+        <receiver android:name=".widget.WidgetProvider" android:label="@string/app_name">
             <intent-filter>
                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
             </intent-filter>
diff --git a/res/layout/folders_activity.xml b/res/layout/folders_activity.xml
index 82875fd..0482e30 100644
--- a/res/layout/folders_activity.xml
+++ b/res/layout/folders_activity.xml
@@ -15,25 +15,22 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:minWidth="@dimen/folder_list_popup_width"
     android:orientation="vertical" >
 
-    <ListView
-        android:id="@+id/folders_list"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:cacheColorHint="@android:color/transparent"
-        android:drawSelectorOnTop="false"
-        android:fadingEdge="none" />
-
-    <TextView android:id="@+id/empty_view"
-        android:visibility="gone"
+    <FrameLayout
+        android:id="@+id/folder_list_pane"
+        android:name="com.android.mail.ui.FolderListFragment"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:text="@string/folders_activity_instructions"/>
+        android:layout_weight="1"
+        android:layout_marginLeft="16dip"
+        android:layout_marginRight="16dip"/>
+
+    <include layout="@layout/one_button_button_bar"/>
 
 </LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3496bf1..8c89b1a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -123,8 +123,8 @@
     <string name="forward">Forward</string>
     <!-- Menu item: compose a new email -->
     <string name="menu_compose">Compose</string>
-    <!-- Menu item: change the labels for this conversion. -->
-    <string name="menu_change_labels">Change labels</string>
+    <!-- Menu item: change the labels for this conversation. -->
+    <string name="menu_change_folders">Change folders</string>
     <!-- Menu item: manages the labels for this account. [CHAR LIMIT = 30] -->
     <string name="menu_manage_labels">Manage labels</string>
     <!-- Title for the Label list screen. [CHAR LIMIT = 30] -->
@@ -498,4 +498,8 @@
 
     <!-- Checkbox text to enable sync for a folder where a widget is in the processes of being added, and sync had been not been enabled [CHAR LIMIT=30] -->
     <string name="folder_sync_for_widget_checkbox">Sync last <xliff:g id="numSyncDays" example="30">%d</xliff:g> days</string>
+
+    <!-- Folder selection dialog -->
+    <!-- Title for change folders dialog [CHAR LIMIT=30] -->
+    <string name="folder_selection_dialog_title">Change folders</string>
 </resources>
diff --git a/src/com/android/mail/ui/FolderSelectionActivity.java b/src/com/android/mail/ui/FolderSelectionActivity.java
index 4621201..196da66 100644
--- a/src/com/android/mail/ui/FolderSelectionActivity.java
+++ b/src/com/android/mail/ui/FolderSelectionActivity.java
@@ -22,6 +22,7 @@
 import android.app.Fragment;
 import android.app.FragmentTransaction;
 import android.appwidget.AppWidgetManager;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.database.Cursor;
@@ -32,9 +33,11 @@
 import android.widget.Button;
 
 import com.android.mail.R;
+import com.android.mail.browse.ConversationItemView.StarHandler;
 import com.android.mail.providers.Account;
 import com.android.mail.providers.Folder;
 import com.android.mail.providers.UIProvider;
+import com.android.mail.ui.ViewMode.ModeChangeListener;
 import com.android.mail.utils.LogUtils;
 import com.android.mail.utils.Utils;
 import com.android.mail.widget.WidgetProvider;
@@ -46,7 +49,7 @@
  * This activity displays the list of available folders for the current account.
  */
 public class FolderSelectionActivity extends Activity implements OnClickListener,
-        DialogInterface.OnClickListener, FolderChangeListener {
+        DialogInterface.OnClickListener, FolderChangeListener, ControllableActivity {
     public static final String EXTRA_ACCOUNT_SHORTCUT = "account-shortcut";
 
     private static final String LOG_TAG = new LogUtils().getLogTag();
@@ -93,7 +96,7 @@
         FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
         Fragment fragment = FolderListFragment.newInstance(this, mAccount.folderListUri,
                 FolderListFragment.MODE_PICK);
-        fragmentTransaction.replace(R.id.folders_pane, fragment);
+        fragmentTransaction.replace(R.id.folder_list_pane, fragment);
         fragmentTransaction.commitAllowingStateLoss();
     }
 
@@ -209,4 +212,50 @@
             }
         }
     }
+
+    @Override
+    public String getHelpContext() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Context getActivityContext() {
+        return this;
+    }
+
+    @Override
+    public void attachConversationList(ConversationListFragment conversationList) {
+    }
+
+    @Override
+    public int getViewMode() {
+        return 0;
+    }
+
+    @Override
+    public void setViewModeListener(ModeChangeListener listener) {
+    }
+
+    @Override
+    public void unsetViewModeListener(ModeChangeListener listener) {
+    }
+
+    @Override
+    public ConversationListCallbacks getListHandler() {
+        return null;
+    }
+
+    @Override
+    public StarHandler getStarHandler() {
+        return null;
+    }
+
+    @Override
+    public void attachFolderList(FolderListFragment folderListFragment) {
+    }
+
+    @Override
+    public void attachConversationView(ConversationViewFragment conversationViewFragment) {
+    }
 }
diff --git a/src/com/android/mail/ui/FoldersSelectionDialog.java b/src/com/android/mail/ui/FoldersSelectionDialog.java
index 75f9604..1d40989 100644
--- a/src/com/android/mail/ui/FoldersSelectionDialog.java
+++ b/src/com/android/mail/ui/FoldersSelectionDialog.java
@@ -58,7 +58,7 @@
         // Mapping of a folder's uri to its checked state
         mCheckedState = new HashMap<String, Boolean>();
         AlertDialog.Builder builder = new AlertDialog.Builder(context);
-        builder.setTitle("Change folders");
+        builder.setTitle(R.string.folder_selection_dialog_title);
         builder.setPositiveButton(R.string.ok, this);
         builder.setNegativeButton(R.string.cancel, this);
         mSingle = !account
diff --git a/src/com/android/mail/ui/MailboxSelectionActivity.java b/src/com/android/mail/ui/MailboxSelectionActivity.java
index 09174d8..5c3bd46 100644
--- a/src/com/android/mail/ui/MailboxSelectionActivity.java
+++ b/src/com/android/mail/ui/MailboxSelectionActivity.java
@@ -20,32 +20,24 @@
 import com.android.mail.providers.AccountCacheProvider;
 import com.android.mail.providers.UIProvider;
 import com.android.mail.utils.LogUtils;
-import com.android.mail.utils.Utils;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 
 import android.app.ActionBar;
 import android.app.ListActivity;
 import android.appwidget.AppWidgetManager;
 import android.content.ContentResolver;
-import android.content.Context;
 import android.content.Intent;
 import android.database.Cursor;
-import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Handler;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.ListView;
-import android.widget.SimpleAdapter;
+import android.widget.SimpleCursorAdapter;
 import android.widget.TextView;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
 /**
  * An activity that shows the list of all the available accounts and return the
  * one selected in onResult().
@@ -64,7 +56,7 @@
     private final int[] VIEW_IDS = { R.id.mailbox_name };
     private boolean mCreateShortcut = false;
     private boolean mConfigureWidget = false;
-    private SimpleAdapter mAdapter;
+    private SimpleCursorAdapter mAdapter;
     private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
 
     // Boolean to indicate that we are waiting for the result from an add account
@@ -74,11 +66,11 @@
 
     // Can only do certain actions if the Activity is resumed (e.g. setVisible)
     private boolean mResumed = false;
+    private Handler mHandler = new Handler();
 
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-
         setContentView(R.layout.mailbox_selection_activity);
         if (icicle != null) {
             restoreState(icicle);
@@ -176,21 +168,12 @@
 
     private void setupWithAccounts() {
         final ContentResolver resolver = getContentResolver();
-        AsyncTask<Void, Void, Void> getAccounts = new AsyncTask<Void, Void, Void>() {
+        new AsyncTask<Void, Void, Void>() {
             @Override
             protected Void doInBackground(Void... params) {
                 Cursor cursor = resolver.query(AccountCacheProvider.getAccountsUri(),
                         UIProvider.ACCOUNTS_PROJECTION, null, null, null);
-                Account[] accounts = new Account[0];
-                if (cursor != null) {
-                    accounts = new Account[cursor.getCount()];
-                    int i = 0;
-                    while (cursor.moveToNext()) {
-                        accounts[i] = new Account(cursor);
-                        i++;
-                    }
-                }
-                completeSetupWithAccounts(accounts);
+                completeSetupWithAccounts(cursor);
                 return null;
             }
 
@@ -201,28 +184,23 @@
         // TODO: (mindyp) have the AccountCacheProvider cache accounts.
     }
 
-    private void completeSetupWithAccounts(Account[] accounts) {
+    private void completeSetupWithAccounts(final Cursor accounts) {
         // TODO: Cache the latest set of accounts
         // AccountCacheProvider.cacheAccountList(this, false /* synced */,
         // accounts);
-
-        // Populate the map
-        final List<Map<String, Object>> listData = Lists.newArrayList();
-        for (int i = 0; i < accounts.length; i++) {
-            Map<String, Object> m = Maps.newHashMap();
-            final String account = accounts[i].name;
-            m.put(ACCOUNT, account);
-
-            listData.add(m);
-        }
-        updateAccountList(listData);
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                updateAccountList(accounts);
+            }
+        });
     }
 
-    private void updateAccountList(final List<Map<String, Object>> accountData) {
+    private void updateAccountList(final Cursor accounts) {
         boolean displayAccountList = true;
         // Configuring a widget or shortcut.
         if (mConfigureWidget || mCreateShortcut) {
-            if (accountData.size() == 0) {
+            if (accounts == null || accounts.getCount() == 0) {
                 // No account found, show Add Account screen, for both the widget or
                 // shortcut creation process
                 // TODO: (mindyp) allow for adding of account.
@@ -232,10 +210,11 @@
                 // Indicate that we need to handle the response from the add account action
                 // This allows us to process the results that we get in the AddAccountCallback
                 mWaitingForAddAccountResult = true;
-            } else if (mConfigureWidget && accountData.size() == 1) {
+            } else if (mConfigureWidget && accounts.getCount() == 1) {
                 // When configuring a widget, if there is only one account, automatically
                 // choose that account.
-                selectAccount((String) accountData.get(0).get(ACCOUNT));
+                accounts.moveToFirst();
+                selectAccount(new Account(accounts));
                 // No reason to display the account list
                 displayAccountList = false;
             }
@@ -248,21 +227,13 @@
                 setVisible(true);
             }
 
-            mAdapter = new SimpleAdapter(
-                    this, accountData, R.layout.mailbox_item, COLUMN_NAMES, VIEW_IDS) {
+            mAdapter = new SimpleCursorAdapter(this, R.layout.mailbox_item, accounts,
+                    COLUMN_NAMES, VIEW_IDS, 0) {
                 @Override
                 public View getView(int position, View convertView, ViewGroup parent) {
                     View v = super.getView(position, convertView, parent);
                     TextView accountView = (TextView) v.findViewById(R.id.mailbox_name);
-
-                    Map<String, Object> data = accountData.get(position);
-                    String account = (String) data.get(ACCOUNT);
-                    accountView.setText(account);
-
-                    // Set the tag here so we can get the account name in
-                    // OnListItemClick()
-                    v.setTag(account);
-
+                    accountView.setText(new Account((Cursor) getItem(position)).name);
                     return v;
                 }
             };
@@ -272,13 +243,10 @@
 
     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
-        if (v != null) {
-            String selectedAccount = (String) v.getTag();
-            selectAccount(selectedAccount);
-        }
+        selectAccount(new Account((Cursor)mAdapter.getItem(position)));
     }
 
-    private void selectAccount(String account) {
+    private void selectAccount(Account account) {
         if (mCreateShortcut || mConfigureWidget) {
             // Invoked for a shortcut creation
             final Intent intent = new Intent(this, FolderSelectionActivity.class);
diff --git a/src/com/android/mail/widget/BaseWidgetProvider.java b/src/com/android/mail/widget/BaseWidgetProvider.java
index 3bd9d0c..167f80b 100644
--- a/src/com/android/mail/widget/BaseWidgetProvider.java
+++ b/src/com/android/mail/widget/BaseWidgetProvider.java
@@ -16,7 +16,6 @@
 
 package com.android.mail.widget;
 
-import com.android.mail.ConversationListContext;
 import com.android.mail.R;
 import com.android.mail.providers.Account;
 import com.android.mail.providers.AccountCacheProvider;
@@ -27,20 +26,15 @@
 import com.google.common.collect.Sets;
 import com.google.common.primitives.Ints;
 
-import android.accounts.AccountManager;
 import android.app.PendingIntent;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProvider;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
-import android.content.CursorLoader;
 import android.content.Intent;
-import android.content.Loader;
-import android.content.SharedPreferences.Editor;
 import android.database.Cursor;
 import android.net.Uri;
-import android.os.Bundle;
 import android.os.Parcel;
 import android.text.TextUtils;
 import android.view.View;
@@ -107,7 +101,6 @@
     @Override
     public void onReceive(Context context, Intent intent) {
         super.onReceive(context, intent);
-
         // Receive notification for a certain account.
         if (Utils.ACTION_NOTIFY_DATASET_CHANGED.equals(intent.getAction())) {
             final String accountToBeUpdated = intent.getExtras().getString(Utils.EXTRA_ACCOUNT);
@@ -146,7 +139,6 @@
     @Override
     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
         super.onUpdate(context, appWidgetManager, appWidgetIds);
-
         // Update each of the widgets with a remote adapter
         for (int i = 0; i < appWidgetIds.length; ++i) {
             // Get the account for this widget from preference
@@ -174,9 +166,8 @@
                 }
             }
             // account will be null the first time a widget is created. This is
-            // OK, as
-            // isAccountValid will return false, allowing the widget to be
-            // configured
+            // OK, as isAccountValid will return false, allowing the widget to
+            // be configured
             updateWidget(context, appWidgetIds[i], new Account(Parcel.obtain()),
                     new Folder(Parcel.obtain()));
         }
@@ -187,12 +178,14 @@
             Cursor accountCursor = context.getContentResolver().query(
                     AccountCacheProvider.getAccountsUri(), UIProvider.ACCOUNTS_PROJECTION, null,
                     null, null);
-            accountCursor.moveToFirst();
-            do {
-                if (account != null && account.equals(new Account(accountCursor)))
-                    return true;
-            } while (accountCursor.moveToNext());
-            return false;
+            if (accountCursor.moveToFirst()) {
+                Account newAccount = new Account(accountCursor);
+                do {
+                    if (account != null && newAccount != null
+                            && TextUtils.equals(account.name, newAccount.name))
+                        return true;
+                } while (accountCursor.moveToNext());
+            }
         }
         return false;
     }