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();