Merge "Also update the account preferences in displayPreference()." into oc-dev
diff --git a/res/layout/app_details.xml b/res/layout/app_details.xml
index c3ffe1a..2db23e4 100644
--- a/res/layout/app_details.xml
+++ b/res/layout/app_details.xml
@@ -85,6 +85,7 @@
                 android:singleLine="false"
                 android:ellipsize="marquee"
                 android:gravity="start"
+                android:textDirection="locale"
                 android:paddingTop="8dp"/>
 
             <TextView
diff --git a/res/layout/storage_summary_donut.xml b/res/layout/storage_summary_donut.xml
index 0266879..585fbf4 100644
--- a/res/layout/storage_summary_donut.xml
+++ b/res/layout/storage_summary_donut.xml
@@ -42,8 +42,7 @@
             android:layout_height="wrap_content"
             android:singleLine="true"
             android:textAlignment="viewStart"
-            android:textAppearance="@android:style/TextAppearance.Material.Subhead"
-            android:textColor="?android:attr/colorAccent"
+            android:textAppearance="@android:style/TextAppearance.Material.Display1"
             android:textSize="36sp" />
 
         <TextView
@@ -70,7 +69,7 @@
         android:id="@+id/donut"
         android:layout_width="112dp"
         android:layout_height="112dp"
-        android:layout_marginEnd="16dp"
+        android:layout_marginEnd="32dp"
         android:gravity="end|center_vertical"
         android:minWidth="58dp"
         android:paddingStart="?android:attr/listPreferredItemPaddingStart"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 83aefa0..8d5c400 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6600,8 +6600,8 @@
     <!-- [CHAR LIMIT=100] Notification Importance title: high importance level title -->
     <string name="notification_importance_high_title">Urgent</string>
 
-    <!-- [CHAR LIMIT=40] Notification importance title -->
-    <string name="allow_sound">Allow Sound</string>
+    <!-- [CHAR LIMIT=40 BACKUP_MESSAGE_ID:6585849855452076626] Notification importance title -->
+    <string name="allow_sound">Allow sound</string>
 
     <!-- [CHAR LIMIT=180] Notification importance summary -->
     <string name="show_silently_summary">Don\'t make sound, vibrate, or peek these notifications into view on the current screen.</string>
@@ -6760,11 +6760,8 @@
     <!-- [CHAR LIMIT=NONE] Channel notification settings: Block option description-->
     <string name="notification_content_block_summary">Never show notifications in the shade or on peripheral devices</string>
 
-    <!-- [CHAR LIMIT=NONE] Channel notification settings: Badging option title -->
-    <string name="notification_badge_title">Badge app icon</string>
-
-    <!-- [CHAR LIMIT=NONE] Channel notification settings: Badge option description-->
-    <string name="notification_badge_summary">Show notifications as badges on the Home app, if supported.</string>
+    <!-- [CHAR LIMIT=NONE] [BACKUP_MESSAGE_ID:7166470350070693657] Channel notification settings: Badging option title -->
+    <string name="notification_badge_title">Allow icon badge</string>
 
     <!-- [CHAR LIMIT=NONE] App notification settings: Override DND option title -->
     <string name="app_notification_override_dnd_title">Override Do Not Disturb</string>
diff --git a/res/xml/app_notification_settings.xml b/res/xml/app_notification_settings.xml
index bfb91ef..483b4a0 100644
--- a/res/xml/app_notification_settings.xml
+++ b/res/xml/app_notification_settings.xml
@@ -23,7 +23,6 @@
     <com.android.settingslib.RestrictedSwitchPreference
         android:key="badge"
         android:title="@string/notification_badge_title"
-        android:summary="@string/notification_badge_summary"
         settings:useAdditionalSummary="true"
         settings:restrictedSwitchSummary="@string/enabled_by_admin" />
 
diff --git a/res/xml/channel_notification_settings.xml b/res/xml/channel_notification_settings.xml
index 7e5045a..4cf171f 100644
--- a/res/xml/channel_notification_settings.xml
+++ b/res/xml/channel_notification_settings.xml
@@ -41,7 +41,6 @@
     <com.android.settingslib.RestrictedSwitchPreference
         android:key="badge"
         android:title="@string/notification_badge_title"
