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