am dccd3662: am c1de25d8: Merge "Animate notifs depending on touch when exiting doze mode" into lmp-mr1-dev

* commit 'dccd3662da356ed7b0beedc09c8a58103723b463':
  Animate notifs depending on touch when exiting doze mode
This commit is contained in:
Jorim Jaggi
2014-11-26 12:02:13 +00:00
committed by Android Git Automerger
5 changed files with 102 additions and 17 deletions

View File

@@ -53,6 +53,7 @@ import android.graphics.Canvas;
import android.graphics.ColorFilter; import android.graphics.ColorFilter;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode; import android.graphics.PorterDuffXfermode;
import android.graphics.Rect; import android.graphics.Rect;
@@ -267,6 +268,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
private UnlockMethodCache mUnlockMethodCache; private UnlockMethodCache mUnlockMethodCache;
private DozeServiceHost mDozeServiceHost; private DozeServiceHost mDozeServiceHost;
private boolean mScreenOnComingFromTouch; private boolean mScreenOnComingFromTouch;
private PointF mScreenOnTouchLocation;
int mPixelFormat; int mPixelFormat;
Object mQueueLock = new Object(); Object mQueueLock = new Object();
@@ -3711,7 +3713,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
} }
boolean animate = !mDozing && mDozeScrimController.isPulsing(); boolean animate = !mDozing && mDozeScrimController.isPulsing();
mNotificationPanel.setDozing(mDozing, animate); mNotificationPanel.setDozing(mDozing, animate);
mStackScroller.setDark(mDozing, animate); mStackScroller.setDark(mDozing, animate, mScreenOnTouchLocation);
mScrimController.setDozing(mDozing); mScrimController.setDozing(mDozing);
mDozeScrimController.setDozing(mDozing, animate); mDozeScrimController.setDozing(mDozing, animate);
} }
@@ -3967,6 +3969,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
public void onScreenTurnedOff() { public void onScreenTurnedOff() {
mScreenOnFromKeyguard = false; mScreenOnFromKeyguard = false;
mScreenOnComingFromTouch = false; mScreenOnComingFromTouch = false;
mScreenOnTouchLocation = null;
mStackScroller.setAnimationsEnabled(false); mStackScroller.setAnimationsEnabled(false);
updateVisibleToUser(); updateVisibleToUser();
} }
@@ -4089,14 +4092,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
return !mNotificationData.getActiveNotifications().isEmpty(); return !mNotificationData.getActiveNotifications().isEmpty();
} }
public void wakeUpIfDozing(long time, boolean fromTouch) { public void wakeUpIfDozing(long time, MotionEvent event) {
if (mDozing && mDozeScrimController.isPulsing()) { if (mDozing && mDozeScrimController.isPulsing()) {
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
pm.wakeUp(time); pm.wakeUp(time);
if (fromTouch) { mScreenOnComingFromTouch = true;
mScreenOnComingFromTouch = true; mScreenOnTouchLocation = new PointF(event.getX(), event.getY());
mNotificationPanel.setTouchDisabled(false); mNotificationPanel.setTouchDisabled(false);
}
} }
} }

View File

@@ -173,7 +173,7 @@ public class StatusBarWindowView extends FrameLayout {
intercept = mDragDownHelper.onInterceptTouchEvent(ev); intercept = mDragDownHelper.onInterceptTouchEvent(ev);
// wake up on a touch down event, if dozing // wake up on a touch down event, if dozing
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) { if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
mService.wakeUpIfDozing(ev.getEventTime(), true); mService.wakeUpIfDozing(ev.getEventTime(), ev);
} }
} }
if (!intercept) { if (!intercept) {

View File

@@ -34,6 +34,7 @@ public class AnimationFilter {
boolean hasDelays; boolean hasDelays;
boolean hasGoToFullShadeEvent; boolean hasGoToFullShadeEvent;
boolean hasDarkEvent; boolean hasDarkEvent;
int darkAnimationOriginIndex;
public AnimationFilter animateAlpha() { public AnimationFilter animateAlpha() {
animateAlpha = true; animateAlpha = true;
@@ -94,14 +95,16 @@ public class AnimationFilter {
reset(); reset();
int size = events.size(); int size = events.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
NotificationStackScrollLayout.AnimationEvent ev = events.get(i);
combineFilter(events.get(i).filter); combineFilter(events.get(i).filter);
if (events.get(i).animationType == if (ev.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE) { NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE) {
hasGoToFullShadeEvent = true; hasGoToFullShadeEvent = true;
} }
if (events.get(i).animationType == if (ev.animationType ==
NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_DARK) { NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_DARK) {
hasDarkEvent = true; hasDarkEvent = true;
darkAnimationOriginIndex = ev.darkAnimationOriginIndex;
} }
} }
} }
@@ -132,5 +135,7 @@ public class AnimationFilter {
hasDelays = false; hasDelays = false;
hasGoToFullShadeEvent = false; hasGoToFullShadeEvent = false;
hasDarkEvent = false; hasDarkEvent = false;
darkAnimationOriginIndex =
NotificationStackScrollLayout.AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE;
} }
} }

