Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6559f87 authored by Selim Cinek's avatar Selim Cinek
Browse files

Modified the vibration of the notification panel

The vibrations are now gated by "Vibrate on Tap"
This also moves the vibration on expansion to a
tick instead of a click.
Also improved the performance, such that vibrations
are now happening on the background thread instead
of the foreground.

Fixes: 64600716
Fixes: 64121575
Test: manual, observe vibrations when expanding / scrolling
Change-Id: I5099287adacc0f916941fd77e97948b9fa16ad09
parent d836c4f8
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -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;
    }

}
+29 −3
Original line number Diff line number Diff line
@@ -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;
        }
+13 −1
Original line number Diff line number Diff line
@@ -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();