From ecadd0119d7bbc98ccbaf8bffb6aba7f43058015 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 30 Apr 2018 16:24:42 -0700 Subject: [PATCH] Fix a NPE where developer options page crash sometimes. Developer options page crash for restricted users because the page removes all preferences while DashboardFeatureProvider tries to manipulate preferences on screen. Added a null check to skip changin prefs in DashboardFeatureProvider because the pref is going to be removed either way. Change-Id: Ic83fd0dfb2a906605fb1d992d7b36c2163630e89 Fixes: 78655710 Test: robotests --- .../settings/dashboard/DashboardFeatureProviderImpl.java | 11 +++++++---- .../settings/dashboard/DashboardFeatureProviderImplTest.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index f403e056da..6ea7fd7acf 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -133,6 +133,9 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { @Override public void bindPreferenceToTile(Activity activity, int sourceMetricsCategory, Preference pref, Tile tile, String key, int baseOrder) { + if (pref == null) { + return; + } pref.setTitle(tile.title); if (!TextUtils.isEmpty(key)) { pref.setKey(key); @@ -239,7 +242,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { if (tile.icon != null) { preference.setIcon(tile.icon.loadDrawable(preference.getContext())); } else if (tile.metaData != null - && tile.metaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) + && tile.metaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) { ThreadUtils.postOnBackgroundThread(() -> { String packageName = null; if (tile.intent != null) { @@ -259,11 +262,11 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { return; } final Icon icon = Icon.createWithResource(iconInfo.first, iconInfo.second); - ThreadUtils.postOnMainThread(() -> { - preference.setIcon(icon.loadDrawable(preference.getContext())); - } + ThreadUtils.postOnMainThread(() -> + preference.setIcon(icon.loadDrawable(preference.getContext())) ); }); + } } private void launchIntentOrSelectProfile(Activity activity, Tile tile, Intent intent, diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index a0e5ed873b..41d8b18f47 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; @@ -215,6 +216,15 @@ public class DashboardFeatureProviderImplTest { } @Test + public void bindPreference_nullPreference_shouldIgnore() { + final Tile tile = mock(Tile.class); + mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN, + null, tile, "123", Preference.DEFAULT_ORDER); + + verifyZeroInteractions(tile); + } + + @Test public void bindPreference_withNullKeyNullPriority_shouldGenerateKeyAndPriority() { final Preference preference = new Preference(RuntimeEnvironment.application); final Tile tile = new Tile(); -- 2.11.0