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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -271,10 +271,6 @@ public class NotificationStackScrollLayoutController {
|
||||
}
|
||||
};
|
||||
|
||||
public void setIsShadeOpening(boolean isOpening) {
|
||||
mView.setIsShadeOpening(isOpening);
|
||||
}
|
||||
|
||||
public void setSectionPadding(float padding) {
|
||||
mView.setSectionPadding(padding);
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user