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

Commit 0f71bef5 authored by Sören Brinkmann's avatar Sören Brinkmann
Browse files

New option "Haptic Feedback" in the notificatin power widget is registered and implemented:

The option controls whether the phone vibrates or not when the sound profiles are changed
when using the SoundButton of the power widget.
Options:
   - On
   - Off
   - Global Setting (=Settings->Sound->Haptic Feedback)

Change-Id: Id735770fc46fe112d3187b00cf05d5475376b914
parent 5885a086
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2653,6 +2653,13 @@ public final class Settings {
         */
        public static final String EXPANDED_HIDE_INDICATOR = "expanded_hide_indicator";

        /**
         * Haptic feedback in power widget
         *
         * @hide
         */
        public static final String EXPANDED_HAPTIC_FEEDBACK = "expanded_haptic_feedback";

        /**
         * Notification Indicator Color
         *
+5 −0
Original line number Diff line number Diff line
@@ -252,6 +252,11 @@ public class PowerWidget extends FrameLayout {
                    Settings.System.getUriFor(Settings.System.EXPANDED_HIDE_SCROLLBAR),
                            false, this);

            // watch for haptic feedback
            resolver.registerContentObserver(
                    Settings.System.getUriFor(Settings.System.EXPANDED_HAPTIC_FEEDBACK),
                            false, this);

            // watch for changes in buttons
            resolver.registerContentObserver(
                    Settings.System.getUriFor(Settings.System.WIDGET_BUTTONS),
+73 −96
Original line number Diff line number Diff line
@@ -67,130 +67,68 @@ public class SoundButton extends PowerButton {
            // order of check: soundvib sound vib silent
            case RINGER_MODE_SOUND_AND_VIBRATE:
                if (supports(RINGER_MODE_SOUND_ONLY)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ONLY_SILENT);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
                            AudioManager.RINGER_MODE_NORMAL, false);
                } else if (supports(RINGER_MODE_VIBRATE_ONLY)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_VIBRATE, true);
                } else if (supports(RINGER_MODE_SILENT)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 0);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_OFF);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                    updateSettings(context, 0, AudioManager.VIBRATE_SETTING_OFF,
                            AudioManager.RINGER_MODE_SILENT, false);
                } else { // Fall Back
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_VIBRATE, true);
                }
                break;
            case RINGER_MODE_SOUND_ONLY:
                if (supports(RINGER_MODE_VIBRATE_ONLY)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ONLY_SILENT);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
                            AudioManager.RINGER_MODE_VIBRATE, true);
                } else if (supports(RINGER_MODE_SILENT)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 0);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_OFF);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                    updateSettings(context, 0, AudioManager.VIBRATE_SETTING_OFF,
                            AudioManager.RINGER_MODE_SILENT, false);
                } else if (supports(RINGER_MODE_SOUND_AND_VIBRATE)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_NORMAL, true);
                } else { // Fall back
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_VIBRATE, true);
                }
                break;

            case RINGER_MODE_VIBRATE_ONLY:
                if (supports(RINGER_MODE_SILENT)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 0);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_OFF);
                    updateSettings(context, 0, AudioManager.VIBRATE_SETTING_OFF,
                            AudioManager.RINGER_MODE_SILENT, false);
                } else if (supports(RINGER_MODE_SOUND_AND_VIBRATE)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_NORMAL, true);
                } else if (supports(RINGER_MODE_SOUND_ONLY)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ONLY_SILENT);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
                            AudioManager.RINGER_MODE_NORMAL, false);
                } else { // Fall Back
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_NORMAL, true);
                }
                break;
            case RINGER_MODE_SILENT:
                if (supports(RINGER_MODE_SOUND_AND_VIBRATE)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_NORMAL, true);
                } else if (supports(RINGER_MODE_SOUND_ONLY)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ONLY_SILENT);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
                            AudioManager.RINGER_MODE_NORMAL, false);
                } else if (supports(RINGER_MODE_VIBRATE_ONLY)) {
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ONLY_SILENT);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ONLY_SILENT,
                            AudioManager.RINGER_MODE_VIBRATE, true);
                } else { // Fall Back
                    Settings.System.putInt(context.getContentResolver(),
                            Settings.System.VIBRATE_IN_SILENT, 1);
                    AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                    AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                            AudioManager.VIBRATE_SETTING_ON);
                    VIBRATOR.vibrate(VIBRATE_DURATION);
                    updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                            AudioManager.RINGER_MODE_NORMAL, true);
                }
                break;
            default:
                Settings.System.putInt(context.getContentResolver(),
                        Settings.System.VIBRATE_IN_SILENT, 1);
                AUDIO_MANAGER.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                        AudioManager.VIBRATE_SETTING_ON);
                VIBRATOR.vibrate(VIBRATE_DURATION);
                updateSettings(context, 1, AudioManager.VIBRATE_SETTING_ON,
                        AudioManager.RINGER_MODE_NORMAL, true);
        }
    }

@@ -280,4 +218,43 @@ public class SoundButton extends PowerButton {
                Settings.System.EXPANDED_RING_MODE,
                CM_MODE_SOUNDVIB_SOUND_VIB_SILENT);
    }

    private static void updateSettings(Context context, int vibrateInSilence,
            int amVibrateSetting, int amRingerMode, boolean doHapticFeedback)
    {
        Settings.System.putInt(context.getContentResolver(),
                Settings.System.VIBRATE_IN_SILENT, vibrateInSilence);
        AUDIO_MANAGER.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,
                amVibrateSetting);
        AUDIO_MANAGER.setRingerMode(amRingerMode);

        // Give haptic feedback if requested and enabled in settings
        if(doHapticFeedback && hapticFeedbackEnabled(context)) {
            VIBRATOR.vibrate(VIBRATE_DURATION);
        }
    }

    // Helper function to determine if haptic feedback is enabled.
    private static boolean hapticFeedbackEnabled(Context context)
    {
        int hfPwrWidg;
        int hfGlobl;
        boolean hf;

        // Retrieve haptic feedback option from notification power widget's options
        hfPwrWidg = Settings.System.getInt(context.getContentResolver(),
                Settings.System.EXPANDED_HAPTIC_FEEDBACK, 2);

        if(hfPwrWidg == 2) {    // Obey global setting
            // Retrieve haptic feedback option from global settings
            hfGlobl = Settings.System.getInt(context.getContentResolver(),
                    Settings.System.HAPTIC_FEEDBACK_ENABLED, 1);

            hf = (hfGlobl == 1);
        } else {    // HF forced on/off in widget's settings
            hf = (hfPwrWidg == 1);
        }

        return hf;
    }
}