Merge "Settings: Do not show install info for Play Store app" into main
diff --git a/res/layout/vpn_dialog.xml b/res/layout/vpn_dialog.xml
index 062772e..fadd202 100644
--- a/res/layout/vpn_dialog.xml
+++ b/res/layout/vpn_dialog.xml
@@ -13,7 +13,10 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:theme="@style/Theme.Material3.DynamicColors.DayNight"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
@@ -45,12 +48,17 @@
                     android:orientation="vertical"
                     android:visibility="gone">
 
-                <TextView style="@style/vpn_label"
-                        android:text="@string/vpn_name"
-                        android:labelFor="@+id/name"/>
-                <EditText style="@style/vpn_value"
+                <com.google.android.material.textfield.TextInputLayout
+                    style="@style/vpn_label"
+                    android:id="@+id/name_layout"
+                    android:hint="@string/vpn_name"
+                    app:endIconMode="clear_text"
+                    app:errorEnabled="true">
+                    <com.google.android.material.textfield.TextInputEditText
+                        style="@style/vpn_value"
                         android:id="@+id/name"
                         android:inputType="textCapWords"/>
+                </com.google.android.material.textfield.TextInputLayout>
 
                 <TextView style="@style/vpn_label"
                         android:text="@string/vpn_type"
@@ -60,23 +68,34 @@
                         android:prompt="@string/vpn_type"
                         android:entries="@array/vpn_types"/>
 
-                <TextView style="@style/vpn_label"
-                        android:text="@string/vpn_server"
-                        android:labelFor="@+id/server"/>
-                <EditText style="@style/vpn_value"
+                <com.google.android.material.textfield.TextInputLayout
+                    style="@style/vpn_label"
+                    android:id="@+id/server_layout"
+                    android:hint="@string/vpn_server"
+                    app:endIconMode="clear_text"
+                    app:errorEnabled="true">
+                    <com.google.android.material.textfield.TextInputEditText
+                        style="@style/vpn_value"
                         android:id="@+id/server"/>
+                </com.google.android.material.textfield.TextInputLayout>
 
                 <LinearLayout android:id="@+id/options_ipsec_identity"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
                         android:visibility="gone">
-                    <TextView style="@style/vpn_label"
-                            android:text="@string/vpn_ipsec_identifier"
-                            android:labelFor="@+id/ipsec_identifier"/>
-                    <EditText style="@style/vpn_value"
-                            android:id="@+id/ipsec_identifier"
-                            android:hint="@string/vpn_not_used"/>
+                    <com.google.android.material.textfield.TextInputLayout
+                        style="@style/vpn_label"
+                        android:id="@+id/ipsec_identifier_layout"
+                        android:hint="@string/vpn_ipsec_identifier"
+                        app:endIconMode="clear_text"
+                        app:helperTextEnabled="true"
+                        app:helperText="@string/vpn_not_used"
+                        app:errorEnabled="true">
+                        <com.google.android.material.textfield.TextInputEditText
+                            style="@style/vpn_value"
+                            android:id="@+id/ipsec_identifier"/>
+                    </com.google.android.material.textfield.TextInputLayout>
                 </LinearLayout>
 
                 <LinearLayout android:id="@+id/ipsec_psk"
@@ -84,12 +103,17 @@
                         android:layout_height="wrap_content"
                         android:orientation="vertical"
                         android:visibility="gone">
-                    <TextView style="@style/vpn_label"
-                            android:text="@string/vpn_ipsec_secret"
-                            android:labelFor="@+id/ipsec_secret"/>
-                    <EditText style="@style/vpn_value"
+                    <com.google.android.material.textfield.TextInputLayout
+                        style="@style/vpn_label"
+                        android:id="@+id/ipsec_secret_layout"
+                        android:hint="@string/vpn_ipsec_secret"
+                        app:endIconMode="password_toggle"
+                        app:errorEnabled="true">
+                        <com.google.android.material.textfield.TextInputEditText
+                            style="@style/vpn_value"
                             android:id="@+id/ipsec_secret"
-                            android:password="true"/>
+                            android:inputType="textPassword"/>
+                    </com.google.android.material.textfield.TextInputLayout>
                 </LinearLayout>
 
                 <LinearLayout android:id="@+id/ipsec_user"
@@ -153,27 +177,33 @@
                     android:orientation="vertical"
                     android:visibility="gone" >
 
-                    <TextView
+                    <com.google.android.material.textfield.TextInputLayout
                         style="@style/vpn_label"
-                        android:text="@string/proxy_hostname_label"
-                        android:labelFor="@+id/vpn_proxy_host" />
+                        android:id="@+id/vpn_proxy_host_layout"
+                        android:hint="@string/proxy_hostname_label"
+                        app:endIconMode="clear_text"
+                        app:helperTextEnabled="true"
+                        app:helperText="@string/proxy_hostname_hint"
+                        app:errorEnabled="true">
+                        <com.google.android.material.textfield.TextInputEditText
+                            style="@style/vpn_value"
+                            android:id="@+id/vpn_proxy_host"
+                            android:inputType="textNoSuggestions"/>
+                    </com.google.android.material.textfield.TextInputLayout>
 
-                    <EditText
-                        android:id="@+id/vpn_proxy_host"
-                        style="@style/vpn_value"
-                        android:hint="@string/proxy_hostname_hint"
-                        android:inputType="textNoSuggestions" />
-
-                    <TextView
+                    <com.google.android.material.textfield.TextInputLayout
                         style="@style/vpn_label"
-                        android:text="@string/proxy_port_label"
-                        android:labelFor="@+id/vpn_proxy_port" />
-
-                    <EditText
-                        android:id="@+id/vpn_proxy_port"
-                        style="@style/vpn_value"
-                        android:hint="@string/proxy_port_hint"
-                        android:inputType="number" />
+                        android:id="@+id/vpn_proxy_port_layout"
+                        android:hint="@string/proxy_port_label"
+                        app:endIconMode="clear_text"
+                        app:helperTextEnabled="true"
+                        app:helperText="@string/proxy_port_hint"
+                        app:errorEnabled="true">
+                        <com.google.android.material.textfield.TextInputEditText
+                            style="@style/vpn_value"
+                            android:id="@+id/vpn_proxy_port"
+                            android:inputType="number"/>
+                    </com.google.android.material.textfield.TextInputLayout>
                 </LinearLayout>
             </LinearLayout>
 
@@ -182,18 +212,28 @@
                     android:layout_height="wrap_content"
                     android:orientation="vertical">
 
-                <TextView style="@style/vpn_label"
-                        android:text="@string/vpn_username"
-                        android:labelFor="@+id/username"/>
-                <EditText style="@style/vpn_value"
+                <com.google.android.material.textfield.TextInputLayout
+                    style="@style/vpn_label"
+                    android:id="@+id/username_layout"
+                    android:hint="@string/vpn_username"
+                    app:endIconMode="clear_text"
+                    app:errorEnabled="true">
+                    <com.google.android.material.textfield.TextInputEditText
+                        style="@style/vpn_value"
                         android:id="@+id/username"/>
+                </com.google.android.material.textfield.TextInputLayout>
 
-                <TextView style="@style/vpn_label"
-                        android:text="@string/vpn_password"
-                        android:labelFor="@+id/password"/>
-                <EditText style="@style/vpn_value"
+                <com.google.android.material.textfield.TextInputLayout
+                    style="@style/vpn_label"
+                    android:id="@+id/password_layout"
+                    android:hint="@string/vpn_password"
+                    app:endIconMode="password_toggle"
+                    app:errorEnabled="true">
+                    <com.google.android.material.textfield.TextInputEditText
+                        style="@style/vpn_value"
                         android:id="@+id/password"
