diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java index 488396f2a7c..5a8df911373 100644 --- a/src/com/android/settings/dashboard/DashboardAdapter.java +++ b/src/com/android/settings/dashboard/DashboardAdapter.java @@ -355,9 +355,10 @@ public class DashboardAdapter extends RecyclerView.Adapter * First, try to find the exact identical instance of the tile object, if not found, - * then try to find a tile has the same title. + * then try to find a tile has the same id. * * @param tile tile that need to be found * @return position of the object, return INDEX_NOT_FOUND if object isn't in the list @@ -158,7 +157,7 @@ public class DashboardData { final Object entity = mItems.get(i).entity; if (entity == tile) { return i; - } else if (entity instanceof Tile && tile.title.equals(((Tile) entity).title)) { + } else if (entity instanceof Tile && tile.getId() == ((Tile) entity).getId()) { return i; } } @@ -227,7 +226,7 @@ public class DashboardData { final List tiles = mCategory.getTiles(); for (int i = 0; i < tiles.size(); i++) { final Tile tile = tiles.get(i); - addToItemList(tile, R.layout.dashboard_tile, Objects.hash(tile.title), + addToItemList(tile, R.layout.dashboard_tile, tile.getId(), true /* add */); } } @@ -425,9 +424,11 @@ public class DashboardData { final Tile localTile = (Tile) entity; final Tile targetTile = (Tile) targetItem.entity; - // Only check title and summary for dashboard tile - return TextUtils.equals(localTile.title, targetTile.title) - && TextUtils.equals(localTile.summary, targetTile.summary); + // Only check id and summary for dashboard tile + return localTile.getId() == targetTile.getId() + && TextUtils.equals( + localTile.getSummaryReference(), + targetTile.getSummaryReference()); case TYPE_SUGGESTION_CONTAINER: case TYPE_CONDITION_CONTAINER: // Fall through to default diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 7c6593628ad..3c0a65d30f0 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -106,7 +106,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { if (pref == null) { return; } - pref.setTitle(tile.title); + pref.setTitle(tile.getTitle(activity.getApplicationContext())); if (!TextUtils.isEmpty(key)) { pref.setKey(key); } else { @@ -172,8 +172,9 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { } private void bindSummary(Preference preference, Tile tile) { - if (tile.summary != null) { - preference.setSummary(tile.summary); + final CharSequence summary = tile.getSummary(mContext); + if (summary != null) { + preference.setSummary(summary); } else if (tile.getMetaData() != null && tile.getMetaData().containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) { // Set a placeholder summary before starting to fetch real summary, this is necessary @@ -183,9 +184,9 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { ThreadUtils.postOnBackgroundThread(() -> { final Map providerMap = new ArrayMap<>(); final String uri = tile.getMetaData().getString(META_DATA_PREFERENCE_SUMMARY_URI); - final String summary = TileUtils.getTextFromUri( + final String summaryFromUri = TileUtils.getTextFromUri( mContext, uri, providerMap, META_DATA_PREFERENCE_SUMMARY); - ThreadUtils.postOnMainThread(() -> preference.setSummary(summary)); + ThreadUtils.postOnMainThread(() -> preference.setSummary(summaryFromUri)); }); } else { preference.setSummary(R.string.summary_placeholder); diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index a90950e5521..9f0acaa3486 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -156,12 +156,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile); final Preference pref = getPreferenceScreen().findPreference(key); if (pref == null) { - Log.d(getLogTag(), - String.format("Can't find pref by key %s, skipping update summary %s/%s", - key, tile.title, tile.summary)); + Log.d(getLogTag(), String.format( + "Can't find pref by key %s, skipping update summary %s", + key, tile.getDescription())); return; } - pref.setSummary(tile.summary); + pref.setSummary(tile.getSummary(pref.getContext())); } @Override diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java index 199331d5b21..cfb64efdeb0 100644 --- a/src/com/android/settings/dashboard/SummaryLoader.java +++ b/src/com/android/settings/dashboard/SummaryLoader.java @@ -18,6 +18,7 @@ package com.android.settings.dashboard; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; @@ -96,29 +97,30 @@ public class SummaryLoader { return; } if (DEBUG) { - Log.d(TAG, "setSummary " + tile.title + " - " + summary); + Log.d(TAG, "setSummary " + tile.getDescription() + " - " + summary); } - updateSummaryIfNeeded(tile, summary); + updateSummaryIfNeeded(mActivity.getApplicationContext(), tile, summary); }); } @VisibleForTesting - void updateSummaryIfNeeded(Tile tile, CharSequence summary) { - if (TextUtils.equals(tile.summary, summary)) { + void updateSummaryIfNeeded(Context context, Tile tile, CharSequence summary) { + if (TextUtils.equals(tile.getSummary(context), summary)) { if (DEBUG) { - Log.d(TAG, "Summary doesn't change, skipping summary update for " + tile.title); + Log.d(TAG, "Summary doesn't change, skipping summary update for " + + tile.getDescription()); } return; } mSummaryTextMap.put(mDashboardFeatureProvider.getDashboardKeyForTile(tile), summary); - tile.summary = summary; + tile.overrideSummary(summary); if (mSummaryConsumer != null) { mSummaryConsumer.notifySummaryChanged(tile); } else { if (DEBUG) { Log.d(TAG, "SummaryConsumer is null, skipping summary update for " - + tile.title); + + tile.getDescription()); } } } @@ -215,7 +217,7 @@ public class SummaryLoader { for (Tile tile : category.getTiles()) { final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile); if (mSummaryTextMap.containsKey(key)) { - tile.summary = mSummaryTextMap.get(key); + tile.overrideSummary(mSummaryTextMap.get(key)); } } } diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java index eca9f862b30..f2fb1219094 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java @@ -16,6 +16,7 @@ package com.android.settings.accounts; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; import static com.google.common.truth.Truth.assertThat; @@ -65,7 +66,7 @@ public class AccountDetailDashboardFragmentTest { public void setUp() { mContext = RuntimeEnvironment.application; mActivityInfo = new ActivityInfo(); - mActivityInfo.packageName = "pkg"; + mActivityInfo.packageName = mContext.getPackageName(); mActivityInfo.name = "clazz"; mActivityInfo.metaData = new Bundle(); @@ -123,6 +124,7 @@ public class AccountDetailDashboardFragmentTest { mActivityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "key"); mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT); mActivityInfo.metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc"); + mActivityInfo.metaData.putString(META_DATA_PREFERENCE_TITLE, "summary"); mActivityInfo.metaData.putString("com.android.settings.intent.action", Intent.ACTION_ASSIST); tile.userHandle = null; diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java index a73f4a8700e..58a5cc9dc6f 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.dashboard; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -95,6 +97,7 @@ public class DashboardAdapterTest { mActivityInfo.packageName = "pkg"; mActivityInfo.name = "class"; mActivityInfo.metaData = new Bundle(); + mActivityInfo.metaData.putString(META_DATA_PREFERENCE_TITLE, "test-title"); when(mContext.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager); when(mContext.getResources()).thenReturn(mResources); diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java index d92cceb62a8..406cb3cd1df 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java @@ -49,13 +49,12 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; @RunWith(SettingsRobolectricTestRunner.class) public class DashboardDataTest { private static final String TEST_SUGGESTION_TITLE = "Use fingerprint"; - private static final String TEST_CATEGORY_TILE_TITLE = "Display"; + private static final int TEST_TILE_ID = 12345; private DashboardData mDashboardDataWithOneConditions; private DashboardData mDashboardDataWithTwoConditions; @@ -95,7 +94,7 @@ public class DashboardDataTest { twoItemsConditions.add(mSecondCondition); // Build category - mTestCategoryTile.title = TEST_CATEGORY_TILE_TITLE; + when(mTestCategoryTile.getId()).thenReturn(TEST_TILE_ID); mDashboardCategory.addTile(mTestCategoryTile); @@ -132,7 +131,7 @@ public class DashboardDataTest { assertThat(items.get(1).id).isEqualTo(STABLE_ID_SUGGESTION_CONDITION_DIVIDER); assertThat(items.get(2).id).isEqualTo(STABLE_ID_CONDITION_CONTAINER); assertThat(items.get(3).id).isEqualTo(STABLE_ID_CONDITION_FOOTER); - assertThat(items.get(4).id).isEqualTo(Objects.hash(mTestCategoryTile.title)); + assertThat(items.get(4).id).isEqualTo(TEST_TILE_ID); } @Test @@ -185,15 +184,17 @@ public class DashboardDataTest { @Test public void testGetPositionByTile_equalTitle_returnPositionFound() { final Tile tile = mock(Tile.class); - tile.title = TEST_CATEGORY_TILE_TITLE; + when(tile.getId()).thenReturn(TEST_TILE_ID); + final int position = mDashboardDataWithOneConditions.getPositionByTile(tile); + assertThat(position).isNotEqualTo(DashboardData.POSITION_NOT_FOUND); } @Test public void testGetPositionByTile_notExisted_returnNotFound() { final Tile tile = mock(Tile.class); - tile.title = ""; + when(tile.getId()).thenReturn(123); final int position = mDashboardDataWithOneConditions.getPositionByTile(tile); assertThat(position).isEqualTo(DashboardData.POSITION_NOT_FOUND); } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 22c589c8fd6..d49e4fbb057 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -19,6 +19,8 @@ package com.android.settings.dashboard; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_ORDER; import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE; import static com.android.settingslib.drawer.TileUtils.PROFILE_ALL; import static com.android.settingslib.drawer.TileUtils.PROFILE_PRIMARY; @@ -99,11 +101,15 @@ public class DashboardFeatureProviderImplTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + doReturn(RuntimeEnvironment.application).when(mActivity).getApplicationContext(); mForceRoundedIcon = false; mActivityInfo = new ActivityInfo(); - mActivityInfo.packageName = "pkg"; + mActivityInfo.packageName = mContext.getPackageName(); mActivityInfo.name = "class"; mActivityInfo.metaData = new Bundle(); + mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_TITLE, R.string.settings_label); + mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_SUMMARY, + R.string.about_settings_summary); doReturn(mPackageManager).when(mContext).getPackageManager(); when(mPackageManager.resolveActivity(any(Intent.class), anyInt())) .thenReturn(new ResolveInfo()); @@ -121,16 +127,15 @@ public class DashboardFeatureProviderImplTest { final Preference preference = new Preference(RuntimeEnvironment.application); final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE)); mActivityInfo.metaData.putInt(META_DATA_KEY_ORDER, 10); - tile.title = "title"; - tile.summary = "summary"; doReturn(Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565))) .when(tile).getIcon(any(Context.class)); mActivityInfo.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI"); mImpl.bindPreferenceToTile(mActivity, mForceRoundedIcon, MetricsEvent.SETTINGS_GESTURES, preference, tile, "123", Preference.DEFAULT_ORDER); - assertThat(preference.getTitle()).isEqualTo(tile.title); - assertThat(preference.getSummary()).isEqualTo(tile.summary); + assertThat(preference.getTitle()).isEqualTo(mContext.getText(R.string.settings_label)); + assertThat(preference.getSummary()) + .isEqualTo(mContext.getText(R.string.about_settings_summary)); assertThat(preference.getIcon()).isNotNull(); assertThat(preference.getFragment()).isEqualTo( mActivityInfo.metaData.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS)); @@ -159,9 +164,6 @@ public class DashboardFeatureProviderImplTest { tile.userHandle.add(mock(UserHandle.class)); tile.userHandle.add(mock(UserHandle.class)); - when(mActivity.getApplicationContext().getSystemService(Context.USER_SERVICE)) - .thenReturn(mUserManager); - mImpl.bindPreferenceToTile(mActivity, mForceRoundedIcon, MetricsEvent.SETTINGS_GESTURES, preference, tile, "123", Preference.DEFAULT_ORDER); preference.getOnPreferenceClickListener().onPreferenceClick(null); @@ -199,11 +201,6 @@ public class DashboardFeatureProviderImplTest { tile.userHandle = new ArrayList<>(); tile.userHandle.add(mock(UserHandle.class)); - when(mActivity.getSystemService(Context.USER_SERVICE)) - .thenReturn(mUserManager); - when(mActivity.getApplicationContext().getPackageName()) - .thenReturn(RuntimeEnvironment.application.getPackageName()); - mImpl.bindPreferenceToTile(mActivity, mForceRoundedIcon, MetricsEvent.SETTINGS_GESTURES, preference, tile, "123", Preference.DEFAULT_ORDER); preference.getOnPreferenceClickListener().onPreferenceClick(null); @@ -238,7 +235,10 @@ public class DashboardFeatureProviderImplTest { @Test public void bindPreference_noSummary_shouldSetSummaryToPlaceholder() { final Preference preference = new Preference(RuntimeEnvironment.application); + mActivityInfo.metaData.remove(META_DATA_PREFERENCE_SUMMARY); + final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); + mImpl.bindPreferenceToTile(mActivity, mForceRoundedIcon, MetricsEvent.VIEW_UNKNOWN, preference, tile, null /*key */, Preference.DEFAULT_ORDER); @@ -246,17 +246,6 @@ public class DashboardFeatureProviderImplTest { .isEqualTo(RuntimeEnvironment.application.getString(R.string.summary_placeholder)); } - @Test - public void bindPreference_hasSummary_shouldSetSummary() { - final Preference preference = new Preference(RuntimeEnvironment.application); - final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); - tile.summary = "test"; - mImpl.bindPreferenceToTile(mActivity, mForceRoundedIcon, MetricsEvent.VIEW_UNKNOWN, - preference, tile, null /*key */, Preference.DEFAULT_ORDER); - - assertThat(preference.getSummary()).isEqualTo(tile.summary); - } - @Test @Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class}) public void bindPreference_hasSummaryUri_shouldLoadSummaryFromContentProvider() { diff --git a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java index 06d5a96de9b..3726fb4d2bd 100644 --- a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java @@ -24,6 +24,7 @@ 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; @@ -46,6 +47,7 @@ public class SummaryLoaderTest { private static final String SUMMARY_1 = "summary1"; private static final String SUMMARY_2 = "summary2"; + private Context mContext; private SummaryLoader mSummaryLoader; private boolean mCallbackInvoked; private Tile mTile; @@ -54,12 +56,13 @@ public class SummaryLoaderTest { @Before public void SetUp() { MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; mFeatureFactory = FakeFeatureFactory.setupForTest(); final ActivityInfo activityInfo = new ActivityInfo(); activityInfo.packageName = "pkg"; activityInfo.name = "class"; mTile = new Tile(activityInfo, CategoryKey.CATEGORY_HOMEPAGE); - mTile.summary = SUMMARY_1; + mTile.overrideSummary(SUMMARY_1); mCallbackInvoked = false; final Activity activity = Robolectric.buildActivity(Activity.class).get(); @@ -75,14 +78,14 @@ public class SummaryLoaderTest { @Test public void testUpdateSummaryIfNeeded_SummaryIdentical_NoCallback() { - mSummaryLoader.updateSummaryIfNeeded(mTile, SUMMARY_1); + mSummaryLoader.updateSummaryIfNeeded(mContext, mTile, SUMMARY_1); assertThat(mCallbackInvoked).isFalse(); } @Test public void testUpdateSummaryIfNeeded_SummaryChanged_HasCallback() { - mSummaryLoader.updateSummaryIfNeeded(mTile, SUMMARY_2); + mSummaryLoader.updateSummaryIfNeeded(mContext, mTile, SUMMARY_2); assertThat(mCallbackInvoked).isTrue(); } @@ -102,10 +105,10 @@ public class SummaryLoaderTest { when(mFeatureFactory.dashboardFeatureProvider.getDashboardKeyForTile(tile)) .thenReturn(tile.getKey(RuntimeEnvironment.application)); - mSummaryLoader.updateSummaryIfNeeded(tile, testSummary); - tile.summary = null; + mSummaryLoader.updateSummaryIfNeeded(mContext, tile, testSummary); + tile.overrideSummary(null); mSummaryLoader.updateSummaryToCache(category); - assertThat(tile.summary).isEqualTo(testSummary); + assertThat(tile.getSummary(mContext)).isEqualTo(testSummary); } }