Merge "Remove usage of PER_PROFILE_IME_ENABLED property in settings"
diff --git a/OWNERS b/OWNERS
index ccf8e81..2d421ac 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,21 +2,18 @@
 pixel-sw-exp-reviews+gerrit@google.com
 
 # People who can approve changes for submission
-asapperstein@google.com
-asargent@google.com
-dehboxturtle@google.com
-dhnishi@google.com
+chiujason@google.com
 edgarwang@google.com
 emilychuang@google.com
-jackqdyulei@google.com
-lindatseng@google.com
-mfritze@google.com
+millchen@google.com
 rafftsai@google.com
+stanleytfwang@google.com
+sunnyshao@google.com
 tmfang@google.com
-zhfan@google.com
+yantingyang@google.com
 
 # Emergency approvers in case the above are not available
-miket@google.com
+zhfan@google.com
 
 # Exempt resource files (because they are in a flat directory and too hard to manage via OWNERS)
 per-file *.xml=*
diff --git a/res/drawable/tile_icon_sensors_off.xml b/res/drawable/tile_icon_sensors_off.xml
index 890fa83..b9b3500 100644
--- a/res/drawable/tile_icon_sensors_off.xml
+++ b/res/drawable/tile_icon_sensors_off.xml
@@ -18,7 +18,8 @@
         android:width="24dp"
         android:height="24dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+        android:viewportHeight="24.0"
+        android:tint="?android:attr/colorControlNormal">
     <path
         android:pathData="M21.966,2 L2,22"
         android:strokeLineCap="round"
diff --git a/res/layout/edit_user_info_dialog_content.xml b/res/layout/edit_user_info_dialog_content.xml
index 4d76e13..30ae1d8 100644
--- a/res/layout/edit_user_info_dialog_content.xml
+++ b/res/layout/edit_user_info_dialog_content.xml
@@ -44,6 +44,7 @@
         android:labelFor="@id/user_photo"
         android:inputType="text|textCapWords"
         android:selectAllOnFocus="true"
-        android:hint="@string/user_nickname"/>
+        android:hint="@string/user_nickname"
+        android:maxLength="100"/>
 
 </LinearLayout>
diff --git a/res/layout/wifi_dpp_add_device_fragment.xml b/res/layout/wifi_dpp_add_device_fragment.xml
index b7232f6..8ad6391 100644
--- a/res/layout/wifi_dpp_add_device_fragment.xml
+++ b/res/layout/wifi_dpp_add_device_fragment.xml
@@ -35,7 +35,8 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="?attr/sudMarginSides"
             android:layout_marginEnd="?attr/sudMarginSides"
-            android:textAlignment="center"/>
+            android:textAlignment="center"
+            android:accessibilityLiveRegion="polite"/>
 
         <LinearLayout
             android:layout_width="match_parent"
diff --git a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml
index 397520b..534f32e 100644
--- a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml
+++ b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml
@@ -35,7 +35,8 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="?attr/sudMarginSides"
             android:layout_marginEnd="?attr/sudMarginSides"
-            android:textAlignment="center"/>
+            android:textAlignment="center"
+            android:accessibilityLiveRegion="polite"/>
 
         <LinearLayout android:id="@+id/wifi_network_list_container"
             android:layout_width="match_parent"
diff --git a/res/layout/wifi_dpp_qrcode_generator_fragment.xml b/res/layout/wifi_dpp_qrcode_generator_fragment.xml
index 2512f06..1f8b37c 100644
--- a/res/layout/wifi_dpp_qrcode_generator_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_generator_fragment.xml
@@ -35,7 +35,8 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="?attr/sudMarginSides"
             android:layout_marginEnd="?attr/sudMarginSides"
-            android:textAlignment="center"/>
+            android:textAlignment="center"
+            android:accessibilityLiveRegion="polite"/>
 
         <LinearLayout
             android:layout_width="match_parent"
diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
index c9f41ac..3d1e99b 100644
--- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
@@ -35,7 +35,8 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="?attr/sudMarginSides"
             android:layout_marginEnd="?attr/sudMarginSides"
-            android:textAlignment="center"/>
+            android:textAlignment="center"
+            android:accessibilityLiveRegion="polite"/>
 
         <LinearLayout
             android:layout_width="match_parent"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index db2231f..cacb882 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4950,6 +4950,8 @@
     <string name="accessibility_daltonizer_master_switch_title">Use color correction</string>
     <!-- Used in the Captions settings screen to control turning on/off the feature entirely -->
     <string name="accessibility_caption_master_switch_title">Use captions</string>
