1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.systemui.statusbar.notification.stack;
18 
19 import static com.android.systemui.statusbar.notification.NotificationUtils.logKey;
20 
21 import android.annotation.NonNull;
22 import android.annotation.Nullable;
23 import android.content.Context;
24 import android.util.MathUtils;
25 
26 import androidx.annotation.VisibleForTesting;
27 
28 import com.android.systemui.Dumpable;
29 import com.android.systemui.R;
30 import com.android.systemui.dagger.SysUISingleton;
31 import com.android.systemui.dump.DumpManager;
32 import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
33 import com.android.systemui.statusbar.NotificationShelf;
34 import com.android.systemui.statusbar.StatusBarState;
35 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
36 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
37 import com.android.systemui.statusbar.notification.row.ExpandableView;
38 import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.BypassController;
39 import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.SectionProvider;
40 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
41 
42 import java.io.PrintWriter;
43 
44 import javax.inject.Inject;
45 
46 /**
47  * Global state to track all input states for
48  * {@link com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm}.
49  */
50 @SysUISingleton
51 public class AmbientState implements Dumpable {
52 
53     private static final float MAX_PULSE_HEIGHT = 100000f;
54     private static final boolean NOTIFICATIONS_HAVE_SHADOWS = false;
55 
56     private final SectionProvider mSectionProvider;
57     private final BypassController mBypassController;
58     private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
59     /**
60      *  Used to read bouncer states.
61      */
62     private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
63     private int mScrollY;
64     private boolean mDimmed;
65     private float mOverScrollTopAmount;
66     private float mOverScrollBottomAmount;
67     private boolean mDozing;
68     private boolean mHideSensitive;
69     private float mStackTranslation;
70     private int mLayoutHeight;
71     private int mTopPadding;
72     private boolean mShadeExpanded;
73     private float mMaxHeadsUpTranslation;
74     private boolean mClearAllInProgress;
75     private int mLayoutMinHeight;
76     private int mLayoutMaxHeight;
77     private NotificationShelf mShelf;
78     private int mZDistanceBetweenElements;
79     private int mBaseZHeight;
80     private int mContentHeight;
81     private ExpandableView mLastVisibleBackgroundChild;
82     private float mCurrentScrollVelocity;
83     private int mStatusBarState;
84     private float mExpandingVelocity;
85     private boolean mPanelTracking;
86     private boolean mExpansionChanging;
87     private boolean mIsSmallScreen;
88     private boolean mPulsing;
89     private boolean mUnlockHintRunning;
90     private float mHideAmount;
91     private boolean mAppearing;
92     private float mPulseHeight = MAX_PULSE_HEIGHT;
93 
94     /**
95      * The ExpandableNotificationRow that is pulsing, or the one that was pulsing
96      * when the device started to transition from AOD to LockScreen.
97      */
98     private ExpandableNotificationRow mPulsingRow;
99 
100     /** Fraction of lockscreen to shade animation (on lockscreen swipe down). */
101     private float mFractionToShade;
102 
103     /**
104      * @param fractionToShade Fraction of lockscreen to shade transition
105      */
setFractionToShade(float fractionToShade)106     public void setFractionToShade(float fractionToShade) {
107         mFractionToShade = fractionToShade;
108     }
109 
110     /**
111      * @return fractionToShade Fraction of lockscreen to shade transition
112      */
getFractionToShade()113     public float getFractionToShade() {
114         return mFractionToShade;
115     }
116 
117     /** How we much we are sleeping. 1f fully dozing (AOD), 0f fully awake (for all other states) */
118     private float mDozeAmount = 0.0f;
119 
120     private Runnable mOnPulseHeightChangedListener;
121     private ExpandableNotificationRow mTrackedHeadsUpRow;
122     private float mAppearFraction;
123     private float mOverExpansion;
124     private int mStackTopMargin;
125 
126     /** Distance of top of notifications panel from top of screen. */
127     private float mStackY = 0;
128 
129     /** Height of notifications panel. */
130     private float mStackHeight = 0;
131 
132     /** Fraction of shade expansion. */
133     private float mExpansionFraction;
134 
135     /** Height of the notifications panel without top padding when expansion completes. */
136     private float mStackEndHeight;
137 
138     /** Whether we are swiping up. */
139     private boolean mIsSwipingUp;
140 
141     /** Whether we are flinging the shade open or closed. */
142     private boolean mIsFlinging;
143 
144     /**
145      * Whether we need to do a fling down after swiping up on lockscreen.
146      * True right after we swipe up on lockscreen and have not finished the fling down that follows.
147      * False when we stop flinging or leave lockscreen.
148      */
149     private boolean mIsFlingRequiredAfterLockScreenSwipeUp = false;
150 
151     /**
152      * Whether the shade is currently closing.
153      */
154     private boolean mIsClosing;
155 
156     @VisibleForTesting
isFlingRequiredAfterLockScreenSwipeUp()157     public boolean isFlingRequiredAfterLockScreenSwipeUp() {
158         return mIsFlingRequiredAfterLockScreenSwipeUp;
159     }
160 
161     @VisibleForTesting
setFlingRequiredAfterLockScreenSwipeUp(boolean value)162     public void setFlingRequiredAfterLockScreenSwipeUp(boolean value) {
163         mIsFlingRequiredAfterLockScreenSwipeUp = value;
164     }
165 
166     /**
167      * @return Height of the notifications panel without top padding when expansion completes.
168      */
getStackEndHeight()169     public float getStackEndHeight() {
170         return mStackEndHeight;
171     }
172 
173     /**
174      * @param stackEndHeight Height of the notifications panel without top padding
175      *                       when expansion completes.
176      */
setStackEndHeight(float stackEndHeight)177     public void setStackEndHeight(float stackEndHeight) {
178         mStackEndHeight = stackEndHeight;
179     }
180 
181     /**
182      * @param stackY Distance of top of notifications panel from top of screen.
183      */
setStackY(float stackY)184     public void setStackY(float stackY) {
185         mStackY = stackY;
186     }
187 
188     /**
189      * @return Distance of top of notifications panel from top of screen.
190      */
getStackY()191     public float getStackY() {
192         return mStackY;
193     }
194 
195     /**
196      * @param expansionFraction Fraction of shade expansion.
197      */
setExpansionFraction(float expansionFraction)198     public void setExpansionFraction(float expansionFraction) {
199         mExpansionFraction = expansionFraction;
200     }
201 
202     /**
203      * @param isSwipingUp Whether we are swiping up.
204      */
setSwipingUp(boolean isSwipingUp)205     public void setSwipingUp(boolean isSwipingUp) {
206         if (!isSwipingUp && mIsSwipingUp) {
207             // Just stopped swiping up.
208             mIsFlingRequiredAfterLockScreenSwipeUp = true;
209         }
210         mIsSwipingUp = isSwipingUp;
211     }
212 
213     /**
214      * @return Whether we are swiping up.
215      */
isSwipingUp()216     public boolean isSwipingUp() {
217         return mIsSwipingUp;
218     }
219 
220     /**
221      * @param isFlinging Whether we are flinging the shade open or closed.
222      */
setFlinging(boolean isFlinging)223     public void setFlinging(boolean isFlinging) {
224         if (isOnKeyguard() && !isFlinging && mIsFlinging) {
225             // Just stopped flinging.
226             mIsFlingRequiredAfterLockScreenSwipeUp = false;
227         }
228         mIsFlinging = isFlinging;
229     }
230 
231     /**
232      * @return Fraction of shade expansion.
233      */
getExpansionFraction()234     public float getExpansionFraction() {
235         return mExpansionFraction;
236     }
237 
238     /**
239      * @param stackHeight Height of notifications panel.
240      */
setStackHeight(float stackHeight)241     public void setStackHeight(float stackHeight) {
242         mStackHeight = stackHeight;
243     }
244 
245     /**
246      * @return Height of notifications panel.
247      */
getStackHeight()248     public float getStackHeight() {
249         return mStackHeight;
250     }
251 
252     /** Tracks the state from AlertingNotificationManager#hasNotifications() */
253     private boolean mHasAlertEntries;
254 
255     @Inject
AmbientState( @onNull Context context, @NonNull DumpManager dumpManager, @NonNull SectionProvider sectionProvider, @NonNull BypassController bypassController, @Nullable StatusBarKeyguardViewManager statusBarKeyguardViewManager, @NonNull LargeScreenShadeInterpolator largeScreenShadeInterpolator )256     public AmbientState(
257             @NonNull Context context,
258             @NonNull DumpManager dumpManager,
259             @NonNull SectionProvider sectionProvider,
260             @NonNull BypassController bypassController,
261             @Nullable StatusBarKeyguardViewManager statusBarKeyguardViewManager,
262             @NonNull LargeScreenShadeInterpolator largeScreenShadeInterpolator
263     ) {
264         mSectionProvider = sectionProvider;
265         mBypassController = bypassController;
266         mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
267         mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
268         reload(context);
269         dumpManager.registerDumpable(this);
270     }
271 
272     /**
273      * Reload the dimens e.g. if the density changed.
274      */
reload(Context context)275     public void reload(Context context) {
276         mZDistanceBetweenElements = getZDistanceBetweenElements(context);
277         mBaseZHeight = getBaseHeight(mZDistanceBetweenElements);
278     }
279 
setOverExpansion(float overExpansion)280     void setOverExpansion(float overExpansion) {
281         mOverExpansion = overExpansion;
282     }
283 
getOverExpansion()284     float getOverExpansion() {
285         return mOverExpansion;
286     }
287 
getZDistanceBetweenElements(Context context)288     private static int getZDistanceBetweenElements(Context context) {
289         return Math.max(1, context.getResources()
290                 .getDimensionPixelSize(R.dimen.z_distance_between_notifications));
291     }
292 
getBaseHeight(int zdistanceBetweenElements)293     private static int getBaseHeight(int zdistanceBetweenElements) {
294         return NOTIFICATIONS_HAVE_SHADOWS ? 4 * zdistanceBetweenElements : 0;
295     }
296 
297     /**
298      * @return the launch height for notifications that are launched
299      */
getNotificationLaunchHeight(Context context)300     public static int getNotificationLaunchHeight(Context context) {
301         int zDistance = getZDistanceBetweenElements(context);
302         return NOTIFICATIONS_HAVE_SHADOWS ? 2 * getBaseHeight(zDistance) : 4 * zDistance;
303     }
304 
305     /**
306      * @return the basic Z height on which notifications remain.
307      */
getBaseZHeight()308     public int getBaseZHeight() {
309         return mBaseZHeight;
310     }
311 
312     /**
313      * @return the distance in Z between two overlaying notifications.
314      */
getZDistanceBetweenElements()315     public int getZDistanceBetweenElements() {
316         return mZDistanceBetweenElements;
317     }
318 
getScrollY()319     public int getScrollY() {
320         return mScrollY;
321     }
322 
323     /**
324      * Set the new Scroll Y position.
325      */
setScrollY(int scrollY)326     public void setScrollY(int scrollY) {
327         // Because we're dealing with an overscroller, scrollY could sometimes become smaller than
328         // 0. However this is only for internal purposes and the scroll position when read
329         // should never be smaller than 0, otherwise it can lead to flickers.
330         this.mScrollY = Math.max(scrollY, 0);
331     }
332 
333     /**
334      * @param dimmed Whether we are in a dimmed state (on the lockscreen), where the backgrounds are
335      *               translucent and everything is scaled back a bit.
336      */
setDimmed(boolean dimmed)337     public void setDimmed(boolean dimmed) {
338         mDimmed = dimmed;
339     }
340 
341     /** While dozing, we draw as little as possible, assuming a black background */
setDozing(boolean dozing)342     public void setDozing(boolean dozing) {
343         mDozing = dozing;
344     }
345 
346     /** Hide ratio of the status bar **/
setHideAmount(float hidemount)347     public void setHideAmount(float hidemount) {
348         if (hidemount == 1.0f && mHideAmount != hidemount) {
349             // Whenever we are fully hidden, let's reset the pulseHeight again
350             setPulseHeight(MAX_PULSE_HEIGHT);
351         }
352         mHideAmount = hidemount;
353     }
354 
355     /** Returns the hide ratio of the status bar */
getHideAmount()356     public float getHideAmount() {
357         return mHideAmount;
358     }
359 
setHideSensitive(boolean hideSensitive)360     public void setHideSensitive(boolean hideSensitive) {
361         mHideSensitive = hideSensitive;
362     }
363 
isDimmed()364     public boolean isDimmed() {
365         // While we are expanding from pulse, we want the notifications not to be dimmed, otherwise
366         // you'd see the difference to the pulsing notification
367         return mDimmed && !(isPulseExpanding() && mDozeAmount == 1.0f);
368     }
369 
isDozing()370     public boolean isDozing() {
371         return mDozing;
372     }
373 
isHideSensitive()374     public boolean isHideSensitive() {
375         return mHideSensitive;
376     }
377 
setOverScrollAmount(float amount, boolean onTop)378     public void setOverScrollAmount(float amount, boolean onTop) {
379         if (onTop) {
380             mOverScrollTopAmount = amount;
381         } else {
382             mOverScrollBottomAmount = amount;
383         }
384     }
385 
386     /**
387      * Is bypass currently enabled?
388      */
isBypassEnabled()389     public boolean isBypassEnabled() {
390         return mBypassController.isBypassEnabled();
391     }
392 
getOverScrollAmount(boolean top)393     public float getOverScrollAmount(boolean top) {
394         return top ? mOverScrollTopAmount : mOverScrollBottomAmount;
395     }
396 
getSectionProvider()397     public SectionProvider getSectionProvider() {
398         return mSectionProvider;
399     }
400 
getStackTranslation()401     public float getStackTranslation() {
402         return mStackTranslation;
403     }
404 
setStackTranslation(float stackTranslation)405     public void setStackTranslation(float stackTranslation) {
406         mStackTranslation = stackTranslation;
407     }
408 
setLayoutHeight(int layoutHeight)409     public void setLayoutHeight(int layoutHeight) {
410         mLayoutHeight = layoutHeight;
411     }
412 
setLayoutMaxHeight(int maxLayoutHeight)413     public void setLayoutMaxHeight(int maxLayoutHeight) {
414         mLayoutMaxHeight = maxLayoutHeight;
415     }
416 
getLayoutMaxHeight()417     public int getLayoutMaxHeight() {
418         return mLayoutMaxHeight;
419     }
420 
getTopPadding()421     public float getTopPadding() {
422         return mTopPadding;
423     }
424 
setTopPadding(int topPadding)425     public void setTopPadding(int topPadding) {
426         mTopPadding = topPadding;
427     }
428 
getInnerHeight()429     public int getInnerHeight() {
430         return getInnerHeight(false /* ignorePulseHeight */);
431     }
432 
433     /**
434      * @param ignorePulseHeight ignore the pulse height for this request
435      * @return the inner height of the algorithm.
436      */
getInnerHeight(boolean ignorePulseHeight)437     public int getInnerHeight(boolean ignorePulseHeight) {
438         if (mDozeAmount == 1.0f && !isPulseExpanding()) {
439             return mShelf.getHeight();
440         }
441         int height = (int) Math.max(mLayoutMinHeight,
442                 Math.min(mLayoutHeight, mContentHeight) - mTopPadding);
443         if (ignorePulseHeight) {
444             return height;
445         }
446         float pulseHeight = Math.min(mPulseHeight, (float) height);
447         return (int) MathUtils.lerp(height, pulseHeight, mDozeAmount);
448     }
449 
isPulseExpanding()450     public boolean isPulseExpanding() {
451         return mPulseHeight != MAX_PULSE_HEIGHT && mDozeAmount != 0.0f && mHideAmount != 1.0f;
452     }
453 
isShadeExpanded()454     public boolean isShadeExpanded() {
455         return mShadeExpanded;
456     }
457 
setShadeExpanded(boolean shadeExpanded)458     public void setShadeExpanded(boolean shadeExpanded) {
459         mShadeExpanded = shadeExpanded;
460     }
461 
setMaxHeadsUpTranslation(float maxHeadsUpTranslation)462     public void setMaxHeadsUpTranslation(float maxHeadsUpTranslation) {
463         mMaxHeadsUpTranslation = maxHeadsUpTranslation;
464     }
465 
getMaxHeadsUpTranslation()466     public float getMaxHeadsUpTranslation() {
467         return mMaxHeadsUpTranslation;
468     }
469 
setClearAllInProgress(boolean clearAllInProgress)470     public void setClearAllInProgress(boolean clearAllInProgress) {
471         mClearAllInProgress = clearAllInProgress;
472     }
473 
isClearAllInProgress()474     public boolean isClearAllInProgress() {
475         return mClearAllInProgress;
476     }
477 
setLayoutMinHeight(int layoutMinHeight)478     public void setLayoutMinHeight(int layoutMinHeight) {
479         mLayoutMinHeight = layoutMinHeight;
480     }
481 
setShelf(NotificationShelf shelf)482     public void setShelf(NotificationShelf shelf) {
483         mShelf = shelf;
484     }
485 
486     @Nullable
getShelf()487     public NotificationShelf getShelf() {
488         return mShelf;
489     }
490 
setContentHeight(int contentHeight)491     public void setContentHeight(int contentHeight) {
492         mContentHeight = contentHeight;
493     }
494 
getContentHeight()495     public float getContentHeight() {
496         return mContentHeight;
497     }
498 
499     /**
500      * Sets the last visible view of the host layout, that has a background, i.e the very last
501      * view in the shade, without the clear all button.
502      */
setLastVisibleBackgroundChild( ExpandableView lastVisibleBackgroundChild)503     public void setLastVisibleBackgroundChild(
504             ExpandableView lastVisibleBackgroundChild) {
505         mLastVisibleBackgroundChild = lastVisibleBackgroundChild;
506     }
507 
getLastVisibleBackgroundChild()508     public ExpandableView getLastVisibleBackgroundChild() {
509         return mLastVisibleBackgroundChild;
510     }
511 
setCurrentScrollVelocity(float currentScrollVelocity)512     public void setCurrentScrollVelocity(float currentScrollVelocity) {
513         mCurrentScrollVelocity = currentScrollVelocity;
514     }
515 
getCurrentScrollVelocity()516     public float getCurrentScrollVelocity() {
517         return mCurrentScrollVelocity;
518     }
519 
isOnKeyguard()520     public boolean isOnKeyguard() {
521         return mStatusBarState == StatusBarState.KEYGUARD;
522     }
523 
setStatusBarState(int statusBarState)524     public void setStatusBarState(int statusBarState) {
525         if (mStatusBarState != StatusBarState.KEYGUARD) {
526             mIsFlingRequiredAfterLockScreenSwipeUp = false;
527         }
528         mStatusBarState = statusBarState;
529     }
530 
setExpandingVelocity(float expandingVelocity)531     public void setExpandingVelocity(float expandingVelocity) {
532         mExpandingVelocity = expandingVelocity;
533     }
534 
setExpansionChanging(boolean expansionChanging)535     public void setExpansionChanging(boolean expansionChanging) {
536         mExpansionChanging = expansionChanging;
537     }
538 
isExpansionChanging()539     public boolean isExpansionChanging() {
540         return mExpansionChanging;
541     }
542 
getExpandingVelocity()543     public float getExpandingVelocity() {
544         return mExpandingVelocity;
545     }
546 
setPanelTracking(boolean panelTracking)547     public void setPanelTracking(boolean panelTracking) {
548         mPanelTracking = panelTracking;
549     }
550 
hasPulsingNotifications()551     public boolean hasPulsingNotifications() {
552         return mPulsing && mHasAlertEntries;
553     }
554 
setPulsing(boolean hasPulsing)555     public void setPulsing(boolean hasPulsing) {
556         mPulsing = hasPulsing;
557     }
558 
559     /**
560      * @return if we're pulsing in general
561      */
isPulsing()562     public boolean isPulsing() {
563         return mPulsing;
564     }
565 
isPulsing(NotificationEntry entry)566     public boolean isPulsing(NotificationEntry entry) {
567         return mPulsing && entry.isAlerting();
568     }
569 
setPulsingRow(ExpandableNotificationRow row)570     public void setPulsingRow(ExpandableNotificationRow row) {
571         mPulsingRow = row;
572     }
573 
574     /**
575      * @param row The row to check
576      * @return true if row is the pulsing row when the device started to transition from AOD to lock
577      * screen
578      */
isPulsingRow(ExpandableView row)579     public boolean isPulsingRow(ExpandableView row) {
580         return mPulsingRow == row;
581     }
582 
isPanelTracking()583     public boolean isPanelTracking() {
584         return mPanelTracking;
585     }
586 
isSmallScreen()587     public boolean isSmallScreen() {
588         return mIsSmallScreen;
589     }
590 
setSmallScreen(boolean smallScreen)591     public void setSmallScreen(boolean smallScreen) {
592         mIsSmallScreen = smallScreen;
593     }
594 
setUnlockHintRunning(boolean unlockHintRunning)595     public void setUnlockHintRunning(boolean unlockHintRunning) {
596         mUnlockHintRunning = unlockHintRunning;
597     }
598 
isUnlockHintRunning()599     public boolean isUnlockHintRunning() {
600         return mUnlockHintRunning;
601     }
602 
603     /**
604      * @return Whether we need to do a fling down after swiping up on lockscreen.
605      */
isFlingingAfterSwipeUpOnLockscreen()606     public boolean isFlingingAfterSwipeUpOnLockscreen() {
607         return mIsFlinging && mIsFlingRequiredAfterLockScreenSwipeUp;
608     }
609 
610     /**
611      * @return whether a view is dozing and not pulsing right now
612      */
isDozingAndNotPulsing(ExpandableView view)613     public boolean isDozingAndNotPulsing(ExpandableView view) {
614         if (view instanceof ExpandableNotificationRow) {
615             return isDozingAndNotPulsing((ExpandableNotificationRow) view);
616         }
617         return false;
618     }
619 
620     /**
621      * @return whether a row is dozing and not pulsing right now
622      */
isDozingAndNotPulsing(ExpandableNotificationRow row)623     public boolean isDozingAndNotPulsing(ExpandableNotificationRow row) {
624         return isDozing() && !isPulsing(row.getEntry());
625     }
626 
627     /**
628      * @return {@code true } when shade is completely hidden: in AOD, ambient display or when
629      * bypassing.
630      */
isFullyHidden()631     public boolean isFullyHidden() {
632         return mHideAmount == 1;
633     }
634 
isHiddenAtAll()635     public boolean isHiddenAtAll() {
636         return mHideAmount != 0;
637     }
638 
setAppearing(boolean appearing)639     public void setAppearing(boolean appearing) {
640         mAppearing = appearing;
641     }
642 
isAppearing()643     public boolean isAppearing() {
644         return mAppearing;
645     }
646 
setPulseHeight(float height)647     public void setPulseHeight(float height) {
648         if (height != mPulseHeight) {
649             mPulseHeight = height;
650             if (mOnPulseHeightChangedListener != null) {
651                 mOnPulseHeightChangedListener.run();
652             }
653         }
654     }
655 
getPulseHeight()656     public float getPulseHeight() {
657         if (mPulseHeight == MAX_PULSE_HEIGHT) {
658             // If we're not pulse expanding, the height should be 0
659             return 0;
660         }
661         return mPulseHeight;
662     }
663 
setDozeAmount(float dozeAmount)664     public void setDozeAmount(float dozeAmount) {
665         if (dozeAmount != mDozeAmount) {
666             mDozeAmount = dozeAmount;
667             if (dozeAmount == 0.0f || dozeAmount == 1.0f) {
668                 // We woke all the way up, let's reset the pulse height
669                 setPulseHeight(MAX_PULSE_HEIGHT);
670             }
671         }
672     }
673 
getDozeAmount()674     public float getDozeAmount() {
675         return mDozeAmount;
676     }
677 
678     /**
679      * Is the device fully awake, which is different from not tark at all when there are pulsing
680      * notifications.
681      */
isFullyAwake()682     public boolean isFullyAwake() {
683         return mDozeAmount == 0.0f;
684     }
685 
setOnPulseHeightChangedListener(Runnable onPulseHeightChangedListener)686     public void setOnPulseHeightChangedListener(Runnable onPulseHeightChangedListener) {
687         mOnPulseHeightChangedListener = onPulseHeightChangedListener;
688     }
689 
setTrackedHeadsUpRow(ExpandableNotificationRow row)690     public void setTrackedHeadsUpRow(ExpandableNotificationRow row) {
691         mTrackedHeadsUpRow = row;
692     }
693 
694     /**
695      * Returns the currently tracked heads up row, if there is one and it is currently above the
696      * shelf (still appearing).
697      */
getTrackedHeadsUpRow()698     public ExpandableNotificationRow getTrackedHeadsUpRow() {
699         if (mTrackedHeadsUpRow == null || !mTrackedHeadsUpRow.isAboveShelf()) {
700             return null;
701         }
702         return mTrackedHeadsUpRow;
703     }
704 
setAppearFraction(float appearFraction)705     public void setAppearFraction(float appearFraction) {
706         mAppearFraction = appearFraction;
707     }
708 
getAppearFraction()709     public float getAppearFraction() {
710         return mAppearFraction;
711     }
712 
setHasAlertEntries(boolean hasAlertEntries)713     public void setHasAlertEntries(boolean hasAlertEntries) {
714         mHasAlertEntries = hasAlertEntries;
715     }
716 
setStackTopMargin(int stackTopMargin)717     public void setStackTopMargin(int stackTopMargin) {
718         mStackTopMargin = stackTopMargin;
719     }
720 
getStackTopMargin()721     public int getStackTopMargin() {
722         return mStackTopMargin;
723     }
724 
725     /**
726      * Check to see if we are about to show bouncer.
727      *
728      * @return if bouncer expansion is between 0 and 1.
729      */
isBouncerInTransit()730     public boolean isBouncerInTransit() {
731         return mStatusBarKeyguardViewManager != null
732                 && mStatusBarKeyguardViewManager.isPrimaryBouncerInTransit();
733     }
734 
735     /**
736      * @param isClosing Whether the shade is currently closing.
737      */
setIsClosing(boolean isClosing)738     public void setIsClosing(boolean isClosing) {
739         mIsClosing = isClosing;
740     }
741 
742     /**
743      * @return Whether the shade is currently closing.
744      */
isClosing()745     public boolean isClosing() {
746         return mIsClosing;
747     }
748 
getLargeScreenShadeInterpolator()749     public LargeScreenShadeInterpolator getLargeScreenShadeInterpolator() {
750         return mLargeScreenShadeInterpolator;
751     }
752 
753     @Override
dump(PrintWriter pw, String[] args)754     public void dump(PrintWriter pw, String[] args) {
755         pw.println("mTopPadding=" + mTopPadding);
756         pw.println("mStackTopMargin=" + mStackTopMargin);
757         pw.println("mStackTranslation=" + mStackTranslation);
758         pw.println("mLayoutMinHeight=" + mLayoutMinHeight);
759         pw.println("mLayoutMaxHeight=" + mLayoutMaxHeight);
760         pw.println("mLayoutHeight=" + mLayoutHeight);
761         pw.println("mContentHeight=" + mContentHeight);
762         pw.println("mHideSensitive=" + mHideSensitive);
763         pw.println("mShadeExpanded=" + mShadeExpanded);
764         pw.println("mClearAllInProgress=" + mClearAllInProgress);
765         pw.println("mDimmed=" + mDimmed);
766         pw.println("mStatusBarState=" + mStatusBarState);
767         pw.println("mExpansionChanging=" + mExpansionChanging);
768         pw.println("mPanelFullWidth=" + mIsSmallScreen);
769         pw.println("mPulsing=" + mPulsing);
770         pw.println("mPulseHeight=" + mPulseHeight);
771         pw.println("mTrackedHeadsUpRow.key=" + logKey(mTrackedHeadsUpRow));
772         pw.println("mMaxHeadsUpTranslation=" + mMaxHeadsUpTranslation);
773         pw.println("mUnlockHintRunning=" + mUnlockHintRunning);
774         pw.println("mDozeAmount=" + mDozeAmount);
775         pw.println("mDozing=" + mDozing);
776         pw.println("mFractionToShade=" + mFractionToShade);
777         pw.println("mHideAmount=" + mHideAmount);
778         pw.println("mAppearFraction=" + mAppearFraction);
779         pw.println("mAppearing=" + mAppearing);
780         pw.println("mExpansionFraction=" + mExpansionFraction);
781         pw.println("mExpandingVelocity=" + mExpandingVelocity);
782         pw.println("mOverScrollTopAmount=" + mOverScrollTopAmount);
783         pw.println("mOverScrollBottomAmount=" + mOverScrollBottomAmount);
784         pw.println("mOverExpansion=" + mOverExpansion);
785         pw.println("mStackHeight=" + mStackHeight);
786         pw.println("mStackEndHeight=" + mStackEndHeight);
787         pw.println("mStackY=" + mStackY);
788         pw.println("mScrollY=" + mScrollY);
789         pw.println("mCurrentScrollVelocity=" + mCurrentScrollVelocity);
790         pw.println("mIsSwipingUp=" + mIsSwipingUp);
791         pw.println("mPanelTracking=" + mPanelTracking);
792         pw.println("mIsFlinging=" + mIsFlinging);
793         pw.println("mIsFlingRequiredAfterLockScreenSwipeUp="
794                 + mIsFlingRequiredAfterLockScreenSwipeUp);
795         pw.println("mZDistanceBetweenElements=" + mZDistanceBetweenElements);
796         pw.println("mBaseZHeight=" + mBaseZHeight);
797         pw.println("mIsClosing=" + mIsClosing);
798     }
799 }
800