OSDN Git Service

Fix a NPE when rotating dialog created by DialogCreatable.
authorFan Zhang <zhfan@google.com>
Mon, 3 Oct 2016 20:48:55 +0000 (13:48 -0700)
committerFan Zhang <zhfan@google.com>
Mon, 3 Oct 2016 20:50:59 +0000 (13:50 -0700)
Bug: 30088727
Test: make RunSettingsRoboTests
Change-Id: I775899809dfe920daa294f70d646b141da7c0706

src/com/android/settings/SettingsPreferenceFragment.java
src/com/android/settings/core/instrumentation/Instrumentable.java
src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java
tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java

index 575194b..b3f067a 100644 (file)
@@ -46,6 +46,7 @@ import android.widget.Button;
 
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.core.instrumentation.Instrumentable;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settingslib.HelpUtils;
 
@@ -626,6 +627,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedFragment
 
         @Override
         public int getMetricsCategory() {
+            if (mDialogCreatable == null) {
+                return Instrumentable.METRICS_CATEGORY_UNKNOWN;
+            }
             final int metricsCategory = mDialogCreatable.getDialogMetricsCategory(mDialogId);
             if (metricsCategory <= 0) {
                 throw new IllegalStateException("Dialog must provide a metrics category");
index bd0bdf4..e48dbd7 100644 (file)
@@ -18,6 +18,8 @@ package com.android.settings.core.instrumentation;
 
 public interface Instrumentable {
 
+    int METRICS_CATEGORY_UNKNOWN = 0;
+
     /**
      * Instrumented name for a view as defined in
      * {@link com.android.internal.logging.MetricsProto.MetricsEvent}.
index 101dccd..54183a2 100644 (file)
@@ -24,6 +24,8 @@ import com.android.settings.core.lifecycle.events.OnPause;
 import com.android.settings.core.lifecycle.events.OnResume;
 import com.android.settings.overlay.FeatureFactory;
 
+import static com.android.settings.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
+
 /**
  * Logs visibility change of a fragment.
  */
@@ -50,14 +52,14 @@ public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPau
 
     @Override
     public void onResume() {
-        if (mMetricsFeature != null) {
+        if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
             mMetricsFeature.visible(null /* context */, mMetricsCategory);
         }
     }
 
     @Override
     public void onPause() {
-        if (mMetricsFeature != null) {
+        if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
             mMetricsFeature.hidden(null /* context */, mMetricsCategory);
         }
     }
index c009d0c..3fa8c94 100644 (file)
@@ -27,6 +27,7 @@ import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
+import static com.android.settings.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.eq;
@@ -76,6 +77,17 @@ public class VisibilityLoggerMixinTest {
                 .hidden(any(Context.class), anyInt());
     }
 
+    @Test
+    public void shouldNotLogIfMetricsCategoryIsUnknown() {
+        mMixin = new VisibilityLoggerMixin(METRICS_CATEGORY_UNKNOWN, mMetricsFeature);
+
+        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;