+    <!-- Used in the Captions preference to tell users that the setting doesn't support all apps. [CHAR LIMIT=NONE] -->
+    <string name="accessibility_caption_preference_summary">Not all apps support this setting.</string>
 
     <!-- Button text for the accessibility dialog continue to the next screen for hearing aid. [CHAR LIMIT=32] -->
     <string name="accessibility_hearingaid_instruction_continue_button">Continue</string>
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index ec8e31d..13bc330 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -40,8 +40,7 @@
             android:key="tts_settings_preference"
             android:title="@string/tts_settings_title"
             android:fragment="com.android.settings.tts.TextToSpeechSettings"
-            settings:controller="com.android.settings.language.TtsPreferenceController"
-            settings:searchable="false"/>
+            settings:controller="com.android.settings.language.TtsPreferenceController"/>
     </PreferenceCategory>
 
     <PreferenceCategory
@@ -101,8 +100,7 @@
             android:title="@string/accessibility_power_button_ends_call_prerefence_title"
             android:persistent="false"
             settings:controller="com.android.settings.accessibility.PowerButtonEndsCallPreferenceController"/>
-
-
+        
         <SwitchPreference
             android:key="toggle_lock_screen_rotation_preference"
             android:title="@string/accelerometer_title"
@@ -156,7 +154,8 @@
         <Preference
             android:key="hearing_aid_preference"
             android:summary="@string/accessibility_hearingaid_not_connected_summary"
-            android:title="@string/accessibility_hearingaid_title"/>
+            android:title="@string/accessibility_hearingaid_title"
+            settings:controller="com.android.settings.accessibility.AccessibilityHearingAidPreferenceController"/>
 
         <Preference
             android:key="captioning_preference_screen"
diff --git a/res/xml/captioning_settings.xml b/res/xml/captioning_settings.xml
index 715a506..d8dabdc 100644
--- a/res/xml/captioning_settings.xml
+++ b/res/xml/captioning_settings.xml
@@ -92,4 +92,8 @@
             android:title="@string/captioning_window_opacity" />
     </PreferenceCategory>
 
+    <com.android.settingslib.widget.FooterPreference
+        android:title="@string/accessibility_caption_preference_summary"
+        android:selectable="false" />
+
 </PreferenceScreen>
diff --git a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
index 641d8ca..8f0ca3e 100644
--- a/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
+++ b/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceController.java
@@ -31,9 +31,6 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.FragmentManager;
-import androidx.lifecycle.Lifecycle.Event;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
@@ -43,6 +40,9 @@
 import com.android.settings.core.SubSettingLauncher;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
 
 import java.util.Iterator;
 import java.util.List;
@@ -53,7 +53,7 @@
  * Controller that shows and updates the bluetooth device name
  */
 public class AccessibilityHearingAidPreferenceController extends BasePreferenceController
