Load preference title from uri if available

For injected tiles, allow clients to provide dynamic title from
contentproviders similar to dynamic summary.

Fixes: 131837802
Test: robotests
Change-Id: Iacc80db5d003473cf59ede67d88441947a834888
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 64086cb..e9b7f33 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -21,6 +21,8 @@
 import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_URI;
 import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
 import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY_URI;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
+import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE_URI;
 
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
@@ -108,12 +110,12 @@
         if (pref == null) {
             return;
         }
-        pref.setTitle(tile.getTitle(activity.getApplicationContext()));
         if (!TextUtils.isEmpty(key)) {
             pref.setKey(key);
         } else {
             pref.setKey(getDashboardKeyForTile(tile));
         }
+        bindTitle(pref, tile);
         bindSummary(pref, tile);
         bindIcon(pref, tile, forceRoundedIcon);
         final Bundle metadata = tile.getMetaData();
@@ -168,6 +170,28 @@
         launchIntentOrSelectProfile(activity, tile, intent, SettingsEnums.DASHBOARD_SUMMARY);
     }
 
+    private void bindTitle(Preference preference, Tile tile) {
+        final CharSequence title = tile.getTitle(mContext.getApplicationContext());
+        if (title != null) {
+            preference.setTitle(title);
+            return;
+        }
+        if (tile.getMetaData() != null && tile.getMetaData().containsKey(
+                META_DATA_PREFERENCE_TITLE_URI)) {
+            // Set a placeholder title before starting to fetch real title, this is necessary
+            // to avoid preference height change.
+            preference.setTitle(R.string.summary_placeholder);
+
+            ThreadUtils.postOnBackgroundThread(() -> {
+                final Map<String, IContentProvider> providerMap = new ArrayMap<>();
+                final String uri = tile.getMetaData().getString(META_DATA_PREFERENCE_TITLE_URI);
+                final String titleFromUri = TileUtils.getTextFromUri(
+                        mContext, uri, providerMap, META_DATA_PREFERENCE_TITLE);
+                ThreadUtils.postOnMainThread(() -> preference.setTitle(titleFromUri));
+            });
+        }
+    }
+
     private void bindSummary(Preference preference, Tile tile) {
         final CharSequence summary = tile.getSummary(mContext);
         if (summary != null) {
@@ -247,7 +271,7 @@
             final UserHandle userHandle = intent.getParcelableExtra(EXTRA_USER);
             if (userHandle != null && tile.userHandle.contains(userHandle)) {
                 mMetricsFeatureProvider.logDashboardStartIntent(
-                    mContext, intent, sourceMetricCategory);
+                        mContext, intent, sourceMetricCategory);
                 activity.startActivityForResultAsUser(intent, 0, userHandle);
             } else {
                 ProfileSelectDialog.show(activity.getSupportFragmentManager(), tile);
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index 059cb93..a1833f8 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -206,22 +206,6 @@
         });
     }
 
-    /**
-     * Updates all tile's summary to latest cached version. This is necessary to handle the case
-     * where category is updated after summary change.
-     */
-    public void updateSummaryToCache(DashboardCategory category) {
-        if (category == null) {
-            return;
-        }
-        for (Tile tile : category.getTiles()) {
-            final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
-            if (mSummaryTextMap.containsKey(key)) {
-                tile.overrideSummary(mSummaryTextMap.get(key));
-            }
-        }
-    }
-
     private synchronized void setListeningW(boolean listening) {
         if (mWorkerListening == listening) {
             return;
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index ba97d25..7084856 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -263,6 +263,20 @@
     }
 
     @Test
+    @Config(shadows = {ShadowTileUtils.class})
+    public void bindPreference_hasTitleUri_shouldLoadFromContentProvider() {
+        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+        mActivityInfo.metaData.putString(TileUtils.META_DATA_PREFERENCE_TITLE_URI,
+                "content://com.android.settings/tile_title");
+
+        mImpl.bindPreferenceToTile(mActivity, mForceRoundedIcon, MetricsEvent.VIEW_UNKNOWN,
+                preference, tile, null /*key */, Preference.DEFAULT_ORDER);
+
+        assertThat(preference.getTitle()).isEqualTo(ShadowTileUtils.MOCK_SUMMARY);
+    }
+
+    @Test
     public void bindPreference_withNullKeyTileKey_shouldUseTileKey() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
         mActivityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "key");
diff --git a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java
index 9a5bef2..236b18a 100644
--- a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java
@@ -16,21 +16,16 @@
 
 package com.android.settings.dashboard;
 
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT;
-
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
 
 import android.app.Activity;
 import android.content.Context;
 import android.content.pm.ActivityInfo;
-import android.os.Bundle;
 
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settingslib.drawer.CategoryKey;
-import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 
 import org.junit.Before;
@@ -89,26 +84,4 @@
 
         assertThat(mCallbackInvoked).isTrue();
     }
-
-    @Test
-    public void testUpdateSummaryToCache_hasCache_shouldUpdate() {
-        final String testSummary = "test_summary";
-        final DashboardCategory category = new DashboardCategory(CategoryKey.CATEGORY_HOMEPAGE);
-        final ActivityInfo activityInfo = new ActivityInfo();
-        activityInfo.packageName = "pkg";
-        activityInfo.name = "cls";
-        activityInfo.metaData = new Bundle();
-        activityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "123");
-        final Tile tile = new Tile(activityInfo, category.key);
-
-        category.addTile(tile);
-        when(mFeatureFactory.dashboardFeatureProvider.getDashboardKeyForTile(tile))
-                .thenReturn(tile.getKey(RuntimeEnvironment.application));
-
-        mSummaryLoader.updateSummaryIfNeeded(mContext, tile, testSummary);
-        tile.overrideSummary(null);
-        mSummaryLoader.updateSummaryToCache(category);
-
-        assertThat(tile.getSummary(mContext)).isEqualTo(testSummary);
-    }
 }