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

Commit f0a6622f authored by Juan Sebastian Martinez's avatar Juan Sebastian Martinez Committed by Android (Google) Code Review
Browse files

Merge "Using View.performHapticFeedback on Volume Dialog Impl when the silent...

Merge "Using View.performHapticFeedback on Volume Dialog Impl when the silent and vibrate-only icons are pressed" into udc-qpr-dev
parents 64308004 b8e689d1
Loading
Loading
Loading
Loading
+29 −3
Original line number Original line Diff line number Diff line
@@ -34,6 +34,7 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;


import static com.android.internal.jank.InteractionJankMonitor.CUJ_VOLUME_CONTROL;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_VOLUME_CONTROL;
import static com.android.internal.jank.InteractionJankMonitor.Configuration.Builder;
import static com.android.internal.jank.InteractionJankMonitor.Configuration.Builder;
import static com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION;
import static com.android.systemui.volume.Events.DISMISS_REASON_POSTURE_CHANGED;
import static com.android.systemui.volume.Events.DISMISS_REASON_POSTURE_CHANGED;
import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED;
import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED;


@@ -82,6 +83,7 @@ import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseBooleanArray;
import android.view.ContextThemeWrapper;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View;
import android.view.View.AccessibilityDelegate;
import android.view.View.AccessibilityDelegate;
@@ -120,6 +122,7 @@ import com.android.systemui.Dumpable;
import com.android.systemui.Prefs;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialog;
@@ -300,6 +303,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
    private final DevicePostureController mDevicePostureController;
    private final DevicePostureController mDevicePostureController;
    private @DevicePostureController.DevicePostureInt int mDevicePosture;
    private @DevicePostureController.DevicePostureInt int mDevicePosture;
    private int mOrientation;
    private int mOrientation;
    private final FeatureFlags mFeatureFlags;


    public VolumeDialogImpl(
    public VolumeDialogImpl(
            Context context,
            Context context,
@@ -315,7 +319,9 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
            CsdWarningDialog.Factory csdWarningDialogFactory,
            CsdWarningDialog.Factory csdWarningDialogFactory,
            DevicePostureController devicePostureController,
            DevicePostureController devicePostureController,
            Looper looper,
            Looper looper,
            DumpManager dumpManager) {
            DumpManager dumpManager,
            FeatureFlags featureFlags) {
        mFeatureFlags = featureFlags;
        mContext =
        mContext =
                new ContextThemeWrapper(context, R.style.volume_dialog_theme);
                new ContextThemeWrapper(context, R.style.volume_dialog_theme);
        mHandler = new H(looper);
        mHandler = new H(looper);
@@ -1319,12 +1325,14 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,


    private void provideTouchFeedbackH(int newRingerMode) {
    private void provideTouchFeedbackH(int newRingerMode) {
        VibrationEffect effect = null;
        VibrationEffect effect = null;
        int hapticConstant = HapticFeedbackConstants.NO_HAPTICS;
        switch (newRingerMode) {
        switch (newRingerMode) {
            case RINGER_MODE_NORMAL:
            case RINGER_MODE_NORMAL:
                mController.scheduleTouchFeedback();
                mController.scheduleTouchFeedback();
                break;
                break;
            case RINGER_MODE_SILENT:
            case RINGER_MODE_SILENT:
                effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
                effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
                hapticConstant = HapticFeedbackConstants.TOGGLE_OFF;
                break;
                break;
            case RINGER_MODE_VIBRATE:
            case RINGER_MODE_VIBRATE:
                // Feedback handled by onStateChange, for feedback both when user toggles
                // Feedback handled by onStateChange, for feedback both when user toggles
@@ -1332,8 +1340,11 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
                break;
                break;
            default:
            default:
                effect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
                effect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK);
                hapticConstant = HapticFeedbackConstants.TOGGLE_ON;
        }
        }
        if (effect != null) {
        if (mFeatureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
            mDialogView.performHapticFeedback(hapticConstant);
        } else if (effect != null) {
            mController.vibrate(effect);
            mController.vibrate(effect);
        }
        }
    }
    }
@@ -1770,8 +1781,23 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable,
                && mState.ringerModeInternal != -1
                && mState.ringerModeInternal != -1
                && mState.ringerModeInternal != state.ringerModeInternal
                && mState.ringerModeInternal != state.ringerModeInternal
                && state.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) {
                && state.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) {

            if (mFeatureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
                if (mShowing) {
                    // The dialog view is responsible for triggering haptics in the oneway API
                    mDialogView.performHapticFeedback(HapticFeedbackConstants.TOGGLE_ON);
                }
                /*
                TODO(b/290642122): If the dialog is not showing, we have the case where haptics is
                enabled by dragging the volume slider of Settings to a value of 0. This must be
                handled by view Slices in Settings whilst using the performHapticFeedback API.
                 */

            } else {
                // Old behavior only active if the oneway API is not used.
                mController.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK));
                mController.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK));
            }
            }
        }
        mState = state;
        mState = state;
        mDynamic.clear();
        mDynamic.clear();
        // add any new dynamic rows
        // add any new dynamic rows
