blob: de5fbedec5a6f618fdb60fa1f6b51623ae21ce25 [file] [log] [blame]
/*
* Copyright (C) 2016 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.deskclock.data;
import android.content.SharedPreferences;
import android.net.Uri;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* This class encapsulates the transfer of data between {@link CustomRingtone} domain objects and
* their permanent storage in {@link SharedPreferences}.
*/
final class CustomRingtoneDAO {
/** Key to a preference that stores the set of all custom ringtone ids. */
private static final String RINGTONE_IDS = "ringtone_ids";
/** Key to a preference that stores the next unused ringtone id. */
private static final String NEXT_RINGTONE_ID = "next_ringtone_id";
/** Prefix for a key to a preference that stores the URI associated with the ringtone id. */
private static final String RINGTONE_URI = "ringtone_uri_";
/** Prefix for a key to a preference that stores the title associated with the ringtone id. */
private static final String RINGTONE_TITLE = "ringtone_title_";
private CustomRingtoneDAO() {}
/**
* @param uri points to an audio file located on the file system
* @param title the title of the audio content at the given {@code uri}
* @return the newly added custom ringtone
*/
static CustomRingtone addCustomRingtone(SharedPreferences prefs, Uri uri, String title) {
final long id = prefs.getLong(NEXT_RINGTONE_ID, 0);
final Set<String> ids = getRingtoneIds(prefs);
ids.add(String.valueOf(id));
prefs.edit()
.putString(RINGTONE_URI + id, uri.toString())
.putString(RINGTONE_TITLE + id, title)
.putLong(NEXT_RINGTONE_ID, id + 1)
.putStringSet(RINGTONE_IDS, ids)
.apply();
return new CustomRingtone(id, uri, title, true);
}
/**
* @param id identifies the ringtone to be removed
*/
static void removeCustomRingtone(SharedPreferences prefs, long id) {
final Set<String> ids = getRingtoneIds(prefs);
ids.remove(String.valueOf(id));
final SharedPreferences.Editor editor = prefs.edit();
editor.remove(RINGTONE_URI + id);
editor.remove(RINGTONE_TITLE + id);
if (ids.isEmpty()) {
editor.remove(RINGTONE_IDS);
editor.remove(NEXT_RINGTONE_ID);
} else {
editor.putStringSet(RINGTONE_IDS, ids);
}
editor.apply();
}
/**
* @return a list of all known custom ringtones
*/
static List<CustomRingtone> getCustomRingtones(SharedPreferences prefs) {
final Set<String> ids = prefs.getStringSet(RINGTONE_IDS, Collections.emptySet());
final List<CustomRingtone> ringtones = new ArrayList<>(ids.size());
for (String id : ids) {
final long idLong = Long.parseLong(id);
final Uri uri = Uri.parse(prefs.getString(RINGTONE_URI + id, null));
final String title = prefs.getString(RINGTONE_TITLE + id, null);
ringtones.add(new CustomRingtone(idLong, uri, title, true));
}
return ringtones;
}
private static Set<String> getRingtoneIds(SharedPreferences prefs) {
return new HashSet<>(prefs.getStringSet(RINGTONE_IDS, Collections.emptySet()));
}
}