Merge "Not use NEW_TASKS for Wallpaper & style's 2-pane UX" into sc-v2-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a34713d..1d85a8d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1680,6 +1680,10 @@
         </activity-alias>
 
         <activity
+            android:name=".accessibility.AccessibilityScreenSizeForSetupWizardActivity"
+            android:exported="false"/>
+
+        <activity
             android:name="Settings$AccessibilityDaltonizerSettingsActivity"
             android:exported="true"
             android:label="@string/accessibility_display_daltonizer_preference_title">
@@ -3675,6 +3679,11 @@
             </intent-filter>
         </provider>
 
+        <provider
+            android:name=".activityembedding.ActivityEmbeddingProvider"
+            android:authorities="com.android.settings.activityembedding"
+            android:exported="true"/>
+
         <activity
             android:name=".wifi.dpp.WifiDppConfiguratorActivity"
             android:exported="true">
diff --git a/libs/window_ext_lib.aar b/libs/window_ext_lib.aar
index 301ff96..c576270 100644
--- a/libs/window_ext_lib.aar
+++ b/libs/window_ext_lib.aar
Binary files differ
diff --git a/res/layout/accessibility_screen_size_setup_wizard.xml b/res/layout/accessibility_screen_size_setup_wizard.xml
new file mode 100644
index 0000000..e4bc55b
--- /dev/null
+++ b/res/layout/accessibility_screen_size_setup_wizard.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<com.google.android.setupdesign.GlifLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/setup_wizard_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:icon="@drawable/ic_accessibility_visibility"
+    app:sucHeaderText="@string/title_font_size"
+    app:sudDescriptionText="@string/short_summary_font_size">
+
+    <FrameLayout
+        android:id="@+id/content_frame"
+        android:layout_marginTop="@dimen/preview_size_top_margin"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/suw_font_size_fragment.xml b/res/layout/suw_font_size_fragment.xml
new file mode 100644
index 0000000..0e03a69
--- /dev/null
+++ b/res/layout/suw_font_size_fragment.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<androidx.core.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fillViewport="true">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <include layout="@layout/suw_preview_seek_bar_view_pager"/>
+
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+            <com.android.settings.widget.DotsPageIndicator
+                android:id="@+id/page_indicator"
+                style="@style/PreviewPagerPageIndicator"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:padding="3dp"/>
+
+            <TextView
+                android:id="@+id/current_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:padding="6dp"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
+                android:elevation="2dp"/>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_vertical"
+                android:paddingTop="8dp">
+
+                <ImageView
+                    android:id="@+id/smaller"
+                    android:src="@drawable/ic_font_size_16dp"
+                    android:contentDescription="@string/font_size_make_smaller_desc"
+                    style="@style/screen_size_imageview_style"/>
+
+                <com.android.settings.widget.LabeledSeekBar
+                    android:id="@+id/seek_bar"
+                    android:layout_width="0dp"
+                    android:layout_height="48dp"
+                    android:layout_weight="1"
+                    style="@android:style/Widget.Material.SeekBar.Discrete"/>
+
+                <ImageView
+                    android:id="@+id/larger"
+                    android:src="@drawable/ic_font_size_24dp"
+                    android:contentDescription="@string/font_size_make_larger_desc"
+                    style="@style/screen_size_imageview_style"/>
+            </LinearLayout>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/font_size_summary"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
+        </LinearLayout>
+    </LinearLayout>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/layout/suw_preview_seek_bar_view_pager.xml b/res/layout/suw_preview_seek_bar_view_pager.xml
new file mode 100644
index 0000000..71ec5f0
--- /dev/null
+++ b/res/layout/suw_preview_seek_bar_view_pager.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="0dp"
+    android:layout_weight="1"
+    android:orientation="vertical"
+    android:paddingStart="@dimen/preview_pager_padding"
+    android:paddingEnd="@dimen/preview_pager_padding"
+    android:background="@drawable/preview_seek_bar_outline" >
+
+    <androidx.viewpager.widget.ViewPager
+        android:id="@+id/preview_pager"
+        android:layout_width="match_parent"
+        android:layout_height="200dp"
+        android:layout_weight="1"
+        android:background="?android:attr/colorBackground"
+        android:contentDescription="@string/preview_pager_content_description" />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="36dp"
+        android:paddingStart="32dp"
+        android:gravity="start|center"
+        android:text="@string/screen_zoom_preview_title"
+        android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
+        android:importantForAccessibility="no" />
+</LinearLayout>
+
diff --git a/res/layout/suw_screen_zoom_fragment.xml b/res/layout/suw_screen_zoom_fragment.xml
new file mode 100644
index 0000000..0747381
--- /dev/null
+++ b/res/layout/suw_screen_zoom_fragment.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<androidx.core.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fillViewport="true">
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <include layout="@layout/suw_preview_seek_bar_view_pager"/>
+
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingStart="?android:attr/listPreferredItemPaddingStart"
+            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+
+            <com.android.settings.widget.DotsPageIndicator
+                android:id="@+id/page_indicator"
+                style="@style/PreviewPagerPageIndicator"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:padding="3dp"/>
+
+            <TextView
+                android:id="@+id/current_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:padding="6dp"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
+                android:elevation="2dp"/>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_vertical">
+
+                <ImageView
+                    android:id="@+id/smaller"
+                    android:src="@drawable/ic_remove_24dp"
+                    android:contentDescription="@string/screen_zoom_make_smaller_desc"
+                    style="@style/screen_size_imageview_style"/>
+
+                <com.android.settings.widget.LabeledSeekBar
+                    android:id="@+id/seek_bar"
+                    android:layout_width="0dp"
+                    android:layout_height="48dp"
+                    android:layout_weight="1"
+                    style="@android:style/Widget.Material.SeekBar.Discrete"/>
+
+                <ImageView
+                    android:id="@+id/larger"
+                    android:src="@drawable/ic_add_24dp"
+                    android:contentDescription="@string/screen_zoom_make_larger_desc"
+                    style="@style/screen_size_imageview_style"/>
+            </LinearLayout>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/screen_zoom_summary"
+                android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
+        </LinearLayout>
+    </LinearLayout>
+</androidx.core.widget.NestedScrollView>
diff --git a/res/values-sw300dp-land-v31/dimens.xml b/res/values-sw300dp-land-v31/dimens.xml
new file mode 100644
index 0000000..fa7d2bf
--- /dev/null
+++ b/res/values-sw300dp-land-v31/dimens.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<resources>
+    <!-- Top margin for preview view pager -->
+    <dimen name="preview_size_top_margin">0dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2cd944a..e1d7584 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -434,6 +434,9 @@
     <!--  Choose SIM Activity dimens  -->
     <dimen name="subtitle_bottom_padding">24dp</dimen>
 
