Merge "Fix injected settings titles not matching a locale change." into oc-dev
am: 1b54760eee

Change-Id: Icdeb7d2e65a0c6061b773765cb6470684d24c5b2
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
index f31c09b..6bcf256 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java
@@ -135,10 +135,18 @@
      * Name of the meta-data item that should be set in the AndroidManifest.xml
      * to specify the title that should be displayed for the preference.
      */
+    @Deprecated
     public static final String META_DATA_PREFERENCE_TITLE = "com.android.settings.title";
 
     /**
      * Name of the meta-data item that should be set in the AndroidManifest.xml
+     * to specify the title that should be displayed for the preference.
+     */
+    public static final String META_DATA_PREFERENCE_TITLE_RES_ID =
+            "com.android.settings.title.resid";
+
+    /**
+     * Name of the meta-data item that should be set in the AndroidManifest.xml
      * to specify the summary text that should be displayed for the preference.
      */
     public static final String META_DATA_PREFERENCE_SUMMARY = "com.android.settings.summary";
@@ -364,7 +372,16 @@
                     if (metaData.containsKey(META_DATA_PREFERENCE_ICON)) {
                         icon = metaData.getInt(META_DATA_PREFERENCE_ICON);
                     }
-                    if (metaData.containsKey(META_DATA_PREFERENCE_TITLE)) {
+                    int resId = 0;
+                    if (metaData.containsKey(META_DATA_PREFERENCE_TITLE_RES_ID)) {
+                        resId = metaData.getInt(META_DATA_PREFERENCE_TITLE_RES_ID);
+                        if (resId != 0) {
+                            title = res.getString(resId);
+                        }
+                    }
+                    // Fallback to legacy title extraction if we couldn't get the title through
+                    // res id.
+                    if ((resId == 0) && metaData.containsKey(META_DATA_PREFERENCE_TITLE)) {
                         if (metaData.get(META_DATA_PREFERENCE_TITLE) instanceof Integer) {
                             title = res.getString(metaData.getInt(META_DATA_PREFERENCE_TITLE));
                         } else {
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
index 2d3c4a7..5310b7a 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java
@@ -231,6 +231,51 @@
     }
 
     @Test
+    public void getTilesForIntent_shouldReadMetadataTitleAsString() throws RemoteException {
+        Intent intent = new Intent();
+        Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
+        List<Tile> outTiles = new ArrayList<>();
+        List<ResolveInfo> info = new ArrayList<>();
+        ResolveInfo resolveInfo = newInfo(true, null /* category */, null, URI_GET_ICON,
+                URI_GET_SUMMARY, "my title", 0);
+        info.add(resolveInfo);
+
+        when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
+                .thenReturn(info);
+
+        TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
+                null /* defaultCategory */, outTiles, false /* usePriority */,
+                false /* checkCategory */);
+
+        assertThat(outTiles.size()).isEqualTo(1);
+        assertThat(outTiles.get(0).title).isEqualTo("my title");
+    }
+
+    @Test
+    public void getTilesForIntent_shouldReadMetadataTitleFromResource() throws RemoteException {
+        Intent intent = new Intent();
+        Map<Pair<String, String>, Tile> addedCache = new ArrayMap<>();
+        List<Tile> outTiles = new ArrayList<>();
+        List<ResolveInfo> info = new ArrayList<>();
+        ResolveInfo resolveInfo = newInfo(true, null /* category */, null, URI_GET_ICON,
+                URI_GET_SUMMARY, null, 123);
+        info.add(resolveInfo);
+
+        when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt()))
+                .thenReturn(info);
+
+        when(mResources.getString(eq(123)))
+                .thenReturn("my localized title");
+
+        TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache,
+                null /* defaultCategory */, outTiles, false /* usePriority */,
+                false /* checkCategory */);
+
+        assertThat(outTiles.size()).isEqualTo(1);
+        assertThat(outTiles.get(0).title).isEqualTo("my localized title");
+    }
+
+    @Test
     public void getTilesForIntent_shouldNotProcessInvalidUriContentSystemApp()
             throws RemoteException {
         Intent intent = new Intent();
@@ -298,7 +343,13 @@
     }
 
     private static ResolveInfo newInfo(boolean systemApp, String category, String keyHint,
-        String iconUri, String summaryUri) {
+            String iconUri, String summaryUri) {
+        return newInfo(systemApp, category, keyHint, iconUri, summaryUri, null, 0);
+    }
+
+    private static ResolveInfo newInfo(boolean systemApp, String category, String keyHint,
+            String iconUri, String summaryUri, String title, int titleResId) {
+
         ResolveInfo info = new ResolveInfo();
         info.system = systemApp;
         info.activityInfo = new ActivityInfo();
@@ -317,6 +368,13 @@
         if (summaryUri != null) {
             info.activityInfo.metaData.putString("com.android.settings.summary_uri", summaryUri);
         }
+        if (title != null) {
+            info.activityInfo.metaData.putString(TileUtils.META_DATA_PREFERENCE_TITLE, title);
+        }
+        if (titleResId != 0) {
+            info.activityInfo.metaData.putInt(
+                    TileUtils.META_DATA_PREFERENCE_TITLE_RES_ID, titleResId);
+        }
         info.activityInfo.applicationInfo = new ApplicationInfo();
         if (systemApp) {
             info.activityInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;