-                        android:password="true"/>
+                        android:inputType="textPassword"/>
+                </com.google.android.material.textfield.TextInputLayout>
 
                 <CheckBox style="@style/vpn_value"
                         android:id="@+id/save_login"
diff --git a/res/xml/night_display_settings.xml b/res/xml/night_display_settings.xml
index 95d5034..d75619d 100644
--- a/res/xml/night_display_settings.xml
+++ b/res/xml/night_display_settings.xml
@@ -52,7 +52,7 @@
         android:title="@string/night_display_end_time_title"
         settings:controller="com.android.settings.display.NightDisplayCustomEndTimePreferenceController"/>
 
-    <com.android.settings.widget.SeekBarPreference
+    <com.android.settingslib.widget.SliderPreference
         android:key="night_display_temperature"
         android:title="@string/night_display_temperature_title"
         settings:keywords="@string/keywords_display_night_display"
diff --git a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java
index a8e456d..3ae64fc 100644
--- a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java
+++ b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java
@@ -127,14 +127,13 @@
         final String htmlDescription = mA11yShortcutInfo.loadHtmlDescription(mPm);
         final String settingsClassName = mA11yShortcutInfo.getSettingsActivityName();
         final String tileServiceClassName = mA11yShortcutInfo.getTileServiceName();
-        final int metricsCategory = FeatureFactory.getFeatureFactory()
-                .getAccessibilityMetricsFeatureProvider()
-                .getDownloadedFeatureMetricsCategory(mComponentName);
+        final int pageIdCategory = FeatureFactory.getFeatureFactory()
+                .getAccessibilityPageIdFeatureProvider().getCategory(mComponentName);
 
         ThreadUtils.getUiThreadHandler().post(() -> {
             RestrictedPreferenceHelper.putBasicExtras(
                     this, prefKey, getTitle(), intro, description, imageRes,
-                    htmlDescription, mComponentName, metricsCategory);
+                    htmlDescription, mComponentName, pageIdCategory);
             RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName);
             RestrictedPreferenceHelper.putTileServiceExtras(
                     this, getPackageName(), tileServiceClassName);
diff --git a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
index 4e9cd92..347c769 100644
--- a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
@@ -228,10 +228,10 @@
                     new ComponentName(packageName, tileServiceClassName).flattenToString());
         }
 
-        final int metricsCategory = FeatureFactory.getFeatureFactory()
-                .getAccessibilityMetricsFeatureProvider()
-                .getDownloadedFeatureMetricsCategory(componentName);
-        extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory);
+        final int pageIdCategory = FeatureFactory.getFeatureFactory()
+                .getAccessibilityPageIdFeatureProvider().getCategory(componentName);
+        extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, pageIdCategory);
+        extras.putInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY, pageIdCategory);
         extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
         extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes());
 
diff --git a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java
index 018bd2e..7d03230 100644
--- a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java
+++ b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java
@@ -15,8 +15,6 @@
  */
 package com.android.settings.accessibility;
 
-import android.content.ComponentName;
-
 import androidx.annotation.Nullable;
 
 /**
@@ -25,11 +23,11 @@
 public interface AccessibilityFeedbackFeatureProvider {
 
     /**
-     * Returns value according to the {@code componentName}.
+     * Returns value according to the {@code pageId}.
      *
-     * @param componentName the component name of the downloaded service or activity
-     * @return Feedback bucket ID
+     * @param pageId The unique identifier of the page.
+     * @return Feedback bucket ID associated with the page, or {@code null} if is not found.
      */
     @Nullable
-    String getCategory(@Nullable ComponentName componentName);
+    String getCategory(int pageId);
 }
diff --git a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java
index 917c5f6..2381887 100644
--- a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java
+++ b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java
@@ -15,8 +15,6 @@
  */
 package com.android.settings.accessibility;
 
-import android.content.ComponentName;
-
 import androidx.annotation.Nullable;
 
 /** Default implementation of {@link AccessibilityFeedbackFeatureProvider}. */
@@ -25,7 +23,7 @@
 
     @Override
     @Nullable
-    public String getCategory(@Nullable ComponentName componentName) {
-        return "";
+    public String getCategory(int pageId) {
+        return null;
     }
 }
diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProvider.java
similarity index 84%
rename from src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java
rename to src/com/android/settings/accessibility/AccessibilityPageIdFeatureProvider.java
index a9d7c05..698efbe 100644
--- a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java
+++ b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProvider.java
@@ -21,9 +21,9 @@
 import androidx.annotation.Nullable;
 
 /**
- * Provider for Accessibility metrics related features.
+ * Provider for Accessibility page id related features.
  */
