Conditions Monitor as singleton.

This change refactors Monitor usage across SystemUI to be singleton to
prevent duplicate monitoring of the same conditions. This monitor by
default requires the process is running as the system user.

Test: add local logging to verify Monitor only constructed once
Bug: 276475674
Change-Id: I344da95f985f7380f2ca2e5d8266449f366f59ae
This commit is contained in:
Darrell Shi
2023-04-03 23:03:02 +00:00
parent 1d8d37bb35
commit bfbfff4327
11 changed files with 54 additions and 48 deletions

View File

@@ -32,8 +32,10 @@ import java.util.concurrent.Executor;
import javax.inject.Inject;
/**
* {@link Monitor} takes in a set of conditions, monitors whether all of them have
* been fulfilled, and informs any registered listeners.
* {@link Monitor} allows {@link Subscription}s to a set of conditions and monitors whether all of
* them have been fulfilled.
* <p>
* This class should be used as a singleton, to prevent duplicate monitoring of the same conditions.
*/
public class Monitor {
private final String mTag = getClass().getSimpleName();

View File

@@ -16,8 +16,6 @@
package com.android.systemui.complication;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR;
import android.database.ContentObserver;
import android.os.UserHandle;
import android.provider.Settings;
@@ -25,6 +23,7 @@ import android.provider.Settings;
import com.android.settingslib.dream.DreamBackend;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.shared.condition.Monitor;
import com.android.systemui.util.condition.ConditionalCoreStartable;
@@ -33,7 +32,6 @@ import com.android.systemui.util.settings.SecureSettings;
import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Named;
/**
* {@link ComplicationTypesUpdater} observes the state of available complication types set by the
@@ -53,7 +51,7 @@ public class ComplicationTypesUpdater extends ConditionalCoreStartable {
@Main Executor executor,
SecureSettings secureSettings,
DreamOverlayStateController dreamOverlayStateController,
@Named(DREAM_PRETEXT_MONITOR) Monitor monitor) {
@SystemUser Monitor monitor) {
super(monitor);
mDreamBackend = dreamBackend;
mExecutor = executor;

View File

@@ -18,11 +18,11 @@ package com.android.systemui.complication;
import static com.android.systemui.complication.dagger.DreamClockTimeComplicationModule.DREAM_CLOCK_TIME_COMPLICATION_VIEW;
import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_CLOCK_TIME_COMPLICATION_LAYOUT_PARAMS;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR;
import android.view.View;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.shared.condition.Monitor;
import com.android.systemui.util.condition.ConditionalCoreStartable;
@@ -74,7 +74,7 @@ public class DreamClockTimeComplication implements Complication {
public Registrant(
DreamOverlayStateController dreamOverlayStateController,
DreamClockTimeComplication dreamClockTimeComplication,
@Named(DREAM_PRETEXT_MONITOR) Monitor monitor) {
@SystemUser Monitor monitor) {
super(monitor);
mDreamOverlayStateController = dreamOverlayStateController;
mComplication = dreamClockTimeComplication;

View File

@@ -21,7 +21,6 @@ import static com.android.systemui.complication.dagger.RegisteredComplicationsMo
import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE;
import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE_AFTER_UNLOCK;
import static com.android.systemui.controls.dagger.ControlsComponent.Visibility.UNAVAILABLE;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR;
import android.content.Context;
import android.content.Intent;
@@ -40,6 +39,7 @@ import com.android.systemui.controls.dagger.ControlsComponent;
import com.android.systemui.controls.management.ControlsListingController;
import com.android.systemui.controls.ui.ControlsActivity;
import com.android.systemui.controls.ui.ControlsUiController;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.shared.condition.Monitor;
@@ -108,7 +108,7 @@ public class DreamHomeControlsComplication implements Complication {
public Registrant(DreamHomeControlsComplication complication,
DreamOverlayStateController dreamOverlayStateController,
ControlsComponent controlsComponent,
@Named(DREAM_PRETEXT_MONITOR) Monitor monitor) {
@SystemUser Monitor monitor) {
super(monitor);
mComplication = complication;
mControlsComponent = controlsComponent;

View File

@@ -17,7 +17,6 @@
package com.android.systemui.complication;
import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_SMARTSPACE_LAYOUT_PARAMS;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR;
import android.content.Context;
import android.os.Parcelable;
@@ -26,6 +25,7 @@ import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.dreams.DreamOverlayStateController;
import com.android.systemui.dreams.smartspace.DreamSmartspaceController;
import com.android.systemui.flags.FeatureFlags;
@@ -88,7 +88,7 @@ public class SmartSpaceComplication implements Complication {
DreamOverlayStateController dreamOverlayStateController,
SmartSpaceComplication smartSpaceComplication,
DreamSmartspaceController smartSpaceController,
@Named(DREAM_PRETEXT_MONITOR) Monitor monitor,
@SystemUser Monitor monitor,
FeatureFlags featureFlags) {
super(monitor);
mDreamOverlayStateController = dreamOverlayStateController;

View File

@@ -42,6 +42,7 @@ import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule;
import com.android.systemui.complication.dagger.ComplicationComponent;
import com.android.systemui.controls.dagger.ControlsModule;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.demomode.dagger.DemoModeModule;
import com.android.systemui.doze.dagger.DozeComponent;
import com.android.systemui.dreams.dagger.DreamModule;
@@ -60,6 +61,7 @@ import com.android.systemui.people.PeopleModule;
import com.android.systemui.plugins.BcSmartspaceConfigPlugin;
import com.android.systemui.plugins.BcSmartspaceDataPlugin;
import com.android.systemui.privacy.PrivacyModule;
import com.android.systemui.process.condition.SystemProcessCondition;
import com.android.systemui.qrcodescanner.dagger.QRCodeScannerModule;
import com.android.systemui.qs.FgsManagerController;
import com.android.systemui.qs.FgsManagerControllerImpl;
@@ -74,6 +76,7 @@ import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.ShadeModule;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl;
import com.android.systemui.shared.condition.Monitor;
import com.android.systemui.smartspace.dagger.SmartspaceModule;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
@@ -126,6 +129,7 @@ import dagger.BindsOptionalOf;
import dagger.Module;
import dagger.Provides;
import java.util.Collections;
import java.util.Optional;
import java.util.concurrent.Executor;
@@ -232,6 +236,17 @@ public abstract class SystemUIModule {
return state;
}
/**
* Provides the monitor for SystemUI that requires the process running as the system user.
*/
@SysUISingleton
@Provides
@SystemUser
static Monitor provideSystemUserMonitor(@Main Executor executor,
SystemProcessCondition systemProcessCondition) {
return new Monitor(executor, Collections.singleton(systemProcessCondition));
}
@BindsOptionalOf
abstract CommandQueue optionalCommandQueue();

View File

@@ -0,0 +1,20 @@
/*
* Copyright (C) 2023 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.dagger.qualifiers
import javax.inject.Qualifier
@Qualifier @MustBeDocumented @Retention(AnnotationRetention.RUNTIME) annotation class SystemUser

View File

@@ -19,6 +19,7 @@ package com.android.systemui.dreams;
import android.util.Log;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.dreams.callbacks.AssistantAttentionCallback;
import com.android.systemui.dreams.conditions.AssistantAttentionCondition;
import com.android.systemui.shared.condition.Monitor;
@@ -38,7 +39,7 @@ public class AssistantAttentionMonitor implements CoreStartable {
@Inject
public AssistantAttentionMonitor(
Monitor monitor,
@SystemUser Monitor monitor,
AssistantAttentionCondition assistantAttentionCondition,
AssistantAttentionCallback callback) {
mConditionMonitor = monitor;

View File

@@ -16,11 +16,10 @@
package com.android.systemui.dreams;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR;
import android.util.Log;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.dreams.callbacks.DreamStatusBarStateCallback;
import com.android.systemui.dreams.conditions.DreamCondition;
import com.android.systemui.flags.RestartDozeListener;
@@ -28,7 +27,6 @@ import com.android.systemui.shared.condition.Monitor;
import com.android.systemui.util.condition.ConditionalCoreStartable;
import javax.inject.Inject;
import javax.inject.Named;
/**
* A {@link CoreStartable} to retain a monitor for tracking dreaming.
@@ -42,13 +40,11 @@ public class DreamMonitor extends ConditionalCoreStartable {
private final DreamStatusBarStateCallback mCallback;
private RestartDozeListener mRestartDozeListener;
@Inject
public DreamMonitor(Monitor monitor, DreamCondition dreamCondition,
@Named(DREAM_PRETEXT_MONITOR) Monitor pretextMonitor,
public DreamMonitor(@SystemUser Monitor monitor, DreamCondition dreamCondition,
DreamStatusBarStateCallback callback,
RestartDozeListener restartDozeListener) {
super(pretextMonitor);
super(monitor);
mConditionMonitor = monitor;
mDreamCondition = dreamCondition;
mCallback = callback;

View File

@@ -17,7 +17,6 @@
package com.android.systemui.dreams;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_OVERLAY_SERVICE_COMPONENT;
import static com.android.systemui.dreams.dagger.DreamModule.DREAM_PRETEXT_MONITOR;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -35,6 +34,7 @@ import android.service.dreams.IDreamManager;
import android.util.Log;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.SystemUser;
import com.android.systemui.shared.condition.Monitor;
import com.android.systemui.util.condition.ConditionalCoreStartable;
@@ -105,7 +105,7 @@ public class DreamOverlayRegistrant extends ConditionalCoreStartable {
@Inject
public DreamOverlayRegistrant(Context context, @Main Resources resources,
@Named(DREAM_OVERLAY_SERVICE_COMPONENT) ComponentName dreamOverlayServiceComponent,
@Named(DREAM_PRETEXT_MONITOR) Monitor monitor) {
@SystemUser Monitor monitor) {
super(monitor);
mContext = context;
mResources = resources;

View File

@@ -31,22 +31,14 @@ import com.android.systemui.dreams.DreamOverlayNotificationCountProvider;
import com.android.systemui.dreams.DreamOverlayService;
import com.android.systemui.dreams.complication.dagger.ComplicationComponent;
import com.android.systemui.dreams.touch.scrim.dagger.ScrimModule;
import com.android.systemui.process.condition.SystemProcessCondition;
import com.android.systemui.shared.condition.Condition;
import com.android.systemui.shared.condition.Monitor;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoSet;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executor;
import javax.inject.Named;
/**
* Dagger Module providing Dream-related functionality.
*/
@@ -65,11 +57,8 @@ public interface DreamModule {
String DREAM_OVERLAY_ENABLED = "dream_overlay_enabled";
String DREAM_SUPPORTED = "dream_supported";
String DREAM_PRETEXT_CONDITIONS = "dream_pretext_conditions";
String DREAM_PRETEXT_MONITOR = "dream_prtext_monitor";
String DREAM_OVERLAY_WINDOW_TITLE = "dream_overlay_window_title";
/**
* Provides the dream component
*/
@@ -128,21 +117,6 @@ public interface DreamModule {
return resources.getBoolean(com.android.internal.R.bool.config_dreamsSupported);
}
/** */
@Binds
@IntoSet
@Named(DREAM_PRETEXT_CONDITIONS)
Condition bindSystemProcessCondition(SystemProcessCondition condition);
/** */
@Provides
@Named(DREAM_PRETEXT_MONITOR)
static Monitor providesDockerPretextMonitor(
@Main Executor executor,
@Named(DREAM_PRETEXT_CONDITIONS) Set<Condition> pretextConditions) {
return new Monitor(executor, pretextConditions);
}
/** */
@Provides
@Named(DREAM_OVERLAY_WINDOW_TITLE)