-        android:summary="@string/notification_badge_summary"
         settings:useAdditionalSummary="true"
         settings:restrictedSwitchSummary="@string/enabled_by_admin" />
 
diff --git a/res/xml/storage_profile_fragment.xml b/res/xml/storage_profile_fragment.xml
index 0485279..be269e5 100644
--- a/res/xml/storage_profile_fragment.xml
+++ b/res/xml/storage_profile_fragment.xml
@@ -35,15 +35,18 @@
         android:order="4" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_movies"
-        android:title="@string/storage_movies_tv" />
+        android:title="@string/storage_movies_tv"
+        android:icon="@drawable/ic_theaters_vd_theme_24"
+        android:order="5"
+    />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_other_apps"
         android:title="@string/storage_other_apps"
         android:icon="@drawable/ic_apps_vd_theme_24"
-        android:order="5" />
+        android:order="6" />
     <com.android.settings.deviceinfo.StorageItemPreference
         android:key="pref_files"
         android:title="@string/storage_files"
         android:icon="@drawable/ic_folder_vd_theme_24"
-        android:order="6" />
+        android:order="7" />
 </PreferenceScreen>
diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
index 4ce785a..f8df375 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -196,6 +196,7 @@
 
         PackageManager pm = mContext.getPackageManager();
         badgePreference(pm, userHandle, mPhotoPreference);
+        badgePreference(pm, userHandle, mMoviesPreference);
         badgePreference(pm, userHandle, mAudioPreference);
         badgePreference(pm, userHandle, mGamePreference);
         badgePreference(pm, userHandle, mAppPreference);
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 0cbfd54..7a2e4c0 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -28,7 +28,6 @@
 import android.support.annotation.VisibleForTesting;
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
-import android.text.TextUtils;
 import android.view.View;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -45,6 +44,7 @@
 import com.android.settings.enterprise.DevicePolicyManagerWrapper;
 import com.android.settings.enterprise.DevicePolicyManagerWrapperImpl;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 
 import java.util.ArrayList;
@@ -202,7 +202,11 @@
             mState.ensureIcon(mAppEntry);
             controller.setLabel(mAppEntry);
             controller.setIcon(mAppEntry);
-            controller.setSummary(getString(Utils.getInstallationStatus(mAppEntry.info)));
+            boolean isInstantApp = AppUtils.isInstant(mAppEntry.info);
+            CharSequence summary = isInstantApp
+                    ? null : getString(Utils.getInstallationStatus(mAppEntry.info));
+            controller.setIsInstantApp(AppUtils.isInstant(mAppEntry.info));
+            controller.setSummary(summary);
         }
 
         controller.done(context, true /* rebindActions */);
diff --git a/src/com/android/settings/search2/DatabaseIndexingManager.java b/src/com/android/settings/search2/DatabaseIndexingManager.java
index c627ea5..647219b 100644
--- a/src/com/android/settings/search2/DatabaseIndexingManager.java
+++ b/src/com/android/settings/search2/DatabaseIndexingManager.java
@@ -33,6 +33,7 @@
 import android.provider.SearchIndexableData;
 import android.provider.SearchIndexableResource;
 import android.provider.SearchIndexablesContract;
+import android.support.annotation.DrawableRes;
 import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
 import android.util.AttributeSet;
