Merge "Log app special permission change for SPA" into udc-dev
diff --git a/res/drawable/ic_enterprise.xml b/res/drawable/ic_enterprise.xml
index c2d9df6..231f706 100644
--- a/res/drawable/ic_enterprise.xml
+++ b/res/drawable/ic_enterprise.xml
@@ -17,9 +17,9 @@
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
         android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
+        android:viewportWidth="960"
+        android:viewportHeight="960">
     <path
-        android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM12,15c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM14,6h-4L10,4h4v2z"
+        android:pathData="M140,840Q116,840 98,822Q80,804 80,780L80,300Q80,276 98,258Q116,240 140,240L320,240L320,140Q320,116 338,98Q356,80 380,80L580,80Q604,80 622,98Q640,116 640,140L640,240L820,240Q844,240 862,258Q880,276 880,300L880,780Q880,804 862,822Q844,840 820,840L140,840ZM380,240L580,240L580,140Q580,140 580,140Q580,140 580,140L380,140Q380,140 380,140Q380,140 380,140L380,240Z"
         android:fillColor="?android:attr/colorPrimary"/>
 </vector>
\ No newline at end of file
diff --git a/res/drawable/trackpad_bordered.xml b/res/drawable/trackpad_bordered.xml
new file mode 100644
index 0000000..940be8f
--- /dev/null
+++ b/res/drawable/trackpad_bordered.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+
+<inset
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <ripple
+        android:color="?android:attr/colorControlHighlight">
+        <item>
+            <shape android:shape="rectangle">
+                <corners android:radius="24dp"  />
+                <solid android:color="@android:color/transparent"/>
+                <stroke
+                    android:width="1dp"
+                    android:color="?androidprv:attr/materialColorPrimary"/>
+            </shape>
+        </item>
+    </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/drawable/trackpad_button_done_colored.xml b/res/drawable/trackpad_button_done_colored.xml
new file mode 100644
index 0000000..995d733
--- /dev/null
+++ b/res/drawable/trackpad_button_done_colored.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 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.
+-->
+
+<inset
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+    <ripple
+        android:color="?android:attr/colorControlHighlight">
+        <item>
+            <shape android:shape="rectangle">
+                <corners android:radius="24dp"/>
+                <solid android:color="?androidprv:attr/materialColorPrimary"/>
+            </shape>
+        </item>
+    </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/layout/dream_preference_layout.xml b/res/layout/dream_preference_layout.xml
index aff8ad3..05b7b6e 100644
--- a/res/layout/dream_preference_layout.xml
+++ b/res/layout/dream_preference_layout.xml
@@ -79,6 +79,7 @@
             android:textSize="@dimen/dream_item_title_text_size"
             android:textColor="@color/dream_card_text_color_state_list"
             android:drawablePadding="@dimen/dream_item_icon_padding"
+            android:drawableTint="@color/dream_card_icon_color_state_list"
             app:layout_constraintTop_toBottomOf="@+id/preview"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintStart_toStartOf="parent"
diff --git a/res/layout/trackpad_gesture_preview.xml b/res/layout/trackpad_gesture_preview.xml
index be2b6a0..15cc743 100644
--- a/res/layout/trackpad_gesture_preview.xml
+++ b/res/layout/trackpad_gesture_preview.xml
@@ -29,11 +29,11 @@
 
     <RelativeLayout
         android:layout_width="match_parent"
-        android:layout_height="48dp"
+        android:layout_height="wrap_content"
         android:layout_marginStart="8dip"
         android:layout_marginEnd="8dip"
         android:layout_marginTop="6dip"
-        android:layout_marginBottom="6dip"
+        android:layout_marginBottom="48dip"
         android:layout_weight="1">
 
         <Button
@@ -46,7 +46,7 @@
             android:layout_alignParentStart="true"
             android:paddingVertical="14dp"
             android:drawablePadding="9dp"
-            style="@style/ModifierKeyButtonCancel"
+            style="@style/TrackpadButtonCancel"
             android:textColor="?android:attr/textColorPrimary"
             android:text="@string/gesture_button_skip"/>
 
@@ -60,15 +60,16 @@
             android:layout_alignParentStart="true"
             android:paddingVertical="14dp"
             android:drawablePadding="9dp"
