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