diff options
3 files changed, 51 insertions, 4 deletions
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 844a2c495501..3115361c6927 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java @@ -16,7 +16,10 @@ package com.android.systemui.statusbar.notification; +import android.content.Context; import android.graphics.Color; +import android.os.UserHandle; +import android.provider.Settings; import android.view.View; import android.widget.ImageView; @@ -57,4 +60,10 @@ public class NotificationUtils { offsetView.getLocationOnScreen(sLocationOffset); 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; + } + } 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 e0d9748c48bf..88a562648a63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -16,14 +16,19 @@ 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; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.Icon; +import android.os.AsyncTask; +import android.os.UserHandle; import android.os.VibrationEffect; import android.os.Vibrator; +import android.provider.Settings; import android.support.v4.util.ArrayMap; import android.support.v4.util.ArraySet; import android.util.AttributeSet; @@ -34,6 +39,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.AlphaOptimizedFrameLayout; import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.stack.AnimationFilter; import com.android.systemui.statusbar.stack.AnimationProperties; import com.android.systemui.statusbar.stack.StackStateAnimator; @@ -623,9 +629,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { boolean wasInShelf = icon.isInShelf(); boolean inShelf = iconAppearAmount == 1.0f; icon.setIsInShelf(inShelf); - if (mVibrateOnAnimation && !justAdded && mAnimationsEnabled - && wasInShelf != inShelf) { - mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK)); + if (shouldVibrateChange(wasInShelf != inShelf)) { + AsyncTask.execute( + () -> mVibrator.vibrate(VibrationEffect.get( + VibrationEffect.EFFECT_TICK))); } } justAdded = false; @@ -634,6 +641,25 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { justUndarkened = 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 d3ee55098474..46f9c04aa42e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -16,6 +16,8 @@ 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; @@ -23,9 +25,12 @@ import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; +import android.os.AsyncTask; 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; @@ -45,6 +50,7 @@ import com.android.systemui.classifier.FalsingManager; import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.notification.NotificationUtils; import com.android.systemui.statusbar.policy.HeadsUpManager; import java.io.FileDescriptor; @@ -59,6 +65,7 @@ public abstract class PanelView extends FrameLayout { private float mMinExpandHeight; private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger(); private boolean mPanelUpdateWhenAnimatorEnds; + private boolean mVibrateOnOpening; private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); @@ -203,6 +210,8 @@ public abstract class PanelView extends FrameLayout { mNotificationsDragEnabled = getResources().getBoolean(R.bool.config_enableNotificationShadeDrag); mVibrator = mContext.getSystemService(Vibrator.class); + mVibrateOnOpening = mContext.getResources().getBoolean( + R.bool.config_vibrateOnIconAnimation); } protected void loadDimens() { @@ -394,7 +403,10 @@ public abstract class PanelView extends FrameLayout { runPeekAnimation(INITIAL_OPENING_PEEK_DURATION, getOpeningHeight(), false /* collapseWhenFinished */); notifyBarPanelExpansionChanged(); - mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_CLICK)); + if (mVibrateOnOpening && !isHapticFeedbackDisabled(mContext)) { + AsyncTask.execute( + () -> mVibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_TICK))); + } } protected abstract float getOpeningHeight(); |