Loading packages/SettingsProvider/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -39,6 +39,7 @@ android_library { "configinfra_framework_flags_java_lib", "configinfra_framework_flags_java_lib", "device_config_service_flags_java", "device_config_service_flags_java", "libaconfig_java_proto_lite", "libaconfig_java_proto_lite", "notification_flags_lib", "SettingsLibDeviceStateRotationLock", "SettingsLibDeviceStateRotationLock", "SettingsLibDisplayUtils", "SettingsLibDisplayUtils", ], ], Loading packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +30 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.hardware.display.ColorDisplayManager; import android.icu.util.ULocale; import android.icu.util.ULocale; import android.media.AudioManager; import android.media.AudioManager; import android.media.RingtoneManager; import android.media.RingtoneManager; import android.media.Utils; import android.net.Uri; import android.net.Uri; import android.os.LocaleList; import android.os.LocaleList; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -309,6 +310,13 @@ public class SettingsHelper { return SILENT_RINGTONE; return SILENT_RINGTONE; } } } else { } else { // If the ringtone/notification support the vibration, use the original value. final int ringtoneType = getRingtoneType(name); if ((ringtoneType == RingtoneManager.TYPE_RINGTONE || ringtoneType == RingtoneManager.TYPE_NOTIFICATION) && hasVibrationSettings(value, ringtoneType)) { return value; } return getCanonicalRingtoneValue(value); return getCanonicalRingtoneValue(value); } } } } Loading Loading @@ -362,6 +370,15 @@ public class SettingsHelper { return; return; } } // If the ringtone/notification has vibration, we backup original value in onBackupValue. // So use the value directly for restoring. if ((ringtoneType == RingtoneManager.TYPE_RINGTONE || ringtoneType == RingtoneManager.TYPE_NOTIFICATION) && hasVibrationSettings(value, ringtoneType)) { RingtoneManager.setActualDefaultRingtoneUri(mContext, ringtoneType, Uri.parse(value)); return; } Uri ringtoneUri = null; Uri ringtoneUri = null; try { try { ringtoneUri = ringtoneUri = Loading Loading @@ -617,6 +634,19 @@ public class SettingsHelper { return allLocales.remove(toFullLocale(filteredLocale)); return allLocales.remove(toFullLocale(filteredLocale)); } } private boolean hasVibrationSettings(String value, int type) { if (Utils.hasVibration(Uri.parse(value)) && mContext.getResources().getBoolean( com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)) { if (type == RingtoneManager.TYPE_RINGTONE) { return android.media.audio.Flags.enableRingtoneHapticsCustomization(); } if (type == RingtoneManager.TYPE_NOTIFICATION) { return com.android.server.notification.Flags.notificationVibrationInSoundUri(); } } return false; } /** /** * Sets the locale specified. Input data is the byte representation of comma separated * Sets the locale specified. Input data is the byte representation of comma separated * multiple BCP-47 language tags. For backwards compatibility, strings of the form * multiple BCP-47 language tags. For backwards compatibility, strings of the form Loading packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java +72 −0 Original line number Original line Diff line number Diff line Loading @@ -37,9 +37,12 @@ import android.content.res.Resources; import android.database.Cursor; import android.database.Cursor; import android.database.MatrixCursor; import android.database.MatrixCursor; import android.media.AudioManager; import android.media.AudioManager; import android.media.Utils; import android.net.Uri; import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.os.LocaleList; import android.os.LocaleList; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.BaseColumns; import android.provider.BaseColumns; import android.provider.MediaStore; import android.provider.MediaStore; import android.provider.Settings; import android.provider.Settings; Loading @@ -54,8 +57,11 @@ import com.android.internal.R; import org.junit.After; import org.junit.After; import org.junit.Before; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import org.mockito.Mock; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations; Loading @@ -63,6 +69,7 @@ import org.mockito.MockitoAnnotations; * Tests for the SettingsHelperTest * Tests for the SettingsHelperTest */ */ @RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class SettingsHelperTest { public class SettingsHelperTest { private static final String SETTING_KEY = "setting_key"; private static final String SETTING_KEY = "setting_key"; private static final String SETTING_VALUE = "setting_value"; private static final String SETTING_VALUE = "setting_value"; Loading @@ -74,9 +81,13 @@ public class SettingsHelperTest { "content://media/internal/audio/media/20?title=DefaultNotification&canonical=1"; "content://media/internal/audio/media/20?title=DefaultNotification&canonical=1"; private static final String DEFAULT_ALARM_VALUE = private static final String DEFAULT_ALARM_VALUE = "content://media/internal/audio/media/30?title=DefaultAlarm&canonical=1"; "content://media/internal/audio/media/30?title=DefaultAlarm&canonical=1"; private static final String VIBRATION_FILE_NAME = "haptics.xml"; private SettingsHelper mSettingsHelper; private SettingsHelper mSettingsHelper; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Mock private Context mContext; @Mock private Context mContext; @Mock private Resources mResources; @Mock private Resources mResources; @Mock private AudioManager mAudioManager; @Mock private AudioManager mAudioManager; Loading Loading @@ -119,6 +130,22 @@ public class SettingsHelperTest { assertEquals(SETTING_REAL_VALUE, mSettingsHelper.onBackupValue(SETTING_KEY, SETTING_VALUE)); assertEquals(SETTING_REAL_VALUE, mSettingsHelper.onBackupValue(SETTING_KEY, SETTING_VALUE)); } } @Test @EnableFlags({android.media.audio.Flags.FLAG_ENABLE_RINGTONE_HAPTICS_CUSTOMIZATION, com.android.server.notification.Flags.FLAG_NOTIFICATION_VIBRATION_IN_SOUND_URI}) public void testOnBackupValue_ringtoneVibrationSupport_returnsSameValue() { when(mResources.getBoolean( com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)).thenReturn( true); String testRingtoneVibrationValue = createUriWithVibration(DEFAULT_RINGTONE_VALUE); String testNotificationVibrationValue = createUriWithVibration(DEFAULT_NOTIFICATION_VALUE); assertEquals(testRingtoneVibrationValue, mSettingsHelper.onBackupValue( Settings.System.RINGTONE, testRingtoneVibrationValue)); assertEquals(testNotificationVibrationValue, mSettingsHelper.onBackupValue( Settings.System.NOTIFICATION_SOUND, testNotificationVibrationValue)); } @Test @Test public void testGetRealValue_settingNotReplaced_returnsSameValue() { public void testGetRealValue_settingNotReplaced_returnsSameValue() { when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(false); when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(false); Loading Loading @@ -675,6 +702,30 @@ public class SettingsHelperTest { .isEqualTo(null); .isEqualTo(null); } } @Test @EnableFlags({android.media.audio.Flags.FLAG_ENABLE_RINGTONE_HAPTICS_CUSTOMIZATION, com.android.server.notification.Flags.FLAG_NOTIFICATION_VIBRATION_IN_SOUND_URI}) public void testRestoreValue_ringtoneVibrationSupport_restoreValue() { when(mResources.getBoolean( com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)).thenReturn( true); String testRingtoneVibrationValue = createUriWithVibration(DEFAULT_RINGTONE_VALUE); String testNotificationVibrationValue = createUriWithVibration(DEFAULT_NOTIFICATION_VALUE); ContentProvider mockMediaContentProvider = new MockContentProvider(mContext) { @Override public String getType(Uri url) { return "audio/ogg"; } }; mContentResolver.addProvider(MediaStore.AUTHORITY, mockMediaContentProvider); resetRingtoneSettingsToDefault(); assertRingtoneSettingsRestoring(Settings.System.RINGTONE, testRingtoneVibrationValue); assertRingtoneSettingsRestoring( Settings.System.NOTIFICATION_SOUND, testNotificationVibrationValue); } private static class MockSettingsProvider extends MockContentProvider { private static class MockSettingsProvider extends MockContentProvider { private final ArrayMap<String, String> mKeyValueStore = new ArrayMap<>(); private final ArrayMap<String, String> mKeyValueStore = new ArrayMap<>(); MockSettingsProvider(Context context) { MockSettingsProvider(Context context) { Loading Loading @@ -766,4 +817,25 @@ public class SettingsHelperTest { assertThat(Settings.System.getString(mContentResolver, Settings.System.ALARM_ALERT)) assertThat(Settings.System.getString(mContentResolver, Settings.System.ALARM_ALERT)) .isEqualTo(DEFAULT_ALARM_VALUE); .isEqualTo(DEFAULT_ALARM_VALUE); } } private String createUriWithVibration(String defaultUriString) { return Uri.parse(defaultUriString).buildUpon() .appendQueryParameter( Utils.VIBRATION_URI_PARAM, VIBRATION_FILE_NAME).build().toString(); } private void assertRingtoneSettingsRestoring( String settings, String testRingtoneSettingsValue) { mSettingsHelper.restoreValue( mContext, mContentResolver, new ContentValues(), Uri.EMPTY, settings, testRingtoneSettingsValue, 0); assertThat(Settings.System.getString(mContentResolver, settings)) .isEqualTo(testRingtoneSettingsValue); } } } Loading
packages/SettingsProvider/Android.bp +1 −0 Original line number Original line Diff line number Diff line Loading @@ -39,6 +39,7 @@ android_library { "configinfra_framework_flags_java_lib", "configinfra_framework_flags_java_lib", "device_config_service_flags_java", "device_config_service_flags_java", "libaconfig_java_proto_lite", "libaconfig_java_proto_lite", "notification_flags_lib", "SettingsLibDeviceStateRotationLock", "SettingsLibDeviceStateRotationLock", "SettingsLibDisplayUtils", "SettingsLibDisplayUtils", ], ], Loading
packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +30 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.hardware.display.ColorDisplayManager; import android.icu.util.ULocale; import android.icu.util.ULocale; import android.media.AudioManager; import android.media.AudioManager; import android.media.RingtoneManager; import android.media.RingtoneManager; import android.media.Utils; import android.net.Uri; import android.net.Uri; import android.os.LocaleList; import android.os.LocaleList; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -309,6 +310,13 @@ public class SettingsHelper { return SILENT_RINGTONE; return SILENT_RINGTONE; } } } else { } else { // If the ringtone/notification support the vibration, use the original value. final int ringtoneType = getRingtoneType(name); if ((ringtoneType == RingtoneManager.TYPE_RINGTONE || ringtoneType == RingtoneManager.TYPE_NOTIFICATION) && hasVibrationSettings(value, ringtoneType)) { return value; } return getCanonicalRingtoneValue(value); return getCanonicalRingtoneValue(value); } } } } Loading Loading @@ -362,6 +370,15 @@ public class SettingsHelper { return; return; } } // If the ringtone/notification has vibration, we backup original value in onBackupValue. // So use the value directly for restoring. if ((ringtoneType == RingtoneManager.TYPE_RINGTONE || ringtoneType == RingtoneManager.TYPE_NOTIFICATION) && hasVibrationSettings(value, ringtoneType)) { RingtoneManager.setActualDefaultRingtoneUri(mContext, ringtoneType, Uri.parse(value)); return; } Uri ringtoneUri = null; Uri ringtoneUri = null; try { try { ringtoneUri = ringtoneUri = Loading Loading @@ -617,6 +634,19 @@ public class SettingsHelper { return allLocales.remove(toFullLocale(filteredLocale)); return allLocales.remove(toFullLocale(filteredLocale)); } } private boolean hasVibrationSettings(String value, int type) { if (Utils.hasVibration(Uri.parse(value)) && mContext.getResources().getBoolean( com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)) { if (type == RingtoneManager.TYPE_RINGTONE) { return android.media.audio.Flags.enableRingtoneHapticsCustomization(); } if (type == RingtoneManager.TYPE_NOTIFICATION) { return com.android.server.notification.Flags.notificationVibrationInSoundUri(); } } return false; } /** /** * Sets the locale specified. Input data is the byte representation of comma separated * Sets the locale specified. Input data is the byte representation of comma separated * multiple BCP-47 language tags. For backwards compatibility, strings of the form * multiple BCP-47 language tags. For backwards compatibility, strings of the form Loading
packages/SettingsProvider/test/src/com/android/providers/settings/SettingsHelperTest.java +72 −0 Original line number Original line Diff line number Diff line Loading @@ -37,9 +37,12 @@ import android.content.res.Resources; import android.database.Cursor; import android.database.Cursor; import android.database.MatrixCursor; import android.database.MatrixCursor; import android.media.AudioManager; import android.media.AudioManager; import android.media.Utils; import android.net.Uri; import android.net.Uri; import android.os.Bundle; import android.os.Bundle; import android.os.LocaleList; import android.os.LocaleList; import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.BaseColumns; import android.provider.BaseColumns; import android.provider.MediaStore; import android.provider.MediaStore; import android.provider.Settings; import android.provider.Settings; Loading @@ -54,8 +57,11 @@ import com.android.internal.R; import org.junit.After; import org.junit.After; import org.junit.Before; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Rule; import org.junit.Test; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.RunWith; import org.junit.runners.MethodSorters; import org.mockito.Mock; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations; Loading @@ -63,6 +69,7 @@ import org.mockito.MockitoAnnotations; * Tests for the SettingsHelperTest * Tests for the SettingsHelperTest */ */ @RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class SettingsHelperTest { public class SettingsHelperTest { private static final String SETTING_KEY = "setting_key"; private static final String SETTING_KEY = "setting_key"; private static final String SETTING_VALUE = "setting_value"; private static final String SETTING_VALUE = "setting_value"; Loading @@ -74,9 +81,13 @@ public class SettingsHelperTest { "content://media/internal/audio/media/20?title=DefaultNotification&canonical=1"; "content://media/internal/audio/media/20?title=DefaultNotification&canonical=1"; private static final String DEFAULT_ALARM_VALUE = private static final String DEFAULT_ALARM_VALUE = "content://media/internal/audio/media/30?title=DefaultAlarm&canonical=1"; "content://media/internal/audio/media/30?title=DefaultAlarm&canonical=1"; private static final String VIBRATION_FILE_NAME = "haptics.xml"; private SettingsHelper mSettingsHelper; private SettingsHelper mSettingsHelper; @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @Mock private Context mContext; @Mock private Context mContext; @Mock private Resources mResources; @Mock private Resources mResources; @Mock private AudioManager mAudioManager; @Mock private AudioManager mAudioManager; Loading Loading @@ -119,6 +130,22 @@ public class SettingsHelperTest { assertEquals(SETTING_REAL_VALUE, mSettingsHelper.onBackupValue(SETTING_KEY, SETTING_VALUE)); assertEquals(SETTING_REAL_VALUE, mSettingsHelper.onBackupValue(SETTING_KEY, SETTING_VALUE)); } } @Test @EnableFlags({android.media.audio.Flags.FLAG_ENABLE_RINGTONE_HAPTICS_CUSTOMIZATION, com.android.server.notification.Flags.FLAG_NOTIFICATION_VIBRATION_IN_SOUND_URI}) public void testOnBackupValue_ringtoneVibrationSupport_returnsSameValue() { when(mResources.getBoolean( com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)).thenReturn( true); String testRingtoneVibrationValue = createUriWithVibration(DEFAULT_RINGTONE_VALUE); String testNotificationVibrationValue = createUriWithVibration(DEFAULT_NOTIFICATION_VALUE); assertEquals(testRingtoneVibrationValue, mSettingsHelper.onBackupValue( Settings.System.RINGTONE, testRingtoneVibrationValue)); assertEquals(testNotificationVibrationValue, mSettingsHelper.onBackupValue( Settings.System.NOTIFICATION_SOUND, testNotificationVibrationValue)); } @Test @Test public void testGetRealValue_settingNotReplaced_returnsSameValue() { public void testGetRealValue_settingNotReplaced_returnsSameValue() { when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(false); when(mSettingsHelper.isReplacedSystemSetting(eq(SETTING_KEY))).thenReturn(false); Loading Loading @@ -675,6 +702,30 @@ public class SettingsHelperTest { .isEqualTo(null); .isEqualTo(null); } } @Test @EnableFlags({android.media.audio.Flags.FLAG_ENABLE_RINGTONE_HAPTICS_CUSTOMIZATION, com.android.server.notification.Flags.FLAG_NOTIFICATION_VIBRATION_IN_SOUND_URI}) public void testRestoreValue_ringtoneVibrationSupport_restoreValue() { when(mResources.getBoolean( com.android.internal.R.bool.config_ringtoneVibrationSettingsSupported)).thenReturn( true); String testRingtoneVibrationValue = createUriWithVibration(DEFAULT_RINGTONE_VALUE); String testNotificationVibrationValue = createUriWithVibration(DEFAULT_NOTIFICATION_VALUE); ContentProvider mockMediaContentProvider = new MockContentProvider(mContext) { @Override public String getType(Uri url) { return "audio/ogg"; } }; mContentResolver.addProvider(MediaStore.AUTHORITY, mockMediaContentProvider); resetRingtoneSettingsToDefault(); assertRingtoneSettingsRestoring(Settings.System.RINGTONE, testRingtoneVibrationValue); assertRingtoneSettingsRestoring( Settings.System.NOTIFICATION_SOUND, testNotificationVibrationValue); } private static class MockSettingsProvider extends MockContentProvider { private static class MockSettingsProvider extends MockContentProvider { private final ArrayMap<String, String> mKeyValueStore = new ArrayMap<>(); private final ArrayMap<String, String> mKeyValueStore = new ArrayMap<>(); MockSettingsProvider(Context context) { MockSettingsProvider(Context context) { Loading Loading @@ -766,4 +817,25 @@ public class SettingsHelperTest { assertThat(Settings.System.getString(mContentResolver, Settings.System.ALARM_ALERT)) assertThat(Settings.System.getString(mContentResolver, Settings.System.ALARM_ALERT)) .isEqualTo(DEFAULT_ALARM_VALUE); .isEqualTo(DEFAULT_ALARM_VALUE); } } private String createUriWithVibration(String defaultUriString) { return Uri.parse(defaultUriString).buildUpon() .appendQueryParameter( Utils.VIBRATION_URI_PARAM, VIBRATION_FILE_NAME).build().toString(); } private void assertRingtoneSettingsRestoring( String settings, String testRingtoneSettingsValue) { mSettingsHelper.restoreValue( mContext, mContentResolver, new ContentValues(), Uri.EMPTY, settings, testRingtoneSettingsValue, 0); assertThat(Settings.System.getString(mContentResolver, settings)) .isEqualTo(testRingtoneSettingsValue); } } }