summaryrefslogtreecommitdiffstats
path: root/packages/SystemUI/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/SystemUI/src')
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java1
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java72
8 files changed, 91 insertions, 22 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index c01a485..7d72dab 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -460,13 +460,20 @@ public class KeyguardViewMediator extends SystemUI {
@Override
public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
+ boolean unlockingWithFingerprintAllowed =
+ mUpdateMonitor.isUnlockingWithFingerprintAllowed();
if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
- mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated();
+ if (unlockingWithFingerprintAllowed) {
+ mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated();
+ }
} else {
- if (wakeAndUnlocking) {
+ if (wakeAndUnlocking && unlockingWithFingerprintAllowed) {
mWakeAndUnlocking = true;
keyguardDone(true, true);
} else {
+ if (wakeAndUnlocking) {
+ mStatusBarKeyguardViewManager.notifyScreenWakeUpRequested();
+ }
mStatusBarKeyguardViewManager.animateCollapsePanels(
FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 4558288..7c08efc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -659,6 +659,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
@Override
public void onFingerprintHelp(int msgId, String helpString) {
+ if (!KeyguardUpdateMonitor.getInstance(mContext).isUnlockingWithFingerprintAllowed()) {
+ return;
+ }
mLockIcon.setTransientFpError(true);
mIndicationController.showTransientIndication(helpString,
getResources().getColor(R.color.system_warning_color, null));
@@ -668,6 +671,9 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
@Override
public void onFingerprintError(int msgId, String errString) {
+ if (!KeyguardUpdateMonitor.getInstance(mContext).isUnlockingWithFingerprintAllowed()) {
+ return;
+ }
// TODO: Go to bouncer if this is "too many attempts" (lockout) error.
mIndicationController.showTransientIndication(errString,
getResources().getColor(R.color.system_warning_color, null));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
index 9e2ce15..d93f7c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockIcon.java
@@ -224,13 +224,14 @@ public class LockIcon extends KeyguardAffordanceView {
}
private int getState() {
- boolean fingerprintRunning =
- KeyguardUpdateMonitor.getInstance(mContext).isFingerprintDetectionRunning();
+ KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
+ boolean fingerprintRunning = updateMonitor.isFingerprintDetectionRunning();
+ boolean unlockingAllowed = updateMonitor.isUnlockingWithFingerprintAllowed();
if (mUnlockMethodCache.canSkipBouncer()) {
return STATE_LOCK_OPEN;
} else if (mTransientFpError) {
return STATE_FINGERPRINT_ERROR;
- } else if (fingerprintRunning) {
+ } else if (fingerprintRunning && unlockingAllowed) {
return STATE_FINGERPRINT;
} else if (mUnlockMethodCache.isFaceUnlockRunning()) {
return STATE_FACE_UNLOCK;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 38e2d61..fb940d2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -602,7 +602,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
addNavigationBar();
// Lastly, call to the icon policy to install/update all the icons.
- mIconPolicy = new PhoneStatusBarPolicy(mContext, mCastController, mHotspotController);
+ mIconPolicy = new PhoneStatusBarPolicy(mContext, mCastController, mHotspotController,
+ mUserInfoController);
mIconPolicy.setCurrentUserSetup(mUserSetup);
mSettingsObserver.onChange(false); // set up
@@ -851,7 +852,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mNextAlarmController = new NextAlarmController(mContext);
mKeyguardMonitor = new KeyguardMonitor(mContext);
if (UserSwitcherController.isUserSwitcherAvailable(UserManager.get(mContext))) {
- mUserSwitcherController = new UserSwitcherController(mContext, mKeyguardMonitor);
+ mUserSwitcherController = new UserSwitcherController(mContext, mKeyguardMonitor,
+ mHandler);
}
mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
(ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
index b2a67bd..53dae5c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java
@@ -44,6 +44,7 @@ import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.HotspotController;
+import com.android.systemui.statusbar.policy.UserInfoController;
/**
* This class contains all of the policy about which icons are installed in the status
@@ -69,6 +70,7 @@ public class PhoneStatusBarPolicy {
private final CastController mCast;
private final HotspotController mHotspot;
private final AlarmManager mAlarmManager;
+ private final UserInfoController mUserInfoController;
// Assume it's all good unless we hear otherwise. We don't always seem
// to get broadcasts that it *is* there.
@@ -111,12 +113,14 @@ public class PhoneStatusBarPolicy {
}
};
- public PhoneStatusBarPolicy(Context context, CastController cast, HotspotController hotspot) {
+ public PhoneStatusBarPolicy(Context context, CastController cast, HotspotController hotspot,
+ UserInfoController userInfoController) {
mContext = context;
mCast = cast;
mHotspot = hotspot;
mService = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ mUserInfoController = userInfoController;
// listen for broadcasts
IntentFilter filter = new IntentFilter();
@@ -360,6 +364,7 @@ public class PhoneStatusBarPolicy {
new IUserSwitchObserver.Stub() {
@Override
public void onUserSwitching(int newUserId, IRemoteCallback reply) {
+ mUserInfoController.reloadUserInfo();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index e622144..6b3a59d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -150,6 +150,7 @@ public class StatusBarKeyguardViewManager {
} else {
showBouncerOrKeyguard();
}
+ KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
updateStates();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index f31311d..c8c45e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -133,6 +133,9 @@ public class UnlockMethodCache {
@Override
public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
+ if (!mKeyguardUpdateMonitor.isUnlockingWithFingerprintAllowed()) {
+ return;
+ }
update(false /* updateAlways */);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 6fabe9b..3e8d4e9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -39,6 +39,8 @@ import android.os.UserManager;
import android.provider.Settings;
import android.util.Log;
import android.util.SparseArray;
+import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
@@ -68,6 +70,11 @@ public class UserSwitcherController {
private static final String SIMPLE_USER_SWITCHER_GLOBAL_SETTING =
"lockscreenSimpleUserSwitcher";
private static final String ACTION_REMOVE_GUEST = "com.android.systemui.REMOVE_GUEST";
+ private static final int PAUSE_REFRESH_USERS_TIMEOUT_MS = 3000;
+
+ private static final int ID_REMOVE_GUEST = 1010;
+ private static final String TAG_REMOVE_GUEST = "remove_guest";
+ private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF";
private final Context mContext;
private final UserManager mUserManager;
@@ -75,6 +82,7 @@ public class UserSwitcherController {
private final GuestResumeSessionReceiver mGuestResumeSessionReceiver
= new GuestResumeSessionReceiver();
private final KeyguardMonitor mKeyguardMonitor;
+ private final Handler mHandler;
private ArrayList<UserRecord> mUsers = new ArrayList<>();
private Dialog mExitGuestDialog;
@@ -82,11 +90,15 @@ public class UserSwitcherController {
private int mLastNonGuestUser = UserHandle.USER_OWNER;
private boolean mSimpleUserSwitcher;
private boolean mAddUsersWhenLocked;
+ private boolean mPauseRefreshUsers;
+ private SparseBooleanArray mForcePictureLoadForUserId = new SparseBooleanArray(2);
- public UserSwitcherController(Context context, KeyguardMonitor keyguardMonitor) {
+ public UserSwitcherController(Context context, KeyguardMonitor keyguardMonitor,
+ Handler handler) {
mContext = context;
mGuestResumeSessionReceiver.register(context);
mKeyguardMonitor = keyguardMonitor;
+ mHandler = handler;
mUserManager = UserManager.get(context);
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_ADDED);
@@ -94,10 +106,13 @@ public class UserSwitcherController {
filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_USER_STOPPING);
- filter.addAction(ACTION_REMOVE_GUEST);
mContext.registerReceiverAsUser(mReceiver, UserHandle.OWNER, filter,
null /* permission */, null /* scheduler */);
+ filter = new IntentFilter();
+ filter.addAction(ACTION_REMOVE_GUEST);
+ mContext.registerReceiverAsUser(mReceiver, UserHandle.OWNER, filter,
+ PERMISSION_SELF, null /* scheduler */);
mContext.getContentResolver().registerContentObserver(
Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true,
@@ -122,17 +137,26 @@ public class UserSwitcherController {
*/
@SuppressWarnings("unchecked")
private void refreshUsers(int forcePictureLoadForId) {
+ if (DEBUG) Log.d(TAG, "refreshUsers(forcePictureLoadForId=" + forcePictureLoadForId+")");
+ if (forcePictureLoadForId != UserHandle.USER_NULL) {
+ mForcePictureLoadForUserId.put(forcePictureLoadForId, true);
+ }
+
+ if (mPauseRefreshUsers) {
+ return;
+ }
SparseArray<Bitmap> bitmaps = new SparseArray<>(mUsers.size());
final int N = mUsers.size();
for (int i = 0; i < N; i++) {
UserRecord r = mUsers.get(i);
- if (r == null || r.info == null
- || r.info.id == forcePictureLoadForId || r.picture == null) {
+ if (r == null || r.picture == null ||
+ r.info == null || mForcePictureLoadForUserId.get(r.info.id)) {
continue;
}
bitmaps.put(r.info.id, r.picture);
}
+ mForcePictureLoadForUserId.clear();
final boolean addUsersWhenLocked = mAddUsersWhenLocked;
new AsyncTask<SparseArray<Bitmap>, Void, ArrayList<UserRecord>>() {
@@ -215,6 +239,13 @@ public class UserSwitcherController {
}.execute((SparseArray) bitmaps);
}
+ private void pauseRefreshUsers() {
+ if (!mPauseRefreshUsers) {
+ mHandler.postDelayed(mUnpauseRefreshUsers, PAUSE_REFRESH_USERS_TIMEOUT_MS);
+ mPauseRefreshUsers = true;
+ }
+ }
+
private void notifyAdapters() {
for (int i = mAdapters.size() - 1; i >= 0; i--) {
BaseUserAdapter adapter = mAdapters.get(i).get();
@@ -261,6 +292,7 @@ public class UserSwitcherController {
private void switchToUserId(int id) {
try {
+ pauseRefreshUsers();
ActivityManagerNative.getDefault().switchUser(id);
} catch (RemoteException e) {
Log.e(TAG, "Couldn't switch user.", e);
@@ -302,6 +334,10 @@ public class UserSwitcherController {
Log.v(TAG, "Broadcast: a=" + intent.getAction()
+ " user=" + intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1));
}
+
+ boolean unpauseRefreshUsers = false;
+ int forcePictureLoadForId = UserHandle.USER_NULL;
+
if (ACTION_REMOVE_GUEST.equals(intent.getAction())) {
int currentUser = ActivityManager.getCurrentUser();
UserInfo userInfo = mUserManager.getUserInfo(currentUser);
@@ -309,16 +345,13 @@ public class UserSwitcherController {
showExitGuestDialog(currentUser);
}
return;
- }
- if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) {
+ } else if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) {
final int currentId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
UserInfo userInfo = mUserManager.getUserInfo(currentId);
if (userInfo != null && userInfo.isGuest()) {
showGuestNotification(currentId);
}
- }
-
- if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
+ } else if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
if (mExitGuestDialog != null && mExitGuestDialog.isShowing()) {
mExitGuestDialog.cancel();
mExitGuestDialog = null;
@@ -343,13 +376,15 @@ public class UserSwitcherController {
}
}
notifyAdapters();
- }
- int forcePictureLoadForId = UserHandle.USER_NULL;
- if (Intent.ACTION_USER_INFO_CHANGED.equals(intent.getAction())) {
+ unpauseRefreshUsers = true;
+ } else if (Intent.ACTION_USER_INFO_CHANGED.equals(intent.getAction())) {
forcePictureLoadForId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
UserHandle.USER_NULL);
}
refreshUsers(forcePictureLoadForId);
+ if (unpauseRefreshUsers) {
+ mUnpauseRefreshUsers.run();
+ }
}
private void showGuestNotification(int guestUserId) {
@@ -366,8 +401,17 @@ public class UserSwitcherController {
mContext.getString(R.string.guest_notification_remove_action),
removeGuestPI)
.build();
- NotificationManager.from(mContext).notifyAsUser(null, 0, notification,
- new UserHandle(guestUserId));
+ NotificationManager.from(mContext).notifyAsUser(TAG_REMOVE_GUEST, ID_REMOVE_GUEST,
+ notification, new UserHandle(guestUserId));
+ }
+ };
+
+ private final Runnable mUnpauseRefreshUsers = new Runnable() {
+ @Override
+ public void run() {
+ mHandler.removeCallbacks(this);
+ mPauseRefreshUsers = false;
+ refreshUsers(UserHandle.USER_NULL);
}
};