| package com.google.android.libraries.backup; |
| |
| import android.content.Context; |
| import android.content.SharedPreferences; |
| import android.database.Cursor; |
| import android.media.Ringtone; |
| import android.media.RingtoneManager; |
| import android.net.Uri; |
| import android.support.annotation.Nullable; |
| import android.support.annotation.VisibleForTesting; |
| |
| /** |
| * Utility class of static methods to help process shared preferences for backup and restore. |
| */ |
| public class PreferenceBackupUtil { |
| |
| @VisibleForTesting |
| @Nullable |
| static String getRingtoneTitleFromUri(Context context, @Nullable String uri) { |
| if (uri == null) { |
| return null; |
| } |
| |
| Ringtone sound = RingtoneManager.getRingtone(context, Uri.parse(uri)); |
| if (sound == null) { |
| return null; |
| } |
| return sound.getTitle(context); |
| } |
| |
| /** |
| * Get ringtone uri from a preference key in a shared preferences file, retrieve the associated |
| * ringtone's title and, if possible, save the title to the target preference key. |
| * |
| * @param srcRingtoneUriPrefKey preference key of the ringtone uri. |
| * @param dstRingtoneTitlePrefKey preference key where the ringtone title should be put. |
| * @return whether the ringtoneTitleKey was set. |
| */ |
| public static boolean encodeRingtonePreference(Context context, String prefsName, |
| String srcRingtoneUriPrefKey, String dstRingtoneTitlePrefKey) { |
| SharedPreferences preferences = context.getSharedPreferences(prefsName, Context.MODE_PRIVATE); |
| |
| String uri = preferences.getString(srcRingtoneUriPrefKey, null); |
| String title = getRingtoneTitleFromUri(context, uri); |
| if (title == null) { |
| return false; |
| } |
| |
| preferences.edit().putString(dstRingtoneTitlePrefKey, title).apply(); |
| return true; |
| } |
| |
| @VisibleForTesting |
| @Nullable |
| static String getRingtoneUriFromTitle(Context context, @Nullable String title, int ringtoneType) { |
| // Check whether the ringtoneType is a valid combination of the 3 ringtone types. |
| if ((ringtoneType == 0) |
| || ((RingtoneManager.TYPE_ALL & ringtoneType) != ringtoneType)) { |
| throw new IllegalStateException(); |
| } |
| if (title == null) { |
| return null; |
| } |
| |
| RingtoneManager manager = new RingtoneManager(context); |
| manager.setType(ringtoneType); |
| Cursor cur = manager.getCursor(); |
| for (int i = 0; i < cur.getCount(); i++) { |
| Ringtone ringtone = manager.getRingtone(i); |
| if (ringtone.getTitle(context).equals(title)) { |
| return manager.getRingtoneUri(i).toString(); |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Get ringtone title from a preference key of a shared preferences file, find a ringtone with the |
| * same title and, if possible, save its uri to the target preference key. |
| * |
| * @param dstRingtoneUriPrefKey preference key where the ringtone uri should be put. |
| * @param srcRingtoneTitlePrefKey preference key of the ringtone title. |
| * @return whether the ringtoneUriKey was set. |
| */ |
| public static boolean decodeRingtonePreference(Context context, String prefsName, |
| String dstRingtoneUriPrefKey, String srcRingtoneTitlePrefKey, int ringtoneType) { |
| SharedPreferences preferences = context.getSharedPreferences(prefsName, Context.MODE_PRIVATE); |
| |
| String title = preferences.getString(srcRingtoneTitlePrefKey, null); |
| String uri = getRingtoneUriFromTitle(context, title, ringtoneType); |
| if (uri == null) { |
| return false; |
| } |
| |
| preferences.edit().putString(dstRingtoneUriPrefKey, uri).apply(); |
| return true; |
| } |
| } |