diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 64086cb9a33..e9b7f33992c 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -21,6 +21,8 @@ import static android.content.Intent.EXTRA_USER; 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 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { 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 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { 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 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 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { 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 059cb93d9d5..a1833f870bb 100644 --- a/src/com/android/settings/dashboard/SummaryLoader.java +++ b/src/com/android/settings/dashboard/SummaryLoader.java @@ -206,22 +206,6 @@ public class SummaryLoader { }); } - /** - * 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 ba97d255ee8..708485664b3 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -262,6 +262,20 @@ public class DashboardFeatureProviderImplTest { assertThat(preference.getSummary()).isEqualTo(ShadowTileUtils.MOCK_SUMMARY); } + @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); diff --git a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java index 9a5bef21fe8..236b18abdfa 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 @@ public class SummaryLoaderTest { 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); - } }