Merge "Add a config to show the Vpn options menu." into main
diff --git a/res/values/strings.xml b/res/values/strings.xml
index fa79cbb..d625122 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10505,9 +10505,9 @@
     </string-array>
 
     <!-- Debugging developer settings: enable angle as system driver? [CHAR LIMIT=50] -->
-    <string name="enable_angle_as_system_driver">Enable ANGLE</string>
+    <string name="enable_angle_as_system_driver">Experimental: Enable ANGLE</string>
     <!-- Debugging developer settings: enable angle as system driver summary [CHAR LIMIT=NONE] -->
-    <string name="enable_angle_as_system_driver_summary">Enable ANGLE as system OpenGL ES driver</string>
+    <string name="enable_angle_as_system_driver_summary">Warning: Enable ANGLE as default OpenGL ES driver. This feature is in experiment and may not be compatible with some camera and video apps.</string>
     <!--Dialog body text used to explain a reboot is required after changing ANGLE as system GLES driver setting-->
     <string name="reboot_dialog_enable_angle_as_system_driver">A reboot is required to change the system OpenGL ES driver</string>
 
diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
index b3af95e..992136c 100644
--- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
@@ -57,6 +57,10 @@
     @VisibleForTesting
     static final String PROPERTY_PERSISTENT_GRAPHICS_EGL = "persist.graphics.egl";
 
+    @VisibleForTesting
+    static final String PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION =
+            "debug.graphics.angle.developeroption.enable";
+
     @VisibleForTesting static final String ANGLE_DRIVER_SUFFIX = "angle";
 
     @VisibleForTesting
@@ -72,6 +76,11 @@
                 public void set(String key, String val) {
                     SystemProperties.set(key, val);
                 }
+
+                @Override
+                public boolean getBoolean(String key, boolean def) {
+                    return SystemProperties.getBoolean(key, def);
+                }
             };
         }
     }
@@ -81,6 +90,13 @@
         this(context, fragment, new Injector());
     }
 
+    // Return true if the ANGLE developer option entry point is enabled.
+    // This can be enabled by calling:
+    //     `adb shell setprop debug.graphics.angle.developeroption.enable true`
+    private boolean isAngleDeveloperOptionEnabled() {
+        return mSystemProperties.getBoolean(PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION, false);
+    }
+
     private boolean isAngleSupported() {
         return TextUtils.equals(
                         mSystemProperties.get(PROPERTY_RO_GFX_ANGLE_SUPPORTED, ""), "true");
@@ -96,6 +112,10 @@
         // Exception is when user chooses to reboot now, the switch should keep its current value
         // and persist its' state over reboot.
         mShouldToggleSwitchBackOnRebootDialogDismiss = true;
+        final String persistGraphicsEglValue =
+                mSystemProperties.get(PROPERTY_PERSISTENT_GRAPHICS_EGL, "");
+        Log.v(TAG, "Value of " + PROPERTY_PERSISTENT_GRAPHICS_EGL + " is: "
+                + persistGraphicsEglValue);
     }
 
     @Override
@@ -149,6 +169,13 @@
             mPreference.setEnabled(false);
             ((SwitchPreference) mPreference).setChecked(false);
         }
