1 /* 2 * Copyright (C) 2021 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 static com.android.systemui.DejankUtils.whitelistIpcs; 20 21 import android.os.UserManager; 22 import android.view.View; 23 import android.view.ViewGroup; 24 25 import com.android.systemui.R; 26 import com.android.systemui.plugins.FalsingManager; 27 import com.android.systemui.plugins.qs.DetailAdapter; 28 import com.android.systemui.qs.QSDetailDisplayer; 29 import com.android.systemui.qs.dagger.QSScope; 30 import com.android.systemui.statusbar.policy.UserSwitcherController; 31 import com.android.systemui.util.ViewController; 32 33 import javax.inject.Inject; 34 35 /** View Controller for {@link MultiUserSwitch}. */ 36 @QSScope 37 public class MultiUserSwitchController extends ViewController<MultiUserSwitch> { 38 private final UserManager mUserManager; 39 private final UserSwitcherController mUserSwitcherController; 40 private final QSDetailDisplayer mQsDetailDisplayer; 41 private final FalsingManager mFalsingManager; 42 43 private UserSwitcherController.BaseUserAdapter mUserListener; 44 45 private final View.OnClickListener mOnClickListener = new View.OnClickListener() { 46 @Override 47 public void onClick(View v) { 48 if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { 49 return; 50 } 51 52 View center = mView.getChildCount() > 0 ? mView.getChildAt(0) : mView; 53 54 int[] tmpInt = new int[2]; 55 center.getLocationInWindow(tmpInt); 56 tmpInt[0] += center.getWidth() / 2; 57 tmpInt[1] += center.getHeight() / 2; 58 59 mQsDetailDisplayer.showDetailAdapter(getUserDetailAdapter(), tmpInt[0], tmpInt[1]); 60 } 61 }; 62 63 @Inject MultiUserSwitchController(MultiUserSwitch view, UserManager userManager, UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer, FalsingManager falsingManager)64 public MultiUserSwitchController(MultiUserSwitch view, UserManager userManager, 65 UserSwitcherController userSwitcherController, QSDetailDisplayer qsDetailDisplayer, 66 FalsingManager falsingManager) { 67 super(view); 68 mUserManager = userManager; 69 mUserSwitcherController = userSwitcherController; 70 mQsDetailDisplayer = qsDetailDisplayer; 71 mFalsingManager = falsingManager; 72 } 73 74 @Override onInit()75 protected void onInit() { 76 registerListener(); 77 mView.refreshContentDescription(getCurrentUser()); 78 } 79 80 @Override onViewAttached()81 protected void onViewAttached() { 82 mView.setOnClickListener(mOnClickListener); 83 } 84 85 @Override onViewDetached()86 protected void onViewDetached() { 87 mView.setOnClickListener(null); 88 } 89 getUserDetailAdapter()90 protected DetailAdapter getUserDetailAdapter() { 91 return mUserSwitcherController.mUserDetailAdapter; 92 } 93 registerListener()94 private void registerListener() { 95 if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) { 96 97 final UserSwitcherController controller = mUserSwitcherController; 98 if (controller != null) { 99 mUserListener = new UserSwitcherController.BaseUserAdapter(controller) { 100 @Override 101 public void notifyDataSetChanged() { 102 mView.refreshContentDescription(getCurrentUser()); 103 } 104 105 @Override 106 public View getView(int position, View convertView, ViewGroup parent) { 107 return null; 108 } 109 }; 110 mView.refreshContentDescription(getCurrentUser()); 111 } 112 } 113 } 114 getCurrentUser()115 private String getCurrentUser() { 116 // TODO(b/138661450) 117 if (whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled())) { 118 return mUserSwitcherController.getCurrentUserName(); 119 } 120 121 return null; 122 } 123 124 /** Returns true if view should be made visible. */ isMultiUserEnabled()125 public boolean isMultiUserEnabled() { 126 // TODO(b/138661450) Move IPC calls to background 127 return whitelistIpcs(() -> mUserManager.isUserSwitcherEnabled( 128 getResources().getBoolean(R.bool.qs_show_user_switcher_for_single_user))); 129 } 130 131 } 132