diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java index 483e46af595..de49ce1ef52 100644 --- a/src/com/android/settings/bluetooth/BluetoothEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java @@ -223,7 +223,6 @@ public final class BluetoothEnabler implements SwitchWidgetController.OnSwitchCh mSwitchController.setDisabledByAdmin(admin); if (admin != null) { mSwitchController.setChecked(false); - mSwitchController.setEnabled(false); } return admin != null; } diff --git a/src/com/android/settings/location/LocationSwitchBarController.java b/src/com/android/settings/location/LocationSwitchBarController.java index c84014f04d8..b150b1d93c0 100644 --- a/src/com/android/settings/location/LocationSwitchBarController.java +++ b/src/com/android/settings/location/LocationSwitchBarController.java @@ -15,6 +15,7 @@ package com.android.settings.location; import android.content.Context; import android.os.UserHandle; +import android.os.UserManager; import android.widget.Switch; import com.android.settings.widget.SettingsMainSwitchBar; @@ -75,8 +76,12 @@ public class LocationSwitchBarController implements OnMainSwitchChangeListener, // only, it would be re-enabled again if the switch bar is not disabled. if (!hasBaseUserRestriction && admin != null) { mSwitchBar.setDisabledByAdmin(admin); + } else if (restricted) { + RestrictedLockUtils.EnforcedAdmin enforcedAdmin = RestrictedLockUtils.EnforcedAdmin + .createDefaultEnforcedAdminWithRestriction(UserManager.DISALLOW_SHARE_LOCATION); + mSwitchBar.setDisabledByAdmin(enforcedAdmin); } else { - mSwitchBar.setEnabled(!restricted); + mSwitchBar.setEnabled(true); } if (enabled != mSwitchBar.isChecked()) { diff --git a/src/com/android/settings/widget/SettingsMainSwitchBar.java b/src/com/android/settings/widget/SettingsMainSwitchBar.java index 5ad16d79f99..8b8a9bae494 100644 --- a/src/com/android/settings/widget/SettingsMainSwitchBar.java +++ b/src/com/android/settings/widget/SettingsMainSwitchBar.java @@ -21,14 +21,12 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.content.Context; import android.util.AttributeSet; import android.view.View; -import android.widget.ImageView; import android.widget.Switch; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.widget.MainSwitchBar; -import com.android.settingslib.widget.R; /** * A {@link MainSwitchBar} with a customized Switch and provides the metrics feature. @@ -47,7 +45,6 @@ public class SettingsMainSwitchBar extends MainSwitchBar { boolean onBeforeCheckedChanged(Switch switchView, boolean isChecked); } - private ImageView mRestrictedIcon; private EnforcedAdmin mEnforcedAdmin; private boolean mDisabledByAdmin; @@ -74,14 +71,6 @@ public class SettingsMainSwitchBar extends MainSwitchBar { mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); addOnSwitchChangeListener((switchView, isChecked) -> logMetrics(isChecked)); - - mRestrictedIcon = findViewById(R.id.restricted_icon); - mRestrictedIcon.setOnClickListener((View v) -> { - if (mDisabledByAdmin) { - RestrictedLockUtils.sendShowAdminSupportDetailsIntent(context, mEnforcedAdmin); - onRestrictedIconClick(); - } - }); } /** @@ -95,12 +84,9 @@ public class SettingsMainSwitchBar extends MainSwitchBar { mDisabledByAdmin = true; mTextView.setEnabled(false); mSwitch.setEnabled(false); - mSwitch.setVisibility(View.GONE); - mRestrictedIcon.setVisibility(View.VISIBLE); } else { mDisabledByAdmin = false; mSwitch.setVisibility(View.VISIBLE); - mRestrictedIcon.setVisibility(View.GONE); setEnabled(isEnabled()); } } @@ -120,11 +106,12 @@ public class SettingsMainSwitchBar extends MainSwitchBar { @Override public boolean performClick() { - return getDelegatingView().performClick(); - } + if (mDisabledByAdmin) { + performRestrictedClick(); + return true; + } - protected void onRestrictedIconClick() { - mMetricsFeatureProvider.clicked(mMetricsCategory, "switch_bar|restricted"); + return mSwitch.performClick(); } @Override @@ -157,11 +144,12 @@ public class SettingsMainSwitchBar extends MainSwitchBar { mMetricsCategory = category; } - private View getDelegatingView() { - return mDisabledByAdmin ? mRestrictedIcon : mSwitch; - } - private void logMetrics(boolean isChecked) { mMetricsFeatureProvider.changed(mMetricsCategory, "switch_bar", isChecked ? 1 : 0); } + + private void performRestrictedClick() { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), mEnforcedAdmin); + mMetricsFeatureProvider.clicked(mMetricsCategory, "switch_bar|restricted"); + } } diff --git a/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java index 348f64d975d..50f618f5ffe 100644 --- a/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationSwitchBarControllerTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.os.UserManager; import android.provider.Settings; import android.widget.Switch; @@ -108,14 +109,26 @@ public class LocationSwitchBarControllerTest { verify(mSwitchBar).setDisabledByAdmin(admin); } + @Test + public void onLocationModeChanged_Restricted_shouldDisableSwitchByAdmin() { + final RestrictedLockUtils.EnforcedAdmin admin = RestrictedLockUtils.EnforcedAdmin + .createDefaultEnforcedAdminWithRestriction(UserManager.DISALLOW_SHARE_LOCATION); + doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); + doReturn(false).when(mEnabler).hasShareLocationRestriction(anyInt()); + + mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, true); + + verify(mSwitchBar).setDisabledByAdmin(admin); + } + @Test public void onLocationModeChanged_Restricted_shouldDisableSwitch() { doReturn(null).when(mEnabler).getShareLocationEnforcedAdmin(anyInt()); doReturn(true).when(mEnabler).hasShareLocationRestriction(anyInt()); - mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, true); + mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); - verify(mSwitchBar).setEnabled(false); + verify(mSwitchBar).setEnabled(true); } @Test diff --git a/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchBarTest.java b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchBarTest.java new file mode 100644 index 00000000000..dc69d8e0dfb --- /dev/null +++ b/tests/robotests/src/com/android/settings/widget/SettingsMainSwitchBarTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 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.widget; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.widget.TextView; + +import com.android.settingslib.R; +import com.android.settingslib.RestrictedLockUtils; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class SettingsMainSwitchBarTest { + + private SettingsMainSwitchBar mMainSwitchBar; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + final Context context = RuntimeEnvironment.application; + mMainSwitchBar = new SettingsMainSwitchBar(context); + } + + @Test + public void disabledByAdmin_shouldBeDisabled() { + mMainSwitchBar.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin()); + + TextView title = (TextView) mMainSwitchBar.findViewById(R.id.switch_text); + assertThat(title.isEnabled()).isFalse(); + assertThat(mMainSwitchBar.getSwitch().isEnabled()).isFalse(); + } + + @Test + public void disabledByAdmin_setNull_shouldBeEnabled() { + mMainSwitchBar.setDisabledByAdmin(null); + + TextView title = (TextView) mMainSwitchBar.findViewById(R.id.switch_text); + assertThat(title.isEnabled()).isTrue(); + assertThat(mMainSwitchBar.getSwitch().isEnabled()).isTrue(); + } +}