import com.android.systemui.statusbar.phone.HeadsUpManagerPhone
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.phone.NotificationIconAreaController
+import com.android.systemui.statusbar.phone.PanelExpansionListener
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener
import javax.inject.Inject
private val mHeadsUpManagerPhone: HeadsUpManagerPhone,
private val statusBarStateController: StatusBarStateController,
private val bypassController: KeyguardBypassController)
- : OnHeadsUpChangedListener, StatusBarStateController.StateListener {
+ : OnHeadsUpChangedListener, StatusBarStateController.StateListener,
+ PanelExpansionListener {
private val mNotificationVisibility
= object : FloatProperty<NotificationWakeUpCoordinator>("notificationVisibility") {
}
}
+ private var collapsedEnoughToHide: Boolean = false
lateinit var iconAreaController : NotificationIconAreaController
+
var pulsing: Boolean = false
set(value) {
field = value
}
}
}
-
/**
* True if we can show pulsing heads up notifications
*/
// We also allow pulsing on the lock screen!
canShow = canShow || (mWakingUp || willWakeUp || fullyAwake)
&& statusBarStateController.state == StatusBarState.KEYGUARD
+ // We want to hide the notifications when collapsed too much
+ if (collapsedEnoughToHide) {
+ canShow = false
+ }
}
return canShow
}
this.state = newState
}
+ override fun onPanelExpansionChanged(expansion: Float, tracking: Boolean) {
+ val collapsedEnough = expansion <= 0.9f
+ if (collapsedEnough != this.collapsedEnoughToHide) {
+ val couldShowPulsingHuns = canShowPulsingHuns;
+ this.collapsedEnoughToHide = collapsedEnough
+ if (couldShowPulsingHuns && !canShowPulsingHuns) {
+ updateNotificationVisibility(animate = true, increaseSpeed = true)
+ mHeadsUpManagerPhone.releaseAllImmediately()
+ }
+ }
+ }
+
private fun updateDozeAmountIfBypass(): Boolean {
if (bypassController.bypassEnabled) {
var amount = 1.0f;
}
updateDarkTint();
+ updateIconVisibility();
+ updateClickability();
+
+ return true;
+ }
+
+ /**
+ * Update the icon visibility
+ * @return true if the visibility changed
+ */
+ private boolean updateIconVisibility() {
boolean onAodNotPulsingOrDocked = mDozing && (!mPulsing || mDocked);
boolean invisible = onAodNotPulsingOrDocked || mWakeAndUnlockRunning
|| mShowingLaunchAffordance;
if (mBypassController.getBypassEnabled() && !mBouncerShowingScrimmed) {
- if (mHeadsUpManager.isHeadsUpGoingAway()
- || mHeadsUpManager.hasPinnedHeadsUp()
- || (mStatusBarStateController.getState() == StatusBarState.KEYGUARD
- && !mWakeUpCoordinator.getNotificationsFullyHidden())) {
+ if ((mHeadsUpManager.isHeadsUpGoingAway() || mHeadsUpManager.hasPinnedHeadsUp())
+ && mStatusBarStateController.getState() == StatusBarState.KEYGUARD
+ && !mWakeUpCoordinator.getNotificationsFullyHidden()) {
invisible = true;
}
}
.setDuration(233)
.start();
}
+ return true;
}
- updateClickability();
-
- return true;
+ return false;
}
private boolean canBlockUpdates() {
@Override
public void onFullyHiddenChanged(boolean isFullyHidden) {
if (mBypassController.getBypassEnabled()) {
- update();
+ boolean changed = updateIconVisibility();
+ if (changed) {
+ update();
+ }
}
}
mStatusBar.executeRunnableDismissingKeyguard(null, null /* cancelAction */,
false /* dismissShade */, true /* afterKeyguardGone */, false /* deferred */);
}
- if (mExpansionListener != null) {
- mExpansionListener.onQsExpansionChanged(mQsMaxExpansionHeight != 0
+ for (int i = 0; i < mExpansionListeners.size(); i++) {
+ mExpansionListeners.get(i).onQsExpansionChanged(mQsMaxExpansionHeight != 0
? mQsExpansionHeight / mQsMaxExpansionHeight : 0);
}
if (DEBUG) {
mOnReinflationListener = onReinflationListener;
}
- /**
- * Panel and QS expansion callbacks.
- */
- public interface PanelExpansionListener {
- /**
- * Invoked whenever the notification panel expansion changes, at every animation frame.
- * This is the main expansion that happens when the user is swiping up to dismiss the
- * lock screen.
- *
- * @param expansion 0 when collapsed, 1 when expanded.
- * @param tracking {@code true} when the user is actively dragging the panel.
- */
- void onPanelExpansionChanged(float expansion, boolean tracking);
-
- /**
- * Invoked whenever the QS expansion changes, at every animation frame.
- * @param expansion 0 when collapsed, 1 when expanded.
- */
- void onQsExpansionChanged(float expansion);
- }
}
--- /dev/null
+/*
+ * Copyright (C) 2019 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;
+
+/**
+ * Panel and QS expansion callbacks.
+ */
+public interface PanelExpansionListener {
+ /**
+ * Invoked whenever the notification panel expansion changes, at every animation frame.
+ * This is the main expansion that happens when the user is swiping up to dismiss the
+ * lock screen.
+ *
+ * @param expansion 0 when collapsed, 1 when expanded.
+ * @param tracking {@code true} when the user is actively dragging the panel.
+ */
+ void onPanelExpansionChanged(float expansion, boolean tracking);
+
+ /**
+ * Invoked whenever the QS expansion changes, at every animation frame.
+ * @param expansion 0 when collapsed, 1 when expanded.
+ */
+ default void onQsExpansionChanged(float expansion) {};
+}
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.phone.NotificationPanelView.PanelExpansionListener;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.ArrayList;
public abstract class PanelView extends FrameLayout {
public static final boolean DEBUG = PanelBar.DEBUG;
private boolean mVibrateOnOpening;
protected boolean mLaunchingNotification;
private int mFixedDuration = NO_FIXED_DURATION;
- protected PanelExpansionListener mExpansionListener;
+ protected ArrayList<PanelExpansionListener> mExpansionListeners = new ArrayList<>();
private final void logf(String fmt, Object... args) {
Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args));
|| mPeekAnimator != null || mInstantExpanding
|| isPanelVisibleBecauseOfHeadsUp() || mTracking || mHeightAnimator != null);
}
- if (mExpansionListener != null) {
- mExpansionListener.onPanelExpansionChanged(mExpandedFraction, mTracking);
+ for (int i = 0; i < mExpansionListeners.size(); i++) {
+ mExpansionListeners.get(i).onPanelExpansionChanged(mExpandedFraction, mTracking);
}
}
- public void setExpansionListener(PanelExpansionListener panelExpansionListener) {
- mExpansionListener = panelExpansionListener;
+ public void addExpansionListener(PanelExpansionListener panelExpansionListener) {
+ mExpansionListeners.add(panelExpansionListener);
}
protected abstract boolean isPanelVisibleBecauseOfHeadsUp();
inflateShelf();
mNotificationIconAreaController.setupShelf(mNotificationShelf);
mNotificationPanel.setOnReinflationListener(mNotificationIconAreaController::initAodIcons);
+ mNotificationPanel.addExpansionListener(mWakeUpCoordinator);
Dependency.get(DarkIconDispatcher.class).addDarkReceiver(mNotificationIconAreaController);
// Allow plugins to reference DarkIconDispatcher and StatusBarStateController
*/
public class StatusBarKeyguardViewManager implements RemoteInputController.Callback,
StatusBarStateController.StateListener, ConfigurationController.ConfigurationListener,
- NotificationPanelView.PanelExpansionListener, NavigationModeController.ModeChangedListener {
+ PanelExpansionListener, NavigationModeController.ModeChangedListener {
// When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3;
mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry,
mExpansionCallback);
mNotificationPanelView = notificationPanelView;
- notificationPanelView.setExpansionListener(this);
+ notificationPanelView.addExpansionListener(this);
mBypassController = bypassController;
mNotificationContainer = notificationContainer;
}