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