-public interface AccessibilityMetricsFeatureProvider {
+public interface AccessibilityPageIdFeatureProvider {
 
     /**
      * Returns {@link android.app.settings.SettingsEnums} value according to the {@code
@@ -32,5 +32,5 @@
      * @param componentName the component name of the downloaded service or activity
      * @return value in {@link android.app.settings.SettingsEnums}
      */
-    int getDownloadedFeatureMetricsCategory(@Nullable ComponentName componentName);
+    int getCategory(@Nullable ComponentName componentName);
 }
diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProviderImpl.java
similarity index 75%
rename from src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java
rename to src/com/android/settings/accessibility/AccessibilityPageIdFeatureProviderImpl.java
index 0f85f38..acd8aab 100644
--- a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java
+++ b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProviderImpl.java
@@ -19,14 +19,16 @@
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 
+import androidx.annotation.Nullable;
+
 /**
- * Provider implementation for Accessibility metrics related features.
+ * Provider implementation for Accessibility page id related features.
  */
-public class AccessibilityMetricsFeatureProviderImpl implements
-        AccessibilityMetricsFeatureProvider {
+public class AccessibilityPageIdFeatureProviderImpl implements
+        AccessibilityPageIdFeatureProvider {
 
     @Override
-    public int getDownloadedFeatureMetricsCategory(ComponentName componentName) {
+    public int getCategory(@Nullable ComponentName componentName) {
         return SettingsEnums.ACCESSIBILITY_SERVICE;
     }
 }
diff --git a/src/com/android/settings/accessibility/AccessibilityServicePreference.java b/src/com/android/settings/accessibility/AccessibilityServicePreference.java
index 8a22d82..7032774 100644
--- a/src/com/android/settings/accessibility/AccessibilityServicePreference.java
+++ b/src/com/android/settings/accessibility/AccessibilityServicePreference.java
@@ -123,13 +123,12 @@
         final String settingsClassName = mA11yServiceInfo.getSettingsActivityName();
         final String tileServiceClassName = mA11yServiceInfo.getTileServiceName();
         final ResolveInfo resolveInfo = mA11yServiceInfo.getResolveInfo();
-        final int metricsCategory = FeatureFactory.getFeatureFactory()
-                .getAccessibilityMetricsFeatureProvider()
-                .getDownloadedFeatureMetricsCategory(mComponentName);
+        final int pageIdCategory = FeatureFactory.getFeatureFactory()
+                .getAccessibilityPageIdFeatureProvider().getCategory(mComponentName);
         ThreadUtils.getUiThreadHandler().post(() -> {
             RestrictedPreferenceHelper.putBasicExtras(
                     this, prefKey, getTitle(), intro, description, imageRes,
-                    htmlDescription, mComponentName, metricsCategory);
+                    htmlDescription, mComponentName, pageIdCategory);
             RestrictedPreferenceHelper.putServiceExtras(this, resolveInfo, mServiceEnabled);
             RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName);
             RestrictedPreferenceHelper.putTileServiceExtras(
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 57eb4d5..2c8247f 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -97,6 +97,7 @@
     static final String EXTRA_HTML_DESCRIPTION = "html_description";
     static final String EXTRA_TIME_FOR_LOGGING = "start_time_to_log_a11y_tool";
     static final String EXTRA_METRICS_CATEGORY = "metrics_category";
+    static final String EXTRA_FEEDBACK_CATEGORY = "feedback_category";
 
     // Timeout before we update the services if packages are added/removed
     // since the AccessibilityManagerService has to do that processing first
@@ -255,7 +256,7 @@
     public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
         if (getFeedbackManager().isAvailable()) {
             menu.add(Menu.NONE, MENU_ID_SEND_FEEDBACK, Menu.NONE,
-                    getPrefContext().getText(R.string.accessibility_send_feedback_title));
+                    R.string.accessibility_send_feedback_title);
         }
         super.onCreateOptionsMenu(menu, inflater);
     }
@@ -286,7 +287,7 @@
 
     private FeedbackManager getFeedbackManager() {
         if (mFeedbackManager == null) {
-            mFeedbackManager = new FeedbackManager(getActivity());
+            mFeedbackManager = new FeedbackManager(getActivity(), SettingsEnums.ACCESSIBILITY);
         }
         return mFeedbackManager;
     }
diff --git a/src/com/android/settings/accessibility/FeedbackManager.java b/src/com/android/settings/accessibility/FeedbackManager.java
index 52aefd2..dc4baa7 100644
--- a/src/com/android/settings/accessibility/FeedbackManager.java
+++ b/src/com/android/settings/accessibility/FeedbackManager.java
@@ -16,7 +16,6 @@
 package com.android.settings.accessibility;
 
 import android.app.Activity;
-import android.content.ComponentName;
 import android.content.Intent;
 import android.text.TextUtils;
 
@@ -46,23 +45,14 @@
      * Constructs a new FeedbackManager.
      *
      * @param activity The activity context. A WeakReference is used to prevent memory leaks.
+     * @param pageId The unique identifier of the page associated with the feedback.
      */
-    public FeedbackManager(@Nullable Activity activity) {
-        this(activity, /* componentName= */ null);
-    }
-
-    /**
-     * Constructs a new FeedbackManager.
-     *
-     * @param activity The activity context. A WeakReference is used to prevent memory leaks.
-     * @param componentName The component name associated with the feedback.
-     */
-    public FeedbackManager(@Nullable Activity activity, @Nullable ComponentName componentName) {
+    public FeedbackManager(@Nullable Activity activity, int pageId) {
         this(activity,
                 DeviceInfoUtils.getFeedbackReporterPackage(activity),
                 FeatureFactory.getFeatureFactory()
                         .getAccessibilityFeedbackFeatureProvider()
-                        .getCategory(componentName));
+                        .getCategory(pageId));
     }
 
     /**
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 013fdee..c6995b0 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -31,8 +31,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
@@ -60,6 +58,11 @@
     }
 
     @Override
+    public int getFeedbackCategory() {
+        return getArguments().getInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY);
+    }
+
+    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         // Init new preference to replace the switch preference instead.
@@ -115,13 +118,6 @@
         return mTileComponentName;
     }
 
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        // Do not call super. We don't want to see the "Help & feedback" option on this page so as
-        // not to confuse users who think they might be able to send feedback about a specific
-        // accessibility service from this page.
-    }
-
     // IMPORTANT: Refresh the info since there are dynamically changing capabilities.
     private AccessibilityShortcutInfo getAccessibilityShortcutInfo() {
         final List<AccessibilityShortcutInfo> infos = AccessibilityManager.getInstance(
diff --git a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
index 5c18be8..ae6239a 100644
--- a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
+++ b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
@@ -217,6 +217,7 @@
         extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, imageRes);
         extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription);
         extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory);
+        extras.putInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY, metricsCategory);
     }
 
     /**
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index 06bcdb7..a11ad46 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -39,8 +39,6 @@
 import android.text.BidiFormatter;
 import android.text.TextUtils;
 import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
 import android.view.accessibility.AccessibilityManager;
 import android.widget.CompoundButton;
 
@@ -76,10 +74,8 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        // Do not call super. We don't want to see the "Help & feedback" option on this page so as
-        // not to confuse users who think they might be able to send feedback about a specific
-        // accessibility service from this page.
+    public int getFeedbackCategory() {
+        return getArguments().getInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY);
     }
 
     @Override
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 9367251..66c32df 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -40,6 +40,9 @@
 import android.text.Html;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
@@ -48,6 +51,7 @@
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.ImageView;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -89,6 +93,7 @@
     // <img src="R.drawable.fileName"/>, a11y settings will get the resources successfully.
     private static final String IMG_PREFIX = "R.drawable.";
     private static final String DRAWABLE_FOLDER = "drawable";
+    static final int MENU_ID_SEND_FEEDBACK = 0;
 
     protected TopIntroPreference mTopIntroPreference;
     protected SettingsMainSwitchPreference mToggleServiceSwitchPreference;
@@ -102,6 +107,7 @@
     protected Intent mSettingsIntent;
     // The mComponentName maybe null, such as Magnify
     protected ComponentName mComponentName;
+    @Nullable private FeedbackManager mFeedbackManager;
     protected CharSequence mFeatureName;
     protected Uri mImageUri;
     protected CharSequence mHtmlDescription;
@@ -241,6 +247,24 @@
     }
 
     @Override
+    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
+        if (getFeedbackManager().isAvailable()) {
+            menu.add(Menu.NONE, MENU_ID_SEND_FEEDBACK, Menu.NONE,
+                    R.string.accessibility_send_feedback_title);
+        }
+        super.onCreateOptionsMenu(menu, inflater);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+        if (item.getItemId() == MENU_ID_SEND_FEEDBACK) {
+            getFeedbackManager().sendFeedback();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
     public int getDialogMetricsCategory(int dialogId) {
         switch (dialogId) {
             case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
@@ -739,4 +763,28 @@
                 super.onCreateRecyclerView(inflater, parent, savedInstanceState);
         return AccessibilityFragmentUtils.addCollectionInfoToAccessibilityDelegate(recyclerView);
     }
+
+    @VisibleForTesting
+    void setFeedbackManager(FeedbackManager feedbackManager) {
+        this.mFeedbackManager = feedbackManager;
+    }
+
+    private FeedbackManager getFeedbackManager() {
+        if (mFeedbackManager == null) {
+            mFeedbackManager = new FeedbackManager(getActivity(), getFeedbackCategory());
+        }
+        return mFeedbackManager;
+    }
+
+    /**
+     * Returns the category of the feedback page.
+     *
+     * <p>By default, this method returns {@link SettingsEnums#PAGE_UNKNOWN}. This indicates that
+     * the feedback category is unknown, and the absence of a feedback menu.
+     *
+     * @return The feedback category, which is {@link SettingsEnums#PAGE_UNKNOWN} by default.
+     */
+    protected int getFeedbackCategory() {
+        return SettingsEnums.PAGE_UNKNOWN;
+    }
 }
diff --git a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
index 10813a7..eb0c93b 100644
--- a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
@@ -80,6 +80,12 @@
     }
 
     @Override
