Merge "Fix keyboard RTL navigation" into ub-gmail-ur14-dev
diff --git a/res/drawable-hdpi/ic_drawer_raw.png b/res/drawable-hdpi/ic_drawer.png
similarity index 100%
rename from res/drawable-hdpi/ic_drawer_raw.png
rename to res/drawable-hdpi/ic_drawer.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_drawer_raw.png b/res/drawable-mdpi/ic_drawer.png
similarity index 100%
rename from res/drawable-mdpi/ic_drawer_raw.png
rename to res/drawable-mdpi/ic_drawer.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_drawer_raw.png b/res/drawable-xhdpi/ic_drawer.png
similarity index 100%
rename from res/drawable-xhdpi/ic_drawer_raw.png
rename to res/drawable-xhdpi/ic_drawer.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_drawer_raw.png b/res/drawable-xxhdpi/ic_drawer.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_drawer_raw.png
rename to res/drawable-xxhdpi/ic_drawer.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_drawer_raw.png b/res/drawable-xxxhdpi/ic_drawer.png
similarity index 100%
rename from res/drawable-xxxhdpi/ic_drawer_raw.png
rename to res/drawable-xxxhdpi/ic_drawer.png
Binary files differ
diff --git a/res/drawable/ic_drawer.xml b/res/drawable/ic_drawer.xml
deleted file mode 100644
index d78f5f4..0000000
--- a/res/drawable/ic_drawer.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-     Copyright (C) 2014 Google Inc.
-     Licensed to The Android Open Source Project.
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_drawer_raw"
-        android:autoMirrored="true">
-</bitmap>
diff --git a/res/values/constants.xml b/res/values/constants.xml
index 6ca1297..5acb506 100644
--- a/res/values/constants.xml
+++ b/res/values/constants.xml
@@ -49,7 +49,7 @@
     <!-- The smallest amount of time the toast bar must remain visible -->
     <integer name="toast_bar_min_duration_ms">500</integer>
     <!-- The largest amount of time the toast bar can remain visible -->
-    <integer name="toast_bar_max_duration_ms">5000</integer>
+    <integer name="toast_bar_max_duration_ms">8000</integer>
     <integer name="conversation_desired_font_size_px">14</integer>
     <!-- matches 'font-size' style in template_conversation_upper.html -->
     <integer name="conversation_unstyled_font_size_px">13</integer>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d9986e5..25e4923 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -91,10 +91,6 @@
     <string name="attachment_permission_denied">Permission denied for the attachment.</string>
     <!-- Displayed for one second after trying to send with no recipients in To field [CHAR LIMIT=200]-->
     <string name="recipient_needed">Add at least one recipient.</string>
-    <!-- Title for recipient error dialog [CHAR LIMIT=200]-->
-    <string name="recipient_error_dialog_title">Recipient error</string>
-    <!-- Title for send confirmation dialog [CHAR LIMIT=200]-->
-    <string name="confirm_send_title">Send message?</string>
     <!-- Messages for send confirmation dialog [CHAR LIMIT=100]-->
     <string name="confirm_send_message_with_no_subject">There\'s no text in the message subject.</string>
     <string name="confirm_send_message_with_no_body">There\'s no text in the message body.</string>
@@ -225,12 +221,6 @@
     <string name="preview_attachment">Preview</string>
     <!-- Read email screen, button name. Save an attachment to sd card. [CHAR LIMIT=10] -->
     <string name="save_attachment">Save</string>
-    <!-- Read email screen, button name. Cancel a downloading attachment. [CHAR LIMIT=10] -->
-    <string name="cancel_attachment">Cancel</string>
-    <!-- Read email screen, button name. Open an attachment. [CHAR LIMIT=10] -->
-    <string name="open_attachment">Open</string>
-    <!-- Read email screen, button name. Install an attachment. [CHAR LIMIT=10] -->
-    <string name="install_attachment">Install</string>
     <!-- Read email screen, button name. Redownload an attachment [CHAR LIMIT=20]-->
     <string name="download_again">Download again</string>
     <!-- A supplemental option on attachments for apps to override. This string intentionally blank here. [CHAR LIMIT=20] -->
@@ -281,10 +271,6 @@
     <string name="contextmenu_map">Map</string>
     <!-- Menu item to share link  [CHAR LIMIT=50]-->
     <string name="contextmenu_sharelink">Share link</string>
