KeyguardMultiUserSelectorView.java revision 109f1fd80c90409c0d7f21d49989641dfdf2ad1b
166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen/* 266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * Copyright (C) 2012 The Android Open Source Project 366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * 466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * Licensed under the Apache License, Version 2.0 (the "License"); 566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * you may not use this file except in compliance with the License. 666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * You may obtain a copy of the License at 766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * 866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * http://www.apache.org/licenses/LICENSE-2.0 966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * 1066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * Unless required by applicable law or agreed to in writing, software 1166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * distributed under the License is distributed on an "AS IS" BASIS, 1266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * See the License for the specific language governing permissions and 1466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen * limitations under the License. 1566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen */ 1666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenpackage com.android.internal.policy.impl.keyguard; 1866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 1966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.app.ActivityManagerNative; 2066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.content.Context; 2166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.content.pm.UserInfo; 2266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.os.RemoteException; 2366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.os.UserManager; 2466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport android.util.AttributeSet; 2524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenimport android.util.Log; 2624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenimport android.view.View; 2724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenimport android.view.WindowManagerGlobal; 2824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenimport android.widget.FrameLayout; 2966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 3066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport com.android.internal.R; 3166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 3266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohenimport java.util.ArrayList; 3324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenimport java.util.Collections; 3424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenimport java.util.Comparator; 3566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 3624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohenpublic class KeyguardMultiUserSelectorView extends FrameLayout implements View.OnClickListener { 3724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen private static final String TAG = "KeyguardMultiUserSelectorView"; 3824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 3924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen private KeyguardSubdivisionLayout mUsersGrid; 4024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen private KeyguardMultiUserAvatar mActiveUserAvatar; 41109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller private KeyguardHostView.UserSwitcherCallback mCallback; 4224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen private static final int SWITCH_ANIMATION_DURATION = 150; 4324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen private static final int FADE_OUT_ANIMATION_DURATION = 100; 4466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 4566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen public KeyguardMultiUserSelectorView(Context context) { 4666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen this(context, null, 0); 4766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 4866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 4966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen public KeyguardMultiUserSelectorView(Context context, AttributeSet attrs) { 5066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen this(context, attrs, 0); 5166b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 5266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 5366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen public KeyguardMultiUserSelectorView(Context context, AttributeSet attrs, int defStyle) { 5466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen super(context, attrs, defStyle); 5566b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 5666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 5766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen protected void onFinishInflate () { 5866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen init(); 5966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 6066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 61109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller public void setCallback(KeyguardHostView.UserSwitcherCallback callback) { 6224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mCallback = callback; 6324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 6466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 6524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void init() { 6624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mUsersGrid = (KeyguardSubdivisionLayout) findViewById(R.id.keyguard_users_grid); 6724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mUsersGrid.removeAllViews(); 6824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen setClipChildren(false); 6924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen setClipToPadding(false); 7066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 7124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen UserInfo activeUser; 7266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen try { 7324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen activeUser = ActivityManagerNative.getDefault().getCurrentUser(); 7466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } catch (RemoteException re) { 7524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen activeUser = null; 7666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 7766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 7866b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 7966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUm.getUsers()); 8024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen Collections.sort(users, mOrderAddedComparator); 8124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 8266b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen for (UserInfo user: users) { 8324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen KeyguardMultiUserAvatar uv = createAndAddUser(user); 8424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen if (user.id == activeUser.id) { 8524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mActiveUserAvatar = uv; 8666b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 8766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 8824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mActiveUserAvatar.setActive(true, false, 0, null); 8966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 9066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 9124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen Comparator<UserInfo> mOrderAddedComparator = new Comparator<UserInfo>() { 9224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 9324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public int compare(UserInfo lhs, UserInfo rhs) { 9424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen return (lhs.serialNumber - rhs.serialNumber); 9524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 9624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen }; 9766b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen 9824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen private KeyguardMultiUserAvatar createAndAddUser(UserInfo user) { 9966b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen KeyguardMultiUserAvatar uv = KeyguardMultiUserAvatar.fromXml( 10066b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen R.layout.keyguard_multi_user_avatar, mContext, this, user); 10124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mUsersGrid.addView(uv); 10224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen return uv; 10324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 10424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen 10524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 10624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void onClick(View v) { 10724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen if (!(v instanceof KeyguardMultiUserAvatar)) return; 10824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen final KeyguardMultiUserAvatar avatar = (KeyguardMultiUserAvatar) v; 10924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen if (mActiveUserAvatar == avatar) { 11024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen // They clicked the active user, no need to do anything 11124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen return; 11224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } else { 11324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen // Reset the previously active user to appear inactive 11424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen avatar.lockDrawableState(); 11524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mCallback.hideSecurityView(FADE_OUT_ANIMATION_DURATION); 11624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mActiveUserAvatar.setActive(false, true, SWITCH_ANIMATION_DURATION, new Runnable() { 11724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen @Override 11824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen public void run() { 11924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen try { 12024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen ActivityManagerNative.getDefault().switchUser(avatar.getUserInfo().id); 12124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen WindowManagerGlobal.getWindowManagerService().lockNow(); 12224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen // Set the new active user, and make it appear active 12324b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen avatar.resetDrawableState(); 12424b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mCallback.showSecurityView(); 12524b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mActiveUserAvatar = avatar; 12624b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen mActiveUserAvatar.setActive(true, false, 0, null); 12724b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } catch (RemoteException re) { 12824b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen Log.e(TAG, "Couldn't switch user " + re); 12924b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 13024b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 13124b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen }); 13224b351ab748cf1b2e41d106508604ba09f62d859Adam Cohen } 13366b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen } 13466b9fb1662b304d24984af1ac4cc02f2ae8f4cc3Adam Cohen} 135