+    <!-- Top margin for preview view pager -->
+    <dimen name="preview_size_top_margin">-12dp</dimen>
+
     <!-- Battery usage chart view component -->
     <dimen name="chartview_text_padding">6dp</dimen>
     <dimen name="chartview_divider_width">1dp</dimen>
diff --git a/res/values/integers.xml b/res/values/integers.xml
index 3d73f64..5354388 100644
--- a/res/values/integers.xml
+++ b/res/values/integers.xml
@@ -21,4 +21,9 @@
     <integer name="job_anomaly_detection">102</integer>
     <integer name="device_index_update">103</integer>
     <integer name="sim_notification_send">104</integer>
+
+    <!-- Define the font/display size fragment id in the
+    accessibility_settings_for_setup_wizard.xml. -->
+    <integer name="suw_font_size_fragment_no">0</integer>
+    <integer name="suw_display_size_fragment_no">1</integer>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d6f22fb..5f2fd54 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6283,6 +6283,8 @@
 
     <!-- Summary for battery manager when it is on -->
     <string name="battery_manager_summary">Detecting when apps drain battery</string>
+    <!-- Summary for battery manager when it is on. [CHAR LIMIT=NONE] -->
+    <string name="battery_manager_summary_unsupported">Detecting when apps drain battery</string>
 
     <!-- Summary for battery manager when it is off -->
     <string name="battery_manager_off">Off</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 8b0b7a2..5b3b1c8 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -237,6 +237,16 @@
         <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item>
     </style>
 
+    <style name="screen_size_imageview_style">
+        <item name="android:layout_width">48dp</item>
+        <item name="android:layout_height">48dp</item>
+        <item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
+        <item name="android:tint">?android:attr/textColorPrimary</item>
+        <item name="android:tintMode">src_in</item>
+        <item name="android:scaleType">center</item>
+        <item name="android:focusable">true</item>
+    </style>
+
     <style name="TextAppearance" parent="android:TextAppearance.DeviceDefault"/>
 
     <style name="TextAppearance.info_label">
diff --git a/res/values/themes_suw.xml b/res/values/themes_suw.xml
index a0585fd..6fd9b75 100644
--- a/res/values/themes_suw.xml
+++ b/res/values/themes_suw.xml
@@ -234,6 +234,7 @@
         <item name="android:listPreferredItemPaddingEnd">16dp</item>
         <item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item>
         <item name="android:switchStyle">@style/Switch.SettingsLib</item>
+        <item name="preferenceFragmentCompatStyle">@style/SetupWizardPreferenceFragmentStyle</item>
     </style>
 
     <!-- This theme was applied to Settings pages which are running under SUW with DynamicColor. -->
@@ -243,6 +244,7 @@
         <item name="android:listPreferredItemPaddingEnd">16dp</item>
         <item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item>
         <item name="android:switchStyle">@style/Switch.SettingsLib</item>
+        <item name="preferenceFragmentCompatStyle">@style/SetupWizardPreferenceFragmentStyle</item>
     </style>
 
     <!-- DayNight themes -->
diff --git a/res/xml/accessibility_settings_for_setup_wizard.xml b/res/xml/accessibility_settings_for_setup_wizard.xml
index a3f56b5..d1b4f4a 100644
--- a/res/xml/accessibility_settings_for_setup_wizard.xml
+++ b/res/xml/accessibility_settings_for_setup_wizard.xml
@@ -21,18 +21,28 @@
     android:title="@string/vision_settings_title">
 
     <Preference
-        android:fragment="com.android.settings.display.FontSizePreferenceFragmentForSetupWizard"
         android:key="font_size_preference"
         android:icon="@drawable/ic_font_size"
         android:summary="@string/short_summary_font_size"
-        android:title="@string/title_font_size"/>
+        android:title="@string/title_font_size">
+        <intent
+            android:targetPackage="com.android.settings"
+            android:targetClass="com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity">
+            <extra android:name="vision_fragment_no" android:value="@integer/suw_font_size_fragment_no"/>
+        </intent>
+    </Preference>
 
     <com.android.settings.display.ScreenZoomPreference
