Merge "Launch action to admin component when button clicked" into sc-dev
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java
index 37eab13..0b3a519 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/ActionDisabledByAdminController.java
@@ -16,6 +16,7 @@
 
 package com.android.settingslib.enterprise;
 
+import android.annotation.NonNull;
 import android.annotation.UserIdInt;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -60,7 +61,8 @@
      * Returns a listener for handling positive button clicks
      */
     @Nullable
-    default DialogInterface.OnClickListener getPositiveButtonListener() {
+    default DialogInterface.OnClickListener getPositiveButtonListener(@NonNull Context context,
+            @NonNull RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
         return null;
     }
 }
diff --git a/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java b/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
index 48ac208..814d5d2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminController.java
@@ -16,16 +16,25 @@
 
 package com.android.settingslib.enterprise;
 
+import android.annotation.NonNull;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.util.Log;
 
 import androidx.annotation.Nullable;
 
+import com.android.settingslib.RestrictedLockUtils;
+
 public class BiometricActionDisabledByAdminController extends BaseActionDisabledByAdminController {
 
     private static final String TAG = "BiometricActionDisabledByAdminController";
 
+    // These MUST not change, as they are the stable API between here and device admin specified
+    // by the component below.
+    private static final String ACTION_LEARN_MORE = "android.settings.LEARN_MORE";
+    private static final String EXTRA_FROM_BIOMETRIC_SETUP = "from_biometric_setup";
+
     BiometricActionDisabledByAdminController(
             DeviceAdminStringProvider stringProvider) {
         super(stringProvider);
@@ -48,10 +57,15 @@
     }
 
     @Override
-    public DialogInterface.OnClickListener getPositiveButtonListener() {
+    public DialogInterface.OnClickListener getPositiveButtonListener(@NonNull Context context,
+            @NonNull RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
         return (dialog, which) -> {
-            Log.d(TAG, "Positive button clicked");
-            // TODO(b/188847063) Launch appropriate intent
+            Log.d(TAG, "Positive button clicked, component: " + enforcedAdmin.component);
+            final Intent intent = new Intent(ACTION_LEARN_MORE)
+                    .setComponent(enforcedAdmin.component)
+                    .putExtra(EXTRA_FROM_BIOMETRIC_SETUP, true)
+                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            context.startActivity(intent);
         };
     }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminControllerTest.java
new file mode 100644
index 0000000..766c2f5
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/BiometricActionDisabledByAdminControllerTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.settingslib.enterprise;
+
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.ENFORCED_ADMIN;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.ENFORCEMENT_ADMIN_USER_ID;
+import static com.android.settingslib.enterprise.FakeDeviceAdminStringProvider.DEFAULT_DEVICE_ADMIN_STRING_PROVIDER;
+
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.UserHandle;
+
+import com.android.settingslib.RestrictedLockUtils;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class BiometricActionDisabledByAdminControllerTest {
+
+    private final ActionDisabledByAdminControllerTestUtils mTestUtils =
+            new ActionDisabledByAdminControllerTestUtils();
+    private final BiometricActionDisabledByAdminController mController =
+            new BiometricActionDisabledByAdminController(DEFAULT_DEVICE_ADMIN_STRING_PROVIDER);
+
+    @Before
+    public void setUp() {
+        mController.initialize(mTestUtils.createLearnMoreButtonLauncher());
+        mController.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID);
+    }
+
+    @Test
+    public void buttonClicked() {
+        Context context = mock(Context.class);
+        ComponentName componentName = mock(ComponentName.class);
+        RestrictedLockUtils.EnforcedAdmin enforcedAdmin = new RestrictedLockUtils.EnforcedAdmin(
+                componentName, new UserHandle(UserHandle.myUserId()));
+
+        DialogInterface.OnClickListener listener =
+                mController.getPositiveButtonListener(context, enforcedAdmin);
+        assertNotNull("Biometric Controller must supply a non-null listener", listener);
+        listener.onClick(mock(DialogInterface.class), 0 /* which */);
+
+        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+        verify(context).startActivity(intentCaptor.capture());
+        assertEquals("android.settings.LEARN_MORE",
+                intentCaptor.getValue().getAction());
+        assertTrue("from_biometric_setup", intentCaptor.getValue()
+                .getBooleanExtra("from_biometric_setup", false));
+        assertEquals(componentName, intentCaptor.getValue().getComponent());
+    }
+
+}