Merge "Split User settings into limited and trusted." into jb-mr2-dev

This commit is contained in:
Amith Yamasani
2013-03-27 19:30:55 +00:00
committed by Android (Google) Code Review
8 changed files with 249 additions and 29 deletions

View File

@@ -37,4 +37,7 @@
<color name="title_color">@android:color/holo_blue_light</color>
<color name="setup_divider_color">#333333</color>
<color name="circle_avatar_frame_color">#ffffffff</color>
<color name="circle_avatar_frame_shadow_color">#80000000</color>
<color name="circle_avatar_frame_pressed_color">#ffffffff</color>
</resources>

View File

@@ -61,4 +61,8 @@
<dimen name="keyguard_appwidget_picker_margin_left">6dip</dimen>
<dimen name="keyguard_appwidget_picker_margin_right">6dip</dimen>
<integer name="keyguard_appwidget_picker_cols">1</integer>
<dimen name="circle_avatar_size">48dp</dimen>
<dimen name="circle_avatar_frame_stroke_width">1dp</dimen>
<dimen name="circle_avatar_frame_shadow_radius">3dp</dimen>
</resources>

View File

@@ -4276,8 +4276,10 @@
<string name="user_settings_title">Users</string>
<!-- User settings section title for details about you [CHAR LIMIT=25] -->
<string name="user_you_section">You</string>
<!-- User settings user list section header [CHAR LIMIT=30] -->
<string name="user_list_title">Other users</string>
<!-- User settings trusted user list section header [CHAR LIMIT=30] -->
<string name="user_trusted_list_title">Trusted users</string>
<!-- User settings limited user list section header [CHAR LIMIT=30] -->
<string name="user_limited_list_title">Limited users</string>
<!-- User settings add user menu [CHAR LIMIT=20] -->
<string name="user_add_user_menu">Add user</string>
<!-- User settings add restricted user label [CHAR LIMIT=20] -->

View File

@@ -35,8 +35,8 @@
android:fragment="com.android.settings.OwnerInfoSettings" />
<PreferenceCategory
android:key="user_list"
android:title="@string/user_list_title">
android:key="limited_user_list"
android:title="@string/user_limited_list_title">
</PreferenceCategory>
<Preference
@@ -45,6 +45,11 @@
android:summary="@string/user_add_restricted_summary"
android:icon="@drawable/ic_menu_add" />
<PreferenceCategory
android:key="trusted_user_list"
android:title="@string/user_trusted_list_title">
</PreferenceCategory>
<Preference
android:key="user_add_trusted"
android:title="@string/user_add_trusted"

View File

@@ -25,7 +25,10 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
@@ -197,8 +200,10 @@ public class AppRestrictionsFragment extends SettingsPreferenceFragment implemen
}
UserInfo info = mUserManager.getUserInfo(mUser.getIdentifier());
mUserPreference.setTitle(info.name);
mUserPreference.setIcon(
new BitmapDrawable(mUserManager.getUserIcon(mUser.getIdentifier())));
Bitmap userIcon = mUserManager.getUserIcon(mUser.getIdentifier());
CircleFramedDrawable circularIcon =
CircleFramedDrawable.getInstance(this.getActivity(), userIcon);
mUserPreference.setIcon(circularIcon);
mUserPreference.setText(info.name);
}

View File

