Allow Device Management Role Holder to update Settings strings.

Test: manual
Bug: 188414370
Change-Id: I6e1a06619799a9e99382d791e72e2e4518f93cac
This commit is contained in:
Jonathan Scott
2022-01-19 15:19:08 +00:00
parent 47d115c3ff
commit e0d439472f
55 changed files with 788 additions and 231 deletions

View File

@@ -16,6 +16,9 @@
package com.android.settings; package com.android.settings;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.accounts.Account; import android.accounts.Account;
@@ -23,6 +26,7 @@ import android.accounts.AccountManager;
import android.accounts.AuthenticatorDescription; import android.accounts.AuthenticatorDescription;
import android.app.ActionBar; import android.app.ActionBar;
import android.app.Activity; import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -491,8 +495,17 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis
if (profilesSize > 1) { if (profilesSize > 1) {
View titleView = Utils.inflateCategoryHeader(inflater, contents); View titleView = Utils.inflateCategoryHeader(inflater, contents);
final TextView titleText = (TextView) titleView.findViewById(android.R.id.title); final TextView titleText = (TextView) titleView.findViewById(android.R.id.title);
titleText.setText(userInfo.isManagedProfile() ? R.string.category_work
: R.string.category_personal); DevicePolicyManager devicePolicyManager =
context.getSystemService(DevicePolicyManager.class);
if (userInfo.isManagedProfile()) {
titleText.setText(devicePolicyManager.getString(
WORK_CATEGORY_HEADER, () -> getString(R.string.category_work)));
} else {
titleText.setText(devicePolicyManager.getString(
PERSONAL_CATEGORY_HEADER, () -> getString(R.string.category_personal)));
}
contents.addView(titleView); contents.addView(titleView);
} }

View File

@@ -15,6 +15,11 @@
*/ */
package com.android.settings; package com.android.settings;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_DIALOG_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_FINISHED_REQUEST_CONSENT;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARE_REMOTE_BUGREPORT_NOT_FINISHED_REQUEST_CONSENT;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SHARING_REMOTE_BUGREPORT_MESSAGE;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Activity; import android.app.Activity;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -42,12 +47,16 @@ public class RemoteBugreportActivity extends Activity {
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
final int notificationType = getIntent().getIntExtra( final int notificationType = getIntent().getIntExtra(
DevicePolicyManager.EXTRA_BUGREPORT_NOTIFICATION_TYPE, -1); DevicePolicyManager.EXTRA_BUGREPORT_NOTIFICATION_TYPE, -1);
if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED) { if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED) {
AlertDialog dialog = new AlertDialog.Builder(this) AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage(R.string.sharing_remote_bugreport_dialog_message) .setMessage(devicePolicyManager.getString(
SHARING_REMOTE_BUGREPORT_MESSAGE,
() -> getString(R.string.sharing_remote_bugreport_dialog_message)))
.setOnDismissListener(new DialogInterface.OnDismissListener() { .setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override @Override
public void onDismiss(DialogInterface dialog) { public void onDismiss(DialogInterface dialog) {
@@ -65,12 +74,21 @@ public class RemoteBugreportActivity extends Activity {
} else if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED } else if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
|| notificationType || notificationType
== DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) { == DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) {
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle(R.string.share_remote_bugreport_dialog_title) int defaultMessageId = notificationType
.setMessage(notificationType
== DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
? R.string.share_remote_bugreport_dialog_message ? R.string.share_remote_bugreport_dialog_message
: R.string.share_remote_bugreport_dialog_message_finished) : R.string.share_remote_bugreport_dialog_message_finished;
String overrideMessageId = notificationType
== DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED
? SHARE_REMOTE_BUGREPORT_NOT_FINISHED_REQUEST_CONSENT
: SHARE_REMOTE_BUGREPORT_FINISHED_REQUEST_CONSENT;
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle(devicePolicyManager.getString(SHARE_REMOTE_BUGREPORT_DIALOG_TITLE,
() -> getString(R.string.share_remote_bugreport_dialog_title)))
.setMessage(devicePolicyManager.getString(overrideMessageId,
() -> getString(defaultMessageId)))
.setOnDismissListener(new DialogInterface.OnDismissListener() { .setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override @Override
public void onDismiss(DialogInterface dialog) { public void onDismiss(DialogInterface dialog) {

View File

@@ -16,6 +16,8 @@
package com.android.settings; package com.android.settings;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
import static android.widget.LinearLayout.LayoutParams.MATCH_PARENT; import static android.widget.LinearLayout.LayoutParams.MATCH_PARENT;
import static android.widget.LinearLayout.LayoutParams.WRAP_CONTENT; import static android.widget.LinearLayout.LayoutParams.WRAP_CONTENT;
@@ -82,6 +84,7 @@ public class TrustedCredentialsSettings extends InstrumentedFragment
private static final String TAG = "TrustedCredentialsSettings"; private static final String TAG = "TrustedCredentialsSettings";
private DevicePolicyManager mDevicePolicyManager;
private UserManager mUserManager; private UserManager mUserManager;
private KeyguardManager mKeyguardManager; private KeyguardManager mKeyguardManager;
private int mTrustAllCaUserId; private int mTrustAllCaUserId;
@@ -179,6 +182,7 @@ public class TrustedCredentialsSettings extends InstrumentedFragment
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
final Activity activity = getActivity(); final Activity activity = getActivity();
mDevicePolicyManager = activity.getSystemService(DevicePolicyManager.class);
mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
mKeyguardManager = (KeyguardManager) activity mKeyguardManager = (KeyguardManager) activity
.getSystemService(Context.KEYGUARD_SERVICE); .getSystemService(Context.KEYGUARD_SERVICE);
@@ -385,9 +389,12 @@ public class TrustedCredentialsSettings extends InstrumentedFragment
final TextView title = (TextView) convertView.findViewById(android.R.id.title); final TextView title = (TextView) convertView.findViewById(android.R.id.title);
if (getUserInfoByGroup(groupPosition).isManagedProfile()) { if (getUserInfoByGroup(groupPosition).isManagedProfile()) {
title.setText(R.string.category_work); title.setText(mDevicePolicyManager.getString(WORK_CATEGORY_HEADER,
() -> getString(R.string.category_work)));
} else { } else {
title.setText(R.string.category_personal); title.setText(mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
() -> getString(R.string.category_personal)));
} }
title.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); title.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);

View File

@@ -16,6 +16,14 @@
package com.android.settings.accounts; package com.android.settings.accounts;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_CATEGORY_PERSONAL;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_CATEGORY_WORK;
import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_BY;
import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_PROFILE_SETTINGS_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_WORK_PROFILE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOT_AVAILABLE;
import static android.content.Intent.EXTRA_USER; import static android.content.Intent.EXTRA_USER;
import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS; import static android.os.UserManager.DISALLOW_MODIFY_ACCOUNTS;
import static android.os.UserManager.DISALLOW_REMOVE_MANAGED_PROFILE; import static android.os.UserManager.DISALLOW_REMOVE_MANAGED_PROFILE;
@@ -24,6 +32,7 @@ import static android.provider.Settings.EXTRA_AUTHORITIES;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -85,6 +94,7 @@ public class AccountPreferenceController extends AbstractPreferenceController
private static final String PREF_KEY_WORK_PROFILE_SETTING = "work_profile_setting"; private static final String PREF_KEY_WORK_PROFILE_SETTING = "work_profile_setting";
private UserManager mUm; private UserManager mUm;
private DevicePolicyManager mDpm;
private SparseArray<ProfileData> mProfiles = new SparseArray<ProfileData>(); private SparseArray<ProfileData> mProfiles = new SparseArray<ProfileData>();
private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver = private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver =
new ManagedProfileBroadcastReceiver(); new ManagedProfileBroadcastReceiver();
@@ -146,6 +156,7 @@ public class AccountPreferenceController extends AbstractPreferenceController
@ProfileSelectFragment.ProfileType int type) { @ProfileSelectFragment.ProfileType int type) {
super(context); super(context);
mUm = (UserManager) context.getSystemService(Context.USER_SERVICE); mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
mDpm = context.getSystemService(DevicePolicyManager.class);
mAuthorities = authorities; mAuthorities = authorities;
mFragment = parent; mFragment = parent;
if (mAuthorities != null) { if (mAuthorities != null) {
@@ -188,13 +199,16 @@ public class AccountPreferenceController extends AbstractPreferenceController
UserHandle.myUserId())) { UserHandle.myUserId())) {
final SearchIndexableRaw data = new SearchIndexableRaw(mContext); final SearchIndexableRaw data = new SearchIndexableRaw(mContext);
data.key = PREF_KEY_REMOVE_PROFILE; data.key = PREF_KEY_REMOVE_PROFILE;
data.title = res.getString(R.string.remove_managed_profile_label); data.title = mDpm.getString(
REMOVE_WORK_PROFILE,
() -> res.getString(R.string.remove_managed_profile_label));
data.screenTitle = screenTitle; data.screenTitle = screenTitle;
rawData.add(data); rawData.add(data);
} }
final SearchIndexableRaw data = new SearchIndexableRaw(mContext); final SearchIndexableRaw data = new SearchIndexableRaw(mContext);
data.key = PREF_KEY_WORK_PROFILE_SETTING; data.key = PREF_KEY_WORK_PROFILE_SETTING;
data.title = res.getString(R.string.managed_profile_settings_title); data.title = mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
() -> res.getString(R.string.managed_profile_settings_title));
data.screenTitle = screenTitle; data.screenTitle = screenTitle;
rawData.add(data); rawData.add(data);
} }
@@ -253,7 +267,8 @@ public class AccountPreferenceController extends AbstractPreferenceController
new SubSettingLauncher(mContext) new SubSettingLauncher(mContext)
.setSourceMetricsCategory(metricsCategory) .setSourceMetricsCategory(metricsCategory)
.setDestination(ManagedProfileSettings.class.getName()) .setDestination(ManagedProfileSettings.class.getName())
.setTitleRes(R.string.managed_profile_settings_title) .setTitleText(mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
() -> mContext.getString(R.string.managed_profile_settings_title)))
.setArguments(arguments) .setArguments(arguments)
.launch(); .launch();
@@ -331,11 +346,15 @@ public class AccountPreferenceController extends AbstractPreferenceController
preferenceGroup.setContentDescription(title); preferenceGroup.setContentDescription(title);
} else if (userInfo.isManagedProfile()) { } else if (userInfo.isManagedProfile()) {
if (mType == ProfileSelectFragment.ProfileType.ALL) { if (mType == ProfileSelectFragment.ProfileType.ALL) {
preferenceGroup.setTitle(R.string.category_work); preferenceGroup.setTitle(
mDpm.getString(WORK_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_work)));
final String workGroupSummary = getWorkGroupSummary(context, userInfo); final String workGroupSummary = getWorkGroupSummary(context, userInfo);
preferenceGroup.setSummary(workGroupSummary); preferenceGroup.setSummary(workGroupSummary);
preferenceGroup.setContentDescription( preferenceGroup.setContentDescription(
mContext.getString(R.string.accessibility_category_work, workGroupSummary)); mDpm.getString(ACCESSIBILITY_CATEGORY_WORK, () ->
mContext.getString(
R.string.accessibility_category_work, workGroupSummary)));
} }
profileData.removeWorkProfilePreference = newRemoveWorkProfilePreference(); profileData.removeWorkProfilePreference = newRemoveWorkProfilePreference();
mHelper.enforceRestrictionOnPreference(profileData.removeWorkProfilePreference, mHelper.enforceRestrictionOnPreference(profileData.removeWorkProfilePreference,
@@ -343,9 +362,12 @@ public class AccountPreferenceController extends AbstractPreferenceController
profileData.managedProfilePreference = newManagedProfileSettings(); profileData.managedProfilePreference = newManagedProfileSettings();
} else { } else {
if (mType == ProfileSelectFragment.ProfileType.ALL) { if (mType == ProfileSelectFragment.ProfileType.ALL) {
preferenceGroup.setTitle(R.string.category_personal); preferenceGroup.setTitle(
mDpm.getString(PERSONAL_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_personal)));
preferenceGroup.setContentDescription( preferenceGroup.setContentDescription(
mContext.getString(R.string.accessibility_category_personal)); mDpm.getString(ACCESSIBILITY_CATEGORY_PERSONAL, () ->
mContext.getString(R.string.accessibility_category_personal)));
} }
} }
final PreferenceScreen screen = mFragment.getPreferenceScreen(); final PreferenceScreen screen = mFragment.getPreferenceScreen();
@@ -378,7 +400,9 @@ public class AccountPreferenceController extends AbstractPreferenceController
RestrictedPreference preference = new RestrictedPreference( RestrictedPreference preference = new RestrictedPreference(
mFragment.getPreferenceManager().getContext()); mFragment.getPreferenceManager().getContext());
preference.setKey(PREF_KEY_REMOVE_PROFILE); preference.setKey(PREF_KEY_REMOVE_PROFILE);
preference.setTitle(R.string.remove_managed_profile_label); preference.setTitle(
mDpm.getString(REMOVE_WORK_PROFILE,
() -> mContext.getString(R.string.remove_managed_profile_label)));
preference.setIcon(R.drawable.ic_delete); preference.setIcon(R.drawable.ic_delete);
preference.setOnPreferenceClickListener(this); preference.setOnPreferenceClickListener(this);
preference.setOrder(ORDER_LAST); preference.setOrder(ORDER_LAST);
@@ -389,7 +413,8 @@ public class AccountPreferenceController extends AbstractPreferenceController
private Preference newManagedProfileSettings() { private Preference newManagedProfileSettings() {
Preference preference = new Preference(mFragment.getPreferenceManager().getContext()); Preference preference = new Preference(mFragment.getPreferenceManager().getContext());
preference.setKey(PREF_KEY_WORK_PROFILE_SETTING); preference.setKey(PREF_KEY_WORK_PROFILE_SETTING);
preference.setTitle(R.string.managed_profile_settings_title); preference.setTitle(mDpm.getString(MANAGED_PROFILE_SETTINGS_TITLE,
() -> mContext.getString(R.string.managed_profile_settings_title)));
preference.setIcon(R.drawable.ic_settings_24dp); preference.setIcon(R.drawable.ic_settings_24dp);
preference.setOnPreferenceClickListener(this); preference.setOnPreferenceClickListener(this);
preference.setOrder(ORDER_NEXT_TO_LAST); preference.setOrder(ORDER_NEXT_TO_LAST);
@@ -403,7 +428,8 @@ public class AccountPreferenceController extends AbstractPreferenceController
return null; return null;
} }
CharSequence appLabel = packageManager.getApplicationLabel(adminApplicationInfo); CharSequence appLabel = packageManager.getApplicationLabel(adminApplicationInfo);
return mContext.getString(R.string.managing_admin, appLabel); return mDpm.getString(MANAGED_BY,
() -> mContext.getString(R.string.managing_admin, appLabel), appLabel);
} }
void cleanUpPreferences() { void cleanUpPreferences() {
@@ -482,7 +508,9 @@ public class AccountPreferenceController extends AbstractPreferenceController
mProfileNotAvailablePreference.setIcon(R.drawable.empty_icon); mProfileNotAvailablePreference.setIcon(R.drawable.empty_icon);
mProfileNotAvailablePreference.setTitle(null); mProfileNotAvailablePreference.setTitle(null);
mProfileNotAvailablePreference.setSummary( mProfileNotAvailablePreference.setSummary(
R.string.managed_profile_not_available_label); mDpm.getString(
WORK_PROFILE_NOT_AVAILABLE, () -> mContext.getString(
R.string.managed_profile_not_available_label)));
profileData.preferenceGroup.addPreference(mProfileNotAvailablePreference); profileData.preferenceGroup.addPreference(mProfileNotAvailablePreference);
} }
if (profileData.removeWorkProfilePreference != null) { if (profileData.removeWorkProfilePreference != null) {

View File

@@ -16,10 +16,14 @@
package com.android.settings.accounts; package com.android.settings.accounts;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_PERSONAL_ACCOUNT_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACCESSIBILITY_WORK_ACCOUNT_TITLE;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
@@ -154,10 +158,20 @@ public class AccountSyncSettings extends AccountPreferenceBase {
UserInfo user = um.getUserInfo(mUserHandle.getIdentifier()); UserInfo user = um.getUserInfo(mUserHandle.getIdentifier());
boolean isWorkProfile = user != null ? user.isManagedProfile() : false; boolean isWorkProfile = user != null ? user.isManagedProfile() : false;
CharSequence currentTitle = getActivity().getTitle(); CharSequence currentTitle = getActivity().getTitle();
DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
String accessibilityTitle = String accessibilityTitle =
getString(isWorkProfile isWorkProfile
? R.string.accessibility_work_account_title ? devicePolicyManager.getString(ACCESSIBILITY_WORK_ACCOUNT_TITLE,
: R.string.accessibility_personal_account_title, currentTitle); () -> getString(R.string.accessibility_work_account_title,
currentTitle), currentTitle)
: devicePolicyManager.getString(
ACCESSIBILITY_PERSONAL_ACCOUNT_TITLE,
() -> getString(
R.string.accessibility_personal_account_title,
currentTitle), currentTitle);
getActivity().setTitle(Utils.createAccessibleSequence(currentTitle, accessibilityTitle)); getActivity().setTitle(Utils.createAccessibleSequence(currentTitle, accessibilityTitle));
} }

View File

@@ -15,12 +15,15 @@
*/ */
package com.android.settings.accounts; package com.android.settings.accounts;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_ACCOUNT_FAILED_ADMIN_RESTRICTION;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.accounts.AuthenticatorException; import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException; import android.accounts.OperationCanceledException;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
@@ -213,7 +216,9 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
return new AlertDialog.Builder(context) return new AlertDialog.Builder(context)
.setTitle(R.string.remove_account_label) .setTitle(R.string.remove_account_label)
.setMessage(R.string.remove_account_failed) .setMessage(getContext().getSystemService(DevicePolicyManager.class)
.getString(REMOVE_ACCOUNT_FAILED_ADMIN_RESTRICTION,
() -> getString(R.string.remove_account_failed)))
.setPositiveButton(android.R.string.ok, null) .setPositiveButton(android.R.string.ok, null)
.create(); .create();
} }

