From 9db3cb3bee156b630c48c781108444e594a79215 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Tue, 24 Jan 2017 15:16:52 -0800 Subject: [PATCH] Fix null pointer exception when surveys are turned off In some conditions the survey provider could be null on download completion which could lead to a NPE. This has been addressed by not requiring an instance for the removal of the receiver. Test: RunSettingsRoboTests (master) Bug: 33707203 Change-Id: Id1ab1a24c697fed8e4dd259682a088b50c35f38a Merged-In: Icfb545697f24172db734dd7dad421796edf68186 --- src/com/android/settings/InstrumentedFragment.java | 4 +--- .../android/settings/InstrumentedPreferenceFragment.java | 4 +--- .../android/settings/overlay/SurveyFeatureProvider.java | 9 ++++++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/InstrumentedFragment.java b/src/com/android/settings/InstrumentedFragment.java index 4dedb98860d..29668005ead 100644 --- a/src/com/android/settings/InstrumentedFragment.java +++ b/src/com/android/settings/InstrumentedFragment.java @@ -77,9 +77,7 @@ public abstract class InstrumentedFragment extends PreferenceFragment { public void onPause() { Activity activity = getActivity(); if (mReceiver != null && activity != null) { - SurveyFeatureProvider provider = - FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity); - provider.unregisterReceiver(activity, mReceiver); + SurveyFeatureProvider.unregisterReceiver(activity, mReceiver); mReceiver = null; } diff --git a/src/com/android/settings/InstrumentedPreferenceFragment.java b/src/com/android/settings/InstrumentedPreferenceFragment.java index 1b3d5cd5596..ba6cb7903b2 100644 --- a/src/com/android/settings/InstrumentedPreferenceFragment.java +++ b/src/com/android/settings/InstrumentedPreferenceFragment.java @@ -66,9 +66,7 @@ public abstract class InstrumentedPreferenceFragment extends PreferenceFragment public void onPause() { Activity activity = getActivity(); if (mReceiver != null && activity != null) { - SurveyFeatureProvider provider = - FeatureFactory.getFactory(activity).getSurveyFeatureProvider(activity); - provider.unregisterReceiver(activity, mReceiver); + SurveyFeatureProvider.unregisterReceiver(activity, mReceiver); mReceiver = null; } diff --git a/src/com/android/settings/overlay/SurveyFeatureProvider.java b/src/com/android/settings/overlay/SurveyFeatureProvider.java index 907bed8f7bf..416a602bdb1 100644 --- a/src/com/android/settings/overlay/SurveyFeatureProvider.java +++ b/src/com/android/settings/overlay/SurveyFeatureProvider.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.support.annotation.Nullable; +import android.support.v4.content.LocalBroadcastManager; /** * An interface for classes wishing to provide the ability to serve surveys to implement. @@ -81,5 +82,11 @@ public interface SurveyFeatureProvider { * after a call to {@link #createAndRegisterReceiver(Activity)}. * @param activity The activity that was used to register the BroadcastReceiver. */ - void unregisterReceiver(Activity activity, BroadcastReceiver receiver); + static void unregisterReceiver(Activity activity, BroadcastReceiver receiver) { + if (activity == null) { + throw new IllegalStateException("Cannot unregister receiver if activity is null"); + } + + LocalBroadcastManager.getInstance(activity).unregisterReceiver(receiver); + } }