From b72163b9d0e4ed79327fe10fba0e0a187dd0de18 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Mon, 8 May 2017 15:08:58 -0700 Subject: [PATCH] Fix crash when silencing condition. - check if the broadcast receiver is being registered before trying to un-regist it. Change-Id: I6af215f393d16173f317c9e5bc05237c935e7133 Fix: 38131851 Test: make RunSettingsRoboTests --- .../dashboard/conditional/Condition.java | 11 +++++++++-- .../dashboard/conditional/ConditionTest.java | 19 ++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/dashboard/conditional/Condition.java b/src/com/android/settings/dashboard/conditional/Condition.java index 769b521deba..05783bde798 100644 --- a/src/com/android/settings/dashboard/conditional/Condition.java +++ b/src/com/android/settings/dashboard/conditional/Condition.java @@ -35,6 +35,7 @@ public abstract class Condition { protected final ConditionManager mManager; protected final MetricsFeatureProvider mMetricsFeatureProvider; + protected boolean mReceiverRegistered; private boolean mIsSilenced; private boolean mIsActive; @@ -110,9 +111,15 @@ public abstract class Condition { return; } if (silenced) { - mManager.getContext().registerReceiver(receiver, getIntentFilter()); + if (!mReceiverRegistered) { + mManager.getContext().registerReceiver(receiver, getIntentFilter()); + mReceiverRegistered = true; + } } else { - mManager.getContext().unregisterReceiver(receiver); + if (mReceiverRegistered) { + mManager.getContext().unregisterReceiver(receiver); + mReceiverRegistered = false; + } } } diff --git a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java index a4080962068..4ef7263d984 100644 --- a/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/conditional/ConditionTest.java @@ -29,11 +29,14 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; +import org.robolectric.RuntimeEnvironment; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -45,14 +48,14 @@ public class ConditionTest { private ConditionManager mConditionManager; @Mock private MetricsFeatureProvider mMetricsFeatureProvider; - @Mock - private Context mContext; + private Context mContext; private TestCondition mCondition; @Before public void setUp() { MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); mCondition = new TestCondition(mConditionManager, mMetricsFeatureProvider); when(mConditionManager.getContext()).thenReturn(mContext); } @@ -82,12 +85,22 @@ public class ConditionTest { } @Test - public void onSilenceChanged_notSilenced_shouldUnregisterReceiver() { + public void onSilenceChanged_notSilenced_registered_shouldUnregisterReceiver() { + mCondition.onSilenceChanged(true); + mCondition.onSilenceChanged(false); verify(mContext).unregisterReceiver(TestCondition.mReceiver); } + @Test + public void onSilenceChanged_notSilenced_notRegistered_shouldNotCrash() { + mCondition.onSilenceChanged(false); + + verify(mContext, never()).unregisterReceiver(TestCondition.mReceiver); + // no crash + } + private static final class TestCondition extends Condition { private static final int TEST_METRIC_CONSTANT = 1234;