Fix NPE when using VisibilityLogger.

Fix: 31612160
Test: make RunSettingsRoboTests
Change-Id: Ib040a40d27a76d9440f629ed4f768dc4bfde8ac2
diff --git a/src/com/android/settings/DeviceAdminSettings.java b/src/com/android/settings/DeviceAdminSettings.java
index f729678..2c98a40 100644
--- a/src/com/android/settings/DeviceAdminSettings.java
+++ b/src/com/android/settings/DeviceAdminSettings.java
@@ -49,8 +49,8 @@
 import android.widget.TextView;
 
 import com.android.internal.logging.MetricsProto;
-import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
 import com.android.settings.core.instrumentation.Instrumentable;
+import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
 
 import org.xmlpull.v1.XmlPullParserException;
 
@@ -84,6 +84,13 @@
             return this.name.compareTo(other.name);
         }
     }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mVisibilityLoggerMixin.onAttach(context);
+    }
+
     /**
      * Internal collection of device admin info objects for all profiles associated with the current
      * user.
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
index 6e4d40e..f67635e 100644
--- a/src/com/android/settings/UserDictionarySettings.java
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -81,6 +81,12 @@
     }
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mVisibilityLoggerMixin.onAttach(context);
+    }
+
+    @Override
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         return inflater.inflate(
diff --git a/src/com/android/settings/ZonePicker.java b/src/com/android/settings/ZonePicker.java
index 0b52bdc..6865090 100644
--- a/src/com/android/settings/ZonePicker.java
+++ b/src/com/android/settings/ZonePicker.java
@@ -137,6 +137,12 @@
     }
 
     @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mVisibilityLoggerMixin.onAttach(context);
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.ZONE_PICKER;
     }
diff --git a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
index f4fe5e8..101dccd 100644
--- a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
+++ b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
@@ -50,11 +50,15 @@
 
     @Override
     public void onResume() {
-        mMetricsFeature.visible(null /* context */, mMetricsCategory);
+        if (mMetricsFeature != null) {
+            mMetricsFeature.visible(null /* context */, mMetricsCategory);
+        }
     }
 
     @Override
     public void onPause() {
-        mMetricsFeature.hidden(null /* context */, mMetricsCategory);
+        if (mMetricsFeature != null) {
+            mMetricsFeature.hidden(null /* context */, mMetricsCategory);
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
index 6280009..c009d0c 100644
--- a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
+++ b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java
@@ -28,7 +28,9 @@
 import org.robolectric.annotation.Config;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -51,6 +53,7 @@
     @Test
     public void shouldLogVisibleOnResume() {
         mMixin.onResume();
+
         verify(mMetricsFeature, times(1))
                 .visible(any(Context.class), eq(TestInstrumentable.TEST_METRIC));
     }
@@ -58,10 +61,21 @@
     @Test
     public void shouldLogHideOnPause() {
         mMixin.onPause();
+
         verify(mMetricsFeature, times(1))
                 .hidden(any(Context.class), eq(TestInstrumentable.TEST_METRIC));
     }
 
+    @Test
+    public void shouldNotLogIfMetricsFeatureIsNull() {
+        mMixin = new VisibilityLoggerMixin(TestInstrumentable.TEST_METRIC);
+        mMixin.onResume();
+        mMixin.onPause();
+
+        verify(mMetricsFeature, never())
+                .hidden(any(Context.class), anyInt());
+    }
+
     private final class TestInstrumentable implements Instrumentable {
 
         public static final int TEST_METRIC = 12345;