View File

@@ -13,6 +13,10 @@
*/ */
package com.android.settings.accounts; package com.android.settings.accounts;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_OFF_SUMMARY;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING_ON_SUMMARY;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -40,6 +44,7 @@ public class WorkModePreferenceController extends BasePreferenceController imple
private UserManager mUserManager; private UserManager mUserManager;
private UserHandle mManagedUser; private UserHandle mManagedUser;
private DevicePolicyManager mDevicePolicyManager;
private Preference mPreference; private Preference mPreference;
private IntentFilter mIntentFilter; private IntentFilter mIntentFilter;
@@ -47,6 +52,7 @@ public class WorkModePreferenceController extends BasePreferenceController imple
public WorkModePreferenceController(Context context, String key) { public WorkModePreferenceController(Context context, String key) {
super(context, key); super(context, key);
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
mIntentFilter = new IntentFilter(); mIntentFilter = new IntentFilter();
mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
@@ -80,9 +86,15 @@ public class WorkModePreferenceController extends BasePreferenceController imple
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
return mContext.getText(isChecked() if (isChecked()) {
? R.string.work_mode_on_summary return mDevicePolicyManager
: R.string.work_mode_off_summary); .getString(WORK_PROFILE_SETTING_ON_SUMMARY,
() -> mContext.getString(R.string.work_mode_on_summary));
}
return mDevicePolicyManager
.getString(WORK_PROFILE_SETTING_OFF_SUMMARY,
() -> mContext.getString(R.string.work_mode_off_summary));
} }
private boolean isChecked() { private boolean isChecked() {

View File

@@ -219,7 +219,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
} }
} }
public static void startAppInfoFragment(Class<?> fragment, int titleRes, public static void startAppInfoFragment(Class<?> fragment, String title,
String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) { String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) {
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg); args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg);
@@ -228,7 +228,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment
new SubSettingLauncher(source.getContext()) new SubSettingLauncher(source.getContext())
.setDestination(fragment.getName()) .setDestination(fragment.getName())
.setSourceMetricsCategory(sourceMetricsCategory) .setSourceMetricsCategory(sourceMetricsCategory)
.setTitleRes(titleRes) .setTitleText(title)
.setArguments(args) .setArguments(args)
.setUserHandle(new UserHandle(UserHandle.getUserId(uid))) .setUserHandle(new UserHandle(UserHandle.getUserId(uid)))
.setResultListener(source, request) .setResultListener(source, request)

View File

@@ -211,7 +211,8 @@ public class AppsPreferenceController extends BasePreferenceController implement
pref.setOrder(showAppsCount++); pref.setOrder(showAppsCount++);
pref.setOnPreferenceClickListener(preference -> { pref.setOnPreferenceClickListener(preference -> {
AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class, AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
R.string.application_info_label, pkgName, appEntry.info.uid, mContext.getString(R.string.application_info_label),
pkgName, appEntry.info.uid,
mHost, 1001 /*RequestCode*/, getMetricsCategory()); mHost, 1001 /*RequestCode*/, getMetricsCategory());
return true; return true;
}); });

View File

@@ -17,6 +17,7 @@ package com.android.settings.applications;
import static android.app.AppOpsManager.OP_GET_USAGE_STATS; import static android.app.AppOpsManager.OP_GET_USAGE_STATS;
import static android.app.AppOpsManager.OP_LOADER_USAGE_STATS; import static android.app.AppOpsManager.OP_LOADER_USAGE_STATS;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_DISABLE_USAGE_ACCESS_WARNING;
import android.Manifest; import android.Manifest;
import android.app.AppOpsManager; import android.app.AppOpsManager;
@@ -96,7 +97,8 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc
new AlertDialog.Builder(getContext()) new AlertDialog.Builder(getContext())
.setIcon(com.android.internal.R.drawable.ic_dialog_alert_material) .setIcon(com.android.internal.R.drawable.ic_dialog_alert_material)
.setTitle(android.R.string.dialog_alert_title) .setTitle(android.R.string.dialog_alert_title)
.setMessage(R.string.work_profile_usage_access_warning) .setMessage(mDpm.getString(WORK_PROFILE_DISABLE_USAGE_ACCESS_WARNING,
() -> getString(R.string.work_profile_usage_access_warning)))
.setPositiveButton(R.string.okay, null) .setPositiveButton(R.string.okay, null)
.show(); .show();
} }

View File

@@ -645,8 +645,8 @@ public class ManageApplications extends InstrumentedFragment
} }
private void startAppInfoFragment(Class<?> fragment, int titleRes) { private void startAppInfoFragment(Class<?> fragment, int titleRes) {
AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this, AppInfoBase.startAppInfoFragment(fragment, getString(titleRes), mCurrentPkgName,
INSTALLED_APP_DETAILS, getMetricsCategory()); mCurrentUid, this, INSTALLED_APP_DETAILS, getMetricsCategory());
} }
@Override @Override

View File

@@ -70,7 +70,8 @@ public class DomainAppPreferenceController extends BasePreferenceController impl
public boolean handlePreferenceTreeClick(Preference preference) { public boolean handlePreferenceTreeClick(Preference preference) {
if (preference instanceof DomainAppPreference) { if (preference instanceof DomainAppPreference) {
ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).getEntry(); ApplicationsState.AppEntry entry = ((DomainAppPreference) preference).getEntry();
AppInfoBase.startAppInfoFragment(AppLaunchSettings.class, R.string.auto_launch_label, AppInfoBase.startAppInfoFragment(AppLaunchSettings.class,
mContext.getString(R.string.auto_launch_label),
entry.info.packageName, entry.info.uid, mFragment, entry.info.packageName, entry.info.uid, mFragment,
INSTALLED_APP_DETAILS, mMetricsCategory); INSTALLED_APP_DETAILS, mMetricsCategory);
return true; return true;

View File

@@ -17,6 +17,18 @@
package com.android.settings.applications.specialaccess.deviceadmin; package com.android.settings.applications.specialaccess.deviceadmin;
import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVATE_DEVICE_ADMIN_APP;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVATE_THIS_DEVICE_ADMIN_APP;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ACTIVE_DEVICE_ADMIN_WARNING;
import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_ADMIN_POLICIES_WARNING;
import static android.app.admin.DevicePolicyResources.Strings.Settings.NEW_DEVICE_ADMIN_WARNING;
import static android.app.admin.DevicePolicyResources.Strings.Settings.NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_AND_UNINSTALL_DEVICE_ADMIN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_DEVICE_ADMIN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_WORK_PROFILE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_PROFILE_OWNER_DIALOG_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.USER_ADMIN_POLICIES_WARNING;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_ADMIN_POLICIES_WARNING;
import android.app.Activity; import android.app.Activity;
import android.app.ActivityManager; import android.app.ActivityManager;
@@ -318,7 +330,8 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
// Build and show the simplified dialog // Build and show the simplified dialog
final Dialog dialog = new AlertDialog.Builder(this) final Dialog dialog = new AlertDialog.Builder(this)
.setTitle(getText(R.string.profile_owner_add_title_simplified)) .setTitle(mDPM.getString(SET_PROFILE_OWNER_DIALOG_TITLE,
() -> getString(R.string.profile_owner_add_title_simplified)))
.setView(R.layout.profile_owner_add) .setView(R.layout.profile_owner_add)
.setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
@@ -339,8 +352,10 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
mAddMsg = dialog.findViewById(R.id.add_msg_simplified); mAddMsg = dialog.findViewById(R.id.add_msg_simplified);
mAddMsg.setText(mAddMsgText); mAddMsg.setText(mAddMsgText);
mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified); mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified);
mAdminWarning.setText(getString(R.string.device_admin_warning_simplified, mAdminWarning.setText(
mProfileOwnerName)); mDPM.getString(NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED, () ->
getString(R.string.device_admin_warning_simplified,
mProfileOwnerName), mProfileOwnerName));
return; return;
} }
setContentView(R.layout.device_admin_add); setContentView(R.layout.device_admin_add);
@@ -655,8 +670,10 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
final boolean isManagedProfile = isManagedProfile(mDeviceAdmin); final boolean isManagedProfile = isManagedProfile(mDeviceAdmin);
if (isProfileOwner && isManagedProfile) { if (isProfileOwner && isManagedProfile) {
// Profile owner in a managed profile, user can remove profile to disable admin. // Profile owner in a managed profile, user can remove profile to disable admin.
mAdminWarning.setText(R.string.admin_profile_owner_message); mAdminWarning.setText(mDPM.getString(WORK_PROFILE_ADMIN_POLICIES_WARNING,
mActionButton.setText(R.string.remove_managed_profile_label); () -> getString(R.string.admin_profile_owner_message)));
mActionButton.setText(mDPM.getString(REMOVE_WORK_PROFILE,
() -> getString(R.string.remove_managed_profile_label)));
final EnforcedAdmin admin = getAdminEnforcingCantRemoveProfile(); final EnforcedAdmin admin = getAdminEnforcingCantRemoveProfile();
final boolean hasBaseRestriction = hasBaseCantRemoveProfileRestriction(); final boolean hasBaseRestriction = hasBaseCantRemoveProfileRestriction();
@@ -670,27 +687,33 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
// Profile owner in a user or device owner, user can't disable admin. // Profile owner in a user or device owner, user can't disable admin.
if (isProfileOwner) { if (isProfileOwner) {
// Show profile owner in a user description. // Show profile owner in a user description.
mAdminWarning.setText(R.string.admin_profile_owner_user_message); mAdminWarning.setText(mDPM.getString(USER_ADMIN_POLICIES_WARNING,
() -> getString(R.string.admin_profile_owner_user_message)));
} else { } else {
// Show device owner description. // Show device owner description.
if (isFinancedDevice()) { if (isFinancedDevice()) {
mAdminWarning.setText(R.string.admin_financed_message); mAdminWarning.setText(R.string.admin_financed_message);
} else { } else {
mAdminWarning.setText(R.string.admin_device_owner_message); mAdminWarning.setText(mDPM.getString(DEVICE_ADMIN_POLICIES_WARNING,
() -> getString(R.string.admin_device_owner_message)));
} }
} }
mActionButton.setText(R.string.remove_device_admin); mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN,
() -> getString(R.string.remove_device_admin)));
mActionButton.setEnabled(false); mActionButton.setEnabled(false);
} else { } else {
addDeviceAdminPolicies(false /* showDescription */); addDeviceAdminPolicies(false /* showDescription */);
mAdminWarning.setText(getString(R.string.device_admin_status, CharSequence label = mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(
mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel( getPackageManager());
getPackageManager()))); mAdminWarning.setText(mDPM.getString(ACTIVE_DEVICE_ADMIN_WARNING,
() -> getString(R.string.device_admin_status, label), label));
setTitle(R.string.active_device_admin_msg); setTitle(R.string.active_device_admin_msg);
if (mUninstalling) { if (mUninstalling) {
mActionButton.setText(R.string.remove_and_uninstall_device_admin); mActionButton.setText(mDPM.getString(REMOVE_AND_UNINSTALL_DEVICE_ADMIN,
() -> getString(R.string.remove_and_uninstall_device_admin)));
} else { } else {
mActionButton.setText(R.string.remove_device_admin); mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN,
() -> getString(R.string.remove_device_admin)));
} }
} }
CharSequence supportMessage = mDPM.getLongSupportMessageForUser( CharSequence supportMessage = mDPM.getLongSupportMessageForUser(
@@ -703,10 +726,16 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity {
} }
} else { } else {
addDeviceAdminPolicies(true /* showDescription */); addDeviceAdminPolicies(true /* showDescription */);
mAdminWarning.setText(getString(R.string.device_admin_warning, CharSequence label = mDeviceAdmin.getActivityInfo()
mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager()))); .applicationInfo.loadLabel(getPackageManager());
setTitle(getText(R.string.add_device_admin_msg)); mAdminWarning.setText(
mActionButton.setText(getText(R.string.add_device_admin)); mDPM.getString(NEW_DEVICE_ADMIN_WARNING, () ->
getString(R.string.device_admin_warning, label
), label));
setTitle(mDPM.getString(ACTIVATE_DEVICE_ADMIN_APP,
() -> getString(R.string.add_device_admin_msg)));
mActionButton.setText(mDPM.getString(ACTIVATE_THIS_DEVICE_ADMIN_APP,
() -> getString(R.string.add_device_admin)));
if (isAdminUninstallable()) { if (isAdminUninstallable()) {
mUninstallButton.setVisibility(View.VISIBLE); mUninstallButton.setVisibility(View.VISIBLE);
} }

