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