Merge "Make sure vibration previews in Settings apply latest intensities" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
285cfcda41
@@ -73,11 +73,11 @@ public abstract class VibrationIntensityPreferenceController extends SliderPrefe
|
|||||||
mSettingsContentObserver.onDisplayPreference(this, preference);
|
mSettingsContentObserver.onDisplayPreference(this, preference);
|
||||||
preference.setEnabled(mPreferenceConfig.isPreferenceEnabled());
|
preference.setEnabled(mPreferenceConfig.isPreferenceEnabled());
|
||||||
preference.setSummaryProvider(unused -> mPreferenceConfig.getSummary());
|
preference.setSummaryProvider(unused -> mPreferenceConfig.getSummary());
|
||||||
// TODO: remove setContinuousUpdates and replace with a different way to play the haptic
|
|
||||||
// preview without relying on the setting being propagated to the service.
|
|
||||||
preference.setContinuousUpdates(true);
|
|
||||||
preference.setMin(getMin());
|
preference.setMin(getMin());
|
||||||
preference.setMax(getMax());
|
preference.setMax(getMax());
|
||||||
|
// Haptics previews played by the Settings app don't bypass user settings to be played.
|
||||||
|
// The sliders continuously updates the intensity value so the previews can apply them.
|
||||||
|
preference.setContinuousUpdates(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -23,6 +23,8 @@ import android.content.Context;
|
|||||||
import android.database.ContentObserver;
|
import android.database.ContentObserver;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.VibrationAttributes;
|
||||||
|
import android.os.Vibrator;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
@@ -42,9 +44,11 @@ public class VibrationMainSwitchPreferenceController extends SettingsMainSwitchP
|
|||||||
implements LifecycleObserver, OnStart, OnStop {
|
implements LifecycleObserver, OnStart, OnStop {
|
||||||
|
|
||||||
private final ContentObserver mSettingObserver;
|
private final ContentObserver mSettingObserver;
|
||||||
|
private final Vibrator mVibrator;
|
||||||
|
|
||||||
public VibrationMainSwitchPreferenceController(Context context, String preferenceKey) {
|
public VibrationMainSwitchPreferenceController(Context context, String preferenceKey) {
|
||||||
super(context, preferenceKey);
|
super(context, preferenceKey);
|
||||||
|
mVibrator = context.getSystemService(Vibrator.class);
|
||||||
mSettingObserver = new ContentObserver(new Handler(/* async= */ true)) {
|
mSettingObserver = new ContentObserver(new Handler(/* async= */ true)) {
|
||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange, Uri uri) {
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
@@ -79,9 +83,17 @@ public class VibrationMainSwitchPreferenceController extends SettingsMainSwitchP
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean setChecked(boolean isChecked) {
|
public boolean setChecked(boolean isChecked) {
|
||||||
return Settings.System.putInt(mContext.getContentResolver(),
|
boolean success = Settings.System.putInt(mContext.getContentResolver(),
|
||||||
VibrationPreferenceConfig.MAIN_SWITCH_SETTING_KEY,
|
VibrationPreferenceConfig.MAIN_SWITCH_SETTING_KEY,
|
||||||
isChecked ? ON : OFF);
|
isChecked ? ON : OFF);
|
||||||
|
|
||||||
|
if (success && isChecked) {
|
||||||
|
// Play a haptic as preview for the main toggle only when touch feedback is enabled.
|
||||||
|
VibrationPreferenceConfig.playVibrationPreview(
|
||||||
|
mVibrator, VibrationAttributes.USAGE_TOUCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -49,6 +49,8 @@ public abstract class VibrationPreferenceConfig {
|
|||||||
* all device vibrations.
|
* all device vibrations.
|
||||||
*/
|
*/
|
||||||
public static final String MAIN_SWITCH_SETTING_KEY = Settings.System.VIBRATE_ON;
|
public static final String MAIN_SWITCH_SETTING_KEY = Settings.System.VIBRATE_ON;
|
||||||
|
private static final VibrationEffect PREVIEW_VIBRATION_EFFECT =
|
||||||
|
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK);
|
||||||
|
|
||||||
protected final ContentResolver mContentResolver;
|
protected final ContentResolver mContentResolver;
|
||||||
private final AudioManager mAudioManager;
|
private final AudioManager mAudioManager;
|
||||||
@@ -56,14 +58,22 @@ public abstract class VibrationPreferenceConfig {
|
|||||||
private final String mSettingKey;
|
private final String mSettingKey;
|
||||||
private final String mRingerModeSilentSummary;
|
private final String mRingerModeSilentSummary;
|
||||||
private final int mDefaultIntensity;
|
private final int mDefaultIntensity;
|
||||||
private final VibrationAttributes mVibrationAttributes;
|
private final VibrationAttributes mPreviewVibrationAttributes;
|
||||||
|
|
||||||
/** Returns true if the user setting for enabling device vibrations is enabled. */
|
/** Returns true if the user setting for enabling device vibrations is enabled. */
|
||||||
public static boolean isMainVibrationSwitchEnabled(ContentResolver contentResolver) {
|
public static boolean isMainVibrationSwitchEnabled(ContentResolver contentResolver) {
|
||||||
return Settings.System.getInt(contentResolver, MAIN_SWITCH_SETTING_KEY, ON) == ON;
|
return Settings.System.getInt(contentResolver, MAIN_SWITCH_SETTING_KEY, ON) == ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VibrationPreferenceConfig(Context context, String settingKey, int vibrationUsage) {
|
/** Play a vibration effect with intensity just selected by the user. */
|
||||||
|
public static void playVibrationPreview(Vibrator vibrator,
|
||||||
|
@VibrationAttributes.Usage int vibrationUsage) {
|
||||||
|
vibrator.vibrate(PREVIEW_VIBRATION_EFFECT,
|
||||||
|
createPreviewVibrationAttributes(vibrationUsage));
|
||||||
|
}
|
||||||
|
|
||||||
|
public VibrationPreferenceConfig(Context context, String settingKey,
|
||||||
|
@VibrationAttributes.Usage int vibrationUsage) {
|
||||||
mContentResolver = context.getContentResolver();
|
mContentResolver = context.getContentResolver();
|
||||||
mVibrator = context.getSystemService(Vibrator.class);
|
mVibrator = context.getSystemService(Vibrator.class);
|
||||||
mAudioManager = context.getSystemService(AudioManager.class);
|
mAudioManager = context.getSystemService(AudioManager.class);
|
||||||
@@ -71,9 +81,7 @@ public abstract class VibrationPreferenceConfig {
|
|||||||
R.string.accessibility_vibration_setting_disabled_for_silent_mode_summary);
|
R.string.accessibility_vibration_setting_disabled_for_silent_mode_summary);
|
||||||
mSettingKey = settingKey;
|
mSettingKey = settingKey;
|
||||||
mDefaultIntensity = mVibrator.getDefaultVibrationIntensity(vibrationUsage);
|
mDefaultIntensity = mVibrator.getDefaultVibrationIntensity(vibrationUsage);
|
||||||
mVibrationAttributes = new VibrationAttributes.Builder()
|
mPreviewVibrationAttributes = createPreviewVibrationAttributes(vibrationUsage);
|
||||||
.setUsage(vibrationUsage)
|
|
||||||
.build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the setting key for this setting preference. */
|
/** Returns the setting key for this setting preference. */
|
||||||
@@ -118,8 +126,7 @@ public abstract class VibrationPreferenceConfig {
|
|||||||
|
|
||||||
/** Play a vibration effect with intensity just selected by the user. */
|
/** Play a vibration effect with intensity just selected by the user. */
|
||||||
public void playVibrationPreview() {
|
public void playVibrationPreview() {
|
||||||
mVibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK),
|
mVibrator.vibrate(PREVIEW_VIBRATION_EFFECT, mPreviewVibrationAttributes);
|
||||||
mVibrationAttributes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isRingerModeSilent() {
|
private boolean isRingerModeSilent() {
|
||||||
@@ -128,6 +135,16 @@ public abstract class VibrationPreferenceConfig {
|
|||||||
return mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT;
|
return mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static VibrationAttributes createPreviewVibrationAttributes(
|
||||||
|
@VibrationAttributes.Usage int vibrationUsage) {
|
||||||
|
return new VibrationAttributes.Builder()
|
||||||
|
.setUsage(vibrationUsage)
|
||||||
|
// Enforce fresh settings to be applied for the preview vibration, as they
|
||||||
|
// are played immediately after the new user values are set.
|
||||||
|
.setFlags(VibrationAttributes.FLAG_INVALIDATE_SETTINGS_CACHE)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
/** {@link ContentObserver} for a setting described by a {@link VibrationPreferenceConfig}. */
|
/** {@link ContentObserver} for a setting described by a {@link VibrationPreferenceConfig}. */
|
||||||
public static final class SettingObserver extends ContentObserver {
|
public static final class SettingObserver extends ContentObserver {
|
||||||
private static final Uri MAIN_SWITCH_SETTING_URI =
|
private static final Uri MAIN_SWITCH_SETTING_URI =
|
||||||
|
@@ -124,6 +124,12 @@ public class VibrationRampingRingerTogglePreferenceController
|
|||||||
if (isRingVibrationEnabled()) {
|
if (isRingVibrationEnabled()) {
|
||||||
// Don't update ramping ringer setting value if ring vibration is disabled.
|
// Don't update ramping ringer setting value if ring vibration is disabled.
|
||||||
mAudioManager.setRampingRingerEnabled(isChecked);
|
mAudioManager.setRampingRingerEnabled(isChecked);
|
||||||
|
|
||||||
|
if (isChecked) {
|
||||||
|
// Vibrate when toggle is enabled for consistency with all the other toggle/slides
|
||||||
|
// in the same screen.
|
||||||
|
mRingVibrationPreferenceConfig.playVibrationPreview();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user