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
This commit is contained in:
@@ -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<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 @@ 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);
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user