From 5c2d727b8f9198bf758a4896eda7c9e5385435ff Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 7 Jul 2023 19:52:04 +0800 Subject: [PATCH 1/4] [RESTRICT AUTOMERGE] Restrict ApnEditor settings - Finish ApnEditor settings if user is not an admin - Finish ApnEditor settings if user has DISALLOW_CONFIG_MOBILE_NETWORKS restriction Bug: 279902472 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=ApnEditorTest Change-Id: Iecdbbff7e21dfb11e3ba385858747a220cfd3e04 --- .../android/settings/network/ApnEditor.java | 23 +++++++++++++++ .../settings/network/ApnEditorTest.java | 29 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/com/android/settings/network/ApnEditor.java b/src/com/android/settings/network/ApnEditor.java index f9eccfaeb55..0e2047b4f1f 100644 --- a/src/com/android/settings/network/ApnEditor.java +++ b/src/com/android/settings/network/ApnEditor.java @@ -25,6 +25,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.PersistableBundle; +import android.os.UserManager; import android.provider.Telephony; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; @@ -264,6 +265,11 @@ public class ApnEditor extends SettingsPreferenceFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + if (isUserRestricted()) { + Log.e(TAG, "This setting isn't available due to user restriction."); + finish(); + return; + } setLifecycleForAllControllers(); @@ -1338,6 +1344,23 @@ public class ApnEditor extends SettingsPreferenceFragment } } + @VisibleForTesting + boolean isUserRestricted() { + UserManager userManager = getContext().getSystemService(UserManager.class); + if (userManager == null) { + return false; + } + if (!userManager.isAdminUser()) { + Log.e(TAG, "User is not an admin"); + return true; + } + if (userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) { + Log.e(TAG, "User is not allowed to configure mobile network"); + return true; + } + return false; + } + public static class ErrorDialog extends InstrumentedDialogFragment { public static void showError(ApnEditor editor) { diff --git a/tests/robotests/src/com/android/settings/network/ApnEditorTest.java b/tests/robotests/src/com/android/settings/network/ApnEditorTest.java index 7ec11742604..5879c7f2123 100644 --- a/tests/robotests/src/com/android/settings/network/ApnEditorTest.java +++ b/tests/robotests/src/com/android/settings/network/ApnEditorTest.java @@ -34,6 +34,7 @@ import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; +import android.os.UserManager; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -101,6 +102,8 @@ public class ApnEditorTest { @Mock private FragmentActivity mActivity; @Mock + private UserManager mUserManager; + @Mock private ProxySubscriptionManager mProxySubscriptionMgr; @Captor @@ -126,6 +129,11 @@ public class ApnEditorTest { doReturn(mContext.getTheme()).when(mActivity).getTheme(); doReturn(mContext.getContentResolver()).when(mActivity).getContentResolver(); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(true).when(mUserManager).isAdminUser(); + doReturn(false).when(mUserManager) + .hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); + setMockPreference(mContext); mApnEditorUT.mApnData = new FakeApnData(APN_DATA); mApnEditorUT.sNotSet = "Not Set"; @@ -450,6 +458,27 @@ public class ApnEditorTest { assertThat(ApnEditor.formatInteger("not an int")).isEqualTo("not an int"); } + @Test + @Config(shadows = ShadowFragment.class) + public void onCreate_notAdminUser_shouldFinish() { + doReturn(false).when(mUserManager).isAdminUser(); + + mApnEditorUT.onCreate(null); + + verify(mApnEditorUT).finish(); + } + + @Test + @Config(shadows = ShadowFragment.class) + public void onCreate_hasUserRestriction_shouldFinish() { + doReturn(true).when(mUserManager) + .hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); + + mApnEditorUT.onCreate(null); + + verify(mApnEditorUT).finish(); + } + @Test @Config(shadows = ShadowFragment.class) public void onCreate_noAction_shouldFinishAndNoCrash() { From 021a546a9da7e0dcee4e12f8098e7a4205439661 Mon Sep 17 00:00:00 2001 From: lbill Date: Wed, 26 Jul 2023 12:21:50 +0000 Subject: [PATCH 2/4] Fix RestrictedPreference icons do not align view state Add android:tint="?android:attr/colorControlNormal" in vector drawable Bug: 193514112 Test: Manual, set RestrictedPreference to disabled state and check if icons of preference grey out Change-Id: Icf2821317da731d862d5eebe968b5704ef78271c --- res/drawable/ic_lock_none.xml | 3 ++- res/drawable/ic_lock_pin.xml | 3 ++- res/drawable/ic_lock_swipe.xml | 3 ++- res/drawable/ic_password.xml | 3 ++- res/drawable/ic_pattern.xml | 3 ++- res/drawable/ic_pin.xml | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/res/drawable/ic_lock_none.xml b/res/drawable/ic_lock_none.xml index 31069b7ab44..54b9bb4a3e5 100644 --- a/res/drawable/ic_lock_none.xml +++ b/res/drawable/ic_lock_none.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_lock_pin.xml b/res/drawable/ic_lock_pin.xml index 587f49cab5b..4614f533393 100644 --- a/res/drawable/ic_lock_pin.xml +++ b/res/drawable/ic_lock_pin.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_lock_swipe.xml b/res/drawable/ic_lock_swipe.xml index f7e78b86e1f..fb8302d8cb2 100644 --- a/res/drawable/ic_lock_swipe.xml +++ b/res/drawable/ic_lock_swipe.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_password.xml b/res/drawable/ic_password.xml index 341e544c63c..cf3b408537f 100644 --- a/res/drawable/ic_password.xml +++ b/res/drawable/ic_password.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportHeight="24.0" - android:viewportWidth="24.0"> + android:viewportWidth="24.0" + android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_pattern.xml b/res/drawable/ic_pattern.xml index 788eaa79bad..e56fb003a21 100644 --- a/res/drawable/ic_pattern.xml +++ b/res/drawable/ic_pattern.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportHeight="24.0" - android:viewportWidth="24.0"> + android:viewportWidth="24.0" + android:tint="?android:attr/colorControlNormal"> diff --git a/res/drawable/ic_pin.xml b/res/drawable/ic_pin.xml index 682e934018f..8520ec12468 100644 --- a/res/drawable/ic_pin.xml +++ b/res/drawable/ic_pin.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportHeight="24.0" - android:viewportWidth="24.0"> + android:viewportWidth="24.0" + android:tint="?android:attr/colorControlNormal"> From 5567bdbfb3f9f29bfc0199e5b12e4a3412d99d1e Mon Sep 17 00:00:00 2001 From: Avinash Vadlamudi Date: Mon, 17 Jul 2023 05:48:55 +0000 Subject: [PATCH 3/4] Remove redundant code of setting the DeviceConfig overrides - The auto pin confirm feature is now always available: (ag/23288037) Bug: 291146670 Test: atest ChooseLockPasswordTest Test: atest AutoPinConfirmPreferenceControllerTest Change-Id: I6b9337dfee5d84ffdd3391f7b424377d640d451c --- .../password/ChooseLockPasswordTest.java | 9 ------ ...utoPinConfirmPreferenceControllerTest.java | 29 ------------------- 2 files changed, 38 deletions(-) diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java index 09914f1022a..feea7680e4a 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java @@ -27,10 +27,8 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; -import static android.provider.DeviceConfig.NAMESPACE_AUTO_PIN_CONFIRMATION; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; -import static com.android.internal.widget.LockPatternUtils.FLAG_ENABLE_AUTO_PIN_CONFIRMATION; import static com.android.internal.widget.LockPatternUtils.PASSWORD_TYPE_KEY; import static com.android.settings.password.ChooseLockGeneric.CONFIRM_CREDENTIALS; @@ -45,7 +43,6 @@ import android.app.admin.PasswordMetrics; import android.app.admin.PasswordPolicy; import android.content.Intent; import android.os.UserHandle; -import android.provider.DeviceConfig; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; @@ -55,7 +52,6 @@ import com.android.settings.R; import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment; import com.android.settings.password.ChooseLockPassword.IntentBuilder; import com.android.settings.testutils.shadow.SettingsShadowResources; -import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settings.testutils.shadow.ShadowDevicePolicyManager; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowUtils; @@ -79,7 +75,6 @@ import org.robolectric.shadows.ShadowDrawable; ShadowLockPatternUtils.class, ShadowUtils.class, ShadowDevicePolicyManager.class, - ShadowDeviceConfig.class, }) public class ChooseLockPasswordTest { @Before @@ -435,8 +430,6 @@ public class ChooseLockPasswordTest { @Test public void autoPinConfirmOption_featureEnabledAndUntouchedByUser_changeStateAsPerRules() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - /* value= */ "true", /* makeDefault= */ false); ChooseLockPassword passwordActivity = setupActivityWithPinTypeAndDefaultPolicy(); ChooseLockPasswordFragment fragment = getChooseLockPasswordFragment(passwordActivity); @@ -473,8 +466,6 @@ public class ChooseLockPasswordTest { @Test public void autoPinConfirmOption_featureEnabledAndModifiedByUser_shouldChangeStateAsPerRules() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - /* value= */ "true", /* makeDefault= */ false); ChooseLockPassword passwordActivity = setupActivityWithPinTypeAndDefaultPolicy(); ChooseLockPasswordFragment fragment = getChooseLockPasswordFragment(passwordActivity); diff --git a/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java index 715913cf353..86c1244c8b0 100644 --- a/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/screenlock/AutoPinConfirmPreferenceControllerTest.java @@ -16,22 +16,16 @@ package com.android.settings.security.screenlock; -import static android.provider.DeviceConfig.NAMESPACE_AUTO_PIN_CONFIRMATION; - -import static com.android.internal.widget.LockPatternUtils.FLAG_ENABLE_AUTO_PIN_CONFIRMATION; - import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; import android.content.Context; -import android.provider.DeviceConfig; import androidx.preference.SwitchPreference; import androidx.test.core.app.ApplicationProvider; import com.android.internal.widget.LockPatternUtils; -import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settingslib.core.lifecycle.ObservablePreferenceFragment; import org.junit.Before; @@ -40,10 +34,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowDeviceConfig.class}) public class AutoPinConfirmPreferenceControllerTest { private static final Integer TEST_USER_ID = 1; @Mock @@ -65,8 +57,6 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToNone_shouldReturnFalse() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - "true", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); assertThat(mController.isAvailable()).isFalse(); @@ -74,8 +64,6 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToPassword_shouldReturnFalse() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - "true", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PASSWORD); @@ -85,8 +73,6 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToPIN_lengthLessThanSix_shouldReturnFalse() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - "true", /* makeDefault */ false); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN); when(mLockPatternUtils.getPinLength(TEST_USER_ID)).thenReturn(5); @@ -96,8 +82,6 @@ public class AutoPinConfirmPreferenceControllerTest { @Test public void isAvailable_featureEnabledAndLockSetToPIN_lengthMoreThanEqSix_shouldReturnTrue() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - "true", /* makeDefault */ false); when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN); @@ -106,21 +90,8 @@ public class AutoPinConfirmPreferenceControllerTest { assertThat(mController.isAvailable()).isTrue(); } - @Test - public void isAvailable_featureDisabledAndLockSetToPIN_shouldReturnFalse() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - "false", /* makeDefault */ false); - when(mLockPatternUtils.isSecure(TEST_USER_ID)).thenReturn(true); - when(mLockPatternUtils.getCredentialTypeForUser(TEST_USER_ID)) - .thenReturn(LockPatternUtils.CREDENTIAL_TYPE_PIN); - - assertThat(mController.isAvailable()).isFalse(); - } - @Test public void updateState_ChangingSettingState_shouldSetPreferenceToAppropriateCheckedState() { - DeviceConfig.setProperty(NAMESPACE_AUTO_PIN_CONFIRMATION, FLAG_ENABLE_AUTO_PIN_CONFIRMATION, - "true", /* makeDefault */ false); // When auto_pin_confirm setting is disabled, switchPreference is unchecked when(mLockPatternUtils.isAutoPinConfirmEnabled(TEST_USER_ID)).thenReturn(false); mController.updateState(mPreference); From 557cad061e0b2027f9c9cb21fc14620ad64bd32e Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 26 Jul 2023 11:26:38 -0700 Subject: [PATCH 4/4] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id4cc7323fcee7b8c016f8f16b8ea1eb0ced2bb1a --- res/values-ar/strings.xml | 4 ++-- res/values-es-rUS/strings.xml | 2 +- res/values-nl/strings.xml | 4 ++-- res/values-or/strings.xml | 2 +- res/values-uk/strings.xml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 245260008f5..6b4397638bf 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -4027,7 +4027,7 @@ "الإعداد محظور" "الإعدادات المحظورة مسموح بها للتطبيق %s." "بهدف الحفاظ على أمانك، هذا الإعداد غير متاح الآن." - "معلومات الجهاز الممول" + "معلومات الجهاز المموَّل" "يمكن لشركة بيع الأجهزة بالائتمان تغيير الإعدادات وتثبيت برامج على هذا الجهاز أثناء مرحلة الإعداد.\n\nإذا لم تسدّد إحدى الدفعات، يمكن لشركة بيع الأجهزة بالائتمان قفل جهازك وتغيير إعداداته.\n\nللحصول على مزيد من المعلومات، يُرجى التواصل مع شركة بيع الأجهزة بالائتمان." "إذا كان جهازك ممولاً، لا يمكنك تنفيذ ما يلي:" "‏تثبيت تطبيقات من خارج \"متجر Play\"" @@ -4047,7 +4047,7 @@ "بعد دفع ثمن الجهاز بالكامل:" "تتم إزالة كل القيود من الجهاز." "يمكنك إلغاء تثبيت تطبيق شركة بيع الأجهزة بالائتمان." - "معلومات الجهاز الممول" + "معلومات الجهاز المموَّل" "{count,plural, =1{تطبيق الكاميرا}zero{تطبيقات الكاميرا}two{تطبيقا الكاميرا}few{تطبيقات الكاميرا}many{تطبيقات الكاميرا}other{تطبيقات الكاميرا}}" "تطبيق التقويم" "تطبيق جهات الاتصال" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index c3c1aeb4568..e061cb4f3d0 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -2259,7 +2259,7 @@ "Desglose desde la última carga completa" "Última carga completa" "La carga completa dura aproximadamente" - "La duración de batería restante es aproximada y puede variar en función del uso." + "La duración de la batería restante es aproximada y puede variar en función del uso." "Uso de la batería" "Sin uso desde la última carga completa" "Sin uso durante las últimas 24 h" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 17819ef3eef..2e4760e1329 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -2295,7 +2295,7 @@ "Nooit" "bij %1$s batterijlading" "Batterijpercentage" - "Toon batterijpercentage in statusbalk" + "Batterijpercentage in statusbalk tonen" "Batterijniveau sinds de laatste keer dat de batterij volledig werd opgeladen" "Batterijniveau voor afgelopen 24 uur" "App-gebruik sinds de laatste keer dat de batterij volledig werd opgeladen" @@ -2325,7 +2325,7 @@ "Schermtijd voor %s" "Bekijken per app" "Bekijken per systeem" - "&lt, %1$s" + "< %1$s" "Processtatistieken" "Statistieken voor nerds over actieve processen" "Geheugengebruik" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 96f25a46996..5e9f5d0cee0 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -4043,7 +4043,7 @@ "ଆପଣ ସମ୍ପୂର୍ଣ୍ଣ ରାଶି ପେମେଣ୍ଟ କରିବା ପରେ:" "ଡିଭାଇସରୁ ସମସ୍ତ ପ୍ରତିବନ୍ଧକ କାଢ଼ି ଦିଆଯାଇଛି" "ଆପଣ କ୍ରେଡିଟର ଆପକୁ ଅନଇନଷ୍ଟଲ କରିପାରିବେ" - "ଫାଇନାନ୍ସଡ୍ ଡିଭାଇସ୍ ସୂଚନା" + "ଫାଇନାନ୍ସ ହୋଇଥିବା ଡିଭାଇସ ସୂଚନା" "{count,plural, =1{କେମେରା ଆପ}other{କେମେରା ଆପ୍ସ}}" "କ୍ୟାଲେଣ୍ଡର ଏପ" "ଯୋଗାଯୋଗ ଆପ୍‌" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 3a362f447c8..370166f6baf 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -3871,7 +3871,7 @@ "Обмеження швидкості в ShortcutManager скинуто" "Керуйте інформацією на заблокованому екрані" "Показуйте або приховуйте вміст сповіщень" - "Поради та підтримка" + "Поради й підтримка" "Найменша ширина" "Установлені додатки не запитували доступу до платних SMS" "Кошти за платні SMS стягує оператор. Ви зможете надсилати платні SMS через додаток, якому надасте такий дозвіл."