package com.vaguehope.onosendai.ui.pref;
import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceFragment;
import com.vaguehope.onosendai.config.AccountProvider;
import com.vaguehope.onosendai.config.Prefs;
import com.vaguehope.onosendai.model.PrefetchMode;
import com.vaguehope.onosendai.storage.DbBindingAsyncTask;
import com.vaguehope.onosendai.storage.DbInterface;
import com.vaguehope.onosendai.update.KvKeys;
import com.vaguehope.onosendai.util.CollectionHelper;
import com.vaguehope.onosendai.util.CollectionHelper.Function;
import com.vaguehope.onosendai.util.DialogHelper;
import com.vaguehope.onosendai.util.LogWrapper;
import com.vaguehope.onosendai.util.PrefCache;
import com.vaguehope.onosendai.util.StringHelper;
public class FetchingPrefFragment extends PreferenceFragment {
public static final String KEY_BAT_UPDATE = "pref_bat_update";
public static final String KEY_BAT_SEND = "pref_bat_send";
public static final String KEY_PREFETCH_MEDIA = "pref_prefetch_media";
public static final String KEY_PREFETCH_LINKS = "pref_prefetch_links";
public static final String KEY_SYNC_SCROLL = "pref_sync_scroll";
private static final LogWrapper LOG = new LogWrapper("FPF");
private static final String DEFAULT_BAT_UPDATE = "30";
private static final String DEFAULT_BAT_SEND = "15";
private static final CharSequence[] BATTERY_LEVELS = new CharSequence[] { DEFAULT_BAT_UPDATE, "20", "15", "10" };
private static final BatPrefCache batUpdatePrefCache = new BatPrefCache(KEY_BAT_UPDATE, DEFAULT_BAT_UPDATE);
private static final BatPrefCache batSendPrefCache = new BatPrefCache(KEY_BAT_SEND, DEFAULT_BAT_SEND);
@Override
public void onCreate (final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
addBatLevel(KEY_BAT_UPDATE, "Min battery for backgrond updates", DEFAULT_BAT_UPDATE, batUpdatePrefCache);
addBatLevel(KEY_BAT_SEND, "Min battery for retrying sends", DEFAULT_BAT_SEND, batSendPrefCache);
addPrefetchMedia();
addPrefetchLinks();
addColumnStats();
addHosakaStatus();
addSyncScroll();
}
private void addBatLevel (final String key, final CharSequence title, final CharSequence defVal, final OnPreferenceChangeListener changeListener) {
final ListPreference pref = new ListPreference(getActivity());
pref.setKey(key);
pref.setTitle(title);
pref.setEntries(CollectionHelper.map(BATTERY_LEVELS, new Function<CharSequence, CharSequence>() {
@Override
public CharSequence exec (final CharSequence input) {
return input + "%";
}
}, new ArrayList<CharSequence>()).toArray(new CharSequence[BATTERY_LEVELS.length]));
pref.setEntryValues(BATTERY_LEVELS);
pref.setSummary("%s");
pref.setDefaultValue(defVal);
pref.setOnPreferenceChangeListener(changeListener);
getPreferenceScreen().addPreference(pref);
}
private void addPrefetchMedia () {
final ListPreference pref = new ListPreference(getActivity());
pref.setKey(KEY_PREFETCH_MEDIA);
pref.setTitle("Prefetch media"); //ES
pref.setSummary("Fetch new pictures during background updates: %s"); //ES
pref.setEntries(PrefetchMode.prefEntries());
pref.setEntryValues(PrefetchMode.prefEntryValues());
pref.setDefaultValue(PrefetchMode.NO.getValue());
getPreferenceScreen().addPreference(pref);
}
private void addPrefetchLinks () {
final ListPreference pref = new ListPreference(getActivity());
pref.setKey(KEY_PREFETCH_LINKS);
pref.setTitle("Prefetch links"); //ES
pref.setSummary("Fetch new link titles during background updates: %s"); //ES
pref.setEntries(PrefetchMode.prefEntries());
pref.setEntryValues(PrefetchMode.prefEntryValues());
pref.setDefaultValue(PrefetchMode.NO.getValue());
getPreferenceScreen().addPreference(pref);
}
private void addColumnStats () {
final Preference pref = new Preference(getActivity());
pref.setTitle("Column stats"); //ES
pref.setOnPreferenceClickListener(this.columnStatsClickListener);
getPreferenceScreen().addPreference(pref);
}
private void addHosakaStatus () {
final Preference pref = new Preference(getActivity());
pref.setTitle("Hosaka sync status"); //ES
pref.setSummary("Loading..."); //ES
getPreferenceScreen().addPreference(pref);
new GetHosakaStatus(getActivity(), pref).execute();
}
private void addSyncScroll () {
final CheckBoxPreference pref = new CheckBoxPreference(getActivity());
pref.setKey(KEY_SYNC_SCROLL);
pref.setTitle("Sync column scroll position"); //ES
pref.setSummary("But only if last scroll was upward."); //ES
getPreferenceScreen().addPreference(pref);
}
private final OnPreferenceClickListener columnStatsClickListener = new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick (final Preference preference) {
showColumnStats();
return true;
}
};
protected void showColumnStats () {
startActivity(new Intent(getActivity(), ColumnStatsActivity.class));
}
private static class GetHosakaStatus extends DbBindingAsyncTask<Void, String, Exception> {
private final Preference pref;
public GetHosakaStatus (final Context context, final Preference pref) {
super(context);
this.pref = pref;
}
@Override
protected LogWrapper getLog () {
return LOG;
}
@Override
protected void onProgressUpdate (final String... values) {
for (final String value : values) {
this.pref.setSummary(value);
}
}
@Override
protected Exception doInBackgroundWithDb (final DbInterface db, final Void... params) {
try {
if (new Prefs(getContext()).asConfig().firstAccountOfType(AccountProvider.HOSAKA) == null) {
publishProgress("Add a Hosaka account to the accounts page to enable sync."); //ES
}
else {
final String status = db.getValue(KvKeys.KEY_HOSAKA_STATUS);
publishProgress(StringHelper.isEmpty(status) ? "Never run." : status); //ES
}
return null;
}
catch (final Exception e) { // NOSONAR show user all errors.
return e;
}
}
@Override
protected void onPostExecute (final Exception result) {
if (result != null) DialogHelper.alert(getContext(), result);
}
}
public static float readMinBatForUpdate (final Context context) {
return batUpdatePrefCache.read(context);
}
public static float readMinBatForSend (final Context context) {
return batSendPrefCache.read(context);
}
public static class BatPrefCache extends PrefCache<Float> {
public BatPrefCache (final String prefKey, final String defaultVal) {
super(prefKey, defaultVal);
}
@Override
protected Float parse (final String s) {
return Integer.parseInt(s) / 100f;
}
}
}