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

Commit df1656e5 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Backup & restore for ringtone vibrations(2nd try)" into main

parents f915f34c 038d19da
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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",
    ],
    ],
+30 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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);
            }
            }
        }
        }
@@ -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 =
@@ -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
+72 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;


@@ -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";
@@ -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;
@@ -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);
@@ -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) {
@@ -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);
    }
}
}