-        implements LifecycleObserver {
+        implements LifecycleObserver, OnStart, OnStop {
     private static final String TAG = "AccessibilityHearingAidPreferenceController";
     private Preference mHearingAidPreference;
 
@@ -104,8 +104,8 @@
         return mHearingAidProfileSupported ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
     }
 
-    @OnLifecycleEvent(Event.ON_RESUME)
-    public void onResume() {
+    @Override
+    public void onStart() {
         if (mHearingAidProfileSupported) {
             IntentFilter filter = new IntentFilter();
             filter.addAction(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
@@ -114,8 +114,8 @@
         }
     }
 
-    @OnLifecycleEvent(Event.ON_PAUSE)
-    public void onPause() {
+    @Override
+    public void onStop() {
         if (mHearingAidProfileSupported) {
             mContext.unregisterReceiver(mHearingAidChangedReceiver);
         }
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index afbde7f..e4df675 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -94,17 +94,10 @@
     private static final String TOGGLE_LARGE_POINTER_ICON =
             "toggle_large_pointer_icon";
     private static final String TOGGLE_DISABLE_ANIMATIONS = "toggle_disable_animations";
-    private static final String HEARING_AID_PREFERENCE =
-            "hearing_aid_preference";
     private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN =
             "magnification_preference_screen";
     private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
             "daltonizer_preference";
-    private static final String DARK_UI_MODE_PREFERENCE =
-            "dark_ui_mode_accessibility";
-    private static final String LIVE_CAPTION_PREFERENCE_KEY =
-            "live_caption";
-
 
     // Extras passed to sub-fragments.
     static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -178,13 +171,7 @@
     private SwitchPreference mToggleDisableAnimationsPreference;
     private Preference mDisplayMagnificationPreferenceScreen;
     private Preference mDisplayDaltonizerPreferenceScreen;
-    private Preference mHearingAidPreference;
-    private Preference mLiveCaptionPreference;
     private SwitchPreference mToggleInversionPreference;
-    private AccessibilityHearingAidPreferenceController mHearingAidPreferenceController;
-    private SwitchPreference mDarkUIModePreference;
-    private DarkUIPreferenceController mDarkUIPreferenceController;
-    private LiveCaptionPreferenceController mLiveCaptionPreferenceController;
 
     private DevicePolicyManager mDpm;
 
@@ -236,13 +223,9 @@
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mHearingAidPreferenceController = new AccessibilityHearingAidPreferenceController
-                (context, HEARING_AID_PREFERENCE);
-        mHearingAidPreferenceController.setFragmentManager(getFragmentManager());
-        getLifecycle().addObserver(mHearingAidPreferenceController);
-
-        mLiveCaptionPreferenceController = new LiveCaptionPreferenceController(context,
-                LIVE_CAPTION_PREFERENCE_KEY);
+        use(DarkUIPreferenceController.class).setParentFragment(this);
+        use(AccessibilityHearingAidPreferenceController.class)
+                .setFragmentManager(getFragmentManager());
     }
 
     @Override
@@ -262,14 +245,6 @@
     }
 
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (mHearingAidPreferenceController.handlePreferenceTreeClick(preference)) {
-            return true;
-        }
-        return super.onPreferenceTreeClick(preference);
-    }
-
-    @Override
     protected int getPreferenceScreenResId() {
         return R.xml.accessibility_settings;
     }
@@ -318,27 +293,12 @@
         mToggleDisableAnimationsPreference =
                 (SwitchPreference) findPreference(TOGGLE_DISABLE_ANIMATIONS);
 
-        // Hearing Aid.
-        mHearingAidPreference = findPreference(HEARING_AID_PREFERENCE);
-        mHearingAidPreferenceController.displayPreference(getPreferenceScreen());
-
-        // Live caption
-        mLiveCaptionPreference = findPreference(LIVE_CAPTION_PREFERENCE_KEY);
-        mLiveCaptionPreferenceController.displayPreference(getPreferenceScreen());
-
         // Display magnification.
         mDisplayMagnificationPreferenceScreen = findPreference(
                 DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN);
 
         // Display color adjustments.
         mDisplayDaltonizerPreferenceScreen = findPreference(DISPLAY_DALTONIZER_PREFERENCE_SCREEN);
-
-        // Dark Mode.
-        mDarkUIModePreference = findPreference(DARK_UI_MODE_PREFERENCE);
-        mDarkUIPreferenceController = new DarkUIPreferenceController(getContext(),
-                DARK_UI_MODE_PREFERENCE);
-        mDarkUIPreferenceController.setParentFragment(this);
-        mDarkUIPreferenceController.displayPreference(getPreferenceScreen());
     }
 
     private void updateAllPreferences() {
@@ -544,13 +504,6 @@
             displayCategory.addPreference(mToggleInversionPreference);
             displayCategory.addPreference(mDisplayDaltonizerPreferenceScreen);
         }
-
-        // Dark Mode
-        mDarkUIPreferenceController.updateState(mDarkUIModePreference);
-
-        mHearingAidPreferenceController.updateState(mHearingAidPreference);
-
-        mLiveCaptionPreferenceController.updateState(mLiveCaptionPreference);
     }
 
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
index 5b30870..99d96dd 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
@@ -212,12 +212,12 @@
         } else {
             intent.setClass(this, FaceEnrollEnrolling.class);
         }
-        intent.putExtra(EXTRA_KEY_REQUIRE_DIVERSITY, !mSwitchDiversity.isChecked());
+        WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent);
         if (mResultIntent != null) {
             intent.putExtras(mResultIntent);
         }
         mNextClicked = true;
-        WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent);
+        intent.putExtra(EXTRA_KEY_REQUIRE_DIVERSITY, !mSwitchDiversity.isChecked());
         startActivityForResult(intent, BIOMETRIC_FIND_SENSOR_REQUEST);
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
index 18138d5..5015fba 100644
--- a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java
@@ -32,6 +32,13 @@
     }
 
     @Override