@@ -525,8 +526,6 @@
             final int count = cursor.getCount();
             if (count > 0) {
                 while (cursor.moveToNext()) {
-                    final int providerRank = cursor.getInt(COLUMN_INDEX_XML_RES_RANK);
-                    // TODO remove provider rank
                     final int xmlResId = cursor.getInt(COLUMN_INDEX_XML_RES_RESID);
 
                     final String className = cursor.getString(COLUMN_INDEX_XML_RES_CLASS_NAME);
@@ -720,7 +719,6 @@
             final AttributeSet attrs = Xml.asAttributeSet(parser);
 
             final String screenTitle = XmlParserUtils.getDataTitle(context, attrs);
-
             String key = XmlParserUtils.getDataKey(context, attrs);
 
             String title;
@@ -730,10 +728,11 @@
             String keywords;
             String headerKeywords;
             String childFragment;
+            @DrawableRes
+            int iconResId;
             ResultPayload payload;
             boolean enabled;
             final String fragmentName = sir.className;
-            final int iconResId = sir.iconResId;
             final int rank = sir.rank;
             final String intentAction = sir.intentAction;
             final String intentTargetPackage = sir.intentTargetPackage;
@@ -784,6 +783,7 @@
                 key = XmlParserUtils.getDataKey(context, attrs);
                 enabled = ! nonIndexableKeys.contains(key);
                 keywords = XmlParserUtils.getDataKeywords(context, attrs);
+                iconResId = XmlParserUtils.getDataIcon(context, attrs);
 
                 if (isHeaderUnique && TextUtils.equals(headerTitle, title)) {
                     isHeaderUnique = false;
@@ -853,7 +853,6 @@
             List<String> nonIndexableKeys) {
 
         final String className = sir.className;
-        final int iconResId = sir.iconResId;
         final int rank = sir.rank;
 
         if (provider == null) {
@@ -881,7 +880,7 @@
                         .setEntries(raw.entries)
                         .setClassName(className)
                         .setScreenTitle(raw.screenTitle)
-                        .setIconResId(iconResId)
+                        .setIconResId(raw.iconResId)
                         .setRank(rank)
                         .setIntentAction(raw.intentAction)
                         .setIntentTargetPackage(raw.intentTargetPackage)
@@ -907,7 +906,6 @@
                     continue;
                 }
 
-                item.iconResId = (item.iconResId == 0) ? iconResId : item.iconResId;
                 item.className = (TextUtils.isEmpty(item.className)) ? className : item.className;
 
                 indexFromResource(database, localeStr, item, nonIndexableKeys);
diff --git a/src/com/android/settings/search2/SearchViewHolder.java b/src/com/android/settings/search2/SearchViewHolder.java
index 67653e0..1175fcb 100644
--- a/src/com/android/settings/search2/SearchViewHolder.java
+++ b/src/com/android/settings/search2/SearchViewHolder.java
@@ -69,11 +69,9 @@
             AppSearchResult appResult = (AppSearchResult) result;
             PackageManager pm = fragment.getActivity().getPackageManager();
             iconView.setImageDrawable(appResult.info.loadIcon(pm));
-        } else if (result.icon != null) {
-            iconView.setImageDrawable(result.icon);
-            // TODO set color of icon
         } else {
-            iconView.setBackgroundResource(R.drawable.empty_icon);
+            // Valid even when result.icon is null.
+            iconView.setImageDrawable(result.icon);
         }
 
         bindBreadcrumbView(result);
diff --git a/src/com/android/settings/search2/XmlParserUtils.java b/src/com/android/settings/search2/XmlParserUtils.java
index 90b1c1f..17f1743 100644
--- a/src/com/android/settings/search2/XmlParserUtils.java
+++ b/src/com/android/settings/search2/XmlParserUtils.java
@@ -71,6 +71,14 @@
         return getData(context, attrs, R.styleable.Preference, R.styleable.Preference_keywords);
     }
 
+    public static int getDataIcon(Context context, AttributeSet attrs) {
+        final TypedArray ta = context.obtainStyledAttributes(attrs,
+                com.android.internal.R.styleable.Preference);
+        final int dataIcon = ta.getResourceId(com.android.internal.R.styleable.Icon_icon, 0);
+        ta.recycle();
+        return dataIcon;
+    }
+
     /**
      * Returns the fragment name if this preference launches a child fragment.
      */
@@ -80,17 +88,9 @@
     }
 
     private static String getData(Context context, AttributeSet set, int[] attrs, int resId) {
-        final TypedArray sa = context.obtainStyledAttributes(set, attrs);
-        final TypedValue tv = sa.peekValue(resId);
-
-        CharSequence data = null;
-        if (tv != null && tv.type == TypedValue.TYPE_STRING) {
-            if (tv.resourceId != 0) {
-                data = context.getText(tv.resourceId);
-            } else {
-                data = tv.string;
-            }
-        }
+        final TypedArray ta = context.obtainStyledAttributes(set, attrs);
+        String data = ta.getString(resId);
+        ta.recycle();
         return (data != null) ? data.toString() : null;
     }
 
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
index bc42d1f..e8057a6 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceControllerTest.java
@@ -298,6 +298,8 @@
     public void settingUserIdAppliesNewIcons() {
         StorageItemPreference audio = spy(new StorageItemPreference(mContext));
         audio.setIcon(R.drawable.ic_photo_library_vd_theme_24);
+        StorageItemPreference video = spy(new StorageItemPreference(mContext));
+        video.setIcon(R.drawable.ic_photo_library_vd_theme_24);
         StorageItemPreference image = spy(new StorageItemPreference(mContext));
         image.setIcon(R.drawable.ic_photo_library_vd_theme_24);
         StorageItemPreference games = spy(new StorageItemPreference(mContext));
@@ -312,6 +314,8 @@
         when(screen.findPreference(
                 eq(StorageItemPreferenceController.AUDIO_KEY))).thenReturn(audio);
         when(screen.findPreference(
+                eq(StorageItemPreferenceController.MOVIES_KEY))).thenReturn(video);
+        when(screen.findPreference(
                 eq(StorageItemPreferenceController.PHOTO_KEY))).thenReturn(image);
         when(screen.findPreference(
                 eq(StorageItemPreferenceController.GAME_KEY))).thenReturn(games);
@@ -326,6 +330,7 @@
         mController.setUserId(new UserHandle(10));
 
         verify(audio, times(2)).setIcon(any(Drawable.class));
+        verify(video, times(2)).setIcon(any(Drawable.class));
         verify(image, times(2)).setIcon(any(Drawable.class));
         verify(games, times(2)).setIcon(any(Drawable.class));
         verify(apps, times(2)).setIcon(any(Drawable.class));
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index d9934b1..69bd767 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyLong;
@@ -46,7 +47,9 @@
 import com.android.settings.applications.AppHeaderController;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.applications.instantapps.InstantAppDataProvider;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -58,7 +61,6 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.robolectric.RuntimeEnvironment;
-
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
@@ -175,11 +177,37 @@
 
     @Test
     public void testInitHeader_HasAppEntry_BuildByAppEntry() {
+        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+                new InstantAppDataProvider() {
+                    @Override
+                    public boolean isInstantApp(ApplicationInfo info) {
+                        return false;
+                    }
+                });
         mFragment.mAppEntry = mAppEntry;
         mFragment.initHeader();
 
         verify(mAppHeaderController).setIcon(mAppEntry);
         verify(mAppHeaderController).setLabel(mAppEntry);
+        verify(mAppHeaderController).setIsInstantApp(false);
+    }
+
+    @Test
+    public void testInitHeader_HasAppEntry_InstantApp() {
+        ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider",
+                new InstantAppDataProvider() {
+                    @Override
+                    public boolean isInstantApp(ApplicationInfo info) {
+                        return true;
+                    }
+                });
+        mFragment.mAppEntry = mAppEntry;
+        mFragment.initHeader();
+
+        verify(mAppHeaderController).setIcon(mAppEntry);
+        verify(mAppHeaderController).setLabel(mAppEntry);
+        verify(mAppHeaderController).setIsInstantApp(true);
+        verify(mAppHeaderController).setSummary((CharSequence) null);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java
index cc7e4ec..51cd484 100644
--- a/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java
+++ b/tests/robotests/src/com/android/settings/search/IntentSearchViewHolderTest.java
@@ -82,7 +82,7 @@
     }
 
     @Test