View File

@@ -15,6 +15,11 @@
*/ */
package com.android.settings.applications.specialaccess.interactacrossprofiles; package com.android.settings.applications.specialaccess.interactacrossprofiles;
import static android.app.admin.DevicePolicyResources.Strings.Settings.APP_CAN_ACCESS_PERSONAL_DATA;
import static android.app.admin.DevicePolicyResources.Strings.Settings.APP_CAN_ACCESS_PERSONAL_PERMISSIONS;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECT_APPS_DIALOG_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT;
import static android.app.admin.DevicePolicyResources.Strings.Settings.INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS; import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS;
@@ -258,16 +263,22 @@ public class InteractAcrossProfilesDetails extends AppInfoBase
final TextView dialogTitle = dialogView.findViewById( final TextView dialogTitle = dialogView.findViewById(
R.id.interact_across_profiles_consent_dialog_title); R.id.interact_across_profiles_consent_dialog_title);
dialogTitle.setText( dialogTitle.setText(mDpm.getString(CONNECT_APPS_DIALOG_TITLE, () ->
getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel)); getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel)));
final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary); final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary);
appDataSummary.setText(getString( appDataSummary.setText(
R.string.interact_across_profiles_consent_dialog_app_data_summary, mAppLabel)); mDpm.getString(APP_CAN_ACCESS_PERSONAL_DATA,
() -> getString(
R.string.interact_across_profiles_consent_dialog_app_data_summary,
mAppLabel), mAppLabel));
final TextView permissionsSummary = dialogView.findViewById(R.id.permissions_summary); final TextView permissionsSummary = dialogView.findViewById(R.id.permissions_summary);
permissionsSummary.setText(getString( permissionsSummary.setText(mDpm.getString(APP_CAN_ACCESS_PERSONAL_PERMISSIONS,
R.string.interact_across_profiles_consent_dialog_permissions_summary, mAppLabel)); () -> getString(
R.string.interact_across_profiles_consent_dialog_permissions_summary,
mAppLabel),
mAppLabel));
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(dialogView) builder.setView(dialogView)
@@ -393,8 +404,11 @@ public class InteractAcrossProfilesDetails extends AppInfoBase
return false; return false;
} }
if (!mInstalledInPersonal) { if (!mInstalledInPersonal) {
mInstallBanner.setTitle(getString( mInstallBanner.setTitle(
mDpm.getString(INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT,
() -> getString(
R.string.interact_across_profiles_install_personal_app_title, R.string.interact_across_profiles_install_personal_app_title,
mAppLabel),
mAppLabel)); mAppLabel));
if (mInstallAppIntent != null) { if (mInstallAppIntent != null) {
mInstallBanner.setSummary( mInstallBanner.setSummary(
@@ -404,8 +418,11 @@ public class InteractAcrossProfilesDetails extends AppInfoBase
return true; return true;
} }
if (!mInstalledInWork) { if (!mInstalledInWork) {
mInstallBanner.setTitle(getString( mInstallBanner.setTitle(
mDpm.getString(INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT,
() -> getString(
R.string.interact_across_profiles_install_work_app_title, R.string.interact_across_profiles_install_work_app_title,
mAppLabel),
mAppLabel)); mAppLabel));
if (mInstallAppIntent != null) { if (mInstallAppIntent != null) {
mInstallBanner.setSummary( mInstallBanner.setSummary(

View File

@@ -15,9 +15,11 @@
*/ */
package com.android.settings.applications.specialaccess.interactacrossprofiles; package com.android.settings.applications.specialaccess.interactacrossprofiles;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE;
import static android.content.pm.PackageManager.GET_ACTIVITIES; import static android.content.pm.PackageManager.GET_ACTIVITIES;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
@@ -51,6 +53,7 @@ public class InteractAcrossProfilesSettings extends EmptyTextSettings {
private Context mContext; private Context mContext;
private PackageManager mPackageManager; private PackageManager mPackageManager;
private UserManager mUserManager; private UserManager mUserManager;
private DevicePolicyManager mDevicePolicyManager;
private CrossProfileApps mCrossProfileApps; private CrossProfileApps mCrossProfileApps;
private IconDrawableFactory mIconDrawableFactory; private IconDrawableFactory mIconDrawableFactory;
@@ -63,6 +66,7 @@ public class InteractAcrossProfilesSettings extends EmptyTextSettings {
mUserManager = mContext.getSystemService(UserManager.class); mUserManager = mContext.getSystemService(UserManager.class);
mIconDrawableFactory = IconDrawableFactory.newInstance(mContext); mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class); mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class);
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
} }
@Override @Override
@@ -91,7 +95,8 @@ public class InteractAcrossProfilesSettings extends EmptyTextSettings {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
AppInfoBase.startAppInfoFragment(InteractAcrossProfilesDetails.class, AppInfoBase.startAppInfoFragment(InteractAcrossProfilesDetails.class,
R.string.interact_across_profiles_title, mDevicePolicyManager.getString(CONNECTED_WORK_AND_PERSONAL_APPS_TITLE,
() -> getString(R.string.interact_across_profiles_title)),
packageName, packageName,
appInfo.uid, appInfo.uid,
InteractAcrossProfilesSettings.this/* source */, InteractAcrossProfilesSettings.this/* source */,

View File

@@ -168,7 +168,8 @@ public class PictureInPictureSettings extends EmptyTextSettings {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
AppInfoBase.startAppInfoFragment(PictureInPictureDetails.class, AppInfoBase.startAppInfoFragment(PictureInPictureDetails.class,
R.string.picture_in_picture_app_detail_title, packageName, appInfo.uid, getString(R.string.picture_in_picture_app_detail_title),
packageName, appInfo.uid,
PictureInPictureSettings.this, -1, getMetricsCategory()); PictureInPictureSettings.this, -1, getMetricsCategory());
return true; return true;
} }

View File

@@ -88,9 +88,9 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
protected abstract int getHeaderResDefault(); protected abstract int getHeaderResDefault();
/** /**
* @return the description resource for if the biometric has been disabled by a device admin * @return the description for if the biometric has been disabled by a device admin
*/ */
protected abstract int getDescriptionResDisabledByAdmin(); protected abstract String getDescriptionDisabledByAdmin();
/** /**
* @return the cancel button * @return the cancel button
@@ -414,7 +414,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
super.initViews(); super.initViews();
if (mBiometricUnlockDisabledByAdmin && !mParentalConsentRequired) { if (mBiometricUnlockDisabledByAdmin && !mParentalConsentRequired) {
setDescriptionText(getDescriptionResDisabledByAdmin()); setDescriptionText(getDescriptionDisabledByAdmin());
} }
} }

View File

@@ -16,6 +16,8 @@
package com.android.settings.biometrics.face; package com.android.settings.biometrics.face;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_UNLOCK_DISABLED;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Intent; import android.content.Intent;
@@ -221,8 +223,11 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
} }
@Override @Override
protected int getDescriptionResDisabledByAdmin() { protected String getDescriptionDisabledByAdmin() {
return R.string.security_settings_face_enroll_introduction_message_unlock_disabled; DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class);
return devicePolicyManager.getString(
FACE_UNLOCK_DISABLED,
() -> getString(R.string.security_settings_face_enroll_introduction_message_unlock_disabled));
} }
@Override @Override

View File

@@ -16,6 +16,9 @@
package com.android.settings.biometrics.face; package com.android.settings.biometrics.face;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.os.UserHandle; import android.os.UserHandle;
@@ -27,21 +30,26 @@ import com.android.settings.R;
public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceController { public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceController {
private static final String KEY_FACE_SETTINGS = "face_settings_profile"; private static final String KEY_FACE_SETTINGS = "face_settings_profile";
private final DevicePolicyManager mDevicePolicyManager;
public FaceProfileStatusPreferenceController(Context context) { public FaceProfileStatusPreferenceController(Context context) {
super(context, KEY_FACE_SETTINGS); super(context, KEY_FACE_SETTINGS);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
} }
public FaceProfileStatusPreferenceController(Context context, String key) { public FaceProfileStatusPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
} }
public FaceProfileStatusPreferenceController(Context context, Lifecycle lifecycle) { public FaceProfileStatusPreferenceController(Context context, Lifecycle lifecycle) {
super(context, KEY_FACE_SETTINGS, lifecycle); super(context, KEY_FACE_SETTINGS, lifecycle);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
} }
public FaceProfileStatusPreferenceController(Context context, String key, Lifecycle lifecycle) { public FaceProfileStatusPreferenceController(Context context, String key, Lifecycle lifecycle) {
super(context, key, lifecycle); super(context, key, lifecycle);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
} }
@Override @Override
@@ -70,7 +78,10 @@ public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceC
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
super.updateState(preference); super.updateState(preference);
preference.setTitle(mContext.getResources().getString(
R.string.security_settings_face_profile_preference_title)); preference.setTitle(
mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () ->
mContext.getResources().getString(
R.string.security_settings_face_profile_preference_title)));
} }
} }

View File

@@ -17,12 +17,14 @@
package com.android.settings.biometrics.face; package com.android.settings.biometrics.face;
import static android.app.Activity.RESULT_OK; import static android.app.Activity.RESULT_OK;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE;
import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -66,6 +68,7 @@ public class FaceSettings extends DashboardFragment {
private UserManager mUserManager; private UserManager mUserManager;
private FaceManager mFaceManager; private FaceManager mFaceManager;
private DevicePolicyManager mDevicePolicyManager;
private int mUserId; private int mUserId;
private int mSensorId; private int mSensorId;
private long mChallenge; private long mChallenge;
@@ -148,6 +151,7 @@ public class FaceSettings extends DashboardFragment {
mUserManager = context.getSystemService(UserManager.class); mUserManager = context.getSystemService(UserManager.class);
mFaceManager = context.getSystemService(FaceManager.class); mFaceManager = context.getSystemService(FaceManager.class);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
mToken = getIntent().getByteArrayExtra(KEY_TOKEN); mToken = getIntent().getByteArrayExtra(KEY_TOKEN);
mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1); mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1);
mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L); mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L);
@@ -157,8 +161,10 @@ public class FaceSettings extends DashboardFragment {
mFaceFeatureProvider = FeatureFactory.getFactory(getContext()).getFaceFeatureProvider(); mFaceFeatureProvider = FeatureFactory.getFactory(getContext()).getFaceFeatureProvider();
if (mUserManager.getUserInfo(mUserId).isManagedProfile()) { if (mUserManager.getUserInfo(mUserId).isManagedProfile()) {
getActivity().setTitle(getActivity().getResources().getString( getActivity().setTitle(
R.string.security_settings_face_profile_preference_title)); mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () ->
getActivity().getResources().getString(
R.string.security_settings_face_profile_preference_title)));
} }
mLockscreenController = Utils.isMultipleBiometricsSupported(context) mLockscreenController = Utils.isMultipleBiometricsSupported(context)

View File

@@ -16,6 +16,8 @@
package com.android.settings.biometrics.fingerprint; package com.android.settings.biometrics.fingerprint;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
@@ -57,6 +59,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
@Nullable private FooterButton mPrimaryFooterButton; @Nullable private FooterButton mPrimaryFooterButton;
@Nullable private FooterButton mSecondaryFooterButton; @Nullable private FooterButton mSecondaryFooterButton;
private DevicePolicyManager mDevicePolicyManager;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
mFingerprintManager = Utils.getFingerprintManagerOrNull(this); mFingerprintManager = Utils.getFingerprintManagerOrNull(this);
@@ -68,6 +72,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint); final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint);
final ImageView iconDeviceLocked = findViewById(R.id.icon_device_locked); final ImageView iconDeviceLocked = findViewById(R.id.icon_device_locked);
final ImageView iconTrashCan = findViewById(R.id.icon_trash_can); final ImageView iconTrashCan = findViewById(R.id.icon_trash_can);
@@ -177,8 +183,10 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
} }
@Override @Override
protected int getDescriptionResDisabledByAdmin() { protected String getDescriptionDisabledByAdmin() {
return R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled; return mDevicePolicyManager.getString(
FINGERPRINT_UNLOCK_DISABLED,
() -> getString(R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled));
} }
@Override @Override

View File

@@ -17,6 +17,10 @@
package com.android.settings.biometrics.fingerprint; package com.android.settings.biometrics.fingerprint;
import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED_EXPLANATION;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE;
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import android.app.Activity; import android.app.Activity;
@@ -356,13 +360,24 @@ public class FingerprintSettings extends SubSettings {
activity, getString(getHelpResource()), activity.getClass().getName()); activity, getString(getHelpResource()), activity.getClass().getName());
final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo( final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo(
activity, ANNOTATION_URL, helpIntent); activity, ANNOTATION_URL, helpIntent);
mFooterTitle = AnnotationSpan.linkify(getText(admin != null
? R.string if (admin != null) {
.security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled DevicePolicyManager devicePolicyManager =
: R.string.security_settings_fingerprint_v2_home_screen), getSystemService(DevicePolicyManager.class);
String footerText = devicePolicyManager.getString(
FINGERPRINT_UNLOCK_DISABLED_EXPLANATION,
() -> getString(R.string.security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled));
mFooterTitle = AnnotationSpan.linkify(footerText, linkInfo, adminLinkInfo);
} else {
mFooterTitle = AnnotationSpan.linkify(
getText(R.string.security_settings_fingerprint_v2_home_screen),
linkInfo, adminLinkInfo); linkInfo, adminLinkInfo);
} }
}
private boolean isUdfps() { private boolean isUdfps() {
for (FingerprintSensorPropertiesInternal prop : mSensorProperties) { for (FingerprintSensorPropertiesInternal prop : mSensorProperties) {
if (prop.isAnyUdfpsType()) { if (prop.isAnyUdfpsType()) {
@@ -917,11 +932,20 @@ public class FingerprintSettings extends SubSettings {
mFp = getArguments().getParcelable("fingerprint"); mFp = getArguments().getParcelable("fingerprint");
final boolean isProfileChallengeUser = final boolean isProfileChallengeUser =
getArguments().getBoolean("isProfileChallengeUser"); getArguments().getBoolean("isProfileChallengeUser");
DevicePolicyManager devicePolicyManager =
getContext().getSystemService(DevicePolicyManager.class);
String messageId =
isProfileChallengeUser ? WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE
: UNDEFINED;
int defaultMessageId = isProfileChallengeUser
? R.string.fingerprint_last_delete_message_profile_challenge
: R.string.fingerprint_last_delete_message;
final AlertDialog alertDialog = new AlertDialog.Builder(getActivity()) final AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
.setTitle(R.string.fingerprint_last_delete_title) .setTitle(R.string.fingerprint_last_delete_title)
.setMessage((isProfileChallengeUser) .setMessage(devicePolicyManager.getString(
? R.string.fingerprint_last_delete_message_profile_challenge messageId, () -> getContext().getString(defaultMessageId)))
: R.string.fingerprint_last_delete_message)
.setPositiveButton(R.string.fingerprint_last_delete_confirm, .setPositiveButton(R.string.fingerprint_last_delete_confirm,
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
@Override @Override

View File

@@ -16,9 +16,12 @@
package com.android.settings.bugreporthandler; package com.android.settings.bugreporthandler;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_PROFILE_APP_SUBTEXT;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_APP_SUBTEXT;
import static android.provider.Settings.ACTION_BUGREPORT_HANDLER_SETTINGS; import static android.provider.Settings.ACTION_BUGREPORT_HANDLER_SETTINGS;
import android.app.Activity; import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -189,10 +192,15 @@ public class BugReportHandlerPicker extends DefaultAppPickerFragment {
return ""; return "";
} }
final UserInfo userInfo = mUserManager.getUserInfo(handlerUser); final UserInfo userInfo = mUserManager.getUserInfo(handlerUser);
DevicePolicyManager devicePolicyManager =
context.getSystemService(DevicePolicyManager.class);
if (userInfo != null && userInfo.isManagedProfile()) { if (userInfo != null && userInfo.isManagedProfile()) {
return context.getString(R.string.work_profile_app_subtext); return devicePolicyManager.getString(WORK_PROFILE_APP_SUBTEXT,
() -> context.getString(R.string.work_profile_app_subtext));
} }
return context.getString(R.string.personal_profile_app_subtext); return devicePolicyManager.getString(PERSONAL_PROFILE_APP_SUBTEXT,
() -> context.getString(R.string.personal_profile_app_subtext));
} }
private static class BugreportHandlerAppInfo extends DefaultAppInfo { private static class BugreportHandlerAppInfo extends DefaultAppInfo {

View File

@@ -16,10 +16,13 @@
package com.android.settings.dashboard.profileselector; package com.android.settings.dashboard.profileselector;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
import static android.content.Intent.EXTRA_USER_ID; import static android.content.Intent.EXTRA_USER_ID;
import android.annotation.IntDef; import android.annotation.IntDef;
import android.app.Activity; import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.os.Bundle; import android.os.Bundle;
@@ -96,9 +99,6 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
* Used in fragment argument with Extra key {@link SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB} * Used in fragment argument with Extra key {@link SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB}
*/ */
public static final int WORK_TAB = 1; public static final int WORK_TAB = 1;
private static final int[] LABEL = {
R.string.category_personal, R.string.category_work
};
private ViewGroup mContentView; private ViewGroup mContentView;
@@ -233,14 +233,23 @@ public abstract class ProfileSelectFragment extends DashboardFragment {
@Override @Override
public CharSequence getPageTitle(int position) { public CharSequence getPageTitle(int position) {
return mContext.getString(LABEL[convertPosition(position)]); DevicePolicyManager devicePolicyManager =
mContext.getSystemService(DevicePolicyManager.class);
if (convertPosition(position) == WORK_TAB) {
return devicePolicyManager.getString(WORK_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_work));
}
return devicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_personal));
} }
} }
private static int convertPosition(int index) { private static int convertPosition(int index) {
if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
== View.LAYOUT_DIRECTION_RTL) { == View.LAYOUT_DIRECTION_RTL) {
return LABEL.length - 1 - index; return 1 - index;
} }
return index; return index;
} }

View File

@@ -16,7 +16,12 @@
package com.android.settings.dashboard.profileselector; package com.android.settings.dashboard.profileselector;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USER_LABEL;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.database.DataSetObserver; import android.database.DataSetObserver;
@@ -54,7 +59,9 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter {
UserInfo userInfo = um.getUserInfo(mUserHandle.getIdentifier()); UserInfo userInfo = um.getUserInfo(mUserHandle.getIdentifier());
Drawable icon; Drawable icon;
if (userInfo.isManagedProfile()) { if (userInfo.isManagedProfile()) {
mName = context.getString(R.string.managed_user_title); mName = context.getSystemService(DevicePolicyManager.class).getString(
WORK_PROFILE_USER_LABEL,
() -> context.getString(R.string.managed_user_title));
icon = context.getPackageManager().getUserBadgeForDensityNoBackground( icon = context.getPackageManager().getUserBadgeForDensityNoBackground(
userHandle, /* density= */ 0); userHandle, /* density= */ 0);
} else { } else {
@@ -77,14 +84,18 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter {
} }
private ArrayList<UserDetails> data; private ArrayList<UserDetails> data;
private final Context mContext;
private final LayoutInflater mInflater; private final LayoutInflater mInflater;
private final DevicePolicyManager mDevicePolicyManager;
public UserAdapter(Context context, ArrayList<UserDetails> users) { public UserAdapter(Context context, ArrayList<UserDetails> users) {
if (users == null) { if (users == null) {
throw new IllegalArgumentException("A list of user details must be provided"); throw new IllegalArgumentException("A list of user details must be provided");
} }
mContext = context;
this.data = users; this.data = users;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
} }
public UserHandle getUserHandle(int position) { public UserHandle getUserHandle(int position) {
@@ -104,13 +115,15 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter {
return row; return row;
} }
private int getTitle(UserDetails user) { private String getTitle(UserDetails user) {
int userHandle = user.mUserHandle.getIdentifier(); int userHandle = user.mUserHandle.getIdentifier();
if (userHandle == UserHandle.USER_CURRENT if (userHandle == UserHandle.USER_CURRENT
|| userHandle == ActivityManager.getCurrentUser()) { || userHandle == ActivityManager.getCurrentUser()) {
return R.string.category_personal; return mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_personal));
} else { } else {
return R.string.category_work; return mDevicePolicyManager.getString(WORK_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_work));
} }
} }

View File

@@ -16,9 +16,11 @@
package com.android.settings.deviceinfo; package com.android.settings.deviceinfo;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ERROR_MOVE_DEVICE_ADMIN;
import static android.content.Intent.EXTRA_TITLE; import static android.content.Intent.EXTRA_TITLE;
import static android.content.pm.PackageManager.EXTRA_MOVE_ID; import static android.content.pm.PackageManager.EXTRA_MOVE_ID;
import android.app.admin.DevicePolicyManager;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.MoveCallback; import android.content.pm.PackageManager.MoveCallback;
import android.os.Bundle; import android.os.Bundle;
@@ -87,7 +89,9 @@ public class StorageWizardMoveProgress extends StorageWizardBase {
case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE: case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE:
return getString(R.string.insufficient_storage); return getString(R.string.insufficient_storage);
case PackageManager.MOVE_FAILED_DEVICE_ADMIN: case PackageManager.MOVE_FAILED_DEVICE_ADMIN:
return getString(R.string.move_error_device_admin); return getSystemService(DevicePolicyManager.class)
.getString(ERROR_MOVE_DEVICE_ADMIN,
() -> getString(R.string.move_error_device_admin));
case PackageManager.MOVE_FAILED_DOESNT_EXIST: case PackageManager.MOVE_FAILED_DOESNT_EXIST:
return getString(R.string.does_not_exist); return getString(R.string.does_not_exist);
case PackageManager.MOVE_FAILED_INVALID_LOCATION: case PackageManager.MOVE_FAILED_INVALID_LOCATION:

View File

@@ -16,6 +16,7 @@
package com.android.settings.display; package com.android.settings.display;
import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import static com.android.settings.display.ScreenTimeoutSettings.FALLBACK_SCREEN_TIMEOUT_VALUE; import static com.android.settings.display.ScreenTimeoutSettings.FALLBACK_SCREEN_TIMEOUT_VALUE;
@@ -60,7 +61,9 @@ public class ScreenTimeoutPreferenceController extends BasePreferenceController
final RestrictedLockUtils.EnforcedAdmin admin = getPreferenceDisablingAdmin(maxTimeout); final RestrictedLockUtils.EnforcedAdmin admin = getPreferenceDisablingAdmin(maxTimeout);
if (admin != null) { if (admin != null) {
preference.setEnabled(false); preference.setEnabled(false);
preference.setSummary(mContext.getText(R.string.disabled_by_policy_title)); preference.setSummary(mContext.getSystemService(DevicePolicyManager.class)
.getString(DISABLED_BY_IT_ADMIN_TITLE,
() -> mContext.getString(R.string.disabled_by_policy_title)));
((RestrictedPreference) preference).setDisabledByAdmin(admin); ((RestrictedPreference) preference).setDisabledByAdmin(admin);
} else { } else {
preference.setSummary(getTimeoutSummary(maxTimeout)); preference.setSummary(getTimeoutSummary(maxTimeout));

View File

@@ -16,6 +16,7 @@
package com.android.settings.display; package com.android.settings.display;
import static android.app.admin.DevicePolicyResources.Strings.Settings.OTHER_OPTIONS_DISABLED_BY_ADMIN;
import static android.hardware.SensorPrivacyManager.Sensors.CAMERA; import static android.hardware.SensorPrivacyManager.Sensors.CAMERA;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
@@ -85,6 +86,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements
} }
}; };
private DevicePolicyManager mDevicePolicyManager;
@VisibleForTesting @VisibleForTesting
Context mContext; Context mContext;
@@ -116,6 +119,7 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
mContext = context; mContext = context;
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries); mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries);
mInitialValues = getResources().getStringArray(R.array.screen_timeout_values); mInitialValues = getResources().getStringArray(R.array.screen_timeout_values);
mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context); mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context);
@@ -219,8 +223,9 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements
@VisibleForTesting @VisibleForTesting
void setupDisabledFooterPreference() { void setupDisabledFooterPreference() {
final String textDisabledByAdmin = getResources().getString( final String textDisabledByAdmin = mDevicePolicyManager.getString(
R.string.admin_disabled_other_options); OTHER_OPTIONS_DISABLED_BY_ADMIN, () -> getResources().getString(
R.string.admin_disabled_other_options));
final String textMoreDetails = getResources().getString(R.string.admin_more_details); final String textMoreDetails = getResources().getString(R.string.admin_more_details);
final SpannableString spannableString = new SpannableString( final SpannableString spannableString = new SpannableString(

View File

@@ -14,6 +14,9 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ADMIN_ACTION_NONE;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.text.format.DateUtils; import android.text.format.DateUtils;
@@ -43,11 +46,17 @@ public abstract class AdminActionPreferenceControllerBase extends
public void updateState(Preference preference) { public void updateState(Preference preference) {
final Date timestamp = getAdminActionTimestamp(); final Date timestamp = getAdminActionTimestamp();
preference.setSummary(timestamp == null ? preference.setSummary(timestamp == null ?
mContext.getString(R.string.enterprise_privacy_none) : getEnterprisePrivacyNone() :
DateUtils.formatDateTime(mContext, timestamp.getTime(), DateUtils.formatDateTime(mContext, timestamp.getTime(),
DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE)); DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE));
} }
private String getEnterprisePrivacyNone() {
return mContext.getSystemService(DevicePolicyManager.class)
.getString(ADMIN_ACTION_NONE,
() -> mContext.getString(R.string.enterprise_privacy_none));
}
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return true; return true;

View File

@@ -13,6 +13,10 @@
*/ */
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ALWAYS_ON_VPN_DEVICE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ALWAYS_ON_VPN_PERSONAL_PROFILE;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -27,18 +31,29 @@ public class AlwaysOnVpnCurrentUserPreferenceController
private static final String KEY_ALWAYS_ON_VPN_PRIMARY_USER = "always_on_vpn_primary_user"; private static final String KEY_ALWAYS_ON_VPN_PRIMARY_USER = "always_on_vpn_primary_user";
private final EnterprisePrivacyFeatureProvider mFeatureProvider; private final EnterprisePrivacyFeatureProvider mFeatureProvider;
private final DevicePolicyManager mDevicePolicyManager;
public AlwaysOnVpnCurrentUserPreferenceController(Context context) { public AlwaysOnVpnCurrentUserPreferenceController(Context context) {
super(context); super(context);
mFeatureProvider = FeatureFactory.getFactory(context) mFeatureProvider = FeatureFactory.getFactory(context)
.getEnterprisePrivacyFeatureProvider(context); .getEnterprisePrivacyFeatureProvider(context);
mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class);
} }
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
preference.setTitle(mFeatureProvider.isInCompMode() if (mFeatureProvider.isInCompMode()) {
? R.string.enterprise_privacy_always_on_vpn_personal preference.setTitle(
: R.string.enterprise_privacy_always_on_vpn_device); mDevicePolicyManager.getString(
ALWAYS_ON_VPN_PERSONAL_PROFILE,
() -> mContext.getString(
R.string.enterprise_privacy_always_on_vpn_personal)));
} else {
preference.setTitle(
mDevicePolicyManager.getString(ALWAYS_ON_VPN_DEVICE,
() -> mContext.getString(
R.string.enterprise_privacy_always_on_vpn_device)));
}
} }
@Override @Override

View File

@@ -14,6 +14,10 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CA_CERTS_DEVICE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CA_CERTS_PERSONAL_PROFILE;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -26,8 +30,11 @@ public class CaCertsCurrentUserPreferenceController extends CaCertsPreferenceCon
@VisibleForTesting @VisibleForTesting
static final String CA_CERTS_CURRENT_USER = "ca_certs_current_user"; static final String CA_CERTS_CURRENT_USER = "ca_certs_current_user";
DevicePolicyManager mDevicePolicyManager;
public CaCertsCurrentUserPreferenceController(Context context) { public CaCertsCurrentUserPreferenceController(Context context) {
super(context); super(context);
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
} }
@Override @Override
@@ -38,9 +45,16 @@ public class CaCertsCurrentUserPreferenceController extends CaCertsPreferenceCon
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
super.updateState(preference); super.updateState(preference);
preference.setTitle(mFeatureProvider.isInCompMode()
? R.string.enterprise_privacy_ca_certs_personal if (mFeatureProvider.isInCompMode()) {
: R.string.enterprise_privacy_ca_certs_device); preference.setTitle(mDevicePolicyManager.getString(
CA_CERTS_PERSONAL_PROFILE,
() -> mContext.getString(R.string.enterprise_privacy_ca_certs_personal)));
} else {
preference.setTitle(mDevicePolicyManager.getString(
CA_CERTS_DEVICE,
() -> mContext.getString(R.string.enterprise_privacy_ca_certs_device)));
}
} }
@Override @Override

