Settings: Preview ringtone vibration pattern
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
This commit is contained in:
@@ -18,6 +18,10 @@ package com.android.settings.notification;
|
|||||||
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.media.AudioAttributes;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.VibrationEffect;
|
||||||
|
import android.os.Vibrator;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import androidx.preference.ListPreference;
|
import androidx.preference.ListPreference;
|
||||||
@@ -48,6 +52,99 @@ public class VibrationPatternPreferenceController extends AbstractPreferenceCont
|
|||||||
private CustomSeekBarPreference mCustomVib2;
|
private CustomSeekBarPreference mCustomVib2;
|
||||||
private CustomSeekBarPreference mCustomVib3;
|
private CustomSeekBarPreference mCustomVib3;
|
||||||
|
|
||||||
|
private static class VibrationEffectProxy {
|
||||||
|
public VibrationEffect createWaveform(long[] timings, int[] amplitudes, int repeat) {
|
||||||
|
return VibrationEffect.createWaveform(timings, amplitudes, repeat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder()
|
||||||
|
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
|
||||||
|
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
private static final long[] SIMPLE_VIBRATION_PATTERN = {
|
||||||
|
0, // No delay before starting
|
||||||
|
800, // How long to vibrate
|
||||||
|
800, // How long to wait before vibrating again
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final long[] DZZZ_DA_VIBRATION_PATTERN = {
|
||||||
|
0, // No delay before starting
|
||||||
|
500, // How long to vibrate
|
||||||
|
200, // Delay
|
||||||
|
20, // How long to vibrate
|
||||||
|
720, // How long to wait before vibrating again
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final long[] MM_MM_MM_VIBRATION_PATTERN = {
|
||||||
|
0, // No delay before starting
|
||||||
|
300, // How long to vibrate
|
||||||
|
400, // Delay
|
||||||
|
300, // How long to vibrate
|
||||||
|
400, // Delay
|
||||||
|
300, // How long to vibrate
|
||||||
|
1400, // How long to wait before vibrating again
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final long[] DA_DA_DZZZ_VIBRATION_PATTERN = {
|
||||||
|
0, // No delay before starting
|
||||||
|
30, // How long to vibrate
|
||||||
|
80, // Delay
|
||||||
|
30, // How long to vibrate
|
||||||
|
80, // Delay
|
||||||
|
50, // How long to vibrate
|
||||||
|
180, // Delay
|
||||||
|
600, // How long to vibrate
|
||||||
|
1050, // How long to wait before vibrating again
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final long[] DA_DZZZ_DA_VIBRATION_PATTERN = {
|
||||||
|
0, // No delay before starting
|
||||||
|
80, // How long to vibrate
|
||||||
|
200, // Delay
|
||||||
|
600, // How long to vibrate
|
||||||
|
150, // Delay
|
||||||
|
20, // How long to vibrate
|
||||||
|
1050, // How long to wait before vibrating again
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final int[] NINE_ELEMENTS_VIBRATION_AMPLITUDE = {
|
||||||
|
0, // No delay before starting
|
||||||
|
255, // Vibrate full amplitude
|
||||||
|
0, // No amplitude while waiting
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final int[] SEVEN_ELEMENTS_VIBRATION_AMPLITUDE = {
|
||||||
|
0, // No delay before starting
|
||||||
|
255, // Vibrate full amplitude
|
||||||
|
0, // No amplitude while waiting
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final int[] FIVE_ELEMENTS_VIBRATION_AMPLITUDE = {
|
||||||
|
0, // No delay before starting
|
||||||
|
255, // Vibrate full amplitude
|
||||||
|
0, // No amplitude while waiting
|
||||||
|
255,
|
||||||
|
0,
|
||||||
|
};
|
||||||
|
|
||||||
|
private static final int[] SIMPLE_VIBRATION_AMPLITUDE = {
|
||||||
|
0, // No delay before starting
|
||||||
|
255, // Vibrate full amplitude
|
||||||
|
0, // No amplitude while waiting
|
||||||
|
};
|
||||||
|
|
||||||
public VibrationPatternPreferenceController(Context context) {
|
public VibrationPatternPreferenceController(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
}
|
}
|
||||||
@@ -86,7 +183,9 @@ public class VibrationPatternPreferenceController extends AbstractPreferenceCont
|
|||||||
Settings.System.putInt(mContext.getContentResolver(),
|
Settings.System.putInt(mContext.getContentResolver(),
|
||||||
Settings.System.RINGTONE_VIBRATION_PATTERN, vibPattern);
|
Settings.System.RINGTONE_VIBRATION_PATTERN, vibPattern);
|
||||||
mVibPattern.setSummary(mVibPattern.getEntries()[vibPattern]);
|
mVibPattern.setSummary(mVibPattern.getEntries()[vibPattern]);
|
||||||
updateCustomVibVisibility(vibPattern == 5);
|
boolean isCustom = vibPattern == 5;
|
||||||
|
updateCustomVibVisibility(isCustom);
|
||||||
|
if (!isCustom) previewPattern();
|
||||||
return true;
|
return true;
|
||||||
} else if (preference == mCustomVib1) {
|
} else if (preference == mCustomVib1) {
|
||||||
updateCustomVib(0, (Integer) newValue);
|
updateCustomVib(0, (Integer) newValue);
|
||||||
@@ -136,5 +235,53 @@ public class VibrationPatternPreferenceController extends AbstractPreferenceCont
|
|||||||
Settings.System.putString(mContext.getContentResolver(),
|
Settings.System.putString(mContext.getContentResolver(),
|
||||||
Settings.System.CUSTOM_RINGTONE_VIBRATION_PATTERN, String.join(
|
Settings.System.CUSTOM_RINGTONE_VIBRATION_PATTERN, String.join(
|
||||||
",", customPattern[0], customPattern[1], customPattern[2]));
|
",", customPattern[0], customPattern[1], customPattern[2]));
|
||||||
|
previewPattern();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void previewPattern() {
|
||||||
|
Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
|
||||||
|
VibrationEffect effect;
|
||||||
|
VibrationEffectProxy vibrationEffectProxy = new VibrationEffectProxy();
|
||||||
|
int vibPattern = Settings.System.getInt(mContext.getContentResolver(),
|
||||||
|
Settings.System.RINGTONE_VIBRATION_PATTERN, 0);
|
||||||
|
switch (vibPattern) {
|
||||||
|
case 1:
|
||||||
|
effect = vibrationEffectProxy.createWaveform(DZZZ_DA_VIBRATION_PATTERN,
|
||||||
|
FIVE_ELEMENTS_VIBRATION_AMPLITUDE, -1);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
effect = vibrationEffectProxy.createWaveform(MM_MM_MM_VIBRATION_PATTERN,
|
||||||
|
SEVEN_ELEMENTS_VIBRATION_AMPLITUDE, -1);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
effect = vibrationEffectProxy.createWaveform(DA_DA_DZZZ_VIBRATION_PATTERN,
|
||||||
|
NINE_ELEMENTS_VIBRATION_AMPLITUDE, -1);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
effect = vibrationEffectProxy.createWaveform(DA_DZZZ_DA_VIBRATION_PATTERN,
|
||||||
|
SEVEN_ELEMENTS_VIBRATION_AMPLITUDE, -1);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
String[] customVib = Settings.System.getString(
|
||||||
|
mContext.getContentResolver(),
|
||||||
|
Settings.System.CUSTOM_RINGTONE_VIBRATION_PATTERN).split(",", 3);
|
||||||
|
long[] customVibPattern = {
|
||||||
|
0, // No delay before starting
|
||||||
|
Long.parseLong(customVib[0]), // How long to vibrate
|
||||||
|
400, // Delay
|
||||||
|
Long.parseLong(customVib[1]), // How long to vibrate
|
||||||
|
400, // Delay
|
||||||
|
Long.parseLong(customVib[2]), // How long to vibrate
|
||||||
|
400, // How long to wait before vibrating again
|
||||||
|
};
|
||||||
|
effect = vibrationEffectProxy.createWaveform(customVibPattern,
|
||||||
|
SEVEN_ELEMENTS_VIBRATION_AMPLITUDE, -1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
effect = vibrationEffectProxy.createWaveform(SIMPLE_VIBRATION_PATTERN,
|
||||||
|
SIMPLE_VIBRATION_AMPLITUDE, -1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vibrator.vibrate(effect, VIBRATION_ATTRIBUTES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user