-    <!-- Menu item that displays the help page for Gmail.  [CHAR LIMIT=50]-->
-    <string name="contextmenu_help">Help</string>
-    <!-- Solicit feedback string in about screen [CHAR LIMIT=50]-->
-    <string name="contextmenu_feedback">Send feedback</string>
 
     <!-- Browse list item strings -->
     <!-- Formatting string for the content description field of a conversation list item when device is in accessibility mode. [CHAR LIMIT=250] -->
@@ -469,12 +455,6 @@
     <plurals name="show_messages_read">
         <item quantity="other"><xliff:g id="count" example="4">%1$d</xliff:g> older messages</item>
     </plurals>
-    <!-- This string is used for accessibility purposes only. It is used when the user
-         taps on the collapsed block in collapsed mode when a conversation
-         has more than one read message. [CHAR LIMIT=UNLIMITED] -->
-    <plurals name="super_collapsed_loading_content_description">
-        <item quantity="other">Loading <xliff:g id="count" example="4">%1$d</xliff:g> older messages</item>
-    </plurals>
     <!-- Shown to display the from address of the message [CHAR LIMIT=10] -->
     <string name="from_heading">From:</string>
     <!-- Shown to display the reply to address of the message [CHAR LIMIT=20] -->
diff --git a/src/com/android/mail/providers/UIProvider.java b/src/com/android/mail/providers/UIProvider.java
index a280c55..b618804 100644
--- a/src/com/android/mail/providers/UIProvider.java
+++ b/src/com/android/mail/providers/UIProvider.java
@@ -104,6 +104,19 @@
         public static final int INTERNAL_ERROR = 5;
         /** The sync wasn't completed due to an error in the mail server */
         public static final int SERVER_ERROR = 6;
+
+        public static String toString(int result) {
+            switch (result) {
+                case SUCCESS: return "success";
+                case CONNECTION_ERROR: return "connection_error";
+                case AUTH_ERROR: return "auth_error";
+                case SECURITY_ERROR: return "security_error";
+                case STORAGE_ERROR: return "storage_error";
+                case INTERNAL_ERROR: return "internal_error";
+                case SERVER_ERROR: return "server_error";
+                default: throw new IllegalArgumentException("Invalid LastSyncResult: " + result);
+            }
+        }
     }
 
     // The actual content provider should define its own authority
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index b149898..dce5949 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -47,9 +47,9 @@
 import android.os.Parcelable;
 import android.os.SystemClock;
 import android.speech.RecognizerIntent;
-import android.support.v4.app.ActionBarDrawerToggle;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBarDrawerToggle;
 import android.view.Gravity;
 import android.view.KeyEvent;
 import android.view.Menu;