View File

@@ -16,10 +16,12 @@
package com.android.systemui.statusbar.stack; package com.android.systemui.statusbar.stack;
import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
@@ -149,6 +151,7 @@ public class NotificationStackScrollLayout extends ViewGroup
private boolean mDimmedNeedsAnimation; private boolean mDimmedNeedsAnimation;
private boolean mHideSensitiveNeedsAnimation; private boolean mHideSensitiveNeedsAnimation;
private boolean mDarkNeedsAnimation; private boolean mDarkNeedsAnimation;
private int mDarkAnimationOriginIndex;
private boolean mActivateNeedsAnimation; private boolean mActivateNeedsAnimation;
private boolean mGoToFullShadeNeedsAnimation; private boolean mGoToFullShadeNeedsAnimation;
private boolean mIsExpanded = true; private boolean mIsExpanded = true;
@@ -210,6 +213,7 @@ public class NotificationStackScrollLayout extends ViewGroup
} }
}; };
private PhoneStatusBar mPhoneStatusBar; private PhoneStatusBar mPhoneStatusBar;
private int[] mTempInt2 = new int[2];
public NotificationStackScrollLayout(Context context) { public NotificationStackScrollLayout(Context context) {
this(context, null); this(context, null);
@@ -587,10 +591,38 @@ public class NotificationStackScrollLayout extends ViewGroup
return getChildAtPosition(ev.getX(), ev.getY()); return getChildAtPosition(ev.getX(), ev.getY());
} }
public ExpandableView getClosestChildAtRawPosition(float touchX, float touchY) {
getLocationOnScreen(mTempInt2);
float localTouchY = touchY - mTempInt2[1];
ExpandableView closestChild = null;
float minDist = Float.MAX_VALUE;
// find the view closest to the location, accounting for GONE views
final int count = getChildCount();
for (int childIdx = 0; childIdx < count; childIdx++) {
ExpandableView slidingChild = (ExpandableView) getChildAt(childIdx);
if (slidingChild.getVisibility() == GONE
|| slidingChild instanceof StackScrollerDecorView
|| slidingChild == mSpeedBumpView) {
continue;
}
float childTop = slidingChild.getTranslationY();
float top = childTop + slidingChild.getClipTopAmount();
float bottom = childTop + slidingChild.getActualHeight();
float dist = Math.min(Math.abs(top - localTouchY), Math.abs(bottom - localTouchY));
if (dist < minDist) {
closestChild = slidingChild;
minDist = dist;
}
}
return closestChild;
}
public ExpandableView getChildAtRawPosition(float touchX, float touchY) { public ExpandableView getChildAtRawPosition(float touchX, float touchY) {
int[] location = new int[2]; getLocationOnScreen(mTempInt2);
getLocationOnScreen(location); return getChildAtPosition(touchX - mTempInt2[0], touchY - mTempInt2[1]);
return getChildAtPosition(touchX - location[0], touchY - location[1]);
} }
public ExpandableView getChildAtPosition(float touchX, float touchY) { public ExpandableView getChildAtPosition(float touchX, float touchY) {
@@ -1818,8 +1850,9 @@ public class NotificationStackScrollLayout extends ViewGroup
private void generateDarkEvent() { private void generateDarkEvent() {
if (mDarkNeedsAnimation) { if (mDarkNeedsAnimation) {
mAnimationEvents.add( AnimationEvent ev = new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_DARK);
new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_DARK)); ev.darkAnimationOriginIndex = mDarkAnimationOriginIndex;
mAnimationEvents.add(ev);
} }
mDarkNeedsAnimation = false; mDarkNeedsAnimation = false;
} }
@@ -2151,7 +2184,7 @@ public class NotificationStackScrollLayout extends ViewGroup
mEmptyShadeView.setInvisible(); mEmptyShadeView.setInvisible();
mGoToFullShadeNeedsAnimation = true; mGoToFullShadeNeedsAnimation = true;
mGoToFullShadeDelay = delay; mGoToFullShadeDelay = delay;
mNeedsAnimation = true; mNeedsAnimation = true;
requestChildrenUpdate(); requestChildrenUpdate();
} }
@@ -2182,15 +2215,46 @@ public class NotificationStackScrollLayout extends ViewGroup
/** /**
* See {@link AmbientState#setDark}. * See {@link AmbientState#setDark}.
*/ */
public void setDark(boolean dark, boolean animate) { public void setDark(boolean dark, boolean animate, @Nullable PointF touchWakeUpScreenLocation) {
mAmbientState.setDark(dark); mAmbientState.setDark(dark);
if (animate && mAnimationsEnabled) { if (animate && mAnimationsEnabled) {
mDarkNeedsAnimation = true; mDarkNeedsAnimation = true;
mDarkAnimationOriginIndex = findDarkAnimationOriginIndex(touchWakeUpScreenLocation);
mNeedsAnimation = true; mNeedsAnimation = true;
} }
requestChildrenUpdate(); requestChildrenUpdate();
} }
private int findDarkAnimationOriginIndex(@Nullable PointF screenLocation) {
if (screenLocation == null || screenLocation.y < mTopPadding + mTopPaddingOverflow) {
return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE;
}
if (screenLocation.y > getBottomMostNotificationBottom()) {
return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_BELOW;
}
View child = getClosestChildAtRawPosition(screenLocation.x, screenLocation.y);
if (child != null) {
return getNotGoneIndex(child);
} else {
return AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE;
}
}
private int getNotGoneIndex(View child) {
int count = getChildCount();
int notGoneIndex = 0;
for (int i = 0; i < count; i++) {
View v = getChildAt(i);
if (child == v) {
return notGoneIndex;
}
if (v.getVisibility() != View.GONE) {
notGoneIndex++;
}
}
return -1;
}
public void setDismissView(DismissView dismissView) { public void setDismissView(DismissView dismissView) {
mDismissView = dismissView; mDismissView = dismissView;
addView(mDismissView); addView(mDismissView);
@@ -2556,12 +2620,16 @@ public class NotificationStackScrollLayout extends ViewGroup
static final int ANIMATION_TYPE_VIEW_RESIZE = 12; static final int ANIMATION_TYPE_VIEW_RESIZE = 12;
static final int ANIMATION_TYPE_EVERYTHING = 13; static final int ANIMATION_TYPE_EVERYTHING = 13;
static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1;
static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2;
final long eventStartTime; final long eventStartTime;
final View changingView; final View changingView;
final int animationType; final int animationType;
final AnimationFilter filter; final AnimationFilter filter;
final long length; final long length;
View viewAfterChangingView; View viewAfterChangingView;
int darkAnimationOriginIndex;
AnimationEvent(View view, int type) { AnimationEvent(View view, int type) {
this(view, type, LENGTHS[type]); this(view, type, LENGTHS[type]);

View File

@@ -315,7 +315,17 @@ public class StackStateAnimator {
} }
private long calculateDelayDark(StackScrollState.ViewState viewState) { private long calculateDelayDark(StackScrollState.ViewState viewState) {
return viewState.notGoneIndex * ANIMATION_DELAY_PER_ELEMENT_DARK; int referenceIndex;
if (mAnimationFilter.darkAnimationOriginIndex ==
NotificationStackScrollLayout.AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE) {
referenceIndex = 0;
} else if (mAnimationFilter.darkAnimationOriginIndex ==
NotificationStackScrollLayout.AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_BELOW) {
referenceIndex = mHostLayout.getNotGoneChildCount() - 1;
} else {
referenceIndex = mAnimationFilter.darkAnimationOriginIndex;
}
return Math.abs(referenceIndex - viewState.notGoneIndex) * ANIMATION_DELAY_PER_ELEMENT_DARK;
} }
private long calculateDelayGoToFullShade(StackScrollState.ViewState viewState) { private long calculateDelayGoToFullShade(StackScrollState.ViewState viewState) {