-        android:fragment="com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard"
         android:key="force_density_preference"
         android:icon="@drawable/ic_screen_zoom"
         android:summary="@string/screen_zoom_short_summary"
-        android:title="@string/screen_zoom_title"/>
+        android:title="@string/screen_zoom_title">
+        <intent
+            android:targetPackage="com.android.settings"
+            android:targetClass="com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity">
+            <extra android:name="vision_fragment_no" android:value="@integer/suw_display_size_fragment_no"/>
+        </intent>
+    </com.android.settings.display.ScreenZoomPreference>
 
     <Preference
         android:fragment="com.android.settings.accessibility.MagnificationPreferenceFragment"
diff --git a/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java
new file mode 100644
index 0000000..8a60e5f
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivity.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2021 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.accessibility;
+
+import android.app.settings.SettingsEnums;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceFragmentCompat;
+
+import com.android.settings.R;
+import com.android.settings.core.InstrumentedActivity;
+import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
+import com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupdesign.GlifLayout;
+import com.google.android.setupdesign.util.ThemeHelper;
+
+/** Settings font/display size activity for SUW. */
+public class AccessibilityScreenSizeForSetupWizardActivity extends InstrumentedActivity {
+    private static final String TAG = "ScreenSizeForSetup";
+
+    // A parameter decides which fragment ({@link FontSizePreferenceFragmentForSetupWizard} or
+    // {@link ScreenZoomPreferenceFragmentForSetupWizard}) will be visioned.
+    static final String VISION_FRAGMENT_NO = "vision_fragment_no";
+
+    private int mFragmentNo;
+    private int mFontSizeFragmentNo;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mFontSizeFragmentNo = getResources().getInteger(R.integer.suw_font_size_fragment_no);
+        final int appliedTheme = ThemeHelper.trySetDynamicColor(this)
+                ? R.style.SudDynamicColorThemeGlifV3_DayNight : R.style.SudThemeGlifV3_DayNight;
+        setTheme(appliedTheme);
+        setContentView(R.layout.accessibility_screen_size_setup_wizard);
+        mFragmentNo = getIntent().getExtras().getInt(VISION_FRAGMENT_NO);
+        Log.d(TAG, "onCreate: fragment no: " + mFragmentNo);
+        generateHeader(mFragmentNo);
+        scrollToBottom();
+        initFooterButton();
+        if (savedInstanceState == null) {
+            final PreferenceFragmentCompat fragment =
+                    (mFragmentNo == mFontSizeFragmentNo)
+                            ? new FontSizePreferenceFragmentForSetupWizard()
+                            : new ScreenZoomPreferenceFragmentForSetupWizard();
+            getSupportFragmentManager()
+                    .beginTransaction()
+                    .replace(R.id.content_frame, fragment)
+                    .commit();
+        }
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return mFragmentNo == mFontSizeFragmentNo ? SettingsEnums.SUW_ACCESSIBILITY_FONT_SIZE
+                : SettingsEnums.SUW_ACCESSIBILITY_DISPLAY_SIZE;
+    }
+
+    @VisibleForTesting
+    void generateHeader(int fragmentNo) {
+        ((TextView) findViewById(R.id.suc_layout_title)).setText(
+                fragmentNo == mFontSizeFragmentNo ? R.string.title_font_size
+                        : R.string.screen_zoom_title);
+        ((TextView) findViewById(R.id.sud_layout_subtitle)).setText(
+                fragmentNo == mFontSizeFragmentNo ? R.string.short_summary_font_size
+                        : R.string.screen_zoom_short_summary);
+    }
+
+    @VisibleForTesting
+    void initFooterButton() {
+        final GlifLayout layout = findViewById(R.id.setup_wizard_layout);
+        final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
+        final View.OnClickListener nextButtonListener =
+                v -> {
+                    onBackPressed();
+                };
+        final FooterButton primaryButton =
+                new FooterButton.Builder(this)
+                        .setText(R.string.done)
+                        .setListener(nextButtonListener)
+                        .setButtonType(FooterButton.ButtonType.NEXT)
+                        .setTheme(R.style.SudGlifButton_Primary)
+                        .build();
+        mixin.setPrimaryButton(primaryButton);
+    }
+
+    /**
+     * Scrolls to bottom while {@link ScrollView} layout changed.
+     */
+    private void scrollToBottom() {
+        final GlifLayout layout = findViewById(R.id.setup_wizard_layout);
+        final ScrollView scrollView = layout.getScrollView();
+        scrollView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
+            final int scrollViewHeight = scrollView.getHeight();
+            if (scrollViewHeight > 0) {
+                scrollView.post(() -> {
+                    // Here is no need to show the scrolling animation. So disabled first and
+                    // then enabled it after scrolling finished.
+                    scrollView.setSmoothScrollingEnabled(false);
+                    scrollView.fullScroll(View.FOCUS_DOWN);
+                    scrollView.setSmoothScrollingEnabled(true);
+                });
+            }
+        });
+    }
+}
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
index 4e8be42..da95df9 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
@@ -28,11 +28,11 @@
 import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
-import android.widget.LinearLayout;
 
 import androidx.preference.Preference;
 import androidx.recyclerview.widget.RecyclerView;
@@ -42,7 +42,6 @@
 import com.android.settingslib.RestrictedPreference;
 
 import com.google.android.setupdesign.GlifPreferenceLayout;
-import com.google.android.setupdesign.util.ThemeHelper;
 
 import java.util.List;
 
