Merge "Update subtext for require unlock for NFC" into sc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8b1a6b3..b548f44 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2847,6 +2847,10 @@
     <string name="adaptive_sleep_contextual_slice_title">Turn on screen attention</string>
     <!-- Description about the contextual adaptive sleep card [CHAR LIMIT=NONE]-->
     <string name="adaptive_sleep_contextual_slice_summary">Keep screen on when looking at it</string>
+    <!-- auto_rotate settings screen, title about the required permission is missing [CHAR LIMIT=NONE]-->
+    <string name="auto_rotate_summary_no_permission">Camera access is required for Face Detection. Tap to manage permissions for Device Personalization Services</string>
+    <!-- auto_rotate settings screen, text for the camera permission button [CHAR LIMIT=NONE]-->
+    <string name="auto_rotate_manage_permission_button">Manage permissions</string>
 
     <!-- Night display screen, setting option name to enable night display (renamed "Night Light" with title caps). [CHAR LIMIT=30] -->
     <string name="night_display_title">Night Light</string>
diff --git a/res/xml/auto_rotate_settings.xml b/res/xml/auto_rotate_settings.xml
index a316b8f..7c46d29 100644
--- a/res/xml/auto_rotate_settings.xml
+++ b/res/xml/auto_rotate_settings.xml
@@ -20,11 +20,10 @@
     xmlns:settings="http://schemas.android.com/apk/res-auto"
     android:title="@string/accelerometer_title" >
 
-    <Preference
+    <com.android.settingslib.widget.BannerMessagePreference
         android:key="face_rotate_permission"
         android:title="@string/adaptive_sleep_title_no_permission"
-        android:summary="@string/adaptive_sleep_summary_no_permission"
-        android:icon="@drawable/ic_info_outline_24"
+        android:summary="@string/auto_rotate_summary_no_permission"
         settings:controller="com.android.settings.display.SmartAutoRotatePermissionController" />
 
     <SwitchPreference
diff --git a/src/com/android/settings/datausage/OWNERS b/src/com/android/settings/datausage/OWNERS
index 1ec66b3..d71b165 100644
--- a/src/com/android/settings/datausage/OWNERS
+++ b/src/com/android/settings/datausage/OWNERS
@@ -1,6 +1,7 @@
 # Default reviewers for this and subdirectories.
 andychou@google.com
 bonianchen@google.com
+changbetty@google.com
 goldmanj@google.com
 songferngwang@google.com
 wengsu@google.com
diff --git a/src/com/android/settings/development/AdbIpAddressPreferenceController.java b/src/com/android/settings/development/AdbIpAddressPreferenceController.java
index dbc329e..45fe51b 100644
--- a/src/com/android/settings/development/AdbIpAddressPreferenceController.java
+++ b/src/com/android/settings/development/AdbIpAddressPreferenceController.java
@@ -126,7 +126,7 @@
      * @return the formatted and newline-separated IP addresses, or null if none.
      */
     private static String getDefaultIpAddresses(ConnectivityManager cm) {
-        LinkProperties prop = cm.getActiveLinkProperties();
+        LinkProperties prop = cm.getLinkProperties(cm.getActiveNetwork());
         return formatIpAddresses(prop);
     }
 
diff --git a/src/com/android/settings/display/SmartAutoRotatePermissionController.java b/src/com/android/settings/display/SmartAutoRotatePermissionController.java
index 484db31..caa306d 100644
--- a/src/com/android/settings/display/SmartAutoRotatePermissionController.java
+++ b/src/com/android/settings/display/SmartAutoRotatePermissionController.java
@@ -22,11 +22,12 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
-import android.text.TextUtils;
 
-import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
 
