From 4f6c85f6bc85138181cb98932abbb9650f120aaf Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Mon, 4 Dec 2017 16:42:33 +0100 Subject: [PATCH] Removed vibrations when icons go into / out of the shelf This also removed binder transactions happening in every frame and improves it for the opening case to a listener. Change-Id: I8052848c622ca468b6daf17f8fbe335eac166255 Fixes: 65206902 Bug: 69933777 Test: open panel, observe vibrations --- .../systemui/statusbar/NotificationShelf.java | 15 -------- .../notification/NotificationUtils.java | 5 --- .../phone/NotificationIconContainer.java | 34 ------------------- .../systemui/statusbar/phone/PanelView.java | 24 +++++++++++-- .../statusbar/phone/StatusBarWindowView.java | 1 - .../stack/NotificationStackScrollLayout.java | 4 --- 6 files changed, 21 insertions(+), 62 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index b7a00ebcca416..75321fd7e68f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -82,9 +82,6 @@ public class NotificationShelf extends ActivatableNotificationView implements private boolean mNoAnimationsInThisFrame; private boolean mAnimationsEnabled = true; private boolean mShowNotificationShelf; - private boolean mVibrationOnAnimation; - private boolean mUserTouchingScreen; - private boolean mTouchActive; private float mFirstElementRoundness; public NotificationShelf(Context context, AttributeSet attrs) { @@ -102,9 +99,6 @@ public class NotificationShelf extends ActivatableNotificationView implements setClipChildren(false); setClipToPadding(false); mShelfIcons.setShowAllIcons(false); - mVibrationOnAnimation = mContext.getResources().getBoolean( - R.bool.config_vibrateOnIconAnimation); - updateVibrationOnAnimation(); mViewInvertHelper = new ViewInvertHelper(mShelfIcons, NotificationPanelView.DOZE_ANIMATION_DURATION); mShelfState = new ShelfState(); @@ -112,15 +106,6 @@ public class NotificationShelf extends ActivatableNotificationView implements initDimens(); } - private void updateVibrationOnAnimation() { - mShelfIcons.setVibrateOnAnimation(mVibrationOnAnimation && mTouchActive); - } - - public void setTouchActive(boolean touchActive) { - mTouchActive = touchActive; - updateVibrationOnAnimation(); - } - public void bind(AmbientState ambientState, NotificationStackScrollLayout hostLayout) { mAmbientState = ambientState; mHostLayout = hostLayout; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java index af393c91730fe..7e2336c4454bf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java @@ -61,11 +61,6 @@ public class NotificationUtils { return sLocationOffset[1] - sLocationBase[1]; } - public static boolean isHapticFeedbackDisabled(Context context) { - return Settings.System.getIntForUser(context.getContentResolver(), - Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) == 0; - } - /** * @param dimenId the dimen to look up * @return the font scaled dimen as if it were in sp but doesn't shrink sizes below dp diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 836efffbd4e44..a1b49c15a5603 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -16,8 +16,6 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.statusbar.notification.NotificationUtils.isHapticFeedbackDisabled; - import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; @@ -120,8 +118,6 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { private float mVisualOverflowAdaption; private boolean mDisallowNextAnimation; private boolean mAnimationsEnabled = true; - private boolean mVibrateOnAnimation; - private Vibrator mVibrator; private ArrayMap> mReplacingIcons; private int mDarkOffsetX; @@ -129,7 +125,6 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { super(context, attrs); initDimens(); setWillNotDraw(!DEBUG); - mVibrator = mContext.getSystemService(Vibrator.class); } private void initDimens() { @@ -497,10 +492,6 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { return width - (getWidth() - getActualPaddingStart() - getActualPaddingEnd()) > 0; } - public void setVibrateOnAnimation(boolean vibrateOnAnimation) { - mVibrateOnAnimation = vibrateOnAnimation; - } - public int getIconSize() { return mIconSize; } @@ -608,39 +599,14 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } else { super.applyToView(view); } - boolean wasInShelf = icon.isInShelf(); boolean inShelf = iconAppearAmount == 1.0f; icon.setIsInShelf(inShelf); - if (shouldVibrateChange(wasInShelf != inShelf)) { - AsyncTask.execute( - () -> mVibrator.vibrate(VibrationEffect.get( - VibrationEffect.EFFECT_TICK))); - } } justAdded = false; justReplaced = false; needsCannedAnimation = false; } - private boolean shouldVibrateChange(boolean inShelfChanged) { - if (!mVibrateOnAnimation) { - return false; - } - if (justAdded) { - return false; - } - if (!mAnimationsEnabled) { - return false; - } - if (!inShelfChanged) { - return false; - } - if (isHapticFeedbackDisabled(mContext)) { - return false; - } - return true; - } - public boolean hasCustomTransformHeight() { return isLastExpandIcon && customTransformHeight != NO_VALUE; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 83125c24e7cb2..2fc22caa6c054 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -16,8 +16,6 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.statusbar.notification.NotificationUtils.isHapticFeedbackDisabled; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; @@ -25,10 +23,14 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.database.ContentObserver; import android.os.AsyncTask; +import android.os.Handler; import android.os.SystemClock; +import android.os.UserHandle; import android.os.VibrationEffect; import android.os.Vibrator; +import android.provider.Settings; import android.util.AttributeSet; import android.util.Log; import android.view.InputDevice; @@ -63,6 +65,7 @@ public abstract class PanelView extends FrameLayout { private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mPanelUpdateWhenAnimatorEnds; private boolean mVibrateOnOpening; + private boolean mVibrationEnabled; private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); @@ -105,6 +108,12 @@ public abstract class PanelView extends FrameLayout { private FlingAnimationUtils mFlingAnimationUtilsDismissing; private FalsingManager mFalsingManager; private final Vibrator mVibrator; + final private ContentObserver mVibrationObserver = new ContentObserver(Handler.getMain()) { + @Override + public void onChange(boolean selfChange) { + updateHapticFeedBackEnabled(); + } + }; /** * Whether an instant expand request is currently pending and we are just waiting for layout. @@ -209,6 +218,15 @@ public abstract class PanelView extends FrameLayout { mVibrator = mContext.getSystemService(Vibrator.class); mVibrateOnOpening = mContext.getResources().getBoolean( R.bool.config_vibrateOnIconAnimation); + mContext.getContentResolver().registerContentObserver( + Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_ENABLED), true, + mVibrationObserver); + mVibrationObserver.onChange(false /* selfChange */); + } + + public void updateHapticFeedBackEnabled() { + mVibrationEnabled = Settings.System.getIntForUser(mContext.getContentResolver(), + Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) != 0; } protected void loadDimens() { @@ -400,7 +418,7 @@ public abstract class PanelView extends FrameLayout { runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); - if (mVibrateOnOpening && !isHapticFeedbackDisabled(mContext)) { + if (mVibrateOnOpening && mVibrationEnabled) { AsyncTask.execute(() -> mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK, false))); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index d7f11f7105018..4accd86cce983 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -248,7 +248,6 @@ public class StatusBarWindowView extends FrameLayout { public void setTouchActive(boolean touchActive) { mTouchActive = touchActive; - mStackScrollLayout.setTouchActive(touchActive); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index a3d2423f5df1d..0f2a2c8b2bc25 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -4443,10 +4443,6 @@ public class NotificationStackScrollLayout extends ViewGroup mAmbientState.getScrollY())); } - public void setTouchActive(boolean touchActive) { - mShelf.setTouchActive(touchActive); - } - /** * A listener that is notified when some child locations might have changed. */