/*
*
* TURTLE PLAYER
*
* Licensed under MIT & GPL
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
* OR OTHER DEALINGS IN THE SOFTWARE.
*
* Created by Edd Turtle (www.eddturtle.co.uk)
* More Information @ www.turtle-player.co.uk
*
*/
// Package
package com.turtleplayer.preferences;
import android.content.Context;
import com.turtleplayer.controller.Observer;
import com.turtleplayer.dirchooser.DirChooserConstants;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class Preferences
{
public static final String TAG = "TurtlePlayer";
final Context context;
public Preferences(Context context)
{
this.context = context;
}
/**
* @param key see {@link Keys}
* @param object if null, the pref gets removed, the next get will return the default
* @param <T> the class of the object the key holds
*/
public <T> void set(AbstractKey<T, ?> key, T object)
{
SharedPreferencesAccess.putValue(context, key, object);
notify(key);
}
public <T> T get(AbstractKey<T, ?> key)
{
return SharedPreferencesAccess.getValue(context, key);
}
/**
* Sideeffect: corrects the stored path if not existing and fires notification
* @return always an exiting File
*/
public File getExitstingMediaPath()
{
File existingPath = getExistingParentFolderFile(get(Keys.MEDIA_DIR));
set(Keys.MEDIA_DIR, existingPath.getPath() + DirChooserConstants.PATH_SEPERATOR);
return existingPath;
}
private File getExistingParentFolderFile(String path)
{
if (path == null || !path.startsWith(DirChooserConstants.PATH_SEPERATOR))
{
return new File(DirChooserConstants.PATH_SEPERATOR);
}
//Go up untill the string represents a valid directory
while (!new File(path).isDirectory())
{
String pathWihoutTrailngSep = path.endsWith(DirChooserConstants.PATH_SEPERATOR) ?
path.substring(0, path.length() - DirChooserConstants.PATH_SEPERATOR.length()) :
path;
path = pathWihoutTrailngSep.substring(0, path.lastIndexOf(DirChooserConstants.PATH_SEPERATOR));
}
return new File(path);
}
//Observable -------------------------------------------------
final Map<String, PreferencesObserver> observers = new HashMap<String, PreferencesObserver>();
private <T> void notify(AbstractKey<T, ?> key)
{
for (PreferencesObserver observer : observers.values())
{
observer.changed(key);
}
}
public void addObserver(PreferencesObserver observer)
{
observers.put(observer.getId(), observer);
}
public void removeObserver(Observer observer)
{
observers.remove(observer.getId());
}
}