1 /* 2 * Copyright (C) 2015 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; 18 19 import android.app.Activity; 20 import android.app.AlertDialog; 21 import android.app.AppGlobals; 22 import android.app.admin.DevicePolicyManager; 23 import android.content.ComponentName; 24 import android.content.Context; 25 import android.content.DialogInterface; 26 import android.content.Intent; 27 import android.content.pm.ActivityInfo; 28 import android.graphics.drawable.Drawable; 29 import android.os.Bundle; 30 import android.os.Process; 31 import android.os.RemoteException; 32 import android.os.UserHandle; 33 import android.util.Log; 34 import android.view.LayoutInflater; 35 import android.view.View; 36 import android.widget.ImageView; 37 import android.widget.TextView; 38 39 import com.android.settingslib.RestrictedLockUtils; 40 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 41 42 public class ShowAdminSupportDetailsDialog extends Activity 43 implements DialogInterface.OnDismissListener { 44 45 private static final String TAG = "AdminSupportDialog"; 46 47 private EnforcedAdmin mEnforcedAdmin; 48 private View mDialogView; 49 50 @Override onCreate(Bundle savedInstanceState)51 protected void onCreate(Bundle savedInstanceState) { 52 super.onCreate(savedInstanceState); 53 54 mEnforcedAdmin = getAdminDetailsFromIntent(getIntent()); 55 56 AlertDialog.Builder builder = new AlertDialog.Builder(this); 57 mDialogView = LayoutInflater.from(builder.getContext()).inflate( 58 R.layout.admin_support_details_dialog, null); 59 initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId); 60 builder.setOnDismissListener(this) 61 .setPositiveButton(R.string.okay, null) 62 .setView(mDialogView) 63 .show(); 64 } 65 66 @Override onNewIntent(Intent intent)67 public void onNewIntent(Intent intent) { 68 super.onNewIntent(intent); 69 EnforcedAdmin admin = getAdminDetailsFromIntent(intent); 70 if (!mEnforcedAdmin.equals(admin)) { 71 mEnforcedAdmin = admin; 72 initializeDialogViews(mDialogView, mEnforcedAdmin.component, mEnforcedAdmin.userId); 73 } 74 } 75 getAdminDetailsFromIntent(Intent intent)76 private EnforcedAdmin getAdminDetailsFromIntent(Intent intent) { 77 EnforcedAdmin admin = new EnforcedAdmin(null, UserHandle.myUserId()); 78 if (intent == null) { 79 return admin; 80 } 81 admin.component = intent.getParcelableExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN); 82 admin.userId = intent.getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); 83 return admin; 84 } 85 initializeDialogViews(View root, ComponentName admin, int userId)86 private void initializeDialogViews(View root, ComponentName admin, int userId) { 87 if (admin != null) { 88 if (!RestrictedLockUtils.isAdminInCurrentUserOrProfile(this, admin) 89 || !RestrictedLockUtils.isCurrentUserOrProfile(this, userId)) { 90 admin = null; 91 } else { 92 ActivityInfo ai = null; 93 try { 94 ai = AppGlobals.getPackageManager().getReceiverInfo(admin, 0 /* flags */, 95 userId); 96 } catch (RemoteException e) { 97 Log.w(TAG, "Missing reciever info", e); 98 } 99 if (ai != null) { 100 Drawable icon = ai.loadIcon(getPackageManager()); 101 Drawable badgedIcon = getPackageManager().getUserBadgedIcon( 102 icon, new UserHandle(userId)); 103 ((ImageView) root.findViewById(R.id.admin_support_icon)).setImageDrawable( 104 badgedIcon); 105 } 106 } 107 } 108 109 setAdminSupportDetails(this, root, new EnforcedAdmin(admin, userId), true); 110 } 111 setAdminSupportDetails(final Activity activity, View root, final EnforcedAdmin enforcedAdmin, final boolean finishActivity)112 public static void setAdminSupportDetails(final Activity activity, View root, 113 final EnforcedAdmin enforcedAdmin, final boolean finishActivity) { 114 if (enforcedAdmin == null) { 115 return; 116 } 117 118 if (enforcedAdmin.component != null) { 119 DevicePolicyManager dpm = (DevicePolicyManager) activity.getSystemService( 120 Context.DEVICE_POLICY_SERVICE); 121 if (!RestrictedLockUtils.isAdminInCurrentUserOrProfile(activity, 122 enforcedAdmin.component) || !RestrictedLockUtils.isCurrentUserOrProfile( 123 activity, enforcedAdmin.userId)) { 124 enforcedAdmin.component = null; 125 } else { 126 if (enforcedAdmin.userId == UserHandle.USER_NULL) { 127 enforcedAdmin.userId = UserHandle.myUserId(); 128 } 129 CharSequence supportMessage = null; 130 if (UserHandle.isSameApp(Process.myUid(), Process.SYSTEM_UID)) { 131 supportMessage = dpm.getShortSupportMessageForUser( 132 enforcedAdmin.component, enforcedAdmin.userId); 133 } 134 if (supportMessage != null) { 135 TextView textView = (TextView) root.findViewById(R.id.admin_support_msg); 136 textView.setText(supportMessage); 137 } 138 } 139 } 140 141 root.findViewById(R.id.admins_policies_list).setOnClickListener( 142 new View.OnClickListener() { 143 @Override 144 public void onClick(View view) { 145 Intent intent = new Intent(); 146 if (enforcedAdmin.component != null) { 147 intent.setClass(activity, DeviceAdminAdd.class); 148 intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, 149 enforcedAdmin.component); 150 intent.putExtra(DeviceAdminAdd.EXTRA_CALLED_FROM_SUPPORT_DIALOG, true); 151 // DeviceAdminAdd class may need to run as managed profile. 152 activity.startActivityAsUser(intent, 153 new UserHandle(enforcedAdmin.userId)); 154 } else { 155 intent.setClass(activity, Settings.DeviceAdminSettingsActivity.class); 156 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 157 // Activity merges both managed profile and parent users 158 // admins so show as same user as this activity. 159 activity.startActivity(intent); 160 } 161 if (finishActivity) { 162 activity.finish(); 163 } 164 } 165 }); 166 } 167 168 @Override onDismiss(DialogInterface dialog)169 public void onDismiss(DialogInterface dialog) { 170 finish(); 171 } 172 } 173