View File

@@ -16,8 +16,13 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONTACT_YOUR_IT_ADMIN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.IT_ADMIN_POLICY_DISABLING_INFO_URL;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import com.android.settings.R; import com.android.settings.R;
@@ -25,14 +30,17 @@ import com.android.settingslib.enterprise.DeviceAdminStringProvider;
class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider { class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider {
private final Context mContext; private final Context mContext;
private final DevicePolicyManager mDevicePolicyManager;
DeviceAdminStringProviderImpl(Context context) { DeviceAdminStringProviderImpl(Context context) {
mContext = requireNonNull(context); mContext = requireNonNull(context);
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
} }
@Override @Override
public String getDefaultDisabledByPolicyTitle() { public String getDefaultDisabledByPolicyTitle() {
return mContext.getString(R.string.disabled_by_policy_title); return mDevicePolicyManager.getString(DISABLED_BY_IT_ADMIN_TITLE,
() -> mContext.getString(R.string.disabled_by_policy_title));
} }
@Override @Override
@@ -67,12 +75,14 @@ class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider {
@Override @Override
public String getDefaultDisabledByPolicyContent() { public String getDefaultDisabledByPolicyContent() {
return mContext.getString(R.string.default_admin_support_msg); return mDevicePolicyManager.getString(CONTACT_YOUR_IT_ADMIN,
() -> mContext.getString(R.string.default_admin_support_msg));
} }
@Override @Override
public String getLearnMoreHelpPageUrl() { public String getLearnMoreHelpPageUrl() {
return mContext.getString(R.string.help_url_action_disabled_by_it_admin); return mDevicePolicyManager.getString(IT_ADMIN_POLICY_DISABLING_INFO_URL,
() -> mContext.getString(R.string.help_url_action_disabled_by_it_admin));
} }
@Override @Override

View File

@@ -16,6 +16,9 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_MANAGED_WITHOUT_NAME;
import static android.app.admin.DevicePolicyResources.Strings.Settings.DEVICE_MANAGED_WITH_NAME;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
@@ -95,10 +98,12 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe
final SpannableStringBuilder disclosure = new SpannableStringBuilder(); final SpannableStringBuilder disclosure = new SpannableStringBuilder();
final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName(); final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName();
if (organizationName != null) { if (organizationName != null) {
disclosure.append(mResources.getString(R.string.do_disclosure_with_name, disclosure.append(mDpm.getString(DEVICE_MANAGED_WITH_NAME,
organizationName)); () -> mResources.getString(R.string.do_disclosure_with_name,
organizationName), organizationName));
} else { } else {
disclosure.append(mResources.getString(R.string.do_disclosure_generic)); disclosure.append(mDpm.getString(DEVICE_MANAGED_WITHOUT_NAME,
() -> mResources.getString(R.string.do_disclosure_generic)));
} }
return disclosure; return disclosure;
} }

View File

@@ -16,6 +16,10 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PERSONAL_CATEGORY_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_CATEGORY_HEADER;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -123,14 +127,20 @@ public class EnterpriseSetDefaultAppsListPreferenceController extends
if (!mEnterprisePrivacyFeatureProvider.isInCompMode() && mUsers.size() == 1) { if (!mEnterprisePrivacyFeatureProvider.isInCompMode() && mUsers.size() == 1) {
createPreferences(prefContext, screen, mApps.get(0)); createPreferences(prefContext, screen, mApps.get(0));
} else { } else {
DevicePolicyManager devicePolicyManager =
mContext.getSystemService(DevicePolicyManager.class);
for (int i = 0; i < mUsers.size(); i++) { for (int i = 0; i < mUsers.size(); i++) {
final UserInfo userInfo = mUsers.get(i); final UserInfo userInfo = mUsers.get(i);
final PreferenceCategory category = new PreferenceCategory(prefContext); final PreferenceCategory category = new PreferenceCategory(prefContext);
screen.addPreference(category); screen.addPreference(category);
if (userInfo.isManagedProfile()) { if (userInfo.isManagedProfile()) {
category.setTitle(R.string.category_work); category.setTitle(devicePolicyManager.getString(
WORK_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_work)));
} else { } else {
category.setTitle(R.string.category_personal); category.setTitle(devicePolicyManager.getString(
PERSONAL_CATEGORY_HEADER,
() -> mContext.getString(R.string.category_personal)));
} }
category.setOrder(i); category.setOrder(i);
createPreferences(prefContext, category, mApps.get(i)); createPreferences(prefContext, category, mApps.get(i));

View File

@@ -14,6 +14,9 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ADMIN_ACTION_SET_INPUT_METHOD_NAME;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -37,8 +40,12 @@ public class ImePreferenceController extends AbstractPreferenceController implem
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
preference.setSummary(mContext.getResources().getString( preference.setSummary(
mContext.getSystemService(DevicePolicyManager.class)
.getString(ADMIN_ACTION_SET_INPUT_METHOD_NAME, () ->
mContext.getResources().getString(
R.string.enterprise_privacy_input_method_name, R.string.enterprise_privacy_input_method_name,
mFeatureProvider.getImeLabelIfOwnerSet()),
mFeatureProvider.getImeLabelIfOwnerSet())); mFeatureProvider.getImeLabelIfOwnerSet()));
} }

View File

@@ -13,6 +13,9 @@
*/ */
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyResources.Strings.Settings.NUMBER_OF_DEVICE_ADMINS_NONE;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import com.android.settings.R; import com.android.settings.R;
@@ -23,20 +26,28 @@ import com.android.settings.overlay.FeatureFactory;
public class ManageDeviceAdminPreferenceController extends BasePreferenceController { public class ManageDeviceAdminPreferenceController extends BasePreferenceController {
private final EnterprisePrivacyFeatureProvider mFeatureProvider; private final EnterprisePrivacyFeatureProvider mFeatureProvider;
private final DevicePolicyManager mDevicePolicyManager;
public ManageDeviceAdminPreferenceController(Context context, String key) { public ManageDeviceAdminPreferenceController(Context context, String key) {
super(context, key); super(context, key);
mFeatureProvider = FeatureFactory.getFactory(context) mFeatureProvider = FeatureFactory.getFactory(context)
.getEnterprisePrivacyFeatureProvider(context); .getEnterprisePrivacyFeatureProvider(context);
mDevicePolicyManager =
mContext.getSystemService(DevicePolicyManager.class);
} }
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
final int activeAdmins final int activeAdmins
= mFeatureProvider.getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile(); = mFeatureProvider.getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile();
return activeAdmins == 0
? mContext.getResources().getString(R.string.number_of_device_admins_none) if (activeAdmins == 0) {
: mContext.getResources().getQuantityString(R.plurals.number_of_device_admins, return mDevicePolicyManager.getString(NUMBER_OF_DEVICE_ADMINS_NONE,
() -> mContext.getResources().getString(R.string.number_of_device_admins_none));
}
// TODO: override
return mContext.getResources().getQuantityString(R.plurals.number_of_device_admins,
activeAdmins, activeAdmins); activeAdmins, activeAdmins);
} }

View File

@@ -17,6 +17,8 @@
package com.android.settings.enterprise; package com.android.settings.enterprise;
import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO_SUMMARY;
import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
@@ -50,10 +52,16 @@ class PrivacyPreferenceControllerHelper {
final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName(); final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName();
if (organizationName == null) { if (organizationName == null) {
preference.setSummary(R.string.enterprise_privacy_settings_summary_generic); preference.setSummary(mDevicePolicyManager.getString(
MANAGED_DEVICE_INFO_SUMMARY,
() -> mContext.getString(
R.string.enterprise_privacy_settings_summary_generic)));
} else { } else {
preference.setSummary(mContext.getResources().getString( preference.setSummary(mDevicePolicyManager
R.string.enterprise_privacy_settings_summary_with_name, organizationName)); .getString(MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME,
() -> mContext.getResources().getString(
R.string.enterprise_privacy_settings_summary_with_name,
organizationName), organizationName));
} }
} }

View File

@@ -16,6 +16,9 @@
package com.android.settings.homepage.contextualcards.conditional; package com.android.settings.homepage.contextualcards.conditional;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_OFF_CONDITION_TITLE;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@@ -46,6 +49,7 @@ public class WorkModeConditionController implements ConditionalCardController {
private final Context mAppContext; private final Context mAppContext;
private final UserManager mUm; private final UserManager mUm;
private final DevicePolicyManager mDpm;
private final ConditionManager mConditionManager; private final ConditionManager mConditionManager;
private final Receiver mReceiver; private final Receiver mReceiver;
@@ -54,6 +58,7 @@ public class WorkModeConditionController implements ConditionalCardController {
public WorkModeConditionController(Context appContext, ConditionManager manager) { public WorkModeConditionController(Context appContext, ConditionManager manager) {
mAppContext = appContext; mAppContext = appContext;
mUm = mAppContext.getSystemService(UserManager.class); mUm = mAppContext.getSystemService(UserManager.class);
mDpm = mAppContext.getSystemService(DevicePolicyManager.class);
mConditionManager = manager; mConditionManager = manager;
mReceiver = new Receiver(); mReceiver = new Receiver();
} }
@@ -84,13 +89,15 @@ public class WorkModeConditionController implements ConditionalCardController {
@Override @Override
public ContextualCard buildContextualCard() { public ContextualCard buildContextualCard() {
String conditionWorkTitle = mDpm.getString(WORK_PROFILE_OFF_CONDITION_TITLE,
() -> mAppContext.getString(R.string.condition_work_title));
return new ConditionalContextualCard.Builder() return new ConditionalContextualCard.Builder()
.setConditionId(ID) .setConditionId(ID)
.setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_WORK_MODE) .setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_WORK_MODE)
.setActionText(mAppContext.getText(R.string.condition_turn_on)) .setActionText(mAppContext.getText(R.string.condition_turn_on))
.setName(mAppContext.getPackageName() + "/" .setName(mAppContext.getPackageName() + "/"
+ mAppContext.getText(R.string.condition_work_title)) + conditionWorkTitle)
.setTitleText(mAppContext.getText(R.string.condition_work_title).toString()) .setTitleText(conditionWorkTitle)
.setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString()) .setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString())
.setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable)) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable))
.setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH)

