MultiUserSwitch.java revision 84caab7bdb1dafb0d00773e26691c54edf729a5b
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License 15 */ 16 17package com.android.systemui.statusbar.phone; 18 19import android.content.Context; 20import android.content.Intent; 21import android.os.UserManager; 22import android.provider.ContactsContract; 23import android.text.TextUtils; 24import android.util.AttributeSet; 25import android.view.View; 26import android.view.ViewGroup; 27import android.view.accessibility.AccessibilityEvent; 28import android.view.accessibility.AccessibilityNodeInfo; 29import android.widget.Button; 30import android.widget.FrameLayout; 31 32import com.android.systemui.Dependency; 33import com.android.systemui.R; 34import com.android.systemui.plugins.ActivityStarter; 35import com.android.systemui.plugins.qs.DetailAdapter; 36import com.android.systemui.qs.QSPanel; 37import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; 38import com.android.systemui.statusbar.policy.UserSwitcherController; 39 40/** 41 * Container for image of the multi user switcher (tappable). 42 */ 43public class MultiUserSwitch extends FrameLayout implements View.OnClickListener { 44 45 protected QSPanel mQsPanel; 46 private KeyguardUserSwitcher mKeyguardUserSwitcher; 47 private boolean mKeyguardMode; 48 private UserSwitcherController.BaseUserAdapter mUserListener; 49 50 final UserManager mUserManager; 51 52 private final int[] mTmpInt2 = new int[2]; 53 54 protected UserSwitcherController mUserSwitcherController; 55 56 public MultiUserSwitch(Context context, AttributeSet attrs) { 57 super(context, attrs); 58 mUserManager = UserManager.get(getContext()); 59 } 60 61 @Override 62 protected void onFinishInflate() { 63 super.onFinishInflate(); 64 setOnClickListener(this); 65 refreshContentDescription(); 66 } 67 68 public void setQsPanel(QSPanel qsPanel) { 69 mQsPanel = qsPanel; 70 setUserSwitcherController(Dependency.get(UserSwitcherController.class)); 71 } 72 73 public boolean hasMultipleUsers() { 74 if (mUserListener == null) { 75 return false; 76 } 77 return mUserListener.getUserCount() != 0; 78 } 79 80 public void setUserSwitcherController(UserSwitcherController userSwitcherController) { 81 mUserSwitcherController = userSwitcherController; 82 registerListener(); 83 refreshContentDescription(); 84 } 85 86 public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) { 87 mKeyguardUserSwitcher = keyguardUserSwitcher; 88 } 89 90 public void setKeyguardMode(boolean keyguardShowing) { 91 mKeyguardMode = keyguardShowing; 92 registerListener(); 93 } 94 95 private void registerListener() { 96 if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) { 97 98 final UserSwitcherController controller = mUserSwitcherController; 99 if (controller != null) { 100 mUserListener = new UserSwitcherController.BaseUserAdapter(controller) { 101 @Override 102 public void notifyDataSetChanged() { 103 refreshContentDescription(); 104 } 105 106 @Override 107 public View getView(int position, View convertView, ViewGroup parent) { 108 return null; 109 } 110 }; 111 refreshContentDescription(); 112 } 113 } 114 } 115 116 @Override 117 public void onClick(View v) { 118 if (mUserManager.isUserSwitcherEnabled()) { 119 if (mKeyguardMode) { 120 if (mKeyguardUserSwitcher != null) { 121 mKeyguardUserSwitcher.show(true /* animate */); 122 } 123 } else if (mQsPanel != null && mUserSwitcherController != null) { 124 View center = getChildCount() > 0 ? getChildAt(0) : this; 125 126 center.getLocationInWindow(mTmpInt2); 127 mTmpInt2[0] += center.getWidth() / 2; 128 mTmpInt2[1] += center.getHeight() / 2; 129 130 mQsPanel.showDetailAdapter(true, 131 getUserDetailAdapter(), 132 mTmpInt2); 133 } 134 } else { 135 if (mQsPanel != null) { 136 Intent intent = ContactsContract.QuickContact.composeQuickContactsIntent( 137 getContext(), v, ContactsContract.Profile.CONTENT_URI, 138 ContactsContract.QuickContact.MODE_LARGE, null); 139 Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(intent, 0); 140 } 141 } 142 } 143 144 @Override 145 public void setClickable(boolean clickable) { 146 super.setClickable(clickable); 147 refreshContentDescription(); 148 } 149 150 private void refreshContentDescription() { 151 String currentUser = null; 152 if (mUserManager.isUserSwitcherEnabled() 153 && mUserSwitcherController != null) { 154 currentUser = mUserSwitcherController.getCurrentUserName(mContext); 155 } 156 157 String text = null; 158 159 if (!TextUtils.isEmpty(currentUser)) { 160 text = mContext.getString( 161 R.string.accessibility_quick_settings_user, 162 currentUser); 163 } 164 165 if (!TextUtils.equals(getContentDescription(), text)) { 166 setContentDescription(text); 167 } 168 } 169 170 @Override 171 public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 172 super.onInitializeAccessibilityEvent(event); 173 event.setClassName(Button.class.getName()); 174 } 175 176 @Override 177 public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 178 super.onInitializeAccessibilityNodeInfo(info); 179 info.setClassName(Button.class.getName()); 180 } 181 182 @Override 183 public boolean hasOverlappingRendering() { 184 return false; 185 } 186 187 protected DetailAdapter getUserDetailAdapter() { 188 return mUserSwitcherController.userDetailAdapter; 189 } 190} 191