diff --git a/res/layout/forgot_password_activity.xml b/res/layout/forgot_password_activity.xml index ed1e2d2f8c3..7973251a938 100644 --- a/res/layout/forgot_password_activity.xml +++ b/res/layout/forgot_password_activity.xml @@ -32,6 +32,7 @@ Financed device info - - Types of information your device administrator can see - - Data associated with your account, such as email and calendar info - - Changes made by your device administrator - - Device administrator can lock this device and reset password - - Device administrator can delete all device data - - Failed password attempts before deleting device data - - Your credit provider can change settings and install software on this device.\n\nTo learn more, contact your creditor provider. + + Your credit provider can change settings and install software on this device.\n\nIf you miss a payment, your device will be locked.\n\nTo learn more, contact your credit provider. + + If your device is financed, you can\u2019t: + + Install apps from outside the Play Store + + Reboot your device into safe mode + + Add multiple users to your device + + Change date, time, and time zones + + Use developer options + + Your credit provider can: + + Access your IMEI number + + Factory reset your device + + If your device is locked, you can only use it to: + + Make emergency calls + + View system info like date, time, network status, and battery + + Turn your device on or off + + View notifications & text messages + + Access apps that are allowed by the credit provider + + Once you pay the full amount: + + All restrictions are removed from the device + + You can uninstall the creditor app diff --git a/res/xml/financed_privacy_settings.xml b/res/xml/financed_privacy_settings.xml index 742d7e1e9eb..4e5a46a32af 100644 --- a/res/xml/financed_privacy_settings.xml +++ b/res/xml/financed_privacy_settings.xml @@ -19,66 +19,102 @@ xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/financed_privacy_settings"> - + + + + + + + + + + - + - + - - - - + android:layout_height="wrap_content" + android:title="@string/financed_privacy_factory_reset" + android:selectable="false" /> - - + + android:layout_height="wrap_content" + android:title="@string/financed_privacy_emergency_calls" + android:selectable="false" /> + + + + - - - - + + + - diff --git a/res/xml/interact_across_profiles_permissions_details.xml b/res/xml/interact_across_profiles_permissions_details.xml index bf0ea8fbfd9..2e0f3d8f444 100644 --- a/res/xml/interact_across_profiles_permissions_details.xml +++ b/res/xml/interact_across_profiles_permissions_details.xml @@ -32,10 +32,12 @@ android:key="interact_across_profiles_settings_switch" /> diff --git a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java index f9b537b16c3..5fc4cd21797 100644 --- a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java @@ -221,6 +221,13 @@ public class AccessibilityDetailsSettingsFragment extends InstrumentedFragment { extras.putString(AccessibilitySettings.EXTRA_SETTINGS_COMPONENT_NAME, new ComponentName(packageName, settingsClassName).flattenToString()); } + + final String tileServiceClassName = info.getTileServiceClassName(); + if (!TextUtils.isEmpty(tileServiceClassName)) { + extras.putString(AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME, + new ComponentName(packageName, tileServiceClassName).flattenToString()); + } + extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName); extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes()); diff --git a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java index 0ca16cb99b0..773c9878e9d 100644 --- a/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java +++ b/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorial.java @@ -46,6 +46,7 @@ import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; import androidx.annotation.IntDef; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.RawRes; import androidx.annotation.VisibleForTesting; import androidx.appcompat.app.AlertDialog; @@ -125,9 +126,15 @@ public final class AccessibilityGestureNavigationTutorial { } static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes) { + return createAccessibilityTutorialDialog(context, shortcutTypes, mOnClickListener); + } + + static AlertDialog createAccessibilityTutorialDialog(Context context, int shortcutTypes, + @Nullable DialogInterface.OnClickListener negativeButtonListener) { return new AlertDialog.Builder(context) .setView(createShortcutNavigationContentView(context, shortcutTypes)) - .setNegativeButton(R.string.accessibility_tutorial_dialog_button, mOnClickListener) + .setNegativeButton(R.string.accessibility_tutorial_dialog_button, + negativeButtonListener) .create(); } diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index b712b9d37bc..e834640e678 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -97,6 +97,7 @@ public class AccessibilitySettings extends DashboardFragment { static final String EXTRA_SETTINGS_TITLE = "settings_title"; static final String EXTRA_COMPONENT_NAME = "component_name"; static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name"; + static final String EXTRA_TILE_SERVICE_COMPONENT_NAME = "tile_service_component_name"; static final String EXTRA_VIDEO_RAW_RESOURCE_ID = "video_resource"; static final String EXTRA_LAUNCHED_FROM_SUW = "from_suw"; static final String EXTRA_ANIMATED_IMAGE_RES = "animated_image_res"; @@ -573,11 +574,13 @@ public class AccessibilitySettings extends DashboardFragment { serviceEnabled); final String htmlDescription = info.loadHtmlDescription(mPm); final String settingsClassName = info.getSettingsActivityName(); + final String tileServiceClassName = info.getTileServiceClassName(); putBasicExtras(preference, prefKey, title, description, imageRes, htmlDescription, componentName); putServiceExtras(preference, resolveInfo, serviceEnabled); putSettingsExtras(preference, packageName, settingsClassName); + putTileServiceExtras(preference, packageName, tileServiceClassName); preferenceList.add(preference); } @@ -631,10 +634,13 @@ public class AccessibilitySettings extends DashboardFragment { final int imageRes = info.getAnimatedImageRes(); final String htmlDescription = info.loadHtmlDescription(mPm); final String settingsClassName = info.getSettingsActivityName(); + final String tileServiceClassName = info.getTileServiceClassName(); putBasicExtras(preference, prefKey, title, description, imageRes, htmlDescription, componentName); putSettingsExtras(preference, componentName.getPackageName(), settingsClassName); + putTileServiceExtras(preference, componentName.getPackageName(), + tileServiceClassName); preferenceList.add(preference); } @@ -730,7 +736,11 @@ public class AccessibilitySettings extends DashboardFragment { /** * Puts the service extras into {@link RestrictedPreference}'s getExtras(). * - * Called by {@link AccessibilityServiceInfo} for now. + *

Note: Called by {@link AccessibilityServiceInfo}.

+ * + * @param preference The preference we are configuring. + * @param resolveInfo The service resolve info. + * @param serviceEnabled Whether the accessibility service is enabled. */ private void putServiceExtras(RestrictedPreference preference, ResolveInfo resolveInfo, Boolean serviceEnabled) { @@ -743,7 +753,12 @@ public class AccessibilitySettings extends DashboardFragment { /** * Puts the settings extras into {@link RestrictedPreference}'s getExtras(). * - * Called when settings UI is needed. + *

Note: Called when settings UI is needed.

+ * + * @param preference The preference we are configuring. + * @param packageName Package of accessibility feature. + * @param settingsClassName The component name of an activity that allows the user to modify + * the settings for this accessibility feature. */ private void putSettingsExtras(RestrictedPreference preference, String packageName, String settingsClassName) { @@ -756,5 +771,27 @@ public class AccessibilitySettings extends DashboardFragment { new ComponentName(packageName, settingsClassName).flattenToString()); } } + + /** + * Puts the information about a particular application + * {@link android.service.quicksettings.TileService} into {@link RestrictedPreference}'s + * getExtras(). + * + *

Note: Called when a tooltip of + * {@link android.service.quicksettings.TileService} is needed.

+ * + * @param preference The preference we are configuring. + * @param packageName Package of accessibility feature. + * @param tileServiceClassName The component name of tileService is associated with this + * accessibility feature. + */ + private void putTileServiceExtras(RestrictedPreference preference, String packageName, + String tileServiceClassName) { + final Bundle extras = preference.getExtras(); + if (!TextUtils.isEmpty(tileServiceClassName)) { + extras.putString(EXTRA_TILE_SERVICE_COMPONENT_NAME, + new ComponentName(packageName, tileServiceClassName).flattenToString()); + } + } } } diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java index 00f280440a9..ce8db21ecb2 100644 --- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java +++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java @@ -20,9 +20,11 @@ import static com.android.settings.accessibility.AccessibilityStatsLogUtils.logA import android.accessibilityservice.AccessibilityShortcutInfo; import android.app.ActivityOptions; +import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.ContentResolver; +import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ActivityInfo; import android.net.Uri; @@ -51,6 +53,7 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature private static final String TAG = "LaunchA11yActivity"; private static final String EMPTY_STRING = ""; protected static final String KEY_LAUNCH_PREFERENCE = "launch_preference"; + private ComponentName mTileComponentName; @Override public int getMetricsCategory() { @@ -106,6 +109,13 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature AccessibilitySettings.EXTRA_SETTINGS_TITLE); mSettingsIntent = TextUtils.isEmpty(settingsTitle) ? null : getSettingsIntent(arguments); mSettingsTitle = (mSettingsIntent == null) ? null : settingsTitle; + + // Tile service. + if (arguments.containsKey(AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME)) { + final String tileServiceComponentName = arguments.getString( + AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME); + mTileComponentName = ComponentName.unflattenFromString(tileServiceComponentName); + } } @Override @@ -116,12 +126,30 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature @Override ComponentName getTileComponentName() { - return null; + return mTileComponentName; } @Override CharSequence getTileName() { - return null; + final ComponentName componentName = getTileComponentName(); + if (componentName == null) { + return null; + } + return loadTileLabel(getPrefContext(), componentName); + } + + @Override + public Dialog onCreateDialog(int dialogId) { + switch (dialogId) { + case AccessibilityDialogUtils.DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL: + final Dialog dialog = AccessibilityGestureNavigationTutorial + .createAccessibilityTutorialDialog(getPrefContext(), + getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked); + dialog.setCanceledOnTouchOutside(false); + return dialog; + default: + return super.onCreateDialog(dialogId); + } } @Override @@ -208,4 +236,22 @@ public class LaunchAccessibilityActivityPreferenceFragment extends ToggleFeature return settingsIntent; } + + /** + * This method will be invoked when a button in the tutorial dialog is clicked. + * + * @param dialog The dialog that received the click + * @param which The button that was clicked + */ + private void callOnTutorialDialogButtonClicked(DialogInterface dialog, int which) { + dialog.dismiss(); + showQuickSettingsTooltipIfNeeded(); + } + + + @Override + protected void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) { + super.callOnAlertDialogCheckboxClicked(dialog, which); + showQuickSettingsTooltipIfNeeded(getShortcutTypeCheckBoxValue()); + } } diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java index a1c98cdc0c4..d7a506a21df 100644 --- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java @@ -65,6 +65,7 @@ public class ToggleAccessibilityServicePreferenceFragment extends private static final String EMPTY_STRING = ""; private Dialog mWarningDialog; + private ComponentName mTileComponentName; private BroadcastReceiver mPackageRemovedReceiver; private boolean mDisabledStateLogged = false; private long mStartTimeMillsForLogging = 0; @@ -168,9 +169,9 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override public Dialog onCreateDialog(int dialogId) { + final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); switch (dialogId) { - case DialogEnums.ENABLE_WARNING_FROM_TOGGLE: { - final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); + case DialogEnums.ENABLE_WARNING_FROM_TOGGLE: if (info == null) { return null; } @@ -178,10 +179,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends .createCapabilitiesDialog(getPrefContext(), info, this::onDialogButtonFromEnableToggleClicked, this::onDialogButtonFromUninstallClicked); - break; - } - case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE: { - final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); + return mWarningDialog; + case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT_TOGGLE: if (info == null) { return null; } @@ -189,10 +188,8 @@ public class ToggleAccessibilityServicePreferenceFragment extends .createCapabilitiesDialog(getPrefContext(), info, this::onDialogButtonFromShortcutToggleClicked, this::onDialogButtonFromUninstallClicked); - break; - } - case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: { - final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); + return mWarningDialog; + case DialogEnums.ENABLE_WARNING_FROM_SHORTCUT: if (info == null) { return null; } @@ -200,23 +197,24 @@ public class ToggleAccessibilityServicePreferenceFragment extends .createCapabilitiesDialog(getPrefContext(), info, this::onDialogButtonFromShortcutClicked, this::onDialogButtonFromUninstallClicked); - break; - } - case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: { - final AccessibilityServiceInfo info = getAccessibilityServiceInfo(); + return mWarningDialog; + case DialogEnums.DISABLE_WARNING_FROM_TOGGLE: if (info == null) { return null; } mWarningDialog = AccessibilityServiceWarning .createDisableDialog(getPrefContext(), info, this::onDialogButtonFromDisableToggleClicked); - break; - } - default: { - mWarningDialog = super.onCreateDialog(dialogId); - } + return mWarningDialog; + case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL: + final Dialog dialog = AccessibilityGestureNavigationTutorial + .createAccessibilityTutorialDialog(getPrefContext(), + getUserShortcutTypes(), this::callOnTutorialDialogButtonClicked); + dialog.setCanceledOnTouchOutside(false); + return dialog; + default: + return super.onCreateDialog(dialogId); } - return mWarningDialog; } @Override @@ -243,12 +241,16 @@ public class ToggleAccessibilityServicePreferenceFragment extends @Override ComponentName getTileComponentName() { - return null; + return mTileComponentName; } @Override CharSequence getTileName() { - return null; + final ComponentName componentName = getTileComponentName(); + if (componentName == null) { + return null; + } + return loadTileLabel(getPrefContext(), componentName); } @Override @@ -386,6 +388,12 @@ public class ToggleAccessibilityServicePreferenceFragment extends mPackageName = getAccessibilityServiceInfo().getResolveInfo().loadLabel( getPackageManager()); + if (arguments.containsKey(AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME)) { + final String tileServiceComponentName = arguments.getString( + AccessibilitySettings.EXTRA_TILE_SERVICE_COMPONENT_NAME); + mTileComponentName = ComponentName.unflattenFromString(tileServiceComponentName); + } + mStartTimeMillsForLogging = arguments.getLong(AccessibilitySettings.EXTRA_TIME_FOR_LOGGING); } @@ -488,6 +496,23 @@ public class ToggleAccessibilityServicePreferenceFragment extends mWarningDialog.dismiss(); } + /** + * This method will be invoked when a button in the tutorial dialog is clicked. + * + * @param dialog The dialog that received the click + * @param which The button that was clicked + */ + private void callOnTutorialDialogButtonClicked(DialogInterface dialog, int which) { + dialog.dismiss(); + showQuickSettingsTooltipIfNeeded(); + } + + @Override + protected void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) { + super.callOnAlertDialogCheckboxClicked(dialog, which); + showQuickSettingsTooltipIfNeeded(getShortcutTypeCheckBoxValue()); + } + void onDialogButtonFromShortcutClicked(View view) { final int viewId = view.getId(); if (viewId == R.id.permission_enable_allow_button) { diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index 0cc1f1c1662..08e9b88878a 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -25,7 +25,9 @@ import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; import android.graphics.drawable.Drawable; import android.icu.text.CaseMap; import android.net.Uri; @@ -33,6 +35,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.UserHandle; import android.provider.Settings; +import android.service.quicksettings.TileService; import android.text.Html; import android.text.TextUtils; import android.view.LayoutInflater; @@ -798,6 +801,19 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference PreferredShortcuts.saveUserShortcutType(getPrefContext(), shortcut); } + /** + * Shows the quick settings tooltip if the quick settings service and the shortcut are assigned. + * The tooltip only shows once. + * + * @param shortcutType The shortcut type. + */ + protected void showQuickSettingsTooltipIfNeeded(@UserShortcutType int shortcutType) { + if (shortcutType == AccessibilityUtil.UserShortcutType.EMPTY) { + return; + } + showQuickSettingsTooltipIfNeeded(); + } + /** * Shows the quick settings tooltip if the quick settings service is assigned. The tooltip only * shows once. @@ -830,4 +846,20 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference tileComponentName); mNeedsQSTooltipReshow = false; } + + /** Returns user visible name of the tile by given {@link ComponentName}. */ + protected CharSequence loadTileLabel(Context context, ComponentName componentName) { + final PackageManager packageManager = context.getPackageManager(); + final Intent queryIntent = new Intent(TileService.ACTION_QS_TILE); + final List resolveInfos = + packageManager.queryIntentServices(queryIntent, PackageManager.GET_META_DATA); + for (ResolveInfo info : resolveInfos) { + final ServiceInfo serviceInfo = info.serviceInfo; + if (TextUtils.equals(componentName.getPackageName(), serviceInfo.packageName) + && TextUtils.equals(componentName.getClassName(), serviceInfo.name)) { + return serviceInfo.loadLabel(packageManager); + } + } + return null; + } } diff --git a/src/com/android/settings/accounts/ManagedProfileSettings.java b/src/com/android/settings/accounts/ManagedProfileSettings.java index a6fa15a85d1..001a2cd7dbb 100644 --- a/src/com/android/settings/accounts/ManagedProfileSettings.java +++ b/src/com/android/settings/accounts/ManagedProfileSettings.java @@ -16,6 +16,12 @@ package com.android.settings.accounts; +import static android.app.admin.DevicePolicyResources.Strings.Settings.CROSS_PROFILE_CALENDAR_SUMMARY; +import static android.app.admin.DevicePolicyResources.Strings.Settings.CROSS_PROFILE_CALENDAR_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONTACT_SEARCH_SUMMARY; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_CONTACT_SEARCH_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SETTING; + import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; @@ -78,6 +84,17 @@ public class ManagedProfileSettings extends DashboardFragment { super.onCreate(icicle); mManagedProfileBroadcastReceiver = new ManagedProfileBroadcastReceiver(); mManagedProfileBroadcastReceiver.register(getActivity()); + replaceEnterpriseStringTitle("work_mode", + WORK_PROFILE_SETTING, R.string.work_mode_label); + replaceEnterpriseStringTitle("contacts_search", + WORK_PROFILE_CONTACT_SEARCH_TITLE, R.string.managed_profile_contact_search_title); + replaceEnterpriseStringSummary("contacts_search", + WORK_PROFILE_CONTACT_SEARCH_SUMMARY, + R.string.managed_profile_contact_search_summary); + replaceEnterpriseStringTitle("cross_profile_calendar", + CROSS_PROFILE_CALENDAR_TITLE, R.string.cross_profile_calendar_title); + replaceEnterpriseStringSummary("cross_profile_calendar", + CROSS_PROFILE_CALENDAR_SUMMARY, R.string.cross_profile_calendar_summary); } @Override diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index a38ed1158ca..5bc4118bfef 100755 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -16,6 +16,8 @@ package com.android.settings.applications.appinfo; +import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE; + import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.Activity; @@ -238,6 +240,8 @@ public class AppInfoDashboardFragment extends DashboardFragment startListeningToPackageRemove(); setHasOptionsMenu(true); + replaceEnterpriseStringTitle("interact_across_profiles", + CONNECTED_WORK_AND_PERSONAL_APPS_TITLE, R.string.interact_across_profiles_title); } @Override diff --git a/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java b/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java index f96ff63eef1..2cbc30422fc 100644 --- a/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java +++ b/src/com/android/settings/applications/specialaccess/SpecialAccessSettings.java @@ -16,7 +16,11 @@ package com.android.settings.applications.specialaccess; +import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGE_DEVICE_ADMIN_APPS; + import android.app.settings.SettingsEnums; +import android.os.Bundle; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -33,6 +37,15 @@ public class SpecialAccessSettings extends DashboardFragment { return TAG; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("interact_across_profiles", + CONNECTED_WORK_AND_PERSONAL_APPS_TITLE, R.string.interact_across_profiles_title); + replaceEnterpriseStringTitle("device_administrators", + MANAGE_DEVICE_ADMIN_APPS, R.string.manage_device_admin); + } + @Override protected int getPreferenceScreenResId() { return R.xml.special_access; diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java index e133c62e14e..b6a297080eb 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java @@ -27,6 +27,8 @@ import static android.app.admin.DevicePolicyResources.Strings.Settings.REMOVE_AN 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.SET_PROFILE_OWNER_POSTSETUP_WARNING; +import static android.app.admin.DevicePolicyResources.Strings.Settings.UNINSTALL_DEVICE_ADMIN; 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; @@ -365,6 +367,10 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity { mAdminDescription = (TextView)findViewById(R.id.admin_description); mProfileOwnerWarning = (TextView) findViewById(R.id.profile_owner_warning); + mProfileOwnerWarning.setText( + mDPM.getString(SET_PROFILE_OWNER_POSTSETUP_WARNING, + () -> getString(R.string.adding_profile_owner_warning))); + mAddMsg = (TextView)findViewById(R.id.add_msg); mAddMsgExpander = (ImageView) findViewById(R.id.add_msg_expander); final View.OnClickListener onClickListener = new View.OnClickListener() { @@ -410,6 +416,8 @@ public class DeviceAdminAdd extends CollapsingToolbarBaseActivity { }); mUninstallButton = (Button) findViewById(R.id.uninstall_button); + mUninstallButton.setText(mDPM.getString(UNINSTALL_DEVICE_ADMIN, + () -> getString(R.string.uninstall_device_admin))); mUninstallButton.setFilterTouchesWhenObscured(true); mUninstallButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java index 4a990734bfa..38191242c78 100644 --- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java +++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminSettings.java @@ -16,7 +16,10 @@ package com.android.settings.applications.specialaccess.deviceadmin; +import static android.app.admin.DevicePolicyResources.Strings.Settings.NO_DEVICE_ADMINS; + import android.app.settings.SettingsEnums; +import android.os.Bundle; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -31,6 +34,14 @@ public class DeviceAdminSettings extends DashboardFragment { return SettingsEnums.DEVICE_ADMIN_SETTINGS; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + // TODO: Replace PreferenceScreen title manage_device_admin/MANAGE_DEVICE_ADMIN_APPS + replaceEnterpriseStringTitle("device_admin_footer", + NO_DEVICE_ADMINS, R.string.no_device_admins); + } + @Override protected int getPreferenceScreenResId() { return R.xml.device_admin_settings; diff --git a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java index 4e96aa3086d..e85a513f6be 100644 --- a/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java +++ b/src/com/android/settings/applications/specialaccess/interactacrossprofiles/InteractAcrossProfilesDetails.java @@ -17,9 +17,13 @@ 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.CONNECTED_APPS_SHARE_PERMISSIONS_AND_DATA; +import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECT_APPS_DIALOG_SUMMARY; import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECT_APPS_DIALOG_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.HOW_TO_DISCONNECT_APPS; 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.app.admin.DevicePolicyResources.Strings.Settings.ONLY_CONNECT_TRUSTED_APPS; 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; @@ -46,6 +50,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.stats.devicepolicy.DevicePolicyEnums; import android.util.IconDrawableFactory; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -72,9 +77,11 @@ public class InteractAcrossProfilesDetails extends AppInfoBase "interact_across_profiles_extra_summary"; public static final String EXTRA_SHOW_FRAGMENT_ARGS = ":settings:show_fragment_args"; public static final String INTENT_KEY = "intent"; + private static final String TAG = "InteractAcrossProfilesDetails"; private Context mContext; private CrossProfileApps mCrossProfileApps; + private DevicePolicyManager mDevicePolicyManager; private UserManager mUserManager; private RestrictedSwitchPreference mSwitchPref; private LayoutPreference mHeader; @@ -94,6 +101,7 @@ public class InteractAcrossProfilesDetails extends AppInfoBase mContext = getContext(); mCrossProfileApps = mContext.getSystemService(CrossProfileApps.class); + mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); mUserManager = mContext.getSystemService(UserManager.class); mPackageManager = mContext.getPackageManager(); @@ -106,6 +114,18 @@ public class InteractAcrossProfilesDetails extends AppInfoBase mInstallAppIntent = AppStoreUtil.getAppStoreLink(mContext, mPackageName); addPreferencesFromResource(R.xml.interact_across_profiles_permissions_details); + + replaceEnterpriseStringSummary("interact_across_profiles_summary_1", + CONNECTED_APPS_SHARE_PERMISSIONS_AND_DATA, + R.string.interact_across_profiles_summary_1); + replaceEnterpriseStringSummary("interact_across_profiles_summary_2", + ONLY_CONNECT_TRUSTED_APPS, + R.string.interact_across_profiles_summary_2); + replaceEnterpriseStringSummary("interact_across_profiles_extra_summary", + HOW_TO_DISCONNECT_APPS, + R.string.interact_across_profiles_summary_3); + + mSwitchPref = findPreference(INTERACT_ACROSS_PROFILES_SETTINGS_SWITCH); mSwitchPref.setOnPreferenceClickListener(this); @@ -127,6 +147,19 @@ public class InteractAcrossProfilesDetails extends AppInfoBase logPageLaunchMetrics(); } + private void replaceEnterpriseStringSummary( + String preferenceKey, String overrideKey, int resource) { + Preference preference = findPreference(preferenceKey); + if (preference == null) { + Log.d(TAG, "Could not find enterprise preference " + preferenceKey); + return; + } + + preference.setSummary( + mDevicePolicyManager.getString(overrideKey, + () -> getString(resource))); + } + private void maybeShowExtraSummary() { Preference extraSummary = findPreference(INTERACT_ACROSS_PROFILE_EXTRA_SUMMARY_KEY); if (extraSummary == null) { @@ -264,7 +297,8 @@ public class InteractAcrossProfilesDetails extends AppInfoBase final TextView dialogTitle = dialogView.findViewById( R.id.interact_across_profiles_consent_dialog_title); dialogTitle.setText(mDpm.getString(CONNECT_APPS_DIALOG_TITLE, () -> - getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel))); + getString(R.string.interact_across_profiles_consent_dialog_title, mAppLabel), + mAppLabel)); final TextView appDataSummary = dialogView.findViewById(R.id.app_data_summary); appDataSummary.setText( @@ -280,6 +314,12 @@ public class InteractAcrossProfilesDetails extends AppInfoBase mAppLabel), mAppLabel)); + final TextView dialogSummary = + dialogView.findViewById(R.id.interact_across_profiles_consent_dialog_summary); + dialogSummary.setText(mDpm.getString(CONNECT_APPS_DIALOG_SUMMARY, + () -> getString( + R.string.interact_across_profiles_consent_dialog_summary))); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(dialogView) .setPositiveButton(R.string.allow, new DialogInterface.OnClickListener() { diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java index b75e02a754a..c70a56ab866 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingController.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java @@ -435,7 +435,7 @@ public class BluetoothPairingController implements OnCheckedChangeListener, */ public void onCancel() { Log.d(TAG, "Pairing dialog canceled"); - mDevice.cancelPairing(); + mDevice.cancelBondProcess(); } /** diff --git a/src/com/android/settings/bluetooth/BluetoothPairingService.java b/src/com/android/settings/bluetooth/BluetoothPairingService.java index bc5dc6695d1..9883e617392 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingService.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingService.java @@ -98,7 +98,7 @@ public final class BluetoothPairingService extends Service { } else if (action.equals(ACTION_DISMISS_PAIRING)) { Log.d(TAG, "Notification cancel " + " (" + mDevice.getName() + ")"); - mDevice.cancelPairing(); + mDevice.cancelBondProcess(); } else { int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); @@ -144,7 +144,7 @@ public final class BluetoothPairingService extends Service { createPairingNotification(intent); } else if (TextUtils.equals(action, ACTION_DISMISS_PAIRING)) { Log.d(TAG, "Notification cancel " + " (" + mDevice.getName() + ")"); - mDevice.cancelPairing(); + mDevice.cancelBondProcess(); mNm.cancel(NOTIFICATION_ID); stopSelf(); } else if (TextUtils.equals(action, ACTION_PAIRING_DIALOG)) { diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index e38d8430014..cfdfdaaeb0a 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -16,6 +16,7 @@ package com.android.settings.dashboard; import android.app.Activity; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.ContentResolver; import android.content.Context; @@ -79,6 +80,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController; private boolean mListeningToCategoryChange; private List mSuppressInjectedTileKeys; + private DevicePolicyManager mDevicePolicyManager; @Override public void onAttach(Context context) { @@ -148,6 +150,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + mDevicePolicyManager = getSystemService(DevicePolicyManager.class); // Set ComparisonCallback so we get better animation when list changes. getPreferenceManager().setPreferenceComparisonCallback( new PreferenceManager.SimplePreferenceComparisonCallback()); @@ -566,4 +569,30 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment resolver.unregisterContentObserver(observer); }); } + + protected void replaceEnterpriseStringTitle( + String preferenceKey, String overrideKey, int resource) { + Preference preference = findPreference(preferenceKey); + if (preference == null) { + Log.d(TAG, "Could not find enterprise preference " + preferenceKey); + return; + } + + preference.setTitle( + mDevicePolicyManager.getString(overrideKey, + () -> getString(resource))); + } + + protected void replaceEnterpriseStringSummary( + String preferenceKey, String overrideKey, int resource) { + Preference preference = findPreference(preferenceKey); + if (preference == null) { + Log.d(TAG, "Could not find enterprise preference " + preferenceKey); + return; + } + + preference.setSummary( + mDevicePolicyManager.getString(overrideKey, + () -> getString(resource))); + } } diff --git a/src/com/android/settings/display/TimeoutListPreference.java b/src/com/android/settings/display/TimeoutListPreference.java index f9a731d32eb..0b2d18fdee5 100644 --- a/src/com/android/settings/display/TimeoutListPreference.java +++ b/src/com/android/settings/display/TimeoutListPreference.java @@ -53,6 +53,7 @@ public class TimeoutListPreference extends RestrictedListPreference { super.onPrepareDialogBuilder(builder, listener); if (mAdmin != null) { builder.setView(R.layout.admin_disabled_other_options_footer); + // TODO: replace Text on textview with admin_disabled_other_options } else { builder.setView(null); } diff --git a/src/com/android/settings/display/darkmode/BedtimeSettings.java b/src/com/android/settings/display/darkmode/BedtimeSettings.java index d9a458c8798..28121b22cfc 100644 --- a/src/com/android/settings/display/darkmode/BedtimeSettings.java +++ b/src/com/android/settings/display/darkmode/BedtimeSettings.java @@ -17,11 +17,13 @@ package com.android.settings.display.darkmode; import static android.provider.Settings.ACTION_BEDTIME_SETTINGS; +import static android.util.FeatureFlagUtils.SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.util.FeatureFlagUtils; import androidx.annotation.Nullable; @@ -44,6 +46,10 @@ public final class BedtimeSettings { */ @Nullable public Intent getBedtimeSettingsIntent() { + if (!FeatureFlagUtils.isEnabled(mContext, + SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME)) { + return null; + } Intent bedtimeSettingsIntent = new Intent(ACTION_BEDTIME_SETTINGS).setPackage( mWellbeingPackage); ResolveInfo bedtimeSettingInfo = mPackageManager.resolveActivity(bedtimeSettingsIntent, diff --git a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java index fe02fdaae80..055e86833ff 100644 --- a/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java +++ b/src/com/android/settings/enterprise/ActionDisabledByAdminDialogHelper.java @@ -16,6 +16,8 @@ package com.android.settings.enterprise; +import static android.app.admin.DevicePolicyResources.Strings.Settings.DISABLED_BY_IT_ADMIN_TITLE; + import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.Activity; @@ -67,6 +69,13 @@ public final class ActionDisabledByAdminDialogHelper { .createInstance(mActivity, restriction, new DeviceAdminStringProviderImpl(mActivity), UserHandle.SYSTEM); + DevicePolicyManager devicePolicyManager = + mActivity.getSystemService(DevicePolicyManager.class); + + TextView title = mDialogView.findViewById(R.id.admin_support_dialog_title); + title.setText(devicePolicyManager.getString(DISABLED_BY_IT_ADMIN_TITLE, + () -> mActivity.getString(R.string.disabled_by_policy_title))); + } private @UserIdInt int getEnforcementAdminUserId(@NonNull EnforcedAdmin admin) { diff --git a/src/com/android/settings/enterprise/ApplicationListFragment.java b/src/com/android/settings/enterprise/ApplicationListFragment.java index 17de9f892a2..a82789b02f2 100644 --- a/src/com/android/settings/enterprise/ApplicationListFragment.java +++ b/src/com/android/settings/enterprise/ApplicationListFragment.java @@ -19,6 +19,7 @@ package com.android.settings.enterprise; import android.Manifest; import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import com.android.settings.R; import com.android.settings.applications.ApplicationFeatureProvider; @@ -43,6 +44,11 @@ public abstract class ApplicationListFragment extends DashboardFragment return TAG; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + } + @Override protected int getPreferenceScreenResId() { return R.xml.app_list_disclosure_settings; diff --git a/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java b/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java index 12901a63c15..8612f6a1314 100644 --- a/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java +++ b/src/com/android/settings/enterprise/PrivacySettingsFinancedPreference.java @@ -20,10 +20,8 @@ import android.content.Context; import android.provider.SearchIndexableResource; import com.android.settings.R; -import com.android.settings.widget.PreferenceCategoryController; import com.android.settingslib.core.AbstractPreferenceController; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -61,18 +59,6 @@ public class PrivacySettingsFinancedPreference implements PrivacySettingsPrefere */ @Override public List createPreferenceControllers(boolean async) { - final List controllers = new ArrayList<>(); - controllers.add(new NetworkLogsPreferenceController(mContext)); - controllers.add(new BugReportsPreferenceController(mContext)); - controllers.add(new SecurityLogsPreferenceController(mContext)); - final List exposureChangesCategoryControllers = - new ArrayList<>(); - exposureChangesCategoryControllers.add(new EnterpriseInstalledPackagesPreferenceController( - mContext, async)); - controllers.addAll(exposureChangesCategoryControllers); - controllers.add(new PreferenceCategoryController(mContext, KEY_EXPOSURE_CHANGES_CATEGORY) - .setChildren(exposureChangesCategoryControllers)); - controllers.add(new FailedPasswordWipeCurrentUserPreferenceController(mContext)); - return controllers; + return Collections.emptyList(); } } diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java index c8966297a26..58c082b8c02 100644 --- a/src/com/android/settings/language/LanguageAndInputSettings.java +++ b/src/com/android/settings/language/LanguageAndInputSettings.java @@ -16,9 +16,12 @@ package com.android.settings.language; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_KEYBOARDS_AND_TOOLS; + import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -70,6 +73,14 @@ public class LanguageAndInputSettings extends DashboardFragment { activity.setTitle(R.string.language_settings); } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("language_and_input_for_work_category", + WORK_PROFILE_KEYBOARDS_AND_TOOLS, + R.string.language_and_input_for_work_category_title); + } + @Override protected int getPreferenceScreenResId() { return R.xml.language_and_input; diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java index 13300c93c36..ab3ed20606b 100644 --- a/src/com/android/settings/location/LocationSettings.java +++ b/src/com/android/settings/location/LocationSettings.java @@ -16,6 +16,8 @@ package com.android.settings.location; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCATION_SWITCH_TITLE; + import android.app.settings.SettingsEnums; import android.content.Context; import android.location.SettingInjectorService; @@ -107,6 +109,14 @@ public class LocationSettings extends DashboardFragment implements return R.xml.location_settings; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + replaceEnterpriseStringTitle("managed_profile_location_switch", + WORK_PROFILE_LOCATION_SWITCH_TITLE, R.string.managed_profile_location_switch_title); + } + @Override protected String getLogTag() { return TAG; diff --git a/src/com/android/settings/location/LocationWorkProfileSettings.java b/src/com/android/settings/location/LocationWorkProfileSettings.java index 24c44f3dd4e..d8db33da119 100644 --- a/src/com/android/settings/location/LocationWorkProfileSettings.java +++ b/src/com/android/settings/location/LocationWorkProfileSettings.java @@ -16,8 +16,11 @@ package com.android.settings.location; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCATION_SWITCH_TITLE; + import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -40,6 +43,13 @@ public class LocationWorkProfileSettings extends DashboardFragment { return R.xml.location_settings_workprofile; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("managed_profile_location_switch", + WORK_PROFILE_LOCATION_SWITCH_TITLE, R.string.managed_profile_location_switch_title); + } + @Override protected String getLogTag() { return TAG; diff --git a/src/com/android/settings/notification/ConfigureNotificationSettings.java b/src/com/android/settings/notification/ConfigureNotificationSettings.java index 5f78acc1ccc..f888ea7c8e0 100644 --- a/src/com/android/settings/notification/ConfigureNotificationSettings.java +++ b/src/com/android/settings/notification/ConfigureNotificationSettings.java @@ -16,6 +16,9 @@ package com.android.settings.notification; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_SUMMARY; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_TITLE; + import android.app.Activity; import android.app.Application; import android.app.settings.SettingsEnums; @@ -69,6 +72,17 @@ public class ConfigureNotificationSettings extends DashboardFragment implements return TAG; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("lock_screen_work_redact", + WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_TITLE, + R.string.lock_screen_notifs_redact_work); + replaceEnterpriseStringSummary("lock_screen_work_redact", + WORK_PROFILE_LOCK_SCREEN_REDACT_NOTIFICATION_SUMMARY, + R.string.lock_screen_notifs_redact_work_summary); + } + @Override protected int getPreferenceScreenResId() { return R.xml.configure_notification_settings; diff --git a/src/com/android/settings/notification/SoundSettings.java b/src/com/android/settings/notification/SoundSettings.java index ab53a3ffada..971937c73f5 100644 --- a/src/com/android/settings/notification/SoundSettings.java +++ b/src/com/android/settings/notification/SoundSettings.java @@ -16,6 +16,8 @@ package com.android.settings.notification; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SOUND_SETTINGS_SECTION_HEADER; + import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -97,6 +99,9 @@ public class SoundSettings extends DashboardFragment implements OnActivityResult .findFragmentByTag(TAG); mDialogFragment = dialogFragment; } + replaceEnterpriseStringTitle("sound_work_settings", + WORK_PROFILE_SOUND_SETTINGS_SECTION_HEADER, + R.string.sound_work_settings); } @Override diff --git a/src/com/android/settings/notification/SoundWorkSettings.java b/src/com/android/settings/notification/SoundWorkSettings.java index d30c04f26ff..eb7f05ed8ca 100644 --- a/src/com/android/settings/notification/SoundWorkSettings.java +++ b/src/com/android/settings/notification/SoundWorkSettings.java @@ -16,6 +16,12 @@ package com.android.settings.notification; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_ALARM_RINGTONE_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATION_RINGTONE_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_RINGTONE_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USE_PERSONAL_SOUNDS_SUMMARY; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_USE_PERSONAL_SOUNDS_TITLE; + import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; @@ -64,6 +70,18 @@ public class SoundWorkSettings extends DashboardFragment implements OnActivityRe mRequestPreference = findPreference(selectedPreference); } } + replaceEnterpriseStringTitle("work_use_personal_sounds", + WORK_PROFILE_USE_PERSONAL_SOUNDS_TITLE, R.string.work_use_personal_sounds_title); + replaceEnterpriseStringSummary("work_use_personal_sounds", + WORK_PROFILE_USE_PERSONAL_SOUNDS_SUMMARY, + R.string.work_use_personal_sounds_summary); + replaceEnterpriseStringTitle("work_ringtone", + WORK_PROFILE_RINGTONE_TITLE, R.string.work_ringtone_title); + replaceEnterpriseStringTitle("work_alarm_ringtone", + WORK_PROFILE_ALARM_RINGTONE_TITLE, R.string.work_alarm_ringtone_title); + replaceEnterpriseStringTitle("work_notification", + WORK_PROFILE_NOTIFICATION_RINGTONE_TITLE, + R.string.work_notification_ringtone_title); } @Override diff --git a/src/com/android/settings/password/ForgotPasswordActivity.java b/src/com/android/settings/password/ForgotPasswordActivity.java index 1f1df1896cb..d963a05ccd9 100644 --- a/src/com/android/settings/password/ForgotPasswordActivity.java +++ b/src/com/android/settings/password/ForgotPasswordActivity.java @@ -16,12 +16,16 @@ package com.android.settings.password; +import static android.app.admin.DevicePolicyResources.Strings.Settings.FORGOT_PASSWORD_TEXT; + import android.app.Activity; +import android.app.admin.DevicePolicyManager; import android.content.Intent; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; +import android.widget.TextView; import com.android.settings.R; @@ -45,6 +49,11 @@ public class ForgotPasswordActivity extends Activity { } setContentView(R.layout.forgot_password_activity); + DevicePolicyManager devicePolicyManager = getSystemService(DevicePolicyManager.class); + TextView forgotPasswordText = (TextView) findViewById(R.id.forgot_password_text); + forgotPasswordText.setText(devicePolicyManager.getString( + FORGOT_PASSWORD_TEXT, () -> getString(R.string.forgot_password_text))); + final GlifLayout layout = findViewById(R.id.setup_wizard_layout); layout.getMixin(FooterBarMixin.class).setPrimaryButton( new FooterButton.Builder(this) diff --git a/src/com/android/settings/privacy/PrivacyDashboardFragment.java b/src/com/android/settings/privacy/PrivacyDashboardFragment.java index 7aa65b711c9..0638c60c94c 100644 --- a/src/com/android/settings/privacy/PrivacyDashboardFragment.java +++ b/src/com/android/settings/privacy/PrivacyDashboardFragment.java @@ -16,8 +16,15 @@ package com.android.settings.privacy; +import static android.app.admin.DevicePolicyResources.Strings.Settings.CONNECTED_WORK_AND_PERSONAL_APPS_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCKED_NOTIFICATION_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PRIVACY_POLICY_INFO; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_PRIVACY_POLICY_INFO_SUMMARY; + import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -50,6 +57,24 @@ public class PrivacyDashboardFragment extends DashboardFragment { return TAG; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("privacy_lock_screen_work_profile_notifications", + WORK_PROFILE_LOCKED_NOTIFICATION_TITLE, + R.string.locked_work_profile_notification_title); + replaceEnterpriseStringTitle("interact_across_profiles_privacy", + CONNECTED_WORK_AND_PERSONAL_APPS_TITLE, R.string.interact_across_profiles_title); + replaceEnterpriseStringTitle("privacy_work_profile_notifications_category", + WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER, R.string.profile_section_header); + replaceEnterpriseStringTitle("work_policy_info", + WORK_PROFILE_PRIVACY_POLICY_INFO, R.string.work_policy_privacy_settings); + replaceEnterpriseStringSummary("work_policy_info", + WORK_PROFILE_PRIVACY_POLICY_INFO_SUMMARY, + R.string.work_policy_privacy_settings_summary); + + } + @Override protected int getPreferenceScreenResId() { return R.xml.privacy_dashboard_settings; diff --git a/src/com/android/settings/security/LockscreenDashboardFragment.java b/src/com/android/settings/security/LockscreenDashboardFragment.java index 39355f381a9..b3351ac1579 100644 --- a/src/com/android/settings/security/LockscreenDashboardFragment.java +++ b/src/com/android/settings/security/LockscreenDashboardFragment.java @@ -16,9 +16,13 @@ package com.android.settings.security; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_LOCKED_NOTIFICATION_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER; + import android.app.settings.SettingsEnums; import android.content.Context; import android.hardware.display.AmbientDisplayConfiguration; +import android.os.Bundle; import androidx.annotation.VisibleForTesting; @@ -75,6 +79,16 @@ public class LockscreenDashboardFragment extends DashboardFragment return TAG; } + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("security_setting_lock_screen_notif_work", + WORK_PROFILE_LOCKED_NOTIFICATION_TITLE, + R.string.locked_work_profile_notification_title); + replaceEnterpriseStringTitle("security_setting_lock_screen_notif_work_header", + WORK_PROFILE_NOTIFICATIONS_SECTION_HEADER, R.string.profile_section_header); + } + @Override protected int getPreferenceScreenResId() { return R.xml.security_lockscreen_settings; diff --git a/src/com/android/settings/security/SecurityAdvancedSettings.java b/src/com/android/settings/security/SecurityAdvancedSettings.java index ce4a59c50b2..e5f494507a0 100644 --- a/src/com/android/settings/security/SecurityAdvancedSettings.java +++ b/src/com/android/settings/security/SecurityAdvancedSettings.java @@ -16,9 +16,17 @@ package com.android.settings.security; +import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_FOR_WORK; +import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGED_DEVICE_INFO; +import static android.app.admin.DevicePolicyResources.Strings.Settings.MANAGE_DEVICE_ADMIN_APPS; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SECURITY_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE; +import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_UNIFY_LOCKS_SUMMARY; + import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import com.android.settings.R; import com.android.settings.biometrics.combination.CombinedBiometricProfileStatusPreferenceController; @@ -53,6 +61,27 @@ public class SecurityAdvancedSettings extends DashboardFragment { private static final String CATEGORY_SECURITY_LEGACY_ADVANCED_SETTINGS = "com.android.settings.category.ia.legacy_advanced_security"; + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + replaceEnterpriseStringTitle("unlock_set_or_change_profile", + WORK_PROFILE_SET_UNLOCK_LAUNCH_PICKER_TITLE, + R.string.unlock_set_unlock_launch_picker_title_profile); + replaceEnterpriseStringSummary("unification", + WORK_PROFILE_UNIFY_LOCKS_SUMMARY, + R.string.lock_settings_profile_unification_summary); + replaceEnterpriseStringTitle("fingerprint_settings_profile", + FINGERPRINT_FOR_WORK, + R.string.security_settings_work_fingerprint_preference_title); + replaceEnterpriseStringTitle("manage_device_admin", + MANAGE_DEVICE_ADMIN_APPS, R.string.manage_device_admin); + replaceEnterpriseStringTitle("security_category_profile", + WORK_PROFILE_SECURITY_TITLE, R.string.lock_settings_profile_title); + replaceEnterpriseStringTitle("enterprise_privacy", MANAGED_DEVICE_INFO, + R.string.enterprise_privacy_settings); + + } + @Override public int getMetricsCategory() { return SettingsEnums.SECURITY_ADVANCED; diff --git a/src/com/android/settings/users/UserDialogs.java b/src/com/android/settings/users/UserDialogs.java index 3c19d7e0e62..4dcec4d2b56 100644 --- a/src/com/android/settings/users/UserDialogs.java +++ b/src/com/android/settings/users/UserDialogs.java @@ -18,6 +18,7 @@ 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 static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_MANAGED_BY; import android.app.Dialog; import android.app.admin.DevicePolicyManager; @@ -89,6 +90,8 @@ public final class UserDialogs { */ private static View createRemoveManagedUserDialogView(Context context, int userId) { PackageManager packageManager = context.getPackageManager(); + DevicePolicyManager devicePolicyManager = + context.getSystemService(DevicePolicyManager.class); ApplicationInfo mdmApplicationInfo = Utils.getAdminApplicationInfo(context, userId); if (mdmApplicationInfo == null) { return null; @@ -102,6 +105,16 @@ public final class UserDialogs { Drawable badgedApplicationIcon = packageManager.getApplicationIcon(mdmApplicationInfo); imageView.setImageDrawable(badgedApplicationIcon); + TextView openingParagraph = (TextView) + view.findViewById(R.id.delete_managed_profile_opening_paragraph); + openingParagraph.setText(devicePolicyManager.getString(WORK_PROFILE_MANAGED_BY, + () -> context.getString( + R.string.opening_paragraph_delete_profile_unknown_company))); + TextView closingParagraph = (TextView) + view.findViewById(R.id.delete_managed_profile_closing_paragraph); + closingParagraph.setText(devicePolicyManager.getString(WORK_PROFILE_CONFIRM_REMOVE_MESSAGE, + () -> context.getString(R.string.work_profile_confirm_remove_message))); + CharSequence appLabel = packageManager.getApplicationLabel(mdmApplicationInfo); CharSequence badgedAppLabel = packageManager.getUserBadgedLabel(appLabel, new UserHandle(userId)); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java index cf0ce96bf60..6efdcf7a7e2 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityGestureNavigationTutorialTest.java @@ -22,26 +22,41 @@ import static com.android.settings.accessibility.AccessibilityUtil.UserShortcutT import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.verify; + import android.content.Context; +import android.content.DialogInterface; import androidx.appcompat.app.AlertDialog; +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.R; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; /** Tests for {@link AccessibilityGestureNavigationTutorial}. */ @RunWith(RobolectricTestRunner.class) public final class AccessibilityGestureNavigationTutorialTest { - private Context mContext; + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Mock + private DialogInterface.OnClickListener mMockOnClickListener; + + private final Context mContext = ApplicationProvider.getApplicationContext(); private int mShortcutTypes; @Before public void setUp() { - mContext = RuntimeEnvironment.application; + mContext.setTheme(R.style.Theme_AppCompat); mShortcutTypes = /* initial */ 0; } @@ -86,4 +101,28 @@ public final class AccessibilityGestureNavigationTutorialTest { mShortcutTypes)).hasSize(/* expectedSize= */ 2); assertThat(alertDialog).isNotNull(); } + + @Test + public void performClickOnNegativeButton_turnOnSoftwareShortcut_dismiss() { + mShortcutTypes |= UserShortcutType.SOFTWARE; + final AlertDialog alertDialog = + createAccessibilityTutorialDialog(mContext, mShortcutTypes); + alertDialog.show(); + + alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick(); + + assertThat(alertDialog.isShowing()).isFalse(); + } + + @Test + public void performClickOnNegativeButton_turnOnSoftwareShortcut_callOnClickListener() { + mShortcutTypes |= UserShortcutType.SOFTWARE; + final AlertDialog alertDialog = + createAccessibilityTutorialDialog(mContext, mShortcutTypes, mMockOnClickListener); + alertDialog.show(); + + alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).performClick(); + + verify(mMockOnClickListener).onClick(alertDialog, DialogInterface.BUTTON_NEGATIVE); + } } diff --git a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java new file mode 100644 index 00000000000..0c656b37604 --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.accessibility; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.service.quicksettings.TileService; + +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowPackageManager; + +import java.util.Arrays; + +/** Tests for {@link LaunchAccessibilityActivityPreferenceFragment} */ +@RunWith(RobolectricTestRunner.class) +public class LaunchAccessibilityActivityPreferenceFragmentTest { + + private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example"; + private static final String PLACEHOLDER_TILE_CLASS_NAME = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; + private static final String PLACEHOLDER_TILE_CLASS_NAME2 = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2"; + private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName( + PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME); + private static final String PLACEHOLDER_TILE_NAME = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; + private static final String PLACEHOLDER_TILE_NAME2 = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2"; + + private TestLaunchAccessibilityActivityPreferenceFragment mFragment; + private PreferenceScreen mScreen; + private Context mContext = ApplicationProvider.getApplicationContext(); + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private PreferenceManager mPreferenceManager; + + @Before + public void setUpTestFragment() { + MockitoAnnotations.initMocks(this); + + mFragment = spy(new TestLaunchAccessibilityActivityPreferenceFragment()); + when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); + when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); + when(mFragment.getContext()).thenReturn(mContext); + mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null)); + when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager); + doReturn(mScreen).when(mFragment).getPreferenceScreen(); + } + + @Test + public void getTileName_noTileServiceAssigned_noMatchString() { + final CharSequence tileName = mFragment.getTileName(); + assertThat(tileName.toString()).isEqualTo(""); + } + + @Test + public void getTileName_hasOneTileService_haveMatchString() { + final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE); + final ResolveInfo info = new ResolveInfo(); + info.serviceInfo = new FakeServiceInfo(); + info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME; + info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME; + final ShadowPackageManager shadowPackageManager = + Shadows.shadowOf(mContext.getPackageManager()); + shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info)); + + final CharSequence tileName = mFragment.getTileName(); + assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME); + } + + @Test + public void getTileName_hasTwoTileServices_haveMatchString() { + final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE); + final ResolveInfo info = new ResolveInfo(); + info.serviceInfo = new FakeServiceInfo(); + info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME; + info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME; + final ResolveInfo info2 = new ResolveInfo(); + info2.serviceInfo = new FakeServiceInfo2(); + info2.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME; + info2.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME2; + final ShadowPackageManager shadowPackageManager = + Shadows.shadowOf(mContext.getPackageManager()); + shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info, info2)); + + final CharSequence tileName = mFragment.getTileName(); + assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME); + } + + private static class FakeServiceInfo extends ServiceInfo { + public String loadLabel(PackageManager mgr) { + return PLACEHOLDER_TILE_NAME; + } + } + + private static class FakeServiceInfo2 extends ServiceInfo { + public String loadLabel(PackageManager mgr) { + return PLACEHOLDER_TILE_NAME2; + } + } + + private static class TestLaunchAccessibilityActivityPreferenceFragment + extends LaunchAccessibilityActivityPreferenceFragment { + + @Override + protected ComponentName getTileComponentName() { + return PLACEHOLDER_TILE_COMPONENT_NAME; + } + } +} diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java new file mode 100644 index 00000000000..db5b83c841d --- /dev/null +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.accessibility; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.service.quicksettings.TileService; + +import androidx.preference.PreferenceManager; +import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowPackageManager; + +import java.util.Arrays; + +/** Tests for {@link ToggleAccessibilityServicePreferenceFragment} */ +@RunWith(RobolectricTestRunner.class) +public class ToggleAccessibilityServicePreferenceFragmentTest { + + private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example"; + private static final String PLACEHOLDER_TILE_CLASS_NAME = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; + private static final String PLACEHOLDER_TILE_CLASS_NAME2 = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2"; + private static final ComponentName PLACEHOLDER_TILE_COMPONENT_NAME = new ComponentName( + PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME); + private static final String PLACEHOLDER_TILE_NAME = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder"; + private static final String PLACEHOLDER_TILE_NAME2 = + PLACEHOLDER_PACKAGE_NAME + "tile.placeholder2"; + + private TestToggleAccessibilityServicePreferenceFragment mFragment; + private PreferenceScreen mScreen; + private Context mContext = ApplicationProvider.getApplicationContext(); + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private PreferenceManager mPreferenceManager; + + @Before + public void setUpTestFragment() { + MockitoAnnotations.initMocks(this); + + mFragment = spy(new TestToggleAccessibilityServicePreferenceFragment()); + when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); + when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); + when(mFragment.getContext()).thenReturn(mContext); + mScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null)); + when(mScreen.getPreferenceManager()).thenReturn(mPreferenceManager); + doReturn(mScreen).when(mFragment).getPreferenceScreen(); + } + + @Test + public void getTileName_noTileServiceAssigned_noMatchString() { + final CharSequence tileName = mFragment.getTileName(); + assertThat(tileName.toString()).isEqualTo(""); + } + + @Test + public void getTileName_hasOneTileService_haveMatchString() { + final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE); + final ResolveInfo info = new ResolveInfo(); + info.serviceInfo = new FakeServiceInfo(); + info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME; + info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME; + final ShadowPackageManager shadowPackageManager = + Shadows.shadowOf(mContext.getPackageManager()); + shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info)); + + final CharSequence tileName = mFragment.getTileName(); + assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME); + } + + @Test + public void getTileName_hasTwoTileServices_haveMatchString() { + final Intent tileProbe = new Intent(TileService.ACTION_QS_TILE); + final ResolveInfo info = new ResolveInfo(); + info.serviceInfo = new FakeServiceInfo(); + info.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME; + info.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME; + final ResolveInfo info2 = new ResolveInfo(); + info2.serviceInfo = new FakeServiceInfo2(); + info2.serviceInfo.packageName = PLACEHOLDER_PACKAGE_NAME; + info2.serviceInfo.name = PLACEHOLDER_TILE_CLASS_NAME2; + final ShadowPackageManager shadowPackageManager = + Shadows.shadowOf(mContext.getPackageManager()); + shadowPackageManager.setResolveInfosForIntent(tileProbe, Arrays.asList(info, info2)); + + final CharSequence tileName = mFragment.getTileName(); + assertThat(tileName.toString()).isEqualTo(PLACEHOLDER_TILE_NAME); + } + + private static class FakeServiceInfo extends ServiceInfo { + public String loadLabel(PackageManager mgr) { + return PLACEHOLDER_TILE_NAME; + } + } + + private static class FakeServiceInfo2 extends ServiceInfo { + public String loadLabel(PackageManager mgr) { + return PLACEHOLDER_TILE_NAME2; + } + } + + private static class TestToggleAccessibilityServicePreferenceFragment + extends ToggleAccessibilityServicePreferenceFragment { + + @Override + protected ComponentName getTileComponentName() { + return PLACEHOLDER_TILE_COMPONENT_NAME; + } + } +} diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java index e73b447728e..3194e55770f 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingServiceTest.java @@ -106,7 +106,7 @@ public class BluetoothPairingServiceTest { mBluetoothPairingService.onStartCommand(intent, /* flags */ 0, /* startId */ 0); - verify(mDevice).cancelPairing(); + verify(mDevice).cancelBondProcess(); verify(mNm).cancel(mBluetoothPairingService.NOTIFICATION_ID); } diff --git a/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java b/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java index 5cf22248001..34b218a9ed4 100644 --- a/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java +++ b/tests/robotests/src/com/android/settings/enterprise/AbsBasePrivacySettingsPreference.java @@ -84,18 +84,6 @@ public abstract class AbsBasePrivacySettingsPreference { protected void verifyFinancedPreferenceControllers( List controllers) { - assertThat(controllers).isNotNull(); - assertThat(controllers.size()).isEqualTo(6); - int position = 0; - assertThat(controllers.get(position++)).isInstanceOf(NetworkLogsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf(BugReportsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - SecurityLogsPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - EnterpriseInstalledPackagesPreferenceController.class); - assertThat(controllers.get(position++)).isInstanceOf( - PreferenceCategoryController.class); - assertThat(controllers.get(position)).isInstanceOf( - FailedPasswordWipeCurrentUserPreferenceController.class); + assertThat(controllers).isEmpty(); } } diff --git a/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java b/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java index 59c501b3e36..ac55334b102 100644 --- a/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java +++ b/tests/robotests/src/com/android/settings/testutils/BedtimeSettingsUtils.java @@ -17,6 +17,7 @@ package com.android.settings.testutils; import static android.provider.Settings.ACTION_BEDTIME_SETTINGS; +import static android.util.FeatureFlagUtils.SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME; import static org.robolectric.Shadows.shadowOf; @@ -25,6 +26,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ResolveInfo; +import android.util.FeatureFlagUtils; /** A helper class for installing bedtime settings activity. */ public final class BedtimeSettingsUtils { @@ -35,6 +37,8 @@ public final class BedtimeSettingsUtils { } public void installBedtimeSettings(String wellbeingPackage, boolean enabled) { + FeatureFlagUtils.setEnabled(mContext, SETTINGS_APP_ALLOW_DARK_THEME_ACTIVATION_AT_BEDTIME, + true /* enabled */); Intent bedtimeSettingsIntent = new Intent(ACTION_BEDTIME_SETTINGS) .setPackage(wellbeingPackage); ResolveInfo bedtimeResolveInfo = new ResolveInfo(); diff --git a/tests/unit/OWNERS b/tests/unit/OWNERS index 4123742aff0..8a7a27ee4e2 100644 --- a/tests/unit/OWNERS +++ b/tests/unit/OWNERS @@ -1,2 +1,2 @@ -# Additional reviewers for this and subdirectories. -goldmanj@google.com +# We do not guard tests - everyone is welcomed to contribute to tests. +per-file *.java=* \ No newline at end of file