diff options
| -rw-r--r-- | core/java/com/android/internal/widget/SwipeDismissLayout.java | 62 | ||||
| -rwxr-xr-x | services/core/java/com/android/server/am/ActivityRecord.java | 7 |
2 files changed, 33 insertions, 36 deletions
diff --git a/core/java/com/android/internal/widget/SwipeDismissLayout.java b/core/java/com/android/internal/widget/SwipeDismissLayout.java index 83b49eb47e56..bdcfff2f3b41 100644 --- a/core/java/com/android/internal/widget/SwipeDismissLayout.java +++ b/core/java/com/android/internal/widget/SwipeDismissLayout.java @@ -23,6 +23,7 @@ import android.animation.ValueAnimator.AnimatorUpdateListener; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.res.TypedArray; @@ -33,7 +34,6 @@ import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; -import android.view.ViewTreeObserver; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; @@ -44,7 +44,6 @@ public class SwipeDismissLayout extends FrameLayout { private static final String TAG = "SwipeDismissLayout"; private static final float DISMISS_MIN_DRAG_WIDTH_RATIO = .33f; - private boolean mUseDynamicTranslucency = true; public interface OnDismissedListener { void onDismissed(SwipeDismissLayout layout); @@ -64,6 +63,8 @@ public class SwipeDismissLayout extends FrameLayout { void onSwipeCancelled(SwipeDismissLayout layout); } + private boolean mIsWindowNativelyTranslucent; + // Cached ViewConfiguration and system-wide constant values private int mSlop; private int mMinFlingVelocity; @@ -83,19 +84,6 @@ public class SwipeDismissLayout extends FrameLayout { private OnDismissedListener mDismissedListener; private OnSwipeProgressChangedListener mProgressListener; - private ViewTreeObserver.OnEnterAnimationCompleteListener mOnEnterAnimationCompleteListener = - new ViewTreeObserver.OnEnterAnimationCompleteListener() { - @Override - public void onEnterAnimationComplete() { - // SwipeDismissLayout assumes that the host Activity is translucent - // and temporarily disables translucency when it is fully visible. - // As soon as the user starts swiping, we will re-enable - // translucency. - if (mUseDynamicTranslucency && getContext() instanceof Activity) { - ((Activity) getContext()).convertFromTranslucent(); - } - } - }; private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() { private Runnable mRunnable = new Runnable() { @Override @@ -141,8 +129,8 @@ public class SwipeDismissLayout extends FrameLayout { mMinFlingVelocity = vc.getScaledMinimumFlingVelocity(); TypedArray a = context.getTheme().obtainStyledAttributes( com.android.internal.R.styleable.Theme); - mUseDynamicTranslucency = !a.hasValue( - com.android.internal.R.styleable.Window_windowIsTranslucent); + mIsWindowNativelyTranslucent = a.getBoolean( + com.android.internal.R.styleable.Window_windowIsTranslucent, false); a.recycle(); } @@ -157,20 +145,12 @@ public class SwipeDismissLayout extends FrameLayout { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - if (getContext() instanceof Activity) { - getViewTreeObserver().addOnEnterAnimationCompleteListener( - mOnEnterAnimationCompleteListener); - } getContext().registerReceiver(mScreenOffReceiver, mScreenOffFilter); } @Override protected void onDetachedFromWindow() { getContext().unregisterReceiver(mScreenOffReceiver); - if (getContext() instanceof Activity) { - getViewTreeObserver().removeOnEnterAnimationCompleteListener( - mOnEnterAnimationCompleteListener); - } super.onDetachedFromWindow(); } @@ -273,9 +253,6 @@ public class SwipeDismissLayout extends FrameLayout { mLastX = ev.getRawX(); updateSwiping(ev); if (mSwiping) { - if (mUseDynamicTranslucency && getContext() instanceof Activity) { - ((Activity) getContext()).convertToTranslucent(null, null); - } setProgress(ev.getRawX() - mDownX); break; } @@ -298,8 +275,11 @@ public class SwipeDismissLayout extends FrameLayout { } protected void cancel() { - if (mUseDynamicTranslucency && getContext() instanceof Activity) { - ((Activity) getContext()).convertFromTranslucent(); + if (!mIsWindowNativelyTranslucent) { + Activity activity = findActivity(); + if (activity != null) { + activity.convertFromTranslucent(); + } } if (mProgressListener != null) { mProgressListener.onSwipeCancelled(this); @@ -323,6 +303,7 @@ public class SwipeDismissLayout extends FrameLayout { } private void updateSwiping(MotionEvent ev) { + boolean oldSwiping = mSwiping; if (!mSwiping) { float deltaX = ev.getRawX() - mDownX; float deltaY = ev.getRawY() - mDownY; @@ -332,6 +313,16 @@ public class SwipeDismissLayout extends FrameLayout { mSwiping = false; } } + + if (mSwiping && !oldSwiping) { + // Swiping has started + if (!mIsWindowNativelyTranslucent) { + Activity activity = findActivity(); + if (activity != null) { + activity.convertToTranslucent(null, null); + } + } + } } private void updateDismiss(MotionEvent ev) { @@ -406,6 +397,17 @@ public class SwipeDismissLayout extends FrameLayout { return 1 - progress * progress * progress; } + private Activity findActivity() { + Context context = getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; + } + context = ((ContextWrapper) context).getBaseContext(); + } + return null; + } + private class DismissAnimator implements AnimatorUpdateListener, Animator.AnimatorListener { private final TimeInterpolator DISMISS_INTERPOLATOR = new DecelerateInterpolator(1.5f); private final long DISMISS_DURATION = 250; diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 3f69712efa6f..7ada47abfada 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -710,12 +710,7 @@ final class ActivityRecord { AttributeCache.Entry ent = AttributeCache.instance().get(packageName, realTheme, com.android.internal.R.styleable.Window, userId); final boolean translucent = ent != null && (ent.array.getBoolean( - com.android.internal.R.styleable.Window_windowIsTranslucent, false) - || (!ent.array.hasValue( - com.android.internal.R.styleable.Window_windowIsTranslucent) - && ent.array.getBoolean( - com.android.internal.R.styleable.Window_windowSwipeToDismiss, - false))); + com.android.internal.R.styleable.Window_windowIsTranslucent, false)); fullscreen = ent != null && !ent.array.getBoolean( com.android.internal.R.styleable.Window_windowIsFloating, false) && !translucent; |