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.android.car.admin.ui;
18 
19 import android.content.Context;
20 import android.content.res.ColorStateList;
21 import android.content.res.TypedArray;
22 import android.graphics.Bitmap;
23 import android.graphics.drawable.Drawable;
24 import android.util.AttributeSet;
25 import android.view.View;
26 
27 import com.android.internal.util.Preconditions;
28 import com.android.settingslib.drawable.UserIconDrawable;
29 
30 // TODO(b/176262528): copied from com.android.systemui, ideally it should be provided by a common
31 // library like SettingsLib. If not, then this whole project / package should be renamed to
32 // "car-user-ui-lib", not "car-admin-ui-lib".
33 
34 /**
35  * A view that displays a user image cropped to a circle with an optional frame.
36  */
37 public class UserAvatarView extends View {
38 
39     private final UserIconDrawable mDrawable = new UserIconDrawable();
40 
UserAvatarView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)41     public UserAvatarView(Context context, AttributeSet attrs,
42             int defStyleAttr,
43             int defStyleRes) {
44         super(context, attrs, defStyleAttr, defStyleRes);
45 
46         final TypedArray a = context.obtainStyledAttributes(
47                 attrs, R.styleable.UserAvatarView, defStyleAttr, defStyleRes);
48         final int N = a.getIndexCount();
49         for (int i = 0; i < N; i++) {
50             int attr = a.getIndex(i);
51             if (attr == R.styleable.UserAvatarView_avatarPadding) {
52                 setAvatarPadding(a.getDimension(attr, 0));
53             } else if (attr == R.styleable.UserAvatarView_frameWidth) {
54                 setFrameWidth(a.getDimension(attr, 0));
55             } else if (attr == R.styleable.UserAvatarView_framePadding) {
56                 setFramePadding(a.getDimension(attr, 0));
57             } else if (attr == R.styleable.UserAvatarView_frameColor) {
58                 setFrameColor(a.getColorStateList(attr));
59             } else if (attr == R.styleable.UserAvatarView_badgeDiameter) {
60                 setBadgeDiameter(a.getDimension(attr, 0));
61             } else if (attr == R.styleable.UserAvatarView_badgeMargin) {
62                 setBadgeMargin(a.getDimension(attr, 0));
63             }
64             else {
65                 setBadgeDiameter(a.getDimension(attr, 0));
66             }
67         }
68         a.recycle();
69         setBackground(mDrawable);
70     }
71 
UserAvatarView(Context context, AttributeSet attrs, int defStyleAttr)72     public UserAvatarView(Context context, AttributeSet attrs, int defStyleAttr) {
73         this(context, attrs, defStyleAttr, 0);
74     }
75 
UserAvatarView(Context context, AttributeSet attrs)76     public UserAvatarView(Context context, AttributeSet attrs) {
77         this(context, attrs, 0);
78     }
79 
UserAvatarView(Context context)80     public UserAvatarView(Context context) {
81         this(context, null);
82     }
83 
84     @Override
setActivated(boolean activated)85     public void setActivated(boolean activated) {
86         super.setActivated(activated);
87         mDrawable.invalidateSelf();
88     }
89 
setFrameColor(ColorStateList color)90     public void setFrameColor(ColorStateList color) {
91         mDrawable.setFrameColor(color);
92     }
93 
setFrameWidth(float frameWidth)94     public void setFrameWidth(float frameWidth) {
95         mDrawable.setFrameWidth(frameWidth);
96     }
97 
setFramePadding(float framePadding)98     public void setFramePadding(float framePadding) {
99         mDrawable.setFramePadding(framePadding);
100     }
101 
setAvatarPadding(float avatarPadding)102     public void setAvatarPadding(float avatarPadding) {
103         mDrawable.setPadding(avatarPadding);
104     }
105 
setBadgeDiameter(float diameter)106     public void setBadgeDiameter(float diameter) {
107         mDrawable.setBadgeRadius(diameter * 0.5f);
108     }
109 
setBadgeMargin(float margin)110     public void setBadgeMargin(float margin) {
111         mDrawable.setBadgeMargin(margin);
112     }
113 
setAvatar(Bitmap avatar)114     public void setAvatar(Bitmap avatar) {
115         mDrawable.setIcon(avatar);
116         mDrawable.setBadge(null);
117     }
118 
setAvatarWithBadge(Bitmap avatar, int userId)119     public void setAvatarWithBadge(Bitmap avatar, int userId) {
120         mDrawable.setIcon(avatar);
121         mDrawable.setBadgeIfManagedUser(getContext(), userId);
122     }
123 
setDrawable(Drawable d)124     public void setDrawable(Drawable d) {
125         Preconditions.checkArgument(!(d instanceof UserIconDrawable),
126                 "Recursively adding UserIconDrawable: %s", d);
127         mDrawable.setIconDrawable(d);
128         mDrawable.setBadge(null);
129     }
130 
setDrawableWithBadge(Drawable d, int userId)131     public void setDrawableWithBadge(Drawable d, int userId) {
132         Preconditions.checkArgument(!(d instanceof UserIconDrawable),
133                 "Recursively adding UserIconDrawable: %s", d);
134         mDrawable.setIconDrawable(d);
135         mDrawable.setBadgeIfManagedUser(getContext(), userId);
136     }
137 
setDrawableWithBadge(Drawable d)138     public void setDrawableWithBadge(Drawable d) {
139         Preconditions.checkArgument(!(d instanceof UserIconDrawable),
140                 "Recursively adding UserIconDrawable: %s", d);
141         mDrawable.setIconDrawable(d);
142         mDrawable.setBadgeIfManagedDevice(getContext());
143     }
144 
getUserIconDrawable()145     public UserIconDrawable getUserIconDrawable() {
146         return mDrawable;
147     }
148 }
149