1 /* 2 * Copyright (C) 2020 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.google.android.car.kitchensink.users; 18 19 import android.annotation.NonNull; 20 import android.annotation.UserIdInt; 21 import android.app.admin.DevicePolicyManager; 22 import android.content.ComponentName; 23 import android.content.Context; 24 import android.content.pm.UserInfo; 25 import android.graphics.Bitmap; 26 import android.os.UserHandle; 27 import android.os.UserManager; 28 import android.util.AttributeSet; 29 import android.util.Log; 30 import android.widget.EditText; 31 import android.widget.LinearLayout; 32 import android.widget.TextView; 33 34 import com.android.car.admin.ui.UserAvatarView; 35 import com.android.internal.util.UserIcons; 36 37 import com.google.android.car.kitchensink.R; 38 39 /** 40 * Custom {@link android.view.View} that shows an Android user info. 41 */ 42 public final class UserInfoView extends LinearLayout { 43 44 private static final String TAG = UserInfoView.class.getSimpleName(); 45 46 private UserAvatarView mUserAvatarView; 47 private EditText mUserIdEditText; 48 private EditText mUserNameEditText; 49 private EditText mUserTypeEditText; 50 private EditText mUserFlagsEditText; 51 private TextView mManagedTextView; 52 UserInfoView(Context context, AttributeSet attrs)53 public UserInfoView(Context context, AttributeSet attrs) { 54 super(context, attrs); 55 56 inflate(context, R.layout.user_info_view, this); 57 mUserAvatarView = findViewById(R.id.user_avatar); 58 mUserIdEditText = findViewById(R.id.user_id); 59 mUserNameEditText = findViewById(R.id.user_name); 60 mUserTypeEditText = findViewById(R.id.user_type); 61 mUserFlagsEditText = findViewById(R.id.user_flags); 62 mManagedTextView = findViewById(R.id.managed); 63 } 64 65 /** 66 * Initializes the widget with the given user. 67 */ update(@onNull UserInfo user)68 public void update(@NonNull UserInfo user) { 69 Log.v(TAG, "initializing with " + user.toFullString()); 70 71 setUserIcon(user.id); 72 mUserIdEditText.setText(String.valueOf(user.id)); 73 mUserNameEditText.setText(user.name); 74 mUserTypeEditText.setText(user.userType); 75 mUserFlagsEditText.setText(UserInfo.flagsToString(user.flags)); 76 setManagedStatus(user.id); 77 } 78 setUserIcon(@serIdInt int userId)79 private void setUserIcon(@UserIdInt int userId) { 80 UserManager um = UserManager.get(getContext()); 81 Bitmap icon = um.getUserIcon(userId); 82 if (icon == null) { 83 Log.v(TAG, "No icon for user " + userId); // Happens on system user 84 icon = UserIcons.convertToBitmap( 85 UserIcons.getDefaultUserIcon(getResources(), userId, /* light= */ false)); 86 } 87 mUserAvatarView.setAvatarWithBadge(icon, userId); 88 } 89 setManagedStatus(@serIdInt int userId)90 private void setManagedStatus(@UserIdInt int userId) { 91 // Check managed status 92 DevicePolicyManager dpm = getContext().getSystemService(DevicePolicyManager.class); 93 if (dpm == null) return; 94 95 UserHandle deviceOwner = dpm.getDeviceOwnerUser(); 96 Log.v(TAG, "Device owner is " + deviceOwner); 97 98 if (deviceOwner != null && deviceOwner.getIdentifier() == userId) { 99 setManagedText("DeviceOwner"); 100 return; 101 } 102 103 ComponentName profileOwner = dpm.getProfileOwnerAsUser(userId); 104 if (profileOwner != null) { 105 Log.v(TAG, "User " + userId + " has profile owner: " + profileOwner); 106 setManagedText("ProfileOwner"); 107 return; 108 } 109 mManagedTextView.setVisibility(GONE); 110 } 111 setManagedText(@onNull CharSequence text)112 private void setManagedText(@NonNull CharSequence text) { 113 mManagedTextView.setText(text); 114 mManagedTextView.setVisibility(VISIBLE); 115 } 116 } 117