diff --git a/src/com/android/settings/development/DevelopmentSettings.java b/src/com/android/settings/development/DevelopmentSettings.java index eaaaad819d1..b442449640b 100644 --- a/src/com/android/settings/development/DevelopmentSettings.java +++ b/src/com/android/settings/development/DevelopmentSettings.java @@ -354,6 +354,7 @@ public class DevelopmentSettings extends RestrictedSettingsFragment private Dialog mLogpersistClearDialog; private DashboardFeatureProvider mDashboardFeatureProvider; private DevelopmentSettingsEnabler mSettingsEnabler; + private DevelopmentSwitchBarController mSwitchBarController; private BugReportPreferenceController mBugReportController; private BugReportInPowerPreferenceController mBugReportInPowerController; private TelephonyMonitorPreferenceController mTelephonyMonitorController; @@ -622,18 +623,9 @@ public class DevelopmentSettings extends RestrictedSettingsFragment public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - final SettingsActivity activity = (SettingsActivity) getActivity(); - - mSwitchBar = activity.getSwitchBar(); - if (mUnavailable) { - mSwitchBar.setEnabled(false); - return; - } - - if (Utils.isMonkeyRunning()) { - return; - } - mSwitchBar.addOnSwitchChangeListener(this); + mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar(); + mSwitchBarController = new DevelopmentSwitchBarController( + this /* DevelopmentSettings */, mSwitchBar, !mUnavailable, getLifecycle()); } private boolean removePreferenceForProduction(Preference preference) { @@ -760,8 +752,6 @@ public class DevelopmentSettings extends RestrictedSettingsFragment if (mUnavailable) { return; } - mSwitchBar.removeOnSwitchChangeListener(this); - mSwitchBar.hide(); getActivity().unregisterReceiver(mUsbReceiver); getActivity().unregisterReceiver(mBluetoothA2dpReceiver); BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); diff --git a/src/com/android/settings/development/DevelopmentSwitchBarController.java b/src/com/android/settings/development/DevelopmentSwitchBarController.java new file mode 100644 index 00000000000..168f7c062b3 --- /dev/null +++ b/src/com/android/settings/development/DevelopmentSwitchBarController.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import com.android.settings.Utils; +import com.android.settings.widget.SwitchBar; +import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +public class DevelopmentSwitchBarController implements LifecycleObserver, OnStart, OnStop { + + private final SwitchBar mSwitchBar; + private final boolean mIsAvailable; + private final DevelopmentSettings mSettings; + + public DevelopmentSwitchBarController(DevelopmentSettings settings, SwitchBar switchBar, + boolean isAvailable, Lifecycle lifecycle) { + mSwitchBar = switchBar; + mIsAvailable = isAvailable && !Utils.isMonkeyRunning(); + mSettings = settings; + + if (mIsAvailable) { + lifecycle.addObserver(this); + } else { + mSwitchBar.setEnabled(false); + } + } + + @Override + public void onStart() { + mSwitchBar.addOnSwitchChangeListener(mSettings); + } + + @Override + public void onStop() { + mSwitchBar.removeOnSwitchChangeListener(mSettings); + } +} diff --git a/src/com/android/settings/widget/SwitchBar.java b/src/com/android/settings/widget/SwitchBar.java index 7bf6a835507..3d30638940d 100644 --- a/src/com/android/settings/widget/SwitchBar.java +++ b/src/com/android/settings/widget/SwitchBar.java @@ -16,6 +16,8 @@ package com.android.settings.widget; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.Context; import android.content.res.TypedArray; import android.os.Parcel; @@ -41,8 +43,6 @@ import com.android.settingslib.RestrictedLockUtils; import java.util.ArrayList; -import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; - public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedChangeListener, View.OnClickListener { @@ -71,8 +71,7 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC private String mMetricsTag; - private ArrayList mSwitchChangeListeners = - new ArrayList(); + private final ArrayList mSwitchChangeListeners = new ArrayList<>(); private static int[] XML_ATTRIBUTES = { R.attr.switchBarMarginStart, R.attr.switchBarMarginEnd, diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java new file mode 100644 index 00000000000..a53b83662cb --- /dev/null +++ b/tests/robotests/src/com/android/settings/development/DevelopmentSwitchBarControllerTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.development; + +import static com.google.common.truth.Truth.assertThat; + +import com.android.settings.TestConfig; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settings.widget.SwitchBar; +import com.android.settingslib.core.lifecycle.Lifecycle; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +import java.util.ArrayList; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, + shadows = { + ShadowUtils.class + }) +public class DevelopmentSwitchBarControllerTest { + + @Mock + private DevelopmentSettings mSettings; + private Lifecycle mLifecycle; + private SwitchBar mSwitchBar; + private DevelopmentSwitchBarController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mLifecycle = new Lifecycle(); + mSwitchBar = new SwitchBar(RuntimeEnvironment.application); + } + + @After + public void tearDown() { + ShadowUtils.reset(); + } + + @Test + public void runThroughLifecycle_isMonkeyRun_shouldNotRegisterListener() { + ShadowUtils.setIsUserAMonkey(true); + mController = new DevelopmentSwitchBarController(mSettings, mSwitchBar, + true /* isAvailable */, mLifecycle); + final ArrayList listeners = + ReflectionHelpers.getField(mSwitchBar, "mSwitchChangeListeners"); + + mLifecycle.onStart(); + assertThat(listeners).doesNotContain(mSettings); + + mLifecycle.onStop(); + assertThat(listeners).doesNotContain(mSettings); + } + + @Test + public void runThroughLifecycle_isNotMonkeyRun_shouldRegisterAndRemoveListener() { + ShadowUtils.setIsUserAMonkey(false); + mController = new DevelopmentSwitchBarController(mSettings, mSwitchBar, + true /* isAvailable */, mLifecycle); + final ArrayList listeners = + ReflectionHelpers.getField(mSwitchBar, "mSwitchChangeListeners"); + + mLifecycle.onStart(); + assertThat(listeners).contains(mSettings); + + mLifecycle.onStop(); + assertThat(listeners).doesNotContain(mSettings); + } + + @Test + public void buildController_unavailable_shouldDisableSwitchBar() { + ShadowUtils.setIsUserAMonkey(false); + mController = new DevelopmentSwitchBarController(mSettings, mSwitchBar, + false /* isAvailable */, mLifecycle); + + assertThat(mSwitchBar.isEnabled()).isFalse(); + } +}