• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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