+    public int getAvailabilityStatus() {
+        // Make the profile unsearchable so the user preference controller gets highlighted
+        // when searched for.
+        return AVAILABLE_UNSEARCHABLE;
+    }
+
+    @Override
     protected boolean isUserSupported() {
         return mProfileChallengeUserId != UserHandle.USER_NULL
                 && mLockPatternUtils.isSeparateProfileChallengeAllowed(mProfileChallengeUserId);
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsAppPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsAppPreferenceController.java
index 70c00e5..a54171e 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsAppPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsAppPreferenceController.java
@@ -78,6 +78,19 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return AVAILABLE;
+        if(mFaceManager == null){
+            return AVAILABLE_UNSEARCHABLE;
+        }
+
+        // By only allowing this preference controller to be searchable when the feature is turned
+        // off, it will give preference to the face setup controller.
+        final boolean hasEnrolledUser = mFaceManager.hasEnrolledTemplates(getUserId());
+        final boolean appUnlockEnabled = Settings.Secure.getIntForUser(
+                mContext.getContentResolver(), FACE_UNLOCK_APP_ENABLED, OFF, getUserId()) == ON;
+        if (hasEnrolledUser && !appUnlockEnabled) {
+            return AVAILABLE;
+        } else {
+            return AVAILABLE_UNSEARCHABLE;
+        }
     }
 }
diff --git a/src/com/android/settings/development/OemUnlockPreferenceController.java b/src/com/android/settings/development/OemUnlockPreferenceController.java
index 529970a..f8a245f 100644
--- a/src/com/android/settings/development/OemUnlockPreferenceController.java
+++ b/src/com/android/settings/development/OemUnlockPreferenceController.java
@@ -22,11 +22,13 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
-import android.os.Build;
+import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.service.oemlock.OemLockManager;
 import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
@@ -43,6 +45,9 @@
 
     private static final String PREFERENCE_KEY = "oem_unlock_enable";
     private static final String TAG = "OemUnlockPreferenceController";
+    private static final String OEM_UNLOCK_SUPPORTED_KEY = "ro.oem_unlock_supported";
+    private static final String UNSUPPORTED = "-9999";
+    private static final String SUPPORTED = "1";
 
     private final OemLockManager mOemLockManager;
     private final UserManager mUserManager;
