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