Merge "Split ring and notification vibration settings"

This commit is contained in:
Alexey Kuzmin
2019-01-11 13:51:16 +00:00
committed by Android (Google) Code Review
13 changed files with 207 additions and 28 deletions

View File

@@ -4691,7 +4691,9 @@
<!-- Title for accessibility preference screen for configuring vibrations. --> <!-- Title for accessibility preference screen for configuring vibrations. -->
<string name="accessibility_vibration_settings_title">Vibration</string> <string name="accessibility_vibration_settings_title">Vibration</string>
<!-- Title for accessibility preference for configuring notification vibrations. --> <!-- Title for accessibility preference for configuring notification vibrations. -->
<string name="accessibility_notification_vibration_title">Ring &amp; notification vibration</string> <string name="accessibility_notification_vibration_title">Notification vibration</string>
<!-- Title for accessibility preference for configuring ring vibrations. [CHAR LIMIT=NONE] -->
<string name="accessibility_ring_vibration_title">Ring vibration</string>
<!-- Title for accessibility preference for configuring touch feedback vibrations. --> <!-- Title for accessibility preference for configuring touch feedback vibrations. -->
<string name="accessibility_touch_vibration_title">Touch vibration</string> <string name="accessibility_touch_vibration_title">Touch vibration</string>
<!-- Used in the acessibilty service settings to control turning on/off the service entirely --> <!-- Used in the acessibilty service settings to control turning on/off the service entirely -->
@@ -4761,8 +4763,8 @@
<item quantity="other">Very long delay (<xliff:g id="click_delay_label" example="200">%1$d</xliff:g> ms)</item> <item quantity="other">Very long delay (<xliff:g id="click_delay_label" example="200">%1$d</xliff:g> ms)</item>
</plurals> </plurals>
<!-- Summary for vibration settings preference when notification vibration and haptic feedback intensity are set. [CHAR LIMIT=32] --> <!-- Summary for vibration settings preference when notification vibration and haptic feedback intensity are set. [CHAR LIMIT=50] -->
<string name="accessibility_vibration_summary">Ring <xliff:g id="summary_ring" example="Medium">%1$s</xliff:g>, touch <xliff:g id="summary_touch" example="High">%2$s</xliff:g></string> <string name="accessibility_vibration_summary">Ring <xliff:g id="summary_ring" example="Medium">%1$s</xliff:g>, notification <xliff:g id="summary_notification" example="Low">%2$s</xliff:g>, touch <xliff:g id="summary_touch" example="High">%3$s</xliff:g></string>
<!-- Summary for vibration settings preference when ring & notification are set to off--> <!-- Summary for vibration settings preference when ring & notification are set to off-->
<string name="accessibility_vibration_summary_off">Ring &amp; notification set to off</string> <string name="accessibility_vibration_summary_off">Ring &amp; notification set to off</string>
@@ -7056,8 +7058,10 @@
<!-- List of synonyms for touch vibration setting (where you get a haptic response for touching things on the screen), used to match in settings search [CHAR LIMIT=NONE] --> <!-- List of synonyms for touch vibration setting (where you get a haptic response for touching things on the screen), used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_touch_vibration">haptics, vibrate, screen, sensitivity</string> <string name="keywords_touch_vibration">haptics, vibrate, screen, sensitivity</string>
<!-- List of synonyms for ring and notification vibration setting (changes whether your phone vibrates when it rings), used to match in settings search [CHAR LIMIT=NONE] --> <!-- List of synonyms for ring vibration setting (changes whether your phone vibrates when it rings), used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_ring_vibration">haptics, vibrate, phone, call, sensitivity</string> <string name="keywords_ring_vibration">haptics, vibrate, phone, call, sensitivity, ring</string>
<!-- List of synonyms for notification vibration setting (changes whether your phone vibrates when it shows a notification), used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_notification_vibration">haptics, vibrate, sensitivity</string>
<!-- NFC Wi-Fi pairing/setup strings--> <!-- NFC Wi-Fi pairing/setup strings-->

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/accessibility_ring_vibration_title" />

View File