@@ -55,8 +60,10 @@
             DevelopmentSettingsDashboardFragment fragment) {
         super(context);
 
-        if (Build.IS_EMULATOR && Build.IS_ENG) {
+        if (!TextUtils.equals(SystemProperties.get(OEM_UNLOCK_SUPPORTED_KEY, UNSUPPORTED),
+                SUPPORTED)) {
             mOemLockManager = null;
+            Log.w(TAG, "oem_unlock not supported.");
         } else {
             mOemLockManager = (OemLockManager) context.getSystemService(Context.OEM_LOCK_SERVICE);
         }
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 880255b..b0ab5ee 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -291,6 +291,8 @@
         switch (item.getItemId()) {
             case MENU_STATS_TYPE:
                 if (mStatsType == BatteryStats.STATS_SINCE_CHARGED) {
+                    // TODO: STATS_SINCE_UNPLUGGED is deprecated in Q, so this accomplishes nothing,
+                    // but mStatsType doesn't seem to be hooked up to anything anyway.
                     mStatsType = BatteryStats.STATS_SINCE_UNPLUGGED;
                 } else {
                     mStatsType = BatteryStats.STATS_SINCE_CHARGED;
diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java
index 9a165297..aa17f8e 100644
--- a/src/com/android/settings/password/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/password/SetupChooseLockGeneric.java
@@ -111,7 +111,7 @@
 
             layout.setIcon(getContext().getDrawable(R.drawable.ic_lock));
 
-            int titleResource = mForFingerprint ?
+            int titleResource = isForBiometric() ?
                     R.string.lock_settings_picker_title : R.string.setup_lock_settings_picker_title;
             if (getActivity() != null) {
                 getActivity().setTitle(titleResource);
@@ -125,7 +125,7 @@
 
         @Override
         protected void addHeaderView() {
-            if (mForFingerprint || mForFace) {
+            if (isForBiometric()) {
                 setHeaderView(R.layout.setup_choose_lock_generic_biometrics_header);
             } else {
                 setHeaderView(R.layout.setup_choose_lock_generic_header);
@@ -183,7 +183,7 @@
 
         @Override
         protected void addPreferences() {
-            if (mForFingerprint) {
+            if (isForBiometric()) {
                 super.addPreferences();
             } else {
                 addPreferencesFromResource(R.xml.setup_security_settings_picker);
@@ -240,6 +240,10 @@
             SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
             return intent;
         }
+
+        private boolean isForBiometric() {
+            return mForFingerprint || mForFace;
+        }
     }
 
     public static class InternalActivity extends ChooseLockGeneric.InternalActivity {
@@ -261,5 +265,4 @@
             }
         }
     }
-
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
index fcd9978..4e6337a 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
@@ -100,21 +100,24 @@
     }
 
     private void showErrorUi(int code, boolean isConfigurationChange) {
+        CharSequence summaryCharSequence;
         switch (code) {
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI:
-                mSummary.setText(R.string.wifi_dpp_qr_code_is_not_valid_format);
+                summaryCharSequence = getText(R.string.wifi_dpp_qr_code_is_not_valid_format);
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION:
-                mSummary.setText(R.string.wifi_dpp_failure_authentication_or_configuration);
+                summaryCharSequence = getText(
+                        R.string.wifi_dpp_failure_authentication_or_configuration);
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE:
-                mSummary.setText(R.string.wifi_dpp_failure_not_compatible);
+                summaryCharSequence = getText(R.string.wifi_dpp_failure_not_compatible);
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION:
-                mSummary.setText(R.string.wifi_dpp_failure_authentication_or_configuration);
+                summaryCharSequence = getText(
+                        R.string.wifi_dpp_failure_authentication_or_configuration);
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_BUSY:
@@ -135,15 +138,16 @@
                 return;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT:
-                mSummary.setText(R.string.wifi_dpp_failure_timeout);
+                summaryCharSequence = getText(R.string.wifi_dpp_failure_timeout);
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC:
-                mSummary.setText(R.string.wifi_dpp_failure_generic);
+                summaryCharSequence = getText(R.string.wifi_dpp_failure_generic);
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED:
-                mSummary.setText(getString(R.string.wifi_dpp_failure_not_supported, getSsid()));
+                summaryCharSequence = getString(
+                        R.string.wifi_dpp_failure_not_supported, getSsid());
                 break;
 
             case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK:
@@ -155,6 +159,7 @@
         }
 
         setHeaderTitle(R.string.wifi_dpp_could_not_add_device);
+        mSummary.setText(summaryCharSequence);
         mWifiApPictureView.setImageResource(R.drawable.wifi_dpp_error);
         mChooseDifferentNetwork.setVisibility(View.INVISIBLE);
         if (hasRetryButton(code)) {
diff --git a/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java b/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java
new file mode 100644
index 0000000..a7daee6
--- /dev/null
+++ b/src/com/android/settings/wifi/dpp/WifiDppBaseActivity.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi.dpp;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+
+import androidx.fragment.app.FragmentManager;
+
+import com.android.settings.R;
+import com.android.settings.SetupWizardUtils;
+import com.android.settings.core.InstrumentedActivity;
+
+abstract class WifiDppBaseActivity extends InstrumentedActivity {
+    protected FragmentManager mFragmentManager;
+
+    protected abstract void handleIntent(Intent intent);
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.wifi_dpp_activity);
+        mFragmentManager = getSupportFragmentManager();
+
+        if (savedInstanceState == null) {
+            handleIntent(getIntent());
+        }
+    }
+
+    @Override
+    protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
+        resid = SetupWizardUtils.getTheme(getIntent());
+        theme.applyStyle(R.style.SetupWizardPartnerResource, /* force */ true);
+        super.onApplyThemeResource(theme, resid, first);
+    }
+}
diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
index 4a5566d..e7ea704 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
@@ -18,7 +18,6 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Intent;
-import android.content.res.Resources;
 import android.net.Uri;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiInfo;
@@ -29,12 +28,9 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
 import com.android.settings.R;
-import com.android.settings.SetupWizardUtils;
-import com.android.settings.core.InstrumentedActivity;
 
 import java.util.List;
 
@@ -55,9 +51,8 @@
  * For intent action {@link Settings#ACTION_PROCESS_WIFI_EASY_CONNECT_URI}, specify Wi-Fi
  * Easy Connect bootstrapping information string in Intent's data URI.
  */
-public class WifiDppConfiguratorActivity extends InstrumentedActivity implements
+public class WifiDppConfiguratorActivity extends WifiDppBaseActivity implements
         WifiNetworkConfig.Retriever,
-        WifiDppQrCodeGeneratorFragment.OnQrCodeGeneratorFragmentAddButtonClickedListener,
         WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener,
         WifiDppAddDeviceFragment.OnClickChooseDifferentNetworkListener,
         WifiNetworkListFragment.OnChooseNetworkListener {
@@ -78,8 +73,6 @@
     private static final String KEY_WIFI_NETWORK_ID = "key_wifi_network_id";
     private static final String KEY_IS_HOTSPOT = "key_is_hotspot";
 
-    private FragmentManager mFragmentManager;
-
     /** The Wi-Fi network which will be configured */
     private WifiNetworkConfig mWifiNetworkConfig;
 
@@ -95,19 +88,9 @@
     }
 
     @Override
-    protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        theme.applyStyle(R.style.SetupWizardPartnerResource, /* force */ true);
-        super.onApplyThemeResource(theme, resid, first);
-    }
-
-    @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        setContentView(R.layout.wifi_dpp_activity);
-        mFragmentManager = getSupportFragmentManager();
-
         if (savedInstanceState != null) {
             String qrCode = savedInstanceState.getString(KEY_QR_CODE);
 
@@ -122,12 +105,11 @@
 
             mWifiNetworkConfig = WifiNetworkConfig.getValidConfigOrNull(security, ssid,
                     preSharedKey, hiddenSsid, networkId, isHotspot);
-        } else {
-            handleIntent(getIntent());
         }
     }
 
-    private void handleIntent(Intent intent) {
+    @Override
+    protected void handleIntent(Intent intent) {
         boolean cancelActivity = false;
         WifiNetworkConfig config;
         switch (intent.getAction()) {
@@ -137,7 +119,7 @@
                     cancelActivity = true;
                 } else {
                     mWifiNetworkConfig = config;
-                    showQrCodeScannerFragment(/* addToBackStack= */ false);
+                    showQrCodeScannerFragment();
                 }
                 break;
             case ACTION_CONFIGURATOR_QR_CODE_GENERATOR:
@@ -180,7 +162,7 @@
         }
     }
 
-    private void showQrCodeScannerFragment(boolean addToBackStack) {
+    private void showQrCodeScannerFragment() {
         WifiDppQrCodeScannerFragment fragment =
                 (WifiDppQrCodeScannerFragment) mFragmentManager.findFragmentByTag(
                         WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
@@ -201,9 +183,6 @@
 
         fragmentTransaction.replace(R.id.fragment_container, fragment,
                 WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
-        if (addToBackStack) {
-            fragmentTransaction.addToBackStack(/* name */ null);
-        }
         fragmentTransaction.commit();
     }
 
@@ -324,11 +303,6 @@
     }
 
     @Override
-    public void onQrCodeGeneratorFragmentAddButtonClicked() {
-        showQrCodeScannerFragment(/* addToBackStack */ true);
-    }
-
-    @Override
     public void onScanWifiDppSuccess(WifiQrCode wifiQrCode) {
         mWifiDppQrCode = wifiQrCode;
 
diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
index d299649..55af79d 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
@@ -18,17 +18,12 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Intent;
-import android.content.res.Resources;
-import android.os.Bundle;
 import android.util.Log;
 
 import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
 import com.android.settings.R;
-import com.android.settings.SetupWizardUtils;
-import com.android.settings.core.InstrumentedActivity;
 
 /**
  * To provision "this" device with specified Wi-Fi network.
@@ -36,40 +31,20 @@
  * To use intent action {@code ACTION_ENROLLEE_QR_CODE_SCANNER}, specify the SSID string of the
  * Wi-Fi network to be provisioned in {@code WifiDppUtils.EXTRA_WIFI_SSID}.
  */
-public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
+public class WifiDppEnrolleeActivity extends WifiDppBaseActivity implements
         WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener {
     private static final String TAG = "WifiDppEnrolleeActivity";
 
     public static final String ACTION_ENROLLEE_QR_CODE_SCANNER =
             "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER";
 
-    private FragmentManager mFragmentManager;
-
     @Override
     public int getMetricsCategory() {
         return SettingsEnums.SETTINGS_WIFI_DPP_ENROLLEE;
     }
 
     @Override
-    protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
-        resid = SetupWizardUtils.getTheme(getIntent());
-        theme.applyStyle(R.style.SetupWizardPartnerResource, /* force */ true);
-        super.onApplyThemeResource(theme, resid, first);
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        setContentView(R.layout.wifi_dpp_activity);
-        mFragmentManager = getSupportFragmentManager();
-
-        if (savedInstanceState == null) {
-            handleIntent(getIntent());
-        }
-    }
-
-    private void handleIntent(Intent intent) {
+    protected void handleIntent(Intent intent) {
         switch (intent.getAction()) {
             case ACTION_ENROLLEE_QR_CODE_SCANNER:
                 String ssid = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID);
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java
index acdff9d..c5b2e8b 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java
@@ -72,6 +72,9 @@
                     .build();
             mGlifLayout.getMixin(FooterBarMixin.class).setPrimaryButton(mRightButton);
         }
+
+        mGlifLayout.getHeaderTextView().setAccessibilityLiveRegion(
+                View.ACCESSIBILITY_LIVE_REGION_POLITE);
     }
 
     protected void setHeaderIconImageResource(@DrawableRes int iconResId) {
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
index 99fa6fc..2105408 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
@@ -52,12 +52,6 @@
         return SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR;
     }
 
-    // Container Activity must implement this interface
-    public interface OnQrCodeGeneratorFragmentAddButtonClickedListener {
-        public void onQrCodeGeneratorFragmentAddButtonClicked();
-    }
-    OnQrCodeGeneratorFragmentAddButtonClickedListener mListener;
-
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
@@ -72,20 +66,6 @@
     }
 
     @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-
-        mListener = (OnQrCodeGeneratorFragmentAddButtonClickedListener) context;
-    }
-
-    @Override
-    public void onDetach() {
-        mListener = null;
-
-        super.onDetach();
-    }
-
-    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         final MenuItem menuItem = menu.findItem(Menu.FIRST);
         if (menuItem != null) {
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
index 3f4e82d..0b739f4 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
@@ -111,7 +111,7 @@
     @Test
     public void onHearingAidStateChanged_connected_updateHearingAidSummary() {
         when(mHearingAidProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList());
-        mPreferenceController.onResume();
+        mPreferenceController.onStart();
         Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
         intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_CONNECTED);
         sendIntent(intent);
@@ -121,7 +121,7 @@
 
     @Test
     public void onHearingAidStateChanged_disconnected_updateHearingAidSummary() {
-        mPreferenceController.onResume();
+        mPreferenceController.onStart();
         Intent intent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
         intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHearingAid.STATE_DISCONNECTED);
         sendIntent(intent);
@@ -132,7 +132,7 @@
 
     @Test
     public void onBluetoothStateChanged_bluetoothOff_updateHearingAidSummary() {
-        mPreferenceController.onResume();
+        mPreferenceController.onStart();
         Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
         intent.putExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.STATE_OFF);
         sendIntent(intent);
@@ -173,11 +173,11 @@
                 HEARING_AID_PREFERENCE);
         mPreferenceController.setPreference(mHearingAidPreference);
         //not call registerReceiver()
-        mPreferenceController.onResume();
+        mPreferenceController.onStart();
         verify(mContext, never()).registerReceiver(any(), any());
 
         //not call unregisterReceiver()
-        mPreferenceController.onPause();
+        mPreferenceController.onStop();
         verify(mContext, never()).unregisterReceiver(any());
     }
 
diff --git a/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java
index a9c2d79..c762349 100644
--- a/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/OemUnlockPreferenceControllerTest.java
@@ -32,7 +32,7 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;
-import android.os.Build;
+import android.os.SystemProperties;
 import android.os.UserManager;
 import android.service.oemlock.OemLockManager;
 import android.telephony.TelephonyManager;
@@ -49,12 +49,14 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
 
 @RunWith(RobolectricTestRunner.class)
 public class OemUnlockPreferenceControllerTest {
 
+    private static final String OEM_UNLOCK_SUPPORTED_KEY = "ro.oem_unlock_supported";
+    private static final String UNSUPPORTED = "-9999";
+    private static final String SUPPORTED = "1";
+
     @Mock
     private Context mContext;
     @Mock
@@ -80,6 +82,7 @@
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
+        SystemProperties.set(OEM_UNLOCK_SUPPORTED_KEY, SUPPORTED);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         when(mContext.getPackageManager().hasSystemFeature(PackageManager
                     .FEATURE_TELEPHONY_CARRIERLOCK)).thenReturn(true);
@@ -96,20 +99,14 @@
     }
 
     @Test
-    @Config(qualifiers = "mcc999")
-    public void OemUnlockPreferenceController_shouldNotCrashInEmulatorEngBuild() {
-        ReflectionHelpers.setStaticField(Build.class, "IS_EMULATOR", true);
-        ReflectionHelpers.setStaticField(Build.class, "IS_ENG", true);
+    public void OemUnlockPreferenceController_oemUnlockUnsupported_shouldNotCrash() {
+        SystemProperties.set(OEM_UNLOCK_SUPPORTED_KEY, UNSUPPORTED);
 
         new OemUnlockPreferenceController(mContext, mActivity, mFragment);
     }
 
     @Test
-    @Config(qualifiers = "mcc999")
-    public void OemUnlockPreferenceController_shouldNotCrashInOtherBuild() {
-        ReflectionHelpers.setStaticField(Build.class, "IS_EMULATOR", false);
-        ReflectionHelpers.setStaticField(Build.class, "IS_ENG", false);
-
+    public void OemUnlockPreferenceController_oemUnlockSupported_shouldNotCrash() {
         new OemUnlockPreferenceController(mContext, mActivity, mFragment);
     }
 
diff --git a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
index b9dfbbb..a6a76f8 100644
--- a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
+++ b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.same;
 import static org.mockito.Mockito.mock;
@@ -26,18 +25,20 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
-import android.view.LayoutInflater;
-import android.view.View;
 import android.widget.EditText;
 import android.widget.ImageView;
 
+import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 
 import com.android.settings.R;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,20 +48,15 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
 public class EditUserInfoControllerTest {
+    private static final int MAX_USER_NAME_LENGTH = 100;
+
     @Mock
     private Fragment mFragment;
     @Mock
-    private LayoutInflater mInflater;
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private View mDialogContent;
-    @Mock
-    private EditText mUserName;
-    @Mock
-    private ImageView mPhotoView;
-    @Mock
     private Drawable mCurrentIcon;
 
     private FragmentActivity mActivity;
@@ -86,12 +82,6 @@
         MockitoAnnotations.initMocks(this);
         mActivity = spy(ActivityController.of(new FragmentActivity()).get());
         when(mFragment.getActivity()).thenReturn(mActivity);
-        when(mActivity.getLayoutInflater()).thenReturn(mInflater);
-        when(mInflater.inflate(eq(R.layout.edit_user_info_dialog_content), any())).thenReturn(
-                mDialogContent);
-        when(mDialogContent.findViewById(eq(R.id.user_name))).thenReturn(mUserName);
-        when(mDialogContent.findViewById(eq(R.id.user_photo))).thenReturn(mPhotoView);
-        when(mPhotoView.getContext()).thenReturn((Context) mActivity);
         mController = new TestEditUserInfoController();
     }
 
@@ -106,4 +96,21 @@
         assertThat(photoController).isNotNull();
         verify(photoController).onActivityResult(eq(0), eq(0), same(resultData));
     }
+
+    @Test
+    @Config(shadows = ShadowAlertDialogCompat.class)
+    public void userNameView_inputLongName_shouldBeConstrained() {
+        // generate a string of 200 'A's
+        final String longName = Stream.generate(
+                () -> String.valueOf('A')).limit(200).collect(Collectors.joining());
+        final AlertDialog dialog = (AlertDialog) mController.createDialog(mFragment, mCurrentIcon,
+                "test user", R.string.profile_info_settings_title, null,
+                android.os.Process.myUserHandle());
+        final EditText userName = ShadowAlertDialogCompat.shadowOf(dialog).getView()
+                .findViewById(R.id.user_name);
+
+        userName.setText(longName);
+
+        assertThat(userName.getText().length()).isEqualTo(MAX_USER_NAME_LENGTH);
+    }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
index 7f0e7e1..7c87e7d 100644
--- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
@@ -108,14 +108,6 @@
     }
 
     @Test
-    public void testActivity_shouldImplementsQrCodeGeneratorFragmentCallback() {
-        WifiDppConfiguratorActivity activity = mActivityRule.getActivity();
-
-        assertThat(activity instanceof WifiDppQrCodeGeneratorFragment
-                .OnQrCodeGeneratorFragmentAddButtonClickedListener).isTrue();
-    }
-
-    @Test
     public void testActivity_shouldImplementsOnScanWifiDppSuccessCallback() {
         WifiDppConfiguratorActivity activity = mActivityRule.getActivity();