Merge "Cache the scaled avatar drawables in the keyguard user switcher" into jb-mr2-dev

This commit is contained in:
Amith Yamasani
2013-05-09 22:17:51 +00:00
committed by Android (Google) Code Review
9 changed files with 134 additions and 17 deletions

View File

@@ -2567,8 +2567,7 @@ public class Intent implements Parcelable, Cloneable {
/**
* Broadcast sent to the system when a user's information changes. Carries an extra
* {@link #EXTRA_USER_HANDLE} to indicate which user's information changed.
* This is only sent to registered receivers, not manifest receivers. It is sent to the user
* whose information has changed.
* This is only sent to registered receivers, not manifest receivers. It is sent to all users.
* @hide
*/
public static final String ACTION_USER_INFO_CHANGED =

View File

@@ -819,8 +819,10 @@ class QuickSettings {
if (ContactsContract.Intents.ACTION_PROFILE_CHANGED.equals(action) ||
Intent.ACTION_USER_INFO_CHANGED.equals(action)) {
try {
final int userId = ActivityManagerNative.getDefault().getCurrentUser().id;
if (getSendingUserId() == userId) {
final int currentUser = ActivityManagerNative.getDefault().getCurrentUser().id;
final int changedUser =
intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId());
if (changedUser == currentUser) {
reloadUserInfo();
}
} catch (RemoteException e) {

View File

@@ -100,6 +100,11 @@ class KeyguardCircleFramedDrawable extends Drawable {
mFramePath = new Path();
}
public void reset() {
mScale = 1f;
mPressed = false;
}
@Override
public void draw(Canvas canvas) {
// clear background
@@ -157,4 +162,14 @@ class KeyguardCircleFramedDrawable extends Drawable {
@Override
public void setColorFilter(ColorFilter cf) {
}
public boolean verifyParams(float iconSize, int frameColor, float stroke,
int frameShadowColor, float shadowRadius, int highlightColor) {
return mSize == iconSize
&& mFrameColor == frameColor
&& mStrokeWidth == stroke
&& mFrameShadowColor == frameShadowColor
&& mShadowRadius == shadowRadius
&& mHighlightColor == highlightColor;
}
}

View File

@@ -124,20 +124,32 @@ class KeyguardMultiUserAvatar extends FrameLayout {
mUserImage = (ImageView) findViewById(R.id.keyguard_user_avatar);
mUserName = (TextView) findViewById(R.id.keyguard_user_name);
Bitmap icon = null;
try {
icon = BitmapFactory.decodeFile(rewriteIconPath(user.iconPath));
} catch (Exception e) {
if (DEBUG) Log.d(TAG, "failed to open profile icon " + user.iconPath, e);
mFramed = (KeyguardCircleFramedDrawable)
KeyguardViewMediator.getAvatarCache().get(user.id);
// If we can't find it or the params don't match, create the drawable again
if (mFramed == null
|| !mFramed.verifyParams(mIconSize, mFrameColor, mStroke, mFrameShadowColor,
mShadowRadius, mHighlightColor)) {
Bitmap icon = null;
try {
icon = BitmapFactory.decodeFile(rewriteIconPath(user.iconPath));
} catch (Exception e) {
if (DEBUG) Log.d(TAG, "failed to open profile icon " + user.iconPath, e);
}
if (icon == null) {
icon = BitmapFactory.decodeResource(mContext.getResources(),
com.android.internal.R.drawable.ic_contact_picture);
}
mFramed = new KeyguardCircleFramedDrawable(icon, (int) mIconSize, mFrameColor, mStroke,
mFrameShadowColor, mShadowRadius, mHighlightColor);
KeyguardViewMediator.getAvatarCache().put(user.id, mFramed);
}
if (icon == null) {
icon = BitmapFactory.decodeResource(mContext.getResources(),
com.android.internal.R.drawable.ic_contact_picture);
}
mFramed.reset();
mFramed = new KeyguardCircleFramedDrawable(icon, (int) mIconSize, mFrameColor, mStroke,
mFrameShadowColor, mShadowRadius, mHighlightColor);
mUserImage.setImageDrawable(mFramed);
mUserName.setText(mUserInfo.name);
setOnClickListener(mUserSelector);

View File

@@ -91,6 +91,7 @@ public class KeyguardUpdateMonitor {
private static final int MSG_USER_SWITCH_COMPLETE = 314;
private static final int MSG_SET_CURRENT_CLIENT_ID = 315;
protected static final int MSG_SET_PLAYBACK_STATE = 316;
protected static final int MSG_USER_INFO_CHANGED = 317;
private static KeyguardUpdateMonitor sInstance;
@@ -178,6 +179,9 @@ public class KeyguardUpdateMonitor {
case MSG_SET_PLAYBACK_STATE:
handleSetPlaybackState(msg.arg1, msg.arg2, (Long) msg.obj);
break;
case MSG_USER_INFO_CHANGED:
handleUserInfoChanged(msg.arg1);
break;
}
}
};
@@ -280,6 +284,17 @@ public class KeyguardUpdateMonitor {
}
};
private final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (Intent.ACTION_USER_INFO_CHANGED.equals(action)) {
mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_INFO_CHANGED,
intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()), 0));
}
}
};
/**
* When we receive a
* {@link com.android.internal.telephony.TelephonyIntents#ACTION_SIM_STATE_CHANGED} broadcast,
@@ -389,7 +404,6 @@ public class KeyguardUpdateMonitor {
return sInstance;
}
protected void handleSetGenerationId(int clientGeneration, boolean clearing, PendingIntent p) {
mDisplayClientState.clientGeneration = clientGeneration;
mDisplayClientState.clearing = clearing;
@@ -422,6 +436,15 @@ public class KeyguardUpdateMonitor {
}
}
private void handleUserInfoChanged(int userId) {
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onUserInfoChanged(userId);
}
}
}
private KeyguardUpdateMonitor(Context context) {
mContext = context;
@@ -456,6 +479,10 @@ public class KeyguardUpdateMonitor {
bootCompleteFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
context.registerReceiver(mBroadcastReceiver, bootCompleteFilter);
final IntentFilter userInfoFilter = new IntentFilter(Intent.ACTION_USER_INFO_CHANGED);
context.registerReceiverAsUser(mBroadcastAllReceiver, UserHandle.ALL, userInfoFilter,
null, null);
try {
ActivityManagerNative.getDefault().registerUserSwitchObserver(
new IUserSwitchObserver.Stub() {

View File

@@ -106,6 +106,11 @@ class KeyguardUpdateMonitorCallback {
*/
void onUserRemoved(int userId) { }
/**
* Called when the user's info changed.
*/
void onUserInfoChanged(int userId) { }
/**
* Called when boot completed.
*

View File

@@ -253,6 +253,11 @@ public class KeyguardViewMediator {
*/
private final float mLockSoundVolume;
/**
* Cache of avatar drawables, for use by KeyguardMultiUserAvatar.
*/
private static MultiUserAvatarCache sMultiUserAvatarCache = new MultiUserAvatarCache();
/**
* The callback used by the keyguard view to tell the {@link KeyguardViewMediator}
* various things.
@@ -333,6 +338,12 @@ public class KeyguardViewMediator {
@Override
public void onUserRemoved(int userId) {
mLockPatternUtils.removeUser(userId);
sMultiUserAvatarCache.clear(userId);
}
@Override
public void onUserInfoChanged(int userId) {
sMultiUserAvatarCache.clear(userId);
}
@Override
@@ -1431,4 +1442,8 @@ public class KeyguardViewMediator {
return mSearchManager != null
&& mSearchManager.getAssistIntent(mContext, false, UserHandle.USER_CURRENT) != null;
}
public static MultiUserAvatarCache getAvatarCache() {
return sMultiUserAvatarCache;
}
}

View File

@@ -0,0 +1,42 @@
/*
* 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.internal.policy.impl.keyguard;
import android.graphics.drawable.Drawable;
import java.util.HashMap;
public class MultiUserAvatarCache {
private final HashMap<Integer, Drawable> mCache;
public MultiUserAvatarCache() {
mCache = new HashMap<Integer, Drawable>();
}
public void clear(int userId) {
mCache.remove(userId);
}
public Drawable get(int userId) {
return mCache.get(userId);
}
public void put(int userId, Drawable image) {
mCache.put(userId, image);
}
}

View File

@@ -296,7 +296,7 @@ public class UserManagerService extends IUserManager.Stub {
Intent changedIntent = new Intent(Intent.ACTION_USER_INFO_CHANGED);
changedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
changedIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mContext.sendBroadcastAsUser(changedIntent, new UserHandle(userId));
mContext.sendBroadcastAsUser(changedIntent, UserHandle.ALL);
}
@Override