import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.R;
+import com.android.internal.util.UserIcons;
import com.android.internal.widget.LockPatternUtils;
import android.app.ActivityManager;
import android.content.pm.UserInfo;
import android.content.ServiceConnection;
import android.database.ContentObserver;
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.graphics.Shader;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.Manifest;
import android.media.AudioManager;
if (um.isUserSwitcherEnabled()) {
List<UserInfo> users = um.getUsers();
UserInfo currentUser = getCurrentUser();
+ final int avatarSize = mContext.getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.global_actions_avatar_size);
for (final UserInfo user : users) {
if (user.supportsSwitchToByUser()) {
boolean isCurrentUser = currentUser == null
? user.id == 0 : (currentUser.id == user.id);
- Drawable icon = user.iconPath != null ? Drawable.createFromPath(user.iconPath)
- : null;
+ Drawable avatar = null;
+ Bitmap rawAvatar = um.getUserIcon(user.id);
+ if (rawAvatar == null) {
+ rawAvatar = UserIcons.convertToBitmap(UserIcons.getDefaultUserIcon(
+ user.isGuest() ? UserHandle.USER_NULL : user.id, /*light=*/ false));
+ }
+ avatar = new BitmapDrawable(mContext.getResources(),
+ createCircularClip(rawAvatar, avatarSize, avatarSize));
+
SinglePressAction switchToUser = new SinglePressAction(
- com.android.internal.R.drawable.ic_lock_user, icon,
- (user.name != null ? user.name : "Primary")
- + (isCurrentUser ? " \u2714" : "")) {
+ com.android.internal.R.drawable.ic_lock_user, avatar,
+ (user.name != null ? user.name : "Primary")) {
public void onPress() {
try {
ActivityManagerNative.getDefault().switchUser(user.id);
return false;
}
};
+ if (isCurrentUser) {
+ switchToUser.setStatus(mContext.getString(
+ R.string.global_action_current_user));
+ }
items.add(switchToUser);
}
}
private final Drawable mIcon;
private final int mMessageResId;
private final CharSequence mMessage;
+ private CharSequence mStatusMessage;
protected SinglePressAction(int iconResId, int messageResId) {
mIconResId = iconResId;
return true;
}
- public String getStatus() {
- return null;
+ public CharSequence getStatus() {
+ return mStatusMessage;
+ }
+
+ public void setStatus(CharSequence status) {
+ mStatusMessage = status;
}
abstract public void onPress();
TextView messageView = (TextView) v.findViewById(R.id.message);
TextView statusView = (TextView) v.findViewById(R.id.status);
- final String status = getStatus();
+ final CharSequence status = getStatus();
if (!TextUtils.isEmpty(status)) {
statusView.setText(status);
} else {
}
if (mIcon != null) {
icon.setImageDrawable(mIcon);
- icon.setScaleType(ScaleType.CENTER_CROP);
+ icon.setScaleType(ScaleType.CENTER);
} else if (mIconResId != 0) {
icon.setImageDrawable(context.getDrawable(mIconResId));
}
}
}
+ /**
+ * Generate a new bitmap (width x height pixels, ARGB_8888) with the input bitmap scaled
+ * to fit and clipped to an inscribed circle.
+ * @param input Bitmap to resize and clip
+ * @param width Width of output bitmap (and diameter of circle)
+ * @param height Height of output bitmap
+ * @return A shiny new bitmap for you to use
+ */
+ private static Bitmap createCircularClip(Bitmap input, int width, int height) {
+ if (input == null) return null;
+
+ final int inWidth = input.getWidth();
+ final int inHeight = input.getHeight();
+ final Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(output);
+ final Paint paint = new Paint();
+ paint.setShader(new BitmapShader(input, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
+ paint.setAntiAlias(true);
+ final RectF srcRect = new RectF(0, 0, inWidth, inHeight);
+ final RectF dstRect = new RectF(0, 0, width, height);
+ final Matrix m = new Matrix();
+ m.setRectToRect(srcRect, dstRect, Matrix.ScaleToFit.CENTER);
+ canvas.setMatrix(m);
+ canvas.drawCircle(inWidth / 2, inHeight / 2, inWidth / 2, paint);
+ return output;
+ }
+
private static final class GlobalActionsDialog extends Dialog implements DialogInterface {
private final Context mContext;
private final int mWindowTouchSlop;