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