1 /* 2 * Copyright (C) 2022 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.users; 18 19 import static com.android.systemui.car.users.CarSystemUIUserUtil.isMUMDSystemUI; 20 21 import android.app.ActivityManager; 22 import android.app.IActivityManager; 23 import android.content.Context; 24 import android.hardware.display.DisplayManager; 25 import android.os.Handler; 26 import android.os.Process; 27 import android.os.UserHandle; 28 import android.os.UserManager; 29 30 import com.android.systemui.CoreStartable; 31 import com.android.systemui.InitController; 32 import com.android.systemui.car.CarServiceProvider; 33 import com.android.systemui.dagger.SysUISingleton; 34 import com.android.systemui.dagger.qualifiers.Application; 35 import com.android.systemui.dagger.qualifiers.Background; 36 import com.android.systemui.dump.DumpManager; 37 import com.android.systemui.flags.FeatureFlagsClassic; 38 import com.android.systemui.settings.DisplayTracker; 39 import com.android.systemui.settings.DisplayTrackerImpl; 40 import com.android.systemui.settings.UserContentResolverProvider; 41 import com.android.systemui.settings.UserContextProvider; 42 import com.android.systemui.settings.UserFileManager; 43 import com.android.systemui.settings.UserFileManagerImpl; 44 import com.android.systemui.settings.UserTracker; 45 46 import dagger.Binds; 47 import dagger.Lazy; 48 import dagger.Module; 49 import dagger.Provides; 50 import dagger.multibindings.ClassKey; 51 import dagger.multibindings.IntoMap; 52 53 import kotlinx.coroutines.CoroutineDispatcher; 54 import kotlinx.coroutines.CoroutineScope; 55 56 import javax.inject.Provider; 57 58 /** 59 * Car-specific dagger Module for classes found within the com.android.systemui.settings package. 60 */ 61 @Module 62 public abstract class CarMultiUserUtilsModule { 63 @Binds 64 @SysUISingleton bindUserContextProvider(UserTracker tracker)65 abstract UserContextProvider bindUserContextProvider(UserTracker tracker); 66 67 @Binds 68 @SysUISingleton bindUserContentResolverProvider( UserTracker tracker)69 abstract UserContentResolverProvider bindUserContentResolverProvider( 70 UserTracker tracker); 71 72 @SysUISingleton 73 @Provides provideUserTracker( Context context, Provider<FeatureFlagsClassic> featureFlagsProvider, UserManager userManager, IActivityManager iActivityManager, DumpManager dumpManager, @Application CoroutineScope appScope, @Background CoroutineDispatcher backgroundDispatcher, @Background Handler handler, CarServiceProvider carServiceProvider, InitController initController )74 static UserTracker provideUserTracker( 75 Context context, 76 Provider<FeatureFlagsClassic> featureFlagsProvider, 77 UserManager userManager, 78 IActivityManager iActivityManager, 79 DumpManager dumpManager, 80 @Application CoroutineScope appScope, 81 @Background CoroutineDispatcher backgroundDispatcher, 82 @Background Handler handler, 83 CarServiceProvider carServiceProvider, 84 InitController initController 85 ) { 86 if (CarSystemUIUserUtil.isMUPANDSystemUI()) { 87 CarMUPANDUserTrackerImpl mupandTracker = new CarMUPANDUserTrackerImpl(context, 88 featureFlagsProvider, userManager, iActivityManager, dumpManager, appScope, 89 backgroundDispatcher, handler, carServiceProvider, initController); 90 mupandTracker.initialize(ActivityManager.getCurrentUser()); 91 return mupandTracker; 92 } 93 UserHandle processUser = Process.myUserHandle(); 94 boolean isSecondaryUserSystemUI = 95 CarSystemUIUserUtil.isSecondaryMUMDSystemUI(); 96 int startingUser = isSecondaryUserSystemUI 97 ? processUser.getIdentifier() 98 : ActivityManager.getCurrentUser(); 99 CarUserTrackerImpl tracker = new CarUserTrackerImpl(context, featureFlagsProvider, 100 userManager, iActivityManager, dumpManager, appScope, backgroundDispatcher, 101 handler, isSecondaryUserSystemUI); 102 tracker.initialize(startingUser); 103 return tracker; 104 } 105 106 @SysUISingleton 107 @Provides provideDisplayTracker( Lazy<DisplayTrackerImpl> defaultImpl, Context context, UserTracker userTracker, CarServiceProvider carServiceProvider, @Background Handler handler )108 static DisplayTracker provideDisplayTracker( 109 Lazy<DisplayTrackerImpl> defaultImpl, 110 Context context, 111 UserTracker userTracker, 112 CarServiceProvider carServiceProvider, 113 @Background Handler handler 114 ) { 115 if (!isMUMDSystemUI()) { 116 return defaultImpl.get(); 117 } 118 return new CarMUMDDisplayTrackerImpl(context, userTracker, carServiceProvider, handler); 119 } 120 121 @SysUISingleton 122 @Provides provideDefaultDisplayTrackerImpl(DisplayManager displayManager, @Background Handler handler)123 static DisplayTrackerImpl provideDefaultDisplayTrackerImpl(DisplayManager displayManager, 124 @Background Handler handler) { 125 return new DisplayTrackerImpl(displayManager, handler); 126 } 127 128 @Binds 129 @IntoMap 130 @ClassKey(UserFileManagerImpl.class) bindUserFileManagerCoreStartable(UserFileManagerImpl sysui)131 abstract CoreStartable bindUserFileManagerCoreStartable(UserFileManagerImpl sysui); 132 133 @Binds bindUserFileManager(UserFileManagerImpl impl)134 abstract UserFileManager bindUserFileManager(UserFileManagerImpl impl); 135 136 @Binds 137 @IntoMap 138 @ClassKey(CarProfileIconUpdater.class) bindCarProfileIconUpdaterStartable(CarProfileIconUpdater iconUpdater)139 abstract CoreStartable bindCarProfileIconUpdaterStartable(CarProfileIconUpdater iconUpdater); 140 } 141