Introduce BubbleModule and KeyguardModule

This CL is the 4th in the series of CLs which intend to "unbind" StatusBar on TV.
In order to make StatusBar really optional and thus to allow us to unbind it, we also need to make some of the classes that depends on it optional as well. For all these cases we need to move from @Inject-annotated contructors to @Provides annotated methods. For this we are introducing BubbleModule and KeyguardModule.

Change-Id: I57009153e2279078ac88c42a53d3963a96eb8452
Test: make SystemUI; atest SystemUITests
Bug: 146188087
This commit is contained in:
Sergey Nikolaienkov
2020-02-10 17:33:00 +01:00
parent 3d84cb4a45
commit 5cb6e52e81
6 changed files with 165 additions and 15 deletions

View File

@@ -17,8 +17,10 @@
package com.android.systemui;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.bubbles.dagger.BubbleModule;
import com.android.systemui.globalactions.GlobalActionsComponent;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.dagger.KeyguardModule;
import com.android.systemui.navigationbar.car.CarNavigationBar;
import com.android.systemui.pip.PipUI;
import com.android.systemui.power.PowerUI;
@@ -43,7 +45,8 @@ import dagger.multibindings.ClassKey;
import dagger.multibindings.IntoMap;
/** Binder for car specific {@link SystemUI} modules. */
@Module(includes = {RecentsModule.class, CarStatusBarModule.class, NotificationsModule.class})
@Module(includes = {RecentsModule.class, CarStatusBarModule.class, NotificationsModule.class,
BubbleModule.class, KeyguardModule.class})
public abstract class CarSystemUIBinder {
/** Inject into AuthController. */
@Binds

View File

@@ -72,9 +72,7 @@ import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.DumpController;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.bubbles.BubbleController.BubbleExpandListener;
import com.android.systemui.bubbles.BubbleController.BubbleStateChangeListener;
import com.android.systemui.bubbles.BubbleController.NotifCallback;
import com.android.systemui.bubbles.dagger.BubbleModule;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.PinnedStackListenerForwarder;
@@ -105,16 +103,12 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Bubbles are a special type of content that can "float" on top of other apps or System UI.
* Bubbles can be expanded to show more content.
*
* The controller manages addition, removal, and visible state of bubbles on screen.
*/
@Singleton
public class BubbleController implements ConfigurationController.ConfigurationListener, Dumpable {
private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleController" : TAG_BUBBLES;
@@ -277,7 +271,6 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
}
}
@Inject
public BubbleController(Context context,
NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController,
@@ -298,6 +291,9 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
notifPipeline, featureFlags, dumpController);
}
/**
* Injected constructor. See {@link BubbleModule}.
*/
public BubbleController(Context context,
NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController,

View File

@@ -0,0 +1,81 @@
/*
* 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.bubbles.dagger;
import android.content.Context;
import com.android.systemui.DumpController;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.bubbles.BubbleData;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
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.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ZenModeController;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
/** */
@Module
public interface BubbleModule {
/**
*/
@Singleton
@Provides
static BubbleController newBubbleController(
Context context,
NotificationShadeWindowController notificationShadeWindowController,
StatusBarStateController statusBarStateController,
ShadeController shadeController,
BubbleData data,
ConfigurationController configurationController,
NotificationInterruptionStateProvider interruptionStateProvider,
ZenModeController zenModeController,
NotificationLockscreenUserManager notifUserManager,
NotificationGroupManager groupManager,
NotificationEntryManager entryManager,
NotifPipeline notifPipeline,
FeatureFlags featureFlags,
DumpController dumpController) {
return new BubbleController(
context,
notificationShadeWindowController,
statusBarStateController,
shadeController,
data,
/* synchronizer */null,
configurationController,
interruptionStateProvider,
zenModeController,
notifUserManager,
groupManager,
entryManager,
notifPipeline,
featureFlags,
dumpController);
}
}

View File

@@ -24,8 +24,10 @@ import com.android.systemui.SystemUI;
import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.accessibility.WindowMagnification;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.bubbles.dagger.BubbleModule;
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;
@@ -49,7 +51,8 @@ import dagger.multibindings.IntoMap;
/**
* SystemUI objects that are injectable should go here.
*/
@Module(includes = {RecentsModule.class, StatusBarModule.class})
@Module(includes = {RecentsModule.class, StatusBarModule.class, BubbleModule.class,
KeyguardModule.class})
public abstract class SystemUIBinder {
/** Inject into AuthController. */
@Binds

View File

@@ -86,6 +86,7 @@ import com.android.systemui.SystemUI;
import com.android.systemui.SystemUIFactory;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.keyguard.dagger.KeyguardModule;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -100,9 +101,6 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.Lazy;
/**
@@ -146,7 +144,6 @@ import dagger.Lazy;
* directly to the keyguard UI is posted to a {@link android.os.Handler} to ensure it is taken on the UI
* thread of the keyguard.
*/
@Singleton
public class KeyguardViewMediator extends SystemUI {
private static final int KEYGUARD_DISPLAY_TIMEOUT_DELAY_DEFAULT = 30000;
private static final long KEYGUARD_DONE_PENDING_TIMEOUT_MS = 3000;
@@ -688,7 +685,9 @@ public class KeyguardViewMediator extends SystemUI {
}
};
@Inject
/**
* Injected constructor. See {@link KeyguardModule}.
*/
public KeyguardViewMediator(
Context context,
FalsingManager falsingManager,

View File

@@ -0,0 +1,68 @@
/*
* 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.keyguard.dagger;
import android.content.Context;
import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.phone.NotificationShadeWindowController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import java.util.concurrent.Executor;
import javax.inject.Singleton;
import dagger.Lazy;
import dagger.Module;
import dagger.Provides;
/**
* Dagger Module providing {@link StatusBar}.
*/
@Module
public class KeyguardModule {
/**
* Provides our instance of KeyguardViewMediator which is considered optional.
*/
@Provides
@Singleton
public static KeyguardViewMediator newKeyguardViewMediator(
Context context,
FalsingManager falsingManager,
LockPatternUtils lockPatternUtils,
BroadcastDispatcher broadcastDispatcher,
NotificationShadeWindowController notificationShadeWindowController,
Lazy<StatusBarKeyguardViewManager> statusBarKeyguardViewManagerLazy,
DismissCallbackRegistry dismissCallbackRegistry,
@UiBackground Executor uiBgExecutor) {
return new KeyguardViewMediator(
context,
falsingManager,
lockPatternUtils,
broadcastDispatcher,
notificationShadeWindowController,
statusBarKeyguardViewManagerLazy,
dismissCallbackRegistry,
uiBgExecutor);
}
}