@@ -81,16 +80,11 @@
         super.onViewCreated(view, savedInstanceState);
 
         final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
-        layout.setDividerInsets(Integer.MAX_VALUE, 0);
-        layout.setDescriptionText(R.string.vision_settings_description);
-        layout.setHeaderText(R.string.vision_settings_title);
-        layout.setIcon(getPrefContext().getDrawable(R.drawable.ic_accessibility_visibility));
-
-        if (ThemeHelper.shouldApplyExtendedPartnerConfig(getActivity())) {
-            final LinearLayout headerLayout = layout.findManagedViewById(R.id.sud_layout_header);
-            headerLayout.setPadding(0, headerLayout.getPaddingTop(), 0,
-                    headerLayout.getPaddingBottom());
-        }
+        final String title = getContext().getString(R.string.vision_settings_title);
+        final String description = getContext().getString(R.string.vision_settings_description);
+        final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
+        AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
+                description, icon);
     }
 
     @Override
@@ -143,6 +137,13 @@
         return super.onPreferenceTreeClick(preference);
     }
 
+    /**
+     * Returns accessibility service info by given package name and service name.
+     *
+     * @param packageName Package of accessibility service
+     * @param serviceName Class of accessibility service
+     * @return {@link AccessibilityServiceInfo} instance if available, null otherwise.
+     */
     private AccessibilityServiceInfo findService(String packageName, String serviceName) {
         final AccessibilityManager manager =
                 getActivity().getSystemService(AccessibilityManager.class);
@@ -150,8 +151,8 @@
                 manager.getInstalledAccessibilityServiceList();
         for (AccessibilityServiceInfo info : accessibilityServices) {
             ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
-            if (packageName.equals(serviceInfo.packageName)
-                    && serviceName.equals(serviceInfo.name)) {
+            if (TextUtils.equals(packageName, serviceInfo.packageName)
+                    && TextUtils.equals(serviceName, serviceInfo.name)) {
                 return info;
             }
         }
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index b65b349..0625fd2 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -16,7 +16,10 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity.VISION_FRAGMENT_NO;
+
 import android.content.ComponentName;
+import android.content.Intent;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.Menu;
@@ -30,7 +33,6 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SetupWizardUtils;
 import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
 import com.android.settings.search.actionbar.SearchMenuController;
 import com.android.settings.support.actionbar.HelpResourceProvider;
 import com.android.settingslib.core.instrumentation.Instrumentable;
@@ -123,19 +125,12 @@
                 && new ComponentName(getPackageName(),
                 CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW).equals(
                 getIntent().getComponent())) {
-            final Bundle args = new Bundle();
-            args.putInt(HelpResourceProvider.HELP_URI_RESOURCE_KEY, 0);
-            args.putBoolean(SearchMenuController.NEED_SEARCH_ICON_IN_ACTION_BAR, false);
-            final SubSettingLauncher subSettingLauncher = new SubSettingLauncher(this)
-                    .setDestination(FontSizePreferenceFragmentForSetupWizard.class.getName())
-                    .setArguments(args)
-                    .setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN)
-                    .setExtras(SetupWizardUtils.copyLifecycleExtra(getIntent().getExtras(),
-                            new Bundle()))
-                    .setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_FADE);
-
+            final Intent intent = new Intent(this,
+                    AccessibilityScreenSizeForSetupWizardActivity.class);
+            intent.putExtra(VISION_FRAGMENT_NO,
+                    getResources().getInteger(R.integer.suw_font_size_fragment_no));
+            startActivity(intent);
             Log.d(LOG_TAG, "Launch font size settings");
-            subSettingLauncher.launch();
             finish();
         }
     }
diff --git a/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java b/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java
new file mode 100644
index 0000000..95b689b
--- /dev/null
+++ b/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 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.accessibility;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.widget.LinearLayout;
+
+import com.android.settings.R;
+
+import com.google.android.setupdesign.GlifPreferenceLayout;
+import com.google.android.setupdesign.util.ThemeHelper;
+
+/** Provides utility methods to accessibility settings for Setup Wizard only. */
+class AccessibilitySetupWizardUtils {
+
+    private AccessibilitySetupWizardUtils(){}
+
+    /**
+     * Update the {@link GlifPreferenceLayout} attributes if they have previously been initialized.
+     * When the SetupWizard supports the extended partner configs, it means the material layout
+     * would be applied. It should set a different padding/margin in views to align Settings style
+     * for accessibility feature pages.
+     *
+     * @param layout The layout instance
+     * @param title The text to be set as title
+     * @param description The text to be set as description
+     * @param icon The icon to be set
+     */
+    public static void updateGlifPreferenceLayout(Context context, GlifPreferenceLayout layout,
+            CharSequence title, CharSequence description, Drawable icon) {
+        layout.setHeaderText(title);
+        layout.setDescriptionText(description);
+        layout.setIcon(icon);
+        layout.setDividerInsets(Integer.MAX_VALUE, 0);
+
+        if (ThemeHelper.shouldApplyExtendedPartnerConfig(context)) {
+            final LinearLayout headerLayout = layout.findManagedViewById(R.id.sud_layout_header);
+            if (headerLayout != null) {
+                headerLayout.setPadding(0, layout.getPaddingTop(), 0,
+                        layout.getPaddingBottom());
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java
index 016ac05..ce8c6bf 100644
--- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java
@@ -17,13 +17,45 @@
 package com.android.settings.accessibility;
 
 import android.app.settings.SettingsEnums;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.R;
+
+import com.google.android.setupdesign.GlifPreferenceLayout;
 
 public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard
         extends ToggleScreenMagnificationPreferenceFragment {
 
     @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
+        final String title = getContext().getString(
+                R.string.accessibility_screen_magnification_title);
+        final String description = getContext().getString(R.string.accelerometer_title);
+        final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
+        AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
+                description, icon);
+
+        // Hide the setting from the vision settings.
+        mSettingsPreference.setVisible(false);
+    }
+
+    @Override
+    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+            Bundle savedInstanceState) {
+        final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
+        return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
     }
@@ -49,12 +81,4 @@
         // Hides help center in action bar and footer bar in SuW
         return 0;
     }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-
-        // Hide the setting from the vision settings.
-        mSettingsPreference.setVisible(false);
-    }
 }