+import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.widget.BannerMessagePreference;
 
 /**
  * The controller of camera based rotate permission warning preference. The preference appears when
@@ -45,19 +46,22 @@
     }
 
     @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        final BannerMessagePreference preference =
+                (BannerMessagePreference) screen.findPreference(getPreferenceKey());
+        preference
+                .setPositiveButtonText(R.string.auto_rotate_manage_permission_button)
+                .setPositiveButtonOnClickListener(v -> {
+                    mContext.startActivity(mIntent);
+                });
+    }
+
+    @Override
     @AvailabilityStatus
     public int getAvailabilityStatus() {
         return isRotationResolverServiceAvailable(mContext) && !hasSufficientPermission(mContext)
                 ? AVAILABLE_UNSEARCHABLE
                 : UNSUPPORTED_ON_DEVICE;
     }
-
-    @Override
-    public boolean handlePreferenceTreeClick(Preference preference) {
-        if (TextUtils.equals(getPreferenceKey(), preference.getKey())) {
-            mContext.startActivity(mIntent);
-            return true;
-        }
-        return super.handlePreferenceTreeClick(preference);
-    }
 }
diff --git a/src/com/android/settings/display/SmartAutoRotatePreferenceController.java b/src/com/android/settings/display/SmartAutoRotatePreferenceController.java
index 01c8379..0e2e013 100644
--- a/src/com/android/settings/display/SmartAutoRotatePreferenceController.java
+++ b/src/com/android/settings/display/SmartAutoRotatePreferenceController.java
@@ -21,7 +21,6 @@
 import android.content.Context;
 import android.os.UserHandle;
 import android.provider.Settings;
-import android.util.Log;
 
 import androidx.preference.Preference;
 
@@ -34,8 +33,6 @@
  */
 public class SmartAutoRotatePreferenceController extends BasePreferenceController {
 
-    private static final String TAG = "SmartAutoRotatePreferenceController";
-
     public SmartAutoRotatePreferenceController(Context context, String preferenceKey) {
         super(context, preferenceKey);
     }
@@ -54,16 +51,12 @@
     public CharSequence getSummary() {
         int activeStringId = R.string.auto_rotate_option_off;
         if (!RotationPolicy.isRotationLocked(mContext)) {
-            try {
-                final int cameraRotate = Settings.Secure.getIntForUser(
-                        mContext.getContentResolver(),
-                        CAMERA_AUTOROTATE,
-                        UserHandle.USER_CURRENT);
-                activeStringId = cameraRotate == 1 ? R.string.auto_rotate_option_face_based
-                        : R.string.auto_rotate_option_on;
-            } catch (Settings.SettingNotFoundException e) {
-                Log.w(TAG, "CAMERA_AUTOROTATE setting not found", e);
-            }
+            final int cameraRotate = Settings.Secure.getIntForUser(
+                    mContext.getContentResolver(),
+                    CAMERA_AUTOROTATE,
+                    0, UserHandle.USER_CURRENT);
+            activeStringId = cameraRotate == 1 ? R.string.auto_rotate_option_face_based
+                    : R.string.auto_rotate_option_on;
         }
         return mContext.getString(activeStringId);
     }
diff --git a/src/com/android/settings/network/OWNERS b/src/com/android/settings/network/OWNERS
index 8b16bc9..ee5b494 100644
--- a/src/com/android/settings/network/OWNERS
+++ b/src/com/android/settings/network/OWNERS
@@ -2,6 +2,7 @@
 allenwtsu@google.com
 andychou@google.com
 bonianchen@google.com
+changbetty@google.com
 goldmanj@google.com
 leechou@google.com
 songferngwang@google.com
diff --git a/src/com/android/settings/security/CredentialManagementAppButtonsController.java b/src/com/android/settings/security/CredentialManagementAppButtonsController.java
index c6afded..fe5e45b 100644
--- a/src/com/android/settings/security/CredentialManagementAppButtonsController.java
+++ b/src/com/android/settings/security/CredentialManagementAppButtonsController.java
@@ -16,11 +16,8 @@
 
 package com.android.settings.security;
 
-import android.app.AppOpsManager;
 import android.app.admin.DevicePolicyEventLogger;
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
 import android.os.Handler;
 import android.os.Looper;
 import android.os.RemoteException;
@@ -29,6 +26,7 @@
 import android.stats.devicepolicy.DevicePolicyEnums;
 import android.util.Log;
 
+import androidx.fragment.app.Fragment;
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
@@ -48,16 +46,15 @@
 
     private final ExecutorService mExecutor = Executors.newSingleThreadExecutor();
     private final Handler mHandler = new Handler(Looper.getMainLooper());
-
-    private final PackageManager mPackageManager;
-    private final AppOpsManager mAppOpsManager;
     private boolean mHasCredentialManagerPackage;
-    private String mCredentialManagerPackageName;
+    private Fragment mFragment;
 
     public CredentialManagementAppButtonsController(Context context, String preferenceKey) {
         super(context, preferenceKey);
-        mPackageManager = context.getPackageManager();
-        mAppOpsManager = context.getSystemService(AppOpsManager.class);
+    }
+
+    public void setParentFragment(Fragment fragment) {
+        mFragment = fragment;
     }
 
     @Override
@@ -73,7 +70,6 @@
             try {
                 IKeyChainService service = KeyChain.bind(mContext).getService();
                 mHasCredentialManagerPackage = service.hasCredentialManagementApp();
-                mCredentialManagerPackageName = service.getCredentialManagementAppPackageName();
             } catch (InterruptedException | RemoteException e) {
                 Log.e(TAG, "Unable to display credential management app buttons");
             }
@@ -91,24 +87,17 @@
     }
 
     private void removeCredentialManagementApp() {
-        try {
-            ApplicationInfo appInfo = mPackageManager.getApplicationInfo(
-                    mCredentialManagerPackageName, 0);
-            mAppOpsManager.setMode(AppOpsManager.OP_MANAGE_CREDENTIALS,
-                    appInfo.uid, mCredentialManagerPackageName, AppOpsManager.MODE_DEFAULT);
-            mExecutor.execute(() -> {
-                try {
-                    IKeyChainService service = KeyChain.bind(mContext).getService();
-                    service.removeCredentialManagementApp();
-                    DevicePolicyEventLogger
-                            .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REMOVED)
-                            .write();
-                } catch (InterruptedException | RemoteException e) {
-                    Log.e(TAG, "Unable to remove the credential management app");
-                }
-            });
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Unable to remove the credential management app");
-        }
+        mExecutor.execute(() -> {
+            try {
+                IKeyChainService service = KeyChain.bind(mContext).getService();
+                service.removeCredentialManagementApp();
+                DevicePolicyEventLogger
+                        .createEvent(DevicePolicyEnums.CREDENTIAL_MANAGEMENT_APP_REMOVED)
+                        .write();
+                mFragment.getActivity().finish();
+            } catch (InterruptedException | RemoteException e) {
+                Log.e(TAG, "Unable to remove the credential management app");
+            }
+        });
     }
 }
