diff options
6 files changed, 153 insertions, 0 deletions
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceTest.kt index 00ba9b4d9836..b88d1c5760a6 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/preference/RestrictedSwitchPreferenceTest.kt @@ -32,6 +32,7 @@ import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted import com.android.settingslib.spaprivileged.model.enterprise.NoRestricted import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.tests.testutils.FakeBlockedByAdmin +import com.android.settingslib.spaprivileged.tests.testutils.FakeBlockedByEcm import com.android.settingslib.spaprivileged.tests.testutils.FakeRestrictionsProvider import com.google.common.truth.Truth.assertThat import org.junit.Rule @@ -44,6 +45,7 @@ class RestrictedSwitchPreferenceTest { val composeTestRule = createComposeRule() private val fakeBlockedByAdmin = FakeBlockedByAdmin() + private val fakeBlockedByEcm = FakeBlockedByEcm() private val fakeRestrictionsProvider = FakeRestrictionsProvider() @@ -141,6 +143,29 @@ class RestrictedSwitchPreferenceTest { assertThat(fakeBlockedByAdmin.sendShowAdminSupportDetailsIntentIsCalled).isTrue() } + @Test + fun whenBlockedByEcm_disabled() { + val restrictions = Restrictions(userId = USER_ID, keys = listOf(RESTRICTION_KEY)) + fakeRestrictionsProvider.restrictedMode = fakeBlockedByEcm + + setContent(restrictions) + + composeTestRule.onNodeWithText(TITLE).assertIsDisplayed().assertIsEnabled() + composeTestRule.onNodeWithText(FakeBlockedByEcm.SUMMARY).assertIsDisplayed() + composeTestRule.onNode(isOn()).assertIsDisplayed() + } + + @Test + fun whenBlockedByEcm_click() { + val restrictions = Restrictions(userId = USER_ID, keys = listOf(RESTRICTION_KEY)) + fakeRestrictionsProvider.restrictedMode = fakeBlockedByEcm + + setContent(restrictions) + composeTestRule.onRoot().performClick() + + assertThat(fakeBlockedByEcm.showRestrictedSettingsDetailsIsCalled).isTrue() + } + private fun setContent(restrictions: Restrictions) { composeTestRule.setContent { RestrictedSwitchPreference(switchPreferenceModel, restrictions) { _, _ -> diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItemTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItemTest.kt index 2ccf323de2a3..556adc750763 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItemTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItemTest.kt @@ -29,6 +29,7 @@ import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted import com.android.settingslib.spaprivileged.model.enterprise.NoRestricted import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.tests.testutils.FakeBlockedByAdmin +import com.android.settingslib.spaprivileged.tests.testutils.FakeBlockedByEcm import com.android.settingslib.spaprivileged.tests.testutils.FakeRestrictionsProvider import com.google.common.truth.Truth.assertThat import org.junit.Rule @@ -41,6 +42,7 @@ class RestrictedMenuItemTest { val composeTestRule = createComposeRule() private val fakeBlockedByAdmin = FakeBlockedByAdmin() + private val fakeBlockedByEcm = FakeBlockedByEcm() private val fakeRestrictionsProvider = FakeRestrictionsProvider() @@ -129,6 +131,28 @@ class RestrictedMenuItemTest { assertThat(menuItemOnClickIsCalled).isFalse() } + @Test + fun whenBlockedByEcm_disabled() { + val restrictions = Restrictions(userId = USER_ID, keys = listOf(RESTRICTION_KEY)) + fakeRestrictionsProvider.restrictedMode = fakeBlockedByEcm + + setContent(restrictions) + + composeTestRule.onNodeWithText(TEXT).assertIsDisplayed().assertIsEnabled() + } + + @Test + fun whenBlockedByEcm_onClick_showEcmDetails() { + val restrictions = Restrictions(userId = USER_ID, keys = listOf(RESTRICTION_KEY)) + fakeRestrictionsProvider.restrictedMode = fakeBlockedByEcm + + setContent(restrictions) + composeTestRule.onRoot().performClick() + + assertThat(fakeBlockedByEcm.showRestrictedSettingsDetailsIsCalled).isTrue() + assertThat(menuItemOnClickIsCalled).isFalse() + } + private fun setContent(restrictions: Restrictions) { val fakeMoreOptionsScope = object : MoreOptionsScope() { override fun dismiss() {} diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/RestrictedTestUtils.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/RestrictedTestUtils.kt index 93fa17d1eeca..f8ca2a084f14 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/RestrictedTestUtils.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/RestrictedTestUtils.kt @@ -19,6 +19,7 @@ package com.android.settingslib.spaprivileged.tests.testutils import androidx.compose.runtime.Composable import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spaprivileged.model.enterprise.BlockedByAdmin +import com.android.settingslib.spaprivileged.model.enterprise.BlockedByEcm import com.android.settingslib.spaprivileged.model.enterprise.RestrictedMode import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProvider @@ -36,6 +37,18 @@ class FakeBlockedByAdmin : BlockedByAdmin { } } +class FakeBlockedByEcm : BlockedByEcm { + var showRestrictedSettingsDetailsIsCalled = false + + override fun showRestrictedSettingsDetails() { + showRestrictedSettingsDetailsIsCalled = true + } + + companion object { + const val SUMMARY = "Disabled" + } +} + class FakeRestrictionsProvider : RestrictionsProvider { var restrictedMode: RestrictedMode? = null diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedDropDownPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedDropDownPreference.java new file mode 100644 index 000000000000..ade40d8b01e2 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedDropDownPreference.java @@ -0,0 +1,72 @@ +/* + * 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.settingslib; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.DropDownPreference; +import androidx.preference.PreferenceViewHolder; + +public class RestrictedDropDownPreference extends DropDownPreference { + RestrictedPreferenceHelper mHelper; + + public RestrictedDropDownPreference(@NonNull Context context) { + super(context); + mHelper = new RestrictedPreferenceHelper(context, this, null); + } + + /** + * Checks if the given setting is subject to Enhanced Confirmation Mode restrictions for this + * package. Marks the preference as disabled if so. + * @param restriction The key identifying the setting + * @param packageName the package to check the restriction for + * @param uid the uid of the package + */ + public void checkEcmRestrictionAndSetDisabled(@NonNull String restriction, + @Nullable String packageName, int uid) { + mHelper.checkEcmRestrictionAndSetDisabled(restriction, packageName, uid); + } + + @Override + public void onBindViewHolder(@NonNull PreferenceViewHolder holder) { + super.onBindViewHolder(holder); + mHelper.onBindViewHolder(holder); + } + + @Override + public void setEnabled(boolean enabled) { + if (enabled && isDisabledByEcm()) { + mHelper.setDisabledByEcm(null); + return; + } + + super.setEnabled(enabled); + } + + @Override + public void performClick() { + if (!mHelper.performClick()) { + super.performClick(); + } + } + + public boolean isDisabledByEcm() { + return mHelper.isDisabledByEcm(); + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java index a479269f40fb..4eed01ccbc33 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreferenceHelper.java @@ -275,6 +275,10 @@ public class RestrictedPreferenceHelper { if (mPreference instanceof PrimarySwitchPreference) { ((PrimarySwitchPreference) mPreference).setSwitchEnabled(isEnabled); } + + if (!isEnabled && mDisabledByEcm) { + mPreference.setSummary(R.string.disabled_by_app_ops_text); + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java index 701f00865da9..e9f825beb0bc 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/RestrictedPreferenceHelperTest.java @@ -17,6 +17,7 @@ package com.android.settingslib; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doReturn; @@ -28,6 +29,7 @@ import static org.mockito.Mockito.when; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyResourcesManager; import android.content.Context; +import android.content.Intent; import android.view.View; import android.widget.TextView; @@ -87,6 +89,19 @@ public class RestrictedPreferenceHelperTest { } @Test + public void bindPreference_disabledByEcm_shouldDisplayDisabledSummary() { + final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS); + when(mViewHolder.itemView.findViewById(android.R.id.summary)) + .thenReturn(summaryView); + + mHelper.setDisabledByEcm(new Intent()); + mHelper.onBindViewHolder(mViewHolder); + + verify(mPreference).setSummary(R.string.disabled_by_app_ops_text); + verify(summaryView, never()).setVisibility(View.GONE); + } + + @Test public void bindPreference_notDisabled_shouldNotHideSummary() { final TextView summaryView = mock(TextView.class, RETURNS_DEEP_STUBS); when(mViewHolder.itemView.findViewById(android.R.id.summary)) |