diff --git a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
index c0d54e8..316ce52 100644
--- a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
@@ -17,8 +17,17 @@
 package com.android.settings.accessibility;
 
 import android.app.settings.SettingsEnums;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.R;
+
+import com.google.android.setupdesign.GlifPreferenceLayout;
 
 public class ToggleScreenReaderPreferenceFragmentForSetupWizard
         extends ToggleAccessibilityServicePreferenceFragment {
@@ -28,10 +37,26 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+
+        final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
+        final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE);
+        final String description = getContext().getString(
+                R.string.accessibility_screen_magnification_title);
+        final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
+        AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
+                description, icon);
+
         mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked();
     }
 
     @Override
+    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+            Bundle savedInstanceState) {
+        final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
+        return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER;
     }
diff --git a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
index 9ca1f19..b5c1123 100644
--- a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
@@ -17,8 +17,17 @@
 package com.android.settings.accessibility;
 
 import android.app.settings.SettingsEnums;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.settings.R;
+
+import com.google.android.setupdesign.GlifPreferenceLayout;
 
 public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard
         extends InvisibleToggleAccessibilityServicePreferenceFragment {
@@ -28,10 +37,25 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+
+        final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
+        final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE);
+        final String description = getContext().getString(R.string.select_to_speak_summary);
+        final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
+        AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
+                description, icon);
+
         mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked();
     }
 
     @Override
+    public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
+            Bundle savedInstanceState) {
+        final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
+        return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK;
     }
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java b/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java
new file mode 100644
index 0000000..7585dce
--- /dev/null
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingProvider.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 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.activityembedding;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+/**
+ * A content provider for querying the state of activity embedding feature
+ */
+public class ActivityEmbeddingProvider extends ContentProvider {
+
+    private static final String METHOD_IS_EMBEDDING_ACTIVITY_ENABLED = "isEmbeddingActivityEnabled";
+    private static final String EXTRA_ENABLED_STATE = "enabled_state";
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Bundle call(String method, String arg, Bundle extras) {
+        if (TextUtils.equals(method, METHOD_IS_EMBEDDING_ACTIVITY_ENABLED)) {
+            final Bundle bundle = new Bundle();
+            bundle.putBoolean(EXTRA_ENABLED_STATE,
+                    ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext()));
+            return bundle;
+        }
+        return null;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 4581f6c..27b20cf 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -421,6 +421,11 @@
         ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile);
         mMetricsFeatureProvider.logStartedIntent(intent, sourceMetricCategory);
 
+        //TODO(b/201970810): Add test cases.
+        if (tile.isNewTask(mContext)) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+
         if (tile.userHandle == null || tile.isPrimaryProfileOnly()) {
             activity.startActivity(intent);
         } else if (tile.userHandle.size() == 1) {
diff --git a/src/com/android/settings/display/FontSizePreferenceFragmentForSetupWizard.java b/src/com/android/settings/display/FontSizePreferenceFragmentForSetupWizard.java
index 04b6dc3..627f107 100644
--- a/src/com/android/settings/display/FontSizePreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/display/FontSizePreferenceFragmentForSetupWizard.java
@@ -18,10 +18,17 @@
 
 import android.app.settings.SettingsEnums;
 
+import com.android.settings.R;
+
 public class FontSizePreferenceFragmentForSetupWizard
         extends ToggleFontSizePreferenceFragment {
 
     @Override
+    protected int getActivityLayoutResId() {
+        return R.layout.suw_font_size_fragment;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.SUW_ACCESSIBILITY_FONT_SIZE;
     }
diff --git a/src/com/android/settings/display/PreviewPagerAdapter.java b/src/com/android/settings/display/PreviewPagerAdapter.java
index 018be32..a424b1d 100644
--- a/src/com/android/settings/display/PreviewPagerAdapter.java
+++ b/src/com/android/settings/display/PreviewPagerAdapter.java
@@ -109,6 +109,10 @@
         return (view == object);
     }
 
+    FrameLayout[] getPreviewFrames() {
+        return mPreviewFrames;
+    }
+
     boolean isAnimating() {
         return mAnimationCounter > 0;
     }
diff --git a/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java b/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java
index abd14d2..c6d5b8b 100644
--- a/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java
+++ b/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java
@@ -264,6 +264,12 @@
         @Override
         public void onPageSelected(int position) {
             mPreviewPager.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
+            // To avoid displaying previous page on the left side in SUW landscape mode for
+            // large size.
+            if (position > 0) {
+                mPreviewPagerAdapter.getPreviewFrames()[position - 1].setVisibility(View.INVISIBLE);
+            }
+            mPreviewPagerAdapter.getPreviewFrames()[position].setVisibility(View.VISIBLE);
         }
     };
 
