Home | History | Annotate | Download | only in enterprise
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.enterprise;
     18 
     19 import android.app.Activity;
     20 import android.app.AlertDialog;
     21 import android.app.admin.DevicePolicyManager;
     22 import android.content.ComponentName;
     23 import android.content.Context;
     24 import android.content.Intent;
     25 import android.graphics.drawable.Drawable;
     26 import android.os.Process;
     27 import android.os.UserHandle;
     28 import android.os.UserManager;
     29 import android.support.annotation.VisibleForTesting;
     30 import android.util.IconDrawableFactory;
     31 import android.view.LayoutInflater;
     32 import android.view.View;
     33 import android.view.ViewGroup;
     34 import android.widget.ImageView;
     35 import android.widget.TextView;
     36 
     37 import com.android.settings.DeviceAdminAdd;
     38 import com.android.settings.R;
     39 import com.android.settings.Settings;
     40 import com.android.settings.Utils;
     41 import com.android.settingslib.RestrictedLockUtils;
     42 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
     43 
     44 import java.util.Objects;
     45 
     46 /**
     47  * Helper class for {@link ActionDisabledByAdminDialog} which sets up the dialog.
     48  */
     49 public class ActionDisabledByAdminDialogHelper {
     50 
     51     private static final String TAG = ActionDisabledByAdminDialogHelper.class.getName();
     52     private EnforcedAdmin mEnforcedAdmin;
     53     private ViewGroup mDialogView;
     54     private String mRestriction = null;
     55     private Activity mActivity;
     56 
     57     public ActionDisabledByAdminDialogHelper(Activity activity) {
     58         mActivity = activity;
     59     }
     60 
     61     public AlertDialog.Builder prepareDialogBuilder(String restriction,
     62             EnforcedAdmin enforcedAdmin) {
     63         mEnforcedAdmin = enforcedAdmin;
     64         mRestriction = restriction;
     65 
     66         final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity);
     67         mDialogView = (ViewGroup) LayoutInflater.from(builder.getContext()).inflate(
     68                 R.layout.admin_support_details_dialog, null);
     69         initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId,
     70                 mRestriction);
     71         return builder
     72             .setPositiveButton(R.string.okay, null)
     73             .setNeutralButton(R.string.learn_more,
     74                     (dialog, which) -> {
     75                         showAdminPolicies(mEnforcedAdmin, mActivity);
     76                         mActivity.finish();
     77                     })
     78             .setView(mDialogView);
     79     }
     80 
     81     public void updateDialog(String restriction, EnforcedAdmin admin) {
     82         if (mEnforcedAdmin.equals(admin) && Objects.equals(mRestriction, restriction)) {
     83             return;
     84         }
     85         mEnforcedAdmin = admin;
     86         mRestriction = restriction;
     87         initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId,
     88                 mRestriction);
     89     }
     90 
     91     private void initializeDialogViews(View root, ComponentName admin, int userId,
     92             String restriction) {
     93         if (admin == null) {
     94             return;
     95         }
     96         if (!RestrictedLockUtils.isAdminInCurrentUserOrProfile(mActivity, admin)
     97                 || !RestrictedLockUtils.isCurrentUserOrProfile(mActivity, userId)) {
     98             admin = null;
     99         } else {
    100             final Drawable badgedIcon = Utils.getBadgedIcon(
    101                     IconDrawableFactory.newInstance(mActivity),
    102                     mActivity.getPackageManager(),
    103                     admin.getPackageName(),
    104                     userId);
    105             ((ImageView) root.findViewById(R.id.admin_support_icon)).setImageDrawable(badgedIcon);
    106         }
    107 
    108         setAdminSupportTitle(root, restriction);
    109         setAdminSupportDetails(mActivity, root, new EnforcedAdmin(admin, userId));
    110     }
    111 
    112     @VisibleForTesting
    113     void setAdminSupportTitle(View root, String restriction) {
    114         final TextView titleView = root.findViewById(R.id.admin_support_dialog_title);
    115         if (titleView == null) {
    116             return;
    117         }
    118         if (restriction == null) {
    119             titleView.setText(R.string.disabled_by_policy_title);
    120             return;
    121         }
    122         switch (restriction) {
    123             case UserManager.DISALLOW_ADJUST_VOLUME:
    124                 titleView.setText(R.string.disabled_by_policy_title_adjust_volume);
    125                 break;
    126             case UserManager.DISALLOW_OUTGOING_CALLS:
    127                 titleView.setText(R.string.disabled_by_policy_title_outgoing_calls);
    128                 break;
    129             case UserManager.DISALLOW_SMS:
    130                 titleView.setText(R.string.disabled_by_policy_title_sms);
    131                 break;
    132             case DevicePolicyManager.POLICY_DISABLE_CAMERA:
    133                 titleView.setText(R.string.disabled_by_policy_title_camera);
    134                 break;
    135             case DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE:
    136                 titleView.setText(R.string.disabled_by_policy_title_screen_capture);
    137                 break;
    138             case DevicePolicyManager.POLICY_MANDATORY_BACKUPS:
    139                 titleView.setText(R.string.disabled_by_policy_title_turn_off_backups);
    140                 break;
    141             case DevicePolicyManager.POLICY_SUSPEND_PACKAGES:
    142                 titleView.setText(R.string.disabled_by_policy_title_suspend_packages);
    143                 break;
    144             default:
    145                 // Use general text if no specialized title applies
    146                 titleView.setText(R.string.disabled_by_policy_title);
    147         }
    148     }
    149 
    150     @VisibleForTesting
    151     void setAdminSupportDetails(final Activity activity, final View root,
    152             final EnforcedAdmin enforcedAdmin) {
    153         if (enforcedAdmin == null || enforcedAdmin.component == null) {
    154             return;
    155         }
    156         final DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService(
    157                 Context.DEVICE_POLICY_SERVICE);
    158         if (!RestrictedLockUtils.isAdminInCurrentUserOrProfile(activity,
    159                 enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile(
    160                 activity, enforcedAdmin.userId)) {
    161             enforcedAdmin.component = null;
    162         } else {
    163             if (enforcedAdmin.userId == UserHandle.USER_NULL) {
    164                 enforcedAdmin.userId = UserHandle.myUserId();
    165             }
    166             CharSequence supportMessage = null;
    167             if (UserHandle.isSameApp(Process.myUid(), Process.SYSTEM_UID)) {
    168                 supportMessage = dpm.getShortSupportMessageForUser(
    169                         enforcedAdmin.component, enforcedAdmin.userId);
    170             }
    171             if (supportMessage != null) {
    172                 final TextView textView = root.findViewById(R.id.admin_support_msg);
    173                 textView.setText(supportMessage);
    174             }
    175         }
    176     }
    177 
    178     @VisibleForTesting
    179     void showAdminPolicies(final EnforcedAdmin enforcedAdmin, final Activity activity) {
    180         final Intent intent = new Intent();
    181         if (enforcedAdmin.component != null) {
    182             intent.setClass(activity, DeviceAdminAdd.class);
    183             intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
    184                     enforcedAdmin.component);
    185             intent.putExtra(DeviceAdminAdd.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true);
    186             // DeviceAdminAdd class may need to run as managed profile.
    187             activity.startActivityAsUser(intent,
    188                     new UserHandle(enforcedAdmin.userId));
    189         } else {
    190             intent.setClass(activity, Settings.DeviceAdminSettingsActivity.class);
    191             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    192             // Activity merges both managed profile and parent users
    193             // admins so show as same user as this activity.
    194             activity.startActivity(intent);
    195         }
    196     }
    197 }
    198