+5 −2
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.os.Looper;


import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialog;
@@ -61,7 +62,8 @@ public interface VolumeModule {
            InteractionJankMonitor interactionJankMonitor,
            InteractionJankMonitor interactionJankMonitor,
            CsdWarningDialog.Factory csdFactory,
            CsdWarningDialog.Factory csdFactory,
            DevicePostureController devicePostureController,
            DevicePostureController devicePostureController,
            DumpManager dumpManager) {
            DumpManager dumpManager,
            FeatureFlags featureFlags) {
        VolumeDialogImpl impl = new VolumeDialogImpl(
        VolumeDialogImpl impl = new VolumeDialogImpl(
                context,
                context,
                volumeDialogController,
                volumeDialogController,
@@ -76,7 +78,8 @@ public interface VolumeModule {
                csdFactory,
                csdFactory,
                devicePostureController,
                devicePostureController,
                Looper.getMainLooper(),
                Looper.getMainLooper(),
                dumpManager);
                dumpManager,
                featureFlags);
        impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
        impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false);
        impl.setAutomute(true);
        impl.setAutomute(true);
        impl.setSilentMode(false);
        impl.setSilentMode(false);
+108 −5
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.volume;
package com.android.systemui.volume;


import static com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION;
import static com.android.systemui.volume.Events.DISMISS_REASON_UNKNOWN;
import static com.android.systemui.volume.Events.DISMISS_REASON_UNKNOWN;
import static com.android.systemui.volume.Events.SHOW_REASON_UNKNOWN;
import static com.android.systemui.volume.Events.SHOW_REASON_UNKNOWN;
import static com.android.systemui.volume.VolumeDialogControllerImpl.STREAMS;
import static com.android.systemui.volume.VolumeDialogControllerImpl.STREAMS;
@@ -51,6 +52,7 @@ import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FakeFeatureFlags;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.media.dialog.MediaOutputDialogFactory;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.plugins.VolumeDialogController;
@@ -117,6 +119,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {
        }
        }
    };
    };


    private FakeFeatureFlags mFeatureFlags;

    @Before
    @Before
    public void setup() throws Exception {
    public void setup() throws Exception {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
@@ -132,6 +136,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {


        mConfigurationController = new FakeConfigurationController();
        mConfigurationController = new FakeConfigurationController();


        mFeatureFlags = new FakeFeatureFlags();

        mDialog = new VolumeDialogImpl(
        mDialog = new VolumeDialogImpl(
                getContext(),
                getContext(),
                mVolumeDialogController,
                mVolumeDialogController,
@@ -146,7 +152,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {
                mCsdWarningDialogFactory,
                mCsdWarningDialogFactory,
                mPostureController,
                mPostureController,
                mTestableLooper.getLooper(),
                mTestableLooper.getLooper(),
                mDumpManager);
                mDumpManager,
                mFeatureFlags);
        mDialog.init(0, null);
        mDialog.init(0, null);
        State state = createShellState();
        State state = createShellState();
        mDialog.onStateChangedH(state);
        mDialog.onStateChangedH(state);
@@ -254,6 +261,7 @@ public class VolumeDialogImplTest extends SysuiTestCase {


    @Test
    @Test
    public void testVibrateOnRingerChangedToVibrate() {
    public void testVibrateOnRingerChangedToVibrate() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
        final State initialSilentState = new State();
        final State initialSilentState = new State();
        initialSilentState.ringerModeInternal = AudioManager.RINGER_MODE_SILENT;
        initialSilentState.ringerModeInternal = AudioManager.RINGER_MODE_SILENT;


@@ -273,8 +281,31 @@ public class VolumeDialogImplTest extends SysuiTestCase {
        verify(mVolumeDialogController).vibrate(any());
        verify(mVolumeDialogController).vibrate(any());
    }
    }


    @Test
    public void testControllerDoesNotVibrateOnRingerChangedToVibrate_OnewayAPI_On() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        final State initialSilentState = new State();
        initialSilentState.ringerModeInternal = AudioManager.RINGER_MODE_SILENT;

        final State vibrateState = new State();
        vibrateState.ringerModeInternal = AudioManager.RINGER_MODE_VIBRATE;

        // change ringer to silent
        mDialog.onStateChangedH(initialSilentState);

        // expected: shouldn't call vibrate yet
        verify(mVolumeDialogController, never()).vibrate(any());

        // changed ringer to vibrate
        mDialog.onStateChangedH(vibrateState);

        // expected: vibrate method of controller is not used
        verify(mVolumeDialogController, never()).vibrate(any());
    }

    @Test
    @Test
    public void testNoVibrateOnRingerInitialization() {
    public void testNoVibrateOnRingerInitialization() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
        final State initialUnsetState = new State();
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = -1;
        initialUnsetState.ringerModeInternal = -1;


@@ -291,8 +322,43 @@ public class VolumeDialogImplTest extends SysuiTestCase {
        verify(mVolumeDialogController, never()).vibrate(any());
        verify(mVolumeDialogController, never()).vibrate(any());
    }
    }


    @Test
    public void testControllerDoesNotVibrateOnRingerInitialization_OnewayAPI_On() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = -1;

        // ringer not initialized yet:
        mDialog.onStateChangedH(initialUnsetState);

        final State vibrateState = new State();
        vibrateState.ringerModeInternal = AudioManager.RINGER_MODE_VIBRATE;

        // changed ringer to vibrate
        mDialog.onStateChangedH(vibrateState);

        // shouldn't call vibrate on the controller either
        verify(mVolumeDialogController, never()).vibrate(any());
    }

    @Test
    @Test
    public void testSelectVibrateFromDrawer() {
    public void testSelectVibrateFromDrawer() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_NORMAL;
        mDialog.onStateChangedH(initialUnsetState);

        mActiveRinger.performClick();
        mDrawerVibrate.performClick();

        // Make sure we've actually changed the ringer mode.
        verify(mVolumeDialogController, times(1)).setRingerMode(
                AudioManager.RINGER_MODE_VIBRATE, false);
    }

    @Test
    public void testSelectVibrateFromDrawer_OnewayAPI_On() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        final State initialUnsetState = new State();
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_NORMAL;
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_NORMAL;
        mDialog.onStateChangedH(initialUnsetState);
        mDialog.onStateChangedH(initialUnsetState);
@@ -307,6 +373,22 @@ public class VolumeDialogImplTest extends SysuiTestCase {


    @Test
    @Test
    public void testSelectMuteFromDrawer() {
    public void testSelectMuteFromDrawer() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_NORMAL;
        mDialog.onStateChangedH(initialUnsetState);

        mActiveRinger.performClick();
        mDrawerMute.performClick();

        // Make sure we've actually changed the ringer mode.
        verify(mVolumeDialogController, times(1)).setRingerMode(
                AudioManager.RINGER_MODE_SILENT, false);
    }

    @Test
    public void testSelectMuteFromDrawer_OnewayAPI_On() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        final State initialUnsetState = new State();
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_NORMAL;
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_NORMAL;
        mDialog.onStateChangedH(initialUnsetState);
        mDialog.onStateChangedH(initialUnsetState);
@@ -321,6 +403,22 @@ public class VolumeDialogImplTest extends SysuiTestCase {


    @Test
    @Test
    public void testSelectNormalFromDrawer() {
    public void testSelectNormalFromDrawer() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false);
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_VIBRATE;
        mDialog.onStateChangedH(initialUnsetState);

        mActiveRinger.performClick();
        mDrawerNormal.performClick();

        // Make sure we've actually changed the ringer mode.
        verify(mVolumeDialogController, times(1)).setRingerMode(
                AudioManager.RINGER_MODE_NORMAL, false);
    }

    @Test
    public void testSelectNormalFromDrawer_OnewayAPI_On() {
        mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true);
        final State initialUnsetState = new State();
        final State initialUnsetState = new State();
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_VIBRATE;
        initialUnsetState.ringerModeInternal = AudioManager.RINGER_MODE_VIBRATE;
        mDialog.onStateChangedH(initialUnsetState);
        mDialog.onStateChangedH(initialUnsetState);
@@ -383,7 +481,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {
                mCsdWarningDialogFactory,
                mCsdWarningDialogFactory,
                devicePostureController,
                devicePostureController,
                mTestableLooper.getLooper(),
                mTestableLooper.getLooper(),
                mDumpManager
                mDumpManager,
                mFeatureFlags
        );
        );
        dialog.init(0 , null);
        dialog.init(0 , null);


@@ -423,7 +522,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {
                mCsdWarningDialogFactory,
                mCsdWarningDialogFactory,
                devicePostureController,
                devicePostureController,
                mTestableLooper.getLooper(),
                mTestableLooper.getLooper(),
                mDumpManager
                mDumpManager,
                mFeatureFlags
        );
        );
        dialog.init(0, null);
        dialog.init(0, null);


@@ -462,7 +562,8 @@ public class VolumeDialogImplTest extends SysuiTestCase {
                mCsdWarningDialogFactory,
                mCsdWarningDialogFactory,
                devicePostureController,
                devicePostureController,
                mTestableLooper.getLooper(),
                mTestableLooper.getLooper(),
                mDumpManager
                mDumpManager,
                mFeatureFlags
        );
        );
        dialog.init(0, null);
        dialog.init(0, null);


@@ -503,7 +604,9 @@ public class VolumeDialogImplTest extends SysuiTestCase {
                mCsdWarningDialogFactory,
                mCsdWarningDialogFactory,
                mPostureController,
                mPostureController,
                mTestableLooper.getLooper(),
                mTestableLooper.getLooper(),
                mDumpManager);
                mDumpManager,
                mFeatureFlags
        );
        dialog.init(0, null);
        dialog.init(0, null);


        verify(mPostureController, never()).removeCallback(any());
        verify(mPostureController, never()).removeCallback(any());