/*
* Firetweet - Twitter client for Android
*
* Copyright (C) 2012 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.getlantern.firetweet;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import org.getlantern.firetweet.provider.FiretweetDataStore;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public final class FiretweetSharedPreferences implements SharedPreferences {
private final ContentResolver mResolver;
FiretweetSharedPreferences(final Context context) {
mResolver = context.getContentResolver();
}
@Override
public boolean contains(final String key) {
if (key == null) throw new NullPointerException();
final Uri uri = Uri.withAppendedPath(FiretweetDataStore.Preferences.CONTENT_URI, key);
final Cursor cur = mResolver.query(uri, FiretweetDataStore.Preferences.MATRIX_COLUMNS, null, null, null);
if (cur == null) return false;
try {
return cur.getCount() > 0;
} finally {
cur.close();
}
}
@Override
public Editor edit() {
throw new UnsupportedOperationException();
}
@Override
public Map<String, ?> getAll() {
final Cursor cur = mResolver.query(FiretweetDataStore.Preferences.CONTENT_URI, FiretweetDataStore.Preferences.MATRIX_COLUMNS,
null, null, null);
if (cur == null) return null;
final HashMap<String, Object> map = new HashMap<>();
final int key_idx = cur.getColumnIndex(FiretweetDataStore.Preferences.KEY);
final int value_idx = cur.getColumnIndex(FiretweetDataStore.Preferences.VALUE);
final int type_idx = cur.getColumnIndex(FiretweetDataStore.Preferences.TYPE);
cur.moveToFirst();
while (!cur.isAfterLast()) {
final Object value;
switch (cur.getInt(type_idx)) {
case FiretweetDataStore.Preferences.TYPE_BOOLEAN:
value = Boolean.valueOf(cur.getString(value_idx));
break;
case FiretweetDataStore.Preferences.TYPE_INTEGER:
value = cur.getInt(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_LONG:
value = cur.getLong(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_FLOAT:
value = cur.getFloat(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_STRING:
value = cur.getString(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_NULL:
value = null;
break;
default:
continue;
}
map.put(cur.getString(key_idx), value);
cur.moveToNext();
}
cur.close();
return map;
}
@Override
public boolean getBoolean(final String key, final boolean defValue) {
if (key == null) throw new NullPointerException();
try {
return (Boolean) getPreferenceObject(key);
} catch (final NullPointerException e) {
return defValue;
}
}
@Override
public float getFloat(final String key, final float defValue) {
if (key == null) throw new NullPointerException();
try {
return (Float) getPreferenceObject(key);
} catch (final NullPointerException e) {
return defValue;
}
}
@Override
public int getInt(final String key, final int defValue) {
if (key == null) throw new NullPointerException();
try {
return (Integer) getPreferenceObject(key);
} catch (final NullPointerException e) {
return defValue;
}
}
@Override
public long getLong(final String key, final long defValue) {
if (key == null) throw new NullPointerException();
try {
return (Long) getPreferenceObject(key);
} catch (final NullPointerException e) {
return defValue;
}
}
public Object getPreferenceObject(final String key) {
final Uri uri = Uri.withAppendedPath(FiretweetDataStore.Preferences.CONTENT_URI, key);
final Cursor cur = mResolver.query(uri, FiretweetDataStore.Preferences.MATRIX_COLUMNS, null, null, null);
if (cur == null) throw new NullPointerException();
try {
final int key_idx = cur.getColumnIndex(FiretweetDataStore.Preferences.KEY);
final int value_idx = cur.getColumnIndex(FiretweetDataStore.Preferences.VALUE);
final int type_idx = cur.getColumnIndex(FiretweetDataStore.Preferences.TYPE);
cur.moveToFirst();
while (!cur.isAfterLast()) {
if (!key.equals(cur.getString(key_idx))) {
cur.moveToNext();
continue;
}
final Object value;
switch (cur.getInt(type_idx)) {
case FiretweetDataStore.Preferences.TYPE_BOOLEAN:
value = Boolean.valueOf(cur.getString(value_idx));
break;
case FiretweetDataStore.Preferences.TYPE_INTEGER:
value = cur.getInt(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_LONG:
value = cur.getLong(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_FLOAT:
value = cur.getFloat(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_STRING:
value = cur.getString(value_idx);
break;
case FiretweetDataStore.Preferences.TYPE_NULL:
value = null;
break;
default:
continue;
}
return value;
}
throw new NullPointerException();
} finally {
cur.close();
}
}
@Override
public String getString(final String key, final String defValue) {
if (key == null) throw new NullPointerException();
try {
return (String) getPreferenceObject(key);
} catch (final NullPointerException e) {
return defValue;
}
}
@Override
public Set<String> getStringSet(final String key, final Set<String> defValue) {
if (key == null) throw new NullPointerException();
throw new UnsupportedOperationException();
}
@Override
public void registerOnSharedPreferenceChangeListener(final OnSharedPreferenceChangeListener listener) {
throw new UnsupportedOperationException();
}
@Override
public void unregisterOnSharedPreferenceChangeListener(final OnSharedPreferenceChangeListener listener) {
throw new UnsupportedOperationException();
}
}