diff --git a/packages/SettingsLib/tests/robotests/Android.bp b/packages/SettingsLib/tests/robotests/Android.bp
index 63cfe59..2d1a516 100644
--- a/packages/SettingsLib/tests/robotests/Android.bp
+++ b/packages/SettingsLib/tests/robotests/Android.bp
@@ -45,6 +45,7 @@
         "SettingsLib-robo-testutils",
         "androidx.test.core",
         "androidx.core_core",
+        "testng", // TODO: remove once JUnit on Android provides assertThrows
     ],
     java_resource_dirs: ["config"],
     instrumentation_for: "SettingsLibShell",
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
index 4b51790..e57335f 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledByAdminControllerTestUtils.java
@@ -16,51 +16,81 @@
 
 package com.android.settingslib.enterprise;
 
-import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
-import android.app.Activity;
+import android.content.ComponentName;
 import android.content.Context;
+import android.os.UserHandle;
+import android.util.DebugUtils;
 
-import androidx.appcompat.app.AlertDialog;
-
-import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
 /**
  * Utils related to the action disabled by admin dialogs.
  */
-class ActionDisabledByAdminControllerTestUtils {
-    static final int LEARN_MORE_ACTION_NONE = 0;
-    static final int LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES = 1;
-    static final int LEARN_MORE_ACTION_LAUNCH_HELP_PAGE = 2;
+// NOTE: must be public because of DebugUtils.constantToString() call
+public final class ActionDisabledByAdminControllerTestUtils {
+
+    static final int ENFORCEMENT_ADMIN_USER_ID = 123;
+    static final UserHandle ENFORCEMENT_ADMIN_USER = UserHandle.of(ENFORCEMENT_ADMIN_USER_ID);
+
+    static final String SUPPORT_MESSAGE = "support message";
+
+    static final ComponentName ADMIN_COMPONENT =
+            new ComponentName("some.package.name", "some.package.name.SomeClass");
+    static final EnforcedAdmin ENFORCED_ADMIN = new EnforcedAdmin(
+                    ADMIN_COMPONENT, UserHandle.of(ENFORCEMENT_ADMIN_USER_ID));
+    static final EnforcedAdmin ENFORCED_ADMIN_WITHOUT_COMPONENT = new EnforcedAdmin(
+            /* component= */ null, UserHandle.of(ENFORCEMENT_ADMIN_USER_ID));
+
+    static final String URL = "https://testexample.com";
+
+    // NOTE: fields below must be public because of DebugUtils.constantToString() call
+    public static final int LEARN_MORE_ACTION_NONE = 0;
+    public static final int LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES = 1;
+    public static final int LEARN_MORE_ACTION_SHOW_ADMIN_SETTINGS = 2;
+    public static final int LEARN_MORE_ACTION_LAUNCH_HELP_PAGE = 3;
 
     private int mLearnMoreButtonAction = LEARN_MORE_ACTION_NONE;
 
     ActionDisabledLearnMoreButtonLauncher createLearnMoreButtonLauncher() {
         return new ActionDisabledLearnMoreButtonLauncher() {
+
             @Override
-            public void setupLearnMoreButtonToShowAdminPolicies(Context context,
-                    Object alertDialogBuilder, int enforcementAdminUserId,
-                    RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
+            public void setLearnMoreButton(Runnable action) {
+                action.run();
+            }
+
+            @Override
+            protected void launchShowAdminPolicies(Context context, UserHandle user,
+                    ComponentName admin) {
                 mLearnMoreButtonAction = LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES;
             }
 
             @Override
-            public void setupLearnMoreButtonToLaunchHelpPage(Context context,
-                    Object alertDialogBuilder, String url) {
+            protected void launchShowAdminSettings(Context context) {
+                mLearnMoreButtonAction = LEARN_MORE_ACTION_SHOW_ADMIN_SETTINGS;
+            }
+
+            @Override
+            public void showHelpPage(Context context, String url) {
                 mLearnMoreButtonAction = LEARN_MORE_ACTION_LAUNCH_HELP_PAGE;
             }
+
+            @Override
+            protected boolean isSameProfileGroup(Context context, int enforcementAdminUserId) {
+                return true;
+            }
         };
     }
 
     void assertLearnMoreAction(int learnMoreActionShowAdminPolicies) {
-        assertThat(learnMoreActionShowAdminPolicies).isEqualTo(mLearnMoreButtonAction);
+        assertWithMessage("action").that(actionToString(mLearnMoreButtonAction))
+                .isEqualTo(actionToString(learnMoreActionShowAdminPolicies));
     }
 
-    AlertDialog createAlertDialog(ActionDisabledByAdminController mController, Activity activity) {
-        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
-        mController.setupLearnMoreButton(activity, builder);
-        AlertDialog alertDialog = builder.create();
-        alertDialog.show();
-        return alertDialog;
+    private static String actionToString(int action) {
+        return DebugUtils.constantToString(ActionDisabledByAdminControllerTestUtils.class,
+                "LEARN_MORE_ACTION_", action);
     }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
new file mode 100644
index 0000000..7014da0
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ActionDisabledLearnMoreButtonLauncherTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.ADMIN_COMPONENT;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.ENFORCED_ADMIN;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.ENFORCED_ADMIN_WITHOUT_COMPONENT;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.ENFORCEMENT_ADMIN_USER;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.ENFORCEMENT_ADMIN_USER_ID;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.URL;
+
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)// NOTE: this test doesn't need RoboElectric...
+public final class ActionDisabledLearnMoreButtonLauncherTest {
+
+    private static final int CONTEXT_USER_ID = -ENFORCEMENT_ADMIN_USER_ID;
+    private static final UserHandle CONTEXT_USER = UserHandle.of(CONTEXT_USER_ID);
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+    @Mock
+    private Context mContext;
+
+    @Mock
+    private UserManager mUserManager;
+
+    @Spy
+    private ActionDisabledLearnMoreButtonLauncher mLauncher;
+
+    @Captor
+    private ArgumentCaptor<Runnable> mLearnMoreActionCaptor;
+
+    @Captor
+    private ArgumentCaptor<Intent> mIntentCaptor;
+
+    @Before
+    public void setUp() {
+        when(mContext.getUserId()).thenReturn(CONTEXT_USER_ID);
+        when(mUserManager.getUserHandle()).thenReturn(CONTEXT_USER_ID);
+        when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToShowAdminPolicies_nullContext() {
+        assertThrows(NullPointerException.class,
+                () -> mLauncher.setupLearnMoreButtonToShowAdminPolicies(/* context= */ null,
+                        ENFORCEMENT_ADMIN_USER_ID, ENFORCED_ADMIN));
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToShowAdminPolicies_nullEnforcedAdmin() {
+        assertThrows(NullPointerException.class,
+                () -> mLauncher.setupLearnMoreButtonToShowAdminPolicies(/* context= */ null,
+                        ENFORCEMENT_ADMIN_USER_ID, /* enforcedAdmin= */ null));
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToShowAdminPolicies_differentProfileGroup() {
+        mockDifferentProfileGroup();
+
+        mLauncher.setupLearnMoreButtonToShowAdminPolicies(mContext, ENFORCEMENT_ADMIN_USER_ID,
+                ENFORCED_ADMIN);
+
+        verify(mLauncher, never()).setLearnMoreButton(any());
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToShowAdminPolicies_sameProfileGroup_noComponent() {
+        mockSameProfileGroup();
+
+        mLauncher.setupLearnMoreButtonToShowAdminPolicies(mContext, ENFORCEMENT_ADMIN_USER_ID,
+                ENFORCED_ADMIN_WITHOUT_COMPONENT);
+        tapLearnMore();
+
+        verify(mLauncher, never()).launchShowAdminPolicies(any(), any(), any());
+        verify(mLauncher).launchShowAdminSettings(mContext);
+        verifyFinishSelf();
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToShowAdminPolicies_sameProfileGroup_withComponent() {
+        mockSameProfileGroup();
+
+        mLauncher.setupLearnMoreButtonToShowAdminPolicies(mContext, ENFORCEMENT_ADMIN_USER_ID,
+                ENFORCED_ADMIN);
+        tapLearnMore();
+
+        verify(mLauncher).launchShowAdminPolicies(mContext, ENFORCEMENT_ADMIN_USER,
+                ADMIN_COMPONENT);
+        verify(mLauncher, never()).launchShowAdminSettings(any());
+        verifyFinishSelf();
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToLaunchHelpPage_nullContext() {
+        assertThrows(NullPointerException.class,
+                () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(/* context= */ null, URL));
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToLaunchHelpPage_nullUrl() {
+        assertThrows(NullPointerException.class,
+                () -> mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, /* url= */ null));
+    }
+
+    @Test
+    public void testSetupLearnMoreButtonToLaunchHelpPage() {
+        mLauncher.setupLearnMoreButtonToLaunchHelpPage(mContext, URL);
+        tapLearnMore();
+
+        verify(mContext).startActivityAsUser(mIntentCaptor.capture(), eq(CONTEXT_USER));
+        Intent intent = mIntentCaptor.getValue();
+        assertWithMessage("wrong url on intent %s", intent).that(intent.getData())
+                .isEqualTo(Uri.parse(URL));
+        verifyFinishSelf();
+    }
+
+    private void mockDifferentProfileGroup() {
+        // No need to mock anything - isSameProfileGroup() will return false by default
+    }
+
+    private void mockSameProfileGroup() {
+        when(mUserManager.isSameProfileGroup(ENFORCEMENT_ADMIN_USER_ID, CONTEXT_USER_ID))
+                .thenReturn(true);
+    }
+
+    private void tapLearnMore() {
+        verify(mLauncher).setLearnMoreButton(mLearnMoreActionCaptor.capture());
+        mLearnMoreActionCaptor.getValue().run();
+    }
+
+    private void verifyFinishSelf() {
+        verify(mLauncher).finishSelf();
+    }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FakeDeviceAdminStringProvider.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FakeDeviceAdminStringProvider.java
index 8c07d75..be3e9fc 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FakeDeviceAdminStringProvider.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FakeDeviceAdminStringProvider.java
@@ -30,6 +30,8 @@
     static final String DEFAULT_DISABLED_BY_POLICY_CONTENT = "default_disabled_by_policy_content";
     static final String DEFAULT_DISABLED_BY_POLICY_TITLE_FINANCED_DEVICE =
             "default_disabled_by_policy_title_financed_device";
+    static final DeviceAdminStringProvider DEFAULT_DEVICE_ADMIN_STRING_PROVIDER =
+            new FakeDeviceAdminStringProvider(/* url = */ null);
 
     private final String mUrl;
 
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminControllerTest.java
index 2fe2262..7b08fee 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/FinancedDeviceActionDisabledByAdminControllerTest.java
@@ -16,22 +16,21 @@
 
 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.ActionDisabledByAdminControllerTestUtils.LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.SUPPORT_MESSAGE;
+import static com.android.settingslib.enterprise.FakeDeviceAdminStringProvider.DEFAULT_DEVICE_ADMIN_STRING_PROVIDER;
 import static com.android.settingslib.enterprise.FakeDeviceAdminStringProvider.DEFAULT_DISABLED_BY_POLICY_TITLE_FINANCED_DEVICE;
 
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.Activity;
-import android.app.Dialog;
-import android.content.ComponentName;
 import android.content.Context;
-import android.os.UserHandle;
 
-import androidx.appcompat.app.AlertDialog;
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settingslib.R;
-import com.android.settingslib.RestrictedLockUtils;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -41,73 +40,46 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class FinancedDeviceActionDisabledByAdminControllerTest {
-    private static final int ENFORCEMENT_ADMIN_USER_ID = 123;
-    private static final ComponentName ADMIN_COMPONENT =
-            new ComponentName("some.package.name", "some.package.name.SomeClass");
-    private static final String SUPPORT_MESSAGE = "support message";
-    private static final DeviceAdminStringProvider DEVICE_ADMIN_STRING_PROVIDER =
-            new FakeDeviceAdminStringProvider(/* url = */ null);
-    private static final RestrictedLockUtils.EnforcedAdmin ENFORCED_ADMIN =
-            new RestrictedLockUtils.EnforcedAdmin(
-                    ADMIN_COMPONENT, UserHandle.of(ENFORCEMENT_ADMIN_USER_ID));
 
     private final Context mContext = ApplicationProvider.getApplicationContext();
     private final Activity mActivity = ActivityController.of(new Activity()).get();
     private final ActionDisabledByAdminControllerTestUtils mTestUtils =
             new ActionDisabledByAdminControllerTestUtils();
-    private final ActionDisabledLearnMoreButtonLauncher mLauncher =
-            mTestUtils.createLearnMoreButtonLauncher();
+    private final FinancedDeviceActionDisabledByAdminController mController =
+            new FinancedDeviceActionDisabledByAdminController(
+                    DEFAULT_DEVICE_ADMIN_STRING_PROVIDER);
 
     @Before
     public void setUp() {
         mActivity.setTheme(R.style.Theme_AppCompat_DayNight);
+
+        mController.initialize(mTestUtils.createLearnMoreButtonLauncher());
+        mController.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID);
+
     }
 
     @Test
     public void setupLearnMoreButton_negativeButtonSet() {
-        FinancedDeviceActionDisabledByAdminController mController = createController(mLauncher);
-        AlertDialog alertDialog = mTestUtils.createAlertDialog(mController, mActivity);
-
-        alertDialog.getButton(Dialog.BUTTON_NEUTRAL).performClick();
+        mController.setupLearnMoreButton(mContext);
 
         mTestUtils.assertLearnMoreAction(LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES);
     }
 
     @Test
     public void getAdminSupportTitleResource_works() {
-        FinancedDeviceActionDisabledByAdminController mController = createController();
-
         assertThat(mController.getAdminSupportTitle(null))
                 .isEqualTo(DEFAULT_DISABLED_BY_POLICY_TITLE_FINANCED_DEVICE);
     }
 
     @Test
     public void getAdminSupportContentString_withSupportMessage_returnsSupportMessage() {
-        FinancedDeviceActionDisabledByAdminController mController = createController();
-
         assertThat(mController.getAdminSupportContentString(mContext, SUPPORT_MESSAGE))
                 .isEqualTo(SUPPORT_MESSAGE);
     }
 
     @Test
     public void getAdminSupportContentString_noSupportMessage_returnsNull() {
-        FinancedDeviceActionDisabledByAdminController mController = createController();
-
         assertThat(mController.getAdminSupportContentString(mContext, /* supportMessage= */ null))
                 .isNull();
     }
-
-    private FinancedDeviceActionDisabledByAdminController createController() {
-        return createController(mLauncher);
-    }
-
-    private FinancedDeviceActionDisabledByAdminController createController(
-            ActionDisabledLearnMoreButtonLauncher buttonHelper) {
-        FinancedDeviceActionDisabledByAdminController controller =
-                new FinancedDeviceActionDisabledByAdminController(
-                        buttonHelper,
-                        DEVICE_ADMIN_STRING_PROVIDER);
-        controller.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID);
-        return controller;
-    }
 }
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
index eb1dc96..19f6aa1 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/enterprise/ManagedDeviceActionDisabledByAdminControllerTest.java
@@ -16,8 +16,12 @@
 
 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.ActionDisabledByAdminControllerTestUtils.LEARN_MORE_ACTION_LAUNCH_HELP_PAGE;
 import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.SUPPORT_MESSAGE;
+import static com.android.settingslib.enterprise.ActionDisabledByAdminControllerTestUtils.URL;
 import static com.android.settingslib.enterprise.FakeDeviceAdminStringProvider.DEFAULT_DISABLED_BY_POLICY_CONTENT;
 import static com.android.settingslib.enterprise.FakeDeviceAdminStringProvider.DEFAULT_DISABLED_BY_POLICY_TITLE;
 import static com.android.settingslib.enterprise.FakeDeviceAdminStringProvider.DISALLOW_ADJUST_VOLUME_TITLE;
@@ -25,15 +29,12 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.Activity;
-import android.app.Dialog;
-import android.content.ComponentName;
-import android.os.UserHandle;
+import android.content.Context;
 import android.os.UserManager;
 
-import androidx.appcompat.app.AlertDialog;
+import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settingslib.R;
-import com.android.settingslib.RestrictedLockUtils;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -43,23 +44,15 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class ManagedDeviceActionDisabledByAdminControllerTest {
-    private static final int ENFORCEMENT_ADMIN_USER_ID = 123;
-    private static final ComponentName ADMIN_COMPONENT =
-            new ComponentName("some.package.name", "some.package.name.SomeClass");
-    private static final String SUPPORT_MESSAGE = "support message";
+
     private static final String RESTRICTION = UserManager.DISALLOW_ADJUST_VOLUME;
-    private static final String URL = "https://testexample.com";
     private static final String EMPTY_URL = "";
-    private static final RestrictedLockUtils.EnforcedAdmin ENFORCED_ADMIN =
-            new RestrictedLockUtils.EnforcedAdmin(
-                    ADMIN_COMPONENT, UserHandle.of(ENFORCEMENT_ADMIN_USER_ID));
     private static final String SUPPORT_TITLE_FOR_RESTRICTION = DISALLOW_ADJUST_VOLUME_TITLE;
 
+    private final Context mContext = ApplicationProvider.getApplicationContext();
     private final Activity mActivity = ActivityController.of(new Activity()).get();
     private final ActionDisabledByAdminControllerTestUtils mTestUtils =
             new ActionDisabledByAdminControllerTestUtils();
-    private final ActionDisabledLearnMoreButtonLauncher mLauncher =
-            mTestUtils.createLearnMoreButtonLauncher();
 
     @Before
     public void setUp() {
@@ -68,68 +61,63 @@
 
     @Test
     public void setupLearnMoreButton_validUrl_negativeButtonSet() {
-        ManagedDeviceActionDisabledByAdminController mController =
-                createController(mLauncher, URL);
-        AlertDialog alertDialog = mTestUtils.createAlertDialog(mController, mActivity);
+        ManagedDeviceActionDisabledByAdminController controller = createController(URL);
 
-        alertDialog.getButton(Dialog.BUTTON_NEUTRAL).performClick();
+        controller.setupLearnMoreButton(mContext);
 
         mTestUtils.assertLearnMoreAction(LEARN_MORE_ACTION_LAUNCH_HELP_PAGE);
     }
 
     @Test
     public void setupLearnMoreButton_noUrl_negativeButtonSet() {
-        ManagedDeviceActionDisabledByAdminController mController =
-                createController(mLauncher, EMPTY_URL);
-        AlertDialog alertDialog = mTestUtils.createAlertDialog(mController, mActivity);
+        ManagedDeviceActionDisabledByAdminController controller = createController(EMPTY_URL);
 
-        alertDialog.getButton(Dialog.BUTTON_NEUTRAL).performClick();
+        controller.setupLearnMoreButton(mContext);
 
         mTestUtils.assertLearnMoreAction(LEARN_MORE_ACTION_SHOW_ADMIN_POLICIES);
     }
 
     @Test
     public void getAdminSupportTitleResource_noRestriction_works() {
-        ManagedDeviceActionDisabledByAdminController mController = createController();
+        ManagedDeviceActionDisabledByAdminController controller = createController();
 
-        assertThat(mController.getAdminSupportTitle(null))
+        assertThat(controller.getAdminSupportTitle(null))
                 .isEqualTo(DEFAULT_DISABLED_BY_POLICY_TITLE);
     }
 
     @Test
     public void getAdminSupportTitleResource_withRestriction_works() {
-        ManagedDeviceActionDisabledByAdminController mController = createController();
+        ManagedDeviceActionDisabledByAdminController controller = createController();
 
-        assertThat(mController.getAdminSupportTitle(RESTRICTION))
+        assertThat(controller.getAdminSupportTitle(RESTRICTION))
                 .isEqualTo(SUPPORT_TITLE_FOR_RESTRICTION);
     }
 
     @Test
     public void getAdminSupportContentString_withSupportMessage_returnsSupportMessage() {
-        ManagedDeviceActionDisabledByAdminController mController = createController();
+        ManagedDeviceActionDisabledByAdminController controller = createController();
 
-        assertThat(mController.getAdminSupportContentString(mActivity, SUPPORT_MESSAGE))
+        assertThat(controller.getAdminSupportContentString(mActivity, SUPPORT_MESSAGE))
                 .isEqualTo(SUPPORT_MESSAGE);
     }
 
     @Test
     public void getAdminSupportContentString_noSupportMessage_returnsDefault() {
-        ManagedDeviceActionDisabledByAdminController mController = createController();
+        ManagedDeviceActionDisabledByAdminController controller = createController();
 
-        assertThat(mController.getAdminSupportContentString(mActivity, /* supportMessage= */ null))
+        assertThat(controller.getAdminSupportContentString(mActivity, /* supportMessage= */ null))
                 .isEqualTo(DEFAULT_DISABLED_BY_POLICY_CONTENT);
     }
 
     private ManagedDeviceActionDisabledByAdminController createController() {
-        return createController(mLauncher, /* url= */ null);
+        return createController(/* url= */ null);
     }
 
-    private ManagedDeviceActionDisabledByAdminController createController(
-            ActionDisabledLearnMoreButtonLauncher buttonHelper, String url) {
+    private ManagedDeviceActionDisabledByAdminController createController(String url) {
         ManagedDeviceActionDisabledByAdminController controller =
                 new ManagedDeviceActionDisabledByAdminController(
-                        buttonHelper,
                         new FakeDeviceAdminStringProvider(url));
+        controller.initialize(mTestUtils.createLearnMoreButtonLauncher());
         controller.updateEnforcedAdmin(ENFORCED_ADMIN, ENFORCEMENT_ADMIN_USER_ID);
         return controller;
     }
