From e0d439472f5ccb95775f7d1ce5f8f052cdd7ebd3 Mon Sep 17 00:00:00 2001 From: Jonathan Scott Date: Wed, 19 Jan 2022 15:19:08 +0000 Subject: [PATCH] Allow Device Management Role Holder to update Settings strings. Test: manual Bug: 188414370 Change-Id: I6e1a06619799a9e99382d791e72e2e4518f93cac --- src/com/android/settings/MainClear.java | 17 ++++- .../settings/RemoteBugreportActivity.java | 30 ++++++-- .../settings/TrustedCredentialsSettings.java | 11 ++- .../accounts/AccountPreferenceController.java | 50 ++++++++++--- .../accounts/AccountSyncSettings.java | 20 +++++- .../RemoveAccountPreferenceController.java | 7 +- .../WorkModePreferenceController.java | 18 ++++- .../settings/applications/AppInfoBase.java | 4 +- .../AppsPreferenceController.java | 3 +- .../applications/UsageAccessDetails.java | 4 +- .../ManageApplications.java | 4 +- .../DomainAppPreferenceController.java | 3 +- .../deviceadmin/DeviceAdminAdd.java | 63 +++++++++++----- .../InteractAcrossProfilesDetails.java | 41 +++++++---- .../InteractAcrossProfilesSettings.java | 7 +- .../PictureInPictureSettings.java | 3 +- .../BiometricEnrollIntroduction.java | 6 +- .../face/FaceEnrollIntroduction.java | 9 ++- ...FaceProfileStatusPreferenceController.java | 15 +++- .../biometrics/face/FaceSettings.java | 10 ++- .../FingerprintEnrollIntroduction.java | 12 +++- .../fingerprint/FingerprintSettings.java | 40 ++++++++--- .../BugReportHandlerPicker.java | 12 +++- .../ProfileSelectFragment.java | 19 +++-- .../profileselector/UserAdapter.java | 21 ++++-- .../deviceinfo/StorageWizardMoveProgress.java | 6 +- .../ScreenTimeoutPreferenceController.java | 5 +- .../display/ScreenTimeoutSettings.java | 9 ++- .../AdminActionPreferenceControllerBase.java | 11 ++- ...sOnVpnCurrentUserPreferenceController.java | 21 +++++- ...aCertsCurrentUserPreferenceController.java | 20 +++++- .../DeviceAdminStringProviderImpl.java | 16 ++++- .../EnterprisePrivacyFeatureProviderImpl.java | 11 ++- ...etDefaultAppsListPreferenceController.java | 14 +++- .../enterprise/ImePreferenceController.java | 13 +++- ...ManageDeviceAdminPreferenceController.java | 17 ++++- .../PrivacyPreferenceControllerHelper.java | 14 +++- .../WorkModeConditionController.java | 11 ++- .../NotificationAccessSettings.java | 11 ++- .../SoundWorkSettingsController.java | 29 ++++++-- .../notification/zen/ZenAccessSettings.java | 5 +- .../settings/password/ChooseLockGeneric.java | 12 ++-- .../settings/password/ChooseLockPassword.java | 67 ++++++++++++----- .../settings/password/ChooseLockPattern.java | 17 +++-- .../ConfirmDeviceCredentialActivity.java | 72 ++++++++++++++----- .../ConfirmDeviceCredentialBaseFragment.java | 31 ++++---- .../password/ConfirmLockPassword.java | 67 +++++++++++++---- .../settings/password/ConfirmLockPattern.java | 52 ++++++++++---- .../LockUnificationPreferenceController.java | 6 +- .../UnificationConfirmationDialog.java | 14 +++- .../LockAfterTimeoutPreferenceController.java | 4 +- .../android/settings/users/UserDialogs.java | 11 ++- .../utils/ManagedServiceSettings.java | 6 +- .../widget/EntityHeaderController.java | 3 +- .../password/ConfirmCredentialTest.java | 15 +++- 55 files changed, 788 insertions(+), 231 deletions(-) diff --git a/src/com/android/settings/MainClear.java b/src/com/android/settings/MainClear.java index a7aa8eacf92..7eb4a5d0481 100644 --- a/src/com/android/settings/MainClear.java +++ b/src/com/android/settings/MainClear.java @@ -16,6 +16,9 @@ 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 android.accounts.Account; @@ -23,6 +26,7 @@ import android.accounts.AccountManager; import android.accounts.AuthenticatorDescription; import android.app.ActionBar; import android.app.Activity; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.ContentResolver; @@ -491,8 +495,17 @@ public class MainClear extends InstrumentedFragment implements OnGlobalLayoutLis if (profilesSize > 1) { View titleView = Utils.inflateCategoryHeader(inflater, contents); 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); } diff --git a/src/com/android/settings/RemoteBugreportActivity.java b/src/com/android/settings/RemoteBugreportActivity.java index 2c88ec329d4..12dce906b48 100644 --- a/src/com/android/settings/RemoteBugreportActivity.java +++ b/src/com/android/settings/RemoteBugreportActivity.java @@ -15,6 +15,11 @@ */ 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.app.Activity; import android.app.admin.DevicePolicyManager; @@ -42,12 +47,16 @@ public class RemoteBugreportActivity extends Activity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); + final int notificationType = getIntent().getIntExtra( DevicePolicyManager.EXTRA_BUGREPORT_NOTIFICATION_TYPE, -1); if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED) { 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() { @Override public void onDismiss(DialogInterface dialog) { @@ -65,12 +74,21 @@ public class RemoteBugreportActivity extends Activity { } else if (notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED || notificationType == DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) { + + int defaultMessageId = notificationType + == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED + ? R.string.share_remote_bugreport_dialog_message + : 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(R.string.share_remote_bugreport_dialog_title) - .setMessage(notificationType - == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED - ? R.string.share_remote_bugreport_dialog_message - : R.string.share_remote_bugreport_dialog_message_finished) + .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() { @Override public void onDismiss(DialogInterface dialog) { diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java index ae25ba939f6..fffb8eb0c82 100644 --- a/src/com/android/settings/TrustedCredentialsSettings.java +++ b/src/com/android/settings/TrustedCredentialsSettings.java @@ -16,6 +16,8 @@ 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.WRAP_CONTENT; @@ -82,6 +84,7 @@ public class TrustedCredentialsSettings extends InstrumentedFragment private static final String TAG = "TrustedCredentialsSettings"; + private DevicePolicyManager mDevicePolicyManager; private UserManager mUserManager; private KeyguardManager mKeyguardManager; private int mTrustAllCaUserId; @@ -179,6 +182,7 @@ public class TrustedCredentialsSettings extends InstrumentedFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Activity activity = getActivity(); + mDevicePolicyManager = activity.getSystemService(DevicePolicyManager.class); mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE); mKeyguardManager = (KeyguardManager) activity .getSystemService(Context.KEYGUARD_SERVICE); @@ -385,9 +389,12 @@ public class TrustedCredentialsSettings extends InstrumentedFragment final TextView title = (TextView) convertView.findViewById(android.R.id.title); if (getUserInfoByGroup(groupPosition).isManagedProfile()) { - title.setText(R.string.category_work); + title.setText(mDevicePolicyManager.getString(WORK_CATEGORY_HEADER, + () -> getString(R.string.category_work))); } 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); diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java index 42b2334f232..8f387d4ea51 100644 --- a/src/com/android/settings/accounts/AccountPreferenceController.java +++ b/src/com/android/settings/accounts/AccountPreferenceController.java @@ -16,6 +16,14 @@ 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.os.UserManager.DISALLOW_MODIFY_ACCOUNTS; 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.AccountManager; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; 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 UserManager mUm; + private DevicePolicyManager mDpm; private SparseArray mProfiles = new SparseArray(); private ManagedProfileBroadcastReceiver mManagedProfileBroadcastReceiver = new ManagedProfileBroadcastReceiver(); @@ -146,6 +156,7 @@ public class AccountPreferenceController extends AbstractPreferenceController @ProfileSelectFragment.ProfileType int type) { super(context); mUm = (UserManager) context.getSystemService(Context.USER_SERVICE); + mDpm = context.getSystemService(DevicePolicyManager.class); mAuthorities = authorities; mFragment = parent; if (mAuthorities != null) { @@ -188,13 +199,16 @@ public class AccountPreferenceController extends AbstractPreferenceController UserHandle.myUserId())) { final SearchIndexableRaw data = new SearchIndexableRaw(mContext); 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; rawData.add(data); } final SearchIndexableRaw data = new SearchIndexableRaw(mContext); 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; rawData.add(data); } @@ -253,7 +267,8 @@ public class AccountPreferenceController extends AbstractPreferenceController new SubSettingLauncher(mContext) .setSourceMetricsCategory(metricsCategory) .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) .launch(); @@ -331,11 +346,15 @@ public class AccountPreferenceController extends AbstractPreferenceController preferenceGroup.setContentDescription(title); } else if (userInfo.isManagedProfile()) { 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); preferenceGroup.setSummary(workGroupSummary); 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(); mHelper.enforceRestrictionOnPreference(profileData.removeWorkProfilePreference, @@ -343,9 +362,12 @@ public class AccountPreferenceController extends AbstractPreferenceController profileData.managedProfilePreference = newManagedProfileSettings(); } else { 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( - mContext.getString(R.string.accessibility_category_personal)); + mDpm.getString(ACCESSIBILITY_CATEGORY_PERSONAL, () -> + mContext.getString(R.string.accessibility_category_personal))); } } final PreferenceScreen screen = mFragment.getPreferenceScreen(); @@ -378,7 +400,9 @@ public class AccountPreferenceController extends AbstractPreferenceController RestrictedPreference preference = new RestrictedPreference( mFragment.getPreferenceManager().getContext()); 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.setOnPreferenceClickListener(this); preference.setOrder(ORDER_LAST); @@ -389,7 +413,8 @@ public class AccountPreferenceController extends AbstractPreferenceController private Preference newManagedProfileSettings() { Preference preference = new Preference(mFragment.getPreferenceManager().getContext()); 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.setOnPreferenceClickListener(this); preference.setOrder(ORDER_NEXT_TO_LAST); @@ -403,7 +428,8 @@ public class AccountPreferenceController extends AbstractPreferenceController return null; } 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() { @@ -482,7 +508,9 @@ public class AccountPreferenceController extends AbstractPreferenceController mProfileNotAvailablePreference.setIcon(R.drawable.empty_icon); mProfileNotAvailablePreference.setTitle(null); 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); } if (profileData.removeWorkProfilePreference != null) { diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java index 23b6157c97d..7c72d6c1edc 100644 --- a/src/com/android/settings/accounts/AccountSyncSettings.java +++ b/src/com/android/settings/accounts/AccountSyncSettings.java @@ -16,10 +16,14 @@ 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.AccountManager; import android.app.Activity; import android.app.Dialog; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; @@ -154,10 +158,20 @@ public class AccountSyncSettings extends AccountPreferenceBase { UserInfo user = um.getUserInfo(mUserHandle.getIdentifier()); boolean isWorkProfile = user != null ? user.isManagedProfile() : false; CharSequence currentTitle = getActivity().getTitle(); + + DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); + String accessibilityTitle = - getString(isWorkProfile - ? R.string.accessibility_work_account_title - : R.string.accessibility_personal_account_title, currentTitle); + isWorkProfile + ? devicePolicyManager.getString(ACCESSIBILITY_WORK_ACCOUNT_TITLE, + () -> 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)); } diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java index 2ce22061907..58ef7f122e8 100644 --- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java +++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java @@ -15,12 +15,15 @@ */ 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.AccountManager; import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.app.Activity; import android.app.Dialog; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; @@ -213,7 +216,9 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl return new AlertDialog.Builder(context) .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) .create(); } diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java index 11a620bf506..aa54d33aed2 100644 --- a/src/com/android/settings/accounts/WorkModePreferenceController.java +++ b/src/com/android/settings/accounts/WorkModePreferenceController.java @@ -13,6 +13,10 @@ */ 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.Context; import android.content.Intent; @@ -40,6 +44,7 @@ public class WorkModePreferenceController extends BasePreferenceController imple private UserManager mUserManager; private UserHandle mManagedUser; + private DevicePolicyManager mDevicePolicyManager; private Preference mPreference; private IntentFilter mIntentFilter; @@ -47,6 +52,7 @@ public class WorkModePreferenceController extends BasePreferenceController imple public WorkModePreferenceController(Context context, String key) { super(context, key); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); mIntentFilter = new IntentFilter(); mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE); mIntentFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE); @@ -80,9 +86,15 @@ public class WorkModePreferenceController extends BasePreferenceController imple @Override public CharSequence getSummary() { - return mContext.getText(isChecked() - ? R.string.work_mode_on_summary - : R.string.work_mode_off_summary); + if (isChecked()) { + return mDevicePolicyManager + .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() { diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 71043400ff8..0f21097f539 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -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) { final Bundle args = new Bundle(); args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg); @@ -228,7 +228,7 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment new SubSettingLauncher(source.getContext()) .setDestination(fragment.getName()) .setSourceMetricsCategory(sourceMetricsCategory) - .setTitleRes(titleRes) + .setTitleText(title) .setArguments(args) .setUserHandle(new UserHandle(UserHandle.getUserId(uid))) .setResultListener(source, request) diff --git a/src/com/android/settings/applications/AppsPreferenceController.java b/src/com/android/settings/applications/AppsPreferenceController.java index 9fbd5c13e8d..fad513e324f 100644 --- a/src/com/android/settings/applications/AppsPreferenceController.java +++ b/src/com/android/settings/applications/AppsPreferenceController.java @@ -211,7 +211,8 @@ public class AppsPreferenceController extends BasePreferenceController implement pref.setOrder(showAppsCount++); pref.setOnPreferenceClickListener(preference -> { 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()); return true; }); diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java index 4681fd8238a..ef259d2f00d 100644 --- a/src/com/android/settings/applications/UsageAccessDetails.java +++ b/src/com/android/settings/applications/UsageAccessDetails.java @@ -17,6 +17,7 @@ package com.android.settings.applications; import static android.app.AppOpsManager.OP_GET_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.app.AppOpsManager; @@ -96,7 +97,8 @@ public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenc new AlertDialog.Builder(getContext()) .setIcon(com.android.internal.R.drawable.ic_dialog_alert_material) .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) .show(); } diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 01bc2f19bb9..93b7c100424 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -645,8 +645,8 @@ public class ManageApplications extends InstrumentedFragment } private void startAppInfoFragment(Class fragment, int titleRes) { - AppInfoBase.startAppInfoFragment(fragment, titleRes, mCurrentPkgName, mCurrentUid, this, - INSTALLED_APP_DETAILS, getMetricsCategory()); + AppInfoBase.startAppInfoFragment(fragment, getString(titleRes), mCurrentPkgName, + mCurrentUid, this, INSTALLED_APP_DETAILS, getMetricsCategory()); } @Override diff --git a/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java b/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java index 07c4858ea54..eae1d06bbbc 100644 --- a/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java +++ b/src/com/android/settings/applications/managedomainurls/DomainAppPreferenceController.java @@ -70,7 +70,8 @@ public class DomainAppPreferenceController extends BasePreferenceController impl public boolean handlePreferenceTreeClick(Preference preference) { if (preference instanceof DomainAppPreference) { 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, INSTALLED_APP_DETAILS, mMetricsCategory); return true; diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index 7b2f4ba15af..e133c62e14e 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -17,6 +17,18 @@ package com.android.settings.applications.specialaccess.deviceadmin; 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.ActivityManager; @@ -318,7 +330,8 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity { // Build and show the simplified dialog 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) .setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() { 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.setText(mAddMsgText); mAdminWarning = dialog.findViewById(R.id.admin_warning_simplified); - mAdminWarning.setText(getString(R.string.device_admin_warning_simplified, - mProfileOwnerName)); + mAdminWarning.setText( + mDPM.getString(NEW_DEVICE_ADMIN_WARNING_SIMPLIFIED, () -> + getString(R.string.device_admin_warning_simplified, + mProfileOwnerName), mProfileOwnerName)); return; } setContentView(R.layout.device_admin_add); @@ -655,8 +670,10 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity { final boolean isManagedProfile = isManagedProfile(mDeviceAdmin); if (isProfileOwner && isManagedProfile) { // Profile owner in a managed profile, user can remove profile to disable admin. - mAdminWarning.setText(R.string.admin_profile_owner_message); - mActionButton.setText(R.string.remove_managed_profile_label); + mAdminWarning.setText(mDPM.getString(WORK_PROFILE_ADMIN_POLICIES_WARNING, + () -> 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 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. if (isProfileOwner) { // 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 { // Show device owner description. if (isFinancedDevice()) { mAdminWarning.setText(R.string.admin_financed_message); } 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); } else { addDeviceAdminPolicies(false /* showDescription */); - mAdminWarning.setText(getString(R.string.device_admin_status, - mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel( - getPackageManager()))); + CharSequence label = mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel( + getPackageManager()); + mAdminWarning.setText(mDPM.getString(ACTIVE_DEVICE_ADMIN_WARNING, + () -> getString(R.string.device_admin_status, label), label)); setTitle(R.string.active_device_admin_msg); 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 { - mActionButton.setText(R.string.remove_device_admin); + mActionButton.setText(mDPM.getString(REMOVE_DEVICE_ADMIN, + () -> getString(R.string.remove_device_admin))); } } CharSequence supportMessage = mDPM.getLongSupportMessageForUser( @@ -703,10 +726,16 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity { } } else { addDeviceAdminPolicies(true /* showDescription */); - mAdminWarning.setText(getString(R.string.device_admin_warning, - mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager()))); - setTitle(getText(R.string.add_device_admin_msg)); - mActionButton.setText(getText(R.string.add_device_admin)); + CharSequence label = mDeviceAdmin.getActivityInfo() + .applicationInfo.loadLabel(getPackageManager()); + mAdminWarning.setText( + 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()) { mUninstallButton.setVisibility(View.VISIBLE); } diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java index 61af4f600ab..4e96aa3086d 100644 --- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java +++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java @@ -15,6 +15,11 @@ */ 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_UNAWARE; import static android.provider.Settings.ACTION_MANAGE_CROSS_PROFILE_ACCESS; @@ -258,16 +263,22 @@ public class InteractAcrossProfilesDetails extends AppInfoBase final TextView dialogTitle = dialogView.findViewById( R.id.interact_across_profiles_consent_dialog_title); - dialogTitle.setText( - getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel)); + dialogTitle.setText(mDpm.getString(CONNECT_APPS_DIALOG_TITLE, () -> + getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel))); final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary); - appDataSummary.setText(getString( - R.string.interact_across_profiles_consent_dialog_app_data_summary, mAppLabel)); + appDataSummary.setText( + 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); - permissionsSummary.setText(getString( - R.string.interact_across_profiles_consent_dialog_permissions_summary, mAppLabel)); + permissionsSummary.setText(mDpm.getString(APP_CAN_ACCESS_PERSONAL_PERMISSIONS, + () -> getString( + R.string.interact_across_profiles_consent_dialog_permissions_summary, + mAppLabel), + mAppLabel)); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(dialogView) @@ -393,9 +404,12 @@ public class InteractAcrossProfilesDetails extends AppInfoBase return false; } if (!mInstalledInPersonal) { - mInstallBanner.setTitle(getString( - R.string.interact_across_profiles_install_personal_app_title, - mAppLabel)); + mInstallBanner.setTitle( + mDpm.getString(INSTALL_IN_PERSONAL_PROFILE_TO_CONNECT_PROMPT, + () -> getString( + R.string.interact_across_profiles_install_personal_app_title, + mAppLabel), + mAppLabel)); if (mInstallAppIntent != null) { mInstallBanner.setSummary( R.string.interact_across_profiles_install_app_summary); @@ -404,9 +418,12 @@ public class InteractAcrossProfilesDetails extends AppInfoBase return true; } if (!mInstalledInWork) { - mInstallBanner.setTitle(getString( - R.string.interact_across_profiles_install_work_app_title, - mAppLabel)); + mInstallBanner.setTitle( + mDpm.getString(INSTALL_IN_WORK_PROFILE_TO_CONNECT_PROMPT, + () -> getString( + R.string.interact_across_profiles_install_work_app_title, + mAppLabel), + mAppLabel)); if (mInstallAppIntent != null) { mInstallBanner.setSummary( R.string.interact_across_profiles_install_app_summary); diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java index ffab617d855..05ec3e96188 100644 --- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java +++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesSettings.java @@ -15,9 +15,11 @@ */ 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 android.annotation.Nullable; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -51,6 +53,7 @@ public class InteractAcrossProfilesSettings extends EmptyTextSettings { private Context mContext; private PackageManager mPackageManager; private UserManager mUserManager; + private DevicePolicyManager mDevicePolicyManager; private CrossProfileApps mCrossProfileApps; private IconDrawableFactory mIconDrawableFactory; @@ -63,6 +66,7 @@ public class InteractAcrossProfilesSettings extends EmptyTextSettings { mUserManager = mContext.getSystemService(UserManager.class); mIconDrawableFactory = IconDrawableFactory.newInstance(mContext); mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class); + mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); } @Override @@ -91,7 +95,8 @@ public class InteractAcrossProfilesSettings extends EmptyTextSettings { @Override public boolean onPreferenceClick(Preference preference) { 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, appInfo.uid, InteractAcrossProfilesSettings.this/* source */, diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java index 57b7412fb22..d794de69475 100644 --- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java +++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureSettings.java @@ -168,7 +168,8 @@ public class PictureInPictureSettings extends EmptyTextSettings { @Override public boolean onPreferenceClick(Preference preference) { 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()); return true; } diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 7f3bc87aaec..5085172022f 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -88,9 +88,9 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase 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 @@ -414,7 +414,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase super.initViews(); if (mBiometricUnlockDisabledByAdmin && !mParentalConsentRequired) { - setDescriptionText(getDescriptionResDisabledByAdmin()); + setDescriptionText(getDescriptionDisabledByAdmin()); } } diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index eadb5b8c4f1..b622c1ce7fa 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -16,6 +16,8 @@ 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.settings.SettingsEnums; import android.content.Intent; @@ -221,8 +223,11 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { } @Override - protected int getDescriptionResDisabledByAdmin() { - return R.string.security_settings_face_enroll_introduction_message_unlock_disabled; + protected String getDescriptionDisabledByAdmin() { + DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); + return devicePolicyManager.getString( + FACE_UNLOCK_DISABLED, + () -> getString(R.string.security_settings_face_enroll_introduction_message_unlock_disabled)); } @Override diff --git a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java index 49f128ccd4c..abfd3a2c977 100644 --- a/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceProfileStatusPreferenceController.java @@ -16,6 +16,9 @@ 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.os.UserHandle; @@ -27,21 +30,26 @@ import com.android.settings.R; public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceController { private static final String KEY_FACE_SETTINGS = "face_settings_profile"; + private final DevicePolicyManager mDevicePolicyManager; public FaceProfileStatusPreferenceController(Context context) { super(context, KEY_FACE_SETTINGS); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); } public FaceProfileStatusPreferenceController(Context context, String key) { super(context, key); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); } public FaceProfileStatusPreferenceController(Context context, Lifecycle lifecycle) { super(context, KEY_FACE_SETTINGS, lifecycle); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); } public FaceProfileStatusPreferenceController(Context context, String key, Lifecycle lifecycle) { super(context, key, lifecycle); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); } @Override @@ -70,7 +78,10 @@ public class FaceProfileStatusPreferenceController extends FaceStatusPreferenceC @Override public void updateState(Preference 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))); } } diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index 62347ac8ced..f3a7f2c2421 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -17,12 +17,14 @@ package com.android.settings.biometrics.face; 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.ENROLL_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -66,6 +68,7 @@ public class FaceSettings extends DashboardFragment { private UserManager mUserManager; private FaceManager mFaceManager; + private DevicePolicyManager mDevicePolicyManager; private int mUserId; private int mSensorId; private long mChallenge; @@ -148,6 +151,7 @@ public class FaceSettings extends DashboardFragment { mUserManager = context.getSystemService(UserManager.class); mFaceManager = context.getSystemService(FaceManager.class); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); mToken = getIntent().getByteArrayExtra(KEY_TOKEN); mSensorId = getIntent().getIntExtra(BiometricEnrollBase.EXTRA_KEY_SENSOR_ID, -1); mChallenge = getIntent().getLongExtra(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, 0L); @@ -157,8 +161,10 @@ public class FaceSettings extends DashboardFragment { mFaceFeatureProvider = FeatureFactory.getFactory(getContext()).getFaceFeatureProvider(); if (mUserManager.getUserInfo(mUserId).isManagedProfile()) { - getActivity().setTitle(getActivity().getResources().getString( - R.string.security_settings_face_profile_preference_title)); + getActivity().setTitle( + mDevicePolicyManager.getString(FACE_SETTINGS_FOR_WORK_TITLE, () -> + getActivity().getResources().getString( + R.string.security_settings_face_profile_preference_title))); } mLockscreenController = Utils.isMultipleBiometricsSupported(context) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index f70a663c1f8..2ef5446dd31 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -16,6 +16,8 @@ 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.settings.SettingsEnums; import android.content.ActivityNotFoundException; @@ -57,6 +59,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { @Nullable private FooterButton mPrimaryFooterButton; @Nullable private FooterButton mSecondaryFooterButton; + private DevicePolicyManager mDevicePolicyManager; + @Override protected void onCreate(Bundle savedInstanceState) { mFingerprintManager = Utils.getFingerprintManagerOrNull(this); @@ -68,6 +72,8 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { super.onCreate(savedInstanceState); + mDevicePolicyManager = getSystemService(DevicePolicyManager.class); + final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint); final ImageView iconDeviceLocked = findViewById(R.id.icon_device_locked); final ImageView iconTrashCan = findViewById(R.id.icon_trash_can); @@ -177,8 +183,10 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { } @Override - protected int getDescriptionResDisabledByAdmin() { - return R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled; + protected String getDescriptionDisabledByAdmin() { + return mDevicePolicyManager.getString( + FINGERPRINT_UNLOCK_DISABLED, + () -> getString(R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled)); } @Override diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 87a29b22094..50e17809bd9 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -17,6 +17,10 @@ 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 android.app.Activity; @@ -356,11 +360,22 @@ public class FingerprintSettings extends SubSettings { activity, getString(getHelpResource()), activity.getClass().getName()); final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo( activity, ANNOTATION_URL, helpIntent); - mFooterTitle = AnnotationSpan.linkify(getText(admin != null - ? R.string - .security_settings_fingerprint_enroll_disclaimer_lockscreen_disabled - : R.string.security_settings_fingerprint_v2_home_screen), - linkInfo, adminLinkInfo); + + if (admin != null) { + DevicePolicyManager devicePolicyManager = + 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); + } + + } private boolean isUdfps() { @@ -917,11 +932,20 @@ public class FingerprintSettings extends SubSettings { mFp = getArguments().getParcelable("fingerprint"); final boolean 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()) .setTitle(R.string.fingerprint_last_delete_title) - .setMessage((isProfileChallengeUser) - ? R.string.fingerprint_last_delete_message_profile_challenge - : R.string.fingerprint_last_delete_message) + .setMessage(devicePolicyManager.getString( + messageId, () -> getContext().getString(defaultMessageId))) .setPositiveButton(R.string.fingerprint_last_delete_confirm, new DialogInterface.OnClickListener() { @Override diff --git a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java index 9e1941aec8d..25b15c79f33 100644 --- a/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java +++ b/src/com/android/settings/bugreporthandler/BugReportHandlerPicker.java @@ -16,9 +16,12 @@ 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 android.app.Activity; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -189,10 +192,15 @@ public class BugReportHandlerPicker extends DefaultAppPickerFragment { return ""; } final UserInfo userInfo = mUserManager.getUserInfo(handlerUser); + DevicePolicyManager devicePolicyManager = + context.getSystemService(DevicePolicyManager.class); + 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 { diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java index 3b64d3d0c77..f7a309effc1 100644 --- a/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java +++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectFragment.java @@ -16,10 +16,13 @@ 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 android.annotation.IntDef; import android.app.Activity; +import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.res.ColorStateList; 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} */ public static final int WORK_TAB = 1; - private static final int[] LABEL = { - R.string.category_personal, R.string.category_work - }; private ViewGroup mContentView; @@ -233,14 +233,23 @@ public abstract class ProfileSelectFragment extends DashboardFragment { @Override 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) { if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL) { - return LABEL.length - 1 - index; + return 1 - index; } return index; } diff --git a/src/com/android/settings/dashboard/profileselector/UserAdapter.java b/src/com/android/settings/dashboard/profileselector/UserAdapter.java index 0b3a7fc1544..7057961f2ad 100644 --- a/src/com/android/settings/dashboard/profileselector/UserAdapter.java +++ b/src/com/android/settings/dashboard/profileselector/UserAdapter.java @@ -16,7 +16,12 @@ 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.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.UserInfo; import android.database.DataSetObserver; @@ -54,7 +59,9 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter { UserInfo userInfo = um.getUserInfo(mUserHandle.getIdentifier()); Drawable icon; 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( userHandle, /* density= */ 0); } else { @@ -77,14 +84,18 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter { } private ArrayList data; + private final Context mContext; private final LayoutInflater mInflater; + private final DevicePolicyManager mDevicePolicyManager; public UserAdapter(Context context, ArrayList users) { if (users == null) { throw new IllegalArgumentException("A list of user details must be provided"); } + mContext = context; this.data = users; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); } public UserHandle getUserHandle(int position) { @@ -104,13 +115,15 @@ public class UserAdapter implements SpinnerAdapter, ListAdapter { return row; } - private int getTitle(UserDetails user) { + private String getTitle(UserDetails user) { int userHandle = user.mUserHandle.getIdentifier(); if (userHandle == UserHandle.USER_CURRENT || userHandle == ActivityManager.getCurrentUser()) { - return R.string.category_personal; + return mDevicePolicyManager.getString(PERSONAL_CATEGORY_HEADER, + () -> mContext.getString(R.string.category_personal)); } else { - return R.string.category_work; + return mDevicePolicyManager.getString(WORK_CATEGORY_HEADER, + () -> mContext.getString(R.string.category_work)); } } diff --git a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java index 8dc1e2f5670..454de9d0376 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java +++ b/src/com/android/settings/deviceinfo/StorageWizardMoveProgress.java @@ -16,9 +16,11 @@ 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.pm.PackageManager.EXTRA_MOVE_ID; +import android.app.admin.DevicePolicyManager; import android.content.pm.PackageManager; import android.content.pm.PackageManager.MoveCallback; import android.os.Bundle; @@ -87,7 +89,9 @@ public class StorageWizardMoveProgress extends StorageWizardBase { case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE: return getString(R.string.insufficient_storage); 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: return getString(R.string.does_not_exist); case PackageManager.MOVE_FAILED_INVALID_LOCATION: diff --git a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java index 2a3359a04b3..65f0853fba3 100644 --- a/src/com/android/settings/display/ScreenTimeoutPreferenceController.java +++ b/src/com/android/settings/display/ScreenTimeoutPreferenceController.java @@ -16,6 +16,7 @@ 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 com.android.settings.display.ScreenTimeoutSettings.FALLBACK_SCREEN_TIMEOUT_VALUE; @@ -60,7 +61,9 @@ public class ScreenTimeoutPreferenceController extends BasePreferenceController final RestrictedLockUtils.EnforcedAdmin admin = getPreferenceDisablingAdmin(maxTimeout); if (admin != null) { 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); } else { preference.setSummary(getTimeoutSummary(maxTimeout)); diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java index f8c03d5245f..43ec864b755 100644 --- a/src/com/android/settings/display/ScreenTimeoutSettings.java +++ b/src/com/android/settings/display/ScreenTimeoutSettings.java @@ -16,6 +16,7 @@ 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.provider.Settings.System.SCREEN_OFF_TIMEOUT; @@ -85,6 +86,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements } }; + private DevicePolicyManager mDevicePolicyManager; + @VisibleForTesting Context mContext; @@ -116,6 +119,7 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements public void onAttach(Context context) { super.onAttach(context); mContext = context; + mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); mInitialEntries = getResources().getStringArray(R.array.screen_timeout_entries); mInitialValues = getResources().getStringArray(R.array.screen_timeout_values); mAdaptiveSleepController = new AdaptiveSleepPreferenceController(context); @@ -219,8 +223,9 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment implements @VisibleForTesting void setupDisabledFooterPreference() { - final String textDisabledByAdmin = getResources().getString( - R.string.admin_disabled_other_options); + final String textDisabledByAdmin = mDevicePolicyManager.getString( + OTHER_OPTIONS_DISABLED_BY_ADMIN, () -> getResources().getString( + R.string.admin_disabled_other_options)); final String textMoreDetails = getResources().getString(R.string.admin_more_details); final SpannableString spannableString = new SpannableString( diff --git a/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java b/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java index 1c7ff620c3c..d5c10b4ae46 100644 --- a/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java +++ b/src/com/android/settings/enterprise/AdminActionPreferenceControllerBase.java @@ -14,6 +14,9 @@ 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.text.format.DateUtils; @@ -43,11 +46,17 @@ public abstract class AdminActionPreferenceControllerBase extends public void updateState(Preference preference) { final Date timestamp = getAdminActionTimestamp(); preference.setSummary(timestamp == null ? - mContext.getString(R.string.enterprise_privacy_none) : + getEnterprisePrivacyNone() : DateUtils.formatDateTime(mContext, timestamp.getTime(), 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 public boolean isAvailable() { return true; diff --git a/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java b/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java index 696561bad8c..e883ac343cd 100644 --- a/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java +++ b/src/com/android/settings/enterprise/AlwaysOnVpnCurrentUserPreferenceController.java @@ -13,6 +13,10 @@ */ 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 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 final EnterprisePrivacyFeatureProvider mFeatureProvider; + private final DevicePolicyManager mDevicePolicyManager; public AlwaysOnVpnCurrentUserPreferenceController(Context context) { super(context); mFeatureProvider = FeatureFactory.getFactory(context) .getEnterprisePrivacyFeatureProvider(context); + mDevicePolicyManager = context.getSystemService(DevicePolicyManager.class); } @Override public void updateState(Preference preference) { - preference.setTitle(mFeatureProvider.isInCompMode() - ? R.string.enterprise_privacy_always_on_vpn_personal - : R.string.enterprise_privacy_always_on_vpn_device); + if (mFeatureProvider.isInCompMode()) { + preference.setTitle( + 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 diff --git a/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java b/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java index 45170b3842f..76aa6bc2678 100644 --- a/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java +++ b/src/com/android/settings/enterprise/CaCertsCurrentUserPreferenceController.java @@ -14,6 +14,10 @@ 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 androidx.annotation.VisibleForTesting; @@ -26,8 +30,11 @@ public class CaCertsCurrentUserPreferenceController extends CaCertsPreferenceCon @VisibleForTesting static final String CA_CERTS_CURRENT_USER = "ca_certs_current_user"; + DevicePolicyManager mDevicePolicyManager; + public CaCertsCurrentUserPreferenceController(Context context) { super(context); + mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); } @Override @@ -38,9 +45,16 @@ public class CaCertsCurrentUserPreferenceController extends CaCertsPreferenceCon @Override public void updateState(Preference preference) { super.updateState(preference); - preference.setTitle(mFeatureProvider.isInCompMode() - ? R.string.enterprise_privacy_ca_certs_personal - : R.string.enterprise_privacy_ca_certs_device); + + if (mFeatureProvider.isInCompMode()) { + 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 diff --git a/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java b/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java index 5d11d4ab3a6..696baca5173 100644 --- a/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java +++ b/src/com/android/settings/enterprise/DeviceAdminStringProviderImpl.java @@ -16,8 +16,13 @@ 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 android.app.admin.DevicePolicyManager; import android.content.Context; import com.android.settings.R; @@ -25,14 +30,17 @@ import com.android.settingslib.enterprise.DeviceAdminStringProvider; class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider { private final Context mContext; + private final DevicePolicyManager mDevicePolicyManager; DeviceAdminStringProviderImpl(Context context) { mContext = requireNonNull(context); + mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); } @Override 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 @@ -67,12 +75,14 @@ class DeviceAdminStringProviderImpl implements DeviceAdminStringProvider { @Override 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 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 diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java index 35ce1f11b03..76b2e24464a 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -16,6 +16,9 @@ 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.content.ComponentName; import android.content.Context; @@ -95,10 +98,12 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe final SpannableStringBuilder disclosure = new SpannableStringBuilder(); final CharSequence organizationName = mDpm.getDeviceOwnerOrganizationName(); if (organizationName != null) { - disclosure.append(mResources.getString(R.string.do_disclosure_with_name, - organizationName)); + disclosure.append(mDpm.getString(DEVICE_MANAGED_WITH_NAME, + () -> mResources.getString(R.string.do_disclosure_with_name, + organizationName), organizationName)); } 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; } diff --git a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java index c878058a649..34d098d13e5 100644 --- a/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java +++ b/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceController.java @@ -16,6 +16,10 @@ 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.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -123,14 +127,20 @@ public class EnterpriseSetDefaultAppsListPreferenceController extends if (!mEnterprisePrivacyFeatureProvider.isInCompMode() && mUsers.size() == 1) { createPreferences(prefContext, screen, mApps.get(0)); } else { + DevicePolicyManager devicePolicyManager = + mContext.getSystemService(DevicePolicyManager.class); for (int i = 0; i < mUsers.size(); i++) { final UserInfo userInfo = mUsers.get(i); final PreferenceCategory category = new PreferenceCategory(prefContext); screen.addPreference(category); if (userInfo.isManagedProfile()) { - category.setTitle(R.string.category_work); + category.setTitle(devicePolicyManager.getString( + WORK_CATEGORY_HEADER, + () -> mContext.getString(R.string.category_work))); } else { - category.setTitle(R.string.category_personal); + category.setTitle(devicePolicyManager.getString( + PERSONAL_CATEGORY_HEADER, + () -> mContext.getString(R.string.category_personal))); } category.setOrder(i); createPreferences(prefContext, category, mApps.get(i)); diff --git a/src/com/android/settings/enterprise/ImePreferenceController.java b/src/com/android/settings/enterprise/ImePreferenceController.java index 51a24a27620..25dcdaf9379 100644 --- a/src/com/android/settings/enterprise/ImePreferenceController.java +++ b/src/com/android/settings/enterprise/ImePreferenceController.java @@ -14,6 +14,9 @@ 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 androidx.preference.Preference; @@ -37,9 +40,13 @@ public class ImePreferenceController extends AbstractPreferenceController implem @Override public void updateState(Preference preference) { - preference.setSummary(mContext.getResources().getString( - R.string.enterprise_privacy_input_method_name, - mFeatureProvider.getImeLabelIfOwnerSet())); + preference.setSummary( + mContext.getSystemService(DevicePolicyManager.class) + .getString(ADMIN_ACTION_SET_INPUT_METHOD_NAME, () -> + mContext.getResources().getString( + R.string.enterprise_privacy_input_method_name, + mFeatureProvider.getImeLabelIfOwnerSet()), + mFeatureProvider.getImeLabelIfOwnerSet())); } @Override diff --git a/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java b/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java index 00d17f17832..934659dcaa3 100644 --- a/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java +++ b/src/com/android/settings/enterprise/ManageDeviceAdminPreferenceController.java @@ -13,6 +13,9 @@ */ 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 com.android.settings.R; @@ -23,20 +26,28 @@ import com.android.settings.overlay.FeatureFactory; public class ManageDeviceAdminPreferenceController extends BasePreferenceController { private final EnterprisePrivacyFeatureProvider mFeatureProvider; + private final DevicePolicyManager mDevicePolicyManager; public ManageDeviceAdminPreferenceController(Context context, String key) { super(context, key); mFeatureProvider = FeatureFactory.getFactory(context) .getEnterprisePrivacyFeatureProvider(context); + mDevicePolicyManager = + mContext.getSystemService(DevicePolicyManager.class); } @Override public CharSequence getSummary() { final int activeAdmins = mFeatureProvider.getNumberOfActiveDeviceAdminsForCurrentUserAndManagedProfile(); - return activeAdmins == 0 - ? mContext.getResources().getString(R.string.number_of_device_admins_none) - : mContext.getResources().getQuantityString(R.plurals.number_of_device_admins, + + if (activeAdmins == 0) { + 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); } diff --git a/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java b/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java index fa1874a0783..f6070bd9309 100644 --- a/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java +++ b/src/com/android/settings/enterprise/PrivacyPreferenceControllerHelper.java @@ -17,6 +17,8 @@ package com.android.settings.enterprise; 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.content.Context; @@ -50,10 +52,16 @@ class PrivacyPreferenceControllerHelper { final String organizationName = mFeatureProvider.getDeviceOwnerOrganizationName(); 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 { - preference.setSummary(mContext.getResources().getString( - R.string.enterprise_privacy_settings_summary_with_name, organizationName)); + preference.setSummary(mDevicePolicyManager + .getString(MANAGED_DEVICE_INFO_SUMMARY_WITH_NAME, + () -> mContext.getResources().getString( + R.string.enterprise_privacy_settings_summary_with_name, + organizationName), organizationName)); } } diff --git a/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java index 4e901fd191f..19274212355 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/WorkModeConditionController.java @@ -16,6 +16,9 @@ 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.content.BroadcastReceiver; import android.content.Context; @@ -46,6 +49,7 @@ public class WorkModeConditionController implements ConditionalCardController { private final Context mAppContext; private final UserManager mUm; + private final DevicePolicyManager mDpm; private final ConditionManager mConditionManager; private final Receiver mReceiver; @@ -54,6 +58,7 @@ public class WorkModeConditionController implements ConditionalCardController { public WorkModeConditionController(Context appContext, ConditionManager manager) { mAppContext = appContext; mUm = mAppContext.getSystemService(UserManager.class); + mDpm = mAppContext.getSystemService(DevicePolicyManager.class); mConditionManager = manager; mReceiver = new Receiver(); } @@ -84,13 +89,15 @@ public class WorkModeConditionController implements ConditionalCardController { @Override public ContextualCard buildContextualCard() { + String conditionWorkTitle = mDpm.getString(WORK_PROFILE_OFF_CONDITION_TITLE, + () -> mAppContext.getString(R.string.condition_work_title)); return new ConditionalContextualCard.Builder() .setConditionId(ID) .setMetricsConstant(SettingsEnums.SETTINGS_CONDITION_WORK_MODE) .setActionText(mAppContext.getText(R.string.condition_turn_on)) .setName(mAppContext.getPackageName() + "/" - + mAppContext.getText(R.string.condition_work_title)) - .setTitleText(mAppContext.getText(R.string.condition_work_title).toString()) + + conditionWorkTitle) + .setTitleText(conditionWorkTitle) .setSummaryText(mAppContext.getText(R.string.condition_work_summary).toString()) .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_signal_workmode_enable)) .setViewType(ConditionContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java index 10954a185e1..0daa8186272 100644 --- a/src/com/android/settings/notification/NotificationAccessSettings.java +++ b/src/com/android/settings/notification/NotificationAccessSettings.java @@ -16,6 +16,9 @@ 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.app.NotificationManager; import android.app.admin.DevicePolicyManager; @@ -103,7 +106,9 @@ public class NotificationAccessSettings extends EmptyTextSettings { if (UserManager.get(mContext).isManagedProfile()) { // 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(); finish(); } @@ -163,7 +168,9 @@ public class NotificationAccessSettings extends EmptyTextSettings { if (managedProfileId != UserHandle.USER_NULL && !mDpm.isNotificationListenerServicePermitted( 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 -> { final Bundle args = new Bundle(); diff --git a/src/com/android/settings/notification/SoundWorkSettingsController.java b/src/com/android/settings/notification/SoundWorkSettingsController.java index de374e9a5a8..bcaf4af98ac 100644 --- a/src/com/android/settings/notification/SoundWorkSettingsController.java +++ b/src/com/android/settings/notification/SoundWorkSettingsController.java @@ -16,8 +16,13 @@ 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.app.Dialog; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; @@ -252,11 +257,16 @@ public class SoundWorkSettingsController extends AbstractPreferenceController private void enableWorkSyncSettings() { 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) { - mWorkPhoneRingtonePreference.setSummary(R.string.work_sound_same_as_personal); + mWorkPhoneRingtonePreference.setSummary(summary); } - mWorkNotificationRingtonePreference.setSummary(R.string.work_sound_same_as_personal); - mWorkAlarmRingtonePreference.setSummary(R.string.work_sound_same_as_personal); + mWorkNotificationRingtonePreference.setSummary(summary); + mWorkAlarmRingtonePreference.setSummary(summary); } private void disableWorkSync() { @@ -339,9 +349,18 @@ public class SoundWorkSettingsController extends AbstractPreferenceController @Override public Dialog onCreateDialog(Bundle savedInstanceState) { + + Context context = getActivity().getApplicationContext(); + DevicePolicyManager devicePolicyManager = + context.getSystemService(DevicePolicyManager.class); + return new AlertDialog.Builder(getActivity()) - .setTitle(R.string.work_sync_dialog_title) - .setMessage(R.string.work_sync_dialog_message) + .setTitle(devicePolicyManager.getString( + 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, SoundWorkSettingsController.UnifyWorkDialogFragment.this) .setNegativeButton(android.R.string.no, /* listener= */ null) diff --git a/src/com/android/settings/notification/zen/ZenAccessSettings.java b/src/com/android/settings/notification/zen/ZenAccessSettings.java index 1a9fb161932..aac695435ab 100644 --- a/src/com/android/settings/notification/zen/ZenAccessSettings.java +++ b/src/com/android/settings/notification/zen/ZenAccessSettings.java @@ -17,7 +17,6 @@ package com.android.settings.notification.zen; import android.annotation.Nullable; -import android.app.ActivityManager; import android.app.NotificationManager; import android.app.settings.SettingsEnums; import android.content.Context; @@ -28,8 +27,8 @@ import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.util.ArraySet; -import android.view.View; import android.util.Log; +import android.view.View; import androidx.preference.PreferenceScreen; @@ -138,7 +137,7 @@ public class ZenAccessSettings extends EmptyTextSettings implements pref.setOnPreferenceClickListener(preference -> { AppInfoBase.startAppInfoFragment( ZenAccessDetails.class /* fragment */, - R.string.manage_zen_access_title /* titleRes */, + getString(R.string.manage_zen_access_title) /* titleRes */, pkg, app.uid, this /* source */, diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 2d6f6b0278d..f31abb997ab 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -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_MEDIUM; 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.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_REQUESTED_MIN_COMPLEXITY; -import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Activity; import android.app.Dialog; import android.app.admin.DevicePolicyManager; @@ -394,13 +395,16 @@ public class ChooseLockGeneric extends SettingsActivity { } } else { 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 { int profileUserId = Utils.getManagedProfileId(mUserManager, mUserId); if (mController.isScreenLockRestrictedByAdmin() && profileUserId != UserHandle.USER_NULL) { - final StringBuilder description = new StringBuilder(getText( - R.string.lock_settings_picker_admin_restricted_personal_message)); + final StringBuilder description = new StringBuilder( + 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 Bundle extras = new Bundle(); extras.putInt(Intent.EXTRA_USER_ID, profileUserId); diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index a2f9922531b..50a0baec9a1 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -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_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.PasswordValidationError.CONTAINS_INVALID_CHARACTERS; @@ -259,11 +266,13 @@ public class ChooseLockPassword extends SettingsActivity { Introduction( 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_password_header_for_fingerprint, R.string.lockpassword_choose_your_password_header_for_face, R.string.lockpassword_choose_your_password_header_for_biometrics, 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_pin_header_for_fingerprint, R.string.lockpassword_choose_your_pin_header_for_face, @@ -274,11 +283,13 @@ public class ChooseLockPassword extends SettingsActivity { NeedToConfirm( R.string.lockpassword_confirm_your_password_header, + REENTER_WORK_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_pin_header, + REENTER_WORK_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, @@ -289,11 +300,13 @@ public class ChooseLockPassword extends SettingsActivity { ConfirmWrong( 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_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, @@ -303,11 +316,13 @@ public class ChooseLockPassword extends SettingsActivity { R.string.lockpassword_confirm_label); Stage(int hintInAlpha, + String hintOverrideInAlphaForProfile, int hintInAlphaForProfile, int hintInAlphaForFingerprint, int hintInAlphaForFace, int hintInAlphaForBiometrics, int hintInNumeric, + String hintOverrideInNumericForProfile, int hintInNumericForProfile, int hintInNumericForFingerprint, int hintInNumericForFace, @@ -317,12 +332,14 @@ public class ChooseLockPassword extends SettingsActivity { int nextButtonText) { this.alphaHint = hintInAlpha; + this.alphaHintOverrideForProfile = hintOverrideInAlphaForProfile; this.alphaHintForProfile = hintInAlphaForProfile; this.alphaHintForFingerprint = hintInAlphaForFingerprint; this.alphaHintForFace = hintInAlphaForFace; this.alphaHintForBiometrics = hintInAlphaForBiometrics; this.numericHint = hintInNumeric; + this.numericHintOverrideForProfile = hintOverrideInNumericForProfile; this.numericHintForProfile = hintInNumericForProfile; this.numericHintForFingerprint = hintInNumericForFingerprint; this.numericHintForFace = hintInNumericForFace; @@ -341,6 +358,7 @@ public class ChooseLockPassword extends SettingsActivity { // Password header public final int alphaHint; + public final String alphaHintOverrideForProfile; public final int alphaHintForProfile; public final int alphaHintForFingerprint; public final int alphaHintForFace; @@ -348,6 +366,7 @@ public class ChooseLockPassword extends SettingsActivity { // PIN header public final int numericHint; + public final String numericHintOverrideForProfile; public final int numericHintForProfile; public final int numericHintForFingerprint; public final int numericHintForFace; @@ -361,26 +380,34 @@ public class ChooseLockPassword extends SettingsActivity { 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 (type == TYPE_FINGERPRINT) { - return alphaHintForFingerprint; + return context.getString(alphaHintForFingerprint); } else if (type == TYPE_FACE) { - return alphaHintForFace; + return context.getString(alphaHintForFace); } 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 { - return isProfile ? alphaHintForProfile : alphaHint; + return context.getString(alphaHint); } } else { if (type == TYPE_FINGERPRINT) { - return numericHintForFingerprint; + return context.getString(numericHintForFingerprint); } else if (type == TYPE_FACE) { - return numericHintForFace; + return context.getString(numericHintForFace); } 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 { - return isProfile ? numericHintForProfile : numericHint; + return context.getString(numericHint); } } } @@ -556,8 +583,8 @@ public class ChooseLockPassword extends SettingsActivity { if (activity instanceof SettingsActivity) { final SettingsActivity sa = (SettingsActivity) activity; - int title = Stage.Introduction.getHint(mIsAlphaMode, getStageType(), - mIsManagedProfile); + String title = Stage.Introduction.getHint( + getContext(), mIsAlphaMode, getStageType(), mIsManagedProfile); sa.setTitle(title); mLayout.setHeaderText(title); } @@ -818,9 +845,17 @@ public class ChooseLockPassword extends SettingsActivity { messages.add(getString(R.string.lockpassword_pin_no_sequential_digits)); break; case RECENTLY_USED: - messages.add(getString(mIsAlphaMode - ? R.string.lockpassword_password_recently_used - : R.string.lockpassword_pin_recently_used)); + DevicePolicyManager devicePolicyManager = + getContext().getSystemService(DevicePolicyManager.class); + 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; default: Log.wtf(TAG, "unknown error validating password: " + error); @@ -851,8 +886,8 @@ public class ChooseLockPassword extends SettingsActivity { } else { // Hide password requirement view when we are just asking user to confirm the pw. mPasswordRestrictionView.setVisibility(View.GONE); - setHeaderText(getString(mUiStage.getHint(mIsAlphaMode, getStageType(), - mIsManagedProfile))); + setHeaderText(mUiStage.getHint(getContext(), mIsAlphaMode, getStageType(), + mIsManagedProfile)); setNextEnabled(canInput && length >= LockPatternUtils.MIN_LOCK_PASSWORD_SIZE); mSkipOrClearButton.setVisibility(toVisibility(canInput && length > 0)); } diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index 60b8c6cd37d..64fe9efb769 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -16,6 +16,7 @@ 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 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.app.Activity; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -474,15 +476,18 @@ public class ChooseLockPattern extends SettingsActivity { } private void updateActivityTitle() { - final int msg; + final String msg; 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) { - 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 { - msg = mIsManagedProfile - ? R.string.lockpassword_choose_your_profile_pattern_header - : R.string.lockpassword_choose_your_pattern_header; + msg = getString(R.string.lockpassword_choose_your_pattern_header); } getActivity().setTitle(msg); } diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java index 22d87a51a0e..4b06fe055fe 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java @@ -17,6 +17,13 @@ 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 android.app.Activity; @@ -259,19 +266,36 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { private String getTitleFromCredentialType(@LockPatternUtils.CredentialType int credentialType, boolean isEffectiveUserManagedProfile) { + int overrideStringId; + int defaultStringId; switch (credentialType) { case LockPatternUtils.CREDENTIAL_TYPE_PIN: - return isEffectiveUserManagedProfile - ? getString(R.string.lockpassword_confirm_your_work_pin_header) - : getString(R.string.lockpassword_confirm_your_pin_header); + + if (isEffectiveUserManagedProfile) { + 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: - return isEffectiveUserManagedProfile - ? getString(R.string.lockpassword_confirm_your_work_pattern_header) - : getString(R.string.lockpassword_confirm_your_pattern_header); + if (isEffectiveUserManagedProfile) { + 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); case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD: - return isEffectiveUserManagedProfile - ? getString(R.string.lockpassword_confirm_your_work_password_header) - : getString(R.string.lockpassword_confirm_your_password_header); + if (isEffectiveUserManagedProfile) { + return mDevicePolicyManager.getString( + 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; } @@ -280,17 +304,29 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity { boolean isEffectiveUserManagedProfile) { switch (credentialType) { case LockPatternUtils.CREDENTIAL_TYPE_PIN: - return isEffectiveUserManagedProfile - ? getString(R.string.lockpassword_confirm_your_pin_generic_profile) - : getString(R.string.lockpassword_confirm_your_pin_generic); + if (isEffectiveUserManagedProfile) { + return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PIN, + () -> getString( + R.string.lockpassword_confirm_your_pin_generic_profile)); + } + + return getString(R.string.lockpassword_confirm_your_pin_generic); case LockPatternUtils.CREDENTIAL_TYPE_PATTERN: - return isEffectiveUserManagedProfile - ? getString(R.string.lockpassword_confirm_your_pattern_generic_profile) - : getString(R.string.lockpassword_confirm_your_pattern_generic); + if (isEffectiveUserManagedProfile) { + return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PATTERN, + () -> getString( + R.string.lockpassword_confirm_your_pattern_generic_profile)); + } + + return getString(R.string.lockpassword_confirm_your_pattern_generic); case LockPatternUtils.CREDENTIAL_TYPE_PASSWORD: - return isEffectiveUserManagedProfile - ? getString(R.string.lockpassword_confirm_your_password_generic_profile) - : getString(R.string.lockpassword_confirm_your_password_generic); + if (isEffectiveUserManagedProfile) { + return mDevicePolicyManager.getString(WORK_PROFILE_CONFIRM_PASSWORD, + () -> getString( + R.string.lockpassword_confirm_your_password_generic_profile)); + } + + return getString(R.string.lockpassword_confirm_your_password_generic); } return null; } diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java index 3440071bf40..9650a4d9d07 100644 --- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java +++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java @@ -17,6 +17,8 @@ // TODO (b/35202196): move this class out of the root of the package. 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 android.annotation.Nullable; @@ -243,13 +245,16 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr // Last try final String title = getActivity().getString( R.string.lock_last_attempt_before_wipe_warning_title); - final int messageId = getLastTryErrorMessage(userType); - LastTryDialog.show(fragmentManager, title, messageId, + final String overrideMessageId = getLastTryOverrideErrorMessageId(userType); + final int defaultMessageId = getLastTryDefaultErrorMessage(userType); + final String message = mDevicePolicyManager.getString( + overrideMessageId, () -> getString(defaultMessageId)); + LastTryDialog.show(fragmentManager, title, message, android.R.string.ok, false /* dismiss */); } else { // Device, profile, or secondary user is wiped - final int messageId = getWipeMessage(userType); - LastTryDialog.show(fragmentManager, null /* title */, messageId, + final String message = getWipeMessage(userType); + LastTryDialog.show(fragmentManager, null /* title */, message, 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) { 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: - 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: - return R.string.lock_failed_attempts_now_wiping_user; + return getString(R.string.lock_failed_attempts_now_wiping_user); default: 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_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) { LastTryDialog existent = (LastTryDialog) from.findFragmentByTag(TAG); if (existent != null && !existent.isRemoving()) { @@ -319,7 +326,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr } Bundle args = new Bundle(); args.putString(ARG_TITLE, title); - args.putInt(ARG_MESSAGE, message); + args.putString(ARG_MESSAGE, message); args.putInt(ARG_BUTTON, button); args.putBoolean(ARG_DISMISS, dismiss); @@ -349,7 +356,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog dialog = new AlertDialog.Builder(getActivity()) .setTitle(getArguments().getString(ARG_TITLE)) - .setMessage(getArguments().getInt(ARG_MESSAGE)) + .setMessage(getArguments().getString(ARG_MESSAGE)) .setPositiveButton(getArguments().getInt(ARG_BUTTON), null) .create(); dialog.setCanceledOnTouchOutside(false); diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java index de32f139594..df7e2dd38e3 100644 --- a/src/com/android/settings/password/ConfirmLockPassword.java +++ b/src/com/android/settings/password/ConfirmLockPassword.java @@ -16,6 +16,16 @@ 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.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; @@ -73,6 +83,17 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { 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 { } @@ -160,10 +181,10 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { headerMessage = mDevicePolicyManager.getOrganizationNameForUser(mUserId); } if (TextUtils.isEmpty(headerMessage)) { - headerMessage = getString(getDefaultHeader()); + headerMessage = getDefaultHeader(); } if (TextUtils.isEmpty(detailsMessage)) { - detailsMessage = getString(getDefaultDetails()); + detailsMessage = getDefaultDetails(); } mGlifLayout.setHeaderText(headerMessage); mGlifLayout.setDescriptionText(detailsMessage); @@ -228,29 +249,37 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { }, 5000); } - private int getDefaultHeader() { + private String getDefaultHeader() { if (mFrp) { - return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp - : R.string.lockpassword_confirm_your_pin_header_frp; + return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_header_frp) + : getString(R.string.lockpassword_confirm_your_pin_header_frp); } if (mIsManagedProfile) { - return mIsAlpha ? R.string.lockpassword_confirm_your_work_password_header - : R.string.lockpassword_confirm_your_work_pin_header; + if (mIsAlpha) { + return mDevicePolicyManager.getString( + CONFIRM_WORK_PROFILE_PASSWORD_HEADER, + () -> getString( + R.string.lockpassword_confirm_your_work_password_header)); + } + return mDevicePolicyManager.getString( + CONFIRM_WORK_PROFILE_PIN_HEADER, + () -> getString(R.string.lockpassword_confirm_your_work_pin_header)); } - return mIsAlpha ? R.string.lockpassword_confirm_your_password_header - : R.string.lockpassword_confirm_your_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) { - return mIsAlpha ? R.string.lockpassword_confirm_your_password_details_frp - : R.string.lockpassword_confirm_your_pin_details_frp; + return mIsAlpha ? getString(R.string.lockpassword_confirm_your_password_details_frp) + : getString(R.string.lockpassword_confirm_your_pin_details_frp); } boolean isStrongAuthRequired = isStrongAuthRequired(); // Map boolean flags to an index by isStrongAuth << 2 + isManagedProfile << 1 + isAlpha. int index = ((isStrongAuthRequired ? 1 : 0) << 2) + ((mIsManagedProfile ? 1 : 0) << 1) + (mIsAlpha ? 1 : 0); - return DETAIL_TEXTS[index]; + return mDevicePolicyManager.getString( + DETAIL_TEXT_OVERRIDES[index], () -> getString(DETAIL_TEXTS[index])); } private int getErrorMessage() { @@ -259,7 +288,17 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity { } @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) { case USER_TYPE_PRIMARY: return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_device diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java index 6b9140acef3..f20a2a2ac8c 100644 --- a/src/com/android/settings/password/ConfirmLockPattern.java +++ b/src/com/android/settings/password/ConfirmLockPattern.java @@ -16,6 +16,12 @@ 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.SuppressLint; import android.app.Activity; @@ -258,19 +264,25 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { mGlifLayout.getDescriptionTextView().setAlpha(0f); } - private int getDefaultDetails() { + private String getDefaultDetails() { 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(); if (mIsManagedProfile) { - return isStrongAuthRequired - ? R.string.lockpassword_strong_auth_required_work_pattern - : R.string.lockpassword_confirm_your_pattern_generic_profile; + if (isStrongAuthRequired) { + return mDevicePolicyManager.getString(WORK_PROFILE_PATTERN_REQUIRED, + () -> 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 { return isStrongAuthRequired - ? R.string.lockpassword_strong_auth_required_device_pattern - : R.string.lockpassword_confirm_your_pattern_generic; + ? getString(R.string.lockpassword_strong_auth_required_device_pattern) + : getString(R.string.lockpassword_confirm_your_pattern_generic); } } @@ -352,11 +364,16 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { mGlifLayout.getHeaderTextView().announceForAccessibility(mGlifLayout.getHeaderText()); } - private int getDefaultHeader() { - if (mFrp) return R.string.lockpassword_confirm_your_pattern_header_frp; - return mIsManagedProfile - ? R.string.lockpassword_confirm_your_work_pattern_header - : R.string.lockpassword_confirm_your_pattern_header; + private String getDefaultHeader() { + if (mFrp) return getString(R.string.lockpassword_confirm_your_pattern_header_frp); + + if (mIsManagedProfile) { + 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() { @@ -550,7 +567,16 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity { } @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) { case USER_TYPE_PRIMARY: return R.string.lock_last_pattern_attempt_before_wipe_device; diff --git a/src/com/android/settings/security/LockUnificationPreferenceController.java b/src/com/android/settings/security/LockUnificationPreferenceController.java index 798691f0e7e..ec7a6edde8d 100644 --- a/src/com/android/settings/security/LockUnificationPreferenceController.java +++ b/src/com/android/settings/security/LockUnificationPreferenceController.java @@ -16,6 +16,8 @@ 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.UNUNIFY_LOCK_CONFIRM_DEVICE_REQUEST; @@ -190,8 +192,8 @@ public class LockUnificationPreferenceController extends AbstractPreferenceContr */ public void startUnification() { // Confirm profile lock - final String title = mContext.getString( - R.string.unlock_set_unlock_launch_picker_title_profile); + final String title = mDpm.getString(WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE, + () -> mContext.getString(R.string.unlock_set_unlock_launch_picker_title_profile)); final ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(mHost.getActivity(), mHost); final boolean launched = builder.setRequestCode(UNIFY_LOCK_CONFIRM_PROFILE_REQUEST) diff --git a/src/com/android/settings/security/UnificationConfirmationDialog.java b/src/com/android/settings/security/UnificationConfirmationDialog.java index d8638bc5df1..929751c951d 100644 --- a/src/com/android/settings/security/UnificationConfirmationDialog.java +++ b/src/com/android/settings/security/UnificationConfirmationDialog.java @@ -16,7 +16,11 @@ 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.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.DialogInterface; import android.os.Bundle; @@ -53,10 +57,16 @@ public class UnificationConfirmationDialog extends InstrumentedDialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { final SecuritySettings parentFragment = ((SecuritySettings) getParentFragment()); 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()) .setTitle(R.string.lock_settings_profile_unification_dialog_title) - .setMessage(compliant ? R.string.lock_settings_profile_unification_dialog_body - : R.string.lock_settings_profile_unification_dialog_uncompliant_body) + .setMessage(getContext().getSystemService(DevicePolicyManager.class) + .getString(overrideMessageId, () -> getString(defaultMessageId))) .setPositiveButton( compliant ? R.string.lock_settings_profile_unification_dialog_confirm : R.string diff --git a/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java b/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java index abeef2d2a0a..17e7e014720 100644 --- a/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java +++ b/src/com/android/settings/security/screenlock/LockAfterTimeoutPreferenceController.java @@ -16,6 +16,7 @@ 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 android.app.admin.DevicePolicyManager; @@ -123,7 +124,8 @@ public class LockAfterTimeoutPreferenceController extends AbstractPreferenceCont private void updateLockAfterPreferenceSummary(TimeoutListPreference preference) { final CharSequence summary; 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 { // Update summary message with current value long currentTimeout = Settings.Secure.getLong(mContext.getContentResolver(), diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java index 6915e95eeec..3c19d7e0e62 100644 --- a/src/com/android/settings/users/UserDialogs.java +++ b/src/com/android/settings/users/UserDialogs.java @@ -16,7 +16,11 @@ 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.admin.DevicePolicyManager; import android.content.Context; import android.content.DialogInterface; import android.content.pm.ApplicationInfo; @@ -52,17 +56,20 @@ public final class UserDialogs { public static Dialog createRemoveDialog(Context context, int removingUserId, DialogInterface.OnClickListener onConfirmListener) { UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); + DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); UserInfo userInfo = um.getUserInfo(removingUserId); AlertDialog.Builder builder = new AlertDialog.Builder(context) .setPositiveButton(R.string.user_delete_button, onConfirmListener) .setNegativeButton(android.R.string.cancel, null); 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); if (view != null) { builder.setView(view); } 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) { builder.setTitle(R.string.user_confirm_remove_self_title); diff --git a/src/com/android/settings/utils/ManagedServiceSettings.java b/src/com/android/settings/utils/ManagedServiceSettings.java index e372cb7b827..06a8ffff081 100644 --- a/src/com/android/settings/utils/ManagedServiceSettings.java +++ b/src/com/android/settings/utils/ManagedServiceSettings.java @@ -16,6 +16,8 @@ package com.android.settings.utils; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_LISTENER_BLOCKED; + import android.annotation.Nullable; import android.app.Dialog; import android.app.admin.DevicePolicyManager; @@ -134,7 +136,9 @@ public abstract class ManagedServiceSettings extends EmptyTextSettings { if (managedProfileId != UserHandle.USER_NULL && !mDpm.isNotificationListenerServicePermitted( 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) -> { final boolean enable = (boolean) newValue; diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java index 791d6ca5640..7c3ee795a72 100644 --- a/src/com/android/settings/widget/EntityHeaderController.java +++ b/src/com/android/settings/widget/EntityHeaderController.java @@ -289,7 +289,8 @@ public class EntityHeaderController { @Override public void onClick(View v) { AppInfoBase.startAppInfoFragment( - AppInfoDashboardFragment.class, R.string.application_info_label, + AppInfoDashboardFragment.class, + mActivity.getString(R.string.application_info_label), mPackageName, mUid, mFragment, 0 /* request */, mMetricsCategory); } diff --git a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java index 94bb4e8bb7e..cef43dd34ab 100644 --- a/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java +++ b/tests/robotests/src/com/android/settings/password/ConfirmCredentialTest.java @@ -18,6 +18,8 @@ package com.android.settings.password; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; + import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; @@ -27,9 +29,13 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) public class ConfirmCredentialTest { + + private Context mContext = RuntimeEnvironment.application; + @Test public void testLastTryDialogShownExactlyOnce() { FragmentManager fm = Robolectric.buildActivity(FragmentActivity.class). @@ -37,13 +43,16 @@ public class ConfirmCredentialTest { // Launch only one instance at a time. 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( - 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. LastTryDialog.hide(fm); 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(); } }