@@ -1288,8 +1288,8 @@
         mFloatingComposeButton.setOnClickListener(this);
 
         if (isDrawerEnabled()) {
-            mDrawerToggle = new ActionBarDrawerToggle(mActivity, mDrawerContainer, false,
-                    R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close);
+            mDrawerToggle = new ActionBarDrawerToggle(mActivity, mDrawerContainer,
+                    R.string.drawer_open, R.string.drawer_close);
             mDrawerContainer.setDrawerListener(mDrawerListener);
             mDrawerContainer.setDrawerShadow(
                     mContext.getResources().getDrawable(R.drawable.drawer_shadow), Gravity.START);
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index 6bc48a3..bf6895c 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -1126,7 +1126,8 @@
     };
 
     private void saveLastScrolledPosition() {
-        if (mListAdapter.getCursor() == null) {
+        if (mFolder == null || mFolder.conversationListUri == null ||
+                mListAdapter.getCursor() == null) {
             // If you save your scroll position in an empty list, you're gonna have a bad time
             return;
         }
diff --git a/src/com/android/mail/ui/FolderListFragment.java b/src/com/android/mail/ui/FolderListFragment.java
index 6f80819..af6d5de 100644
--- a/src/com/android/mail/ui/FolderListFragment.java
+++ b/src/com/android/mail/ui/FolderListFragment.java
@@ -208,7 +208,7 @@
     private boolean mMiniDrawerEnabled;
     private boolean mIsMinimized;
     protected MiniDrawerView mMiniDrawerView;
-    protected MiniDrawerAccountsAdapter mMiniDrawerAccountsAdapter;
+    private MiniDrawerAccountsAdapter mMiniDrawerAccountsAdapter;
     // use the same dimen as AccountItemView to participate in recycling
     // TODO: but Material account switcher doesn't recycle...
     private int mMiniDrawerAvatarDecodeSize;
@@ -313,9 +313,9 @@
         mContactResolver = new ContactResolver(getActivity().getContentResolver(),
                 mImagesCache);
 
-        setupMiniDrawerAccountsAdapter();
-        mMiniDrawerView.setController(this);
         if (mMiniDrawerEnabled) {
+            setupMiniDrawerAccountsAdapter();
+            mMiniDrawerView.setController(this);
             // set up initial state
             setMinimized(isMinimized());
         } else {
@@ -1690,56 +1690,49 @@
             final ImageView iv = convertView != null ? (ImageView) convertView :
                     (ImageView) LayoutInflater.from(getActivity()).inflate(
                     R.layout.mini_drawer_recent_account_item, parent, false /* attachToRoot */);
-            final FolderListFragment.MiniDrawerAccountItem
-                    item = createMiniDrawerAccountItem(iv);
+            final MiniDrawerAccountItem item = new MiniDrawerAccountItem(iv);
             item.setupDrawable();
             item.setAccount(mAccounts.get(position));
             iv.setTag(item);
             return iv;
         }
+
+        private class MiniDrawerAccountItem implements View.OnClickListener {
+            private Account mAccount;
+            private AccountAvatarDrawable mDrawable;
+            public final ImageView view;
+
+            public MiniDrawerAccountItem(ImageView iv) {
+                view = iv;
+                view.setOnClickListener(this);
+            }
+
+            public void setupDrawable() {
+                mDrawable = new AccountAvatarDrawable(getResources(), getBitmapCache(),
+                        getContactResolver());
+                mDrawable.setDecodeDimensions(mMiniDrawerAvatarDecodeSize,
+                        mMiniDrawerAvatarDecodeSize);
+                view.setImageDrawable(mDrawable);
+            }
+
+            public void setAccount(Account acct) {
+                mAccount = acct;
+                mDrawable.bind(mAccount.getSenderName(), mAccount.getEmailAddress());
+            }
+
+            @Override
+            public void onClick(View v) {
+                onAccountSelected(mAccount);
+            }
+        }
     }
 
     protected void setupMiniDrawerAccountsAdapter() {
         mMiniDrawerAccountsAdapter = new MiniDrawerAccountsAdapter();
     }
 
-    MiniDrawerAccountsAdapter getMiniDrawerAccountsAdapter() {
+    protected ListAdapter getMiniDrawerAccountsAdapter() {
         return mMiniDrawerAccountsAdapter;
     }
 
-    private MiniDrawerAccountItem createMiniDrawerAccountItem(ImageView iv) {
-        return new MiniDrawerAccountItem(iv);
-    }
-
-    private class MiniDrawerAccountItem implements View.OnClickListener {
-        private Account mAccount;
-        // FIXME: this codepath doesn't use GMS Core, resulting in inconsistent avatars
-        // vs. ownerslib. switch to a generic photo getter+listener interface on FLF
-        // so these drawables are obtainable regardless of how they are loaded.
-        private AccountAvatarDrawable mDrawable;
-        public final ImageView view;
-
-        public MiniDrawerAccountItem(ImageView iv) {
-            view = iv;
-            view.setOnClickListener(this);
-        }
-
-        public void setupDrawable() {
-            mDrawable = new AccountAvatarDrawable(getResources(), getBitmapCache(),
-                    getContactResolver());
-            mDrawable.setDecodeDimensions(mMiniDrawerAvatarDecodeSize, mMiniDrawerAvatarDecodeSize);
-            view.setImageDrawable(mDrawable);
-        }
-
-        public void setAccount(Account acct) {
-            mAccount = acct;
-            mDrawable.bind(mAccount.getSenderName(), mAccount.getEmailAddress());
-        }
-
-        @Override
-        public void onClick(View v) {
-            onAccountSelected(mAccount);
-        }
-    }
-
 }
diff --git a/src/com/android/mail/ui/settings/MailPreferenceActivity.java b/src/com/android/mail/ui/settings/MailPreferenceActivity.java
index 4af3300..57bb755 100644
--- a/src/com/android/mail/ui/settings/MailPreferenceActivity.java
+++ b/src/com/android/mail/ui/settings/MailPreferenceActivity.java
@@ -17,6 +17,7 @@
 
 package com.android.mail.ui.settings;
 
+import android.app.ActionBar;
 import android.app.Fragment;
 import android.app.LoaderManager.LoaderCallbacks;
 import android.content.CursorLoader;
@@ -50,6 +51,13 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        final ActionBar actionBar = getActionBar();
+        if (actionBar != null) {
+            // Hide the app icon.
+            actionBar.setIcon(android.R.color.transparent);
+            actionBar.setDisplayUseLogoEnabled(false);
+        }
+
         getLoaderManager().initLoader(ACCOUNT_LOADER_ID, null, new AccountLoaderCallbacks());
     }