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