18ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos/*
28ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * Copyright (C) 2014 The Android Open Source Project
38ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos *
48ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * Licensed under the Apache License, Version 2.0 (the "License");
58ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * you may not use this file except in compliance with the License.
68ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * You may obtain a copy of the License at
78ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos *
88ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos *      http://www.apache.org/licenses/LICENSE-2.0
98ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos *
108ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * Unless required by applicable law or agreed to in writing, software
118ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * distributed under the License is distributed on an "AS IS" BASIS,
128ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * See the License for the specific language governing permissions and
148ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * limitations under the License
158ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos */
168ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
178ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roospackage com.android.systemui.statusbar.policy;
188ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
1998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggiimport android.animation.Animator;
2098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggiimport android.animation.AnimatorListenerAdapter;
2198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggiimport android.animation.ObjectAnimator;
228ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roosimport android.content.Context;
23723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roosimport android.database.DataSetObserver;
242d1ef3012c98c07877816f3587514cca98609550Adrian Roosimport android.util.AttributeSet;
258ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roosimport android.view.LayoutInflater;
262d1ef3012c98c07877816f3587514cca98609550Adrian Roosimport android.view.MotionEvent;
278ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roosimport android.view.View;
288ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roosimport android.view.ViewGroup;
298ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roosimport android.view.ViewStub;
302d1ef3012c98c07877816f3587514cca98609550Adrian Roosimport android.widget.FrameLayout;
318ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
325673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.AppearAnimationUtils;
339c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monkimport com.android.systemui.Dependency;
34c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport com.android.systemui.Interpolators;
354538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggiimport com.android.systemui.R;
36ccdff62159b41ab130a8f90d30edb9b9542d8c72Adrian Roosimport com.android.systemui.qs.tiles.UserDetailItemView;
374538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggiimport com.android.systemui.statusbar.phone.KeyguardStatusBarView;
38bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggiimport com.android.systemui.statusbar.phone.NotificationPanelView;
394538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggi
408ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos/**
418ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos * Manages the user switcher on the Keyguard.
428ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos */
43723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roospublic class KeyguardUserSwitcher {
448ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
458ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    private static final String TAG = "KeyguardUserSwitcher";
46723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos    private static final boolean ALWAYS_ON = false;
478ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
482d1ef3012c98c07877816f3587514cca98609550Adrian Roos    private final Container mUserSwitcherContainer;
494538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggi    private final KeyguardStatusBarView mStatusBarView;
50723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos    private final Adapter mAdapter;
5198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private final AppearAnimationUtils mAppearAnimationUtils;
5298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private final KeyguardUserSwitcherScrim mBackground;
53d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos
54d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos    private ViewGroup mUserSwitcher;
5598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private ObjectAnimator mBgAnimator;
566becbe732a987b8adb8348e9486c6abe96e3c201Jason Monk    private UserSwitcherController mUserSwitcherController;
572d1ef3012c98c07877816f3587514cca98609550Adrian Roos    private boolean mAnimating;
588ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
598ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    public KeyguardUserSwitcher(Context context, ViewStub userSwitcher,
609c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk            KeyguardStatusBarView statusBarView, NotificationPanelView panelView) {
612b154a9ec32915fe4a0dbc648344586fb5fa0261Adrian Roos        boolean keyguardUserSwitcherEnabled =
622b154a9ec32915fe4a0dbc648344586fb5fa0261Adrian Roos                context.getResources().getBoolean(R.bool.config_keyguardUserSwitcher) || ALWAYS_ON;
639c7844cb91b43929d0a86b1c90aa1efb37f5463aJason Monk        UserSwitcherController userSwitcherController = Dependency.get(UserSwitcherController.class);
642b154a9ec32915fe4a0dbc648344586fb5fa0261Adrian Roos        if (userSwitcherController != null && keyguardUserSwitcherEnabled) {
652d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mUserSwitcherContainer = (Container) userSwitcher.inflate();
66d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos            mBackground = new KeyguardUserSwitcherScrim(context);
67d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos            reinflateViews();
684538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggi            mStatusBarView = statusBarView;
694538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggi            mStatusBarView.setKeyguardUserSwitcher(this);
70bf1899e64c0fbb0fa211d883134012299fe79f41Jorim Jaggi            panelView.setKeyguardUserSwitcher(this);
712d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mAdapter = new Adapter(context, userSwitcherController, this);
72723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            mAdapter.registerDataSetObserver(mDataSetObserver);
736becbe732a987b8adb8348e9486c6abe96e3c201Jason Monk            mUserSwitcherController = userSwitcherController;
7498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mAppearAnimationUtils = new AppearAnimationUtils(context, 400, -0.5f, 0.5f,
75c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                    Interpolators.FAST_OUT_SLOW_IN);
762d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mUserSwitcherContainer.setKeyguardUserSwitcher(this);
778ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        } else {
782d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mUserSwitcherContainer = null;
794538027dedbe7ebfc884ca35d20522a2a21a42d4Jorim Jaggi            mStatusBarView = null;
80723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            mAdapter = null;
8198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mAppearAnimationUtils = null;
8298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mBackground = null;
838ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
848ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
858ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
86d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos    private void reinflateViews() {
87d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        if (mUserSwitcher != null) {
88d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos            mUserSwitcher.setBackground(null);
89d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos            mUserSwitcher.removeOnLayoutChangeListener(mBackground);
90d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        }
91d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        mUserSwitcherContainer.removeAllViews();
92d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos
93d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        LayoutInflater.from(mUserSwitcherContainer.getContext())
94d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos                .inflate(R.layout.keyguard_user_switcher_inner, mUserSwitcherContainer);
95d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos
96d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        mUserSwitcher = (ViewGroup) mUserSwitcherContainer.findViewById(
97d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos                R.id.keyguard_user_switcher_inner);
98d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        mUserSwitcher.addOnLayoutChangeListener(mBackground);
99d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        mUserSwitcher.setBackground(mBackground);
100d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos    }
101d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos
10298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    public void setKeyguard(boolean keyguard, boolean animate) {
1038ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        if (mUserSwitcher != null) {
104723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            if (keyguard && shouldExpandByDefault()) {
10598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                show(animate);
1068ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos            } else {
10798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                hide(animate);
1088ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos            }
1098ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
1108ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
1118ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
1128ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    /**
113723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos     * @return true if the user switcher should be expanded by default on the lock screen.
1148ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos     * @see android.os.UserManager#isUserSwitcherEnabled()
1158ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos     */
116723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos    private boolean shouldExpandByDefault() {
1176becbe732a987b8adb8348e9486c6abe96e3c201Jason Monk        return (mUserSwitcherController != null) && mUserSwitcherController.isSimpleUserSwitcher();
1188ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
1198ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
12098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    public void show(boolean animate) {
1212d1ef3012c98c07877816f3587514cca98609550Adrian Roos        if (mUserSwitcher != null && mUserSwitcherContainer.getVisibility() != View.VISIBLE) {
12298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            cancelAnimations();
123844c92b444dca7f5ef4d0943fb14e2cbeee49701Adrian Roos            mAdapter.refresh();
1242d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mUserSwitcherContainer.setVisibility(View.VISIBLE);
12598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mStatusBarView.setKeyguardUserSwitcherShowing(true, animate);
12698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            if (animate) {
12798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                startAppearAnimation();
12898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            }
1298ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
1308ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
1318ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
1323a8c35e33820ac258958ba4b4d88e1ad22a302aeVadim Tryshev    private boolean hide(boolean animate) {
1332d1ef3012c98c07877816f3587514cca98609550Adrian Roos        if (mUserSwitcher != null && mUserSwitcherContainer.getVisibility() == View.VISIBLE) {
13498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            cancelAnimations();
13598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            if (animate) {
13698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                startDisappearAnimation();
13798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            } else {
1382d1ef3012c98c07877816f3587514cca98609550Adrian Roos                mUserSwitcherContainer.setVisibility(View.GONE);
13998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            }
14098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mStatusBarView.setKeyguardUserSwitcherShowing(false, animate);
1413a8c35e33820ac258958ba4b4d88e1ad22a302aeVadim Tryshev            return true;
14298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        }
1433a8c35e33820ac258958ba4b4d88e1ad22a302aeVadim Tryshev        return false;
14498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    }
14598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi
14698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private void cancelAnimations() {
14798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        int count = mUserSwitcher.getChildCount();
14898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        for (int i = 0; i < count; i++) {
14998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mUserSwitcher.getChildAt(i).animate().cancel();
15098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        }
15198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        if (mBgAnimator != null) {
15298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            mBgAnimator.cancel();
1538ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
15498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mUserSwitcher.animate().cancel();
1552d1ef3012c98c07877816f3587514cca98609550Adrian Roos        mAnimating = false;
15698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    }
15798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi
15898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private void startAppearAnimation() {
15998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        int count = mUserSwitcher.getChildCount();
16098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        View[] objects = new View[count];
16198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        for (int i = 0; i < count; i++) {
16298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            objects[i] = mUserSwitcher.getChildAt(i);
16398f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        }
16498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mUserSwitcher.setClipChildren(false);
16598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mUserSwitcher.setClipToPadding(false);
166f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek        mAppearAnimationUtils.startAnimation(objects, new Runnable() {
16798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            @Override
16898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            public void run() {
16998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                mUserSwitcher.setClipChildren(true);
17098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                mUserSwitcher.setClipToPadding(true);
17198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            }
17298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        });
1732d1ef3012c98c07877816f3587514cca98609550Adrian Roos        mAnimating = true;
17498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mBgAnimator = ObjectAnimator.ofInt(mBackground, "alpha", 0, 255);
17598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mBgAnimator.setDuration(400);
176c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek        mBgAnimator.setInterpolator(Interpolators.ALPHA_IN);
17798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mBgAnimator.addListener(new AnimatorListenerAdapter() {
17898f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            @Override
17998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            public void onAnimationEnd(Animator animation) {
18098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                mBgAnimator = null;
1812d1ef3012c98c07877816f3587514cca98609550Adrian Roos                mAnimating = false;
18298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi            }
18398f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        });
18498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mBgAnimator.start();
18598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    }
18698f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi
18798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi    private void startDisappearAnimation() {
1882d1ef3012c98c07877816f3587514cca98609550Adrian Roos        mAnimating = true;
18998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi        mUserSwitcher.animate()
19098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                .alpha(0f)
19198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                .setDuration(300)
192c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                .setInterpolator(Interpolators.ALPHA_OUT)
19398f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                .withEndAction(new Runnable() {
19498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                    @Override
19598f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                    public void run() {
1962d1ef3012c98c07877816f3587514cca98609550Adrian Roos                        mUserSwitcherContainer.setVisibility(View.GONE);
19798f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                        mUserSwitcher.setAlpha(1f);
1982d1ef3012c98c07877816f3587514cca98609550Adrian Roos                        mAnimating = false;
19998f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                    }
20098f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi                });
2018ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
2028ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
2038ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    private void refresh() {
204723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        final int childCount = mUserSwitcher.getChildCount();
205723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        final int adapterCount = mAdapter.getCount();
206723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        final int N = Math.max(childCount, adapterCount);
207723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        for (int i = 0; i < N; i++) {
208723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            if (i < adapterCount) {
209723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                View oldView = null;
210723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                if (i < childCount) {
211723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    oldView = mUserSwitcher.getChildAt(i);
2128ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos                }
213723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                View newView = mAdapter.getView(i, oldView, mUserSwitcher);
214723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                if (oldView == null) {
215723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    // We ran out of existing views. Add it at the end.
216723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    mUserSwitcher.addView(newView);
217723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                } else if (oldView != newView) {
218723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    // We couldn't rebind the view. Replace it.
219723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    mUserSwitcher.removeViewAt(i);
220723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    mUserSwitcher.addView(newView, i);
2218ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos                }
222723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            } else {
223723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                int lastIndex = mUserSwitcher.getChildCount() - 1;
224723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                mUserSwitcher.removeViewAt(lastIndex);
225723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            }
2268ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
2278ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
2288ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
2293a8c35e33820ac258958ba4b4d88e1ad22a302aeVadim Tryshev    public boolean hideIfNotSimple(boolean animate) {
2302d1ef3012c98c07877816f3587514cca98609550Adrian Roos        if (mUserSwitcherContainer != null && !mUserSwitcherController.isSimpleUserSwitcher()) {
2313a8c35e33820ac258958ba4b4d88e1ad22a302aeVadim Tryshev            return hide(animate);
2322d1ef3012c98c07877816f3587514cca98609550Adrian Roos        }
2333a8c35e33820ac258958ba4b4d88e1ad22a302aeVadim Tryshev        return false;
2342d1ef3012c98c07877816f3587514cca98609550Adrian Roos    }
2352d1ef3012c98c07877816f3587514cca98609550Adrian Roos
2362d1ef3012c98c07877816f3587514cca98609550Adrian Roos    boolean isAnimating() {
2372d1ef3012c98c07877816f3587514cca98609550Adrian Roos        return mAnimating;
2382d1ef3012c98c07877816f3587514cca98609550Adrian Roos    }
2392d1ef3012c98c07877816f3587514cca98609550Adrian Roos
240723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos    public final DataSetObserver mDataSetObserver = new DataSetObserver() {
241723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        @Override
242723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        public void onChanged() {
243723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            refresh();
2448ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
245723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos    };
2468ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
247d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos    public void onDensityOrFontScaleChanged() {
248d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        if (mUserSwitcherContainer != null) {
249d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos            reinflateViews();
250d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos            refresh();
251d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos        }
252d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos    }
253d390b893eafae634844d7b8b84efaa7baa199119Adrian Roos
254723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos    public static class Adapter extends UserSwitcherController.BaseUserAdapter implements
255723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            View.OnClickListener {
2568ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
257723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        private Context mContext;
2582d1ef3012c98c07877816f3587514cca98609550Adrian Roos        private KeyguardUserSwitcher mKeyguardUserSwitcher;
2598ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
2602d1ef3012c98c07877816f3587514cca98609550Adrian Roos        public Adapter(Context context, UserSwitcherController controller,
2612d1ef3012c98c07877816f3587514cca98609550Adrian Roos                KeyguardUserSwitcher kgu) {
262723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            super(controller);
263723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            mContext = context;
2642d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mKeyguardUserSwitcher = kgu;
2658ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
266723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos
267723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        @Override
268723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        public View getView(int position, View convertView, ViewGroup parent) {
269723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            UserSwitcherController.UserRecord item = getItem(position);
270ccdff62159b41ab130a8f90d30edb9b9542d8c72Adrian Roos            if (!(convertView instanceof UserDetailItemView)
271723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                    || !(convertView.getTag() instanceof UserSwitcherController.UserRecord)) {
272723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                convertView = LayoutInflater.from(mContext).inflate(
273723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                        R.layout.keyguard_user_switcher_item, parent, false);
274723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos                convertView.setOnClickListener(this);
2758ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos            }
276ccdff62159b41ab130a8f90d30edb9b9542d8c72Adrian Roos            UserDetailItemView v = (UserDetailItemView) convertView;
2778ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
278ccdff62159b41ab130a8f90d30edb9b9542d8c72Adrian Roos            String name = getName(mContext, item);
279723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            if (item.picture == null) {
280aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky                v.bind(name, getDrawable(mContext, item).mutate(), item.resolveId());
281723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            } else {
282aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky                v.bind(name, item.picture, item.info.id);
28307140f7ffd56bf9d4946eba4e48b21a748125659Fyodor Kupolov            }
28407140f7ffd56bf9d4946eba4e48b21a748125659Fyodor Kupolov            // Disable the icon if switching is disabled
285aa7f51fe8c6e54485f0b5037c17777b4695d19e0Evan Rosky            v.setAvatarEnabled(item.isSwitchToEnabled);
286723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            convertView.setActivated(item.isCurrent);
287723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            convertView.setTag(item);
288723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos            return convertView;
289723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        }
2908ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos
291723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        @Override
292723632ea1ae30b33e9c2055194a4464f00c48c61Adrian Roos        public void onClick(View v) {
2932d1ef3012c98c07877816f3587514cca98609550Adrian Roos            UserSwitcherController.UserRecord user = (UserSwitcherController.UserRecord) v.getTag();
2942d1ef3012c98c07877816f3587514cca98609550Adrian Roos            if (user.isCurrent && !user.isGuest) {
2952d1ef3012c98c07877816f3587514cca98609550Adrian Roos                // Close the switcher if tapping the current user. Guest is excluded because
2962d1ef3012c98c07877816f3587514cca98609550Adrian Roos                // tapping the guest user while it's current clears the session.
2972d1ef3012c98c07877816f3587514cca98609550Adrian Roos                mKeyguardUserSwitcher.hideIfNotSimple(true /* animate */);
29807140f7ffd56bf9d4946eba4e48b21a748125659Fyodor Kupolov            } else if (user.isSwitchToEnabled) {
2992d1ef3012c98c07877816f3587514cca98609550Adrian Roos                switchTo(user);
3002d1ef3012c98c07877816f3587514cca98609550Adrian Roos            }
3012d1ef3012c98c07877816f3587514cca98609550Adrian Roos        }
3022d1ef3012c98c07877816f3587514cca98609550Adrian Roos    }
3032d1ef3012c98c07877816f3587514cca98609550Adrian Roos
3042d1ef3012c98c07877816f3587514cca98609550Adrian Roos    public static class Container extends FrameLayout {
3052d1ef3012c98c07877816f3587514cca98609550Adrian Roos
3062d1ef3012c98c07877816f3587514cca98609550Adrian Roos        private KeyguardUserSwitcher mKeyguardUserSwitcher;
3072d1ef3012c98c07877816f3587514cca98609550Adrian Roos
3082d1ef3012c98c07877816f3587514cca98609550Adrian Roos        public Container(Context context, AttributeSet attrs) {
3092d1ef3012c98c07877816f3587514cca98609550Adrian Roos            super(context, attrs);
3102d1ef3012c98c07877816f3587514cca98609550Adrian Roos            setClipChildren(false);
3112d1ef3012c98c07877816f3587514cca98609550Adrian Roos        }
3122d1ef3012c98c07877816f3587514cca98609550Adrian Roos
3132d1ef3012c98c07877816f3587514cca98609550Adrian Roos        public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
3142d1ef3012c98c07877816f3587514cca98609550Adrian Roos            mKeyguardUserSwitcher = keyguardUserSwitcher;
3152d1ef3012c98c07877816f3587514cca98609550Adrian Roos        }
3162d1ef3012c98c07877816f3587514cca98609550Adrian Roos
3172d1ef3012c98c07877816f3587514cca98609550Adrian Roos        @Override
3182d1ef3012c98c07877816f3587514cca98609550Adrian Roos        public boolean onTouchEvent(MotionEvent ev) {
3192d1ef3012c98c07877816f3587514cca98609550Adrian Roos            // Hide switcher if it didn't handle the touch event (and let the event go through).
3202d1ef3012c98c07877816f3587514cca98609550Adrian Roos            if (mKeyguardUserSwitcher != null && !mKeyguardUserSwitcher.isAnimating()) {
3212d1ef3012c98c07877816f3587514cca98609550Adrian Roos                mKeyguardUserSwitcher.hideIfNotSimple(true /* animate */);
3222d1ef3012c98c07877816f3587514cca98609550Adrian Roos            }
3232d1ef3012c98c07877816f3587514cca98609550Adrian Roos            return false;
3248ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos        }
3258ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos    }
3268ddb2da8759c29b3968b4d6bb9488f59a19f0ff2Adrian Roos}
327