+
+        // Disable the developer option toggle UI if ANGLE is disabled, this means next time the
+        // debug property needs to be set to true again to enable ANGLE. If ANGLE is enabled, don't
+        // disable the developer option toggle UI so that it can be turned off easily.
+        if (!isAngleDeveloperOptionEnabled() && !((SwitchPreference) mPreference).isChecked()) {
+            mPreference.setEnabled(false);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverSystemPropertiesWrapper.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverSystemPropertiesWrapper.java
index 549cd81..9684282 100644
--- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverSystemPropertiesWrapper.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverSystemPropertiesWrapper.java
@@ -41,4 +41,13 @@
      * SELinux. libc will log the underlying reason.
      */
     void set(@NonNull String key, @Nullable String val);
+
+    /**
+     * Get the boolean value for the given {@code key}.
+     *
+     * @param key the key to lookup
+     * @param def the default value in case the property is not set or empty
+     * @return if the {@code key} isn't found, return {@code def}.
+     */
+    boolean getBoolean(@NonNull String key, @NonNull boolean def);
 }
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
index f65dd24..1e0c184 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java
@@ -30,6 +30,7 @@
 import android.view.View;
 import android.widget.Toast;
 
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.password.ChooseLockSettingsHelper;
@@ -97,10 +98,19 @@
     @Override
     public void onNavigateNext(View view) {
         // Ensure that all users are unlocked so that we can move their data
+        final LockPatternUtils lpu = new LockPatternUtils(this);
         if (StorageManager.isFileEncrypted()) {
             for (UserInfo user : getSystemService(UserManager.class).getUsers()) {
-                if (!StorageManager.isUserKeyUnlocked(user.id)) {
-                    Log.d(TAG, "User " + user.id + " is currently locked; requesting unlock");
+                if (StorageManager.isUserKeyUnlocked(user.id)) {
+                    continue;
+                }
+                if (!lpu.isSecure(user.id)) {
+                    Log.d(TAG, "Unsecured user " + user.id + " is currently locked; attempting "
+                            + "automatic unlock");
+                    lpu.unlockUserKeyIfUnsecured(user.id);
+                } else {
+                    Log.d(TAG, "Secured user " + user.id + " is currently locked; requesting "
+                            + "manual unlock");
                     final CharSequence description = TextUtils.expandTemplate(
                             getText(R.string.storage_wizard_move_unlock), user.name);
                     final ChooseLockSettingsHelper.Builder builder =
diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
index da96104..bf16ab0 100644
--- a/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
+++ b/src/com/android/settings/deviceinfo/StorageWizardMoveConfirm.java
@@ -33,6 +33,7 @@
 import android.view.View;
 
 import com.android.internal.util.Preconditions;
+import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
 import com.android.settings.password.ChooseLockSettingsHelper;
 
@@ -79,10 +80,19 @@
     @Override
     public void onNavigateNext(View view) {
         // Ensure that all users are unlocked so that we can move their data
+        final LockPatternUtils lpu = new LockPatternUtils(this);
         if (StorageManager.isFileEncrypted()) {
             for (UserInfo user : getSystemService(UserManager.class).getUsers()) {
-                if (!StorageManager.isUserKeyUnlocked(user.id)) {
-                    Log.d(TAG, "User " + user.id + " is currently locked; requesting unlock");
+                if (StorageManager.isUserKeyUnlocked(user.id)) {
+                    continue;
+                }
+                if (!lpu.isSecure(user.id)) {
+                    Log.d(TAG, "Unsecured user " + user.id + " is currently locked; attempting "
+                            + "automatic unlock");
+                    lpu.unlockUserKeyIfUnsecured(user.id);
+                } else {
+                    Log.d(TAG, "Secured user " + user.id + " is currently locked; requesting "
+                            + "manual unlock");
                     final CharSequence description = TextUtils.expandTemplate(
                             getText(R.string.storage_wizard_move_unlock), user.name);
                     final ChooseLockSettingsHelper.Builder builder =
diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java
index 3dc3ab5..9892f0d 100644
--- a/src/com/android/settings/network/EraseEuiccDataController.java
+++ b/src/com/android/settings/network/EraseEuiccDataController.java
@@ -18,10 +18,12 @@
 
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.os.UserManager;
 import android.text.TextUtils;
 
 import androidx.preference.Preference;
 
+import com.android.settings.Utils;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.network.telephony.MobileNetworkUtils;
@@ -33,8 +35,11 @@
 public class EraseEuiccDataController extends BasePreferenceController {
     private ResetDashboardFragment mHostFragment;
 
+    private final UserManager mUm;
+
     public EraseEuiccDataController(Context context, String preferenceKey) {
         super(context, preferenceKey);
+        mUm = context.getSystemService(UserManager.class);
     }
 
     public void setFragment(ResetDashboardFragment hostFragment) {
@@ -52,10 +57,12 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return SubscriptionUtil.isSimHardwareVisible(mContext) &&
-                (!MobileNetworkUtils.isMobileNetworkUserRestricted(mContext)) &&
-                mContext.getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_TELEPHONY_EUICC) ? AVAILABLE_UNSEARCHABLE
-                : UNSUPPORTED_ON_DEVICE;
+        boolean isAllowedUser = (mUm.isAdminUser() || Utils.isDemoUser(mContext))
+                && !MobileNetworkUtils.isMobileNetworkUserRestricted(mContext);
+        boolean hasEuiccFeature = mContext.getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_TELEPHONY_EUICC);
+        return SubscriptionUtil.isSimHardwareVisible(mContext)
+                && isAllowedUser
+                && hasEuiccFeature ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE;
     }
 }
diff --git a/tests/anomaly-tester/Android.bp b/tests/anomaly-tester/Android.bp
index f17f4b2..0b05e04 100644
--- a/tests/anomaly-tester/Android.bp
+++ b/tests/anomaly-tester/Android.bp
@@ -18,7 +18,7 @@
         "androidx.test.rules",
         "mockito-target",
         "androidx.test.uiautomator_uiautomator",
-        "truth-prebuilt",
+        "truth",
     ],
 
     srcs: ["**/*.java"],
diff --git a/tests/componenttests/Android.bp b/tests/componenttests/Android.bp
index 5c03aa9..300a338 100644
--- a/tests/componenttests/Android.bp
+++ b/tests/componenttests/Android.bp
@@ -19,7 +19,7 @@
     ],
 
     static_libs: [
-        "truth-prebuilt",
+        "truth",
         "androidx.test.core",
         "androidx.test.espresso.core",
         "androidx.test.espresso.intents-nodeps",
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
index 94febff..ad8361e 100644
--- a/tests/robotests/Android.bp
+++ b/tests/robotests/Android.bp
@@ -1,4 +1,4 @@
-    //############################################################
+//############################################################
 // Build SettingsRoboTestStub.apk which includes test-only resources.#
 //############################################################
 
@@ -47,7 +47,7 @@
         "jsr305",
         "settings-contextual-card-protos-lite",
         "settings-log-bridge-protos-lite",
-	"settings-telephony-protos-lite",
+        "settings-telephony-protos-lite",
         "contextualcards",
         "settings-logtags",
         "zxing-core-1.7",
@@ -90,7 +90,10 @@
         "ims-common",
     ],
 
-    java_resource_dirs: ["config", "resources"],
+    java_resource_dirs: [
+        "config",
+        "resources",
+    ],
 
     instrumentation_for: "SettingsRoboTestStub",
 
@@ -114,6 +117,6 @@
         "Settings-core",
         "Robolectric_all-target",
         "mockito-robolectric-prebuilt",
-        "truth-prebuilt",
+        "truth",
     ],
 }
diff --git a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java
index 9210b87..249acf5 100644
--- a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.development.graphicsdriver;
 
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.ANGLE_DRIVER_SUFFIX;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION;
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.PROPERTY_PERSISTENT_GRAPHICS_EGL;
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.PROPERTY_RO_GFX_ANGLE_SUPPORTED;
 
@@ -67,6 +68,7 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
+        ShadowSystemProperties.override(PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION, "true");
         doReturn(mTransaction).when(mFragmentManager).beginTransaction();
         doReturn(mFragmentManager).when(mActivity).getSupportFragmentManager();
         doReturn(mActivity).when(mFragment).getActivity();
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
index f24b295..9afcd37 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowLockPatternUtils.java
@@ -46,7 +46,6 @@
     private static Map<Integer, PasswordMetrics> sUserToMetricsMap = new HashMap<>();
     private static Map<Integer, PasswordMetrics> sUserToProfileMetricsMap = new HashMap<>();
     private static Map<Integer, Boolean> sUserToIsSecureMap = new HashMap<>();
-    private static Map<Integer, Boolean> sUserToPatternEverChosenMap = new HashMap<>();
     private static Map<Integer, Boolean> sUserToVisiblePatternEnabledMap = new HashMap<>();
     private static Map<Integer, Boolean> sUserToBiometricAllowedMap = new HashMap<>();
     private static Map<Integer, Boolean> sUserToLockPatternEnabledMap = new HashMap<>();
@@ -61,7 +60,6 @@
         sUserToMetricsMap.clear();
         sUserToProfileMetricsMap.clear();
         sUserToIsSecureMap.clear();
-        sUserToPatternEverChosenMap.clear();
         sUserToVisiblePatternEnabledMap.clear();
         sUserToBiometricAllowedMap.clear();
         sUserToLockPatternEnabledMap.clear();
@@ -162,15 +160,6 @@
     }
 
     @Implementation
-    public boolean isPatternEverChosen(int userId) {
-        return sUserToPatternEverChosenMap.getOrDefault(userId, true);
-    }
-
-    public static void setIsPatternEverChosen(int userId, boolean isPatternEverChosen) {
-        sUserToPatternEverChosenMap.put(userId, isPatternEverChosen);
-    }
-
-    @Implementation
     public boolean isBiometricAllowedForUser(int userId) {
         return sUserToBiometricAllowedMap.getOrDefault(userId, false);
     }
diff --git a/tests/uitests/Android.bp b/tests/uitests/Android.bp
index d4f09a3..5e83dbc 100644
--- a/tests/uitests/Android.bp
+++ b/tests/uitests/Android.bp
@@ -43,7 +43,7 @@
         "settings-helper",
         "sysui-helper",
         "timeresult-helper-lib",
-        "truth-prebuilt",
+        "truth",
     ],
 
     //sdk_version: "current",
diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp
index 8e81218..e0dd078 100644
--- a/tests/unit/Android.bp
+++ b/tests/unit/Android.bp
@@ -30,14 +30,14 @@
         "androidx.preference_preference",
         "mockito-target-minus-junit4",
         "platform-test-annotations",
-        "truth-prebuilt",
+        "truth",
         "androidx.test.uiautomator_uiautomator",
         // Don't add SettingsLib libraries here - you can use them directly as they are in the
         // instrumented Settings app.
     ],
 
     errorprone: {
-        javacflags: ["-Xep:CheckReturnValue:WARN"]
+        javacflags: ["-Xep:CheckReturnValue:WARN"],
     },
 
     // Include all test java files.
diff --git a/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java b/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
index ae35431..a402d91 100644
--- a/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
+++ b/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
@@ -18,12 +18,16 @@
 
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.ANGLE_DRIVER_SUFFIX;
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.Injector;
+import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION;
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.PROPERTY_PERSISTENT_GRAPHICS_EGL;
 import static com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController.PROPERTY_RO_GFX_ANGLE_SUPPORTED;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
@@ -98,6 +102,8 @@
         }
 
         mContext = ApplicationProvider.getApplicationContext();