@@ -21,11 +21,18 @@
android:key="accessibility_settings_vibration_screen" android:key="accessibility_settings_vibration_screen"
android:title="@string/accessibility_vibration_settings_title"> android:title="@string/accessibility_vibration_settings_title">
<Preference
android:fragment="com.android.settings.accessibility.RingVibrationPreferenceFragment"
android:key="ring_vibration_preference_screen"
android:title="@string/accessibility_ring_vibration_title"
settings:keywords="@string/keywords_ring_vibration"
app:controller="com.android.settings.accessibility.RingVibrationIntensityPreferenceController" />
<Preference <Preference
android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment" android:fragment="com.android.settings.accessibility.NotificationVibrationPreferenceFragment"
android:key="notification_vibration_preference_screen" android:key="notification_vibration_preference_screen"
android:title="@string/accessibility_notification_vibration_title" android:title="@string/accessibility_notification_vibration_title"
settings:keywords="@string/keywords_ring_vibration" settings:keywords="@string/keywords_notification_vibration"
app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" /> app:controller="com.android.settings.accessibility.NotificationVibrationIntensityPreferenceController" />
<Preference <Preference

View File

@@ -810,15 +810,30 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
final Context context = getContext(); final Context context = getContext();
final Vibrator vibrator = context.getSystemService(Vibrator.class); final Vibrator vibrator = context.getSystemService(Vibrator.class);
final int ringIntensity = Settings.System.getInt(context.getContentResolver(), int ringIntensity = Settings.System.getInt(context.getContentResolver(),
Settings.System.NOTIFICATION_VIBRATION_INTENSITY, Settings.System.RING_VIBRATION_INTENSITY,
vibrator.getDefaultNotificationVibrationIntensity()); vibrator.getDefaultRingVibrationIntensity());
if (Settings.System.getInt(context.getContentResolver(),
Settings.System.VIBRATE_WHEN_RINGING, 0) == 0) {
ringIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
}
CharSequence ringIntensityString = CharSequence ringIntensityString =
VibrationIntensityPreferenceController.getIntensityString(context, ringIntensity); VibrationIntensityPreferenceController.getIntensityString(context, ringIntensity);
final int touchIntensity = Settings.System.getInt(context.getContentResolver(), int notificationIntensity = Settings.System.getInt(context.getContentResolver(),
Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
vibrator.getDefaultNotificationVibrationIntensity());
CharSequence notificationIntensityString =
VibrationIntensityPreferenceController.getIntensityString(context,
notificationIntensity);
int touchIntensity = Settings.System.getInt(context.getContentResolver(),
Settings.System.HAPTIC_FEEDBACK_INTENSITY, Settings.System.HAPTIC_FEEDBACK_INTENSITY,
vibrator.getDefaultHapticFeedbackIntensity()); vibrator.getDefaultHapticFeedbackIntensity());
if (Settings.System.getInt(context.getContentResolver(),
Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0) {
touchIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
}
CharSequence touchIntensityString = CharSequence touchIntensityString =
VibrationIntensityPreferenceController.getIntensityString(context, touchIntensity); VibrationIntensityPreferenceController.getIntensityString(context, touchIntensity);
@@ -826,12 +841,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mVibrationPreferenceScreen = findPreference(VIBRATION_PREFERENCE_SCREEN); mVibrationPreferenceScreen = findPreference(VIBRATION_PREFERENCE_SCREEN);
} }
if (ringIntensity == touchIntensity) { if (ringIntensity == touchIntensity && ringIntensity == notificationIntensity) {
mVibrationPreferenceScreen.setSummary(ringIntensityString); mVibrationPreferenceScreen.setSummary(ringIntensityString);
} else { } else {
mVibrationPreferenceScreen.setSummary( mVibrationPreferenceScreen.setSummary(
getString(R.string.accessibility_vibration_summary, getString(R.string.accessibility_vibration_summary,
ringIntensityString, touchIntensityString)); ringIntensityString,
notificationIntensityString,
touchIntensityString));
} }
} }

View File

@@ -28,7 +28,8 @@ public class HapticFeedbackIntensityPreferenceController
static final String PREF_KEY = "touch_vibration_preference_screen"; static final String PREF_KEY = "touch_vibration_preference_screen";
public HapticFeedbackIntensityPreferenceController(Context context) { public HapticFeedbackIntensityPreferenceController(Context context) {
super(context, PREF_KEY, Settings.System.HAPTIC_FEEDBACK_INTENSITY); super(context, PREF_KEY, Settings.System.HAPTIC_FEEDBACK_INTENSITY,
Settings.System.HAPTIC_FEEDBACK_ENABLED);
} }
@Override @Override

View File

@@ -28,7 +28,7 @@ public class NotificationVibrationIntensityPreferenceController
static final String PREF_KEY = "notification_vibration_preference_screen"; static final String PREF_KEY = "notification_vibration_preference_screen";
public NotificationVibrationIntensityPreferenceController(Context context) { public NotificationVibrationIntensityPreferenceController(Context context) {
super(context, PREF_KEY, Settings.System.NOTIFICATION_VIBRATION_INTENSITY); super(context, PREF_KEY, Settings.System.NOTIFICATION_VIBRATION_INTENSITY, "");
} }
@Override @Override

