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.userswitcher;
18 
19 import android.app.ActivityManager;
20 import android.car.Car;
21 import android.car.user.CarUserManager;
22 import android.util.Log;
23 
24 import com.android.internal.annotations.VisibleForTesting;
25 import com.android.systemui.car.CarServiceProvider;
26 import com.android.systemui.car.window.OverlayViewMediator;
27 
28 import javax.inject.Inject;
29 
30 /**
31  * Registers listeners that subscribe to events that show or hide CarUserSwitchingDialog that is
32  * mounted to SystemUiOverlayWindow.
33  */
34 public class UserSwitchTransitionViewMediator implements OverlayViewMediator,
35         CarUserManager.UserSwitchUiCallback {
36     private static final String TAG = "UserSwitchTransitionViewMediator";
37 
38     private final CarServiceProvider mCarServiceProvider;
39     private final UserSwitchTransitionViewController mUserSwitchTransitionViewController;
40 
41     @Inject
UserSwitchTransitionViewMediator( CarServiceProvider carServiceProvider, UserSwitchTransitionViewController userSwitchTransitionViewController)42     public UserSwitchTransitionViewMediator(
43             CarServiceProvider carServiceProvider,
44             UserSwitchTransitionViewController userSwitchTransitionViewController) {
45         mCarServiceProvider = carServiceProvider;
46         mUserSwitchTransitionViewController = userSwitchTransitionViewController;
47     }
48 
49     @Override
registerListeners()50     public void registerListeners() {
51         mCarServiceProvider.addListener(car -> {
52             CarUserManager carUserManager =
53                     (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE);
54 
55             if (carUserManager != null) {
56                 carUserManager.setUserSwitchUiCallback(this);
57                 carUserManager.addListener(Runnable::run, this::handleUserLifecycleEvent);
58             } else {
59                 Log.e(TAG, "registerListeners: CarUserManager could not be obtained.");
60             }
61         });
62     }
63 
64     @Override
setupOverlayContentViewControllers()65     public void setupOverlayContentViewControllers() {
66         // no-op.
67     }
68 
69     @Override
showUserSwitchDialog(int userId)70     public void showUserSwitchDialog(int userId) {
71         mUserSwitchTransitionViewController.handleShow(userId);
72     }
73 
74     @VisibleForTesting
handleUserLifecycleEvent(CarUserManager.UserLifecycleEvent event)75     void handleUserLifecycleEvent(CarUserManager.UserLifecycleEvent event) {
76         if (event.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_STARTING
77                 && ActivityManager.getCurrentUser() == event.getUserId()) {
78             mUserSwitchTransitionViewController.handleShow(event.getUserId());
79         }
80 
81         if (event.getEventType() == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
82             mUserSwitchTransitionViewController.handleHide();
83         }
84     }
85 }
86