-            style="@style/ModifierKeyButtonCancel"
+            style="@style/TrackpadButtonCancel"
             android:textColor="?android:attr/textColorPrimary"
             android:text="@string/gesture_button_restart"/>
 
         <LinearLayout
             android:id="@+id/viewGroup"
-            android:layout_width="fill_parent"
-            android:layout_height="48dp"
-            android:gravity="center"/>
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_centerHorizontal="true"/>
 
         <Button
             android:id="@+id/button_next"
@@ -80,7 +81,7 @@
             android:layout_alignParentEnd="true"
             android:paddingVertical="14dp"
             android:drawablePadding="9dp"
-            style="@style/ModifierKeyButtonDone"
+            style="@style/TrackpadButtonDone"
             android:textColor="?androidprv:attr/materialColorOnPrimary"
             android:text="@string/gesture_button_next"/>
 
@@ -94,7 +95,7 @@
             android:layout_alignParentEnd="true"
             android:paddingVertical="14dp"
             android:drawablePadding="9dp"
-            style="@style/ModifierKeyButtonDone"
+            style="@style/TrackpadButtonDone"
             android:textColor="?androidprv:attr/materialColorOnPrimary"
             android:text="@string/gesture_button_done"/>
     </RelativeLayout>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 5618ed1..53766e7 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -380,6 +380,20 @@
         <item name="android:padding">4dp</item>
     </style>
 
+    <style name="TrackpadButtonDone" parent="@android:style/Widget.Material.Button">
+        <item name="android:background">@drawable/trackpad_button_done_colored</item>
+        <item name="android:stateListAnimator">@null</item>
+        <item name="android:textSize">16sp</item>
+        <item name="android:padding">4dp</item>
+    </style>
+
+    <style name="TrackpadButtonCancel" parent="@android:style/Widget.Material.Button">
+        <item name="android:background">@drawable/trackpad_bordered</item>
+        <item name="android:stateListAnimator">@null</item>
+        <item name="android:textSize">16sp</item>
+        <item name="android:padding">4dp</item>
+    </style>
+
     <style name="LockPatternContainerStyle">
         <item name="android:gravity">center</item>
         <item name="android:maxHeight">@dimen/biometric_auth_pattern_view_max_size</item>
diff --git a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
index af06a01..0446c20 100644
--- a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
+++ b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
@@ -43,18 +43,18 @@
     private final List<CredentialProviderInfo> mCredentialProviderInfos;
     private final @Nullable AutofillServiceInfo mAutofillServiceInfo;
     private final boolean mIsDefaultAutofillProvider;
-    private final boolean mIsDefaultCredmanProvider;
+    private final boolean mIsPrimaryCredmanProvider;
 
     /** Constructs an information instance from both autofill and credential provider. */
     public CombinedProviderInfo(
             @Nullable List<CredentialProviderInfo> cpis,
             @Nullable AutofillServiceInfo asi,
             boolean isDefaultAutofillProvider,
-            boolean isDefaultCredmanProvider) {
+            boolean IsPrimaryCredmanProvider) {
         mCredentialProviderInfos = new ArrayList<>(cpis);
         mAutofillServiceInfo = asi;
         mIsDefaultAutofillProvider = isDefaultAutofillProvider;
-        mIsDefaultCredmanProvider = isDefaultCredmanProvider;
+        mIsPrimaryCredmanProvider = IsPrimaryCredmanProvider;
     }
 
     /** Returns the credential provider info. */
@@ -149,8 +149,8 @@
     }
 
     /** Returns whether the provider is the default credman provider. */
-    public boolean isDefaultCredmanProvider() {
-        return mIsDefaultCredmanProvider;
+    public boolean isPrimaryCredmanProvider() {
+        return mIsPrimaryCredmanProvider;
     }
 
     /** Returns the settings subtitle. */
@@ -192,7 +192,13 @@
             }
         }
 
-        // TODO(280454916): Add logic here.
+        // If there is a primary cred man provider then return that.
+        for (CombinedProviderInfo cpi : providers) {
+            if (cpi.isPrimaryCredmanProvider()) {
+                return cpi;
+            }
+        }
+
         return null;
     }
 
@@ -250,14 +256,14 @@
             }
 
             // Check if we have any enabled cred man services.
