From: Fan Zhang Date: Mon, 3 Oct 2016 20:48:55 +0000 (-0700) Subject: Fix a NPE when rotating dialog created by DialogCreatable. X-Git-Tag: android-x86-8.1-r1~1563^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4fe7c0859f920ccb5cb63ffab7e701a0b4b5ebb9;p=android-x86%2Fpackages-apps-Settings.git Fix a NPE when rotating dialog created by DialogCreatable. Bug: 30088727 Test: make RunSettingsRoboTests Change-Id: I775899809dfe920daa294f70d646b141da7c0706 --- diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 575194be8b..b3f067ada9 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -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"); diff --git a/src/com/android/settings/core/instrumentation/Instrumentable.java b/src/com/android/settings/core/instrumentation/Instrumentable.java index bd0bdf4029..e48dbd7c65 100644 --- a/src/com/android/settings/core/instrumentation/Instrumentable.java +++ b/src/com/android/settings/core/instrumentation/Instrumentable.java @@ -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}. diff --git a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java index 101dccd71d..54183a2ede 100644 --- a/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java +++ b/src/com/android/settings/core/instrumentation/VisibilityLoggerMixin.java @@ -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); } } 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 c009d0c92c..3fa8c94dac 100644 --- a/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java +++ b/tests/robotests/src/com/android/settings/core/instrumentation/VisibilityLoggerMixinTest.java @@ -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;