/* * Copyright (C) 2014 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.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; import android.content.Context; import android.content.DialogInterface; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.os.UserManager; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import com.android.settings.R; import com.android.settings.Utils; /** * Helper class for displaying dialogs related to user settings. */ public final class UserDialogs { /** * Creates a dialog to confirm with the user if it's ok to remove the user * and delete all the data. * * @param context a Context object * @param removingUserId The userId of the user to remove * @param onConfirmListener Callback object for positive action * @return the created Dialog */ 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(dpm.getResources().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(dpm.getResources().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); builder.setMessage(R.string.user_confirm_remove_self_message); } else if (userInfo.isRestricted()) { builder.setTitle(R.string.user_profile_confirm_remove_title); builder.setMessage(R.string.user_profile_confirm_remove_message); } else { builder.setTitle(R.string.user_confirm_remove_title); builder.setMessage(R.string.user_confirm_remove_message); } return builder.create(); } /** * Creates a view to be used in the confirmation dialog for removing work profile. */ 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; } LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.delete_managed_profile_dialog, null); ImageView imageView = (ImageView) view.findViewById(R.id.delete_managed_profile_mdm_icon_view); Drawable badgedApplicationIcon = packageManager.getApplicationIcon(mdmApplicationInfo); imageView.setImageDrawable(badgedApplicationIcon); TextView openingParagraph = (TextView) view.findViewById(R.id.delete_managed_profile_opening_paragraph); openingParagraph.setText(devicePolicyManager.getResources().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.getResources().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)); TextView textView = (TextView) view.findViewById(R.id.delete_managed_profile_device_manager_name); textView.setText(appLabel); if (!appLabel.toString().contentEquals(badgedAppLabel)) { textView.setContentDescription(badgedAppLabel); } return view; } /** * Creates a dialog to confirm that the user is ok to enable phone calls and SMS. * * @param onConfirmListener Callback object for positive action */ public static Dialog createEnablePhoneCallsAndSmsDialog(Context context, DialogInterface.OnClickListener onConfirmListener) { return new AlertDialog.Builder(context) .setTitle(R.string.user_enable_calling_and_sms_confirm_title) .setMessage(R.string.user_enable_calling_and_sms_confirm_message) .setPositiveButton(R.string.okay, onConfirmListener) .setNegativeButton(android.R.string.cancel, null) .create(); } /** * Creates a dialog to confirm that the user is ok to start setting up a new user. * * @param onConfirmListener Callback object for positive action */ public static Dialog createSetupUserDialog(Context context, DialogInterface.OnClickListener onConfirmListener) { return new AlertDialog.Builder(context) .setTitle(com.android.settingslib.R.string.user_setup_dialog_title) .setMessage(com.android.settingslib.R.string.user_setup_dialog_message) .setPositiveButton(com.android.settingslib.R.string.user_setup_button_setup_now, onConfirmListener) .setNegativeButton(com.android.settingslib.R.string.user_setup_button_setup_later, null) .create(); } /** * Creates a dialog to confirm with the user if it's ok to reset the guest user, which will * delete all the guest user's data. * * @param context a Context object * @param onConfirmListener Callback object for positive action * @return the created Dialog */ public static Dialog createResetGuestDialog(Context context, DialogInterface.OnClickListener onConfirmListener) { return new AlertDialog.Builder(context) .setTitle(com.android.settingslib.R.string.guest_reset_guest_dialog_title) .setMessage(com.android.settingslib.R.string.guest_exit_dialog_message) .setPositiveButton( com.android.settingslib.R.string.guest_reset_guest_confirm_button, onConfirmListener) .setNegativeButton(android.R.string.cancel, null) .create(); } /** * Creates a dialog to confirm with the user if it's ok to remove the guest user, which will * delete all the guest user's data. * * @param context a Context object * @param onConfirmListener Callback object for positive action * @return the created Dialog */ public static Dialog createRemoveGuestDialog(Context context, DialogInterface.OnClickListener onConfirmListener) { return new AlertDialog.Builder(context) .setTitle(com.android.settingslib.R.string.guest_remove_guest_dialog_title) .setMessage(R.string.user_exit_guest_confirm_message) .setPositiveButton( com.android.settingslib.R.string.guest_remove_guest_confirm_button, onConfirmListener) .setNegativeButton(android.R.string.cancel, null) .create(); } }