-            boolean isDefaultCredmanProvider = false;
+            boolean isPrimaryCredmanProvider = false;
             if (!cpi.isEmpty()) {
-                isDefaultCredmanProvider = cpi.get(0).isEnabled();
+                isPrimaryCredmanProvider = cpi.get(0).isPrimary();
             }
 
             cmpi.add(
                     new CombinedProviderInfo(
-                            cpi, selectedAsi, isDefaultAutofillProvider, isDefaultCredmanProvider));
+                            cpi, selectedAsi, isDefaultAutofillProvider, isPrimaryCredmanProvider));
         }
 
         return cmpi;
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index 069336e..bd7c485 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -321,7 +321,7 @@
 
         mEnabledPackageNames.clear();
         for (CredentialProviderInfo cpi : availableServices) {
-            if (cpi.isEnabled()) {
+            if (cpi.isEnabled() && !cpi.isPrimary()) {
                 mEnabledPackageNames.add(cpi.getServiceInfo().packageName);
             }
         }
@@ -560,15 +560,25 @@
             return;
         }
 
-        List<String> enabledServices = getEnabledSettings();
+        // Get the existing primary providers since we don't touch them in
+        // this part of the UI we should just copy them over.
+        Set<String> primaryServices = new HashSet<>();
+        for (CredentialProviderInfo service : mServices) {
+            if (service.isPrimary()) {
+                primaryServices.add(service.getServiceInfo().getComponentName().flattenToString());
+            }
+        }
+
         mCredentialManager.setEnabledProviders(
-                enabledServices,
+                new ArrayList<>(primaryServices),
+                getEnabledSettings(),
                 getUser(),
                 mExecutor,
                 new OutcomeReceiver<Void, SetEnabledProvidersException>() {
                     @Override
                     public void onResult(Void result) {
                         Log.i(TAG, "setEnabledProviders success");
+                        updateFromExternal();
                     }
 
                     @Override
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
index cfaf7a2..793aa3c 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
@@ -47,7 +47,9 @@
 import com.android.settingslib.widget.CandidateInfo;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 public class DefaultCombinedPicker extends DefaultAppPickerFragment {
 
@@ -338,9 +340,9 @@
         return true;
     }
 
-    private void setProviders(String autofillProvider, List<String> credManProviders) {
+    private void setProviders(String autofillProvider, List<String> primaryCredManProviders) {
         if (TextUtils.isEmpty(autofillProvider)) {
-            if (credManProviders.size() > 0) {
+            if (primaryCredManProviders.size() > 0) {
                 autofillProvider =
                         CredentialManagerPreferenceController
                                 .AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER;
@@ -350,12 +352,25 @@
         Settings.Secure.putStringForUser(
                 getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId);
 
-        CredentialManager service = getCredentialProviderService();
+        final CredentialManager service = getCredentialProviderService();
         if (service == null) {
             return;
         }
 
+        // Get the existing secondary providers since we don't touch them in
+        // this part of the UI we should just copy them over.
+        final List<String> credManProviders = new ArrayList<>();
+        for (CredentialProviderInfo cpi :
+                service.getCredentialProviderServices(
+                        mUserId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) {
+
+            if (cpi.isEnabled()) {
+                credManProviders.add(cpi.getServiceInfo().getComponentName().flattenToString());
+            }
+        }
+
         service.setEnabledProviders(
+                primaryCredManProviders,
                 credManProviders,
                 mUserId,
                 ContextCompat.getMainExecutor(getContext()),
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
index ca049bc..64d4f0d 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
@@ -135,12 +135,12 @@
     /** Provides Intent to setting activity for the specified autofill service. */
     static final class AutofillSettingIntentProvider {
 
-        private final String mSelectedKey;
+        private final String mKey;
         private final Context mContext;
         private final int mUserId;
 
         public AutofillSettingIntentProvider(Context context, int userId, String key) {
-            mSelectedKey = key;
+            mKey = key;
             mContext = context;
             mUserId = userId;
         }
@@ -153,10 +153,9 @@
 
             for (ResolveInfo resolveInfo : resolveInfos) {
                 final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
-                final String flattenKey =
-                        new ComponentName(serviceInfo.packageName, serviceInfo.name)
-                                .flattenToString();
-                if (TextUtils.equals(mSelectedKey, flattenKey)) {
+
+                // If there are multiple autofill services then pick the first one.
+                if (mKey.startsWith(serviceInfo.packageName)) {
                     final String settingsActivity;
                     try {
                         settingsActivity =
@@ -164,7 +163,7 @@
                                         .getSettingsActivity();
                     } catch (SecurityException e) {
                         // Service does not declare the proper permission, ignore it.
-                        Log.w(TAG, "Error getting info for " + serviceInfo + ": " + e);
+                        Log.e(TAG, "Error getting info for " + serviceInfo + ": " + e);
                         return null;
                     }
                     if (TextUtils.isEmpty(settingsActivity)) {
diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java
index aa71aab..1d1c3bd 100644
--- a/src/com/android/settings/dream/DreamAdapter.java
+++ b/src/com/android/settings/dream/DreamAdapter.java
@@ -19,7 +19,6 @@
 import android.annotation.LayoutRes;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.VectorDrawable;
 import android.text.TextUtils;
 import android.util.SparseIntArray;
 import android.view.LayoutInflater;
@@ -86,10 +85,6 @@
             final Drawable icon = item.isActive()
                     ? mContext.getDrawable(R.drawable.ic_dream_check_circle)
                     : item.getIcon().mutate();
-            if (icon instanceof VectorDrawable) {
-                icon.setTintList(
-                        mContext.getColorStateList(R.color.dream_card_icon_color_state_list));
-            }
             final int iconSize = mContext.getResources().getDimensionPixelSize(
                     R.dimen.dream_item_icon_size);
             icon.setBounds(0, 0, iconSize, iconSize);
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 6c79287..c910e69 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -11,8 +11,6 @@
  * 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.fuelgauge;
@@ -25,6 +23,7 @@
 import android.os.BatteryManager;
 import android.os.PowerManager;
 import android.text.TextUtils;
+import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.PreferenceFragmentCompat;
@@ -48,6 +47,8 @@
 public class BatteryHeaderPreferenceController extends BasePreferenceController
         implements PreferenceControllerMixin, LifecycleObserver, OnStart,
         BatteryPreferenceController {
+    private static final String TAG = "BatteryHeaderPreferenceController";
+
     @VisibleForTesting
     static final String KEY_BATTERY_HEADER = "battery_header";
     private static final int BATTERY_MAX_LEVEL = 100;
@@ -86,7 +87,7 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mBatteryUsageProgressBarPref = screen.findPreference(getPreferenceKey());
-        //Set up loading text first to prevent layout flaky before info loaded.
+        // Set up loading text first to prevent layout flaky before info loaded.
         mBatteryUsageProgressBarPref.setBottomSummary(
                 mContext.getString(R.string.settings_license_activity_loading));
 
@@ -109,7 +110,9 @@
     }
 
     private CharSequence generateLabel(BatteryInfo info) {
-        if (BatteryUtils.isBatteryDefenderOn(info)) {
+        if (Utils.containsIncompatibleChargers(mContext, TAG)) {
+            return mContext.getString(R.string.battery_info_status_not_charging);
+        } else if (BatteryUtils.isBatteryDefenderOn(info)) {
             return null;
         } else if (info.remainingLabel == null
                 || info.batteryStatus == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
@@ -151,12 +154,14 @@
      * Callback which receives text for the summary line.
      */
     public void updateBatteryStatus(String label, BatteryInfo info) {
-        mBatteryUsageProgressBarPref.setBottomSummary(label != null ? label : generateLabel(info));
+        final CharSequence summary = label != null ? label : generateLabel(info);
+        mBatteryUsageProgressBarPref.setBottomSummary(summary);
+        Log.d(TAG, "updateBatteryStatus: " + label + " summary: " + summary);
     }
 
     public void quickUpdateHeaderPreference() {
-        Intent batteryBroadcast = mContext.registerReceiver(null,
-                new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        Intent batteryBroadcast = com.android.settingslib.fuelgauge.BatteryUtils
+                .getBatteryIntent(mContext);
         final int batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
         final boolean discharging =
                 batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0;
diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index d686594..254cf04 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -164,6 +164,7 @@
         if (summary != null) {
             mPreference.setSummary(summary);
         }
+        Log.d(TAG, "updateBatteryStatus: " + label + " summary: " + summary);
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index a51e084..6914c30 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -1754,7 +1754,7 @@
 
     private static Set<String> getSystemAppsPackageNames(Context context) {
         return sTestSystemAppsPackageNames != null ? sTestSystemAppsPackageNames
-                : AppListRepositoryUtil.getSystemPackageNames(context, context.getUserId(), false);
+                : AppListRepositoryUtil.getSystemPackageNames(context, context.getUserId());
     }
 
     private static Set<Integer> getSystemAppsUids(Context context) {
diff --git a/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java b/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java
index b644eb1..1a90376 100644
--- a/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java
+++ b/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java
@@ -17,17 +17,21 @@
 package com.android.settings.inputmethod;
 
 import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
 
 import android.app.Activity;
 import android.app.Dialog;
 import android.content.Context;
+import android.graphics.Color;
 import android.graphics.Point;
 import android.os.Bundle;
 import android.view.Display;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 import android.view.Window;
+import android.view.WindowInsets;
 import android.view.WindowManager;
 import android.widget.Button;
 import android.widget.FrameLayout;
@@ -87,6 +91,7 @@
         if (window == null) {
             return;
         }
+        setLayoutEdgeToEdge(window);
         final Point size = getScreenSize();
         final WindowManager.LayoutParams attributes = window.getAttributes();
         attributes.width = (int) (size.x * 0.75);
@@ -94,14 +99,28 @@
     }
 
     @Override
+    public void onPause() {
+        super.onPause();
+        dismiss();
+    }
+
+    private static void setLayoutEdgeToEdge(Window window) {
+        View windowDecorView = window.getDecorView();
+        windowDecorView.setSystemUiVisibility(
+                windowDecorView.getSystemUiVisibility()
+                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+        window.setNavigationBarColor(Color.TRANSPARENT);
+    }
+
+    @Override
     public Dialog onCreateDialog(final Bundle savedInstanceState) {
         Dialog dialog = super.onCreateDialog(savedInstanceState);
+
         mInflater = mContext.getSystemService(LayoutInflater.class);
-
-        View gestureEducationView = mInflater.inflate(R.layout.trackpad_gesture_preview, null);
-        addViewPager(gestureEducationView);
-        dialog.setContentView(gestureEducationView);
-
+        View contentView = mInflater.inflate(R.layout.trackpad_gesture_preview, null);
+        addViewPager(contentView);
+        dialog.setContentView(contentView);
         Window gestureDialogWindow = dialog.getWindow();
         gestureDialogWindow.setType(TYPE_SYSTEM_DIALOG);
 
@@ -109,8 +128,40 @@
         FrameLayout bottomSheet = (FrameLayout)
                 dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);
         bottomSheet.setBackgroundResource(android.R.color.transparent);
-        BottomSheetBehavior.from(bottomSheet)
-                .setState(BottomSheetBehavior.STATE_EXPANDED);
+        BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
+        if (!isGestureNavigationEnabled()) {
+            behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+        }
+        ViewTreeObserver observer = contentView.getViewTreeObserver();
+        observer.addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                        int contentViewHeight = contentView.getMeasuredHeight();
+                        int navigationBarHeight = getNavigationBarHeight();
+                        behavior.setPeekHeight(contentViewHeight - navigationBarHeight);
+                    }
+                });
+
+        // The gesture education view shouldn't be draggable."
+        behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
+            @Override
+            public void onStateChanged(View bottomSheet, int newState) {
+                if (newState == BottomSheetBehavior.STATE_DRAGGING) {
+                    if (isGestureNavigationEnabled()) {
+                        behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+                    } else {
+                        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+                    }
+                }
+            }
+
+            @Override
+            public void onSlide(View bottomSheet, float slideOffset) {
+                // Do nothing.
+            }
+        });
 
         return dialog;
     }
@@ -263,4 +314,16 @@
         display.getSize(size);
         return size;
     }
+
+    private int getNavigationBarHeight() {
+        final Activity activity = (Activity) mContext;
+        WindowInsets insets =
+                activity.getWindowManager().getCurrentWindowMetrics().getWindowInsets();
+        return insets.getInsets(WindowInsets.Type.navigationBars()).bottom;
+    }
+
+    private boolean isGestureNavigationEnabled() {
+        return NAV_BAR_MODE_GESTURAL == mContext.getResources().getInteger(
+                com.android.internal.R.integer.config_navBarInteractionMode);
+    }
 }
diff --git a/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
index 0bbfb98..10d3013 100644
--- a/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
@@ -30,12 +30,12 @@
 
     @Override
     public boolean isChecked() {
-        return InputSettings.useTouchpadNaturalScrolling(mContext);
+        return !InputSettings.useTouchpadNaturalScrolling(mContext);
     }
 
     @Override
     public boolean setChecked(boolean isChecked) {
-        InputSettings.setTouchpadNaturalScrolling(mContext, isChecked);
+        InputSettings.setTouchpadNaturalScrolling(mContext, !isChecked);
         return true;
     }
 
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index 02455a1..38f6596 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -940,28 +940,11 @@
      * Copied from WifiCallingPreferenceController#isWifiCallingEnabled()
      */
     public static boolean isWifiCallingEnabled(Context context, int subId,
-            @Nullable WifiCallingQueryImsState queryImsState,
-            @Nullable PhoneAccountHandle phoneAccountHandle) {
-        if (phoneAccountHandle == null){
-            phoneAccountHandle = context.getSystemService(TelecomManager.class)
-                    .getSimCallManagerForSubscription(subId);
+            @Nullable WifiCallingQueryImsState queryImsState) {
+        if (queryImsState == null) {
+            queryImsState = new WifiCallingQueryImsState(context, subId);
         }
-        boolean isWifiCallingEnabled;
-        if (phoneAccountHandle != null) {
-            final Intent intent = buildPhoneAccountConfigureIntent(context, phoneAccountHandle);
-            if (intent == null) {
-                Log.d(TAG, "Can not get phoneAccount configure intent.");
-                isWifiCallingEnabled = false;
-            } else {
-                isWifiCallingEnabled = true;
-            }
-        } else {
-            if (queryImsState == null) {
-                queryImsState = new WifiCallingQueryImsState(context, subId);
-            }
-            isWifiCallingEnabled = queryImsState.isReadyToWifiCalling();
-        }
-        return isWifiCallingEnabled;
+        return queryImsState.isReadyToWifiCalling();
     }
 
     /**
diff --git a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
index 7ad9e03..ebfb283 100644
--- a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
+++ b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
@@ -22,7 +22,6 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.os.PersistableBundle;
 import android.provider.Settings;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -314,8 +313,7 @@
     @VisibleForTesting
     protected boolean shouldShowWifiCallingForSub(int subId) {
         if (SubscriptionManager.isValidSubscriptionId(subId)
-                && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, queryImsState(subId),
-                null)) {
+                && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, queryImsState(subId))) {
             return true;
         }
         return false;
diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
index 1bc2f90..03cc23f 100644
--- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
@@ -71,7 +71,7 @@
     @Override
     public int getAvailabilityStatus(int subId) {
         return SubscriptionManager.isValidSubscriptionId(subId)
-                && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, null, null)
+                && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, null)
                 ? AVAILABLE
                 : UNSUPPORTED_ON_DEVICE;
     }
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index e35b0d8..0bf13b1 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -854,6 +854,19 @@
         }
 
         @Override
+        public void onStop() {
+            super.onStop();
+            // hasCredential checks to see if user chooses a password for screen lock. If the
+            // screen lock is None or Swipe, we do not want to call getActivity().finish().
+            // Otherwise, bugs would be caused. (e.g. b/278488549, b/278530059)
+            final boolean hasCredential = mLockPatternUtils.isSecure(mUserId);
+            if (!getActivity().isChangingConfigurations()
+                    && !mWaitingForConfirmation && hasCredential) {
+                getActivity().finish();
+            }
+        }
+
+        @Override
         public void onDestroy() {
             super.onDestroy();
             if (mUserPassword != null) {
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettings.java b/src/com/android/settings/wifi/calling/WifiCallingSettings.java
index 42ce1b1..0c3457c 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettings.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettings.java
@@ -257,8 +257,10 @@
         for (SubscriptionInfo subInfo : subInfoList) {
             int subId = subInfo.getSubscriptionId();
             try {
-                if (MobileNetworkUtils.isWifiCallingEnabled(getContext(), subId,
-                        queryImsState(subId), null)) {
+                if (MobileNetworkUtils.isWifiCallingEnabled(
+                        getContext(),
+                        subId,
+                        queryImsState(subId))) {
                     selectedList.add(subInfo);
                 }
             } catch (Exception exception) {}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 78534e1..f94e5bf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -11,10 +11,7 @@
  * 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.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
@@ -29,6 +26,9 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
 import android.icu.text.NumberFormat;
 import android.os.BatteryManager;
 import android.os.PowerManager;
@@ -43,6 +43,7 @@
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
 import com.android.settings.fuelgauge.batterytip.tips.SmartBatteryTip;
+import com.android.settings.testutils.BatteryTestUtils;
 import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
 import com.android.settings.testutils.shadow.ShadowUtils;
 import com.android.settings.widget.EntityHeaderController;
@@ -85,6 +86,13 @@
     private UsageProgressBarPreference mBatteryUsageProgressBarPref;
     @Mock
     private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
+    @Mock
+    private UsbPort mUsbPort;
+    @Mock
+    private UsbManager mUsbManager;
+    @Mock
+    private UsbPortStatus mUsbPortStatus;
+
     private BatteryHeaderPreferenceController mController;
     private Context mContext;
     private ShadowPowerManager mShadowPowerManager;
@@ -99,6 +107,7 @@
         mLifecycleOwner = () -> mLifecycle;
         mLifecycle = new Lifecycle(mLifecycleOwner);
         mContext = spy(RuntimeEnvironment.application);
+        when(mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
         ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
 
         mBatteryIntent = new Intent();
@@ -290,6 +299,16 @@
     }
 
     @Test
+    public void updatePreference_incompatibleCharger_showNotChargingState() {
+        BatteryTestUtils.setupIncompatibleEvent(mUsbPort, mUsbManager, mUsbPortStatus);
+
+        mController.updateHeaderPreference(mBatteryInfo);
+
+        verify(mBatteryUsageProgressBarPref).setBottomSummary(
+            mContext.getString(R.string.battery_info_status_not_charging));
+    }
+
+    @Test
     public void quickUpdateHeaderPreference_onlyUpdateBatteryLevelAndChargingState() {
         mController.quickUpdateHeaderPreference();
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 5f825ae..b444309 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -36,6 +36,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
+import com.android.settings.testutils.BatteryTestUtils;
 
 import org.junit.Before;
 import org.junit.Ignore;
@@ -136,7 +137,7 @@
 
     @Test
     public void getDashboardLabel_incompatibleCharger_returnsCorrectLabel() {
-        setupIncompatibleEvent();
+        BatteryTestUtils.setupIncompatibleEvent(mUsbPort, mUsbManager, mUsbPortStatus);
         mController.mPreference = new Preference(mContext);
         BatteryInfo info = new BatteryInfo();
 
@@ -150,14 +151,4 @@
         assertThat(mController.getSummary())
                 .isEqualTo(mContext.getString(R.string.battery_missing_message));
     }
-
-    private void setupIncompatibleEvent() {
-        final List<UsbPort> usbPorts = new ArrayList<>();
-        usbPorts.add(mUsbPort);
-        when(mUsbManager.getPorts()).thenReturn(usbPorts);
-        when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
-        when(mUsbPort.supportsComplianceWarnings()).thenReturn(true);
-        when(mUsbPortStatus.isConnected()).thenReturn(true);
-        when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
index b4cb862..a99abb8 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
@@ -61,7 +61,7 @@
     }
 
     @Test
-    public void setChecked_true_shouldReturn1() {
+    public void setChecked_true_shouldReturn0() {
         mController.setChecked(true);
 
         int result = Settings.System.getIntForUser(
@@ -70,24 +70,24 @@
                 0,
                 UserHandle.USER_CURRENT);
 
-        assertThat(result).isEqualTo(1);
-    }
-
-    @Test
-    public void setChecked_false_shouldReturn0() {
-        mController.setChecked(false);
-
-        int result = Settings.System.getIntForUser(
-                mContext.getContentResolver(),
-                SETTING_KEY,
-                0,
-                UserHandle.USER_CURRENT);
-
         assertThat(result).isEqualTo(0);
     }
 
     @Test
-    public void isChecked_providerPutInt1_returnTrue() {
+    public void setChecked_false_shouldReturn1() {
+        mController.setChecked(false);
+
+        int result = Settings.System.getIntForUser(
+                mContext.getContentResolver(),
+                SETTING_KEY,
+                0,
+                UserHandle.USER_CURRENT);
+
+        assertThat(result).isEqualTo(1);
+    }
+
+    @Test
+    public void isChecked_providerPutInt1_returnFalse() {
         Settings.System.putIntForUser(
                 mContext.getContentResolver(),
                 SETTING_KEY,
@@ -96,11 +96,11 @@
 
         boolean result = mController.isChecked();
 
-        assertThat(result).isTrue();
+        assertThat(result).isFalse();
     }
 
     @Test
-    public void isChecked_providerPutInt0_returnFalse() {
+    public void isChecked_providerPutInt0_returnTrue() {
         Settings.System.putIntForUser(
                 mContext.getContentResolver(),
                 SETTING_KEY,
@@ -109,6 +109,6 @@
 
         boolean result = mController.isChecked();
 
-        assertThat(result).isFalse();
+        assertThat(result).isTrue();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index c7680b5..b75fa8c 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -16,11 +16,15 @@
 
 package com.android.settings.testutils;
 
+import static org.mockito.Mockito.when;
+
 import android.content.Context;
 import android.content.Intent;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
 import android.os.BatteryManager;
 import android.os.UserManager;
-
 import androidx.room.Room;
 
 import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
@@ -36,6 +40,9 @@
 
 import org.robolectric.Shadows;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class BatteryTestUtils {
 
     public static Intent getChargingIntent() {
@@ -163,6 +170,7 @@
         }
     }
 
+    /** Gets customized battery changed intent. */
     public static Intent getCustomBatteryIntent(int plugged, int level, int scale, int status) {
         Intent intent = new Intent();
         intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);
@@ -172,4 +180,16 @@
 
         return intent;
     }
+
+    /** Configures the incompatible charger environment. */
+    public static void setupIncompatibleEvent(
+            UsbPort mockUsbPort, UsbManager mockUsbManager, UsbPortStatus mockUsbPortStatus) {
+        final List<UsbPort> usbPorts = new ArrayList<>();
+        usbPorts.add(mockUsbPort);
+        when(mockUsbManager.getPorts()).thenReturn(usbPorts);
+        when(mockUsbPort.getStatus()).thenReturn(mockUsbPortStatus);
+        when(mockUsbPort.supportsComplianceWarnings()).thenReturn(true);
+        when(mockUsbPortStatus.isConnected()).thenReturn(true);
+        when(mockUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
+    }
 }
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
index f954ea4..1043fdf 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
@@ -385,35 +385,19 @@
     }
 
     @Test
-    public void isWifiCallingEnabled_hasPhoneAccountHandleAndHasActivityHandleIntent_returnTrue() {
-        buildPhoneAccountConfigureIntent(true);
-
-        assertTrue(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
-                null, mPhoneAccountHandle));
-    }
-
-    @Test
-    public void isWifiCallingEnabled_hasPhoneAccountHandleAndNoActivityHandleIntent_returnFalse() {
-        buildPhoneAccountConfigureIntent(false);
-
-        assertFalse(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
-                null, mPhoneAccountHandle));
-    }
-
-    @Test
-    public void isWifiCallingEnabled_noPhoneAccountHandleAndWifiCallingIsReady_returnTrue() {
+    public void isWifiCallingEnabled_wifiCallingIsReady_returnTrue() {
         setWifiCallingEnabled(true);
 
         assertTrue(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
-                mMockQueryWfcState, null));
+                mMockQueryWfcState));
     }
 
     @Test
-    public void isWifiCallingEnabled_noPhoneAccountHandleAndWifiCallingNotReady_returnFalse() {
+    public void isWifiCallingEnabled_wifiCallingNotReady_returnFalse() {
         setWifiCallingEnabled(false);
 
         assertFalse(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
-                mMockQueryWfcState, null));
+                mMockQueryWfcState));
     }
 
     private void setWifiCallingEnabled(boolean enabled){