View File

@@ -44,6 +44,11 @@ public class NotificationVibrationPreferenceFragment extends VibrationPreference
return Settings.System.NOTIFICATION_VIBRATION_INTENSITY; return Settings.System.NOTIFICATION_VIBRATION_INTENSITY;
} }
@Override
protected String getVibrationEnabledSetting() {
return "";
}
@Override @Override
protected int getPreviewVibrationAudioAttributesUsage() { protected int getPreviewVibrationAudioAttributesUsage() {
return AudioAttributes.USAGE_NOTIFICATION; return AudioAttributes.USAGE_NOTIFICATION;

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibility;
import android.content.Context;
import android.provider.Settings;
import androidx.annotation.VisibleForTesting;
public class RingVibrationIntensityPreferenceController
extends VibrationIntensityPreferenceController {
@VisibleForTesting
static final String PREF_KEY = "ring_vibration_preference_screen";
public RingVibrationIntensityPreferenceController(Context context) {
super(context, PREF_KEY, Settings.System.RING_VIBRATION_INTENSITY,
Settings.System.VIBRATE_WHEN_RINGING);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
protected int getDefaultIntensity() {
return mVibrator.getDefaultRingVibrationIntensity();
}
}

View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.accessibility;
import android.media.AudioAttributes;
import android.os.Vibrator;
import android.provider.Settings;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
/**
* Fragment for picking accessibility shortcut service
*/
public class RingVibrationPreferenceFragment extends VibrationPreferenceFragment {
@Override
public int getMetricsCategory() {
return MetricsEvent.ACCESSIBILITY_VIBRATION_RING;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.accessibility_ring_vibration_settings;
}
/**
* Get the setting string of the vibration intensity setting this preference is dealing with.
*/
@Override
protected String getVibrationIntensitySetting() {
return Settings.System.RING_VIBRATION_INTENSITY;
}
@Override
protected String getVibrationEnabledSetting() {
return Settings.System.VIBRATE_WHEN_RINGING;
}
@Override
protected int getPreviewVibrationAudioAttributesUsage() {
return AudioAttributes.USAGE_NOTIFICATION;
}
@Override
protected int getDefaultVibrationIntensity() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class);
return vibrator.getDefaultRingVibrationIntensity();
}
}

View File

@@ -44,6 +44,11 @@ public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragmen
return Settings.System.HAPTIC_FEEDBACK_INTENSITY; return Settings.System.HAPTIC_FEEDBACK_INTENSITY;
} }
@Override
protected String getVibrationEnabledSetting() {
return Settings.System.HAPTIC_FEEDBACK_ENABLED;
}
@Override @Override
protected int getDefaultVibrationIntensity() { protected int getDefaultVibrationIntensity() {
Vibrator vibrator = getContext().getSystemService(Vibrator.class); Vibrator vibrator = getContext().getSystemService(Vibrator.class);
@@ -54,13 +59,4 @@ public class TouchVibrationPreferenceFragment extends VibrationPreferenceFragmen
protected int getPreviewVibrationAudioAttributesUsage() { protected int getPreviewVibrationAudioAttributesUsage() {
return AudioAttributes.USAGE_ASSISTANCE_SONIFICATION; return AudioAttributes.USAGE_ASSISTANCE_SONIFICATION;
} }
@Override
public void onVibrationIntensitySelected(int intensity) {
// We want to keep HAPTIC_FEEDBACK_ENABLED consistent with this setting since some
// applications check it directly before triggering their own haptic feedback.
final boolean hapticFeedbackEnabled = !(intensity == Vibrator.VIBRATION_INTENSITY_OFF);
Settings.System.putInt(getContext().getContentResolver(),
Settings.System.HAPTIC_FEEDBACK_ENABLED, hapticFeedbackEnabled ? 1 : 0);
}
} }

View File