@@ -0,0 +1,181 @@
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.users;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import com.android.settings.R;
/**
* Converts the user avatar icon to a circularly clipped one.
* TODO: Move this to an internal framework class and share with the one in Keyguard.
*/
class CircleFramedDrawable extends Drawable {
private final Bitmap mBitmap;
private final int mSize;
private final Paint mPaint;
private final float mShadowRadius;
private final float mStrokeWidth;
private final int mFrameColor;
private final int mHighlightColor;
private final int mFrameShadowColor;
private float mScale;
private Path mFramePath;
private Rect mSrcRect;
private RectF mDstRect;
private RectF mFrameRect;
private boolean mPressed;
public static CircleFramedDrawable getInstance(Context context, Bitmap icon) {
Resources res = context.getResources();
float iconSize = res.getDimension(R.dimen.circle_avatar_size);
float strokeWidth = res.getDimension(R.dimen.circle_avatar_frame_stroke_width);
float shadowRadius = res.getDimension(R.dimen.circle_avatar_frame_shadow_radius);
int frameColor = res.getColor(R.color.circle_avatar_frame_color);
int frameShadowColor = res.getColor(R.color.circle_avatar_frame_shadow_color);
int highlightColor = res.getColor(R.color.circle_avatar_frame_pressed_color);
CircleFramedDrawable instance = new CircleFramedDrawable(icon,
(int) iconSize, frameColor, strokeWidth, frameShadowColor, shadowRadius,
highlightColor);
return instance;
}
public CircleFramedDrawable(Bitmap icon, int size,
int frameColor, float strokeWidth,
int frameShadowColor, float shadowRadius,
int highlightColor) {
super();
mSize = size;
mShadowRadius = shadowRadius;
mFrameColor = frameColor;
mFrameShadowColor = frameShadowColor;
mStrokeWidth = strokeWidth;
mHighlightColor = highlightColor;
mBitmap = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(mBitmap);
final int width = icon.getWidth();
final int height = icon.getHeight();
final int square = Math.min(width, height);
final Rect cropRect = new Rect((width - square) / 2, (height - square) / 2, square, square);
final RectF circleRect = new RectF(0f, 0f, mSize, mSize);
circleRect.inset(mStrokeWidth / 2f, mStrokeWidth / 2f);
circleRect.inset(mShadowRadius, mShadowRadius);
final Path fillPath = new Path();
fillPath.addArc(circleRect, 0f, 360f);
canvas.drawColor(0, PorterDuff.Mode.CLEAR);
// opaque circle matte
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawPath(fillPath, mPaint);
// mask in the icon where the bitmap is opaque
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(icon, cropRect, circleRect, mPaint);
// prepare paint for frame drawing
mPaint.setXfermode(null);
mScale = 1f;
mSrcRect = new Rect(0, 0, mSize, mSize);
mDstRect = new RectF(0, 0, mSize, mSize);
mFrameRect = new RectF(mDstRect);
mFramePath = new Path();
}
@Override
public void draw(Canvas canvas) {
// clear background
final float outside = Math.min(canvas.getWidth(), canvas.getHeight());
final float inside = mScale * outside;
final float pad = (outside - inside) / 2f;
mDstRect.set(pad, pad, outside - pad, outside - pad);
canvas.drawBitmap(mBitmap, mSrcRect, mDstRect, null);
mFrameRect.set(mDstRect);
mFrameRect.inset(mStrokeWidth / 2f, mStrokeWidth / 2f);
mFrameRect.inset(mShadowRadius, mShadowRadius);
mFramePath.reset();
mFramePath.addArc(mFrameRect, 0f, 360f);
// white frame
if (mPressed) {
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.argb((int) (0.33f * 255),
Color.red(mHighlightColor),
Color.green(mHighlightColor),
Color.blue(mHighlightColor)));
canvas.drawPath(mFramePath, mPaint);
}
mPaint.setStrokeWidth(mStrokeWidth);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(mPressed ? mHighlightColor : mFrameColor);
mPaint.setShadowLayer(mShadowRadius, 0f, 0f, mFrameShadowColor);
canvas.drawPath(mFramePath, mPaint);
}
public void setScale(float scale) {
mScale = scale;
}
public float getScale() {
return mScale;
}
public void setPressed(boolean pressed) {
mPressed = pressed;
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setAlpha(int alpha) {
}
@Override
public void setColorFilter(ColorFilter cf) {
}
}

View File

@@ -57,7 +57,7 @@ public class UserPreference extends Preference {
mRestricted = ((UserManager) getContext().getSystemService(Context.USER_SERVICE))
.getUserInfo(mUserId).isRestricted();
}
setSummary(mRestricted ? R.string.user_limited : R.string.user_trusted);
//setSummary(mRestricted ? R.string.user_limited : R.string.user_trusted);
}
@Override

View File

