diff options
Diffstat (limited to 'packages/CarSystemUI/src')
54 files changed, 996 insertions, 1081 deletions
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarGlobalRootComponent.java b/packages/CarSystemUI/src/com/android/systemui/CarGlobalRootComponent.java new file mode 100644 index 000000000000..b17ad0febb90 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/CarGlobalRootComponent.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import com.android.systemui.dagger.GlobalModule; +import com.android.systemui.dagger.GlobalRootComponent; +import com.android.systemui.dagger.WMModule; + +import javax.inject.Singleton; + +import dagger.Component; + +/** Car subclass for GlobalRootComponent. */ +@Singleton +@Component( + modules = { + GlobalModule.class, + CarSysUIComponentModule.class, + WMModule.class + }) +public interface CarGlobalRootComponent extends GlobalRootComponent { + /** + * Builder for a CarGlobalRootComponent. + */ + @Component.Builder + interface Builder extends GlobalRootComponent.Builder { + CarGlobalRootComponent build(); + } + + @Override + CarSysUIComponent.Builder getSysUIComponent(); +} diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponent.java b/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponent.java new file mode 100644 index 000000000000..51855dc648e9 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponent.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import com.android.systemui.dagger.DependencyProvider; +import com.android.systemui.dagger.SysUIComponent; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.SystemUIModule; + +import dagger.Subcomponent; + +/** + * Dagger Subcomponent for Core SysUI. + */ +@SysUISingleton +@Subcomponent(modules = { + CarComponentBinder.class, + DependencyProvider.class, + SystemUIModule.class, + CarSystemUIModule.class, + CarSystemUIBinder.class}) +public interface CarSysUIComponent extends SysUIComponent { + + /** + * Builder for a CarSysUIComponent. + */ + @Subcomponent.Builder + interface Builder extends SysUIComponent.Builder { + CarSysUIComponent build(); + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java new file mode 100644 index 000000000000..4de316693c10 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/CarSysUIComponentModule.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import dagger.Module; + +/** + * Dagger module for including the CarSysUIComponent. + * + * TODO(b/162923491): Remove or otherwise refactor this module. This is a stop gap. + */ +@Module(subcomponents = {CarSysUIComponent.class}) +public abstract class CarSysUIComponentModule { +} diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java index b3102e248ab2..3def945dd03c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java @@ -21,8 +21,6 @@ import com.android.systemui.bubbles.dagger.BubbleModule; import com.android.systemui.car.navigationbar.CarNavigationBar; import com.android.systemui.car.notification.CarNotificationModule; import com.android.systemui.car.sideloaded.SideLoadedAppController; -import com.android.systemui.car.statusbar.UnusedStatusBar; -import com.android.systemui.car.statusbar.UnusedStatusBarModule; import com.android.systemui.car.voicerecognition.ConnectedDeviceVoiceRecognitionNotifier; import com.android.systemui.car.volume.VolumeUI; import com.android.systemui.car.window.OverlayWindowModule; @@ -30,18 +28,18 @@ import com.android.systemui.car.window.SystemUIOverlayWindowManager; import com.android.systemui.globalactions.GlobalActionsComponent; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.dagger.KeyguardModule; -import com.android.systemui.pip.PipUI; import com.android.systemui.power.PowerUI; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsModule; import com.android.systemui.shortcut.ShortcutKeyDispatcher; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.notification.InstantAppNotifier; import com.android.systemui.statusbar.notification.dagger.NotificationsModule; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.toast.ToastUI; import com.android.systemui.util.leak.GarbageMonitor; +import com.android.systemui.wmshell.WMShell; import dagger.Binds; import dagger.Module; @@ -49,9 +47,9 @@ import dagger.multibindings.ClassKey; import dagger.multibindings.IntoMap; /** Binder for car specific {@link SystemUI} modules. */ -@Module(includes = {RecentsModule.class, NotificationsModule.class, +@Module(includes = {RecentsModule.class, StatusBarModule.class, NotificationsModule.class, BubbleModule.class, KeyguardModule.class, OverlayWindowModule.class, - CarNotificationModule.class, UnusedStatusBarModule.class}) + CarNotificationModule.class}) public abstract class CarSystemUIBinder { /** Inject into AuthController. */ @Binds @@ -59,12 +57,6 @@ public abstract class CarSystemUIBinder { @ClassKey(AuthController.class) public abstract SystemUI bindAuthController(AuthController sysui); - /** Inject into Divider. */ - @Binds - @IntoMap - @ClassKey(Divider.class) - public abstract SystemUI bindDivider(Divider sysui); - /** Inject Car Navigation Bar. */ @Binds @IntoMap @@ -101,12 +93,6 @@ public abstract class CarSystemUIBinder { @ClassKey(LatencyTester.class) public abstract SystemUI bindLatencyTester(LatencyTester sysui); - /** Inject into PipUI. */ - @Binds - @IntoMap - @ClassKey(PipUI.class) - public abstract SystemUI bindPipUI(PipUI sysui); - /** Inject into PowerUI. */ @Binds @IntoMap @@ -154,7 +140,7 @@ public abstract class CarSystemUIBinder { @Binds @IntoMap @ClassKey(StatusBar.class) - public abstract SystemUI bindsStatusBar(UnusedStatusBar sysui); + public abstract SystemUI bindsStatusBar(StatusBar sysui); /** Inject into VolumeUI. */ @Binds @@ -186,4 +172,10 @@ public abstract class CarSystemUIBinder { @IntoMap @ClassKey(SideLoadedAppController.class) public abstract SystemUI bindSideLoadedAppController(SideLoadedAppController sysui); + + /** Inject into WMShell. */ + @Binds + @IntoMap + @ClassKey(WMShell.class) + public abstract SystemUI bindWMShell(WMShell sysui); } diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java index 1a1b93b33caf..a65edc5477df 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIFactory.java @@ -19,7 +19,7 @@ package com.android.systemui; import android.content.Context; import android.content.res.Resources; -import com.android.systemui.dagger.SystemUIRootComponent; +import com.android.systemui.dagger.GlobalRootComponent; import java.util.HashSet; import java.util.Set; @@ -30,9 +30,9 @@ import java.util.Set; public class CarSystemUIFactory extends SystemUIFactory { @Override - protected SystemUIRootComponent buildSystemUIRootComponent(Context context) { - return DaggerCarSystemUIRootComponent.builder() - .contextHolder(new ContextHolder(context)) + protected GlobalRootComponent buildGlobalRootComponent(Context context) { + return DaggerCarGlobalRootComponent.builder() + .context(context) .build(); } diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java index 0e3c7f31886b..51fda965dcd0 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java @@ -28,13 +28,14 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.CarDeviceProvisionedControllerImpl; import com.android.systemui.car.keyguard.CarKeyguardViewController; +import com.android.systemui.car.notification.NotificationShadeWindowControllerImpl; import com.android.systemui.car.statusbar.DozeServiceHost; -import com.android.systemui.car.statusbar.DummyNotificationShadeWindowController; -import com.android.systemui.car.statusbar.UnusedStatusBar; import com.android.systemui.car.volume.CarVolumeDialogComponent; -import com.android.systemui.dagger.SystemUIRootComponent; +import com.android.systemui.dagger.GlobalRootComponent; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; import com.android.systemui.doze.DozeHost; @@ -46,62 +47,58 @@ import com.android.systemui.qs.dagger.QSModule; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsImplementation; -import com.android.systemui.stackdivider.DividerModule; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; +import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.notification.NotificationEntryManager; +import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager; import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl; -import com.android.systemui.statusbar.phone.NotificationGroupManager; -import com.android.systemui.statusbar.phone.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeControllerImpl; -import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryControllerImpl; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.volume.VolumeDialogComponent; -import com.android.systemui.wm.DisplayImeController; -import com.android.systemui.wm.DisplaySystemBarsController; +import com.android.systemui.wmshell.CarWMShellModule; import javax.inject.Named; -import javax.inject.Singleton; import dagger.Binds; import dagger.Module; import dagger.Provides; -@Module(includes = {DividerModule.class, QSModule.class}) -public abstract class CarSystemUIModule { +@Module( + includes = { + QSModule.class, + CarWMShellModule.class + }) +abstract class CarSystemUIModule { - @Singleton + @SysUISingleton @Provides @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) static boolean provideAllowNotificationLongPress() { return false; } - @Singleton + @SysUISingleton @Provides static HeadsUpManagerPhone provideHeadsUpManagerPhone( Context context, StatusBarStateController statusBarStateController, KeyguardBypassController bypassController, - NotificationGroupManager groupManager, + GroupMembershipManager groupManager, ConfigurationController configurationController) { return new HeadsUpManagerPhone(context, statusBarStateController, bypassController, groupManager, configurationController); } - @Binds - abstract DisplayImeController bindDisplayImeController( - DisplaySystemBarsController displaySystemBarsController); - - @Singleton + @SysUISingleton @Provides @Named(LEAK_REPORT_EMAIL_NAME) static String provideLeakReportEmail() { @@ -109,7 +106,7 @@ public abstract class CarSystemUIModule { } @Provides - @Singleton + @SysUISingleton static Recents provideRecents(Context context, RecentsImplementation recentsImplementation, CommandQueue commandQueue) { return new Recents(context, recentsImplementation, commandQueue); @@ -126,19 +123,20 @@ public abstract class CarSystemUIModule { NotificationLockscreenUserManagerImpl notificationLockscreenUserManager); @Provides - @Singleton + @SysUISingleton static BatteryController provideBatteryController(Context context, EnhancedEstimates enhancedEstimates, PowerManager powerManager, - BroadcastDispatcher broadcastDispatcher, @Main Handler mainHandler, + BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, + @Main Handler mainHandler, @Background Handler bgHandler) { BatteryController bC = new BatteryControllerImpl(context, enhancedEstimates, powerManager, - broadcastDispatcher, mainHandler, bgHandler); + broadcastDispatcher, demoModeController, mainHandler, bgHandler); bC.init(); return bC; } @Binds - @Singleton + @SysUISingleton public abstract QSFactory bindQSFactory(QSFactoryImpl qsFactoryImpl); @Binds @@ -152,8 +150,8 @@ public abstract class CarSystemUIModule { abstract ShadeController provideShadeController(ShadeControllerImpl shadeController); @Binds - abstract SystemUIRootComponent bindSystemUIRootComponent( - CarSystemUIRootComponent systemUIRootComponent); + abstract GlobalRootComponent bindGlobalRootComponent( + CarGlobalRootComponent globalRootComponent); @Binds abstract VolumeDialogComponent bindVolumeDialogComponent( @@ -164,6 +162,10 @@ public abstract class CarSystemUIModule { CarKeyguardViewController carKeyguardViewController); @Binds + abstract NotificationShadeWindowController bindNotificationShadeController( + NotificationShadeWindowControllerImpl notificationPanelViewController); + + @Binds abstract DeviceProvisionedController bindDeviceProvisionedController( CarDeviceProvisionedControllerImpl deviceProvisionedController); @@ -172,12 +174,5 @@ public abstract class CarSystemUIModule { CarDeviceProvisionedControllerImpl deviceProvisionedController); @Binds - abstract NotificationShadeWindowController bindNotificationShadeWindowController( - DummyNotificationShadeWindowController notificationShadeWindowController); - - @Binds abstract DozeHost bindDozeHost(DozeServiceHost dozeServiceHost); - - @Binds - abstract StatusBar bindStatusBar(UnusedStatusBar statusBar); } diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIRootComponent.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIRootComponent.java deleted file mode 100644 index 0e923f7164bb..000000000000 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIRootComponent.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui; - -import com.android.systemui.dagger.DependencyBinder; -import com.android.systemui.dagger.DependencyProvider; -import com.android.systemui.dagger.SystemServicesModule; -import com.android.systemui.dagger.SystemUIModule; -import com.android.systemui.dagger.SystemUIRootComponent; -import com.android.systemui.pip.phone.dagger.PipModule; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component( - modules = { - CarComponentBinder.class, - DependencyProvider.class, - DependencyBinder.class, - PipModule.class, - SystemUIFactory.ContextHolder.class, - SystemServicesModule.class, - SystemUIModule.class, - CarSystemUIModule.class, - CarSystemUIBinder.class - }) -public interface CarSystemUIRootComponent extends SystemUIRootComponent { - -} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java b/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java index 09e62d240a72..fef032414bb9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/CarDeviceProvisionedControllerImpl.java @@ -16,54 +16,56 @@ package com.android.systemui.car; +import android.annotation.NonNull; import android.app.ActivityManager; import android.car.settings.CarSettings; -import android.content.ContentResolver; -import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; -import android.provider.Settings; -import com.android.systemui.Dependency; import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.statusbar.policy.DeviceProvisionedControllerImpl; +import com.android.systemui.util.settings.GlobalSettings; +import com.android.systemui.util.settings.SecureSettings; import javax.inject.Inject; -import javax.inject.Singleton; /** * A controller that monitors the status of SUW progress for each user in addition to the * functionality provided by {@link DeviceProvisionedControllerImpl}. */ -@Singleton +@SysUISingleton public class CarDeviceProvisionedControllerImpl extends DeviceProvisionedControllerImpl implements CarDeviceProvisionedController { - private static final Uri USER_SETUP_IN_PROGRESS_URI = Settings.Secure.getUriFor( - CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS); - private final ContentObserver mCarSettingsObserver = new ContentObserver( - Dependency.get(Dependency.MAIN_HANDLER)) { - - @Override - public void onChange(boolean selfChange, Uri uri, int flags) { - if (USER_SETUP_IN_PROGRESS_URI.equals(uri)) { - notifyUserSetupInProgressChanged(); - } - } - }; - private final ContentResolver mContentResolver; + private final Uri mUserSetupInProgressUri; + private final ContentObserver mCarSettingsObserver; + private final Handler mMainHandler; + private final SecureSettings mSecureSettings; @Inject - public CarDeviceProvisionedControllerImpl(Context context, @Main Handler mainHandler, - BroadcastDispatcher broadcastDispatcher) { - super(context, mainHandler, broadcastDispatcher); - mContentResolver = context.getContentResolver(); + public CarDeviceProvisionedControllerImpl(@Main Handler mainHandler, + BroadcastDispatcher broadcastDispatcher, GlobalSettings globalSetting, + SecureSettings secureSettings) { + super(mainHandler, broadcastDispatcher, globalSetting, secureSettings); + mMainHandler = mainHandler; + mSecureSettings = secureSettings; + mUserSetupInProgressUri = mSecureSettings.getUriFor( + CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS); + mCarSettingsObserver = new ContentObserver(mMainHandler) { + @Override + public void onChange(boolean selfChange, Uri uri, int flags) { + if (mUserSetupInProgressUri.equals(uri)) { + notifyUserSetupInProgressChanged(); + } + } + }; } @Override public boolean isUserSetupInProgress(int user) { - return Settings.Secure.getIntForUser(mContentResolver, + return mSecureSettings.getIntForUser( CarSettings.Secure.KEY_SETUP_WIZARD_IN_PROGRESS, /* def= */ 0, user) != 0; } @@ -73,7 +75,7 @@ public class CarDeviceProvisionedControllerImpl extends DeviceProvisionedControl } @Override - public void addCallback(DeviceProvisionedListener listener) { + public void addCallback(@NonNull DeviceProvisionedListener listener) { super.addCallback(listener); if (listener instanceof CarDeviceProvisionedListener) { ((CarDeviceProvisionedListener) listener).onUserSetupInProgressChanged(); @@ -82,9 +84,9 @@ public class CarDeviceProvisionedControllerImpl extends DeviceProvisionedControl @Override protected void startListening(int user) { - mContentResolver.registerContentObserver( - USER_SETUP_IN_PROGRESS_URI, /* notifyForDescendants= */ true, mCarSettingsObserver, - user); + mSecureSettings.registerContentObserverForUser( + mUserSetupInProgressUri, /* notifyForDescendants= */ true, + mCarSettingsObserver, user); // The SUW Flag observer is registered before super.startListening() so that the observer is // in place before DeviceProvisionedController starts to track user switches which avoids // an edge case where our observer gets registered twice. @@ -94,16 +96,16 @@ public class CarDeviceProvisionedControllerImpl extends DeviceProvisionedControl @Override protected void stopListening() { super.stopListening(); - mContentResolver.unregisterContentObserver(mCarSettingsObserver); + mSecureSettings.unregisterContentObserver(mCarSettingsObserver); } @Override public void onUserSwitched(int newUserId) { super.onUserSwitched(newUserId); - mContentResolver.unregisterContentObserver(mCarSettingsObserver); - mContentResolver.registerContentObserver( - USER_SETUP_IN_PROGRESS_URI, /* notifyForDescendants= */ true, mCarSettingsObserver, - newUserId); + mSecureSettings.unregisterContentObserver(mCarSettingsObserver); + mSecureSettings.registerContentObserverForUser( + mUserSetupInProgressUri, /* notifyForDescendants= */ true, + mCarSettingsObserver, newUserId); } private void notifyUserSetupInProgressChanged() { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java b/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java index 80ee37127965..5778d660a672 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/CarServiceProvider.java @@ -21,14 +21,15 @@ import android.content.Context; import androidx.annotation.VisibleForTesting; +import com.android.systemui.dagger.SysUISingleton; + import java.util.ArrayList; import java.util.List; import javax.inject.Inject; -import javax.inject.Singleton; /** Provides a common connection to the car service that can be shared. */ -@Singleton +@SysUISingleton public class CarServiceProvider { private final Context mContext; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AdjustableTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AdjustableTemperatureView.java new file mode 100644 index 000000000000..af2a1d36bbd7 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AdjustableTemperatureView.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.hvac; + +import static com.android.systemui.car.hvac.HvacController.convertToCelsius; +import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.systemui.R; + +/** + * Displays temperature with a button to decrease and a button to increase on either side. + * Properties configured in the XML: + * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) + */ +public class AdjustableTemperatureView extends LinearLayout implements TemperatureView { + + private final int mAreaId; + private TextView mTempTextView; + private float mMinTempC; + private float mMaxTempC; + private String mTempFormat; + private String mNullTempText; + private String mMinTempText; + private String mMaxTempText; + private boolean mDisplayInFahrenheit = false; + + private HvacController mHvacController; + private float mCurrentTempC; + + public AdjustableTemperatureView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView); + mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId, -1); + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + LayoutInflater.from(getContext()).inflate(R.layout.adjustable_temperature_view, + /* root= */ this); + mTempFormat = getResources().getString(R.string.hvac_temperature_format); + mMinTempC = getResources().getFloat(R.dimen.hvac_min_value_celsius); + mMaxTempC = getResources().getFloat(R.dimen.hvac_max_value_celsius); + mNullTempText = getResources().getString(R.string.hvac_null_temp_text); + mMinTempText = getResources().getString(R.string.hvac_min_text); + mMaxTempText = getResources().getString(R.string.hvac_max_text); + initializeButtons(); + } + + @Override + public void setHvacController(HvacController controller) { + mHvacController = controller; + } + + @Override + public void setTemp(float tempC) { + if (mTempTextView == null) { + mTempTextView = findViewById(R.id.hvac_temperature_text); + } + if (Float.isNaN(tempC)) { + mTempTextView.setText(mNullTempText); + return; + } + if (tempC <= mMinTempC) { + mTempTextView.setText(mMinTempText); + mCurrentTempC = mMinTempC; + return; + } + if (tempC >= mMaxTempC) { + mTempTextView.setText(mMaxTempText); + mCurrentTempC = mMaxTempC; + return; + } + mTempTextView.setText(String.format(mTempFormat, + mDisplayInFahrenheit ? convertToFahrenheit(tempC) : tempC)); + mCurrentTempC = tempC; + } + + @Override + public void setDisplayInFahrenheit(boolean displayFahrenheit) { + mDisplayInFahrenheit = displayFahrenheit; + setTemp(mCurrentTempC); + } + + @Override + public int getAreaId() { + return mAreaId; + } + + private void initializeButtons() { + findViewById(R.id.hvac_decrease_button).setOnClickListener(v -> { + float newTemp = mDisplayInFahrenheit ? convertToCelsius( + convertToFahrenheit(mCurrentTempC) - 1) : (mCurrentTempC - 1); + setTemperature(newTemp, mAreaId); + }); + + findViewById(R.id.hvac_increase_button).setOnClickListener(v -> { + float newTemp = mDisplayInFahrenheit ? convertToCelsius( + convertToFahrenheit(mCurrentTempC) + 1) : (mCurrentTempC + 1); + setTemperature(newTemp, mAreaId); + }); + } + + private void setTemperature(float tempC, int zone) { + if (tempC < mMaxTempC && tempC > mMinTempC && mHvacController != null) { + mHvacController.setTemperature(tempC, zone); + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java index a7294317f46c..b98b68038e6f 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/AnimatedTemperatureView.java @@ -16,6 +16,8 @@ package com.android.systemui.car.hvac; +import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit; + import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.content.Context; @@ -40,9 +42,7 @@ import com.android.systemui.R; * Simple text display of HVAC properties, It is designed to show mTemperature and is configured in * the XML. * XML properties: - * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) - * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) - * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol) + * hvacAreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1) * hvacOrientaion = Example: left */ public class AnimatedTemperatureView extends FrameLayout implements TemperatureView { @@ -84,7 +84,6 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV } private final int mAreaId; - private final int mPropertyId; private final int mPivotOffset; private final int mGravity; private final int mTextAppearanceRes; @@ -100,12 +99,13 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV private final TemperatureTextAnimator mTextAnimator; boolean mDisplayInFahrenheit = false; + private HvacController mHvacController; + public AnimatedTemperatureView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AnimatedTemperatureView); mAreaId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacAreaId, -1); - mPropertyId = typedArray.getInt(R.styleable.AnimatedTemperatureView_hvacPropertyId, -1); mPivotOffset = typedArray.getDimensionPixelOffset( R.styleable.AnimatedTemperatureView_hvacPivotOffset, 0); @@ -115,11 +115,8 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV typedArray.getResourceId(R.styleable.AnimatedTemperatureView_android_textAppearance, 0); mMinEms = typedArray.getInteger(R.styleable.AnimatedTemperatureView_android_minEms, 0); - mMinValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMinValue, - Float.NaN); - mMaxValue = typedArray.getFloat(R.styleable.AnimatedTemperatureView_hvacMaxValue, - Float.NaN); - + mMinValue = getResources().getFloat(R.dimen.hvac_min_value_celsius); + mMaxValue = getResources().getFloat(R.dimen.hvac_max_value_celsius); mPaddingRect = new Rect(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom()); @@ -138,15 +135,10 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV mBackgroundAnimator = new TemperatureBackgroundAnimator(this, background); - - String format = typedArray.getString(R.styleable.AnimatedTemperatureView_hvacTempFormat); - format = (format == null) ? "%.1f\u00B0" : format; - CharSequence minText = typedArray.getString( - R.styleable.AnimatedTemperatureView_hvacMinText); - CharSequence maxText = typedArray.getString( - R.styleable.AnimatedTemperatureView_hvacMaxText); - mTextAnimator = new TemperatureTextAnimator(this, textSwitcher, format, mPivotOffset, - minText, maxText); + mTextAnimator = new TemperatureTextAnimator(this, textSwitcher, + getResources().getString(R.string.hvac_temperature_format), mPivotOffset, + getResources().getString(R.string.hvac_min_text), + getResources().getString(R.string.hvac_max_text)); addView(background, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); @@ -186,6 +178,11 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV return textView; } + @Override + public void setHvacController(HvacController controller) { + mHvacController = controller; + } + /** * Formats the float for display * @@ -252,15 +249,7 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV } /** - * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (358614275) - */ - @Override - public int getPropertyId() { - return mPropertyId; - } - - /** - * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) + * @return hvac AreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1) */ @Override public int getAreaId() { @@ -272,6 +261,5 @@ public class AnimatedTemperatureView extends FrameLayout implements TemperatureV super.onDetachedFromWindow(); mBackgroundAnimator.stopAnimations(); } - } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java index 236a6a451ea4..10a361c3084e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/HvacController.java @@ -18,85 +18,101 @@ package com.android.systemui.car.hvac; import static android.car.VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL; import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_DISPLAY_UNITS; +import static android.car.VehiclePropertyIds.HVAC_TEMPERATURE_SET; import android.car.Car; import android.car.VehicleUnit; import android.car.hardware.CarPropertyValue; -import android.car.hardware.hvac.CarHvacManager; -import android.car.hardware.hvac.CarHvacManager.CarHvacEventCallback; +import android.car.hardware.property.CarPropertyManager; import android.util.Log; import android.view.View; import android.view.ViewGroup; import com.android.systemui.car.CarServiceProvider; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.UiBackground; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; +import java.util.concurrent.Executor; import javax.inject.Inject; -import javax.inject.Singleton; /** * Manages the connection to the Car service and delegates value changes to the registered * {@link TemperatureView}s */ -@Singleton +@SysUISingleton public class HvacController { public static final String TAG = "HvacController"; private static final boolean DEBUG = true; + private final Executor mBackgroundExecutor; private final CarServiceProvider mCarServiceProvider; private final Set<TemperatureView> mRegisteredViews = new HashSet<>(); - private CarHvacManager mHvacManager; - private HashMap<HvacKey, List<TemperatureView>> mTempComponents = new HashMap<>(); - - /** - * Callback for getting changes from {@link CarHvacManager} and setting the UI elements to - * match. - */ - private final CarHvacEventCallback mHardwareCallback = new CarHvacEventCallback() { - @Override - public void onChangeEvent(final CarPropertyValue val) { - try { - int areaId = val.getAreaId(); - int propertyId = val.getPropertyId(); - List<TemperatureView> temperatureViews = mTempComponents.get( - new HvacKey(propertyId, areaId)); - if (temperatureViews != null && !temperatureViews.isEmpty()) { - float value = (float) val.getValue(); - if (DEBUG) { - Log.d(TAG, "onChangeEvent: " + areaId + ":" + propertyId + ":" + value); + private CarPropertyManager mCarPropertyManager; + private HashMap<Integer, List<TemperatureView>> mTempComponents = new HashMap<>(); + + private final CarPropertyManager.CarPropertyEventCallback mHvacTemperatureSetCallback = + new CarPropertyManager.CarPropertyEventCallback() { + @Override + public void onChangeEvent(CarPropertyValue value) { + try { + int areaId = value.getAreaId(); + List<TemperatureView> temperatureViews = mTempComponents.get(areaId); + if (temperatureViews != null && !temperatureViews.isEmpty()) { + float newTemp = (float) value.getValue(); + if (DEBUG) { + Log.d(TAG, "onChangeEvent: " + areaId + ":" + value); + } + for (TemperatureView view : temperatureViews) { + view.setTemp(newTemp); + } + } + } catch (Exception e) { + Log.e(TAG, "Failed handling hvac change event", e); } - for (TemperatureView tempView : temperatureViews) { - tempView.setTemp(value); + } + + @Override + public void onErrorEvent(int propId, int zone) { + Log.d(TAG, "HVAC error event, propertyId: " + propId + " zone: " + zone); + } + }; + + private final CarPropertyManager.CarPropertyEventCallback mTemperatureUnitChangeCallback = + new CarPropertyManager.CarPropertyEventCallback() { + @Override + public void onChangeEvent(CarPropertyValue value) { + if (!mRegisteredViews.isEmpty()) { + for (TemperatureView view : mRegisteredViews) { + view.setDisplayInFahrenheit( + value.getValue().equals(VehicleUnit.FAHRENHEIT)); + } } - } // else the data is not of interest - } catch (Exception e) { - // catch all so we don't take down the sysui if a new data type is - // introduced. - Log.e(TAG, "Failed handling hvac change event", e); - } - } + } - @Override - public void onErrorEvent(final int propertyId, final int zone) { - Log.d(TAG, "HVAC error event, propertyId: " + propertyId - + " zone: " + zone); - } - }; + @Override + public void onErrorEvent(int propId, int zone) { + Log.d(TAG, "HVAC error event, propertyId: " + propId + " zone: " + zone); + } + }; private final CarServiceProvider.CarServiceOnConnectedListener mCarServiceLifecycleListener = car -> { try { - mHvacManager = (CarHvacManager) car.getCarManager(Car.HVAC_SERVICE); - mHvacManager.registerCallback(mHardwareCallback); + mCarPropertyManager = (CarPropertyManager) car.getCarManager( + Car.PROPERTY_SERVICE); + mCarPropertyManager.registerCallback(mHvacTemperatureSetCallback, + HVAC_TEMPERATURE_SET, CarPropertyManager.SENSOR_RATE_ONCHANGE); + mCarPropertyManager.registerCallback(mTemperatureUnitChangeCallback, + HVAC_TEMPERATURE_DISPLAY_UNITS, + CarPropertyManager.SENSOR_RATE_ONCHANGE); initComponents(); } catch (Exception e) { Log.e(TAG, "Failed to correctly connect to HVAC", e); @@ -104,13 +120,14 @@ public class HvacController { }; @Inject - public HvacController(CarServiceProvider carServiceProvider) { + public HvacController(CarServiceProvider carServiceProvider, + @UiBackground Executor backgroundExecutor) { mCarServiceProvider = carServiceProvider; + mBackgroundExecutor = backgroundExecutor; } /** - * Create connection to the Car service. Note: call backs from the Car service - * ({@link CarHvacManager}) will happen on the same thread this method was called from. + * Create connection to the Car service. */ public void connectToCarService() { mCarServiceProvider.addListener(mCarServiceLifecycleListener); @@ -124,21 +141,18 @@ public class HvacController { return; } - HvacKey hvacKey = new HvacKey(temperatureView.getPropertyId(), temperatureView.getAreaId()); - if (!mTempComponents.containsKey(hvacKey)) { - mTempComponents.put(hvacKey, new ArrayList<>()); + int areaId = temperatureView.getAreaId(); + if (!mTempComponents.containsKey(areaId)) { + mTempComponents.put(areaId, new ArrayList<>()); } - mTempComponents.get(hvacKey).add(temperatureView); + mTempComponents.get(areaId).add(temperatureView); initComponent(temperatureView); mRegisteredViews.add(temperatureView); } private void initComponents() { - Iterator<Map.Entry<HvacKey, List<TemperatureView>>> iterator = - mTempComponents.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry<HvacKey, List<TemperatureView>> next = iterator.next(); + for (Map.Entry<Integer, List<TemperatureView>> next : mTempComponents.entrySet()) { List<TemperatureView> temperatureViews = next.getValue(); for (TemperatureView view : temperatureViews) { initComponent(view); @@ -147,27 +161,27 @@ public class HvacController { } private void initComponent(TemperatureView view) { - int id = view.getPropertyId(); int zone = view.getAreaId(); if (DEBUG) { - Log.d(TAG, "initComponent: " + zone + ":" + id); + Log.d(TAG, "initComponent: " + zone); } try { - if (mHvacManager != null - && mHvacManager.isPropertyAvailable(HVAC_TEMPERATURE_DISPLAY_UNITS, - VEHICLE_AREA_TYPE_GLOBAL)) { - if (mHvacManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS, + if (mCarPropertyManager != null && mCarPropertyManager.isPropertyAvailable( + HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_AREA_TYPE_GLOBAL)) { + if (mCarPropertyManager.getIntProperty(HVAC_TEMPERATURE_DISPLAY_UNITS, VEHICLE_AREA_TYPE_GLOBAL) == VehicleUnit.FAHRENHEIT) { view.setDisplayInFahrenheit(true); } - } - if (mHvacManager == null || !mHvacManager.isPropertyAvailable(id, zone)) { + if (mCarPropertyManager == null || !mCarPropertyManager.isPropertyAvailable( + HVAC_TEMPERATURE_SET, zone)) { view.setTemp(Float.NaN); return; } - view.setTemp(mHvacManager.getFloatProperty(id, zone)); + view.setTemp( + mCarPropertyManager.getFloatProperty(HVAC_TEMPERATURE_SET, zone)); + view.setHvacController(this); } catch (Exception e) { view.setTemp(Float.NaN); Log.e(TAG, "Failed to get value from hvac service", e); @@ -199,30 +213,33 @@ public class HvacController { } /** - * Key for storing {@link TemperatureView}s in a hash map + * Set the temperature in Celsius of the specified zone */ - private static class HvacKey { - - int mPropertyId; - int mAreaId; - - private HvacKey(int propertyId, int areaId) { - mPropertyId = propertyId; - mAreaId = areaId; + public void setTemperature(float tempC, int zone) { + if (mCarPropertyManager != null) { + // Internally, all temperatures are represented in floating point Celsius + mBackgroundExecutor.execute( + () -> mCarPropertyManager.setFloatProperty(HVAC_TEMPERATURE_SET, zone, tempC)); } + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - HvacKey hvacKey = (HvacKey) o; - return mPropertyId == hvacKey.mPropertyId - && mAreaId == hvacKey.mAreaId; - } + /** + * Convert the given temperature in Celsius into Fahrenheit + * + * @param tempC - The temperature in Celsius + * @return Temperature in Fahrenheit. + */ + public static float convertToFahrenheit(float tempC) { + return (tempC * 9f / 5f) + 32; + } - @Override - public int hashCode() { - return Objects.hash(mPropertyId, mAreaId); - } + /** + * Convert the given temperature in Fahrenheit to Celsius + * + * @param tempF - The temperature in Fahrenheit. + * @return Temperature in Celsius. + */ + public static float convertToCelsius(float tempF) { + return (tempF - 32) * 5f / 9f; } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java index 521a665da5f6..90df15c907dd 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureTextView.java @@ -16,6 +16,8 @@ package com.android.systemui.car.hvac; +import static com.android.systemui.car.hvac.HvacController.convertToFahrenheit; + import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; @@ -27,24 +29,25 @@ import com.android.systemui.R; * Simple text display of HVAC properties, It is designed to show temperature and is configured in * the XML. * XML properties: - * hvacPropertyId - Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) - * hvacAreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) - * hvacTempFormat - Example: "%.1f\u00B0" (1 decimal and the degree symbol) + * hvacAreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1) */ public class TemperatureTextView extends TextView implements TemperatureView { private final int mAreaId; - private final int mPropertyId; private final String mTempFormat; + private HvacController mHvacController; private boolean mDisplayFahrenheit = false; public TemperatureTextView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TemperatureView); mAreaId = typedArray.getInt(R.styleable.TemperatureView_hvacAreaId, -1); - mPropertyId = typedArray.getInt(R.styleable.TemperatureView_hvacPropertyId, -1); - String format = typedArray.getString(R.styleable.TemperatureView_hvacTempFormat); - mTempFormat = (format == null) ? "%.1f\u00B0" : format; + mTempFormat = getResources().getString(R.string.hvac_temperature_format); + } + + @Override + public void setHvacController(HvacController controller) { + mHvacController = controller; } /** @@ -70,15 +73,7 @@ public class TemperatureTextView extends TextView implements TemperatureView { } /** - * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) - */ - @Override - public int getPropertyId() { - return mPropertyId; - } - - /** - * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) + * @return hvac AreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1) */ @Override public int getAreaId() { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java index 6b903fad505c..6edf25431ffd 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/hvac/TemperatureView.java @@ -17,9 +17,17 @@ package com.android.systemui.car.hvac; /** - * Interface for Views that display temperature HVAC properties + * Interface for Views that display temperature HVAC properties. */ public interface TemperatureView { + + /** + * Sets the {@link HvacController} to handle changes to HVAC properties. The View is only + * responsible for the UI to display temperature. It should not contain logic that makes direct + * changes to HVAC properties and instead use this {@link HvacController}. + */ + void setHvacController(HvacController controller); + /** * Formats the float for display * @@ -35,22 +43,7 @@ public interface TemperatureView { void setDisplayInFahrenheit(boolean displayFahrenheit); /** - * Convert the given temperature in Celsius into Fahrenheit - * - * @param realTemp - The temperature in Celsius - * @return Temperature in Fahrenheit. - */ - default float convertToFahrenheit(float realTemp) { - return (realTemp * 9f / 5f) + 32; - } - - /** - * @return propertiyId Example: CarHvacManager.ID_ZONED_TEMP_SETPOINT (16385) - */ - int getPropertyId(); - - /** - * @return hvac AreaId - Example: VehicleSeat.SEAT_ROW_1_LEFT (1) + * @return hvac AreaId - Example: VehicleAreaSeat.SEAT_ROW_1_LEFT (1) */ int getAreaId(); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index 218c95c2496f..c190ae54b1cf 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -18,7 +18,6 @@ package com.android.systemui.car.keyguard; import android.car.Car; import android.car.user.CarUserManager; -import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.util.Log; @@ -28,28 +27,25 @@ import android.view.ViewRootImpl; import androidx.annotation.VisibleForTesting; -import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardViewController; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.R; -import com.android.systemui.SystemUIFactory; import com.android.systemui.car.CarServiceProvider; import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayViewController; import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.keyguard.DismissCallbackRegistry; -import com.android.systemui.plugins.FalsingManager; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.KeyguardBouncer; +import com.android.systemui.statusbar.phone.KeyguardBouncer.Factory; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.KeyguardStateController; import javax.inject.Inject; -import javax.inject.Singleton; import dagger.Lazy; @@ -57,24 +53,20 @@ import dagger.Lazy; * Automotive implementation of the {@link KeyguardViewController}. It controls the Keyguard View * that is mounted to the SystemUIOverlayWindow. */ -@Singleton +@SysUISingleton public class CarKeyguardViewController extends OverlayViewController implements KeyguardViewController { private static final String TAG = "CarKeyguardViewController"; private static final boolean DEBUG = true; - private final Context mContext; private final Handler mHandler; private final CarServiceProvider mCarServiceProvider; private final KeyguardStateController mKeyguardStateController; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy; - private final LockPatternUtils mLockPatternUtils; - private final FalsingManager mFalsingManager; - private final Lazy<KeyguardBypassController> mKeyguardBypassControllerLazy; - private final DismissCallbackRegistry mDismissCallbackRegistry; private final ViewMediatorCallback mViewMediatorCallback; private final CarNavigationBarController mCarNavigationBarController; + private final Factory mKeyguardBouncerFactory; // Needed to instantiate mBouncer. private final KeyguardBouncer.BouncerExpansionCallback mExpansionCallback = new KeyguardBouncer.BouncerExpansionCallback() { @@ -107,7 +99,6 @@ public class CarKeyguardViewController extends OverlayViewController implements @Inject public CarKeyguardViewController( - Context context, @Main Handler mainHandler, CarServiceProvider carServiceProvider, OverlayViewGlobalStateController overlayViewGlobalStateController, @@ -116,26 +107,18 @@ public class CarKeyguardViewController extends OverlayViewController implements Lazy<BiometricUnlockController> biometricUnlockControllerLazy, ViewMediatorCallback viewMediatorCallback, CarNavigationBarController carNavigationBarController, - /* The params below are only used to reuse KeyguardBouncer */ - LockPatternUtils lockPatternUtils, - DismissCallbackRegistry dismissCallbackRegistry, - FalsingManager falsingManager, - Lazy<KeyguardBypassController> keyguardBypassControllerLazy) { + KeyguardBouncer.Factory keyguardBouncerFactory) { super(R.id.keyguard_stub, overlayViewGlobalStateController); - mContext = context; mHandler = mainHandler; mCarServiceProvider = carServiceProvider; mKeyguardStateController = keyguardStateController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mBiometricUnlockControllerLazy = biometricUnlockControllerLazy; - mLockPatternUtils = lockPatternUtils; - mFalsingManager = falsingManager; - mKeyguardBypassControllerLazy = keyguardBypassControllerLazy; - mDismissCallbackRegistry = dismissCallbackRegistry; mViewMediatorCallback = viewMediatorCallback; mCarNavigationBarController = carNavigationBarController; + mKeyguardBouncerFactory = keyguardBouncerFactory; registerUserSwitchedListener(); } @@ -147,11 +130,8 @@ public class CarKeyguardViewController extends OverlayViewController implements @Override public void onFinishInflate() { - mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext, - mViewMediatorCallback, mLockPatternUtils, - getLayout().findViewById(R.id.keyguard_container), mDismissCallbackRegistry, - mExpansionCallback, mKeyguardStateController, mFalsingManager, - mKeyguardBypassControllerLazy.get()); + mBouncer = mKeyguardBouncerFactory + .create(getLayout().findViewById(R.id.keyguard_container), mExpansionCallback); mBiometricUnlockControllerLazy.get().setKeyguardViewController(this); } @@ -356,9 +336,8 @@ public class CarKeyguardViewController extends OverlayViewController implements public void registerStatusBar(StatusBar statusBar, ViewGroup container, NotificationPanelViewController notificationPanelViewController, BiometricUnlockController biometricUnlockController, - DismissCallbackRegistry dismissCallbackRegistry, ViewGroup lockIconContainer, - View notificationContainer, KeyguardBypassController bypassController, - FalsingManager falsingManager) { + ViewGroup lockIconContainer, + View notificationContainer, KeyguardBypassController bypassController) { // no-op } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java index 5a35c482fb36..155b73e691ef 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewMediator.java @@ -18,15 +18,15 @@ package com.android.systemui.car.keyguard; import com.android.systemui.car.userswitcher.FullScreenUserSwitcherViewController; import com.android.systemui.car.window.OverlayViewMediator; +import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; -import javax.inject.Singleton; /** * Manages events originating from the Keyguard service that cause Keyguard or other OverlayWindow * Components to appear or disappear. */ -@Singleton +@SysUISingleton public class CarKeyguardViewMediator implements OverlayViewMediator { private final CarKeyguardViewController mCarKeyguardViewController; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java index 5c83c025bc20..f8cd20fe8377 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonRoleHolderController.java @@ -30,13 +30,13 @@ import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.dagger.SysUISingleton; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; -import javax.inject.Singleton; /** * Some CarNavigationButtons can be associated to a {@link RoleManager} role. When they are, it is @@ -46,7 +46,7 @@ import javax.inject.Singleton; * This class monitors the current role holders for each role type and updates the button icon for * this buttons with have this feature enabled. */ -@Singleton +@SysUISingleton public class ButtonRoleHolderController { private static final String TAG = "ButtonRoleHolderController"; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java index eedcfa548e5a..2dc475682fac 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateController.java @@ -16,7 +16,7 @@ package com.android.systemui.car.navigationbar; -import android.app.ActivityManager; +import android.app.ActivityTaskManager.RootTaskInfo; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -26,13 +26,14 @@ import android.view.Display; import android.view.View; import android.view.ViewGroup; +import com.android.systemui.dagger.SysUISingleton; + import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.inject.Inject; -import javax.inject.Singleton; /** * CarNavigationButtons can optionally have selection state that toggles certain visual indications @@ -42,7 +43,7 @@ import javax.inject.Singleton; * This class controls the selection state of CarNavigationButtons that have opted in to have such * selection state-dependent visual indications. */ -@Singleton +@SysUISingleton public class ButtonSelectionStateController { private final Set<CarNavigationButton> mRegisteredViews = new HashSet<>(); @@ -96,27 +97,27 @@ public class ButtonSelectionStateController { * The StackInfo is expected to be supplied in order of recency and StackInfo will only be used * for consideration if it has the same displayId as the CarNavigationButton. * - * @param stackInfoList of the currently running application + * @param taskInfoList of the currently running application * @param validDisplay index of the valid display */ - protected void taskChanged(List<ActivityManager.StackInfo> stackInfoList, int validDisplay) { - ActivityManager.StackInfo validStackInfo = null; - for (ActivityManager.StackInfo stackInfo : stackInfoList) { + protected void taskChanged(List<RootTaskInfo> taskInfoList, int validDisplay) { + RootTaskInfo validTaskInfo = null; + for (RootTaskInfo taskInfo : taskInfoList) { // Find the first stack info with a topActivity in the primary display. // TODO: We assume that CarFacetButton will launch an app only in the primary display. // We need to extend the functionality to handle the multiple display properly. - if (stackInfo.topActivity != null && stackInfo.displayId == validDisplay) { - validStackInfo = stackInfo; + if (taskInfo.topActivity != null && taskInfo.displayId == validDisplay) { + validTaskInfo = taskInfo; break; } } - if (validStackInfo == null) { + if (validTaskInfo == null) { // No stack was found that was on the same display as the buttons thus return return; } - int displayId = validStackInfo.displayId; + int displayId = validTaskInfo.displayId; mSelectedButtons.forEach(carNavigationButton -> { if (carNavigationButton.getDisplayId() == displayId) { @@ -125,7 +126,7 @@ public class ButtonSelectionStateController { }); mSelectedButtons.clear(); - HashSet<CarNavigationButton> selectedButtons = findSelectedButtons(validStackInfo); + HashSet<CarNavigationButton> selectedButtons = findSelectedButtons(validTaskInfo); if (selectedButtons != null) { selectedButtons.forEach(carNavigationButton -> { @@ -140,10 +141,10 @@ public class ButtonSelectionStateController { /** * Defaults to Display.DEFAULT_DISPLAY when no parameter is provided for the validDisplay. * - * @param stackInfoList + * @param taskInfoList */ - protected void taskChanged(List<ActivityManager.StackInfo> stackInfoList) { - taskChanged(stackInfoList, Display.DEFAULT_DISPLAY); + protected void taskChanged(List<RootTaskInfo> taskInfoList) { + taskChanged(taskInfoList, Display.DEFAULT_DISPLAY); } /** @@ -170,12 +171,11 @@ public class ButtonSelectionStateController { mRegisteredViews.add(carNavigationButton); } - private HashSet<CarNavigationButton> findSelectedButtons( - ActivityManager.StackInfo validStackInfo) { - String packageName = validStackInfo.topActivity.getPackageName(); + private HashSet<CarNavigationButton> findSelectedButtons(RootTaskInfo validTaskInfo) { + String packageName = validTaskInfo.topActivity.getPackageName(); HashSet<CarNavigationButton> selectedButtons = - findButtonsByComponentName(validStackInfo.topActivity); + findButtonsByComponentName(validTaskInfo.topActivity); if (selectedButtons == null) { selectedButtons = mButtonsByPackage.get(packageName); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java index 13617983b23b..f74bd4fce312 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/ButtonSelectionStateListener.java @@ -19,16 +19,16 @@ package com.android.systemui.car.navigationbar; import android.app.ActivityTaskManager; import android.util.Log; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.shared.system.TaskStackChangeListener; import javax.inject.Inject; -import javax.inject.Singleton; /** * An implementation of TaskStackChangeListener, that listens for changes in the system * task stack and notifies the navigation bar. */ -@Singleton +@SysUISingleton class ButtonSelectionStateListener extends TaskStackChangeListener { private static final String TAG = ButtonSelectionStateListener.class.getSimpleName(); @@ -43,9 +43,9 @@ class ButtonSelectionStateListener extends TaskStackChangeListener { public void onTaskStackChanged() { try { mButtonSelectionStateController.taskChanged( - ActivityTaskManager.getService().getAllStackInfos()); + ActivityTaskManager.getService().getAllRootTaskInfos()); } catch (Exception e) { - Log.e(TAG, "Getting StackInfo from activity manager failed", e); + Log.e(TAG, "Getting RootTaskInfo from activity task manager failed", e); } } @@ -53,9 +53,9 @@ class ButtonSelectionStateListener extends TaskStackChangeListener { public void onTaskDisplayChanged(int taskId, int newDisplayId) { try { mButtonSelectionStateController.taskChanged( - ActivityTaskManager.getService().getAllStackInfos()); + ActivityTaskManager.getService().getAllRootTaskInfos()); } catch (Exception e) { - Log.e(TAG, "Getting StackInfo from activity manager failed", e); + Log.e(TAG, "Getting RootTaskInfo from activity task manager failed", e); } } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java index b6d251fbfe16..c7db3f6fc4f9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java @@ -349,24 +349,28 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks mTopNavigationBarView = mCarNavigationBarController.getTopBar(isDeviceSetupForUser()); if (mTopNavigationBarView != null) { mSystemBarConfigs.insetSystemBar(SystemBarConfigs.TOP, mTopNavigationBarView); + mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.TOP, mTopNavigationBarView); mTopNavigationBarWindow.addView(mTopNavigationBarView); } mBottomNavigationBarView = mCarNavigationBarController.getBottomBar(isDeviceSetupForUser()); if (mBottomNavigationBarView != null) { mSystemBarConfigs.insetSystemBar(SystemBarConfigs.BOTTOM, mBottomNavigationBarView); + mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.BOTTOM, mBottomNavigationBarView); mBottomNavigationBarWindow.addView(mBottomNavigationBarView); } mLeftNavigationBarView = mCarNavigationBarController.getLeftBar(isDeviceSetupForUser()); if (mLeftNavigationBarView != null) { mSystemBarConfigs.insetSystemBar(SystemBarConfigs.LEFT, mLeftNavigationBarView); + mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.LEFT, mLeftNavigationBarView); mLeftNavigationBarWindow.addView(mLeftNavigationBarView); } mRightNavigationBarView = mCarNavigationBarController.getRightBar(isDeviceSetupForUser()); if (mRightNavigationBarView != null) { mSystemBarConfigs.insetSystemBar(SystemBarConfigs.RIGHT, mRightNavigationBarView); + mSystemBarConfigs.setInsetUpdater(SystemBarConfigs.RIGHT, mRightNavigationBarView); mRightNavigationBarWindow.addView(mRightNavigationBarView); } } @@ -376,7 +380,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks } private void attachNavBarBySide(int side) { - switch(side) { + switch (side) { case SystemBarConfigs.TOP: if (mTopNavigationBarWindow != null) { mWindowManager.addView(mTopNavigationBarWindow, diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java index e522d19249e3..4fb522008578 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java @@ -23,14 +23,15 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; import com.android.systemui.car.hvac.HvacController; +import com.android.systemui.car.statusbar.UserNameViewController; +import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; -import javax.inject.Singleton; import dagger.Lazy; /** A single class which controls the navigation bar views. */ -@Singleton +@SysUISingleton public class CarNavigationBarController { private final Context mContext; @@ -38,6 +39,7 @@ public class CarNavigationBarController { private final ButtonSelectionStateController mButtonSelectionStateController; private final ButtonRoleHolderController mButtonRoleHolderController; private final Lazy<HvacController> mHvacControllerLazy; + private final Lazy<UserNameViewController> mUserNameViewControllerLazy; private boolean mShowTop; private boolean mShowBottom; @@ -60,12 +62,14 @@ public class CarNavigationBarController { NavigationBarViewFactory navigationBarViewFactory, ButtonSelectionStateController buttonSelectionStateController, Lazy<HvacController> hvacControllerLazy, + Lazy<UserNameViewController> userNameViewControllerLazy, ButtonRoleHolderController buttonRoleHolderController, SystemBarConfigs systemBarConfigs) { mContext = context; mNavigationBarViewFactory = navigationBarViewFactory; mButtonSelectionStateController = buttonSelectionStateController; mHvacControllerLazy = hvacControllerLazy; + mUserNameViewControllerLazy = userNameViewControllerLazy; mButtonRoleHolderController = buttonRoleHolderController; // Read configuration. @@ -105,6 +109,7 @@ public class CarNavigationBarController { mHvacControllerLazy.get().removeAllComponents(); mButtonSelectionStateController.removeAll(); mButtonRoleHolderController.removeAll(); + mUserNameViewControllerLazy.get().removeAll(); } /** Gets the top window if configured to do so. */ @@ -219,6 +224,7 @@ public class CarNavigationBarController { mButtonSelectionStateController.addAllButtonsWithSelectionState(view); mButtonRoleHolderController.addAllButtonsWithRoleName(view); mHvacControllerLazy.get().addTemperatureViewToController(view); + mUserNameViewControllerLazy.get().addUserNameView(view); } /** Sets a touch listener for the top navigation bar. */ diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java index adf8d4d5acf8..a473bb7423b7 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/NavigationBarViewFactory.java @@ -26,12 +26,12 @@ import androidx.annotation.LayoutRes; import com.android.car.ui.FocusParkingView; import com.android.systemui.R; +import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; -import javax.inject.Singleton; /** A factory that creates and caches views for navigation bars. */ -@Singleton +@SysUISingleton public class NavigationBarViewFactory { private static final String TAG = NavigationBarViewFactory.class.getSimpleName(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java index e72df6bcf28f..dfda4e6b2635 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java @@ -25,12 +25,14 @@ import android.util.Log; import android.view.Gravity; import android.view.InsetsState; import android.view.ViewGroup; +import android.view.WindowInsets; import android.view.WindowManager; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.car.notification.BottomNotificationPanelViewMediator; import com.android.systemui.car.notification.TopNotificationPanelViewMediator; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import java.lang.annotation.ElementType; @@ -42,13 +44,12 @@ import java.util.Map; import java.util.Set; import javax.inject.Inject; -import javax.inject.Singleton; /** * Reads configs for system bars for each side (TOP, BOTTOM, LEFT, and RIGHT) and returns the * corresponding {@link android.view.WindowManager.LayoutParams} per the configuration. */ -@Singleton +@SysUISingleton public class SystemBarConfigs { private static final String TAG = SystemBarConfigs.class.getSimpleName(); @@ -97,6 +98,7 @@ public class SystemBarConfigs { populateMaps(); readConfigs(); checkEnabledBarsHaveUniqueBarTypes(); + checkAllOverlappingBarsHaveDifferentZOrders(); checkSystemBarEnabledForNotificationPanel(); checkHideBottomBarForKeyboardConfigSync(); setInsetPaddingsForOverlappingCorners(); @@ -129,16 +131,60 @@ public class SystemBarConfigs { } protected void insetSystemBar(@SystemBarSide int side, CarNavigationBarView view) { + if (mSystemBarConfigMap.get(side) == null) return; + int[] paddings = mSystemBarConfigMap.get(side).getPaddings(); view.setPadding(paddings[2], paddings[0], paddings[3], paddings[1]); } + protected void setInsetUpdater(@SystemBarSide int side, CarNavigationBarView view) { + view.setOnApplyWindowInsetsListener((v, insets) -> { + updateInsetPaddings(side, getSystemBarsVisibility(insets)); + insetSystemBar(side, view); + return insets; + }); + } + protected List<Integer> getSystemBarSidesByZOrder() { return mSystemBarSidesByZOrder; } @VisibleForTesting - protected static int getHunZOrder() { + void updateInsetPaddings(@SystemBarSide int side, + Map<@SystemBarSide Integer, Boolean> barVisibilities) { + SystemBarConfig currentConfig = mSystemBarConfigMap.get(side); + + if (currentConfig == null) return; + + if (isHorizontalBar(side)) { + if (mLeftNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get( + LEFT).getZOrder()) { + currentConfig.setPaddingBySide(LEFT, + barVisibilities.get(LEFT) ? mSystemBarConfigMap.get(LEFT).getGirth() : 0); + } + if (mRightNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get( + RIGHT).getZOrder()) { + currentConfig.setPaddingBySide(RIGHT, + barVisibilities.get(RIGHT) ? mSystemBarConfigMap.get(RIGHT).getGirth() : 0); + } + } + if (isVerticalBar(side)) { + if (mTopNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get( + TOP).getZOrder()) { + currentConfig.setPaddingBySide(TOP, + barVisibilities.get(TOP) ? mSystemBarConfigMap.get(TOP).getGirth() : 0); + } + if (mBottomNavBarEnabled && currentConfig.getZOrder() < mSystemBarConfigMap.get( + BOTTOM).getZOrder()) { + currentConfig.setPaddingBySide(BOTTOM, + barVisibilities.get(BOTTOM) ? mSystemBarConfigMap.get(BOTTOM).getGirth() + : 0); + } + } + } + + @VisibleForTesting + static int getHunZOrder() { return HUN_ZORDER; } @@ -238,8 +284,14 @@ public class SystemBarConfigs { } } - private void checkSystemBarEnabledForNotificationPanel() throws RuntimeException { + private void checkAllOverlappingBarsHaveDifferentZOrders() { + checkOverlappingBarsHaveDifferentZOrders(TOP, LEFT); + checkOverlappingBarsHaveDifferentZOrders(TOP, RIGHT); + checkOverlappingBarsHaveDifferentZOrders(BOTTOM, LEFT); + checkOverlappingBarsHaveDifferentZOrders(BOTTOM, RIGHT); + } + private void checkSystemBarEnabledForNotificationPanel() throws RuntimeException { String notificationPanelMediatorName = mResources.getString(R.string.config_notificationPanelViewMediator); if (notificationPanelMediatorName == null) { @@ -285,13 +337,72 @@ public class SystemBarConfigs { } private void setInsetPaddingsForOverlappingCorners() { - setInsetPaddingForOverlappingCorner(TOP, LEFT); - setInsetPaddingForOverlappingCorner(TOP, RIGHT); - setInsetPaddingForOverlappingCorner(BOTTOM, LEFT); - setInsetPaddingForOverlappingCorner(BOTTOM, RIGHT); + Map<@SystemBarSide Integer, Boolean> systemBarVisibilityOnInit = + getSystemBarsVisibilityOnInit(); + updateInsetPaddings(TOP, systemBarVisibilityOnInit); + updateInsetPaddings(BOTTOM, systemBarVisibilityOnInit); + updateInsetPaddings(LEFT, systemBarVisibilityOnInit); + updateInsetPaddings(RIGHT, systemBarVisibilityOnInit); } - private void setInsetPaddingForOverlappingCorner(@SystemBarSide int horizontalSide, + private void sortSystemBarSidesByZOrder() { + List<SystemBarConfig> systemBarsByZOrder = new ArrayList<>(mSystemBarConfigMap.values()); + + systemBarsByZOrder.sort(new Comparator<SystemBarConfig>() { + @Override + public int compare(SystemBarConfig o1, SystemBarConfig o2) { + return o1.getZOrder() - o2.getZOrder(); + } + }); + + systemBarsByZOrder.forEach(systemBarConfig -> { + mSystemBarSidesByZOrder.add(systemBarConfig.getSide()); + }); + } + + @InsetsState.InternalInsetsType + private int getSystemBarTypeBySide(@SystemBarSide int side) { + return mSystemBarConfigMap.get(side) != null + ? mSystemBarConfigMap.get(side).getBarType() : null; + } + + // On init, system bars are visible as long as they are enabled. + private Map<@SystemBarSide Integer, Boolean> getSystemBarsVisibilityOnInit() { + ArrayMap<@SystemBarSide Integer, Boolean> visibilityMap = new ArrayMap<>(); + visibilityMap.put(TOP, mTopNavBarEnabled); + visibilityMap.put(BOTTOM, mBottomNavBarEnabled); + visibilityMap.put(LEFT, mLeftNavBarEnabled); + visibilityMap.put(RIGHT, mRightNavBarEnabled); + return visibilityMap; + } + + private Map<@SystemBarSide Integer, Boolean> getSystemBarsVisibility(WindowInsets insets) { + ArrayMap<@SystemBarSide Integer, Boolean> visibilityMap = new ArrayMap<>(); + if (mTopNavBarEnabled) { + visibilityMap.put(TOP, getSystemBarInsetVisibleBySide(TOP, insets)); + } + if (mBottomNavBarEnabled) { + visibilityMap.put(BOTTOM, getSystemBarInsetVisibleBySide(BOTTOM, insets)); + } + if (mLeftNavBarEnabled) { + visibilityMap.put(LEFT, getSystemBarInsetVisibleBySide(LEFT, insets)); + } + if (mRightNavBarEnabled) { + visibilityMap.put(RIGHT, getSystemBarInsetVisibleBySide(RIGHT, insets)); + } + return visibilityMap; + } + + private boolean getSystemBarInsetVisibleBySide(@SystemBarSide int side, WindowInsets insets) { + if (mSystemBarConfigMap.get(side) == null) return false; + + int internalInsetType = BAR_TYPE_MAP[getSystemBarTypeBySide(side)]; + int publicInsetType = InsetsState.toPublicType(internalInsetType); + + return insets.isVisible(publicInsetType); + } + + private void checkOverlappingBarsHaveDifferentZOrders(@SystemBarSide int horizontalSide, @SystemBarSide int verticalSide) { if (isVerticalBar(horizontalSide) || isHorizontalBar(verticalSide)) { @@ -305,15 +416,9 @@ public class SystemBarConfigs { if (verticalBarConfig != null && horizontalBarConfig != null) { int horizontalBarZOrder = horizontalBarConfig.getZOrder(); - int horizontalBarGirth = horizontalBarConfig.getGirth(); int verticalBarZOrder = verticalBarConfig.getZOrder(); - int verticalBarGirth = verticalBarConfig.getGirth(); - if (horizontalBarZOrder > verticalBarZOrder) { - verticalBarConfig.setPaddingBySide(horizontalSide, horizontalBarGirth); - } else if (horizontalBarZOrder < verticalBarZOrder) { - horizontalBarConfig.setPaddingBySide(verticalSide, verticalBarGirth); - } else { + if (horizontalBarZOrder == verticalBarZOrder) { throw new RuntimeException( BAR_TITLE_MAP.get(horizontalSide) + " " + BAR_TITLE_MAP.get(verticalSide) + " have the same Z-Order, and so their placing order cannot be " @@ -324,21 +429,6 @@ public class SystemBarConfigs { } } - private void sortSystemBarSidesByZOrder() { - List<SystemBarConfig> systemBarsByZOrder = new ArrayList<>(mSystemBarConfigMap.values()); - - systemBarsByZOrder.sort(new Comparator<SystemBarConfig>() { - @Override - public int compare(SystemBarConfig o1, SystemBarConfig o2) { - return o1.getZOrder() - o2.getZOrder(); - } - }); - - systemBarsByZOrder.forEach(systemBarConfig -> { - mSystemBarSidesByZOrder.add(systemBarConfig.getSide()); - }); - } - private static boolean isHorizontalBar(@SystemBarSide int side) { return side == TOP || side == BOTTOM; } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java index 7d353f5acd9a..8468bef1750c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/BottomNotificationPanelViewMediator.java @@ -20,16 +20,16 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayPanelViewController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.policy.ConfigurationController; import javax.inject.Inject; -import javax.inject.Singleton; /** * Implementation of NotificationPanelViewMediator that sets the notification panel to be opened * from the top navigation bar. */ -@Singleton +@SysUISingleton public class BottomNotificationPanelViewMediator extends NotificationPanelViewMediator { @Inject diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java index d4f720715a69..3b22a30857a9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarHeadsUpNotificationSystemContainer.java @@ -29,15 +29,15 @@ import com.android.car.notification.R; import com.android.car.notification.headsup.CarHeadsUpNotificationContainer; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import javax.inject.Inject; -import javax.inject.Singleton; /** * A controller for SysUI's HUN display. */ -@Singleton +@SysUISingleton public class CarHeadsUpNotificationSystemContainer implements CarHeadsUpNotificationContainer { private final CarDeviceProvisionedController mCarDeviceProvisionedController; private final OverlayViewGlobalStateController mOverlayViewGlobalStateController; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java index b7bc63150ea9..8a3bcfc5ef3a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/CarNotificationModule.java @@ -25,8 +25,7 @@ import com.android.car.notification.NotificationClickHandlerFactory; import com.android.car.notification.NotificationDataManager; import com.android.car.notification.headsup.CarHeadsUpNotificationContainer; import com.android.internal.statusbar.IStatusBarService; - -import javax.inject.Singleton; +import com.android.systemui.dagger.SysUISingleton; import dagger.Binds; import dagger.Module; @@ -38,26 +37,26 @@ import dagger.Provides; @Module public abstract class CarNotificationModule { @Provides - @Singleton + @SysUISingleton static NotificationClickHandlerFactory provideNotificationClickHandlerFactory( IStatusBarService barService) { return new NotificationClickHandlerFactory(barService); } @Provides - @Singleton + @SysUISingleton static NotificationDataManager provideNotificationDataManager() { return new NotificationDataManager(); } @Provides - @Singleton + @SysUISingleton static CarUxRestrictionManagerWrapper provideCarUxRestrictionManagerWrapper() { return new CarUxRestrictionManagerWrapper(); } @Provides - @Singleton + @SysUISingleton static CarNotificationListener provideCarNotificationListener(Context context, CarUxRestrictionManagerWrapper carUxRestrictionManagerWrapper, CarHeadsUpNotificationManager carHeadsUpNotificationManager, @@ -69,7 +68,7 @@ public abstract class CarNotificationModule { } @Provides - @Singleton + @SysUISingleton static CarHeadsUpNotificationManager provideCarHeadsUpNotificationManager(Context context, NotificationClickHandlerFactory notificationClickHandlerFactory, NotificationDataManager notificationDataManager, diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index 65de46d36dd0..e8b332149864 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -49,20 +49,20 @@ import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.CarServiceProvider; import com.android.systemui.car.window.OverlayPanelViewController; import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; +import com.android.wm.shell.animation.FlingAnimationUtils; import java.util.concurrent.Executor; import javax.inject.Inject; -import javax.inject.Singleton; /** View controller for the notification panel. */ -@Singleton +@SysUISingleton public class NotificationPanelViewController extends OverlayPanelViewController implements CommandQueue.Callbacks { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java index 0c185bae8199..17b6b74014e4 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewMediator.java @@ -31,16 +31,16 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayViewMediator; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.policy.ConfigurationController; import javax.inject.Inject; -import javax.inject.Singleton; /** * The view mediator which attaches the view controller to other elements of the system ui. Disables * drag open behavior of the notification panel from any navigation bar. */ -@Singleton +@SysUISingleton public class NotificationPanelViewMediator implements OverlayViewMediator, ConfigurationController.ConfigurationListener { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationShadeWindowControllerImpl.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationShadeWindowControllerImpl.java new file mode 100644 index 000000000000..1a1da89f147a --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationShadeWindowControllerImpl.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.notification; + +import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.statusbar.NotificationShadeWindowController; + +import javax.inject.Inject; + +/** The automotive version of the notification shade window controller. */ +@SysUISingleton +public class NotificationShadeWindowControllerImpl implements + NotificationShadeWindowController { + + private final OverlayViewGlobalStateController mController; + + @Inject + public NotificationShadeWindowControllerImpl(OverlayViewGlobalStateController controller) { + mController = controller; + } + + @Override + public void setForceDozeBrightness(boolean forceDozeBrightness) { + // No-op since dozing is not supported in Automotive devices. + } + + @Override + public void setNotificationShadeFocusable(boolean focusable) { + mController.setWindowFocusable(focusable); + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java index 44c819711bd2..b263f721d29a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationVisibilityLogger.java @@ -24,19 +24,19 @@ import com.android.car.notification.AlertEntry; import com.android.car.notification.NotificationDataManager; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.UiBackground; import java.util.Set; import java.util.concurrent.Executor; import javax.inject.Inject; -import javax.inject.Singleton; /** * Handles notification logging, in particular, logging which notifications are visible and which * are not. */ -@Singleton +@SysUISingleton public class NotificationVisibilityLogger { private static final String TAG = "NotificationVisibilityLogger"; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java index 92a11d8db88f..da43c5487623 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/PowerManagerHelper.java @@ -23,14 +23,14 @@ import android.car.hardware.power.CarPowerManager.CarPowerStateListener; import android.util.Log; import com.android.systemui.car.CarServiceProvider; +import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; -import javax.inject.Singleton; /** * Helper class for connecting to the {@link CarPowerManager} and listening for power state changes. */ -@Singleton +@SysUISingleton public class PowerManagerHelper { public static final String TAG = "PowerManagerHelper"; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java index 89c9931ac76e..9bc5b74cda6c 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/TopNotificationPanelViewMediator.java @@ -20,16 +20,16 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.navigationbar.CarNavigationBarController; import com.android.systemui.car.window.OverlayPanelViewController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.policy.ConfigurationController; import javax.inject.Inject; -import javax.inject.Singleton; /** * Implementation of NotificationPanelViewMediator that sets the notification panel to be opened * from the top navigation bar. */ -@Singleton +@SysUISingleton public class TopNotificationPanelViewMediator extends NotificationPanelViewMediator { @Inject diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java index 6b41b35f7625..b8d6964fa32d 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppController.java @@ -22,14 +22,14 @@ import android.os.RemoteException; import android.util.Log; import com.android.systemui.SystemUI; +import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; -import javax.inject.Singleton; /** * Controller responsible for detecting unsafe apps. */ -@Singleton +@SysUISingleton public class SideLoadedAppController extends SystemUI { private static final String TAG = SideLoadedAppController.class.getSimpleName(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java index 5dcb9de4755e..f96ee0f73dc0 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppDetector.java @@ -17,7 +17,7 @@ package com.android.systemui.car.sideloaded; import android.annotation.NonNull; -import android.app.ActivityManager; +import android.app.ActivityTaskManager.RootTaskInfo; import android.content.ComponentName; import android.content.pm.ApplicationInfo; import android.content.pm.InstallSourceInfo; @@ -29,19 +29,19 @@ import android.util.Log; import com.android.systemui.R; import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import java.util.Arrays; import java.util.List; import javax.inject.Inject; -import javax.inject.Singleton; /** * A class that detects unsafe apps. - * An app is considered safe if is a system app or installed through whitelisted sources. + * An app is considered safe if is a system app or installed through allowed sources. */ -@Singleton +@SysUISingleton public class SideLoadedAppDetector { private static final String TAG = SideLoadedAppDetector.class.getSimpleName(); @@ -78,10 +78,10 @@ public class SideLoadedAppDetector { return false; } - boolean isSafe(@NonNull ActivityManager.StackInfo stackInfo) { - ComponentName componentName = stackInfo.topActivity; + boolean isSafe(@NonNull RootTaskInfo taskInfo) { + ComponentName componentName = taskInfo.topActivity; if (componentName == null) { - Log.w(TAG, "Stack info does not have top activity: " + stackInfo.stackId); + Log.w(TAG, "Task info does not have top activity: " + taskInfo.taskId); return false; } return isSafe(componentName.getPackageName()); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java index c8c1a40b8032..db7718bc166b 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppListener.java @@ -16,8 +16,7 @@ package com.android.systemui.car.sideloaded; -import android.app.ActivityManager; -import android.app.ActivityManager.StackInfo; +import android.app.ActivityTaskManager.RootTaskInfo; import android.app.IActivityTaskManager; import android.app.TaskStackListener; import android.content.ComponentName; @@ -56,15 +55,15 @@ public class SideLoadedAppListener extends TaskStackListener { public void onTaskCreated(int taskId, ComponentName componentName) throws RemoteException { super.onTaskCreated(taskId, componentName); - List<StackInfo> stackInfoList = mActivityTaskManager.getAllStackInfos(); - ActivityManager.StackInfo stackInfo = getStackInfo(stackInfoList, taskId); - if (stackInfo == null) { + List<RootTaskInfo> taskInfoList = mActivityTaskManager.getAllRootTaskInfos(); + RootTaskInfo taskInfo = getStackInfo(taskInfoList, taskId); + if (taskInfo == null) { Log.e(TAG, "Stack info was not available for taskId: " + taskId); return; } - if (!mSideLoadedAppDetector.isSafe(stackInfo)) { - Display display = mDisplayManager.getDisplay(stackInfo.displayId); + if (!mSideLoadedAppDetector.isSafe(taskInfo)) { + Display display = mDisplayManager.getDisplay(taskInfo.displayId); mSideLoadedAppStateController.onUnsafeTaskCreatedOnDisplay(display); } } @@ -75,18 +74,18 @@ public class SideLoadedAppListener extends TaskStackListener { Display[] displays = mDisplayManager.getDisplays(); for (Display display : displays) { - // Note that the stackInfoList is ordered by recency. - List<StackInfo> stackInfoList = - mActivityTaskManager.getAllStackInfosOnDisplay(display.getDisplayId()); + // Note that the taskInfoList is ordered by recency. + List<RootTaskInfo> taskInfoList = + mActivityTaskManager.getAllRootTaskInfosOnDisplay(display.getDisplayId()); - if (stackInfoList == null) { + if (taskInfoList == null) { continue; } - StackInfo stackInfo = getTopVisibleStackInfo(stackInfoList); - if (stackInfo == null) { + RootTaskInfo taskInfo = getTopVisibleStackInfo(taskInfoList); + if (taskInfo == null) { continue; } - if (mSideLoadedAppDetector.isSafe(stackInfo)) { + if (mSideLoadedAppDetector.isSafe(taskInfo)) { mSideLoadedAppStateController.onSafeTaskDisplayedOnDisplay(display); } else { mSideLoadedAppStateController.onUnsafeTaskDisplayedOnDisplay(display); @@ -97,18 +96,17 @@ public class SideLoadedAppListener extends TaskStackListener { /** * Returns stack info for a given taskId. */ - private ActivityManager.StackInfo getStackInfo( - List<ActivityManager.StackInfo> stackInfoList, int taskId) { - if (stackInfoList == null) { + private RootTaskInfo getStackInfo(List<RootTaskInfo> taskInfoList, int taskId) { + if (taskInfoList == null) { return null; } - for (ActivityManager.StackInfo stackInfo : stackInfoList) { - if (stackInfo.taskIds == null) { + for (RootTaskInfo taskInfo : taskInfoList) { + if (taskInfo.childTaskIds == null) { continue; } - for (int stackTaskId : stackInfo.taskIds) { - if (taskId == stackTaskId) { - return stackInfo; + for (int taskTaskId : taskInfo.childTaskIds) { + if (taskId == taskTaskId) { + return taskInfo; } } } @@ -118,11 +116,10 @@ public class SideLoadedAppListener extends TaskStackListener { /** * Returns the first visible stackInfo. */ - private ActivityManager.StackInfo getTopVisibleStackInfo( - List<ActivityManager.StackInfo> stackInfoList) { - for (ActivityManager.StackInfo stackInfo : stackInfoList) { - if (stackInfo.visible) { - return stackInfo; + private RootTaskInfo getTopVisibleStackInfo(List<RootTaskInfo> taskInfoList) { + for (RootTaskInfo taskInfo : taskInfoList) { + if (taskInfo.visible) { + return taskInfo; } } return null; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java index 1d66ddaf7aa9..5b4faa152685 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/sideloaded/SideLoadedAppStateController.java @@ -19,13 +19,14 @@ package com.android.systemui.car.sideloaded; import android.util.Log; import android.view.Display; +import com.android.systemui.dagger.SysUISingleton; + import javax.inject.Inject; -import javax.inject.Singleton; /** * Manager responsible for displaying proper UI when an unsafe app is detected. */ -@Singleton +@SysUISingleton public class SideLoadedAppStateController { private static final String TAG = SideLoadedAppStateController.class.getSimpleName(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java index d23660c2445d..3fb3cd8833b9 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DozeServiceHost.java @@ -16,13 +16,13 @@ package com.android.systemui.car.statusbar; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.doze.DozeHost; import javax.inject.Inject; -import javax.inject.Singleton; /** No-op implementation of {@link DozeHost} for use by car sysui, which does not support dozing. */ -@Singleton +@SysUISingleton public class DozeServiceHost implements DozeHost { @Inject diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DummyNotificationShadeWindowController.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DummyNotificationShadeWindowController.java deleted file mode 100644 index 13f2b7ed45db..000000000000 --- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/DummyNotificationShadeWindowController.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.car.statusbar; - -import android.app.IActivityManager; -import android.content.Context; -import android.view.WindowManager; - -import com.android.systemui.car.window.SystemUIOverlayWindowController; -import com.android.systemui.colorextraction.SysuiColorExtractor; -import com.android.systemui.dump.DumpManager; -import com.android.systemui.keyguard.KeyguardViewMediator; -import com.android.systemui.plugins.statusbar.StatusBarStateController; -import com.android.systemui.statusbar.phone.BiometricUnlockController; -import com.android.systemui.statusbar.phone.DozeParameters; -import com.android.systemui.statusbar.phone.KeyguardBypassController; -import com.android.systemui.statusbar.phone.NotificationShadeWindowController; -import com.android.systemui.statusbar.policy.ConfigurationController; - -import javax.inject.Inject; -import javax.inject.Singleton; - -/** - * A dummy implementation of {@link NotificationShadeWindowController}. - * - * TODO(b/155711562): This should be replaced with a longer term solution (i.e. separating - * {@link BiometricUnlockController} from the views it depends on). - */ -@Singleton -public class DummyNotificationShadeWindowController extends NotificationShadeWindowController { - private final SystemUIOverlayWindowController mOverlayWindowController; - - @Inject - public DummyNotificationShadeWindowController(Context context, - WindowManager windowManager, IActivityManager activityManager, - DozeParameters dozeParameters, - StatusBarStateController statusBarStateController, - ConfigurationController configurationController, - KeyguardViewMediator keyguardViewMediator, - KeyguardBypassController keyguardBypassController, - SysuiColorExtractor colorExtractor, - DumpManager dumpManager, - SystemUIOverlayWindowController overlayWindowController) { - super(context, windowManager, activityManager, dozeParameters, statusBarStateController, - configurationController, keyguardViewMediator, keyguardBypassController, - colorExtractor, dumpManager); - mOverlayWindowController = overlayWindowController; - } - - @Override - public void setForceDozeBrightness(boolean forceDozeBrightness) { - // No op. - } - - @Override - public void setNotificationShadeFocusable(boolean focusable) { - // The overlay window is the car sysui equivalent of the notification shade. - mOverlayWindowController.setWindowFocusable(focusable); - } -} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UnusedStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UnusedStatusBar.java deleted file mode 100644 index 48334bd6e5c7..000000000000 --- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UnusedStatusBar.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.car.statusbar; - -import android.content.Context; -import android.os.Handler; -import android.os.PowerManager; -import android.util.DisplayMetrics; - -import com.android.internal.logging.MetricsLogger; -import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.keyguard.ViewMediatorCallback; -import com.android.systemui.InitController; -import com.android.systemui.assist.AssistManager; -import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.bubbles.BubbleController; -import com.android.systemui.colorextraction.SysuiColorExtractor; -import com.android.systemui.keyguard.DismissCallbackRegistry; -import com.android.systemui.keyguard.KeyguardViewMediator; -import com.android.systemui.keyguard.ScreenLifecycle; -import com.android.systemui.keyguard.WakefulnessLifecycle; -import com.android.systemui.plugins.DarkIconDispatcher; -import com.android.systemui.plugins.FalsingManager; -import com.android.systemui.plugins.PluginDependencyProvider; -import com.android.systemui.recents.Recents; -import com.android.systemui.recents.ScreenPinningRequest; -import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.stackdivider.Divider; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.KeyguardIndicationController; -import com.android.systemui.statusbar.NavigationBarController; -import com.android.systemui.statusbar.NotificationLockscreenUserManager; -import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.statusbar.NotificationRemoteInputManager; -import com.android.systemui.statusbar.NotificationShadeDepthController; -import com.android.systemui.statusbar.NotificationViewHierarchyManager; -import com.android.systemui.statusbar.PulseExpansionHandler; -import com.android.systemui.statusbar.SuperStatusBarViewFactory; -import com.android.systemui.statusbar.SysuiStatusBarStateController; -import com.android.systemui.statusbar.VibratorHelper; -import com.android.systemui.statusbar.notification.DynamicPrivacyController; -import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; -import com.android.systemui.statusbar.notification.VisualStabilityManager; -import com.android.systemui.statusbar.notification.init.NotificationsController; -import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier; -import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider; -import com.android.systemui.statusbar.notification.logging.NotificationLogger; -import com.android.systemui.statusbar.notification.row.NotificationGutsManager; -import com.android.systemui.statusbar.phone.AutoHideController; -import com.android.systemui.statusbar.phone.BiometricUnlockController; -import com.android.systemui.statusbar.phone.DozeParameters; -import com.android.systemui.statusbar.phone.DozeScrimController; -import com.android.systemui.statusbar.phone.DozeServiceHost; -import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; -import com.android.systemui.statusbar.phone.KeyguardBypassController; -import com.android.systemui.statusbar.phone.KeyguardDismissUtil; -import com.android.systemui.statusbar.phone.KeyguardLiftController; -import com.android.systemui.statusbar.phone.LightBarController; -import com.android.systemui.statusbar.phone.LightsOutNotifController; -import com.android.systemui.statusbar.phone.LockscreenLockIconController; -import com.android.systemui.statusbar.phone.LockscreenWallpaper; -import com.android.systemui.statusbar.phone.NavigationBarView; -import com.android.systemui.statusbar.phone.NotificationGroupManager; -import com.android.systemui.statusbar.phone.NotificationShadeWindowController; -import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy; -import com.android.systemui.statusbar.phone.ScrimController; -import com.android.systemui.statusbar.phone.ShadeController; -import com.android.systemui.statusbar.phone.StatusBar; -import com.android.systemui.statusbar.phone.StatusBarIconController; -import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter; -import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; -import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; -import com.android.systemui.statusbar.policy.BatteryController; -import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.statusbar.policy.ExtensionController; -import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.statusbar.policy.NetworkController; -import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; -import com.android.systemui.statusbar.policy.UserInfoControllerImpl; -import com.android.systemui.statusbar.policy.UserSwitcherController; -import com.android.systemui.volume.VolumeComponent; - -import java.util.Optional; -import java.util.concurrent.Executor; - -import javax.inject.Provider; - -import dagger.Lazy; - -/** Unused variant of {@link StatusBar} specifically used in the automotive context. */ -public class UnusedStatusBar extends StatusBar { - - public UnusedStatusBar(Context context, - NotificationsController notificationsController, - LightBarController lightBarController, - AutoHideController autoHideController, - KeyguardUpdateMonitor keyguardUpdateMonitor, - StatusBarIconController statusBarIconController, - PulseExpansionHandler pulseExpansionHandler, - NotificationWakeUpCoordinator notificationWakeUpCoordinator, - KeyguardBypassController keyguardBypassController, - KeyguardStateController keyguardStateController, - HeadsUpManagerPhone headsUpManagerPhone, - DynamicPrivacyController dynamicPrivacyController, - BypassHeadsUpNotifier bypassHeadsUpNotifier, - FalsingManager falsingManager, - BroadcastDispatcher broadcastDispatcher, - RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler, - NotificationGutsManager notificationGutsManager, - NotificationLogger notificationLogger, - NotificationInterruptStateProvider notificationInterruptStateProvider, - NotificationViewHierarchyManager notificationViewHierarchyManager, - KeyguardViewMediator keyguardViewMediator, - DisplayMetrics displayMetrics, - MetricsLogger metricsLogger, - Executor uiBgExecutor, - NotificationMediaManager notificationMediaManager, - NotificationLockscreenUserManager lockScreenUserManager, - NotificationRemoteInputManager remoteInputManager, - UserSwitcherController userSwitcherController, - NetworkController networkController, - BatteryController batteryController, - SysuiColorExtractor colorExtractor, - ScreenLifecycle screenLifecycle, - WakefulnessLifecycle wakefulnessLifecycle, - SysuiStatusBarStateController statusBarStateController, - VibratorHelper vibratorHelper, - BubbleController bubbleController, - NotificationGroupManager groupManager, - VisualStabilityManager visualStabilityManager, - DeviceProvisionedController deviceProvisionedController, - NavigationBarController navigationBarController, - Lazy<AssistManager> assistManagerLazy, - ConfigurationController configurationController, - NotificationShadeWindowController notificationShadeWindowController, - LockscreenLockIconController lockscreenLockIconController, - DozeParameters dozeParameters, - ScrimController scrimController, - KeyguardLiftController keyguardLiftController, - Lazy<LockscreenWallpaper> lockscreenWallpaperLazy, - Lazy<BiometricUnlockController> biometricUnlockControllerLazy, - DozeServiceHost dozeServiceHost, - PowerManager powerManager, - ScreenPinningRequest screenPinningRequest, - DozeScrimController dozeScrimController, - VolumeComponent volumeComponent, - CommandQueue commandQueue, - Optional<Recents> recentsOptional, - Provider<StatusBarComponent.Builder> statusBarComponentBuilder, - PluginManager pluginManager, - Optional<Divider> dividerOptional, - LightsOutNotifController lightsOutNotifController, - StatusBarNotificationActivityStarter.Builder statusBarNotifActivityStarterBuilder, - ShadeController shadeController, - SuperStatusBarViewFactory superStatusBarViewFactory, - StatusBarKeyguardViewManager statusBarKeyguardViewManager, - ViewMediatorCallback viewMediatorCallback, - InitController initController, - DarkIconDispatcher darkIconDispatcher, - Handler timeTickHandler, - PluginDependencyProvider pluginDependencyProvider, - KeyguardDismissUtil keyguardDismissUtil, - ExtensionController extensionController, - UserInfoControllerImpl userInfoControllerImpl, - PhoneStatusBarPolicy phoneStatusBarPolicy, - KeyguardIndicationController keyguardIndicationController, - DismissCallbackRegistry dismissCallbackRegistry, - Lazy<NotificationShadeDepthController> notificationShadeDepthControllerLazy, - StatusBarTouchableRegionManager statusBarTouchableRegionManager) { - super(context, notificationsController, lightBarController, autoHideController, - keyguardUpdateMonitor, statusBarIconController, pulseExpansionHandler, - notificationWakeUpCoordinator, keyguardBypassController, keyguardStateController, - headsUpManagerPhone, dynamicPrivacyController, bypassHeadsUpNotifier, - falsingManager, - broadcastDispatcher, remoteInputQuickSettingsDisabler, notificationGutsManager, - notificationLogger, notificationInterruptStateProvider, - notificationViewHierarchyManager, keyguardViewMediator, displayMetrics, - metricsLogger, - uiBgExecutor, notificationMediaManager, lockScreenUserManager, remoteInputManager, - userSwitcherController, networkController, batteryController, colorExtractor, - screenLifecycle, wakefulnessLifecycle, statusBarStateController, vibratorHelper, - bubbleController, groupManager, visualStabilityManager, deviceProvisionedController, - navigationBarController, assistManagerLazy, configurationController, - notificationShadeWindowController, lockscreenLockIconController, dozeParameters, - scrimController, keyguardLiftController, lockscreenWallpaperLazy, - biometricUnlockControllerLazy, dozeServiceHost, powerManager, screenPinningRequest, - dozeScrimController, volumeComponent, commandQueue, recentsOptional, - statusBarComponentBuilder, pluginManager, dividerOptional, lightsOutNotifController, - statusBarNotifActivityStarterBuilder, shadeController, superStatusBarViewFactory, - statusBarKeyguardViewManager, viewMediatorCallback, initController, - darkIconDispatcher, - timeTickHandler, pluginDependencyProvider, keyguardDismissUtil, extensionController, - userInfoControllerImpl, phoneStatusBarPolicy, keyguardIndicationController, - dismissCallbackRegistry, notificationShadeDepthControllerLazy, - statusBarTouchableRegionManager); - } - - @Override - public void notifyBiometricAuthModeChanged() { - // No-op for Automotive devices. - } - - @Override - public NavigationBarView getNavigationBarView() { - // Return null for Automotive devices. - return null; - } -} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UnusedStatusBarModule.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UnusedStatusBarModule.java deleted file mode 100644 index 2c86e4db3b82..000000000000 --- a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UnusedStatusBarModule.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.car.statusbar; - -import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; - -import android.content.Context; -import android.os.Handler; -import android.os.PowerManager; -import android.util.DisplayMetrics; - -import androidx.annotation.Nullable; - -import com.android.internal.logging.MetricsLogger; -import com.android.keyguard.KeyguardUpdateMonitor; -import com.android.keyguard.ViewMediatorCallback; -import com.android.systemui.InitController; -import com.android.systemui.assist.AssistManager; -import com.android.systemui.broadcast.BroadcastDispatcher; -import com.android.systemui.bubbles.BubbleController; -import com.android.systemui.colorextraction.SysuiColorExtractor; -import com.android.systemui.dagger.qualifiers.UiBackground; -import com.android.systemui.keyguard.DismissCallbackRegistry; -import com.android.systemui.keyguard.KeyguardViewMediator; -import com.android.systemui.keyguard.ScreenLifecycle; -import com.android.systemui.keyguard.WakefulnessLifecycle; -import com.android.systemui.plugins.DarkIconDispatcher; -import com.android.systemui.plugins.FalsingManager; -import com.android.systemui.plugins.PluginDependencyProvider; -import com.android.systemui.recents.Recents; -import com.android.systemui.recents.ScreenPinningRequest; -import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.stackdivider.Divider; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.KeyguardIndicationController; -import com.android.systemui.statusbar.NavigationBarController; -import com.android.systemui.statusbar.NotificationLockscreenUserManager; -import com.android.systemui.statusbar.NotificationMediaManager; -import com.android.systemui.statusbar.NotificationRemoteInputManager; -import com.android.systemui.statusbar.NotificationShadeDepthController; -import com.android.systemui.statusbar.NotificationViewHierarchyManager; -import com.android.systemui.statusbar.PulseExpansionHandler; -import com.android.systemui.statusbar.SuperStatusBarViewFactory; -import com.android.systemui.statusbar.SysuiStatusBarStateController; -import com.android.systemui.statusbar.VibratorHelper; -import com.android.systemui.statusbar.dagger.StatusBarDependenciesModule; -import com.android.systemui.statusbar.notification.DynamicPrivacyController; -import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; -import com.android.systemui.statusbar.notification.VisualStabilityManager; -import com.android.systemui.statusbar.notification.init.NotificationsController; -import com.android.systemui.statusbar.notification.interruption.BypassHeadsUpNotifier; -import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider; -import com.android.systemui.statusbar.notification.logging.NotificationLogger; -import com.android.systemui.statusbar.notification.row.NotificationGutsManager; -import com.android.systemui.statusbar.notification.row.NotificationRowModule; -import com.android.systemui.statusbar.phone.AutoHideController; -import com.android.systemui.statusbar.phone.BiometricUnlockController; -import com.android.systemui.statusbar.phone.DozeParameters; -import com.android.systemui.statusbar.phone.DozeScrimController; -import com.android.systemui.statusbar.phone.DozeServiceHost; -import com.android.systemui.statusbar.phone.HeadsUpManagerPhone; -import com.android.systemui.statusbar.phone.KeyguardBypassController; -import com.android.systemui.statusbar.phone.KeyguardDismissUtil; -import com.android.systemui.statusbar.phone.KeyguardLiftController; -import com.android.systemui.statusbar.phone.LightBarController; -import com.android.systemui.statusbar.phone.LightsOutNotifController; -import com.android.systemui.statusbar.phone.LockscreenLockIconController; -import com.android.systemui.statusbar.phone.LockscreenWallpaper; -import com.android.systemui.statusbar.phone.NotificationGroupManager; -import com.android.systemui.statusbar.phone.NotificationShadeWindowController; -import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy; -import com.android.systemui.statusbar.phone.ScrimController; -import com.android.systemui.statusbar.phone.ShadeController; -import com.android.systemui.statusbar.phone.StatusBarIconController; -import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; -import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter; -import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; -import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; -import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneDependenciesModule; -import com.android.systemui.statusbar.policy.BatteryController; -import com.android.systemui.statusbar.policy.ConfigurationController; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.statusbar.policy.ExtensionController; -import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.statusbar.policy.NetworkController; -import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; -import com.android.systemui.statusbar.policy.UserInfoControllerImpl; -import com.android.systemui.statusbar.policy.UserSwitcherController; -import com.android.systemui.volume.VolumeComponent; - -import java.util.Optional; -import java.util.concurrent.Executor; - -import javax.inject.Named; -import javax.inject.Provider; -import javax.inject.Singleton; - -import dagger.Lazy; -import dagger.Module; -import dagger.Provides; - -/** - * Dagger Module providing {@link UnusedStatusBar}. - */ -@Module(includes = {StatusBarDependenciesModule.class, StatusBarPhoneDependenciesModule.class, - NotificationRowModule.class}) -public interface UnusedStatusBarModule { - /** - * Provides our instance of StatusBar which is considered optional. - */ - @Provides - @Singleton - static UnusedStatusBar provideStatusBar( - Context context, - NotificationsController notificationsController, - LightBarController lightBarController, - AutoHideController autoHideController, - KeyguardUpdateMonitor keyguardUpdateMonitor, - StatusBarIconController statusBarIconController, - PulseExpansionHandler pulseExpansionHandler, - NotificationWakeUpCoordinator notificationWakeUpCoordinator, - KeyguardBypassController keyguardBypassController, - KeyguardStateController keyguardStateController, - HeadsUpManagerPhone headsUpManagerPhone, - DynamicPrivacyController dynamicPrivacyController, - BypassHeadsUpNotifier bypassHeadsUpNotifier, - FalsingManager falsingManager, - BroadcastDispatcher broadcastDispatcher, - RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler, - NotificationGutsManager notificationGutsManager, - NotificationLogger notificationLogger, - NotificationInterruptStateProvider notificationInterruptStateProvider, - NotificationViewHierarchyManager notificationViewHierarchyManager, - KeyguardViewMediator keyguardViewMediator, - DisplayMetrics displayMetrics, - MetricsLogger metricsLogger, - @UiBackground Executor uiBgExecutor, - NotificationMediaManager notificationMediaManager, - NotificationLockscreenUserManager lockScreenUserManager, - NotificationRemoteInputManager remoteInputManager, - UserSwitcherController userSwitcherController, - NetworkController networkController, - BatteryController batteryController, - SysuiColorExtractor colorExtractor, - ScreenLifecycle screenLifecycle, - WakefulnessLifecycle wakefulnessLifecycle, - SysuiStatusBarStateController statusBarStateController, - VibratorHelper vibratorHelper, - BubbleController bubbleController, - NotificationGroupManager groupManager, - VisualStabilityManager visualStabilityManager, - DeviceProvisionedController deviceProvisionedController, - NavigationBarController navigationBarController, - Lazy<AssistManager> assistManagerLazy, - ConfigurationController configurationController, - NotificationShadeWindowController notificationShadeWindowController, - LockscreenLockIconController lockscreenLockIconController, - DozeParameters dozeParameters, - ScrimController scrimController, - @Nullable KeyguardLiftController keyguardLiftController, - Lazy<LockscreenWallpaper> lockscreenWallpaperLazy, - Lazy<BiometricUnlockController> biometricUnlockControllerLazy, - DozeServiceHost dozeServiceHost, - PowerManager powerManager, - ScreenPinningRequest screenPinningRequest, - DozeScrimController dozeScrimController, - VolumeComponent volumeComponent, - CommandQueue commandQueue, - Optional<Recents> recentsOptional, - Provider<StatusBarComponent.Builder> statusBarComponentBuilder, - PluginManager pluginManager, - Optional<Divider> dividerOptional, - LightsOutNotifController lightsOutNotifController, - StatusBarNotificationActivityStarter.Builder - statusBarNotificationActivityStarterBuilder, - ShadeController shadeController, - SuperStatusBarViewFactory superStatusBarViewFactory, - StatusBarKeyguardViewManager statusBarKeyguardViewManager, - ViewMediatorCallback viewMediatorCallback, - InitController initController, - DarkIconDispatcher darkIconDispatcher, - @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler, - PluginDependencyProvider pluginDependencyProvider, - KeyguardDismissUtil keyguardDismissUtil, - ExtensionController extensionController, - UserInfoControllerImpl userInfoControllerImpl, - PhoneStatusBarPolicy phoneStatusBarPolicy, - KeyguardIndicationController keyguardIndicationController, - Lazy<NotificationShadeDepthController> notificationShadeDepthController, - DismissCallbackRegistry dismissCallbackRegistry, - StatusBarTouchableRegionManager statusBarTouchableRegionManager) { - return new UnusedStatusBar( - context, - notificationsController, - lightBarController, - autoHideController, - keyguardUpdateMonitor, - statusBarIconController, - pulseExpansionHandler, - notificationWakeUpCoordinator, - keyguardBypassController, - keyguardStateController, - headsUpManagerPhone, - dynamicPrivacyController, - bypassHeadsUpNotifier, - falsingManager, - broadcastDispatcher, - remoteInputQuickSettingsDisabler, - notificationGutsManager, - notificationLogger, - notificationInterruptStateProvider, - notificationViewHierarchyManager, - keyguardViewMediator, - displayMetrics, - metricsLogger, - uiBgExecutor, - notificationMediaManager, - lockScreenUserManager, - remoteInputManager, - userSwitcherController, - networkController, - batteryController, - colorExtractor, - screenLifecycle, - wakefulnessLifecycle, - statusBarStateController, - vibratorHelper, - bubbleController, - groupManager, - visualStabilityManager, - deviceProvisionedController, - navigationBarController, - assistManagerLazy, - configurationController, - notificationShadeWindowController, - lockscreenLockIconController, - dozeParameters, - scrimController, - keyguardLiftController, - lockscreenWallpaperLazy, - biometricUnlockControllerLazy, - dozeServiceHost, - powerManager, - screenPinningRequest, - dozeScrimController, - volumeComponent, - commandQueue, - recentsOptional, - statusBarComponentBuilder, - pluginManager, - dividerOptional, - lightsOutNotifController, - statusBarNotificationActivityStarterBuilder, - shadeController, - superStatusBarViewFactory, - statusBarKeyguardViewManager, - viewMediatorCallback, - initController, - darkIconDispatcher, - timeTickHandler, - pluginDependencyProvider, - keyguardDismissUtil, - extensionController, - userInfoControllerImpl, - phoneStatusBarPolicy, - keyguardIndicationController, - dismissCallbackRegistry, - notificationShadeDepthController, - statusBarTouchableRegionManager); - } -} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java new file mode 100644 index 000000000000..1b1a118d6ba1 --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/car/statusbar/UserNameViewController.java @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.car.statusbar; + +import android.car.Car; +import android.car.user.CarUserManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.UserInfo; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import com.android.systemui.R; +import com.android.systemui.broadcast.BroadcastDispatcher; +import com.android.systemui.car.CarDeviceProvisionedController; +import com.android.systemui.car.CarServiceProvider; +import com.android.systemui.dagger.SysUISingleton; + +import javax.inject.Inject; + +/** + * Controls a TextView with the current driver's username + */ +@SysUISingleton +public class UserNameViewController { + private static final String TAG = "UserNameViewController"; + + private Context mContext; + private UserManager mUserManager; + private CarUserManager mCarUserManager; + private CarServiceProvider mCarServiceProvider; + private CarDeviceProvisionedController mCarDeviceProvisionedController; + private BroadcastDispatcher mBroadcastDispatcher; + private TextView mUserNameView; + + private final BroadcastReceiver mUserUpdateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + updateUser(mCarDeviceProvisionedController.getCurrentUser()); + } + }; + + private boolean mUserLifecycleListenerRegistered = false; + + private final CarUserManager.UserLifecycleListener mUserLifecycleListener = + new CarUserManager.UserLifecycleListener() { + @Override + public void onEvent(CarUserManager.UserLifecycleEvent event) { + if (event.getEventType() + == CarUserManager.USER_LIFECYCLE_EVENT_TYPE_SWITCHING) { + updateUser(event.getUserId()); + } + } + }; + + @Inject + public UserNameViewController(Context context, CarServiceProvider carServiceProvider, + UserManager userManager, BroadcastDispatcher broadcastDispatcher, + CarDeviceProvisionedController carDeviceProvisionedController) { + mContext = context; + mCarServiceProvider = carServiceProvider; + mUserManager = userManager; + mBroadcastDispatcher = broadcastDispatcher; + mCarDeviceProvisionedController = carDeviceProvisionedController; + } + + /** + * Find the {@link TextView} for the driver's user name from a view and if found set it with the + * current driver's user name. + */ + public void addUserNameView(View v) { + TextView userNameView = v.findViewById(R.id.user_name_text); + if (userNameView != null) { + if (mUserNameView == null) { + registerForUserChangeEvents(); + } + mUserNameView = userNameView; + updateUser(mCarDeviceProvisionedController.getCurrentUser()); + } + } + + /** + * Clean up the controller and unregister receiver. + */ + public void removeAll() { + mUserNameView = null; + if (mUserLifecycleListenerRegistered) { + mBroadcastDispatcher.unregisterReceiver(mUserUpdateReceiver); + if (mCarUserManager != null) { + mCarUserManager.removeListener(mUserLifecycleListener); + } + mUserLifecycleListenerRegistered = false; + } + } + + private void registerForUserChangeEvents() { + // Register for user switching + mCarServiceProvider.addListener(car -> { + mCarUserManager = (CarUserManager) car.getCarManager(Car.CAR_USER_SERVICE); + if (mCarUserManager != null) { + mCarUserManager.addListener(Runnable::run, mUserLifecycleListener); + mUserLifecycleListenerRegistered = true; + } else { + Log.e(TAG, "CarUserManager could not be obtained."); + } + }); + // Also register for user info changing + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_INFO_CHANGED); + mBroadcastDispatcher.registerReceiver(mUserUpdateReceiver, filter, /* executor= */ null, + UserHandle.ALL); + } + + private void updateUser(int userId) { + if (mUserNameView != null) { + UserInfo currentUserInfo = mUserManager.getUserInfo(userId); + mUserNameView.setText(currentUserInfo.name); + } + } +} diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java index aac4cfbf83c4..3a7fac9c0e79 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java @@ -30,15 +30,15 @@ import com.android.systemui.R; import com.android.systemui.car.CarServiceProvider; import com.android.systemui.car.window.OverlayViewController; import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import javax.inject.Inject; -import javax.inject.Singleton; /** * Controller for {@link R.layout#car_fullscreen_user_switcher}. */ -@Singleton +@SysUISingleton public class FullScreenUserSwitcherViewController extends OverlayViewController { private final Context mContext; private final Resources mResources; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java index 8b399f888eb3..165fe63c7f37 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullscreenUserSwitcherViewMediator.java @@ -18,16 +18,16 @@ package com.android.systemui.car.userswitcher; import com.android.systemui.car.keyguard.CarKeyguardViewController; import com.android.systemui.car.window.OverlayViewMediator; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; import javax.inject.Inject; -import javax.inject.Singleton; /** * Manages the fullscreen user switcher and it's interactions with the keyguard. */ -@Singleton +@SysUISingleton public class FullscreenUserSwitcherViewMediator implements OverlayViewMediator { private static final String TAG = FullscreenUserSwitcherViewMediator.class.getSimpleName(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java index d0a2aebdb80a..023b5b4f5f30 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserGridRecyclerView.java @@ -33,6 +33,7 @@ import android.car.user.CarUserManager; import android.car.user.UserCreationResult; import android.car.user.UserSwitchResult; import android.car.userlib.UserHelper; +import android.car.util.concurrent.AsyncFuture; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -60,7 +61,6 @@ import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.android.internal.infra.AndroidFuture; import com.android.internal.util.UserIcons; import com.android.systemui.R; @@ -131,7 +131,7 @@ public class UserGridRecyclerView extends RecyclerView { } private List<UserInfo> getUsersForUserGrid() { - return mUserManager.getUsers(/* excludeDying= */ true) + return mUserManager.getAliveUsers() .stream() .filter(UserInfo::supportsSwitchToByUser) .collect(Collectors.toList()); @@ -338,7 +338,7 @@ public class UserGridRecyclerView extends RecyclerView { maxSupportedUsers -= 1; } - List<UserInfo> users = mUserManager.getUsers(/* excludeDying= */ true); + List<UserInfo> users = mUserManager.getAliveUsers(); // Count all users that are managed profiles of another user. int managedProfilesCount = 0; @@ -449,7 +449,7 @@ public class UserGridRecyclerView extends RecyclerView { */ @Nullable public UserInfo createNewOrFindExistingGuest(Context context) { - AndroidFuture<UserCreationResult> future = mCarUserManager.createGuest(mGuestName); + AsyncFuture<UserCreationResult> future = mCarUserManager.createGuest(mGuestName); // CreateGuest will return null if a guest already exists. UserInfo newGuest = getUserInfo(future); if (newGuest != null) { @@ -482,7 +482,7 @@ public class UserGridRecyclerView extends RecyclerView { } @Nullable - private UserInfo getUserInfo(AndroidFuture<UserCreationResult> future) { + private UserInfo getUserInfo(AsyncFuture<UserCreationResult> future) { UserCreationResult userCreationResult; try { userCreationResult = future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS); @@ -504,7 +504,7 @@ public class UserGridRecyclerView extends RecyclerView { } private boolean switchUser(@UserIdInt int userId) { - AndroidFuture<UserSwitchResult> userSwitchResultFuture = + AsyncFuture<UserSwitchResult> userSwitchResultFuture = mCarUserManager.switchUser(userId); UserSwitchResult userSwitchResult; try { @@ -531,7 +531,7 @@ public class UserGridRecyclerView extends RecyclerView { @Override protected UserInfo doInBackground(String... userNames) { - AndroidFuture<UserCreationResult> future = mCarUserManager.createUser(userNames[0], + AsyncFuture<UserCreationResult> future = mCarUserManager.createUser(userNames[0], /* flags= */ 0); try { UserInfo user = getUserInfo(future); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java index 0d77c1341ffb..6178cbd3a599 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java @@ -38,15 +38,15 @@ import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.systemui.R; import com.android.systemui.car.window.OverlayViewController; import com.android.systemui.car.window.OverlayViewGlobalStateController; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import javax.inject.Inject; -import javax.inject.Singleton; /** * Handles showing and hiding UserSwitchTransitionView that is mounted to SystemUiOverlayWindow. */ -@Singleton +@SysUISingleton public class UserSwitchTransitionViewController extends OverlayViewController { private static final String TAG = "UserSwitchTransition"; private static final String ENABLE_DEVELOPER_MESSAGE_TRUE = "true"; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java index 98d24b1fc0e4..4cdbfa3236c8 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/CarVolumeDialogComponent.java @@ -19,18 +19,19 @@ package com.android.systemui.car.volume; import android.content.Context; import com.android.systemui.car.CarServiceProvider; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.demomode.DemoModeController; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.plugins.VolumeDialog; import com.android.systemui.volume.VolumeDialogComponent; import com.android.systemui.volume.VolumeDialogControllerImpl; import javax.inject.Inject; -import javax.inject.Singleton; /** * Allows for adding car specific dialog when the volume dialog is created. */ -@Singleton +@SysUISingleton public class CarVolumeDialogComponent extends VolumeDialogComponent { private CarVolumeDialogImpl mCarVolumeDialog; @@ -38,8 +39,9 @@ public class CarVolumeDialogComponent extends VolumeDialogComponent { @Inject public CarVolumeDialogComponent(Context context, KeyguardViewMediator keyguardViewMediator, VolumeDialogControllerImpl volumeDialogController, + DemoModeController demoModeController, CarServiceProvider carServiceProvider) { - super(context, keyguardViewMediator, volumeDialogController); + super(context, keyguardViewMediator, volumeDialogController, demoModeController); mCarVolumeDialog.setCarServiceProvider(carServiceProvider); } diff --git a/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java b/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java index 03b61e076c73..b0321abfedd4 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/volume/VolumeUI.java @@ -27,6 +27,7 @@ import android.util.Log; import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.car.CarServiceProvider; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.volume.VolumeDialogComponent; @@ -34,12 +35,11 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import javax.inject.Inject; -import javax.inject.Singleton; import dagger.Lazy; /** The entry point for controlling the volume ui in cars. */ -@Singleton +@SysUISingleton public class VolumeUI extends SystemUI { private static final String TAG = "VolumeUI"; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java index 3c9879c671a5..44cb5cf9cb54 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayPanelViewController.java @@ -34,7 +34,7 @@ import androidx.annotation.CallSuper; import com.android.systemui.R; import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.statusbar.FlingAnimationUtils; +import com.android.wm.shell.animation.FlingAnimationUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java index 55f0975aeccf..c13e486f1c0e 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java @@ -26,6 +26,8 @@ import android.view.WindowInsetsController; import androidx.annotation.VisibleForTesting; +import com.android.systemui.dagger.SysUISingleton; + import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -34,7 +36,6 @@ import java.util.SortedMap; import java.util.TreeMap; import javax.inject.Inject; -import javax.inject.Singleton; /** * This controller is responsible for the following: @@ -45,7 +46,7 @@ import javax.inject.Singleton; * global state of SystemUIOverlayWindow. * </ul> */ -@Singleton +@SysUISingleton public class OverlayViewGlobalStateController { private static final boolean DEBUG = false; private static final String TAG = OverlayViewGlobalStateController.class.getSimpleName(); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java index c955fab592f3..887329359b05 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowController.java @@ -30,17 +30,17 @@ import android.view.WindowInsets; import android.view.WindowManager; import com.android.systemui.R; +import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.policy.ConfigurationController; import javax.inject.Inject; -import javax.inject.Singleton; /** * Controls the expansion state of the primary window which will contain all of the fullscreen sysui * behavior. This window still has a collapsed state in order to watch for swipe events to expand * this window for the notification panel. */ -@Singleton +@SysUISingleton public class SystemUIOverlayWindowController implements ConfigurationController.ConfigurationListener { diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java index 8cca0ed308b2..6395ebff5a41 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/SystemUIOverlayWindowManager.java @@ -21,6 +21,7 @@ import android.util.Log; import com.android.systemui.R; import com.android.systemui.SystemUI; +import com.android.systemui.dagger.SysUISingleton; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -28,13 +29,12 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Provider; -import javax.inject.Singleton; /** * Registers {@link OverlayViewMediator}(s) and synchronizes their calls to hide/show {@link * OverlayViewController}(s) to allow for the correct visibility of system bars. */ -@Singleton +@SysUISingleton public class SystemUIOverlayWindowManager extends SystemUI { private static final String TAG = "SystemUIOverlayWM"; private final Map<Class<?>, Provider<OverlayViewMediator>> diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java b/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java index 5f9665ff7632..0452b83b125f 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java +++ b/packages/CarSystemUI/src/com/android/systemui/wm/BarControlPolicy.java @@ -172,32 +172,32 @@ public class BarControlPolicy { private static class Filter { private static final String ALL = "*"; - private final ArraySet<String> mWhitelist; - private final ArraySet<String> mBlacklist; + private final ArraySet<String> mToInclude; + private final ArraySet<String> mToExclude; - private Filter(ArraySet<String> whitelist, ArraySet<String> blacklist) { - mWhitelist = whitelist; - mBlacklist = blacklist; + private Filter(ArraySet<String> toInclude, ArraySet<String> toExclude) { + mToInclude = toInclude; + mToExclude = toExclude; } boolean matches(String packageName) { if (packageName == null) return false; - if (onBlacklist(packageName)) return false; - return onWhitelist(packageName); + if (toExclude(packageName)) return false; + return toInclude(packageName); } - private boolean onBlacklist(String packageName) { - return mBlacklist.contains(packageName) || mBlacklist.contains(ALL); + private boolean toExclude(String packageName) { + return mToExclude.contains(packageName) || mToExclude.contains(ALL); } - private boolean onWhitelist(String packageName) { - return mWhitelist.contains(ALL) || mWhitelist.contains(packageName); + private boolean toInclude(String packageName) { + return mToInclude.contains(ALL) || mToInclude.contains(packageName); } void dump(PrintWriter pw) { pw.print("Filter["); - dump("whitelist", mWhitelist, pw); pw.print(','); - dump("blacklist", mBlacklist, pw); pw.print(']'); + dump("toInclude", mToInclude, pw); pw.print(','); + dump("toExclude", mToExclude, pw); pw.print(']'); } private void dump(String name, ArraySet<String> set, PrintWriter pw) { @@ -221,18 +221,18 @@ public class BarControlPolicy { // e.g. "com.package1", or "com.android.systemui, com.android.keyguard" or "*" static Filter parse(String value) { if (value == null) return null; - ArraySet<String> whitelist = new ArraySet<String>(); - ArraySet<String> blacklist = new ArraySet<String>(); + ArraySet<String> toInclude = new ArraySet<String>(); + ArraySet<String> toExclude = new ArraySet<String>(); for (String token : value.split(",")) { token = token.trim(); if (token.startsWith("-") && token.length() > 1) { token = token.substring(1); - blacklist.add(token); + toExclude.add(token); } else { - whitelist.add(token); + toInclude.add(token); } } - return new Filter(whitelist, blacklist); + return new Filter(toInclude, toExclude); } } diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java index c9ec34fd5f08..b113d29f00e6 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java +++ b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java @@ -16,12 +16,14 @@ package com.android.systemui.wm; +import android.content.Context; import android.os.Handler; import android.os.RemoteException; import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import android.view.IDisplayWindowInsetsController; +import android.view.IWindowManager; import android.view.InsetsController; import android.view.InsetsSourceControl; import android.view.InsetsState; @@ -29,49 +31,51 @@ import android.view.WindowInsets; import androidx.annotation.VisibleForTesting; -import com.android.systemui.TransactionPool; import com.android.systemui.dagger.qualifiers.Main; +import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.DisplayImeController; +import com.android.wm.shell.common.TransactionPool; import java.util.Objects; -import javax.inject.Inject; -import javax.inject.Singleton; - /** * Controller that maps between displays and {@link IDisplayWindowInsetsController} in order to * give system bar control to SystemUI. * {@link R.bool#config_remoteInsetsControllerControlsSystemBars} determines whether this controller * takes control or not. */ -@Singleton public class DisplaySystemBarsController extends DisplayImeController { private static final String TAG = "DisplaySystemBarsController"; + private final Context mContext; + private final DisplayController mDisplayController; private SparseArray<PerDisplay> mPerDisplaySparseArray; - @Inject public DisplaySystemBarsController( - SystemWindows syswin, + Context context, + IWindowManager wmService, DisplayController displayController, @Main Handler mainHandler, TransactionPool transactionPool) { - super(syswin, displayController, mainHandler, transactionPool); + super(wmService, displayController, mainHandler, transactionPool); + mContext = context; + mDisplayController = displayController; } @Override public void onDisplayAdded(int displayId) { PerDisplay pd = new PerDisplay(displayId); try { - mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, pd); + mWmService.setDisplayWindowInsetsController(displayId, pd); } catch (RemoteException e) { Slog.w(TAG, "Unable to set insets controller on display " + displayId); } // Lazy loading policy control filters instead of during boot. if (mPerDisplaySparseArray == null) { mPerDisplaySparseArray = new SparseArray<>(); - BarControlPolicy.reloadFromSetting(mSystemWindows.mContext); - BarControlPolicy.registerContentObserver(mSystemWindows.mContext, mHandler, () -> { + BarControlPolicy.reloadFromSetting(mContext); + BarControlPolicy.registerContentObserver(mContext, mHandler, () -> { int size = mPerDisplaySparseArray.size(); for (int i = 0; i < size; i++) { mPerDisplaySparseArray.valueAt(i).modifyDisplayWindowInsets(); @@ -84,7 +88,7 @@ public class DisplaySystemBarsController extends DisplayImeController { @Override public void onDisplayRemoved(int displayId) { try { - mSystemWindows.mWmService.setDisplayWindowInsetsController(displayId, null); + mWmService.setDisplayWindowInsetsController(displayId, null); } catch (RemoteException e) { Slog.w(TAG, "Unable to remove insets controller on display " + displayId); } @@ -100,8 +104,7 @@ public class DisplaySystemBarsController extends DisplayImeController { String mPackageName; PerDisplay(int displayId) { - super(displayId, - mSystemWindows.mDisplayController.getDisplayLayout(displayId).rotation()); + super(displayId, mDisplayController.getDisplayLayout(displayId).rotation()); mDisplayId = displayId; mInsetsController = new InsetsController( new DisplaySystemBarsInsetsControllerHost(mHandler, this)); @@ -166,7 +169,7 @@ public class DisplaySystemBarsController extends DisplayImeController { showInsets(barVisibilities[0], /* fromIme= */ false); hideInsets(barVisibilities[1], /* fromIme= */ false); try { - mSystemWindows.mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState); + mWmService.modifyDisplayWindowInsets(mDisplayId, mInsetsState); } catch (RemoteException e) { Slog.w(TAG, "Unable to update window manager service."); } diff --git a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java new file mode 100644 index 000000000000..6d31a8d69ebe --- /dev/null +++ b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wmshell; + +import android.content.Context; +import android.os.Handler; +import android.view.IWindowManager; + +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.wm.DisplaySystemBarsController; +import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.common.DisplayImeController; +import com.android.wm.shell.common.TransactionPool; + +import dagger.Module; +import dagger.Provides; + +/** Provides dependencies from {@link com.android.wm.shell} for CarSystemUI. */ +@Module(includes = WMShellBaseModule.class) +public class CarWMShellModule { + @SysUISingleton + @Provides + DisplayImeController provideDisplayImeController(Context context, + IWindowManager wmService, DisplayController displayController, + @Main Handler mainHandler, TransactionPool transactionPool) { + return new DisplaySystemBarsController(context, wmService, displayController, + mainHandler, transactionPool); + } +} |