1 /* 2 * Copyright (C) 2012 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.users; 18 19 import android.content.Context; 20 import android.graphics.drawable.Drawable; 21 import android.os.UserHandle; 22 import android.os.UserManager; 23 import android.util.AttributeSet; 24 import android.view.View; 25 import android.view.View.OnClickListener; 26 import android.widget.ImageView; 27 28 import androidx.preference.PreferenceViewHolder; 29 30 import com.android.settings.R; 31 import com.android.settingslib.RestrictedLockUtilsInternal; 32 import com.android.settingslib.RestrictedPreference; 33 34 import java.util.Comparator; 35 36 public class UserPreference extends RestrictedPreference { 37 private static final int ALPHA_ENABLED = 255; 38 private static final int ALPHA_DISABLED = 102; 39 40 public static final int USERID_UNKNOWN = -10; 41 public static final int USERID_GUEST_DEFAULTS = -11; 42 public static final Comparator<UserPreference> SERIAL_NUMBER_COMPARATOR = 43 (p1, p2) -> { 44 45 if (p1 == null) { 46 return -1; 47 } 48 else if (p2 == null) { 49 return 1; 50 } 51 int sn1 = p1.getSerialNumber(); 52 int sn2 = p2.getSerialNumber(); 53 if (sn1 < sn2) { 54 return -1; 55 } else if (sn1 > sn2) { 56 return 1; 57 } 58 return 0; 59 }; 60 61 private OnClickListener mDeleteClickListener; 62 private OnClickListener mSettingsClickListener; 63 private int mSerialNumber = -1; 64 private int mUserId = USERID_UNKNOWN; 65 static final int SETTINGS_ID = R.id.manage_user; 66 static final int DELETE_ID = R.id.trash_user; 67 UserPreference(Context context, AttributeSet attrs)68 public UserPreference(Context context, AttributeSet attrs) { 69 this(context, attrs, USERID_UNKNOWN, null, null); 70 } 71 UserPreference(Context context, AttributeSet attrs, int userId, OnClickListener settingsListener, OnClickListener deleteListener)72 UserPreference(Context context, AttributeSet attrs, int userId, 73 OnClickListener settingsListener, 74 OnClickListener deleteListener) { 75 super(context, attrs); 76 if (deleteListener != null || settingsListener != null) { 77 setWidgetLayoutResource(R.layout.restricted_preference_user_delete_widget); 78 } 79 mDeleteClickListener = deleteListener; 80 mSettingsClickListener = settingsListener; 81 mUserId = userId; 82 useAdminDisabledSummary(true); 83 } 84 dimIcon(boolean dimmed)85 private void dimIcon(boolean dimmed) { 86 Drawable icon = getIcon(); 87 if (icon != null) { 88 icon.mutate().setAlpha(dimmed ? ALPHA_DISABLED : ALPHA_ENABLED); 89 setIcon(icon); 90 } 91 } 92 93 @Override shouldHideSecondTarget()94 protected boolean shouldHideSecondTarget() { 95 if (isDisabledByAdmin()) { 96 // Disabled by admin, show no secondary target. 97 return true; 98 } 99 if (canDeleteUser()) { 100 // Need to show delete user target so don't hide. 101 return false; 102 } 103 // Hide if don't have advanced setting listener. 104 return mSettingsClickListener == null; 105 } 106 107 @Override onBindViewHolder(PreferenceViewHolder view)108 public void onBindViewHolder(PreferenceViewHolder view) { 109 super.onBindViewHolder(view); 110 final boolean disabledByAdmin = isDisabledByAdmin(); 111 dimIcon(disabledByAdmin); 112 View userDeleteWidget = view.findViewById(R.id.user_delete_widget); 113 if (userDeleteWidget != null) { 114 userDeleteWidget.setVisibility(disabledByAdmin ? View.GONE : View.VISIBLE); 115 } 116 if (!disabledByAdmin) { 117 View deleteDividerView = view.findViewById(R.id.divider_delete); 118 View manageDividerView = view.findViewById(R.id.divider_manage); 119 View deleteView = view.findViewById(R.id.trash_user); 120 if (deleteView != null) { 121 if (canDeleteUser()) { 122 deleteView.setVisibility(View.VISIBLE); 123 deleteDividerView.setVisibility(View.VISIBLE); 124 deleteView.setOnClickListener(mDeleteClickListener); 125 deleteView.setTag(this); 126 } else { 127 deleteView.setVisibility(View.GONE); 128 deleteDividerView.setVisibility(View.GONE); 129 } 130 } 131 ImageView manageView = (ImageView) view.findViewById(R.id.manage_user); 132 if (manageView != null) { 133 if (mSettingsClickListener != null) { 134 manageView.setVisibility(View.VISIBLE); 135 manageDividerView.setVisibility(mDeleteClickListener == null 136 ? View.VISIBLE : View.GONE); 137 manageView.setOnClickListener(mSettingsClickListener); 138 manageView.setTag(this); 139 } else { 140 manageView.setVisibility(View.GONE); 141 manageDividerView.setVisibility(View.GONE); 142 } 143 } 144 } 145 } 146 canDeleteUser()147 private boolean canDeleteUser() { 148 return mDeleteClickListener != null 149 && !RestrictedLockUtilsInternal.hasBaseUserRestriction(getContext(), 150 UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId()); 151 } 152 getSerialNumber()153 private int getSerialNumber() { 154 if (mUserId == UserHandle.myUserId()) return Integer.MIN_VALUE; 155 if (mSerialNumber < 0) { 156 // If the userId is unknown 157 if (mUserId == USERID_UNKNOWN) { 158 return Integer.MAX_VALUE; 159 } else if (mUserId == USERID_GUEST_DEFAULTS) { 160 return Integer.MAX_VALUE - 1; 161 } 162 mSerialNumber = ((UserManager) getContext().getSystemService(Context.USER_SERVICE)) 163 .getUserSerialNumber(mUserId); 164 if (mSerialNumber < 0) return mUserId; 165 } 166 return mSerialNumber; 167 } 168 getUserId()169 public int getUserId() { 170 return mUserId; 171 } 172 } 173