@@ -31,6 +31,7 @@ import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
@@ -76,7 +77,8 @@ public class UserSettings extends SettingsPreferenceFragment
private static final String SAVE_ADDING_USER = "adding_user";
private static final String KEY_USER_NICKNAME = "user_nickname";
private static final String KEY_USER_LIST = "user_list";
private static final String KEY_TRUSTED_USER_LIST = "trusted_user_list";
private static final String KEY_LIMITED_USER_LIST = "limited_user_list";
private static final String KEY_USER_ME = "user_me";
private static final String KEY_ADD_RESTRICTED_USER = "user_add_restricted";
private static final String KEY_ADD_TRUSTED_USER = "user_add_trusted";
@@ -106,7 +108,8 @@ public class UserSettings extends SettingsPreferenceFragment
R.drawable.avatar_default_8
};
private PreferenceGroup mUserListCategory;
private PreferenceGroup mTrustedUserListCategory;
private PreferenceGroup mLimitedUserListCategory;
private Preference mMePreference;
private SelectableEditTextPreference mNicknamePreference;
private Preference mAddRestrictedUser;
@@ -118,7 +121,7 @@ public class UserSettings extends SettingsPreferenceFragment
private final Object mUserLock = new Object();
private UserManager mUserManager;
private SparseArray<Drawable> mUserIcons = new SparseArray<Drawable>();
private SparseArray<Bitmap> mUserIcons = new SparseArray<Bitmap>();
private boolean mIsOwner = UserHandle.myUserId() == UserHandle.USER_OWNER;
@@ -166,7 +169,8 @@ public class UserSettings extends SettingsPreferenceFragment
mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
addPreferencesFromResource(R.xml.user_settings);
mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
mTrustedUserListCategory = (PreferenceGroup) findPreference(KEY_TRUSTED_USER_LIST);
mLimitedUserListCategory = (PreferenceGroup) findPreference(KEY_LIMITED_USER_LIST);
mMePreference = (Preference) findPreference(KEY_USER_ME);
mMePreference.setOnPreferenceClickListener(this);
if (!mIsOwner) {
@@ -269,9 +273,8 @@ public class UserSettings extends SettingsPreferenceFragment
int myUserId = UserHandle.myUserId();
Bitmap b = mUserManager.getUserIcon(myUserId);
if (b != null) {
Drawable d = new BitmapDrawable(b);
mMePreference.setIcon(d);
mUserIcons.put(myUserId, d);
mMePreference.setIcon(encircle(b));
mUserIcons.put(myUserId, b);
}
}
@@ -441,8 +444,10 @@ public class UserSettings extends SettingsPreferenceFragment
if (getActivity() == null) return;
List<UserInfo> users = mUserManager.getUsers(true);
mUserListCategory.removeAll();
mUserListCategory.setOrderingAsAdded(false);
mTrustedUserListCategory.removeAll();
mTrustedUserListCategory.setOrderingAsAdded(false);
mLimitedUserListCategory.removeAll();
mLimitedUserListCategory.setOrderingAsAdded(false);
final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
for (UserInfo user : users) {
@@ -456,19 +461,23 @@ public class UserSettings extends SettingsPreferenceFragment
UserHandle.myUserId() == UserHandle.USER_OWNER, this, this);
pref.setOnPreferenceClickListener(this);
pref.setKey("id=" + user.id);
mUserListCategory.addPreference(pref);
if (user.isRestricted()) {
mLimitedUserListCategory.addPreference(pref);
} else {
mTrustedUserListCategory.addPreference(pref);
}
if (user.id == UserHandle.USER_OWNER) {
pref.setSummary(R.string.user_owner);
}
pref.setTitle(user.name);
// if (!isInitialized(user)) {
// pref.setSummary(R.string.user_summary_not_set_up);
// }
if (!isInitialized(user)) {
pref.setSummary(R.string.user_summary_not_set_up);
}
}
if (user.iconPath != null) {
if (mUserIcons.get(user.id) == null) {
missingIcons.add(user.id);
pref.setIcon(R.drawable.avatar_default_1);
pref.setIcon(encircle(R.drawable.avatar_default_1));
} else {
setPhotoId(pref, user);
}
@@ -480,9 +489,8 @@ public class UserSettings extends SettingsPreferenceFragment
false, null, null);
pref.setEnabled(false);
pref.setTitle(R.string.user_new_user_name);
//pref.setSummary(R.string.user_adding_new_user);
pref.setIcon(R.drawable.avatar_default_1);
mUserListCategory.addPreference(pref);
pref.setIcon(encircle(R.drawable.avatar_default_1));
mTrustedUserListCategory.addPreference(pref);
}
getActivity().invalidateOptionsMenu();
@@ -490,6 +498,9 @@ public class UserSettings extends SettingsPreferenceFragment
if (missingIcons.size() > 0) {
loadIconsAsync(missingIcons);
}
boolean moreUsers = mUserManager.getMaxSupportedUsers() > users.size();
mAddRestrictedUser.setEnabled(moreUsers);
mAddTrustedUser.setEnabled(moreUsers);
}
private void loadIconsAsync(List<Integer> missingIcons) {
@@ -504,8 +515,7 @@ public class UserSettings extends SettingsPreferenceFragment
protected Void doInBackground(List<Integer>... values) {
for (int userId : values[0]) {
Bitmap bitmap = mUserManager.getUserIcon(userId);
Drawable d = new BitmapDrawable(resources, bitmap);
mUserIcons.append(userId, d);
mUserIcons.append(userId, bitmap);
}
return null;
}
@@ -533,9 +543,9 @@ public class UserSettings extends SettingsPreferenceFragment
}
private void setPhotoId(Preference pref, UserInfo user) {
Drawable d = mUserIcons.get(user.id); // UserUtils.getUserIcon(mUserManager, user);
if (d != null) {
pref.setIcon(d);
Bitmap bitmap = mUserIcons.get(user.id); // UserUtils.getUserIcon(mUserManager, user);
if (bitmap != null) {
pref.setIcon(encircle(bitmap));
}
}
@@ -591,6 +601,16 @@ public class UserSettings extends SettingsPreferenceFragment
return (user.flags & UserInfo.FLAG_INITIALIZED) != 0;
}
private Drawable encircle(int iconResId) {
Bitmap icon = BitmapFactory.decodeResource(getResources(), iconResId);
return encircle(icon);
}
private Drawable encircle(Bitmap icon) {
Drawable circled = CircleFramedDrawable.getInstance(getActivity(), icon);
return circled;
}
@Override
public void onClick(View v) {
if (v.getTag() instanceof UserPreference) {