Merge changes Iacc80db5,I66dc0bfd

* changes:
  Load preference title from uri if available
  Clean up ShadowTheadUtils.
This commit is contained in:
Fan Zhang
2019-06-21 16:46:35 +00:00
committed by Android (Google) Code Review
10 changed files with 52 additions and 69 deletions

View File

@@ -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_ICON_URI;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY; 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_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.app.settings.SettingsEnums;
import android.content.ComponentName; import android.content.ComponentName;
@@ -108,12 +110,12 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
if (pref == null) { if (pref == null) {
return; return;
} }
pref.setTitle(tile.getTitle(activity.getApplicationContext()));
if (!TextUtils.isEmpty(key)) { if (!TextUtils.isEmpty(key)) {
pref.setKey(key); pref.setKey(key);
} else { } else {
pref.setKey(getDashboardKeyForTile(tile)); pref.setKey(getDashboardKeyForTile(tile));
} }
bindTitle(pref, tile);
bindSummary(pref, tile); bindSummary(pref, tile);
bindIcon(pref, tile, forceRoundedIcon); bindIcon(pref, tile, forceRoundedIcon);
final Bundle metadata = tile.getMetaData(); final Bundle metadata = tile.getMetaData();
@@ -168,6 +170,28 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
launchIntentOrSelectProfile(activity, tile, intent, SettingsEnums.DASHBOARD_SUMMARY); 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) { private void bindSummary(Preference preference, Tile tile) {
final CharSequence summary = tile.getSummary(mContext); final CharSequence summary = tile.getSummary(mContext);
if (summary != null) { if (summary != null) {

View File

@@ -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) { private synchronized void setListeningW(boolean listening) {
if (mWorkerListening == listening) { if (mWorkerListening == listening) {
return; return;

View File

@@ -249,7 +249,7 @@ public class DashboardFeatureProviderImplTest {
} }
@Test @Test
@Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class}) @Config(shadows = {ShadowTileUtils.class})
public void bindPreference_hasSummaryUri_shouldLoadSummaryFromContentProvider() { public void bindPreference_hasSummaryUri_shouldLoadSummaryFromContentProvider() {
final Preference preference = new Preference(RuntimeEnvironment.application); final Preference preference = new Preference(RuntimeEnvironment.application);
final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE); final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
@@ -262,6 +262,20 @@ public class DashboardFeatureProviderImplTest {
assertThat(preference.getSummary()).isEqualTo(ShadowTileUtils.MOCK_SUMMARY); 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 @Test
public void bindPreference_withNullKeyTileKey_shouldUseTileKey() { public void bindPreference_withNullKeyTileKey_shouldUseTileKey() {
final Preference preference = new Preference(RuntimeEnvironment.application); final Preference preference = new Preference(RuntimeEnvironment.application);
@@ -274,7 +288,7 @@ public class DashboardFeatureProviderImplTest {
} }
@Test @Test
@Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class}) @Config(shadows = {ShadowTileUtils.class})
public void bindPreference_withIconUri_shouldLoadIconFromContentProvider() { public void bindPreference_withIconUri_shouldLoadIconFromContentProvider() {
final Preference preference = new Preference(RuntimeEnvironment.application); final Preference preference = new Preference(RuntimeEnvironment.application);
mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName(); mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName();
@@ -341,7 +355,8 @@ public class DashboardFeatureProviderImplTest {
final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent; final Intent launchIntent = shadowActivity.getNextStartedActivityForResult().intent;
assertThat(launchIntent.getAction()) assertThat(launchIntent.getAction())
.isEqualTo("TestAction"); .isEqualTo("TestAction");
assertThat(launchIntent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0)) assertThat(
launchIntent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, 0))
.isEqualTo(MetricsEvent.SETTINGS_GESTURES); .isEqualTo(MetricsEvent.SETTINGS_GESTURES);
} }

View File

@@ -16,21 +16,16 @@
package com.android.settings.dashboard; 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.os.Bundle;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.drawer.CategoryKey; import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import org.junit.Before; import org.junit.Before;
@@ -89,26 +84,4 @@ public class SummaryLoaderTest {
assertThat(mCallbackInvoked).isTrue(); 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);
}
} }

View File

@@ -34,7 +34,6 @@ import android.content.Context;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.DatabaseTestUtils;
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -45,13 +44,11 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowThreadUtils.class)
public class AnomalyCleanupJobServiceTest { public class AnomalyCleanupJobServiceTest {
private static final int UID = 1234; private static final int UID = 1234;
private static final String PACKAGE_NAME = "com.android.package"; private static final String PACKAGE_NAME = "com.android.package";

View File

@@ -38,11 +38,9 @@ import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowThreadUtils.class)
public class CardContentProviderTest { public class CardContentProviderTest {
private Context mContext; private Context mContext;

View File

@@ -25,7 +25,6 @@ import android.content.Context;
import com.android.settings.homepage.contextualcards.ContextualCardUpdateListener; import com.android.settings.homepage.contextualcards.ContextualCardUpdateListener;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import com.android.settingslib.suggestions.SuggestionController; import com.android.settingslib.suggestions.SuggestionController;
import org.junit.Before; import org.junit.Before;
@@ -38,7 +37,6 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowThreadUtils.class)
public class LegacySuggestionContextualCardControllerTest { public class LegacySuggestionContextualCardControllerTest {
@Mock @Mock

View File

@@ -86,7 +86,7 @@ import java.util.Set;
* TODO Investigate using ShadowContentResolver.registerProviderInternal(String, ContentProvider) * TODO Investigate using ShadowContentResolver.registerProviderInternal(String, ContentProvider)
*/ */
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowUserManager.class, ShadowThreadUtils.class, ShadowUtils.class, @Config(shadows = {ShadowUserManager.class, ShadowUtils.class,
SlicesDatabaseAccessorTest.ShadowApplicationPackageManager.class, SlicesDatabaseAccessorTest.ShadowApplicationPackageManager.class,
ShadowBluetoothAdapter.class, ShadowLockPatternUtils.class, ShadowBluetoothAdapter.class, ShadowLockPatternUtils.class,
SettingsSliceProviderTest.ShadowWifiScanWorker.class}) SettingsSliceProviderTest.ShadowWifiScanWorker.class})

View File

@@ -29,15 +29,14 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.core.FeatureFlags; import com.android.settings.core.FeatureFlags;
import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.development.featureflags.FeatureFlagPersistent;
import com.android.settings.testutils.shadow.ShadowAccessPoint; import com.android.settings.testutils.shadow.ShadowAccessPoint;
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import com.android.settings.testutils.shadow.ShadowWifiManager; import com.android.settings.testutils.shadow.ShadowWifiManager;
import com.android.settingslib.wifi.AccessPointPreference; import com.android.settingslib.wifi.AccessPointPreference;
@@ -52,7 +51,7 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowThreadUtils.class, ShadowWifiManager.class}) @Config(shadows = {ShadowWifiManager.class})
public class SavedAccessPointsPreferenceControllerTest { public class SavedAccessPointsPreferenceControllerTest {
@Mock @Mock

View File

@@ -26,24 +26,19 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context; import android.content.Context;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.net.wifi.hotspot2.PasspointConfiguration; import android.net.wifi.hotspot2.PasspointConfiguration;
import android.net.wifi.hotspot2.pps.HomeSp; import android.net.wifi.hotspot2.pps.HomeSp;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiManager;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.core.FeatureFlags; import com.android.settings.core.FeatureFlags;
import com.android.settings.development.featureflags.FeatureFlagPersistent; import com.android.settings.development.featureflags.FeatureFlagPersistent;
import com.android.settings.testutils.shadow.ShadowAccessPoint; import com.android.settings.testutils.shadow.ShadowAccessPoint;
import com.android.settings.testutils.shadow.ShadowThreadUtils;
import com.android.settings.testutils.shadow.ShadowWifiManager; import com.android.settings.testutils.shadow.ShadowWifiManager;
import com.android.settingslib.wifi.AccessPointPreference; import com.android.settingslib.wifi.AccessPointPreference;
@@ -58,7 +53,7 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowThreadUtils.class, ShadowWifiManager.class}) @Config(shadows = {ShadowWifiManager.class})
public class SubscribedAccessPointsPreferenceControllerTest { public class SubscribedAccessPointsPreferenceControllerTest {
@Mock @Mock