From d71835125ac27905b88c99060f512d5b6d241873 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 20 Jun 2019 14:54:25 -0700 Subject: [PATCH 1/2] Clean up ShadowTheadUtils. Individual tests don't need to specify it in their own @Config Bug: 135698296 Test: robotests Change-Id: I66dc0bfdaec9c6cac9b48f3e7906f71dfb3a6b28 --- .../dashboard/DashboardFeatureProviderImplTest.java | 11 ++++++----- .../batterytip/AnomalyCleanupJobServiceTest.java | 3 --- .../contextualcards/CardContentProviderTest.java | 2 -- .../LegacySuggestionContextualCardControllerTest.java | 2 -- .../settings/slices/SettingsSliceProviderTest.java | 2 +- .../SavedAccessPointsPreferenceControllerTest.java | 5 ++--- ...ubscribedAccessPointsPreferenceControllerTest.java | 11 +++-------- 7 files changed, 12 insertions(+), 24 deletions(-) diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 1c51b81a5e9..ba97d255ee8 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -249,7 +249,7 @@ public class DashboardFeatureProviderImplTest { } @Test - @Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class}) + @Config(shadows = {ShadowTileUtils.class}) public void bindPreference_hasSummaryUri_shouldLoadSummaryFromContentProvider() { final Preference preference = new Preference(RuntimeEnvironment.application); final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); @@ -274,7 +274,7 @@ public class DashboardFeatureProviderImplTest { } @Test - @Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class}) + @Config(shadows = {ShadowTileUtils.class}) public void bindPreference_withIconUri_shouldLoadIconFromContentProvider() { final Preference preference = new Preference(RuntimeEnvironment.application); mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName(); @@ -341,7 +341,8 @@ public class DashboardFeatureProviderImplTest { final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent; assertThat(launchIntent.getAction()) .isEqualTo("TestAction"); - assertThat(launchIntent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0)) + assertThat( + launchIntent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0)) .isEqualTo(MetricsEvent.SETTINGS_GESTURES); } @@ -433,7 +434,7 @@ public class DashboardFeatureProviderImplTest { final ArgumentCaptor argument = ArgumentCaptor.forClass(UserHandle.class); verify(mActivity) - .startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture()); + .startActivityForResultAsUser(any(Intent.class), anyInt(), argument.capture()); assertThat(argument.getValue().getIdentifier()).isEqualTo(userId); verify(mActivity, never()).getSupportFragmentManager(); } @@ -452,7 +453,7 @@ public class DashboardFeatureProviderImplTest { mImpl.openTileIntent(mActivity, tile); verify(mActivity, never()) - .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class)); + .startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class)); verify(mActivity).getSupportFragmentManager(); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java index 32ea9e026a5..a2250697f4d 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyCleanupJobServiceTest.java @@ -34,7 +34,6 @@ import android.content.Context; import com.android.settings.R; import com.android.settings.testutils.DatabaseTestUtils; -import com.android.settings.testutils.shadow.ShadowThreadUtils; import org.junit.After; import org.junit.Before; @@ -45,13 +44,11 @@ import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import java.util.List; import java.util.concurrent.TimeUnit; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowThreadUtils.class) public class AnomalyCleanupJobServiceTest { private static final int UID = 1234; private static final String PACKAGE_NAME = "com.android.package"; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java index 5bdb8d3ff5f..d13c97c47da 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java @@ -38,11 +38,9 @@ import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowThreadUtils.class) public class CardContentProviderTest { private Context mContext; diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java index a2d4d093c42..69242fe96ed 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/legacysuggestion/LegacySuggestionContextualCardControllerTest.java @@ -25,7 +25,6 @@ import android.content.Context; import com.android.settings.homepage.contextualcards.ContextualCardUpdateListener; import com.android.settings.testutils.FakeFeatureFactory; -import com.android.settings.testutils.shadow.ShadowThreadUtils; import com.android.settingslib.suggestions.SuggestionController; import org.junit.Before; @@ -38,7 +37,6 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowThreadUtils.class) public class LegacySuggestionContextualCardControllerTest { @Mock diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 0a7de40b365..968ba2d7966 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -86,7 +86,7 @@ import java.util.Set; * TODO Investigate using ShadowContentResolver.registerProviderInternal(String, ContentProvider) */ @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowUserManager.class, ShadowThreadUtils.class, ShadowUtils.class, +@Config(shadows = {ShadowUserManager.class, ShadowUtils.class, SlicesDatabaseAccessorTest.ShadowApplicationPackageManager.class, ShadowBluetoothAdapter.class, ShadowLockPatternUtils.class, SettingsSliceProviderTest.ShadowWifiScanWorker.class}) diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java index 51944d82c38..196c97bf152 100644 --- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SavedAccessPointsPreferenceControllerTest.java @@ -29,15 +29,14 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.net.wifi.WifiConfiguration; - import android.net.wifi.WifiManager; + import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.core.FeatureFlags; import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.testutils.shadow.ShadowAccessPoint; -import com.android.settings.testutils.shadow.ShadowThreadUtils; import com.android.settings.testutils.shadow.ShadowWifiManager; import com.android.settingslib.wifi.AccessPointPreference; @@ -52,7 +51,7 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowThreadUtils.class, ShadowWifiManager.class}) +@Config(shadows = {ShadowWifiManager.class}) public class SavedAccessPointsPreferenceControllerTest { @Mock diff --git a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SubscribedAccessPointsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SubscribedAccessPointsPreferenceControllerTest.java index 26933d82f61..581f5314504 100644 --- a/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SubscribedAccessPointsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/savedaccesspoints/SubscribedAccessPointsPreferenceControllerTest.java @@ -26,24 +26,19 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.robolectric.Shadows.shadowOf; import android.content.Context; -import android.content.pm.FeatureInfo; -import android.content.pm.PackageManager; import android.net.wifi.WifiConfiguration; - +import android.net.wifi.WifiManager; import android.net.wifi.hotspot2.PasspointConfiguration; import android.net.wifi.hotspot2.pps.HomeSp; -import android.net.wifi.WifiEnterpriseConfig; -import android.net.wifi.WifiManager; + import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.core.FeatureFlags; import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.testutils.shadow.ShadowAccessPoint; -import com.android.settings.testutils.shadow.ShadowThreadUtils; import com.android.settings.testutils.shadow.ShadowWifiManager; import com.android.settingslib.wifi.AccessPointPreference; @@ -58,7 +53,7 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowThreadUtils.class, ShadowWifiManager.class}) +@Config(shadows = {ShadowWifiManager.class}) public class SubscribedAccessPointsPreferenceControllerTest { @Mock From 823c4daece93a9ea3ee7451f10fe6623b90e1910 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 18 Jun 2019 13:56:56 -0700 Subject: [PATCH 2/2] 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 --- .../DashboardFeatureProviderImpl.java | 28 +++++++++++++++++-- .../settings/dashboard/SummaryLoader.java | 16 ----------- .../DashboardFeatureProviderImplTest.java | 14 ++++++++++ .../settings/dashboard/SummaryLoaderTest.java | 27 ------------------ 4 files changed, 40 insertions(+), 45 deletions(-) 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); - } }