Merge "Import translations. DO NOT MERGE" into ub-contactsdialer-h-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1ef1bd5..f92d80f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -899,7 +899,7 @@
     <!-- Text shown in the contacts app while the background process updates contacts after a locale change [CHAR LIMIT=150]-->
     <string name="locale_change_in_progress">Contact list is being updated to reflect the change of language.\n\nPlease wait&#8230;</string>
 
-    <!-- The menu item to open the Google contacts assistant. [CHAR LIMIT=20]-->
+    <!-- Left drawer menu item to open contacts assistant cards. [CHAR LIMIT=20]-->
     <string name="menu_assistant">Assistant</string>
 
     <!-- The menu item to open the link/merge duplicates activity. [CHAR LIMIT=20]-->
diff --git a/src/com/android/contacts/common/Experiments.java b/src/com/android/contacts/common/Experiments.java
index 1b739ed..5de4d5d 100644
--- a/src/com/android/contacts/common/Experiments.java
+++ b/src/com/android/contacts/common/Experiments.java
@@ -26,6 +26,11 @@
     public static final String ASSISTANT = "Assistant__enable_assistant";
 
     /**
+     * Experiment to show the restore assistant on the assistants view.
+     */
+    public static final String ASSISTANT_RESTORE = "Assistant__restore";
+
+    /**
      * Whether to open contact sheet (aka smart profile) instead of our own QuickContact.
      */
     public static final String CONTACT_SHEET = "QuickContact__contact_sheet";
diff --git a/src/com/android/contacts/common/database/SimContactDao.java b/src/com/android/contacts/common/database/SimContactDao.java
index 9ce7970..a4846ad 100644
--- a/src/com/android/contacts/common/database/SimContactDao.java
+++ b/src/com/android/contacts/common/database/SimContactDao.java
@@ -105,6 +105,15 @@
         return mResolver.applyBatch(ContactsContract.AUTHORITY, ops);
     }
 
+    public void warmup() {
+        // We don't actually have to do any caching ourselves. Some other layer must do caching
+        // of the data (OS or framework) because subsequent queries are very fast.
+        final Cursor cursor = mResolver.query(ICC_CONTENT_URI, null, null, null, null);
+        if (cursor != null) {
+            cursor.close();
+        }
+    }
+
     private ArrayList<ContentProviderOperation> createImportOperations(List<SimContact> contacts,
             AccountWithDataSet targetAccount) {
         final ArrayList<ContentProviderOperation> ops = new ArrayList<>();
diff --git a/src/com/android/contacts/editor/PickRawContactDialogFragment.java b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
index 0f87d99..623d038 100644
--- a/src/com/android/contacts/editor/PickRawContactDialogFragment.java
+++ b/src/com/android/contacts/editor/PickRawContactDialogFragment.java
@@ -36,6 +36,10 @@
  * for the chosen raw contact.
  */
 public class PickRawContactDialogFragment extends DialogFragment {
+    private static final String ARGS_URI = "uri";
+    private static final String ARGS_MATERIAL_PALETTE = "materialPalette";
+    private static final String ARGS_IS_USER_PROFILE = "isUserProfile";
+
     /**
      * Used to list the account info for the given raw contacts list.
      */
@@ -147,10 +151,12 @@
     public static PickRawContactDialogFragment getInstance(Uri uri, Cursor cursor,
             MaterialPalette materialPalette, boolean isUserProfile) {
         final PickRawContactDialogFragment fragment = new PickRawContactDialogFragment();
-        fragment.setUri(uri);
+        final Bundle args = new Bundle();
+        args.putParcelable(ARGS_URI, uri);
+        args.putParcelable(ARGS_MATERIAL_PALETTE, materialPalette);
+        args.putBoolean(ARGS_IS_USER_PROFILE, isUserProfile);
+        fragment.setArguments(args);
         fragment.setCursor(cursor);
-        fragment.setMaterialPalette(materialPalette);
-        fragment.setIsUserProfile(isUserProfile);
         return fragment;
     }
 
@@ -180,8 +186,16 @@
         finishActivity();
     }
 
-    private void setUri(Uri uri) {
-        mUri = uri;
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Bundle args = getArguments();
+        if (args != null) {
+            mUri = args.getParcelable(ARGS_URI);
+            mMaterialPalette = args.getParcelable(ARGS_MATERIAL_PALETTE);
+            mIsUserProfile = args.getBoolean(ARGS_IS_USER_PROFILE);
+        }
     }
 
     public void setCursor(Cursor cursor) {
@@ -191,14 +205,6 @@
         mCursor = cursor;
     }
 
-    private void setMaterialPalette(MaterialPalette materialPalette) {
-        mMaterialPalette = materialPalette;
-    }
-
-    private void setIsUserProfile(boolean isUserProfile) {
-        mIsUserProfile = isUserProfile;
-    }
-
     private void finishActivity() {
         if (getActivity() != null && !getActivity().isFinishing()) {
             getActivity().finish();
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 488463d..518447c 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -114,6 +114,8 @@
      * Update views in the fragment when provider status is empty.
      */
     private void updateViewsForEmptyStatus() {
+        mMessageView.setText(R.string.noContacts);
+        mMessageView.setVisibility(View.VISIBLE);
         updateButtonVisibility(View.VISIBLE);
         mProgress.setVisibility(View.GONE);
     }
diff --git a/tests/src/com/android/contacts/RunMethodInstrumentation.java b/tests/src/com/android/contacts/RunMethodInstrumentation.java
index 11516b8..2eb6928 100644
--- a/tests/src/com/android/contacts/RunMethodInstrumentation.java
+++ b/tests/src/com/android/contacts/RunMethodInstrumentation.java
@@ -71,6 +71,14 @@
             return;
         }
 
+        // Wait for the Application to finish creating.
+        runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                Log.d(TAG, "acquired main thread from instrumentation");
+            }
+        });
+
         try {
             invokeMethod(args, className, methodName);
         } catch (Exception e) {