• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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.car.statusbar;
18 
19 import android.car.Car;
20 import android.car.user.CarUserManager;
21 import android.content.BroadcastReceiver;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.content.pm.UserInfo;
26 import android.os.UserHandle;
27 import android.os.UserManager;
28 import android.util.Log;
29 import android.view.View;
30 import android.widget.TextView;
31 
32 import com.android.systemui.R;
33 import com.android.systemui.broadcast.BroadcastDispatcher;
34 import com.android.systemui.car.CarDeviceProvisionedController;
35 import com.android.systemui.car.CarServiceProvider;
36 import com.android.systemui.dagger.SysUISingleton;
37 
38 import javax.inject.Inject;
39 
40 /**
41  * Controls a TextView with the current driver's username
42  */
43 @SysUISingleton
44 public class UserNameViewController {
45     private static final String TAG = "UserNameViewController";
46 
47     private Context mContext;
48     private UserManager mUserManager;
49     private CarUserManager mCarUserManager;
50     private CarServiceProvider mCarServiceProvider;
51     private CarDeviceProvisionedController mCarDeviceProvisionedController;
52     private BroadcastDispatcher mBroadcastDispatcher;
53     private TextView mUserNameView;
54 
55     private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() {
56         @Override
57         public void onReceive(Context context, Intent intent) {
58             updateUser(mCarDeviceProvisionedController.getCurrentUser());
59         }
60     };
61 
62     private boolean mUserLifecycleListenerRegistered = false;
63 
64     private final CarUserManager.UserLifecycleListener mUserLifecycleListener =
65             new CarUserManager.UserLifecycleListener() {
66                 @Override
67                 public void onEvent(CarUserManager.UserLifecycleEvent event) {
68                     if (event.getEventType()
69                             == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
70                         updateUser(event.getUserId());
71                     }
72                 }
73             };
74 
75     @Inject
UserNameViewController(Context context, CarServiceProvider carServiceProvider, UserManager userManager, BroadcastDispatcher broadcastDispatcher, CarDeviceProvisionedController carDeviceProvisionedController)76     public UserNameViewController(Context context, CarServiceProvider carServiceProvider,
77             UserManager userManager, BroadcastDispatcher broadcastDispatcher,
78             CarDeviceProvisionedController carDeviceProvisionedController) {
79         mContext = context;
80         mCarServiceProvider = carServiceProvider;
81         mUserManager = userManager;
82         mBroadcastDispatcher = broadcastDispatcher;
83         mCarDeviceProvisionedController = carDeviceProvisionedController;
84     }
85 
86     /**
87      * Find the {@link TextView} for the driver's user name from a view and if found set it with the
88      * current driver's user name.
89      */
addUserNameView(View v)90     public void addUserNameView(View v) {
91         TextView userNameView = v.findViewById(R.id.user_name_text);
92         if (userNameView != null) {
93             if (mUserNameView == null) {
94                 registerForUserChangeEvents();
95             }
96             mUserNameView = userNameView;
97             updateUser(mCarDeviceProvisionedController.getCurrentUser());
98         }
99     }
100 
101     /**
102      * Clean up the controller and unregister receiver.
103      */
removeAll()104     public void removeAll() {
105         mUserNameView = null;
106         if (mUserLifecycleListenerRegistered) {
107             mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver);
108             if (mCarUserManager != null) {
109                 mCarUserManager.removeListener(mUserLifecycleListener);
110             }
111             mUserLifecycleListenerRegistered = false;
112         }
113     }
114 
registerForUserChangeEvents()115     private void registerForUserChangeEvents() {
116         // Register for user switching
117         mCarServiceProvider.addListener(car -> {
118             mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
119             if (mCarUserManager != null && !mUserLifecycleListenerRegistered) {
120                 mCarUserManager.addListener(Runnable::run, mUserLifecycleListener);
121                 mUserLifecycleListenerRegistered = true;
122             } else {
123                 Log.e(TAG, "CarUserManager could not be obtained.");
124             }
125         });
126         // Also register for user info changing
127         IntentFilter filter = new IntentFilter();
128         filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
129         mBroadcastDispatcher.registerReceiver(mUserUpdateReceiver, filter, /* executor= */ null,
130                 UserHandle.ALL);
131     }
132 
updateUser(int userId)133     private void updateUser(int userId) {
134         if (mUserNameView != null) {
135             UserInfo currentUserInfo = mUserManager.getUserInfo(userId);
136             mUserNameView.setText(currentUserInfo.name);
137         }
138     }
139 }
140