+        when(mSystemPropertiesMock.getBoolean(eq(PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION),
+                                              anyBoolean())).thenReturn(true);
 
         // Construct a GraphicsDriverEnableAngleAsSystemDriverController with two Overrides:
         // 1) Override the mSystemProperties with mSystemPropertiesMock,
@@ -468,4 +474,27 @@
         SystemProperties.removeChangeCallback(propertyChangeSignal1.getCountDownJob());
         SystemProperties.removeChangeCallback(propertyChangeSignal2.getCountDownJob());
     }
+
+    @Test
+    public void updateState_DeveloperOptionPropertyIsFalse() {
+        // Test that when debug.graphics.angle.developeroption.enable is false:
+        when(mSystemPropertiesMock.getBoolean(eq(PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION),
+                                              anyBoolean())).thenReturn(false);
+        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
+                .thenReturn("true");
+
+        // 1. "Enable ANGLE" switch is on, the switch should be enabled.
+        when(mSystemPropertiesMock.get(eq(PROPERTY_PERSISTENT_GRAPHICS_EGL), any()))
+                .thenReturn(ANGLE_DRIVER_SUFFIX);
+        mController.updateState(mPreference);
+        assertTrue(mPreference.isChecked());
+        assertTrue(mPreference.isEnabled());
+
+        // 2. "Enable ANGLE" switch is off, the switch should be disabled.
+        when(mSystemPropertiesMock.get(eq(PROPERTY_PERSISTENT_GRAPHICS_EGL), any()))
+                .thenReturn("");
+        mController.updateState(mPreference);
+        assertFalse(mPreference.isChecked());
+        assertFalse(mPreference.isEnabled());
+    }
 }