+    public int getFeedbackCategory() {
+        // The feedback options should not be displayed on the setup wizard page.
+        return SettingsEnums.PAGE_UNKNOWN;
+    }
+
+    @Override
     public void onStop() {
         // Log the final choice in value if it's different from the previous value.
         if (mToggleServiceSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) {
diff --git a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
index 10796b5..14dc0bc 100644
--- a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
@@ -80,6 +80,12 @@
     }
 
     @Override
+    public int getFeedbackCategory() {
+        // The feedback options should not be displayed on the setup wizard page.
+        return SettingsEnums.PAGE_UNKNOWN;
+    }
+
+    @Override
     public void onStop() {
         // Log the final choice in value if it's different from the previous value.
         if (mToggleServiceSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) {
diff --git a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
index 826583d..ad1f823 100644
--- a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
+++ b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
@@ -95,8 +95,7 @@
                     userHandle)) {
                 if (RestrictedLockUtilsInternal.isPolicyEnforcedByAdvancedProtection(context,
                         DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, userHandle.getIdentifier())) {
-                    return context.getString(com.android.settingslib.widget.restricted
-                            .R.string.disabled_by_advanced_protection);
+                    return context.getString(com.android.settingslib.R.string.disabled);
                 } else {
                     return context.getString(
                             com.android.settingslib.widget.restricted.R.string.disabled_by_admin);
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index ef19709..83f23bd 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -107,7 +107,10 @@
     // intent will include this extra containing a bundle of the form:
     // "modality" -> consented (boolean).
     public static final String EXTRA_PARENTAL_CONSENT_STATUS = "consent_status";
-
+    // Whether the face enrollment should be launched first when there are multiple biometrics
+    // supported.
+    public static final String EXTRA_LAUNCH_FACE_ENROLL_FIRST =
+            "launch_face_enroll_first";
     private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials";
     private static final String SAVED_STATE_IS_SINGLE_ENROLLING =
             "is_single_enrolling";
@@ -130,6 +133,7 @@
     private boolean mIsFingerprintEnrollable = false;
     private boolean mParentalOptionsRequired = false;
     private boolean mSkipReturnToParent = false;
+    private boolean mLaunchFaceEnrollFirst = false;
     private Bundle mParentalOptions;
     @Nullable private Long mGkPwHandle;
     @Nullable private ParentalConsentHelper mParentalConsentHelper;
@@ -214,6 +218,7 @@
 
         mParentalOptionsRequired = intent.getBooleanExtra(EXTRA_REQUIRE_PARENTAL_CONSENT, false);
         mSkipReturnToParent = intent.getBooleanExtra(EXTRA_SKIP_RETURN_TO_PARENT, false);
+        mLaunchFaceEnrollFirst = intent.getBooleanExtra(EXTRA_LAUNCH_FACE_ENROLL_FIRST, false);
 
         // determine what can be enrolled
         final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
@@ -221,6 +226,7 @@
 
         Log.d(TAG, "parentalOptionsRequired: " + mParentalOptionsRequired
                 + ", skipReturnToParent: " + mSkipReturnToParent
+                + ", launchFaceEnrollFirst: " + mLaunchFaceEnrollFirst
                 + ", isSetupWizard: " + isSetupWizard
                 + ", isMultiSensor: " + isMultiSensor);
 
@@ -356,7 +362,8 @@
         } else if (canUseFace || canUseFingerprint) {
             if (mGkPwHandle == null) {
                 setOrConfirmCredentialsNow();
-            } else if (canUseFingerprint && mIsFingerprintEnrollable) {
+            } else if (canUseFingerprint && mIsFingerprintEnrollable
+                    && !(canUseFace && mIsFaceEnrollable && mLaunchFaceEnrollFirst)) {
                 launchFingerprintOnlyEnroll();
             } else if (canUseFace && mIsFaceEnrollable) {
                 launchFaceOnlyEnroll();
@@ -510,7 +517,8 @@
             int requestCode, int resultCode, Intent data) {
 
         Log.d(TAG, "handleOnActivityResultWhileEnrolling, request = " + requestCode + ""
-                + ", resultCode = " + resultCode);
+                + ", resultCode = " + resultCode + ", launchFaceEnrollFirst="
+                + mLaunchFaceEnrollFirst);
         switch (requestCode) {
             case REQUEST_HANDOFF_PARENT:
                 setResult(RESULT_OK, newResultIntent());
@@ -526,7 +534,8 @@
                     // SetupFingerprintEnrollIntroduction/FingerprintEnrollmentActivity
                     TransitionHelper.applyForwardTransition(this, TRANSITION_FADE_THROUGH);
                     updateGatekeeperPasswordHandle(data);
-                    if (mIsFingerprintEnrollable) {
+                    if (mIsFingerprintEnrollable
+                            && !(mIsFaceEnrollable && mLaunchFaceEnrollFirst)) {
                         launchFingerprintOnlyEnroll();
                     } else {
                         launchFaceOnlyEnroll();
@@ -548,7 +557,7 @@
                 }
                 if ((resultCode == BiometricEnrollBase.RESULT_SKIP
                         || resultCode == BiometricEnrollBase.RESULT_FINISHED)
-                        && mIsFaceEnrollable) {
+                        && mIsFaceEnrollable && !mLaunchFaceEnrollFirst) {
                     // Apply forward animation during the transition from
                     // SetupFingerprintEnroll*/FingerprintEnrollmentActivity to
                     // SetupFaceEnrollIntroduction
@@ -556,6 +565,9 @@
                     mIsPreviousEnrollmentCanceled =
                             resultCode != BiometricEnrollBase.RESULT_FINISHED;
                     launchFaceOnlyEnroll();
+                } else if (resultCode == Activity.RESULT_CANCELED && mIsFaceEnrollable
+                        && mLaunchFaceEnrollFirst) {
+                    launchFaceOnlyEnroll();
                 } else {
                     notifySafetyIssueActionLaunchedIfNeeded(resultCode);
                     finishOrLaunchHandToParent(resultCode);
@@ -563,7 +575,14 @@
                 break;
             case REQUEST_SINGLE_ENROLL_FACE:
                 mIsSingleEnrolling = false;
-                if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable) {
+                if ((resultCode == BiometricEnrollBase.RESULT_SKIP
+                        || resultCode == BiometricEnrollBase.RESULT_FINISHED)
+                        && mIsFingerprintEnrollable && mLaunchFaceEnrollFirst) {
+                    mIsPreviousEnrollmentCanceled =
+                            resultCode != BiometricEnrollBase.RESULT_FINISHED;
+                    launchFingerprintOnlyEnroll();
+                } else if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable
+                        && !mLaunchFaceEnrollFirst) {
                     mIsPreviousEnrollmentCanceled = true;
                     launchFingerprintOnlyEnroll();
                 } else {
diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java
index db6abc3..21b0fa0 100644
--- a/src/com/android/settings/biometrics/BiometricUtils.java
+++ b/src/com/android/settings/biometrics/BiometricUtils.java
@@ -43,6 +43,7 @@
 import com.android.internal.widget.VerifyCredentialResponse;
 import com.android.settings.R;
 import com.android.settings.SetupWizardUtils;
+import com.android.settings.biometrics.face.FaceEnroll;
 import com.android.settings.biometrics.fingerprint.FingerprintEnroll;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
 import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
@@ -282,9 +283,7 @@
      */
     public static Intent getFaceIntroIntent(@NonNull Context context,
             @NonNull Intent activityIntent) {
-        final Intent intent = new Intent(context,
-                FeatureFactory.getFeatureFactory().getFaceFeatureProvider()
-                        .getEnrollActivityClassProvider().getNext());
+        final Intent intent = new Intent(context, FaceEnroll.class);
         WizardManagerHelper.copyWizardManagerExtras(activityIntent, intent);
         return intent;
     }
diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
index 700b601..a145913 100644
--- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
@@ -25,11 +25,11 @@
 
 import com.android.settings.R;
 import com.android.settings.core.SliderPreferenceController;
-import com.android.settings.widget.SeekBarPreference;
+import com.android.settingslib.widget.SliderPreference;
 
 public class NightDisplayIntensityPreferenceController extends SliderPreferenceController {
 
-    private ColorDisplayManager mColorDisplayManager;
+    private final ColorDisplayManager mColorDisplayManager;
 
     public NightDisplayIntensityPreferenceController(Context context, String key) {
         super(context, key);
@@ -64,11 +64,11 @@
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        final SeekBarPreference preference = screen.findPreference(getPreferenceKey());
-        preference.setContinuousUpdates(true);
+        SliderPreference preference = screen.findPreference(getPreferenceKey());
+        preference.setUpdatesContinuously(true);
         preference.setMax(getMax());
         preference.setMin(getMin());
-        preference.setHapticFeedbackMode(SeekBarPreference.HAPTIC_FEEDBACK_MODE_ON_ENDS);
+        // TODO(b/394828723) add haptic feedback
     }
 
     @Override
diff --git a/src/com/android/settings/localepicker/LocaleDialogFragment.java b/src/com/android/settings/localepicker/LocaleDialogFragment.java
index a3a4b8f..5c7958a 100644
--- a/src/com/android/settings/localepicker/LocaleDialogFragment.java
+++ b/src/com/android/settings/localepicker/LocaleDialogFragment.java
@@ -26,11 +26,6 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
 import android.window.OnBackInvokedCallback;
 import android.window.OnBackInvokedDispatcher;
 
@@ -57,6 +52,7 @@
     static final String ARG_DIALOG_TYPE = "arg_dialog_type";
     static final String ARG_TARGET_LOCALE = "arg_target_locale";
     static final String ARG_SHOW_DIALOG = "arg_show_dialog";
+    static final String ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED = "arg_show_dialog_for_not_translated";
 
     private boolean mShouldKeepDialog;
     private OnBackInvokedDispatcher mBackDispatcher;
@@ -185,6 +181,7 @@
         private final int mDialogType;
         private final LocaleStore.LocaleInfo mLocaleInfo;
         private final MetricsFeatureProvider mMetricsFeatureProvider;
+        private final boolean mShowDialogForNotTranslated;
 
         private LocaleListEditor mParent;
 
@@ -194,6 +191,7 @@
             mContext = context;
             Bundle arguments = dialogFragment.getArguments();
             mDialogType = arguments.getInt(ARG_DIALOG_TYPE);
+            mShowDialogForNotTranslated = arguments.getBoolean(ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED);
             mLocaleInfo = (LocaleStore.LocaleInfo) arguments.getSerializable(ARG_TARGET_LOCALE);
             mMetricsFeatureProvider =
                     FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
@@ -215,6 +213,7 @@
                 bundle.putInt(ARG_DIALOG_TYPE, mDialogType);
                 bundle.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, mLocaleInfo);
                 intent.putExtras(bundle);
+                intent.putExtra(ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED, mShowDialogForNotTranslated);
                 mParent.onActivityResult(mDialogType, result, intent);
                 mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE,
                         changed);
diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
index 907fe7b..af8b668 100644
--- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
+++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
@@ -364,12 +364,25 @@
     }
 
     public void notifyListChanged(LocaleStore.LocaleInfo localeInfo) {
-        if (!localeInfo.getLocale().equals(mCacheItemList.get(0).getLocale())) {
+        if (listChanged()) {
             mFeedItemList = new ArrayList<>(mCacheItemList);
             notifyDataSetChanged();
         }
     }
 
+    private boolean listChanged() {
+        if (mFeedItemList.size() == mCacheItemList.size()) {
+            for (int i = 0; i < mFeedItemList.size(); i++) {
+                if (!mFeedItemList.get(i).getLocale().equals(mCacheItemList.get(i).getLocale())) {
+                    return true;
+                }
+            }
+            return false;
+        } else {
+            return true;
+        }
+    }
+
     public void setCacheItemList() {
         mCacheItemList = new ArrayList<>(mFeedItemList);
     }
diff --git a/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java b/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java
index a7ebe32..df0af63 100644
--- a/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java
+++ b/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java
@@ -151,7 +151,7 @@
         }
 
         if (result) {
-            mLocaleListEditor.showConfirmDialog(false, mAdapter.getFeedItemList().get(0));
+            mLocaleListEditor.showConfirmDialog(mAdapter.getFeedItemList().get(0), null);
         }
         return result;
     }
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index b1f005a..e2da851 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -44,6 +44,7 @@
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.FragmentManager;
 import androidx.preference.Preference;
@@ -235,7 +236,9 @@
             localeInfo = mAdapter.getFeedItemList().get(0);
             if (resultCode == Activity.RESULT_OK) {
                 mAdapter.doTheUpdate();
-                if (!localeInfo.isTranslated()) {
+                boolean showNotTranslatedDialog = data.getBooleanExtra(
+                        LocaleDialogFragment.ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED, true);
+                if (showNotTranslatedDialog && !localeInfo.isTranslated()) {
                     Bundle args = new Bundle();
                     args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE,
                             LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE);
@@ -428,13 +431,10 @@
                             // to remove.
                             mRemoveMode = false;
                             mShowingRemoveDialog = false;
-                            LocaleStore.LocaleInfo firstLocale =
-                                    mAdapter.getFeedItemList().get(0);
+                            Locale defaultBeforeRemoval = Locale.getDefault();
                             mAdapter.removeChecked();
-                            boolean isFirstRemoved =
-                                    firstLocale != mAdapter.getFeedItemList().get(0);
-                            showConfirmDialog(isFirstRemoved, isFirstRemoved ? firstLocale
-                                    : mAdapter.getFeedItemList().get(0));
+                            showConfirmDialog(mAdapter.getFeedItemList().get(0),
+                                    defaultBeforeRemoval);
                             setRemoveMode(false);
                             dialogHelper.getDialog().dismiss();
                         })
@@ -520,27 +520,73 @@
     public boolean onTouch(View v, MotionEvent event) {
         if (event.getAction() == MotionEvent.ACTION_UP
                 || event.getAction() == MotionEvent.ACTION_CANCEL) {
-            showConfirmDialog(false, mAdapter.getFeedItemList().get(0));
+            showConfirmDialog(mAdapter.getFeedItemList().get(0), null);
         }
         return false;
     }
 
-    public void showConfirmDialog(boolean isFirstRemoved, LocaleStore.LocaleInfo localeInfo) {
+    protected void showConfirmDialog(LocaleStore.LocaleInfo localeInfo,
+            @Nullable Locale defaultLocaleBeforeRemoval) {
         Locale currentSystemLocale = LocalePicker.getLocales().get(0);
         if (!localeInfo.getLocale().equals(currentSystemLocale)) {
-            final LocaleDialogFragment localeDialogFragment =
-                    LocaleDialogFragment.newInstance();
-            Bundle args = new Bundle();
-            args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
-            args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE,
-                    isFirstRemoved ? LocaleStore.getLocaleInfo(currentSystemLocale) : localeInfo);
-            localeDialogFragment.setArguments(args);
-            localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT);
+            displayDialogFragment(localeInfo, true);
         } else {
-            mAdapter.doTheUpdate();
+            if (!localeInfo.isTranslated()) {
+                if (defaultLocaleBeforeRemoval == null) {
+                    showDialogDueToDragAndDrop();
+                } else {
+                    showDialogDueToRemoval(defaultLocaleBeforeRemoval);
+                }
+            } else {
+                mAdapter.doTheUpdate();
+            }
         }
     }
 
+    private void showDialogDueToDragAndDrop() {
+        LocaleStore.LocaleInfo newLocale = mAdapter.getFeedItemList().stream().filter(
+                i -> i.isTranslated()).findFirst().orElse(null);
+        if (newLocale == null) {
+            return;
+        }
+        LocaleStore.LocaleInfo oldLocale = null;
+        final LocaleList localeList = LocalePicker.getLocales();
+        for (int i = 0; i < localeList.size(); i++) {
+            LocaleStore.LocaleInfo temp = LocaleStore.getLocaleInfo(localeList.get(i));
+            if (temp.isTranslated()) {
+                oldLocale = temp;
+                break;
+            }
+        }
+        if (oldLocale != null && !newLocale.getLocale().equals(
+                oldLocale.getLocale())) {
+            displayDialogFragment(newLocale, false);
+        }
+    }
+
+    private void showDialogDueToRemoval(Locale preDefault) {
+        if (preDefault == null) {
+            return;
+        }
+        LocaleStore.LocaleInfo currentDefault = mAdapter.getFeedItemList().stream().filter(
+                i -> i.isTranslated()).findFirst().orElse(null);
+        if (currentDefault != null && !preDefault.equals(currentDefault.getLocale())) {
+            displayDialogFragment(currentDefault, false);
+        }
+    }
+
+    private void displayDialogFragment(LocaleStore.LocaleInfo localeInfo,
+            boolean showDialogForNotTranslated) {
+        final LocaleDialogFragment localeDialogFragment = LocaleDialogFragment.newInstance();
+        Bundle args = new Bundle();
+        args.putBoolean(LocaleDialogFragment.ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED,
+                showDialogForNotTranslated);
+        args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
+        args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, localeInfo);
+        localeDialogFragment.setArguments(args);
+        localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT);
+    }
+
     // Hide the "Remove" menu if there is only one locale in the list, show it otherwise
     // This is called when the menu is first created, and then one add / remove locale
     private void updateVisibilityOfRemoveMenu() {
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 46aa19b..7e04f0d 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -17,7 +17,7 @@
 
 import android.content.Context
 import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
 import com.android.settings.accounts.AccountFeatureProvider
 import com.android.settings.applications.ApplicationFeatureProvider
@@ -145,9 +145,9 @@
     abstract val accessibilitySearchFeatureProvider: AccessibilitySearchFeatureProvider
 
     /**
-     * Retrieves implementation for Accessibility metrics category feature.
+     * Retrieves implementation for Accessibility page id category feature.
      */
-    abstract val accessibilityMetricsFeatureProvider: AccessibilityMetricsFeatureProvider
+    abstract val accessibilityPageIdFeatureProvider: AccessibilityPageIdFeatureProvider
 
     /**
      * Retrieves implementation for advanced vpn feature.
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 08abf2b..4949c3f 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -22,8 +22,8 @@
 import android.os.UserManager
 import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider
 import com.android.settings.accessibility.AccessibilityFeedbackFeatureProviderImpl
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProviderImpl
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProviderImpl
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
 import com.android.settings.accessibility.AccessibilitySearchFeatureProviderImpl
 import com.android.settings.accounts.AccountFeatureProvider
@@ -174,8 +174,8 @@
         AccessibilitySearchFeatureProviderImpl()
     }
 
-    override val accessibilityMetricsFeatureProvider: AccessibilityMetricsFeatureProvider by lazy {
-        AccessibilityMetricsFeatureProviderImpl()
+    override val accessibilityPageIdFeatureProvider: AccessibilityPageIdFeatureProvider by lazy {
+        AccessibilityPageIdFeatureProviderImpl()
     }
 
     override val advancedVpnFeatureProvider by lazy { AdvancedVpnFeatureProviderImpl() }
diff --git a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
index eb28dfb..267b5bc 100644
--- a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
+++ b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
@@ -23,6 +23,7 @@
 import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent;
 import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra;
 
+import static com.android.settings.biometrics.BiometricEnrollActivity.EXTRA_LAUNCH_FACE_ENROLL_FIRST;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE;
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT;
@@ -39,6 +40,7 @@
 import android.hardware.face.FaceSensorPropertiesInternal;
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.os.Bundle;
 import android.os.UserHandle;
 import android.provider.Settings;
 
@@ -145,7 +147,7 @@
         assumeTrue(mHasFace || mHasFingerprint);
 
         setPin();
-        final Intent intent = getIntent(true /* useInternal */);
+        final Intent intent = getIntent(true /* useInternal */, null);
         LockPatternChecker.verifyCredential(new LockPatternUtils(mContext),
                 LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(),
                 LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> {
@@ -163,6 +165,26 @@
     }
 
     @Test
+    public void launchWithPinAndPwHandle_confirmsPin_firstEnrollmentIsFace() throws Exception {
+        assumeTrue(mHasFace && mHasFingerprint);
+
+        setPin();
+        final Intent intent = getFaceEnrollFirstIntent();
+        LockPatternChecker.verifyCredential(new LockPatternUtils(mContext),
+                LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(),
+                LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> {
+                    assertThat(response.containsGatekeeperPasswordHandle()).isTrue();
+                    intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
+                            response.getGatekeeperPasswordHandle());
+                }).get();
+
+        try (ActivityScenario<BiometricEnrollActivity> scenario =
+                     ActivityScenario.launch(intent)) {
+            intended(hasComponent(FaceEnroll.class.getName()));
+        }
+    }
+
+    @Test
     public void launchWithStrongBiometricAllowed_doNotEnrollWeak() throws Exception {
         assumeTrue(mHasFace || mHasFingerprint);
 
@@ -184,13 +206,22 @@
     }
 
     private Intent getIntent() {
-        return getIntent(false /* useInternal */);
+        return getIntent(false /* useInternal */, null);
     }
 
