Make AmbientState injectable

1) Mark AmbientState as SysuiSingleton to allow access from
- PanelBar
- NotificationStackScrollLayout

2) Mark AmbientState constructor with @Inject
   for Dagger use when needed

3) Ensure that AmbientState params are injectable
- Context --- AmbientState is now global, and has access to application
  context; we can leave this unchanged (otherwise we mark it with
  @Named(VIEW_CONTEXT) to ask for the subcomponent view context)
- SectionProvider --- bind to NotificationSectionsManager in
  NotificationsModule, the closest module to AmbientState

4) Add AmbientState to constructors for NSSL and NPVC
- Have PanelBar update AmbientState directly (via PVC) instead of
  piping changes through layers of classes

Fixes: 177921542
Test: log to verify that shade open state updates correctly
Test: build sysui-studio with
       sysuiTestDebug variant and SystemUITests config, then run:

adb shell am instrument -w -e class com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutTest com.android.systemui.tests

Change-Id: I0a50d603b49c9f55f1af41084974aee59e9ce95b
This commit is contained in:
Lyn Han
2021-01-28 20:40:43 -06:00
parent 8f046c76d7
commit c4037509bc
9 changed files with 44 additions and 25 deletions

View File

@@ -69,6 +69,8 @@ import com.android.systemui.statusbar.notification.row.ChannelEditorDialogContro
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
import com.android.systemui.statusbar.notification.row.PriorityOnboardingDialogController;
import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager;
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.leak.LeakDetector;
@@ -89,6 +91,10 @@ import dagger.Provides;
*/
@Module(includes = { NotificationSectionHeadersModule.class })
public interface NotificationsModule {
@Binds
StackScrollAlgorithm.SectionProvider bindSectionProvider(
NotificationSectionsManager impl);
/** Provides an instance of {@link NotificationEntryManager} */
@SysUISingleton
@Provides

View File

@@ -22,6 +22,7 @@ import android.content.Context;
import android.util.MathUtils;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -30,9 +31,12 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.ExpandableView;
import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider;
import javax.inject.Inject;
/**
* A global state to track all input states for the algorithm.
*/
@SysUISingleton
public class AmbientState {
private static final float MAX_PULSE_HEIGHT = 100000f;
@@ -83,6 +87,7 @@ public class AmbientState {
/** Tracks the state from AlertingNotificationManager#hasNotifications() */
private boolean mHasAlertEntries;
@Inject
public AmbientState(
Context context,
@NonNull SectionProvider sectionProvider) {
@@ -98,7 +103,7 @@ public class AmbientState {
mBaseZHeight = getBaseHeight(mZDistanceBetweenElements);
}
void setIsShadeOpening(boolean isOpening) {
public void setIsShadeOpening(boolean isOpening) {
mIsShadeOpening = isOpening;
}

View File

@@ -491,7 +491,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
NotificationSectionsManager notificationSectionsManager,
GroupMembershipManager groupMembershipManager,
GroupExpansionManager groupExpansionManager,
SysuiStatusBarStateController statusbarStateController
SysuiStatusBarStateController statusbarStateController,
AmbientState ambientState
) {
super(context, attrs, 0, 0);
Resources res = getResources();
@@ -500,7 +501,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
mSectionsManager.initialize(this, LayoutInflater.from(context));
mSections = mSectionsManager.createSectionsForBuckets();
mAmbientState = new AmbientState(context, mSectionsManager);
mAmbientState = ambientState;
mBgColor = Utils.getColorAttr(mContext, android.R.attr.colorBackgroundFloating)
.getDefaultColor();
int minHeight = res.getDimensionPixelSize(R.dimen.notification_min_height);
@@ -549,10 +550,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
}
}
void setIsShadeOpening(boolean isOpening) {
mAmbientState.setIsShadeOpening(isOpening);
}
void setSectionPadding(float margin) {
mAmbientState.setSectionPadding(margin);
requestChildrenUpdate();

View File

@@ -271,10 +271,6 @@ public class NotificationStackScrollLayoutController {
}
};
public void setIsShadeOpening(boolean isOpening) {
mView.setIsShadeOpening(isOpening);
}
public void setSectionPadding(float padding) {
mView.setSectionPadding(padding);
}

View File

@@ -120,6 +120,7 @@ import com.android.systemui.statusbar.notification.collection.render.ShadeViewMa
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableView;
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.AnimationProperties;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
@@ -552,10 +553,12 @@ public class NotificationPanelViewController extends PanelViewController {
AuthController authController,
QSDetailDisplayer qsDetailDisplayer,
ScrimController scrimController,
MediaDataManager mediaDataManager) {
MediaDataManager mediaDataManager,
AmbientState ambientState) {
super(view, falsingManager, dozeLog, keyguardStateController,
(SysuiStatusBarStateController) statusBarStateController, vibratorHelper,
latencyTracker, flingAnimationUtilsBuilder.get(), statusBarTouchableRegionManager);
latencyTracker, flingAnimationUtilsBuilder.get(), statusBarTouchableRegionManager,
ambientState);
mView = view;
mMetricsLogger = metricsLogger;
mActivityManager = activityManager;
@@ -2410,11 +2413,6 @@ public class NotificationPanelViewController extends PanelViewController {
setListening(true);
}
@Override
protected void setIsShadeOpening(boolean isOpening) {
mNotificationStackScrollLayoutController.setIsShadeOpening(isOpening);
}
@Override
public void setSectionPadding(float padding) {
if (padding == mSectionPadding) {

View File

@@ -53,7 +53,7 @@ public abstract class PanelBar extends FrameLayout {
if (DEBUG) LOG("go state: %d -> %d", mState, state);
mState = state;
if (mPanel != null) {
mPanel.setIsShadeOpening(state == STATE_OPENING);
mPanel.getAmbientState().setIsShadeOpening(state == STATE_OPENING);
}
}

View File

@@ -27,6 +27,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.Nullable;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.SystemClock;
@@ -54,6 +55,7 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.wm.shell.animation.FlingAnimationUtils;
@@ -145,6 +147,9 @@ public abstract class PanelViewController {
private float mInitialTouchX;
private boolean mTouchDisabled;
// AmbientState will never be null since it provides an @Inject constructor for Dagger to call.
private AmbientState mAmbientState;
/**
* Whether or not the PanelView can be expanded or collapsed with a drag.
*/
@@ -223,13 +228,19 @@ public abstract class PanelViewController {
mJustPeeked = true;
}
protected AmbientState getAmbientState() {
return mAmbientState;
}
public PanelViewController(PanelView view,
FalsingManager falsingManager, DozeLog dozeLog,
KeyguardStateController keyguardStateController,
SysuiStatusBarStateController statusBarStateController, VibratorHelper vibratorHelper,
LatencyTracker latencyTracker,
FlingAnimationUtils.Builder flingAnimationUtilsBuilder,
StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
StatusBarTouchableRegionManager statusBarTouchableRegionManager,
AmbientState ambientState) {
mAmbientState = ambientState;
mView = view;
mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
@@ -776,8 +787,6 @@ public abstract class PanelViewController {
*/
protected abstract boolean isTrackingBlocked();
protected abstract void setIsShadeOpening(boolean isShadeOpening);
protected abstract void setSectionPadding(float padding);
protected abstract void setOverExpansion(float overExpansion, boolean isPixels);

View File

@@ -83,6 +83,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
private NotificationStackScrollLayout mStackScroller; // Normally test this
private NotificationStackScrollLayout mStackScrollerInternal; // See explanation below
private AmbientState mAmbientState;
@Rule public MockitoRule mockito = MockitoJUnit.rule();
@Mock private StatusBar mBar;
@@ -123,6 +124,9 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
});
when(mRemoteInputManager.getController()).thenReturn(mRemoteInputController);
// Interact with real instance of AmbientState.
mAmbientState = new AmbientState(mContext, mNotificationSectionsManager);
// The actual class under test. You may need to work with this class directly when
// testing anonymous class members of mStackScroller, like mMenuEventListener,
// which refer to members of NotificationStackScrollLayout. The spy
@@ -134,7 +138,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
mNotificationSectionsManager,
mGroupMembershipManger,
mGroupExpansionManager,
mStatusBarStateController
mStatusBarStateController,
mAmbientState
);
mStackScrollerInternal.initView(getContext(), mKeyguardBypassEnabledProvider,
mNotificationSwipeHelper);

View File

@@ -80,6 +80,7 @@ import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.NotificationRoundnessManager;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
@@ -202,7 +203,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
private ScrimController mScrimController;
@Mock
private MediaDataManager mMediaDataManager;
@Mock
private AmbientState mAmbientState;
private NotificationPanelViewController mNotificationPanelViewController;
private View.AccessibilityDelegate mAccessibiltyDelegate;
@@ -282,7 +284,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mAuthController,
new QSDetailDisplayer(),
mScrimController,
mMediaDataManager);
mMediaDataManager,
mAmbientState);
mNotificationPanelViewController.initDependencies(
mStatusBar,
mNotificationShelfController);