@@ -39,14 +39,16 @@ public abstract class VibrationIntensityPreferenceController extends BasePrefere
protected final Vibrator mVibrator; protected final Vibrator mVibrator;
private final SettingObserver mSettingsContentObserver; private final SettingObserver mSettingsContentObserver;
private final String mSettingKey; private final String mSettingKey;
private final String mEnabledKey;
private Preference mPreference; private Preference mPreference;
public VibrationIntensityPreferenceController(Context context, String prefkey, public VibrationIntensityPreferenceController(Context context, String prefkey,
String settingKey) { String settingKey, String enabledKey) {
super(context, prefkey); super(context, prefkey);
mVibrator = mContext.getSystemService(Vibrator.class); mVibrator = mContext.getSystemService(Vibrator.class);
mSettingKey = settingKey; mSettingKey = settingKey;
mEnabledKey = enabledKey;
mSettingsContentObserver = new SettingObserver(settingKey) { mSettingsContentObserver = new SettingObserver(settingKey) {
@Override @Override
public void onChange(boolean selfChange, Uri uri) { public void onChange(boolean selfChange, Uri uri) {
@@ -78,7 +80,9 @@ public abstract class VibrationIntensityPreferenceController extends BasePrefere
public CharSequence getSummary() { public CharSequence getSummary() {
final int intensity = Settings.System.getInt(mContext.getContentResolver(), final int intensity = Settings.System.getInt(mContext.getContentResolver(),
mSettingKey, getDefaultIntensity()); mSettingKey, getDefaultIntensity());
return getIntensityString(mContext, intensity); final boolean enabled = Settings.System.getInt(mContext.getContentResolver(),
mEnabledKey, 1) == 1;
return getIntensityString(mContext, enabled ? intensity : Vibrator.VIBRATION_INTENSITY_OFF);
} }
public static CharSequence getIntensityString(Context context, int intensity) { public static CharSequence getIntensityString(Context context, int intensity) {

View File

@@ -26,6 +26,7 @@ import android.os.Handler;
import android.os.VibrationEffect; import android.os.VibrationEffect;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
@@ -116,6 +117,11 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm
*/ */
protected abstract String getVibrationIntensitySetting(); protected abstract String getVibrationIntensitySetting();
/**
* Get the setting string of the vibration enabledness setting this preference is dealing with.
*/
protected abstract String getVibrationEnabledSetting();
/** /**
* Get the default intensity for the desired setting. * Get the default intensity for the desired setting.
*/ */
@@ -154,8 +160,13 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm
@Override @Override
protected String getDefaultKey() { protected String getDefaultKey() {
final int vibrationIntensity = Settings.System.getInt(getContext().getContentResolver(), int vibrationIntensity = Settings.System.getInt(getContext().getContentResolver(),
getVibrationIntensitySetting(), getDefaultVibrationIntensity()); getVibrationIntensitySetting(), getDefaultVibrationIntensity());
final boolean vibrationEnabled = Settings.System.getInt(getContext().getContentResolver(),
getVibrationEnabledSetting(), 1) == 1;
if (!vibrationEnabled) {
vibrationIntensity = Vibrator.VIBRATION_INTENSITY_OFF;
}
for (VibrationIntensityCandidateInfo candidate : mCandidates.values()) { for (VibrationIntensityCandidateInfo candidate : mCandidates.values()) {
final boolean matchesIntensity = candidate.getIntensity() == vibrationIntensity; final boolean matchesIntensity = candidate.getIntensity() == vibrationIntensity;
final boolean matchesOn = candidate.getKey().equals(KEY_INTENSITY_ON) final boolean matchesOn = candidate.getKey().equals(KEY_INTENSITY_ON)
@@ -174,8 +185,11 @@ public abstract class VibrationPreferenceFragment extends RadioButtonPickerFragm
Log.e(TAG, "Tried to set unknown intensity (key=" + key + ")!"); Log.e(TAG, "Tried to set unknown intensity (key=" + key + ")!");
return false; return false;
} }
Settings.System.putInt(getContext().getContentResolver(), if (candidate.getIntensity() != Vibrator.VIBRATION_INTENSITY_OFF ||
getVibrationIntensitySetting(), candidate.getIntensity()); TextUtils.isEmpty(getVibrationEnabledSetting())) {
Settings.System.putInt(getContext().getContentResolver(),
getVibrationIntensitySetting(), candidate.getIntensity());
}
onVibrationIntensitySelected(candidate.getIntensity()); onVibrationIntensitySelected(candidate.getIntensity());
return true; return true;
} }

View File

@@ -160,6 +160,11 @@ public class VibrationPreferenceFragmentTest {
return Settings.System.HAPTIC_FEEDBACK_INTENSITY; return Settings.System.HAPTIC_FEEDBACK_INTENSITY;
} }
@Override
protected String getVibrationEnabledSetting() {
return "";
}
@Override @Override
protected int getDefaultVibrationIntensity() { protected int getDefaultVibrationIntensity() {
return Vibrator.VIBRATION_INTENSITY_MEDIUM; return Vibrator.VIBRATION_INTENSITY_MEDIUM;