View File

@@ -16,6 +16,9 @@
package com.android.settings.notification; package com.android.settings.notification;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -103,7 +106,9 @@ public class NotificationAccessSettings extends EmptyTextSettings {
if (UserManager.get(mContext).isManagedProfile()) { if (UserManager.get(mContext).isManagedProfile()) {
// Apps in the work profile do not support notification listeners. // Apps in the work profile do not support notification listeners.
Toast.makeText(mContext, R.string.notification_settings_work_profile, Toast.makeText(mContext,
mDpm.getString(WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS,
() -> mContext.getString(R.string.notification_settings_work_profile)),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
finish(); finish();
} }
@@ -163,7 +168,9 @@ public class NotificationAccessSettings extends EmptyTextSettings {
if (managedProfileId != UserHandle.USER_NULL if (managedProfileId != UserHandle.USER_NULL
&& !mDpm.isNotificationListenerServicePermitted( && !mDpm.isNotificationListenerServicePermitted(
service.packageName, managedProfileId)) { service.packageName, managedProfileId)) {
pref.setSummary(R.string.work_profile_notification_access_blocked_summary); pref.setSummary(mDpm.getString(WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED,
() -> getString(
R.string.work_profile_notification_access_blocked_summary)));
} }
pref.setOnPreferenceClickListener(preference -> { pref.setOnPreferenceClickListener(preference -> {
final Bundle args = new Bundle(); final Bundle args = new Bundle();

View File

@@ -16,8 +16,13 @@
package com.android.settings.notification; package com.android.settings.notification;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_MESSAGE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_TITLE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_ACTIVE_SUMMARY;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@@ -252,11 +257,16 @@ public class SoundWorkSettingsController extends AbstractPreferenceController
private void enableWorkSyncSettings() { private void enableWorkSyncSettings() {
mWorkUsePersonalSounds.setChecked(true); mWorkUsePersonalSounds.setChecked(true);
String summary = mContext.getSystemService(DevicePolicyManager.class).getString(
WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_ACTIVE_SUMMARY,
() -> mContext.getString(R.string.work_sound_same_as_personal)
);
if (mWorkPhoneRingtonePreference != null) { if (mWorkPhoneRingtonePreference != null) {
mWorkPhoneRingtonePreference.setSummary(R.string.work_sound_same_as_personal); mWorkPhoneRingtonePreference.setSummary(summary);
} }
mWorkNotificationRingtonePreference.setSummary(R.string.work_sound_same_as_personal); mWorkNotificationRingtonePreference.setSummary(summary);
mWorkAlarmRingtonePreference.setSummary(R.string.work_sound_same_as_personal); mWorkAlarmRingtonePreference.setSummary(summary);
} }
private void disableWorkSync() { private void disableWorkSync() {
@@ -339,9 +349,18 @@ public class SoundWorkSettingsController extends AbstractPreferenceController
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
Context context = getActivity().getApplicationContext();
DevicePolicyManager devicePolicyManager =
context.getSystemService(DevicePolicyManager.class);
return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(getActivity())
.setTitle(R.string.work_sync_dialog_title) .setTitle(devicePolicyManager.getString(
.setMessage(R.string.work_sync_dialog_message) ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_TITLE,
() -> context.getString(R.string.work_sync_dialog_title)))
.setMessage(devicePolicyManager.getString(
ENABLE_WORK_PROFILE_SYNC_WITH_PERSONAL_SOUNDS_DIALOG_MESSAGE,
() -> context.getString(R.string.work_sync_dialog_message)))
.setPositiveButton(R.string.work_sync_dialog_yes, .setPositiveButton(R.string.work_sync_dialog_yes,
SoundWorkSettingsController.UnifyWorkDialogFragment.this) SoundWorkSettingsController.UnifyWorkDialogFragment.this)
.setNegativeButton(android.R.string.no, /* listener= */ null) .setNegativeButton(android.R.string.no, /* listener= */ null)

View File

@@ -17,7 +17,6 @@
package com.android.settings.notification.zen; package com.android.settings.notification.zen;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
@@ -28,8 +27,8 @@ import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.util.ArraySet; import android.util.ArraySet;
import android.view.View;
import android.util.Log; import android.util.Log;
import android.view.View;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -138,7 +137,7 @@ public class ZenAccessSettings extends EmptyTextSettings implements
pref.setOnPreferenceClickListener(preference -> { pref.setOnPreferenceClickListener(preference -> {
AppInfoBase.startAppInfoFragment( AppInfoBase.startAppInfoFragment(
ZenAccessDetails.class /* fragment */, ZenAccessDetails.class /* fragment */,
R.string.manage_zen_access_title /* titleRes */, getString(R.string.manage_zen_access_title) /* titleRes */,
pkg, pkg,
app.uid, app.uid,
this /* source */, this /* source */,

View File

@@ -22,6 +22,8 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_HIGH;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_LOW;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_MEDIUM;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_IT_ADMIN_CANT_RESET_SCREEN_LOCK;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SCREEN_LOCK_SETUP_MESSAGE;
import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED; import static com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment.RESULT_FINISHED;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CALLER_APP_NAME;
@@ -29,7 +31,6 @@ import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_D
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_IS_CALLING_APP_ADMIN;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -394,13 +395,16 @@ public class ChooseLockGeneric extends SettingsActivity {
} }
} else { } else {
if (mIsManagedProfile) { if (mIsManagedProfile) {
textView.setText(R.string.lock_settings_picker_profile_message); textView.setText(mDpm.getString(WORK_PROFILE_SCREEN_LOCK_SETUP_MESSAGE,
() -> getString(R.string.lock_settings_picker_profile_message)));
} else { } else {
int profileUserId = Utils.getManagedProfileId(mUserManager, mUserId); int profileUserId = Utils.getManagedProfileId(mUserManager, mUserId);
if (mController.isScreenLockRestrictedByAdmin() if (mController.isScreenLockRestrictedByAdmin()
&& profileUserId != UserHandle.USER_NULL) { && profileUserId != UserHandle.USER_NULL) {
final StringBuilder description = new StringBuilder(getText( final StringBuilder description = new StringBuilder(
R.string.lock_settings_picker_admin_restricted_personal_message)); mDpm.getString(WORK_PROFILE_IT_ADMIN_CANT_RESET_SCREEN_LOCK, () ->
getString(
R.string.lock_settings_picker_admin_restricted_personal_message)));
final LinkifyUtils.OnClickListener clickListener = () -> { final LinkifyUtils.OnClickListener clickListener = () -> {
final Bundle extras = new Bundle(); final Bundle extras = new Bundle();
extras.putInt(Intent.EXTRA_USER_ID, profileUserId); extras.putInt(Intent.EXTRA_USER_ID, profileUserId);

View File

@@ -18,6 +18,13 @@ package com.android.settings.password;
import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE; import static android.app.admin.DevicePolicyManager.PASSWORD_COMPLEXITY_NONE;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC;
import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PASSWORD_RECENTLY_USED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.PIN_RECENTLY_USED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REENTER_WORK_PROFILE_PASSWORD_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.REENTER_WORK_PROFILE_PIN_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PASSWORD_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PIN_HEADER;
import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE; import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_NONE;
import static com.android.internal.widget.PasswordValidationError.CONTAINS_INVALID_CHARACTERS; import static com.android.internal.widget.PasswordValidationError.CONTAINS_INVALID_CHARACTERS;
@@ -259,11 +266,13 @@ public class ChooseLockPassword extends SettingsActivity {
Introduction( Introduction(
R.string.lockpassword_choose_your_password_header, // password R.string.lockpassword_choose_your_password_header, // password
SET_WORK_PROFILE_PASSWORD_HEADER,
R.string.lockpassword_choose_your_profile_password_header, R.string.lockpassword_choose_your_profile_password_header,
R.string.lockpassword_choose_your_password_header_for_fingerprint, R.string.lockpassword_choose_your_password_header_for_fingerprint,
R.string.lockpassword_choose_your_password_header_for_face, R.string.lockpassword_choose_your_password_header_for_face,
R.string.lockpassword_choose_your_password_header_for_biometrics, R.string.lockpassword_choose_your_password_header_for_biometrics,
R.string.lockpassword_choose_your_pin_header, // pin R.string.lockpassword_choose_your_pin_header, // pin
SET_WORK_PROFILE_PIN_HEADER,
R.string.lockpassword_choose_your_profile_pin_header, R.string.lockpassword_choose_your_profile_pin_header,
R.string.lockpassword_choose_your_pin_header_for_fingerprint, R.string.lockpassword_choose_your_pin_header_for_fingerprint,
R.string.lockpassword_choose_your_pin_header_for_face, R.string.lockpassword_choose_your_pin_header_for_face,
@@ -274,11 +283,13 @@ public class ChooseLockPassword extends SettingsActivity {
NeedToConfirm( NeedToConfirm(
R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_password_header,
REENTER_WORK_PROFILE_PASSWORD_HEADER,
R.string.lockpassword_reenter_your_profile_password_header, R.string.lockpassword_reenter_your_profile_password_header,
R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_password_header,
R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_password_header,
R.string.lockpassword_confirm_your_password_header, R.string.lockpassword_confirm_your_password_header,
R.string.lockpassword_confirm_your_pin_header, R.string.lockpassword_confirm_your_pin_header,
REENTER_WORK_PROFILE_PIN_HEADER,
R.string.lockpassword_reenter_your_profile_pin_header, R.string.lockpassword_reenter_your_profile_pin_header,
R.string.lockpassword_confirm_your_pin_header, R.string.lockpassword_confirm_your_pin_header,
R.string.lockpassword_confirm_your_pin_header, R.string.lockpassword_confirm_your_pin_header,
@@ -289,11 +300,13 @@ public class ChooseLockPassword extends SettingsActivity {
ConfirmWrong( ConfirmWrong(
R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match,
UNDEFINED,
R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match,
R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match,
R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match,
R.string.lockpassword_confirm_passwords_dont_match, R.string.lockpassword_confirm_passwords_dont_match,
R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match,
UNDEFINED,
R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match,
R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match,
R.string.lockpassword_confirm_pins_dont_match, R.string.lockpassword_confirm_pins_dont_match,
@@ -303,11 +316,13 @@ public class ChooseLockPassword extends SettingsActivity {
R.string.lockpassword_confirm_label); R.string.lockpassword_confirm_label);
Stage(int hintInAlpha, Stage(int hintInAlpha,
String hintOverrideInAlphaForProfile,
int hintInAlphaForProfile, int hintInAlphaForProfile,
int hintInAlphaForFingerprint, int hintInAlphaForFingerprint,
int hintInAlphaForFace, int hintInAlphaForFace,
int hintInAlphaForBiometrics, int hintInAlphaForBiometrics,
int hintInNumeric, int hintInNumeric,
String hintOverrideInNumericForProfile,
int hintInNumericForProfile, int hintInNumericForProfile,
int hintInNumericForFingerprint, int hintInNumericForFingerprint,
int hintInNumericForFace, int hintInNumericForFace,
@@ -317,12 +332,14 @@ public class ChooseLockPassword extends SettingsActivity {
int nextButtonText) { int nextButtonText) {
this.alphaHint = hintInAlpha; this.alphaHint = hintInAlpha;
this.alphaHintOverrideForProfile = hintOverrideInAlphaForProfile;
this.alphaHintForProfile = hintInAlphaForProfile; this.alphaHintForProfile = hintInAlphaForProfile;
this.alphaHintForFingerprint = hintInAlphaForFingerprint; this.alphaHintForFingerprint = hintInAlphaForFingerprint;
this.alphaHintForFace = hintInAlphaForFace; this.alphaHintForFace = hintInAlphaForFace;
this.alphaHintForBiometrics = hintInAlphaForBiometrics; this.alphaHintForBiometrics = hintInAlphaForBiometrics;
this.numericHint = hintInNumeric; this.numericHint = hintInNumeric;
this.numericHintOverrideForProfile = hintOverrideInNumericForProfile;
this.numericHintForProfile = hintInNumericForProfile; this.numericHintForProfile = hintInNumericForProfile;
this.numericHintForFingerprint = hintInNumericForFingerprint; this.numericHintForFingerprint = hintInNumericForFingerprint;
this.numericHintForFace = hintInNumericForFace; this.numericHintForFace = hintInNumericForFace;
@@ -341,6 +358,7 @@ public class ChooseLockPassword extends SettingsActivity {
// Password header // Password header
public final int alphaHint; public final int alphaHint;
public final String alphaHintOverrideForProfile;
public final int alphaHintForProfile; public final int alphaHintForProfile;
public final int alphaHintForFingerprint; public final int alphaHintForFingerprint;
public final int alphaHintForFace; public final int alphaHintForFace;
@@ -348,6 +366,7 @@ public class ChooseLockPassword extends SettingsActivity {
// PIN header // PIN header
public final int numericHint; public final int numericHint;
public final String numericHintOverrideForProfile;
public final int numericHintForProfile; public final int numericHintForProfile;
public final int numericHintForFingerprint; public final int numericHintForFingerprint;
public final int numericHintForFace; public final int numericHintForFace;
@@ -361,26 +380,34 @@ public class ChooseLockPassword extends SettingsActivity {
public final int buttonText; public final int buttonText;
public @StringRes int getHint(boolean isAlpha, int type, boolean isProfile) { public String getHint(Context context, boolean isAlpha, int type, boolean isProfile) {
if (isAlpha) { if (isAlpha) {
if (type == TYPE_FINGERPRINT) { if (type == TYPE_FINGERPRINT) {
return alphaHintForFingerprint; return context.getString(alphaHintForFingerprint);
} else if (type == TYPE_FACE) { } else if (type == TYPE_FACE) {
return alphaHintForFace; return context.getString(alphaHintForFace);
} else if (type == TYPE_BIOMETRIC) { } else if (type == TYPE_BIOMETRIC) {
return alphaHintForBiometrics; return context.getString(alphaHintForBiometrics);
} else if (isProfile) {
return context.getSystemService(DevicePolicyManager.class)
.getString(alphaHintOverrideForProfile,
() -> context.getString(alphaHintForProfile));
} else { } else {
return isProfile ? alphaHintForProfile : alphaHint; return context.getString(alphaHint);
} }
} else { } else {
if (type == TYPE_FINGERPRINT) { if (type == TYPE_FINGERPRINT) {
return numericHintForFingerprint; return context.getString(numericHintForFingerprint);
} else if (type == TYPE_FACE) { } else if (type == TYPE_FACE) {
return numericHintForFace; return context.getString(numericHintForFace);
} else if (type == TYPE_BIOMETRIC) { } else if (type == TYPE_BIOMETRIC) {
return numericHintForBiometrics; return context.getString(numericHintForBiometrics);
} else if (isProfile) {
return context.getSystemService(DevicePolicyManager.class)
.getString(numericHintOverrideForProfile,
() -> context.getString(numericHintForProfile));
} else { } else {
return isProfile ? numericHintForProfile : numericHint; return context.getString(numericHint);
} }
} }
} }
@@ -556,8 +583,8 @@ public class ChooseLockPassword extends SettingsActivity {
if (activity instanceof SettingsActivity) { if (activity instanceof SettingsActivity) {
final SettingsActivity sa = (SettingsActivity) activity; final SettingsActivity sa = (SettingsActivity) activity;
int title = Stage.Introduction.getHint(mIsAlphaMode, getStageType(), String title = Stage.Introduction.getHint(
mIsManagedProfile); getContext(), mIsAlphaMode, getStageType(), mIsManagedProfile);
sa.setTitle(title); sa.setTitle(title);
mLayout.setHeaderText(title); mLayout.setHeaderText(title);
} }
@@ -818,9 +845,17 @@ public class ChooseLockPassword extends SettingsActivity {
messages.add(getString(R.string.lockpassword_pin_no_sequential_digits)); messages.add(getString(R.string.lockpassword_pin_no_sequential_digits));
break; break;
case RECENTLY_USED: case RECENTLY_USED:
messages.add(getString(mIsAlphaMode DevicePolicyManager devicePolicyManager =
? R.string.lockpassword_password_recently_used getContext().getSystemService(DevicePolicyManager.class);
: R.string.lockpassword_pin_recently_used)); if (mIsAlphaMode) {
messages.add(devicePolicyManager.getString(
PASSWORD_RECENTLY_USED,
() -> getString(R.string.lockpassword_password_recently_used)));
} else {
messages.add(devicePolicyManager.getString(
PIN_RECENTLY_USED,
() -> getString(R.string.lockpassword_pin_recently_used)));
}
break; break;
default: default:
Log.wtf(TAG, "unknown error validating password: " + error); Log.wtf(TAG, "unknown error validating password: " + error);
@@ -851,8 +886,8 @@ public class ChooseLockPassword extends SettingsActivity {
} else { } else {
// Hide password requirement view when we are just asking user to confirm the pw. // Hide password requirement view when we are just asking user to confirm the pw.
mPasswordRestrictionView.setVisibility(View.GONE); mPasswordRestrictionView.setVisibility(View.GONE);
setHeaderText(getString(mUiStage.getHint(mIsAlphaMode, getStageType(), setHeaderText(mUiStage.getHint(getContext(), mIsAlphaMode, getStageType(),
mIsManagedProfile))); mIsManagedProfile));
setNextEnabled(canInput && length >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE); setNextEnabled(canInput && length >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE);
mSkipOrClearButton.setVisibility(toVisibility(canInput && length > 0)); mSkipOrClearButton.setVisibility(toVisibility(canInput && length > 0));
} }

View File

@@ -16,6 +16,7 @@
package com.android.settings.password; package com.android.settings.password;
import static android.app.admin.DevicePolicyResources.Strings.Settings.SET_WORK_PROFILE_PATTERN_HEADER;
import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE; import static android.view.View.ACCESSIBILITY_LIVE_REGION_POLITE;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_UNIFICATION_PROFILE_CREDENTIAL; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_UNIFICATION_PROFILE_CREDENTIAL;
@@ -23,6 +24,7 @@ import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_U
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -474,15 +476,18 @@ public class ChooseLockPattern extends SettingsActivity {
} }
private void updateActivityTitle() { private void updateActivityTitle() {
final int msg; final String msg;
if (mForFingerprint) { if (mForFingerprint) {
msg = R.string.lockpassword_choose_your_pattern_header_for_fingerprint; msg = getString(R.string.lockpassword_choose_your_pattern_header_for_fingerprint);
} else if (mForFace) { } else if (mForFace) {
msg = R.string.lockpassword_choose_your_pattern_header_for_face; msg = getString(R.string.lockpassword_choose_your_pattern_header_for_face);
} else if (mIsManagedProfile) {
msg = getContext().getSystemService(DevicePolicyManager.class)
.getString(SET_WORK_PROFILE_PATTERN_HEADER,
() -> getString(
R.string.lockpassword_choose_your_profile_pattern_header));
} else { } else {
msg = mIsManagedProfile msg = getString(R.string.lockpassword_choose_your_pattern_header);
? R.string.lockpassword_choose_your_profile_pattern_header
: R.string.lockpassword_choose_your_pattern_header;
} }
getActivity().setTitle(msg); getActivity().setTitle(msg);
} }

View File

@@ -17,6 +17,13 @@
package com.android.settings.password; package com.android.settings.password;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import android.app.Activity; import android.app.Activity;
@@ -259,19 +266,36 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
private String getTitleFromCredentialType(@LockPatternUtils.CredentialType int credentialType, private String getTitleFromCredentialType(@LockPatternUtils.CredentialType int credentialType,
boolean isEffectiveUserManagedProfile) { boolean isEffectiveUserManagedProfile) {
int overrideStringId;
int defaultStringId;
switch (credentialType) { switch (credentialType) {
case LockPatternUtils.CREDENTIAL_TYPE_PIN: case LockPatternUtils.CREDENTIAL_TYPE_PIN:
return isEffectiveUserManagedProfile
? getString(R.string.lockpassword_confirm_your_work_pin_header) if (isEffectiveUserManagedProfile) {
: getString(R.string.lockpassword_confirm_your_pin_header); return mDevicePolicyManager.getString(
CONFIRM_WORK_PROFILE_PIN_HEADER,
() -> getString(R.string.lockpassword_confirm_your_work_pin_header));
}
return getString(R.string.lockpassword_confirm_your_pin_header);
case LockPatternUtils.CREDENTIAL_TYPE_PATTERN: case LockPatternUtils.CREDENTIAL_TYPE_PATTERN:
return isEffectiveUserManagedProfile if (isEffectiveUserManagedProfile) {
? getString(R.string.lockpassword_confirm_your_work_pattern_header) return mDevicePolicyManager.getString(
: getString(R.string.lockpassword_confirm_your_pattern_header); CONFIRM_WORK_PROFILE_PATTERN_HEADER,
() -> getString(
R.string.lockpassword_confirm_your_work_pattern_header));
}
return getString(R.string.lockpassword_confirm_your_pattern_header);
case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD: case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD:
return isEffectiveUserManagedProfile if (isEffectiveUserManagedProfile) {
? getString(R.string.lockpassword_confirm_your_work_password_header) return mDevicePolicyManager.getString(
: getString(R.string.lockpassword_confirm_your_password_header); CONFIRM_WORK_PROFILE_PASSWORD_HEADER,
() -> getString(
R.string.lockpassword_confirm_your_work_password_header));
}
return getString(R.string.lockpassword_confirm_your_password_header);
} }
return null; return null;
} }
@@ -280,17 +304,29 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
boolean isEffectiveUserManagedProfile) { boolean isEffectiveUserManagedProfile) {
switch (credentialType) { switch (credentialType) {
case LockPatternUtils.CREDENTIAL_TYPE_PIN: case LockPatternUtils.CREDENTIAL_TYPE_PIN:
return isEffectiveUserManagedProfile if (isEffectiveUserManagedProfile) {
? getString(R.string.lockpassword_confirm_your_pin_generic_profile) return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PIN,
: getString(R.string.lockpassword_confirm_your_pin_generic); () -> getString(
R.string.lockpassword_confirm_your_pin_generic_profile));
}
return getString(R.string.lockpassword_confirm_your_pin_generic);
case LockPatternUtils.CREDENTIAL_TYPE_PATTERN: case LockPatternUtils.CREDENTIAL_TYPE_PATTERN:
return isEffectiveUserManagedProfile if (isEffectiveUserManagedProfile) {
? getString(R.string.lockpassword_confirm_your_pattern_generic_profile) return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN,
: getString(R.string.lockpassword_confirm_your_pattern_generic); () -> getString(
R.string.lockpassword_confirm_your_pattern_generic_profile));
}
return getString(R.string.lockpassword_confirm_your_pattern_generic);
case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD: case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD:
return isEffectiveUserManagedProfile if (isEffectiveUserManagedProfile) {
? getString(R.string.lockpassword_confirm_your_password_generic_profile) return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PASSWORD,
: getString(R.string.lockpassword_confirm_your_password_generic); () -> getString(
R.string.lockpassword_confirm_your_password_generic_profile));
}
return getString(R.string.lockpassword_confirm_your_password_generic);
} }
return null; return null;
} }

View File

@@ -17,6 +17,8 @@
// TODO (b/35202196): move this class out of the root of the package. // TODO (b/35202196): move this class out of the root of the package.
package com.android.settings.password; package com.android.settings.password;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_ATTEMPTS_FAILED;
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import android.annotation.Nullable; import android.annotation.Nullable;
@@ -243,13 +245,16 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
// Last try // Last try
final String title = getActivity().getString( final String title = getActivity().getString(
R.string.lock_last_attempt_before_wipe_warning_title); R.string.lock_last_attempt_before_wipe_warning_title);
final int messageId = getLastTryErrorMessage(userType); final String overrideMessageId = getLastTryOverrideErrorMessageId(userType);
LastTryDialog.show(fragmentManager, title, messageId, final int defaultMessageId = getLastTryDefaultErrorMessage(userType);
final String message = mDevicePolicyManager.getString(
overrideMessageId, () -> getString(defaultMessageId));
LastTryDialog.show(fragmentManager, title, message,
android.R.string.ok, false /* dismiss */); android.R.string.ok, false /* dismiss */);
} else { } else {
// Device, profile, or secondary user is wiped // Device, profile, or secondary user is wiped
final int messageId = getWipeMessage(userType); final String message = getWipeMessage(userType);
LastTryDialog.show(fragmentManager, null /* title */, messageId, LastTryDialog.show(fragmentManager, null /* title */, message,
R.string.lock_failed_attempts_now_wiping_dialog_dismiss, true /* dismiss */); R.string.lock_failed_attempts_now_wiping_dialog_dismiss, true /* dismiss */);
} }
} }
@@ -266,16 +271,18 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
} }
} }
protected abstract int getLastTryErrorMessage(int userType); protected abstract String getLastTryOverrideErrorMessageId(int userType);
protected abstract int getLastTryDefaultErrorMessage(int userType);
private int getWipeMessage(int userType) { private String getWipeMessage(int userType) {
switch (userType) { switch (userType) {
case USER_TYPE_PRIMARY: case USER_TYPE_PRIMARY:
return R.string.lock_failed_attempts_now_wiping_device; return getString(R.string.lock_failed_attempts_now_wiping_device);
case USER_TYPE_MANAGED_PROFILE: case USER_TYPE_MANAGED_PROFILE:
return R.string.lock_failed_attempts_now_wiping_profile; return mDevicePolicyManager.getString(WORK_PROFILE_LOCK_ATTEMPTS_FAILED,
() -> getString(R.string.lock_failed_attempts_now_wiping_profile));
case USER_TYPE_SECONDARY: case USER_TYPE_SECONDARY:
return R.string.lock_failed_attempts_now_wiping_user; return getString(R.string.lock_failed_attempts_now_wiping_user);
default: default:
throw new IllegalArgumentException("Unrecognized user type:" + userType); throw new IllegalArgumentException("Unrecognized user type:" + userType);
} }
@@ -311,7 +318,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
private static final String ARG_BUTTON = "button"; private static final String ARG_BUTTON = "button";
private static final String ARG_DISMISS = "dismiss"; private static final String ARG_DISMISS = "dismiss";
static boolean show(FragmentManager from, String title, int message, int button, static boolean show(FragmentManager from, String title, String message, int button,
boolean dismiss) { boolean dismiss) {
LastTryDialog existent = (LastTryDialog) from.findFragmentByTag(TAG); LastTryDialog existent = (LastTryDialog) from.findFragmentByTag(TAG);
if (existent != null && !existent.isRemoving()) { if (existent != null && !existent.isRemoving()) {
@@ -319,7 +326,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
} }
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(ARG_TITLE, title); args.putString(ARG_TITLE, title);
args.putInt(ARG_MESSAGE, message); args.putString(ARG_MESSAGE, message);
args.putInt(ARG_BUTTON, button); args.putInt(ARG_BUTTON, button);
args.putBoolean(ARG_DISMISS, dismiss); args.putBoolean(ARG_DISMISS, dismiss);
@@ -349,7 +356,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getActivity()) Dialog dialog = new AlertDialog.Builder(getActivity())
.setTitle(getArguments().getString(ARG_TITLE)) .setTitle(getArguments().getString(ARG_TITLE))
.setMessage(getArguments().getInt(ARG_MESSAGE)) .setMessage(getArguments().getString(ARG_MESSAGE))
.setPositiveButton(getArguments().getInt(ARG_BUTTON), null) .setPositiveButton(getArguments().getInt(ARG_BUTTON), null)
.create(); .create();
dialog.setCanceledOnTouchOutside(false); dialog.setCanceledOnTouchOutside(false);

View File

@@ -16,6 +16,16 @@
package com.android.settings.password; package com.android.settings.password;
import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PASSWORD_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PIN_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PASSWORD;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PIN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PASSWORD_ATTEMPT_BEFORE_WIPE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PIN_ATTEMPT_BEFORE_WIPE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PASSWORD_REQUIRED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PIN_REQUIRED;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
@@ -73,6 +83,17 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
R.string.lockpassword_strong_auth_required_work_password R.string.lockpassword_strong_auth_required_work_password
}; };
private static final String[] DETAIL_TEXT_OVERRIDES = new String[] {
UNDEFINED,
UNDEFINED,
WORK_PROFILE_CONFIRM_PIN,
WORK_PROFILE_CONFIRM_PASSWORD,
UNDEFINED,
UNDEFINED,
WORK_PROFILE_PIN_REQUIRED,
WORK_PROFILE_PASSWORD_REQUIRED
};
public static class InternalActivity extends ConfirmLockPassword { public static class InternalActivity extends ConfirmLockPassword {
} }
@@ -160,10 +181,10 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
headerMessage = mDevicePolicyManager.getOrganizationNameForUser(mUserId); headerMessage = mDevicePolicyManager.getOrganizationNameForUser(mUserId);
} }
if (TextUtils.isEmpty(headerMessage)) { if (TextUtils.isEmpty(headerMessage)) {
headerMessage = getString(getDefaultHeader()); headerMessage = getDefaultHeader();
} }
if (TextUtils.isEmpty(detailsMessage)) { if (TextUtils.isEmpty(detailsMessage)) {
detailsMessage = getString(getDefaultDetails()); detailsMessage = getDefaultDetails();
} }
mGlifLayout.setHeaderText(headerMessage); mGlifLayout.setHeaderText(headerMessage);
mGlifLayout.setDescriptionText(detailsMessage); mGlifLayout.setDescriptionText(detailsMessage);
@@ -228,29 +249,37 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
}, 5000); }, 5000);
} }
private int getDefaultHeader() { private String getDefaultHeader() {
if (mFrp) { if (mFrp) {
return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header_frp)
: R.string.lockpassword_confirm_your_pin_header_frp; : getString(R.string.lockpassword_confirm_your_pin_header_frp);
} }
if (mIsManagedProfile) { if (mIsManagedProfile) {
return mIsAlpha ? R.string.lockpassword_confirm_your_work_password_header if (mIsAlpha) {
: R.string.lockpassword_confirm_your_work_pin_header; return mDevicePolicyManager.getString(
CONFIRM_WORK_PROFILE_PASSWORD_HEADER,
() -> getString(
R.string.lockpassword_confirm_your_work_password_header));
} }
return mIsAlpha ? R.string.lockpassword_confirm_your_password_header return mDevicePolicyManager.getString(
: R.string.lockpassword_confirm_your_pin_header; CONFIRM_WORK_PROFILE_PIN_HEADER,
() -> getString(R.string.lockpassword_confirm_your_work_pin_header));
}
return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header)
: getString(R.string.lockpassword_confirm_your_pin_header);
} }
private int getDefaultDetails() { private String getDefaultDetails() {
if (mFrp) { if (mFrp) {
return mIsAlpha ? R.string.lockpassword_confirm_your_password_details_frp return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_details_frp)
: R.string.lockpassword_confirm_your_pin_details_frp; : getString(R.string.lockpassword_confirm_your_pin_details_frp);
} }
boolean isStrongAuthRequired = isStrongAuthRequired(); boolean isStrongAuthRequired = isStrongAuthRequired();
// Map boolean flags to an index by isStrongAuth << 2 + isManagedProfile << 1 + isAlpha. // Map boolean flags to an index by isStrongAuth << 2 + isManagedProfile << 1 + isAlpha.
int index = ((isStrongAuthRequired ? 1 : 0) << 2) + ((mIsManagedProfile ? 1 : 0) << 1) int index = ((isStrongAuthRequired ? 1 : 0) << 2) + ((mIsManagedProfile ? 1 : 0) << 1)
+ (mIsAlpha ? 1 : 0); + (mIsAlpha ? 1 : 0);
return DETAIL_TEXTS[index]; return mDevicePolicyManager.getString(
DETAIL_TEXT_OVERRIDES[index], () -> getString(DETAIL_TEXTS[index]));
} }
private int getErrorMessage() { private int getErrorMessage() {
@@ -259,7 +288,17 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
} }
@Override @Override
protected int getLastTryErrorMessage(int userType) { protected String getLastTryOverrideErrorMessageId(int userType) {
if (userType == USER_TYPE_MANAGED_PROFILE) {
return mIsAlpha ? WORK_PROFILE_LAST_PASSWORD_ATTEMPT_BEFORE_WIPE
: WORK_PROFILE_LAST_PIN_ATTEMPT_BEFORE_WIPE;
}
return UNDEFINED;
}
@Override
protected int getLastTryDefaultErrorMessage(int userType) {
switch (userType) { switch (userType) {
case USER_TYPE_PRIMARY: case USER_TYPE_PRIMARY:
return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_device return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_device

View File

@@ -16,6 +16,12 @@
package com.android.settings.password; package com.android.settings.password;
import static android.app.admin.DevicePolicyResources.Strings.UNDEFINED;
import static android.app.admin.DevicePolicyResources.Strings.Settings.CONFIRM_WORK_PROFILE_PATTERN_HEADER;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_PATTERN;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LAST_PATTERN_ATTEMPT_BEFORE_WIPE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PATTERN_REQUIRED;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
@@ -258,19 +264,25 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
mGlifLayout.getDescriptionTextView().setAlpha(0f); mGlifLayout.getDescriptionTextView().setAlpha(0f);
} }
private int getDefaultDetails() { private String getDefaultDetails() {
if (mFrp) { if (mFrp) {
return R.string.lockpassword_confirm_your_pattern_details_frp; return getString(R.string.lockpassword_confirm_your_pattern_details_frp);
} }
final boolean isStrongAuthRequired = isStrongAuthRequired(); final boolean isStrongAuthRequired = isStrongAuthRequired();
if (mIsManagedProfile) { if (mIsManagedProfile) {
return isStrongAuthRequired if (isStrongAuthRequired) {
? R.string.lockpassword_strong_auth_required_work_pattern return mDevicePolicyManager.getString(WORK_PROFILE_PATTERN_REQUIRED,
: R.string.lockpassword_confirm_your_pattern_generic_profile; () -> getString(
R.string.lockpassword_strong_auth_required_work_pattern));
} else {
return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN,
() -> getString(
R.string.lockpassword_confirm_your_pattern_generic_profile));
}
} else { } else {
return isStrongAuthRequired return isStrongAuthRequired
? R.string.lockpassword_strong_auth_required_device_pattern ? getString(R.string.lockpassword_strong_auth_required_device_pattern)
: R.string.lockpassword_confirm_your_pattern_generic; : getString(R.string.lockpassword_confirm_your_pattern_generic);
} }
} }
@@ -352,11 +364,16 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
mGlifLayout.getHeaderTextView().announceForAccessibility(mGlifLayout.getHeaderText()); mGlifLayout.getHeaderTextView().announceForAccessibility(mGlifLayout.getHeaderText());
} }
private int getDefaultHeader() { private String getDefaultHeader() {
if (mFrp) return R.string.lockpassword_confirm_your_pattern_header_frp; if (mFrp) return getString(R.string.lockpassword_confirm_your_pattern_header_frp);
return mIsManagedProfile
? R.string.lockpassword_confirm_your_work_pattern_header if (mIsManagedProfile) {
: R.string.lockpassword_confirm_your_pattern_header; return mDevicePolicyManager.getString(
CONFIRM_WORK_PROFILE_PATTERN_HEADER,
() -> getString(R.string.lockpassword_confirm_your_work_pattern_header));
}
return getString(R.string.lockpassword_confirm_your_pattern_header);
} }
private Runnable mClearPatternRunnable = new Runnable() { private Runnable mClearPatternRunnable = new Runnable() {
@@ -550,7 +567,16 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
} }
@Override @Override
protected int getLastTryErrorMessage(int userType) { protected String getLastTryOverrideErrorMessageId(int userType) {
if (userType == USER_TYPE_MANAGED_PROFILE) {
return WORK_PROFILE_LAST_PATTERN_ATTEMPT_BEFORE_WIPE;
}
return UNDEFINED;
}
@Override
protected int getLastTryDefaultErrorMessage(int userType) {
switch (userType) { switch (userType) {
case USER_TYPE_PRIMARY: case USER_TYPE_PRIMARY:
return R.string.lock_last_pattern_attempt_before_wipe_device; return R.string.lock_last_pattern_attempt_before_wipe_device;

View File

@@ -16,6 +16,8 @@
package com.android.settings.security; package com.android.settings.security;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE;
import static com.android.settings.security.SecuritySettings.UNIFY_LOCK_CONFIRM_PROFILE_REQUEST; import static com.android.settings.security.SecuritySettings.UNIFY_LOCK_CONFIRM_PROFILE_REQUEST;
import static com.android.settings.security.SecuritySettings.UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST; import static com.android.settings.security.SecuritySettings.UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST;
@@ -190,8 +192,8 @@ public class LockUnificationPreferenceController extends AbstractPreferenceContr
*/ */
public void startUnification() { public void startUnification() {
// Confirm profile lock // Confirm profile lock
final String title = mContext.getString( final String title = mDpm.getString(WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE,
R.string.unlock_set_unlock_launch_picker_title_profile); () -> mContext.getString(R.string.unlock_set_unlock_launch_picker_title_profile));
final ChooseLockSettingsHelper.Builder builder = final ChooseLockSettingsHelper.Builder builder =
new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost); new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost);
final boolean launched = builder.setRequestCode(UNIFY_LOCK_CONFIRM_PROFILE_REQUEST) final boolean launched = builder.setRequestCode(UNIFY_LOCK_CONFIRM_PROFILE_REQUEST)

View File

@@ -16,7 +16,11 @@
package com.android.settings.security; package com.android.settings.security;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_DETAIL;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_NONCOMPLIANT;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
@@ -53,10 +57,16 @@ public class UnificationConfirmationDialog extends InstrumentedDialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment()); final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment());
final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT); final boolean compliant = getArguments().getBoolean(EXTRA_COMPLIANT);
String overrideMessageId = compliant ? WORK_PROFILE_UNIFY_LOCKS_DETAIL
: WORK_PROFILE_UNIFY_LOCKS_NONCOMPLIANT;
int defaultMessageId = compliant ? R.string.lock_settings_profile_unification_dialog_body
: R.string.lock_settings_profile_unification_dialog_uncompliant_body;
return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(getActivity())
.setTitle(R.string.lock_settings_profile_unification_dialog_title) .setTitle(R.string.lock_settings_profile_unification_dialog_title)
.setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body .setMessage(getContext().getSystemService(DevicePolicyManager.class)
: R.string.lock_settings_profile_unification_dialog_uncompliant_body) .getString(overrideMessageId, () -> getString(defaultMessageId)))
.setPositiveButton( .setPositiveButton(
compliant ? R.string.lock_settings_profile_unification_dialog_confirm compliant ? R.string.lock_settings_profile_unification_dialog_confirm
: R.string : R.string

View File

@@ -16,6 +16,7 @@
package com.android.settings.security.screenlock; package com.android.settings.security.screenlock;
import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -123,7 +124,8 @@ public class LockAfterTimeoutPreferenceController extends AbstractPreferenceCont
private void updateLockAfterPreferenceSummary(TimeoutListPreference preference) { private void updateLockAfterPreferenceSummary(TimeoutListPreference preference) {
final CharSequence summary; final CharSequence summary;
if (preference.isDisabledByAdmin()) { if (preference.isDisabledByAdmin()) {
summary = mContext.getText(R.string.disabled_by_policy_title); summary = mDPM.getString(DISABLED_BY_IT_ADMIN_TITLE,
() -> mContext.getString(R.string.disabled_by_policy_title));
} else { } else {
// Update summary message with current value // Update summary message with current value
long currentTimeout = Settings.Secure.getLong(mContext.getContentResolver(), long currentTimeout = Settings.Secure.getLong(mContext.getContentResolver(),

View File

@@ -16,7 +16,11 @@
package com.android.settings.users; package com.android.settings.users;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_REMOVE_MESSAGE;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONFIRM_REMOVE_TITLE;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
@@ -52,17 +56,20 @@ public final class UserDialogs {
public static Dialog createRemoveDialog(Context context, int removingUserId, public static Dialog createRemoveDialog(Context context, int removingUserId,
DialogInterface.OnClickListener onConfirmListener) { DialogInterface.OnClickListener onConfirmListener) {
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class);
UserInfo userInfo = um.getUserInfo(removingUserId); UserInfo userInfo = um.getUserInfo(removingUserId);
AlertDialog.Builder builder = new AlertDialog.Builder(context) AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setPositiveButton(R.string.user_delete_button, onConfirmListener) .setPositiveButton(R.string.user_delete_button, onConfirmListener)
.setNegativeButton(android.R.string.cancel, null); .setNegativeButton(android.R.string.cancel, null);
if (userInfo.isManagedProfile()) { if (userInfo.isManagedProfile()) {
builder.setTitle(R.string.work_profile_confirm_remove_title); builder.setTitle(dpm.getString(WORK_PROFILE_CONFIRM_REMOVE_TITLE,
() -> context.getString(R.string.work_profile_confirm_remove_title)));
View view = createRemoveManagedUserDialogView(context, removingUserId); View view = createRemoveManagedUserDialogView(context, removingUserId);
if (view != null) { if (view != null) {
builder.setView(view); builder.setView(view);
} else { } else {
builder.setMessage(R.string.work_profile_confirm_remove_message); builder.setMessage(dpm.getString(WORK_PROFILE_CONFIRM_REMOVE_MESSAGE,
() -> context.getString(R.string.work_profile_confirm_remove_message)));
} }
} else if (UserHandle.myUserId() == removingUserId) { } else if (UserHandle.myUserId() == removingUserId) {
builder.setTitle(R.string.user_confirm_remove_self_title); builder.setTitle(R.string.user_confirm_remove_self_title);

View File

@@ -16,6 +16,8 @@
package com.android.settings.utils; package com.android.settings.utils;
import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Dialog; import android.app.Dialog;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
@@ -134,7 +136,9 @@ public abstract class ManagedServiceSettings extends EmptyTextSettings {
if (managedProfileId != UserHandle.USER_NULL if (managedProfileId != UserHandle.USER_NULL
&& !mDpm.isNotificationListenerServicePermitted( && !mDpm.isNotificationListenerServicePermitted(
service.packageName, managedProfileId)) { service.packageName, managedProfileId)) {
pref.setSummary(R.string.work_profile_notification_access_blocked_summary); pref.setSummary(mDpm.getString(WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED,
() -> getString(
R.string.work_profile_notification_access_blocked_summary)));
} }
pref.setOnPreferenceChangeListener((preference, newValue) -> { pref.setOnPreferenceChangeListener((preference, newValue) -> {
final boolean enable = (boolean) newValue; final boolean enable = (boolean) newValue;

View File

@@ -289,7 +289,8 @@ public class EntityHeaderController {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
AppInfoBase.startAppInfoFragment( AppInfoBase.startAppInfoFragment(
AppInfoDashboardFragment.class, R.string.application_info_label, AppInfoDashboardFragment.class,
mActivity.getString(R.string.application_info_label),
mPackageName, mUid, mFragment, 0 /* request */, mPackageName, mUid, mFragment, 0 /* request */,
mMetricsCategory); mMetricsCategory);
} }

View File

@@ -18,6 +18,8 @@ package com.android.settings.password;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
@@ -27,9 +29,13 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class ConfirmCredentialTest { public class ConfirmCredentialTest {
private Context mContext = RuntimeEnvironment.application;
@Test @Test
public void testLastTryDialogShownExactlyOnce() { public void testLastTryDialogShownExactlyOnce() {
FragmentManager fm = Robolectric.buildActivity(FragmentActivity.class). FragmentManager fm = Robolectric.buildActivity(FragmentActivity.class).
@@ -37,13 +43,16 @@ public class ConfirmCredentialTest {
// Launch only one instance at a time. // Launch only one instance at a time.
assertThat(LastTryDialog.show( assertThat(LastTryDialog.show(
fm, "title", android.R.string.yes, android.R.string.ok, false)).isTrue(); fm, "title", mContext.getString(android.R.string.yes),
android.R.string.ok, false)).isTrue();
assertThat(LastTryDialog.show( assertThat(LastTryDialog.show(
fm, "title", android.R.string.yes, android.R.string.ok, false)).isFalse(); fm, "title", mContext.getString(android.R.string.yes),
android.R.string.ok, false)).isFalse();
// After cancelling, the dialog should be re-shown when asked for. // After cancelling, the dialog should be re-shown when asked for.
LastTryDialog.hide(fm); LastTryDialog.hide(fm);
assertThat(LastTryDialog.show( assertThat(LastTryDialog.show(
fm, "title", android.R.string.yes, android.R.string.ok, false)).isTrue(); fm, "title", mContext.getString(android.R.string.yes),
android.R.string.ok, false)).isTrue();
} }
} }