Merge "Update Action Not Allowed Dialog text for a financed device" into sc-dev
diff --git a/res/layout/admin_support_details_dialog.xml b/res/layout/admin_support_details_dialog.xml
index 2e126cc..298cf24 100644
--- a/res/layout/admin_support_details_dialog.xml
+++ b/res/layout/admin_support_details_dialog.xml
@@ -49,7 +49,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.HeadLineFontFamily.Subhead"
- android:text="@string/default_admin_support_msg"
android:maxLength="200"
android:autoLink="email|phone|web"
android:textColor="?android:attr/textColorSecondary"/>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2332909..7a8c5c3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10485,6 +10485,8 @@
<string name="disabled_by_policy_title_screen_capture">Screenshot not allowed</string>
<!-- Title for dialog displayed to tell user that the app was suspended by an admin [CHAR LIMIT=50] -->
<string name="disabled_by_policy_title_suspend_packages">Can’t open this app</string>
+ <!-- Dialog title. This dialog lets a user know that a specific setting is blocked by their credit provider. Since the user purchased the device from the credit provider, the credit provider controls what they can access. [CHAR LIMIT=50] -->
+ <string name="disabled_by_policy_title_financed_device">Blocked by your credit provider</string>
<!-- Shown when the user tries to change a settings locked by an admin [CHAR LIMIT=200] -->
<string name="default_admin_support_msg">If you have questions, contact your IT admin</string>
<!-- Shown in dialog to allow user to see more information about the device admin [CHAR LIMIT=30] -->
diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
index 5599a94..685da03 100644
--- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
+++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java
@@ -16,6 +16,8 @@
package com.android.settings.enterprise;
+import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.app.Activity;
@@ -119,24 +121,11 @@
if (admin == null) {
return;
}
- ImageView supportIconView = root.requireViewById(R.id.admin_support_icon);
- if (!RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(mActivity, admin)
- || !RestrictedLockUtils.isCurrentUserOrProfile(mActivity, userId)) {
+
+ setAdminSupportIcon(root, admin, userId);
+
+ if (isNotCurrentUserOrProfile(admin, userId)) {
admin = null;
-
- supportIconView.setImageDrawable(
- mActivity.getDrawable(com.android.internal.R.drawable.ic_info));
-
- TypedArray ta = mActivity.obtainStyledAttributes(new int[]{android.R.attr.colorAccent});
- supportIconView.setImageTintList(ColorStateList.valueOf(ta.getColor(0, 0)));
- ta.recycle();
- } else {
- final Drawable badgedIcon = Utils.getBadgedIcon(
- IconDrawableFactory.newInstance(mActivity),
- mActivity.getPackageManager(),
- admin.getPackageName(),
- userId);
- supportIconView.setImageDrawable(badgedIcon);
}
setAdminSupportTitle(root, restriction);
@@ -151,12 +140,44 @@
setAdminSupportDetails(mActivity, root, new EnforcedAdmin(admin, user));
}
+ private boolean isNotCurrentUserOrProfile(ComponentName admin, int userId) {
+ return !isFinancedDevice()
+ && (!RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(mActivity, admin)
+ || !RestrictedLockUtils.isCurrentUserOrProfile(mActivity, userId));
+ }
+
+ @VisibleForTesting
+ void setAdminSupportIcon(View root, ComponentName admin, int userId) {
+ ImageView supportIconView = root.requireViewById(R.id.admin_support_icon);
+ if (isFinancedDevice()) {
+ supportIconView.setVisibility(View.GONE);
+ } else if (isNotCurrentUserOrProfile(admin, userId)) {
+ supportIconView.setImageDrawable(
+ mActivity.getDrawable(com.android.internal.R.drawable.ic_info));
+
+ TypedArray ta = mActivity.obtainStyledAttributes(new int[]{android.R.attr.colorAccent});
+ supportIconView.setImageTintList(ColorStateList.valueOf(ta.getColor(0, 0)));
+ ta.recycle();
+ } else {
+ final Drawable badgedIcon = Utils.getBadgedIcon(
+ IconDrawableFactory.newInstance(mActivity),
+ mActivity.getPackageManager(),
+ admin.getPackageName(),
+ userId);
+ supportIconView.setImageDrawable(badgedIcon);
+ }
+ }
+
@VisibleForTesting
void setAdminSupportTitle(View root, String restriction) {
final TextView titleView = root.findViewById(R.id.admin_support_dialog_title);
if (titleView == null) {
return;
}
+ if (isFinancedDevice()) {
+ titleView.setText(R.string.disabled_by_policy_title_financed_device);
+ return;
+ }
if (restriction == null) {
titleView.setText(R.string.disabled_by_policy_title);
return;
@@ -195,6 +216,7 @@
final DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(
Context.DEVICE_POLICY_SERVICE);
+ CharSequence supportMessage = null;
if (!RestrictedLockUtilsInternal.isAdminInCurrentUserOrProfile(activity,
enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile(
activity, getEnforcementAdminUserId(enforcedAdmin))) {
@@ -203,15 +225,16 @@
if (enforcedAdmin.user == null) {
enforcedAdmin.user = UserHandle.of(UserHandle.myUserId());
}
- CharSequence supportMessage = null;
if (UserHandle.isSameApp(Process.myUid(), Process.SYSTEM_UID)) {
supportMessage = dpm.getShortSupportMessageForUser(enforcedAdmin.component,
getEnforcementAdminUserId(enforcedAdmin));
}
- if (supportMessage != null) {
- final TextView textView = root.findViewById(R.id.admin_support_msg);
- textView.setText(supportMessage);
- }
+ }
+ final TextView textView = root.findViewById(R.id.admin_support_msg);
+ if (supportMessage != null) {
+ textView.setText(supportMessage);
+ } else if (!isFinancedDevice()) {
+ textView.setText(R.string.default_admin_support_msg);
}
}
@@ -233,4 +256,10 @@
activity.startActivity(intent);
}
}
+
+ private boolean isFinancedDevice() {
+ final DevicePolicyManager dpm = mActivity.getSystemService(DevicePolicyManager.class);
+ return dpm.isDeviceManaged() && dpm.getDeviceOwnerType(
+ dpm.getDeviceOwnerComponentOnAnyUser()) == DEVICE_OWNER_TYPE_FINANCED;
+ }
}
diff --git a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
index ff3a36f..1ff1d79 100644
--- a/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
+++ b/tests/robotests/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelperTest.java
@@ -16,6 +16,8 @@
package com.android.settings.enterprise;
+import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
+
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -34,8 +36,10 @@
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
+import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
+import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
@@ -105,11 +109,23 @@
}
@Test
+ public void testSetAdminSupportIconForFinancedDevice_adminSupportIconIsGone() {
+ final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
+ final ViewGroup view = new FrameLayout(mActivity);
+ final ImageView supportIconImageView = createAdminSupportIconImageView(view, mActivity);
+ final ComponentName component = new ComponentName("some.package.name",
+ "some.package.name.SomeClass");
+ setupFinancedDevice(dpmShadow);
+
+ mHelper.setAdminSupportIcon(view, component, 123);
+
+ assertEquals(View.GONE, supportIconImageView.getVisibility());
+ }
+
+ @Test
public void testSetAdminSupportTitle() {
final ViewGroup view = new FrameLayout(mActivity);
- final TextView textView = new TextView(mActivity);
- textView.setId(R.id.admin_support_dialog_title);
- view.addView(textView);
+ final TextView textView = createAdminSupportDialogTitleTextView(view, mActivity);
mHelper.setAdminSupportTitle(view, UserManager.DISALLOW_ADJUST_VOLUME);
assertEquals(Shadows.shadowOf(textView).innerText(),
@@ -145,6 +161,19 @@
}
@Test
+ public void testSetAdminSupportTitleForFinancedDevice() {
+ final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
+ final ViewGroup view = new FrameLayout(mActivity);
+ final TextView textView = createAdminSupportDialogTitleTextView(view, mActivity);
+ setupFinancedDevice(dpmShadow);
+
+ mHelper.setAdminSupportTitle(view, null);
+
+ assertEquals(Shadows.shadowOf(textView).innerText(),
+ mActivity.getString(R.string.disabled_by_policy_title_financed_device));
+ }
+
+ @Test
public void testSetAdminSupportDetails() {
final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
final UserManager userManager = RuntimeEnvironment.application.getSystemService(
@@ -154,17 +183,13 @@
final ComponentName component = new ComponentName("some.package.name",
"some.package.name.SomeClass");
final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
- final TextView textView = new TextView(mActivity);
-
- textView.setId(R.id.admin_support_msg);
- view.addView(textView);
+ final TextView textView = createAdminSupportTextView(view, mActivity);
dpmShadow.setShortSupportMessageForUser(component, 123, "some message");
dpmShadow.setIsAdminActiveAsUser(true);
- userManagerShadow.addProfile(new UserInfo(123, null, 0));
- userManagerShadow.addUserProfile(new UserHandle(123));
- ShadowProcess.setUid(Process.SYSTEM_UID);
+ createShadowWorkProfile(userManagerShadow);
mHelper.setAdminSupportDetails(mActivity, view, admin);
+
assertNotNull(admin.component);
assertEquals("some message", Shadows.shadowOf(textView).innerText());
}
@@ -175,16 +200,40 @@
final UserManager userManager = RuntimeEnvironment.application.getSystemService(
UserManager.class);
final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
+ final ViewGroup view = new FrameLayout(mActivity);
final ComponentName component = new ComponentName("some.package.name",
"some.package.name.SomeClass");
final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
-
+ final TextView textView = createAdminSupportTextView(view, mActivity);
dpmShadow.setShortSupportMessageForUser(component, 123, "some message");
dpmShadow.setIsAdminActiveAsUser(false);
userManagerShadow.addProfile(new UserInfo(123, null, 0));
- mHelper.setAdminSupportDetails(mActivity, null, admin);
+ mHelper.setAdminSupportDetails(mActivity, textView, admin);
+
assertNull(admin.component);
+ assertEquals(mActivity.getString(R.string.default_admin_support_msg),
+ Shadows.shadowOf(textView).innerText());
+ }
+
+ @Test
+ public void testSetAdminSupportDetailsForFinancedDevice_shortSupportMessageIsNull() {
+ final ShadowDevicePolicyManager dpmShadow = ShadowDevicePolicyManager.getShadow();
+ final UserManager userManager = RuntimeEnvironment.application.getSystemService(
+ UserManager.class);
+ final ShadowUserManager userManagerShadow = Shadow.extract(userManager);
+ final ViewGroup view = new FrameLayout(mActivity);
+ final ComponentName component = new ComponentName("some.package.name",
+ "some.package.name.SomeClass");
+ final EnforcedAdmin admin = new EnforcedAdmin(component, UserHandle.of(123));
+ final TextView textView = createAdminSupportTextView(view, mActivity);
+ setupFinancedDevice(dpmShadow);
+ createShadowWorkProfile(userManagerShadow);
+
+ mHelper.setAdminSupportDetails(mActivity, view, admin);
+
+ assertNotNull(admin.component);
+ assertEquals("", Shadows.shadowOf(textView).innerText());
}
@Test
@@ -210,4 +259,44 @@
mHelper.maybeSetLearnMoreButton(builder);
verify(builder, never()).setNeutralButton(anyInt(), any());
}
+
+ private static ImageView createAdminSupportIconImageView(final ViewGroup view,
+ final Activity activity) {
+ final ImageView supportIconView = new ImageView(activity);
+ supportIconView.setId(R.id.admin_support_icon);
+ view.addView(supportIconView);
+ return supportIconView;
+ }
+
+ private static TextView createAdminSupportDialogTitleTextView(final ViewGroup view,
+ final Activity activity) {
+ final TextView textView = new TextView(activity);
+ textView.setId(R.id.admin_support_dialog_title);
+ view.addView(textView);
+ return textView;
+ }
+
+ private static TextView createAdminSupportTextView(final ViewGroup view,
+ final Activity activity) {
+ final TextView textView = new TextView(activity);
+ textView.setId(R.id.admin_support_msg);
+ view.addView(textView);
+ return textView;
+ }
+
+ private static void createShadowWorkProfile(final ShadowUserManager userManagerShadow) {
+ userManagerShadow.addProfile(new UserInfo(123, null, 0));
+ userManagerShadow.addUserProfile(new UserHandle(123));
+ ShadowProcess.setUid(Process.SYSTEM_UID);
+ }
+
+ private static void setupFinancedDevice(final ShadowDevicePolicyManager dpmShadow) {
+ final ComponentName component = new ComponentName("some.package.name",
+ "some.package.name.SomeClass");
+ dpmShadow.setDeviceOwner(component);
+ dpmShadow.setDeviceOwnerComponentOnAnyUser(component);
+ dpmShadow.setDeviceOwnerType(component, DEVICE_OWNER_TYPE_FINANCED);
+ dpmShadow.setShortSupportMessageForUser(component, 123, null);
+ dpmShadow.setIsAdminActiveAsUser(true);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java
index b8fdf89..a2e4430 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowDevicePolicyManager.java
@@ -1,11 +1,13 @@
package com.android.settings.testutils.shadow;
+import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.admin.DevicePolicyManager;
+import android.app.admin.DevicePolicyManager.DeviceOwnerType;
import android.app.admin.PasswordMetrics;
import android.app.admin.PasswordPolicy;
import android.content.ComponentName;
@@ -23,6 +25,7 @@
public class ShadowDevicePolicyManager extends org.robolectric.shadows.ShadowDevicePolicyManager {
private final Map<Integer, Long> mProfileTimeouts = new HashMap<>();
+ private final Map<String, Integer> mDeviceOwnerTypes = new HashMap<>();
private Map<Integer, CharSequence> mSupportMessagesMap = new HashMap<>();
private boolean mIsAdminActiveAsUser = false;
private ComponentName mDeviceOwnerComponentName;
@@ -77,6 +80,16 @@
mDeviceOwnerComponentName = admin;
}
+ public void setDeviceOwnerType(@NonNull ComponentName admin,
+ @DeviceOwnerType int deviceOwnerType) {
+ mDeviceOwnerTypes.put(admin.getPackageName(), deviceOwnerType);
+ }
+
+ @DeviceOwnerType
+ public int getDeviceOwnerType(@NonNull ComponentName admin) {
+ return mDeviceOwnerTypes.getOrDefault(admin.getPackageName(), DEVICE_OWNER_TYPE_DEFAULT);
+ }
+
@Implementation
public PasswordMetrics getPasswordMinimumMetrics(int userHandle) {
PasswordPolicy policy = new PasswordPolicy();