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
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index f403e05..6ea7fd7 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -133,6 +133,9 @@
@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 @@
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 @@
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 a0e5ed8..41d8b18 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.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 @@
}
@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();