Merge "[Status Bar Refactor] Define a new dagger component that gets re-created each time CollapsedStatusBarFragment is re-created." into sc-v2-dev

This commit is contained in:
Caitlin Cassidy
2021-11-16 17:57:42 +00:00
committed by Android (Google) Code Review
16 changed files with 235 additions and 28 deletions

View File

@@ -66,6 +66,7 @@ import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfC
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeController;
@@ -124,6 +125,7 @@ import dagger.Provides;
}, },
subcomponents = { subcomponents = {
StatusBarComponent.class, StatusBarComponent.class,
StatusBarFragmentComponent.class,
NotificationRowComponent.class, NotificationRowComponent.class,
DozeComponent.class, DozeComponent.class,
ExpandableNotificationRowComponent.class, ExpandableNotificationRowComponent.class,

View File

@@ -24,7 +24,7 @@ import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.qs.QSFragment; import com.android.systemui.qs.QSFragment;
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import java.io.FileDescriptor; import java.io.FileDescriptor;

View File

@@ -26,8 +26,8 @@ import java.lang.annotation.Retention;
import javax.inject.Qualifier; import javax.inject.Qualifier;
/** /**
* A {@link LogBuffer} for * A {@link LogBuffer} for {@link
* {@link com.android.systemui.statusbar.phone.CollapsedStatusBarFragment}-related messages. * com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment}-related messages.
*/ */
@Qualifier @Qualifier
@Documented @Documented

View File

@@ -102,7 +102,7 @@ public class LogModule {
/** /**
* Provides a logging buffer for * Provides a logging buffer for
* {@link com.android.systemui.statusbar.phone.CollapsedStatusBarFragment}. * {@link com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment}.
*/ */
@Provides @Provides
@SysUISingleton @SysUISingleton

View File

@@ -4,7 +4,6 @@ import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogLevel import com.android.systemui.log.LogLevel
import com.android.systemui.log.dagger.QSFragmentDisableLog import com.android.systemui.log.dagger.QSFragmentDisableLog
import com.android.systemui.statusbar.DisableFlagsLogger import com.android.systemui.statusbar.DisableFlagsLogger
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment
import javax.inject.Inject import javax.inject.Inject
/** A helper class for logging disable flag changes made in [QSFragment]. */ /** A helper class for logging disable flag changes made in [QSFragment]. */

View File

@@ -172,6 +172,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent; import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.phone.panelstate.PanelState; import com.android.systemui.statusbar.phone.panelstate.PanelState;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;

View File

@@ -136,7 +136,6 @@ import com.android.systemui.SystemUI;
import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.DelegateLaunchAnimatorController; import com.android.systemui.animation.DelegateLaunchAnimatorController;
import com.android.systemui.assist.AssistManager; import com.android.systemui.assist.AssistManager;
import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.biometrics.AuthRippleController; import com.android.systemui.biometrics.AuthRippleController;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.camera.CameraIntents; import com.android.systemui.camera.CameraIntents;
@@ -216,6 +215,9 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule; import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragmentLogger;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
@@ -487,6 +489,7 @@ public class StatusBar extends SystemUI implements
private final DozeParameters mDozeParameters; private final DozeParameters mDozeParameters;
private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy; private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
private final StatusBarComponent.Factory mStatusBarComponentFactory; private final StatusBarComponent.Factory mStatusBarComponentFactory;
private final StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory;
private final PluginManager mPluginManager; private final PluginManager mPluginManager;
private final Optional<LegacySplitScreen> mSplitScreenOptional; private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final StatusBarNotificationActivityStarter.Builder private final StatusBarNotificationActivityStarter.Builder
@@ -671,7 +674,6 @@ public class StatusBar extends SystemUI implements
private final ActivityIntentHelper mActivityIntentHelper; private final ActivityIntentHelper mActivityIntentHelper;
private NotificationStackScrollLayoutController mStackScrollerController; private NotificationStackScrollLayoutController mStackScrollerController;
private BatteryMeterViewController mBatteryMeterViewController;
private final ColorExtractor.OnColorsChangedListener mOnColorsChangedListener = private final ColorExtractor.OnColorsChangedListener mOnColorsChangedListener =
(extractor, which) -> updateTheme(); (extractor, which) -> updateTheme();
@@ -743,6 +745,7 @@ public class StatusBar extends SystemUI implements
CommandQueue commandQueue, CommandQueue commandQueue,
CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger, CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger,
StatusBarComponent.Factory statusBarComponentFactory, StatusBarComponent.Factory statusBarComponentFactory,
StatusBarFragmentComponent.Factory statusBarFragmentComponentFactory,
PluginManager pluginManager, PluginManager pluginManager,
Optional<LegacySplitScreen> splitScreenOptional, Optional<LegacySplitScreen> splitScreenOptional,
LightsOutNotifController lightsOutNotifController, LightsOutNotifController lightsOutNotifController,
@@ -847,6 +850,7 @@ public class StatusBar extends SystemUI implements
mCommandQueue = commandQueue; mCommandQueue = commandQueue;
mCollapsedStatusBarFragmentLogger = collapsedStatusBarFragmentLogger; mCollapsedStatusBarFragmentLogger = collapsedStatusBarFragmentLogger;
mStatusBarComponentFactory = statusBarComponentFactory; mStatusBarComponentFactory = statusBarComponentFactory;
mStatusBarFragmentComponentFactory = statusBarFragmentComponentFactory;
mPluginManager = pluginManager; mPluginManager = pluginManager;
mSplitScreenOptional = splitScreenOptional; mSplitScreenOptional = splitScreenOptional;
mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder; mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder;
@@ -1131,28 +1135,21 @@ public class StatusBar extends SystemUI implements
mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class); mPluginDependencyProvider.allowPluginDependency(StatusBarStateController.class);
mStatusBarWindowController.getFragmentHostManager() mStatusBarWindowController.getFragmentHostManager()
.addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> { .addTagListener(CollapsedStatusBarFragment.TAG, (tag, fragment) -> {
CollapsedStatusBarFragment statusBarFragment = StatusBarFragmentComponent statusBarFragmentComponent =
(CollapsedStatusBarFragment) fragment; ((CollapsedStatusBarFragment) fragment).getStatusBarFragmentComponent();
if (statusBarFragmentComponent == null) {
throw new IllegalStateException(
"CollapsedStatusBarFragment should have a valid component");
}
PhoneStatusBarView oldStatusBarView = mStatusBarView; mStatusBarView = statusBarFragmentComponent.getPhoneStatusBarView();
mStatusBarView = (PhoneStatusBarView) statusBarFragment.getView();
// TODO(b/205609837): Migrate this to StatusBarFragmentComponent.
mPhoneStatusBarViewController = mPhoneStatusBarViewControllerFactory mPhoneStatusBarViewController = mPhoneStatusBarViewControllerFactory
.create(mStatusBarView, mNotificationPanelViewController .create(mStatusBarView, mNotificationPanelViewController
.getStatusBarTouchEventHandler()); .getStatusBarTouchEventHandler());
mPhoneStatusBarViewController.init(); mPhoneStatusBarViewController.init();
mBatteryMeterViewController = new BatteryMeterViewController(
mStatusBarView.findViewById(R.id.battery),
mConfigurationController,
mTunerService,
mBroadcastDispatcher,
mMainHandler,
mContext.getContentResolver(),
mBatteryController
);
mBatteryMeterViewController.init();
// Ensure we re-propagate panel expansion values to the panel controller and // Ensure we re-propagate panel expansion values to the panel controller and
// any listeners it may have, such as PanelBar. This will also ensure we // any listeners it may have, such as PanelBar. This will also ensure we
// re-display the notification panel if necessary (for example, if // re-display the notification panel if necessary (for example, if
@@ -1166,8 +1163,8 @@ public class StatusBar extends SystemUI implements
// This view is being recreated, let's destroy the old one // This view is being recreated, let's destroy the old one
mHeadsUpAppearanceController.destroy(); mHeadsUpAppearanceController.destroy();
} }
// TODO: this should probably be scoped to the StatusBarComponent
// TODO (b/136993073) Separate notification shade and status bar // TODO (b/136993073) Separate notification shade and status bar
// TODO(b/205609837): Migrate this to StatusBarFragmentComponent.
mHeadsUpAppearanceController = new HeadsUpAppearanceController( mHeadsUpAppearanceController = new HeadsUpAppearanceController(
mNotificationIconAreaController, mHeadsUpManager, mNotificationIconAreaController, mHeadsUpManager,
mStackScrollerController, mStackScrollerController,
@@ -1184,6 +1181,7 @@ public class StatusBar extends SystemUI implements
.beginTransaction() .beginTransaction()
.replace(R.id.status_bar_container, .replace(R.id.status_bar_container,
new CollapsedStatusBarFragment( new CollapsedStatusBarFragment(
mStatusBarFragmentComponentFactory,
mOngoingCallController, mOngoingCallController,
mAnimationScheduler, mAnimationScheduler,
mStatusBarLocationPublisher, mStatusBarLocationPublisher,

View File

@@ -75,7 +75,6 @@ import com.android.systemui.statusbar.notification.logging.NotificationLogger;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragmentLogger;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.DozeScrimController; import com.android.systemui.statusbar.phone.DozeScrimController;
import com.android.systemui.statusbar.phone.DozeServiceHost; import com.android.systemui.statusbar.phone.DozeServiceHost;
@@ -99,6 +98,8 @@ import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter; import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager; import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragmentLogger;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
@@ -197,6 +198,7 @@ public interface StatusBarPhoneModule {
CommandQueue commandQueue, CommandQueue commandQueue,
CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger, CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger,
StatusBarComponent.Factory statusBarComponentFactory, StatusBarComponent.Factory statusBarComponentFactory,
StatusBarFragmentComponent.Factory statusBarFragmentComponentFactory,
PluginManager pluginManager, PluginManager pluginManager,
Optional<LegacySplitScreen> splitScreenOptional, Optional<LegacySplitScreen> splitScreenOptional,
LightsOutNotifController lightsOutNotifController, LightsOutNotifController lightsOutNotifController,
@@ -297,6 +299,7 @@ public interface StatusBarPhoneModule {
commandQueue, commandQueue,
collapsedStatusBarFragmentLogger, collapsedStatusBarFragmentLogger,
statusBarComponentFactory, statusBarComponentFactory,
statusBarFragmentComponentFactory,
pluginManager, pluginManager,
splitScreenOptional, splitScreenOptional,
lightsOutNotifController, lightsOutNotifController,

View File

@@ -12,7 +12,7 @@
* permissions and limitations under the License. * permissions and limitations under the License.
*/ */
package com.android.systemui.statusbar.phone; package com.android.systemui.statusbar.phone.fragment;
import static android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS; import static android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS;
import static android.app.StatusBarManager.DISABLE_CLOCK; import static android.app.StatusBarManager.DISABLE_CLOCK;
@@ -52,7 +52,14 @@ import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.connectivity.SignalCallback; import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager; import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallListener; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallListener;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
@@ -83,6 +90,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
public static final String STATUS_BAR_ICON_MANAGER_TAG = "status_bar_icon_manager"; public static final String STATUS_BAR_ICON_MANAGER_TAG = "status_bar_icon_manager";
public static final int FADE_IN_DURATION = 320; public static final int FADE_IN_DURATION = 320;
public static final int FADE_IN_DELAY = 50; public static final int FADE_IN_DELAY = 50;
private StatusBarFragmentComponent mStatusBarFragmentComponent;
private PhoneStatusBarView mStatusBar; private PhoneStatusBarView mStatusBar;
private final StatusBarStateController mStatusBarStateController; private final StatusBarStateController mStatusBarStateController;
private final KeyguardStateController mKeyguardStateController; private final KeyguardStateController mKeyguardStateController;
@@ -96,6 +104,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
private int mDisabled2; private int mDisabled2;
private Lazy<Optional<StatusBar>> mStatusBarOptionalLazy; private Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
private DarkIconManager mDarkIconManager; private DarkIconManager mDarkIconManager;
private final StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory;
private final CommandQueue mCommandQueue; private final CommandQueue mCommandQueue;
private final CollapsedStatusBarFragmentLogger mCollapsedStatusBarFragmentLogger; private final CollapsedStatusBarFragmentLogger mCollapsedStatusBarFragmentLogger;
private final OperatorNameViewController.Factory mOperatorNameViewControllerFactory; private final OperatorNameViewController.Factory mOperatorNameViewControllerFactory;
@@ -127,6 +136,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
@Inject @Inject
public CollapsedStatusBarFragment( public CollapsedStatusBarFragment(
StatusBarFragmentComponent.Factory statusBarFragmentComponentFactory,
OngoingCallController ongoingCallController, OngoingCallController ongoingCallController,
SystemStatusAnimationScheduler animationScheduler, SystemStatusAnimationScheduler animationScheduler,
StatusBarLocationPublisher locationPublisher, StatusBarLocationPublisher locationPublisher,
@@ -143,6 +153,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger, CollapsedStatusBarFragmentLogger collapsedStatusBarFragmentLogger,
OperatorNameViewController.Factory operatorNameViewControllerFactory OperatorNameViewController.Factory operatorNameViewControllerFactory
) { ) {
mStatusBarFragmentComponentFactory = statusBarFragmentComponentFactory;
mOngoingCallController = ongoingCallController; mOngoingCallController = ongoingCallController;
mAnimationScheduler = animationScheduler; mAnimationScheduler = animationScheduler;
mLocationPublisher = locationPublisher; mLocationPublisher = locationPublisher;
@@ -169,6 +180,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
@Override @Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
mStatusBarFragmentComponent = mStatusBarFragmentComponentFactory.create(this);
mStatusBarFragmentComponent.init();
mStatusBar = (PhoneStatusBarView) view; mStatusBar = (PhoneStatusBarView) view;
View contents = mStatusBar.findViewById(R.id.status_bar_contents); View contents = mStatusBar.findViewById(R.id.status_bar_contents);
contents.addOnLayoutChangeListener(mStatusBarLayoutListener); contents.addOnLayoutChangeListener(mStatusBarLayoutListener);
@@ -252,6 +266,17 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
updateNotificationIconAreaAndCallChip(mDisabled1, false); updateNotificationIconAreaAndCallChip(mDisabled1, false);
} }
/**
* Returns the dagger component for this fragment.
*
* TODO(b/205609837): Eventually, the dagger component should encapsulate all status bar
* fragment functionality and we won't need to expose it here anymore.
*/
@Nullable
public StatusBarFragmentComponent getStatusBarFragmentComponent() {
return mStatusBarFragmentComponent;
}
@Override @Override
public void disable(int displayId, int state1, int state2, boolean animate) { public void disable(int displayId, int state1, int state2, boolean animate) {
if (displayId != getContext().getDisplayId()) { if (displayId != getContext().getDisplayId()) {

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.systemui.statusbar.phone package com.android.systemui.statusbar.phone.fragment
import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogLevel import com.android.systemui.log.LogLevel

View File

@@ -0,0 +1,69 @@
/*
* Copyright (C) 2021 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.statusbar.phone.fragment.dagger;
import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import dagger.BindsInstance;
import dagger.Subcomponent;
/**
* A subcomponent that gets re-created each time we create a new {@link CollapsedStatusBarFragment}.
*
* This component will also re-create all classes that depend on {@link CollapsedStatusBarFragment}
* and friends. Specifically, the fragment creates a new {@link PhoneStatusBarView} and multiple
* controllers need access to that view, so those controllers will be re-created whenever the
* fragment is recreated.
*
* Note that this is completely separate from
* {@link com.android.systemui.statusbar.phone.dagger.StatusBarComponent}. This component gets
* re-created on each new fragment creation, whereas
* {@link com.android.systemui.statusbar.phone.dagger.StatusBarComponent} is only created once in
* {@link com.android.systemui.statusbar.phone.StatusBar} and never re-created.
*/
@Subcomponent(modules = {StatusBarFragmentModule.class})
@StatusBarFragmentScope
public interface StatusBarFragmentComponent {
/** Simple factory. */
@Subcomponent.Factory
interface Factory {
StatusBarFragmentComponent create(
@BindsInstance CollapsedStatusBarFragment collapsedStatusBarFragment);
}
/**
* Initialize anything extra for the component. Must be called after the component is created.
*/
default void init() {
// No one accesses this controller, so we need to make sure we reference it here so it does
// get initialized.
getBatteryMeterViewController().init();
}
/** */
@StatusBarFragmentScope
BatteryMeterViewController getBatteryMeterViewController();
/** */
@StatusBarFragmentScope
@RootView
PhoneStatusBarView getPhoneStatusBarView();
}

View File

@@ -0,0 +1,46 @@
/*
* Copyright (C) 2021 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.statusbar.phone.fragment.dagger;
import com.android.systemui.R;
import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.statusbar.phone.PhoneStatusBarView;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment;
import dagger.Module;
import dagger.Provides;
/** Dagger module for {@link StatusBarFragmentComponent}. */
@Module
public interface StatusBarFragmentModule {
/** */
@Provides
@RootView
@StatusBarFragmentScope
static PhoneStatusBarView providePhoneStatusBarView(
CollapsedStatusBarFragment collapsedStatusBarFragment) {
return (PhoneStatusBarView) collapsedStatusBarFragment.getView();
}
/** */
@Provides
@StatusBarFragmentScope
static BatteryMeterView provideBatteryMeterView(@RootView PhoneStatusBarView view) {
return view.findViewById(R.id.battery);
}
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) 2021 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.statusbar.phone.fragment.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import javax.inject.Scope;
/**
* Scope annotation for singleton items within the {@link StatusBarFragmentComponent}.
*/
@Documented
@Retention(RUNTIME)
@Scope
public @interface StatusBarFragmentScope {}

View File

@@ -131,6 +131,8 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragmentLogger;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
@@ -241,6 +243,8 @@ public class StatusBarTest extends SysuiTestCase {
@Mock private CollapsedStatusBarFragmentLogger mCollapsedStatusBarFragmentLogger; @Mock private CollapsedStatusBarFragmentLogger mCollapsedStatusBarFragmentLogger;
@Mock private StatusBarComponent.Factory mStatusBarComponentFactory; @Mock private StatusBarComponent.Factory mStatusBarComponentFactory;
@Mock private StatusBarComponent mStatusBarComponent; @Mock private StatusBarComponent mStatusBarComponent;
@Mock private StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory;
@Mock private StatusBarFragmentComponent mStatusBarFragmentComponent;
@Mock private PluginManager mPluginManager; @Mock private PluginManager mPluginManager;
@Mock private LegacySplitScreen mLegacySplitScreen; @Mock private LegacySplitScreen mLegacySplitScreen;
@Mock private LightsOutNotifController mLightsOutNotifController; @Mock private LightsOutNotifController mLightsOutNotifController;
@@ -345,6 +349,8 @@ public class StatusBarTest extends SysuiTestCase {
when(mBiometricUnlockControllerLazy.get()).thenReturn(mBiometricUnlockController); when(mBiometricUnlockControllerLazy.get()).thenReturn(mBiometricUnlockController);
when(mStatusBarComponentFactory.create()).thenReturn(mStatusBarComponent); when(mStatusBarComponentFactory.create()).thenReturn(mStatusBarComponent);
when(mStatusBarFragmentComponentFactory.create(any()))
.thenReturn(mStatusBarFragmentComponent);
when(mStatusBarComponent.getNotificationShadeWindowViewController()).thenReturn( when(mStatusBarComponent.getNotificationShadeWindowViewController()).thenReturn(
mNotificationShadeWindowViewController); mNotificationShadeWindowViewController);
@@ -414,6 +420,7 @@ public class StatusBarTest extends SysuiTestCase {
mCommandQueue, mCommandQueue,
mCollapsedStatusBarFragmentLogger, mCollapsedStatusBarFragmentLogger,
mStatusBarComponentFactory, mStatusBarComponentFactory,
mStatusBarFragmentComponentFactory,
mPluginManager, mPluginManager,
Optional.of(mLegacySplitScreen), Optional.of(mLegacySplitScreen),
mLightsOutNotifController, mLightsOutNotifController,

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.systemui.statusbar.phone package com.android.systemui.statusbar.phone.fragment
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase

View File

@@ -12,7 +12,7 @@
* permissions and limitations under the License. * permissions and limitations under the License.
*/ */
package com.android.systemui.statusbar.phone; package com.android.systemui.statusbar.phone.fragment;
import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.DEFAULT_DISPLAY;
@@ -48,6 +48,13 @@ import com.android.systemui.statusbar.DisableFlagsLogger;
import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.OperatorNameViewController;
import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.NetworkController;
import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler;
import com.android.systemui.statusbar.phone.NotificationIconAreaController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarHideIconsForBouncerManager;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarLocationPublisher;
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager; import com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManager;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -83,6 +90,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
private OperatorNameViewController.Factory mOperatorNameViewControllerFactory; private OperatorNameViewController.Factory mOperatorNameViewControllerFactory;
private OperatorNameViewController mOperatorNameViewController; private OperatorNameViewController mOperatorNameViewController;
private StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory;
private StatusBarFragmentComponent mStatusBarFragmentComponent;
public CollapsedStatusBarFragmentTest() { public CollapsedStatusBarFragmentTest() {
super(CollapsedStatusBarFragment.class); super(CollapsedStatusBarFragment.class);
} }
@@ -243,8 +253,22 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE)); Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
} }
@Test
public void setUp_fragmentCreatesDaggerComponent() {
mFragments.dispatchResume();
processAllMessages();
CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment;
assertEquals(mStatusBarFragmentComponent, fragment.getStatusBarFragmentComponent());
}
@Override @Override
protected Fragment instantiate(Context context, String className, Bundle arguments) { protected Fragment instantiate(Context context, String className, Bundle arguments) {
mStatusBarFragmentComponentFactory =
mock(StatusBarFragmentComponent.Factory.class);
mStatusBarFragmentComponent = mock(StatusBarFragmentComponent.class);
when(mStatusBarFragmentComponentFactory.create(any()))
.thenReturn(mStatusBarFragmentComponent);
mOngoingCallController = mock(OngoingCallController.class); mOngoingCallController = mock(OngoingCallController.class);
mAnimationScheduler = mock(SystemStatusAnimationScheduler.class); mAnimationScheduler = mock(SystemStatusAnimationScheduler.class);
mLocationPublisher = mock(StatusBarLocationPublisher.class); mLocationPublisher = mock(StatusBarLocationPublisher.class);
@@ -259,6 +283,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
setUpNotificationIconAreaController(); setUpNotificationIconAreaController();
return new CollapsedStatusBarFragment( return new CollapsedStatusBarFragment(
mStatusBarFragmentComponentFactory,
mOngoingCallController, mOngoingCallController,
mAnimationScheduler, mAnimationScheduler,
mLocationPublisher, mLocationPublisher,