diff --git a/src/com/android/settings/display/ScreenZoomPreferenceFragmentForSetupWizard.java b/src/com/android/settings/display/ScreenZoomPreferenceFragmentForSetupWizard.java
index cfa7b5d..7185c63 100644
--- a/src/com/android/settings/display/ScreenZoomPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/display/ScreenZoomPreferenceFragmentForSetupWizard.java
@@ -18,9 +18,16 @@
 
 import android.app.settings.SettingsEnums;
 
+import com.android.settings.R;
+
 public class ScreenZoomPreferenceFragmentForSetupWizard extends ScreenZoomSettings {
 
     @Override
+    protected int getActivityLayoutResId() {
+        return R.layout.suw_screen_zoom_fragment;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return SettingsEnums.SUW_ACCESSIBILITY_DISPLAY_SIZE;
     }
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index 8541179..4249c44 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -350,7 +350,7 @@
     private void addAllPreferences() {
         final List<BatteryDiffEntry> entries =
             mBatteryIndexedMap.get(Integer.valueOf(mTrapezoidIndex));
-        addFooterPreferenceIfNeeded(!entries.isEmpty());
+        addFooterPreferenceIfNeeded(entries != null && !entries.isEmpty());
         if (entries == null) {
             Log.w(TAG, "cannot find BatteryDiffEntry for:" + mTrapezoidIndex);
             return;
diff --git a/src/com/android/settings/fuelgauge/BatteryChartView.java b/src/com/android/settings/fuelgauge/BatteryChartView.java
index 7bc60b2..98cfdc8 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartView.java
@@ -79,12 +79,14 @@
     private boolean mIsSlotsClickabled;
     private String[] mPercentages = getPercentages();
 
-    @VisibleForTesting int mSelectedIndex;
+    @VisibleForTesting int mHoveredIndex = SELECTED_INDEX_INVALID;
+    @VisibleForTesting int mSelectedIndex = SELECTED_INDEX_INVALID;
     @VisibleForTesting String[] mTimestamps;
 
     // Colors for drawing the trapezoid shape and dividers.
     private int mTrapezoidColor;
     private int mTrapezoidSolidColor;
+    private int mTrapezoidHoverColor;
     // For drawing the percentage information.
     private int mTextPadding;
     private final Rect mIndent = new Rect();
@@ -108,7 +110,7 @@
     Paint mTrapezoidCurvePaint = null;
     private TrapezoidSlot[] mTrapezoidSlots;
     // Records the location to calculate selected index.
-    private MotionEvent mTouchUpEvent;
+    private float mTouchUpEventX = Float.MIN_VALUE;
     private BatteryChartView.OnSelectListener mOnSelectListener;
 
     public BatteryChartView(Context context) {
@@ -254,21 +256,49 @@
     public boolean onTouchEvent(MotionEvent event) {
         // Caches the location to calculate selected trapezoid index.
         final int action = event.getAction();
-        if (action == MotionEvent.ACTION_UP) {
-            mTouchUpEvent = MotionEvent.obtain(event);
-        } else if (action == MotionEvent.ACTION_CANCEL) {
-            mTouchUpEvent = null; // reset
+        switch (action) {
+            case MotionEvent.ACTION_UP:
+                mTouchUpEventX = event.getX();
+                break;
+            case MotionEvent.ACTION_CANCEL:
+                mTouchUpEventX = Float.MIN_VALUE; // reset
+                break;
         }
         return super.onTouchEvent(event);
     }
 
     @Override
+    public boolean onHoverEvent(MotionEvent event) {
+        final int action = event.getAction();
+        switch (action) {
+            case MotionEvent.ACTION_HOVER_ENTER:
+            case MotionEvent.ACTION_HOVER_MOVE:
+                final int trapezoidIndex = getTrapezoidIndex(event.getX());
+                if (mHoveredIndex != trapezoidIndex) {
+                    mHoveredIndex = trapezoidIndex;
+                    invalidate();
+                }
+                break;
+        }
+        return super.onHoverEvent(event);
+    }
+
+    @Override
+    public void onHoverChanged(boolean hovered) {
+        super.onHoverChanged(hovered);
+        if (!hovered) {
+            mHoveredIndex = SELECTED_INDEX_INVALID; // reset
+            invalidate();
+        }
+    }
+
+    @Override
     public void onClick(View view) {
-        if (mTouchUpEvent == null) {
+        if (mTouchUpEventX == Float.MIN_VALUE) {
             Log.w(TAG, "invalid motion event for onClick() callback");
             return;
         }
-        final int trapezoidIndex = getTrapezoidIndex(mTouchUpEvent.getX());
+        final int trapezoidIndex = getTrapezoidIndex(mTouchUpEventX);
         // Ignores the click event if the level is zero.
         if (trapezoidIndex == SELECTED_INDEX_INVALID
                 || !isValidToDraw(trapezoidIndex)) {
@@ -347,6 +377,8 @@
         setBackgroundColor(Color.TRANSPARENT);
         mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context);
         mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor);
+        mTrapezoidHoverColor = Utils.getColorAttrDefaultColor(context,
+            com.android.internal.R.attr.colorAccentSecondaryVariant);
         // Initializes the divider line paint.
         final Resources resources = getContext().getResources();
         mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width);
@@ -494,7 +526,8 @@
                     ? mTrapezoidColor
                     : mSelectedIndex == index || mSelectedIndex == SELECTED_INDEX_ALL
                         ? mTrapezoidSolidColor : mTrapezoidColor;
-            mTrapezoidPaint.setColor(trapezoidColor);
+            final boolean isHover = mHoveredIndex == index && isValidToDraw(mHoveredIndex);
+            mTrapezoidPaint.setColor(isHover ? mTrapezoidHoverColor : trapezoidColor);
 
             final float leftTop = round(trapezoidBottom - mLevels[index] * unitHeight);
             final float rightTop = round(trapezoidBottom - mLevels[index + 1] * unitHeight);
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
index a8e0317..b6d7efe 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java
@@ -140,6 +140,11 @@
     boolean isChartGraphSlotsEnabled(Context context);
 
     /**
+     * Checks whether adaptive charging feature is supported in this device
+     */
+    boolean isAdaptiveChargingSupported();
+
+    /**
      * Gets a intent for one time bypass charge limited to resume charging.
      */
     Intent getResumeChargeIntent();
diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
index e2c7800..3f47af4 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java
@@ -167,6 +167,11 @@
     }
 
     @Override
+    public boolean isAdaptiveChargingSupported() {
+        return false;
+    }
+
+    @Override
     public Intent getResumeChargeIntent() {
         return null;
     }
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
index 59a592c..1a7fa38 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverButtonPreferenceController.java
@@ -19,6 +19,8 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.PowerManager;
 import android.provider.SettingsSlicesContract;
 import android.widget.Switch;
@@ -42,10 +44,12 @@
 public class BatterySaverButtonPreferenceController extends
         TogglePreferenceController implements OnMainSwitchChangeListener, LifecycleObserver,
         OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
+    private static final long SWITCH_ANIMATION_DURATION = 350L;
 
     private final BatterySaverReceiver mBatterySaverReceiver;
     private final PowerManager mPowerManager;
 
+    private Handler mHandler;
     private MainSwitchPreference mPreference;
 
     public BatterySaverButtonPreferenceController(Context context, String key) {
@@ -53,6 +57,7 @@
         mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         mBatterySaverReceiver = new BatterySaverReceiver(context);
         mBatterySaverReceiver.setBatterySaverListener(this);
+        mHandler = new Handler(Looper.getMainLooper());
     }
 
     @Override
@@ -83,6 +88,7 @@
     @Override
     public void onStop() {
         mBatterySaverReceiver.setListening(false);
+        mHandler.removeCallbacksAndMessages(null /* token */);
     }
 
     @Override
@@ -114,6 +120,11 @@
 
     @Override
     public void onPowerSaveModeChanged() {
+        mHandler.postDelayed(() -> onPowerSaveModeChangedInternal(),
+                SWITCH_ANIMATION_DURATION);
+    }
+
+    private void onPowerSaveModeChangedInternal() {
         final boolean isChecked = isChecked();
         if (mPreference != null && mPreference.isChecked() != isChecked) {
             mPreference.setChecked(isChecked);
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java
index 790264c..d920a8e 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java
@@ -64,7 +64,10 @@
             preference.setSummary(mContext.getResources().getQuantityString(
                     R.plurals.battery_manager_app_restricted, num, num));
         } else {
-            preference.setSummary(R.string.battery_manager_summary);
+            preference.setSummary(
+                    mPowerUsageFeatureProvider.isAdaptiveChargingSupported()
+                            ? R.string.battery_manager_summary
+                            : R.string.battery_manager_summary_unsupported);
         }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivityTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivityTest.java
new file mode 100644
index 0000000..05e5b32
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityScreenSizeForSetupWizardActivityTest.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2021 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.accessibility;
+
+import static com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity.VISION_FRAGMENT_NO;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import com.google.android.setupcompat.template.FooterBarMixin;
+import com.google.android.setupdesign.GlifLayout;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilityScreenSizeForSetupWizardActivity} */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilityScreenSizeForSetupWizardActivityTest {
+    private static final int DISPLAY_SIZE_FRAGMENT_NO = 1;
+
+    private Context mContext = ApplicationProvider.getApplicationContext();
+    private AccessibilityScreenSizeForSetupWizardActivity mActivity;
+
+    @Before
+    public void setup() {
+        final Intent intent = new Intent();
+        intent.putExtra(VISION_FRAGMENT_NO,
+                mContext.getResources().getInteger(R.integer.suw_font_size_fragment_no));
+        mActivity = Robolectric.buildActivity(AccessibilityScreenSizeForSetupWizardActivity.class,
+                intent).create().get();
+    }
+
+    @Test
+    public void generateHeader_setPageNoAsFontSize_returnFontSizeTitle() {
+        mActivity.generateHeader(
+                mActivity.getResources().getInteger(R.integer.suw_font_size_fragment_no));
+
+        final GlifLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+
+        assertThat(layout.getHeaderText()).isEqualTo(mContext.getText(R.string.title_font_size));
+    }
+
+    @Test
+    public void generateHeader_setPageNoAsDisplaySize_returnDisplaySizeTitle() {
+        mActivity.generateHeader(DISPLAY_SIZE_FRAGMENT_NO);
+
+        final GlifLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+
+        assertThat(layout.getHeaderText()).isEqualTo(mContext.getText(R.string.screen_zoom_title));
+    }
+
+    @Test
+    public void initFooterButton_generateDoneButton() {
+        mActivity.initFooterButton();
+
+        final GlifLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
+        final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
+
+        assertThat(mixin.getPrimaryButton().getText()).isEqualTo(mContext.getText(R.string.done));
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
index c3a630b..4d9668a 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivityTest.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.accessibility;
 
+import static com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity.VISION_FRAGMENT_NO;
 import static com.android.settings.accessibility.AccessibilitySettingsForSetupWizardActivity.CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -26,8 +27,6 @@
 import androidx.test.filters.SmallTest;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
@@ -42,45 +41,47 @@
 @SmallTest
 public class AccessibilitySettingsForSetupWizardActivityTest {
 
-  @Test
-  public void createSetupAccessibilityActivity_shouldBeSUWTheme() {
-    final Intent intent = new Intent();
-    AccessibilitySettingsForSetupWizardActivity activity =
-        Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class, intent).get();
+    @Test
+    public void createSetupAccessibilityActivity_shouldBeSUWTheme() {
+        final Intent intent = new Intent();
+        AccessibilitySettingsForSetupWizardActivity activity =
+                Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
+                        intent).get();
 
-    assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifV3Theme_Light);
-  }
+        assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifV3Theme_Light);
+    }
 
-  @Test
-  public void onCreate_hasFontSizeComponent_shouldGoToFontSizePreferenceDirectly() {
-    AccessibilitySettingsForSetupWizardActivity activity =
-            Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
-                    new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(
-                            RuntimeEnvironment.application, CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW)).
-                            putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true).
-                            putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
+    @Test
+    public void onCreate_hasFontSizeComponent_shouldGoToFontSizePreferenceDirectly() {
+        AccessibilitySettingsForSetupWizardActivity activity =
+                Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
+                        new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(
+                                RuntimeEnvironment.application,
+                                CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW))
+                                .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
+                                .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
 
-    activity.tryLaunchFontSizeSettings();
+        activity.tryLaunchFontSizeSettings();
 
-    final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
-    assertThat(launchIntent).isNotNull();
-    assertThat(launchIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo(
-            FontSizePreferenceFragmentForSetupWizard.class.getName());
-    assertThat(activity.isFinishing()).isTrue();
-  }
+        final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
+        assertThat(launchIntent).isNotNull();
+        assertThat(launchIntent.getIntExtra(VISION_FRAGMENT_NO, -1)).isEqualTo(
+                activity.getResources().getInteger(R.integer.suw_font_size_fragment_no));
+        assertThat(activity.isFinishing()).isTrue();
+    }
 
-  @Test
-  public void onCreate_noFontSizeComponent_shouldNotFinishCurrentActivity() {
-    AccessibilitySettingsForSetupWizardActivity activity =
-            Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
-                    new Intent(Intent.ACTION_MAIN).
-                            putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true).
-                            putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
+    @Test
+    public void onCreate_noFontSizeComponent_shouldNotFinishCurrentActivity() {
+        AccessibilitySettingsForSetupWizardActivity activity =
+                Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
+                        new Intent(Intent.ACTION_MAIN)
+                                .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
+                                .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
 
-    activity.tryLaunchFontSizeSettings();
+        activity.tryLaunchFontSizeSettings();
 
-    final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
-    assertThat(launchIntent).isNull();
-    assertThat(activity.isFinishing()).isFalse();
-  }
+        final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
+        assertThat(launchIntent).isNull();
+        assertThat(activity.isFinishing()).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java
new file mode 100644
index 0000000..e79b122
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2021 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.accessibility;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import com.google.android.setupdesign.GlifPreferenceLayout;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+/** Tests for {@link AccessibilitySetupWizardUtils} */
+@RunWith(RobolectricTestRunner.class)
+public class AccessibilitySetupWizardUtilsTest {
+
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+
+    @Test
+    public void setupGlifPreferenceLayout_assignValueToVariable() {
+        final String title = "title";
+        final String description = "description";
+        final Drawable icon = mock(Drawable.class);
+        GlifPreferenceLayout layout = mock(GlifPreferenceLayout.class);
+
+        AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(mContext, layout, title,
+                description, icon);
+
+        verify(layout).setHeaderText(title);
+        verify(layout).setDescriptionText(description);
+        verify(layout).setIcon(icon);
+        verify(layout).setHeaderText(title);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
index 4948986..c2de510 100644
--- a/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/BrightnessLevelPreferenceControllerTest.java
@@ -152,7 +152,8 @@
                 System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
 
         when(mDisplay.getBrightnessInfo()).thenReturn(
-                new BrightnessInfo(0.1f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
+                new BrightnessInfo(0.1f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
+                    0.5f));
 
         mController.updateState(mPreference);
 
@@ -166,7 +167,8 @@
                 System.SCREEN_BRIGHTNESS_MODE_MANUAL);
 
         when(mDisplay.getBrightnessInfo()).thenReturn(
-                new BrightnessInfo(0.5f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF));
+                new BrightnessInfo(0.5f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
+                    0.5f));
 
         mController.updateState(mPreference);
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
index c0b566a..95cacbb 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImplTest.java
@@ -157,6 +157,11 @@
     }
 
     @Test
+    public void testIsAdaptiveChargingSupported_returnFalse() {
+        assertThat(mPowerFeatureProvider.isAdaptiveChargingSupported()).isFalse();
+    }
+
+    @Test
     public void testGetResumeChargeIntent_returnNull() {
         assertThat(mPowerFeatureProvider.getResumeChargeIntent()).isNull();
     }