diff --git a/src/com/android/settings/security/CredentialManagementAppFragment.java b/src/com/android/settings/security/CredentialManagementAppFragment.java
index 5544ee6..74ce003 100644
--- a/src/com/android/settings/security/CredentialManagementAppFragment.java
+++ b/src/com/android/settings/security/CredentialManagementAppFragment.java
@@ -17,6 +17,7 @@
 package com.android.settings.security;
 
 import android.app.settings.SettingsEnums;
+import android.content.Context;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
@@ -47,6 +48,12 @@
         return SettingsEnums.CREDENTIAL_MANAGEMENT_APP;
     }
 
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        use(CredentialManagementAppButtonsController.class).setParentFragment(this);
+    }
+
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.credential_management_app_fragment);
 }
diff --git a/src/com/android/settings/wifi/OWNERS b/src/com/android/settings/wifi/OWNERS
index d15cd78..7f39cc7 100644
--- a/src/com/android/settings/wifi/OWNERS
+++ b/src/com/android/settings/wifi/OWNERS
@@ -1,6 +1,7 @@
 # Default reviewers for this and subdirectories.
 andychou@google.com
 arcwang@google.com
+changbetty@google.com
 goldmanj@google.com
 songferngwang@google.com
 wengsu@google.com
diff --git a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java
index b65785f..cc3b20d 100644
--- a/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/SmartAutoRotatePreferenceControllerTest.java
@@ -108,6 +108,25 @@
     }
 
     @Test
+    public void updatePreference_settingsIsOff_noSmartAuto_shouldTurnOffToggle() {
+        disableAutoRotation();
+        Settings.Secure.putStringForUser(mContentResolver,
+                CAMERA_AUTOROTATE, null, UserHandle.USER_CURRENT);
+
+        assertThat(mController.getSummary()).isEqualTo("Off");
+
+    }
+
+    @Test
+    public void updatePreference_settingsIsOn_noSmartAuto_shouldTurnOnToggle() {
+        enableAutoRotation();
+        Settings.Secure.putStringForUser(mContentResolver,
+                CAMERA_AUTOROTATE, null, UserHandle.USER_CURRENT);
+
+        assertThat(mController.getSummary()).isEqualTo("On");
+    }
+
+    @Test
     public void testGetAvailabilityStatus() {
         assertThat(mController.getAvailabilityStatus()).isEqualTo(BasePreferenceController
                 .UNSUPPORTED_ON_DEVICE);