-    public void testConstructor_MembersNotNull() {
+    public void testConstructor_membersNotNull() {
         assertThat(mHolder.titleView).isNotNull();
         assertThat(mHolder.summaryView).isNotNull();
         assertThat(mHolder.iconView).isNotNull();
@@ -90,8 +90,8 @@
     }
 
     @Test
-    public void testBindViewElements_AllUpdated() {
-        SearchResult result = getSearchResult();
+    public void testBindViewElements_allUpdated() {
+        SearchResult result = getSearchResult(TITLE, SUMMARY, mIcon);
         mHolder.onBind(mFragment, result);
         mHolder.itemView.performClick();
 
@@ -110,6 +110,14 @@
     }
 
     @Test
+    public void testBindViewIcon_nullIcon_imageDrawableIsNull() {
+        final SearchResult result = getSearchResult(TITLE, SUMMARY, null);
+        mHolder.onBind(mFragment, result);
+
+        assertThat(mHolder.iconView.getDrawable()).isNull();
+    }
+
+    @Test
     public void testBindViewElements_emptySummary_hideSummaryView() {
         final SearchResult result = new Builder()
                 .addTitle(TITLE)
@@ -155,15 +163,15 @@
         assertThat(mHolder.summaryView.getVisibility()).isEqualTo(View.GONE);
     }
 
-    private SearchResult getSearchResult() {
+    private SearchResult getSearchResult(String title, String summary, Drawable icon) {
         Builder builder = new Builder();
-        builder.addTitle(TITLE)
-                .addSummary(SUMMARY)
+        builder.addTitle(title)
+                .addSummary(summary)
                 .addRank(1)
                 .addPayload(new IntentPayload(
                         new Intent().setComponent(new ComponentName("pkg", "class"))))
                 .addBreadcrumbs(new ArrayList<>())
-                .addIcon(mIcon);
+                .addIcon(icon);
 
         return builder.build();
     }
diff --git a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
index 0a8326d..b76feff1 100644
--- a/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
+++ b/tests/robotests/src/com/android/settings/search2/DatabaseIndexingManagerTest.java
@@ -99,6 +99,7 @@
     private final String screenTitle = "screen title";
     private final String className = "class name";
     private final int iconResId = 0xff;
+    private final int noIcon = 0;
     private final String action = "action";
     private final String targetPackage = "target package";
     private final String targetClass = "target class";
@@ -388,7 +389,7 @@
         // Class Name
         assertThat(cursor.getString(11)).isEqualTo(className);
         // Icon
-        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
+        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
         // Intent Action
         assertThat(cursor.getString(13)).isEqualTo(action);
         // Target Package
@@ -442,7 +443,7 @@
         // Class Name
         assertThat(cursor.getString(11)).isEqualTo(className);
         // Icon
-        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
+        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
         // Intent Action
         assertThat(cursor.getString(13)).isEqualTo(action);
         // Target Package
@@ -496,7 +497,7 @@
         // Class Name
         assertThat(cursor.getString(11)).isEqualTo(className);
         // Icon
-        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
+        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
         // Intent Action
         assertThat(cursor.getString(13)).isEqualTo(action);
         // Target Package
@@ -515,6 +516,18 @@
         assertThat(cursor.getBlob(20)).isNull();
     }
 
+    @Test
+    public void testAddResource_iconAddedFromXml() {
+        SearchIndexableResource resource = getFakeResource(R.xml.connected_devices);
+        mManager.indexOneSearchIndexableData(mDb, localeStr, resource, new HashMap<>());
+
+        Cursor cursor = mDb.rawQuery("SELECT * FROM prefs_index ORDER BY data_title", null);
+        cursor.moveToPosition(0);
+
+        // Icon
+        assertThat(cursor.getInt(12)).isNotEqualTo(noIcon);
+    }
+
     // Tests for the flow: IndexOneResource -> IndexFromProvider -> IndexFromResource ->
     //                     UpdateOneRowWithFilteredData -> UpdateOneRow
 
@@ -565,7 +578,7 @@
         assertThat(cursor.getString(11))
                 .isEqualTo("com.android.settings.display.ScreenZoomSettings");
         // Icon
-        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
+        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
         // Intent Action
         assertThat(cursor.getString(13)).isNull();
         // Target Package
@@ -630,7 +643,7 @@
         assertThat(cursor.getString(11))
                 .isEqualTo("com.android.settings.display.ScreenZoomSettings");
         // Icon
-        assertThat(cursor.getInt(12)).isEqualTo(iconResId);
+        assertThat(cursor.getInt(12)).isEqualTo(noIcon);
         // Intent Action
         assertThat(cursor.getString(13)).isNull();
         // Target Package