Fix a NPE when rotating dialog created by DialogCreatable.

Bug: 30088727
Test: make RunSettingsRoboTests
Change-Id: I775899809dfe920daa294f70d646b141da7c0706
This commit is contained in:
Fan Zhang
2016-10-03 13:48:55 -07:00
parent 8fdb96e32e
commit 4fe7c0859f
4 changed files with 22 additions and 2 deletions

View File

@@ -46,6 +46,7 @@ import android.widget.Button;
import com.android.settings.applications.LayoutPreference; import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.InstrumentedFragment;
import com.android.settings.core.instrumentation.Instrumentable;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.HelpUtils; import com.android.settingslib.HelpUtils;
@@ -626,6 +627,9 @@ public abstract class SettingsPreferenceFragment extends InstrumentedFragment
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
if (mDialogCreatable == null) {
return Instrumentable.METRICS_CATEGORY_UNKNOWN;
}
final int metricsCategory = mDialogCreatable.getDialogMetricsCategory(mDialogId); final int metricsCategory = mDialogCreatable.getDialogMetricsCategory(mDialogId);
if (metricsCategory <= 0) { if (metricsCategory <= 0) {
throw new IllegalStateException("Dialog must provide a metrics category"); throw new IllegalStateException("Dialog must provide a metrics category");

View File

@@ -18,6 +18,8 @@ package com.android.settings.core.instrumentation;
public interface Instrumentable { public interface Instrumentable {
int METRICS_CATEGORY_UNKNOWN = 0;
/** /**
* Instrumented name for a view as defined in * Instrumented name for a view as defined in
* {@link com.android.internal.logging.MetricsProto.MetricsEvent}. * {@link com.android.internal.logging.MetricsProto.MetricsEvent}.

View 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.core.lifecycle.events.OnResume;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import static com.android.settings.core.instrumentation.Instrumentable.METRICS_CATEGORY_UNKNOWN;
/** /**
* Logs visibility change of a fragment. * Logs visibility change of a fragment.
*/ */
@@ -50,14 +52,14 @@ public class VisibilityLoggerMixin implements LifecycleObserver, OnResume, OnPau
@Override @Override
public void onResume() { public void onResume() {
if (mMetricsFeature != null) { if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
mMetricsFeature.visible(null /* context */, mMetricsCategory); mMetricsFeature.visible(null /* context */, mMetricsCategory);
} }
} }
@Override @Override
public void onPause() { public void onPause() {
if (mMetricsFeature != null) { if (mMetricsFeature != null && mMetricsCategory != METRICS_CATEGORY_UNKNOWN) {
mMetricsFeature.hidden(null /* context */, mMetricsCategory); mMetricsFeature.hidden(null /* context */, mMetricsCategory);
} }
} }

View File

@@ -27,6 +27,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config; 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.any;
import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
@@ -76,6 +77,17 @@ public class VisibilityLoggerMixinTest {
.hidden(any(Context.class), anyInt()); .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 { private final class TestInstrumentable implements Instrumentable {
public static final int TEST_METRIC = 12345; public static final int TEST_METRIC = 12345;