-    private Intent getIntent(boolean useInternal) {
+    private Intent getFaceEnrollFirstIntent() {
+        final Bundle bundle = new Bundle();
+        bundle.putBoolean(EXTRA_LAUNCH_FACE_ENROLL_FIRST, true);
+        return getIntent(true /* useInternal */, bundle);
+    }
+
+    private Intent getIntent(boolean useInternal, Bundle bundle) {
         final Intent intent = new Intent(mContext, useInternal
                 ? BiometricEnrollActivity.InternalActivity.class : BiometricEnrollActivity.class);
         intent.setAction(ACTION_BIOMETRIC_ENROLL);
+        if (bundle != null && !bundle.isEmpty()) {
+            intent.putExtras(bundle);
+        }
         return intent;
     }
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index e590a80..6710da9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -22,7 +22,6 @@
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -458,12 +457,10 @@
         setupFragment();
         mFragment.setFeedbackManager(
                 new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
-        when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
 
         mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
 
-        verify(mMenu).add(anyInt(), eq(AccessibilitySettings.MENU_ID_SEND_FEEDBACK),
-                anyInt(), eq(mContext.getText(R.string.accessibility_send_feedback_title)));
+        verify(mMenu).add(anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     @Test
@@ -472,12 +469,10 @@
         setupFragment();
         mFragment.setFeedbackManager(
                 new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
-        when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
 
         mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
 
-        verify(mMenu, never()).add(anyInt(), eq(AccessibilitySettings.MENU_ID_SEND_FEEDBACK),
-                anyInt(), eq(mContext.getText(R.string.accessibility_send_feedback_title)));
+        verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), anyInt());
     }
 
     @Test
@@ -486,8 +481,6 @@
         setupFragment();
         mFragment.setFeedbackManager(
                 new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
-        when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
-        mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
         when(mMenuItem.getItemId()).thenReturn(AccessibilitySettings.MENU_ID_SEND_FEEDBACK);
 
         mFragment.onOptionsItemSelected(mMenuItem);
@@ -502,8 +495,6 @@
         setupFragment();
         mFragment.setFeedbackManager(
                 new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
-        when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
-        mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
         when(mMenuItem.getItemId()).thenReturn(AccessibilitySettings.MENU_ID_SEND_FEEDBACK);
 
         mFragment.onOptionsItemSelected(mMenuItem);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index 8f9d2e1..571075c 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -23,9 +23,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -37,10 +40,13 @@
 import android.content.pm.PackageManager;
 import android.icu.text.CaseMap;
 import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
 import android.platform.test.annotations.EnableFlags;
 import android.platform.test.flag.junit.SetFlagsRule;
 import android.provider.Settings;
 import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
@@ -66,8 +72,9 @@
 import org.junit.runner.RunWith;
 import org.mockito.Answers;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
@@ -84,6 +91,8 @@
 })
 public class ToggleFeaturePreferenceFragmentTest {
     @Rule
+    public final MockitoRule mocks = MockitoJUnit.rule();
+    @Rule
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
@@ -96,6 +105,7 @@
             PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME);
     private static final String PLACEHOLDER_TILE_TOOLTIP_CONTENT =
             PLACEHOLDER_PACKAGE_NAME + "tooltip_content";
+    private static final String PLACEHOLDER_CATEGORY = "category";
     private static final String PLACEHOLDER_DIALOG_TITLE = "title";
     private static final String DEFAULT_SUMMARY = "default summary";
     private static final String DEFAULT_DESCRIPTION = "default description";
@@ -120,10 +130,13 @@
     private ContentResolver mContentResolver;
     @Mock
     private PackageManager mPackageManager;
+    @Mock
+    private Menu mMenu;
+    @Mock
+    private MenuItem mMenuItem;
 
     @Before
     public void setUpTestFragment() {
-        MockitoAnnotations.initMocks(this);
         mShadowAccessibilityManager = Shadow.extract(
                 mContext.getSystemService(AccessibilityManager.class));
 
@@ -170,6 +183,61 @@
     }
 
     @Test
+    @EnableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+    public void onCreateOptionsMenu_enableLowVisionGenericFeedback_shouldAddSendFeedbackMenu() {
+        mFragment.setFeedbackManager(
+                new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+
+        mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
+
+        verify(mMenu).add(anyInt(), eq(ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK),
+                anyInt(), eq(R.string.accessibility_send_feedback_title));
+    }
+
+    @Test
+    @DisableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+    public void onCreateOptionsMenu_disableLowVisionGenericFeedback_shouldNotAddSendFeedbackMenu() {
+        mFragment.setFeedbackManager(
+                new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+
+        mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
+
+        verify(mMenu, never()).add(anyInt(),
+                eq(ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK), anyInt(),
+                        eq(R.string.accessibility_send_feedback_title));
+    }
+
+    @Test
+    @EnableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+    public void onOptionsItemSelected_enableLowVisionGenericFeedback_shouldStartSendFeedback() {
+        mFragment.setFeedbackManager(
+                new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+        when(mMenuItem.getItemId()).thenReturn(
+                ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK);
+
+        mFragment.onOptionsItemSelected(mMenuItem);
+
+        verify(mActivity).startActivityForResult(
+                argThat(intent -> intent != null
+                        && Intent.ACTION_BUG_REPORT.equals(intent.getAction())), anyInt());
+    }
+
+    @Test
+    @DisableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+    public void onOptionsItemSelected_disableLowVisionGenericFeedback_shouldNotStartSendFeedback() {
+        mFragment.setFeedbackManager(
+                new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+        when(mMenuItem.getItemId()).thenReturn(
+                ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK);
+
+        mFragment.onOptionsItemSelected(mMenuItem);
+
+        verify(mActivity, never()).startActivityForResult(
+                argThat(intent -> intent != null
+                        && Intent.ACTION_BUG_REPORT.equals(intent.getAction())), anyInt());
+    }
+
+    @Test
     public void updateShortcutPreferenceData_assignDefaultValueToVariable() {
         mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
 
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java
index 65c9caf..7149d4f 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java
@@ -333,7 +333,7 @@
 
     @RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_FEATURE_DISABLE_INSTALL_UNKNOWN_SOURCES)
     @Test
-    public void getPreferenceSummary_restrictedGlobally_adminString() {
+    public void getPreferenceSummary_restrictedGloballyByAdmin_adminString() {
         final EnforcingAdmin nonAdvancedProtectionEnforcingAdmin = new EnforcingAdmin("test.pkg",
                 UnknownAuthority.UNKNOWN_AUTHORITY, mUserHandle, new ComponentName("", ""));
 
@@ -353,7 +353,7 @@
 
     @RequiresFlagsEnabled(Flags.FLAG_AAPM_FEATURE_DISABLE_INSTALL_UNKNOWN_SOURCES)
     @Test
-    public void getPreferenceSummary_restrictedGlobally_advancedProtectionString() {
+    public void getPreferenceSummary_restrictedGloballyByAdvancedProtection_disabledString() {
         final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin("test.pkg",
                 new UnknownAuthority(ADVANCED_PROTECTION_SYSTEM_ENTITY), mUserHandle,
                 new ComponentName("", ""));
@@ -363,12 +363,10 @@
                         advancedProtectionEnforcingAdmin);
         when(mUserManager.hasUserRestrictionForUser(DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY,
                 mUserHandle)).thenReturn(true);
-        when(mContext.getString(
-                com.android.settingslib.widget.restricted.R.string.disabled_by_advanced_protection))
-                .thenReturn("disabled_by_advanced_protection");
+        when(mContext.getString(com.android.settingslib.R.string.disabled)).thenReturn("disabled");
 
         CharSequence summary = ExternalSourcesDetails.getPreferenceSummary(mContext, mAppEntry);
 
-        assertEquals("disabled_by_advanced_protection", summary.toString());
+        assertEquals("disabled", summary.toString());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
index 4272afe..22d39e3 100644
--- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
@@ -36,7 +36,6 @@
 import android.app.Dialog;
 import android.app.IActivityManager;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -100,6 +99,8 @@
     public final MockitoRule mMockitoRule = MockitoJUnit.rule();
 
     private static final String ARG_DIALOG_TYPE = "arg_dialog_type";
+    private static final String
+            ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED = "arg_show_dialog_for_not_translated";
     private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default";
     private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale";
     private static final String TAG_DIALOG_ADD_SYSTEM_LOCALE = "dialog_add_system_locale";
@@ -123,6 +124,10 @@
     @Mock
     private LocaleStore.LocaleInfo mLocaleInfo;
     @Mock
+    private LocaleStore.LocaleInfo mLocaleInfo1;
+    @Mock
+    private LocaleStore.LocaleInfo mLocaleInfo2;
+    @Mock
     private FragmentManager mFragmentManager;
     @Mock
     private FragmentTransaction mFragmentTransaction;
@@ -270,7 +275,7 @@
     public void showConfirmDialog_systemLocaleSelected_shouldShowLocaleChangeDialog()
             throws Exception {
         //pre-condition
-        setUpLocaleConditions();
+        setUpLocaleConditions(true);
         final Configuration config = new Configuration();
         config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US")));
         when(mActivityService.getConfiguration()).thenReturn(config);
@@ -300,6 +305,41 @@
     }
 
     @Test
+    public void showConfirmDialog_2ndLocaleSelected_shouldShowLocaleChangeDialog()
+            throws Exception {
+        //pre-condition
+        Locale.setDefault(Locale.forLanguageTag("en-US"));
+        setUpLocaleConditions2();
+        final Configuration config = new Configuration();
+        config.setLocales((LocaleList.forLanguageTags("blo-BJ,en-US,zh-TW")));
+        when(mActivityService.getConfiguration()).thenReturn(config);
+        when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
+        when(mAdapter.getCheckedCount()).thenReturn(1);
+        when(mAdapter.getItemCount()).thenReturn(3);
+        when(mAdapter.isFirstLocaleChecked()).thenReturn(false);
+        ReflectionHelpers.setField(mLocaleListEditor, "mRemoveMode", true);
+        ReflectionHelpers.setField(mLocaleListEditor, "mShowingRemoveDialog", true);
+
+        //launch the first dialog
+        mLocaleListEditor.showRemoveLocaleWarningDialog();
+
+        final Dialog dialog = ShadowDialog.getLatestDialog();
+
+        assertThat(dialog).isNotNull();
+
+        // click the remove button
+        dialog.findViewById(R.id.button_ok).performClick();
+        ShadowLooper.idleMainLooper();
+
+        assertThat(dialog.isShowing()).isFalse();
+
+        // check the second dialog is showing
+        verify(mFragmentTransaction).add(any(LocaleDialogFragment.class),
+                eq(TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT));
+    }
+
+
+    @Test
     public void mayAppendUnicodeTags_appendUnicodeTags_success() {
         LocaleStore.LocaleInfo localeInfo = LocaleStore.fromLocale(Locale.forLanguageTag("en-US"));
 
@@ -315,7 +355,8 @@
         Bundle bundle = new Bundle();
         bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
         mIntent.putExtras(bundle);
-        setUpLocaleConditions();
+        mIntent.putExtra(ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED, true);
+        setUpLocaleConditions(false);
         mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_OK,
                 mIntent);
 
@@ -328,7 +369,7 @@
         Bundle bundle = new Bundle();
         bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
         mIntent.putExtras(bundle);
-        setUpLocaleConditions();
+        setUpLocaleConditions(true);
         mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_CANCELED,
                 mIntent);
 
@@ -338,7 +379,7 @@
     @Test
     public void onTouch_dragDifferentLocaleToTop_showConfirmDialog() throws Exception {
         MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
-        setUpLocaleConditions();
+        setUpLocaleConditions(true);
         final Configuration config = new Configuration();
         config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US")));
         when(mActivityService.getConfiguration()).thenReturn(config);
@@ -352,7 +393,7 @@
     @Test
     public void onTouch_dragSameLocaleToTop_updateAdapter() throws Exception {
         MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
-        setUpLocaleConditions();
+        setUpLocaleConditions(true);
         final Configuration config = new Configuration();
         config.setLocales((LocaleList.forLanguageTags("en-US,zh-TW")));
         when(mActivityService.getConfiguration()).thenReturn(config);
@@ -490,12 +531,26 @@
         verify(mAdapter).setCheckBoxDescription(any(LocaleDragCell.class), any(), anyBoolean());
     }
 
-    private void setUpLocaleConditions() {
+    private void setUpLocaleConditions(boolean isTranslated) {
         ShadowActivityManager.setService(mActivityService);
         mLocaleList = new ArrayList<>();
         mLocaleList.add(mLocaleInfo);
         when(mLocaleInfo.getFullNameNative()).thenReturn("English");
         when(mLocaleInfo.getLocale()).thenReturn(LocaleList.forLanguageTags("en-US").get(0));
+        when(mLocaleInfo.isTranslated()).thenReturn(isTranslated);
+        when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
+    }
+
+    private void setUpLocaleConditions2() {
+        ShadowActivityManager.setService(mActivityService);
+        mLocaleList = new ArrayList<>();
+        mLocaleList.add(mLocaleInfo);
+        mLocaleList.add(mLocaleInfo1);
+        mLocaleList.add(mLocaleInfo2);
+        when(mLocaleInfo.getLocale()).thenReturn(Locale.forLanguageTag("blo-BJ"));
+        when(mLocaleInfo.isTranslated()).thenReturn(false);
+        when(mLocaleInfo2.getLocale()).thenReturn(Locale.forLanguageTag("zh-TW"));
+        when(mLocaleInfo2.isTranslated()).thenReturn(true);
         when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
     }
 }
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index c5d4c36..e002de1 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -20,7 +20,7 @@
 import android.content.Context;
 
 import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider;
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider;
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProvider;
@@ -94,7 +94,7 @@
     public WifiTrackerLibProvider wifiTrackerLibProvider;
     public SecuritySettingsFeatureProvider securitySettingsFeatureProvider;
     public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
-    public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
+    public AccessibilityPageIdFeatureProvider mAccessibilityPageIdFeatureProvider;
     public AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider;
     public WifiFeatureProvider mWifiFeatureProvider;
     public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider;
@@ -145,7 +145,7 @@
         wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
         securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
         mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
-        mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class);
+        mAccessibilityPageIdFeatureProvider = mock(AccessibilityPageIdFeatureProvider.class);
         mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class);
         mWifiFeatureProvider = mock(WifiFeatureProvider.class);
         mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class);
@@ -294,8 +294,8 @@
     }
 
     @Override
-    public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
-        return mAccessibilityMetricsFeatureProvider;
+    public AccessibilityPageIdFeatureProvider getAccessibilityPageIdFeatureProvider() {
+        return mAccessibilityPageIdFeatureProvider;
     }
 
     @Override
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 56dd444..7b1bdc0 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -18,7 +18,7 @@
 
 import android.content.Context
 import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
 import com.android.settings.accounts.AccountFeatureProvider
 import com.android.settings.applications.ApplicationFeatureProvider
@@ -130,7 +130,7 @@
         get() = TODO("Not yet implemented")
     override val accessibilitySearchFeatureProvider: AccessibilitySearchFeatureProvider
         get() = TODO("Not yet implemented")
-    override val accessibilityMetricsFeatureProvider: AccessibilityMetricsFeatureProvider
+    override val accessibilityPageIdFeatureProvider: AccessibilityPageIdFeatureProvider
         get() = TODO("Not yet implemented")
     override val advancedVpnFeatureProvider: AdvancedVpnFeatureProvider
         get() = TODO("Not yet implemented")
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index d77d7a4..eda0aeb 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -20,7 +20,7 @@
 import android.content.Context;
 
 import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider;
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider;
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProvider;
@@ -93,7 +93,7 @@
     public WifiTrackerLibProvider wifiTrackerLibProvider;
     public SecuritySettingsFeatureProvider securitySettingsFeatureProvider;
     public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
-    public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
+    public AccessibilityPageIdFeatureProvider mAccessibilityPageIdFeatureProvider;
     public AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider;
     public WifiFeatureProvider mWifiFeatureProvider;
     public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider;
@@ -146,7 +146,7 @@
         wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
         securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
         mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
-        mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class);
+        mAccessibilityPageIdFeatureProvider = mock(AccessibilityPageIdFeatureProvider.class);
         mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class);
         mWifiFeatureProvider = mock(WifiFeatureProvider.class);
         mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class);
@@ -295,8 +295,8 @@
     }
 
     @Override
-    public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
-        return mAccessibilityMetricsFeatureProvider;
+    public AccessibilityPageIdFeatureProvider getAccessibilityPageIdFeatureProvider() {
+        return mAccessibilityPageIdFeatureProvider;
     }
 
     @Override