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 17 package com.android.systemui.statusbar.phone; 18 19 import android.content.Context; 20 import android.content.Intent; 21 import android.os.UserHandle; 22 import android.os.UserManager; 23 import android.provider.ContactsContract; 24 import android.text.TextUtils; 25 import android.util.AttributeSet; 26 import android.view.View; 27 import android.view.ViewGroup; 28 import android.view.accessibility.AccessibilityEvent; 29 import android.view.accessibility.AccessibilityNodeInfo; 30 import android.widget.Button; 31 import android.widget.FrameLayout; 32 33 import com.android.systemui.R; 34 import com.android.systemui.qs.QSPanel; 35 import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; 36 import com.android.systemui.statusbar.policy.UserSwitcherController; 37 38 /** 39 * Container for image of the multi user switcher (tappable). 40 */ 41 public class MultiUserSwitch extends FrameLayout implements View.OnClickListener { 42 43 private QSPanel mQsPanel; 44 private KeyguardUserSwitcher mKeyguardUserSwitcher; 45 private boolean mKeyguardMode; 46 private UserSwitcherController.BaseUserAdapter mUserListener; 47 48 final UserManager mUserManager; 49 50 private final int[] mTmpInt2 = new int[2]; 51 52 private UserSwitcherController mUserSwitcherController; 53 54 public MultiUserSwitch(Context context, AttributeSet attrs) { 55 super(context, attrs); 56 mUserManager = UserManager.get(getContext()); 57 } 58 59 @Override 60 protected void onFinishInflate() { 61 super.onFinishInflate(); 62 setOnClickListener(this); 63 refreshContentDescription(); 64 } 65 66 public void setQsPanel(QSPanel qsPanel) { 67 mQsPanel = qsPanel; 68 setUserSwitcherController(qsPanel.getHost().getUserSwitcherController()); 69 } 70 71 public boolean hasMultipleUsers() { 72 if (mUserListener == null) { 73 return false; 74 } 75 return mUserListener.getCount() != 0; 76 } 77 78 public void setUserSwitcherController(UserSwitcherController userSwitcherController) { 79 mUserSwitcherController = userSwitcherController; 80 registerListener(); 81 refreshContentDescription(); 82 } 83 84 public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) { 85 mKeyguardUserSwitcher = keyguardUserSwitcher; 86 } 87 88 public void setKeyguardMode(boolean keyguardShowing) { 89 mKeyguardMode = keyguardShowing; 90 registerListener(); 91 } 92 93 private void registerListener() { 94 if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) { 95 96 final UserSwitcherController controller = mUserSwitcherController; 97 if (controller != null) { 98 mUserListener = new UserSwitcherController.BaseUserAdapter(controller) { 99 @Override 100 public void notifyDataSetChanged() { 101 refreshContentDescription(); 102 } 103 104 @Override 105 public View getView(int position, View convertView, ViewGroup parent) { 106 return null; 107 } 108 }; 109 refreshContentDescription(); 110 } 111 } 112 } 113 114 @Override 115 public void onClick(View v) { 116 if (mUserManager.isUserSwitcherEnabled()) { 117 if (mKeyguardMode) { 118 if (mKeyguardUserSwitcher != null) { 119 mKeyguardUserSwitcher.show(true /* animate */); 120 } 121 } else if (mQsPanel != null && mUserSwitcherController != null) { 122 View center = getChildCount() > 0 ? getChildAt(0) : this; 123 124 center.getLocationInWindow(mTmpInt2); 125 mTmpInt2[0] += center.getWidth() / 2; 126 mTmpInt2[1] += center.getHeight() / 2; 127 128 mQsPanel.showDetailAdapter(true, 129 mUserSwitcherController.userDetailAdapter, 130 mTmpInt2); 131 } 132 } else { 133 if (mQsPanel != null) { 134 Intent intent = ContactsContract.QuickContact.composeQuickContactsIntent( 135 getContext(), v, ContactsContract.Profile.CONTENT_URI, 136 ContactsContract.QuickContact.MODE_LARGE, null); 137 mQsPanel.getHost().startActivityDismissingKeyguard(intent); 138 } 139 } 140 } 141 142 @Override 143 public void setClickable(boolean clickable) { 144 super.setClickable(clickable); 145 refreshContentDescription(); 146 } 147 148 private void refreshContentDescription() { 149 String currentUser = null; 150 if (mUserManager.isUserSwitcherEnabled() 151 && mUserSwitcherController != null) { 152 currentUser = mUserSwitcherController.getCurrentUserName(mContext); 153 } 154 155 String text = null; 156 157 if (!TextUtils.isEmpty(currentUser)) { 158 text = mContext.getString( 159 R.string.accessibility_quick_settings_user, 160 currentUser); 161 } 162 163 if (!TextUtils.equals(getContentDescription(), text)) { 164 setContentDescription(text); 165 } 166 } 167 168 @Override 169 public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 170 super.onInitializeAccessibilityEvent(event); 171 event.setClassName(Button.class.getName()); 172 } 173 174 @Override 175 public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 176 super.onInitializeAccessibilityNodeInfo(info); 177 info.setClassName(Button.class.getName()); 178 } 179 180 @Override 181 public boolean hasOverlappingRendering() { 182 return false; 183 } 184 185 } 186