package com.mechinn.android.ouralliance.fragment; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.support.v4.app.DialogFragment; import android.util.Log; import android.util.SparseArray; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import com.activeandroid.query.Select; import com.github.machinarius.preferencefragment.PreferenceFragment; import com.mechinn.android.ouralliance.BuildConfig; import com.mechinn.android.ouralliance.Prefs; import com.mechinn.android.ouralliance.R; import com.mechinn.android.ouralliance.data.Event; import com.mechinn.android.ouralliance.rest.thebluealliance.GetEvents; import com.mechinn.android.ouralliance.widget.EventListPreference; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; import java.util.Collections; import java.util.List; import de.greenrobot.event.EventBus; import de.greenrobot.event.util.AsyncExecutor; import timber.log.Timber; /** * A {@link PreferenceActivity} that presents a set of application settings. On * handset devices, settings are presented as a single list. On tablets, * settings are split by category, with category headers shown to the left of * the list of settings. * <p> * See <a href="http://developer.android.com/design/patterns/settings.html"> * Android Design: Settings</a> for design guidelines and the <a * href="http://developer.android.com/guide/topics/ui/settings.html">Settings * API Guide</a> for more information on devdeloping a Settings UI. */ public class SettingsFragment extends PreferenceFragment { public static final String TAG = "SettingsFragment"; private Prefs prefs; private String yearPrefString; private String eventPrefString; private String measurePrefString; private String resetDBPrefString; private SparseArray<String> yearArray; private ListPreference year; private EventListPreference event; // private CompetitionListPreference measure; private Preference resetDB; private Preference changelog; private Preference about; private Event selectedEvent; private GetEvents dialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); prefs = new Prefs(this.getActivity()); yearPrefString = this.getString(R.string.pref_year); eventPrefString = this.getString(R.string.pref_comp); measurePrefString = this.getString(R.string.pref_measure); resetDBPrefString = this.getString(R.string.pref_resetDB); String[] yearNumberArray = this.getActivity().getResources().getStringArray(R.array.list_year); String[] yearSummaryArray = this.getActivity().getResources().getStringArray(R.array.list_year_display); yearArray = new SparseArray<String>(yearSummaryArray.length); for(int i=0;i<yearSummaryArray.length;++i) { yearArray.put(Integer.parseInt(yearNumberArray[i]),yearSummaryArray[i]); } year = (ListPreference) getPreferenceScreen().findPreference(yearPrefString); event = (EventListPreference) getPreferenceScreen().findPreference(eventPrefString); // measure = (CompetitionListPreference) getPreferenceScreen().findPreference(measurePrefString); resetDB = getPreferenceScreen().findPreference(resetDBPrefString); resetDB.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { Timber.d("resetDB"); new ResetDialogFragment().show(SettingsFragment.this.getFragmentManager(), "Reset Data? This is not reversable!"); return true; } }); changelog = getPreferenceScreen().findPreference(this.getString(R.string.pref_changeLog)); changelog.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { DialogFragment dialog = new HtmlDialogFragment(); Bundle htmlArgs = new Bundle(); htmlArgs.putString(HtmlDialogFragment.HTMLFILE, "file:///android_asset/changelog.html"); dialog.setArguments(htmlArgs); dialog.show(SettingsFragment.this.getFragmentManager(), "Change Log"); Timber.d( "count: "+SettingsFragment.this.getFragmentManager().getBackStackEntryCount()); return true; } }); about = getPreferenceScreen().findPreference(this.getString(R.string.pref_about)); about.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { if(BuildConfig.DEBUG) { try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); if (sd.canWrite()) { String currentDBPath = "//data//com.mechinn.android.ouralliance//databases//activeAndroid.db"; String backupDBPath = "ourAlliance.db"; File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); Uri uri = Uri.fromFile(backupDB); mediaScanIntent.setData(uri); SettingsFragment.this.getActivity().sendBroadcast(mediaScanIntent); } } } catch (Exception e) { } } DialogFragment dialog = new HtmlDialogFragment(); Bundle htmlArgs = new Bundle(); htmlArgs.putString(HtmlDialogFragment.HTMLFILE, "file:///android_asset/about.html"); dialog.setArguments(htmlArgs); dialog.show(SettingsFragment.this.getFragmentManager(), "Change Log"); return true; } }); if(prefs.getYear()>0 && !prefs.isEventsDownloaded()) { getCompetitions(); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); setRetainInstance(true); // Set up a listener whenever a key changes event.setValue(Long.toString(prefs.getComp())); if(prefs.getYear()>0) { year.setSummary(yearArray.get(prefs.getYear())); } if(prefs.getYear() > 0) { load(); } else { event.setEnabled(false); } } @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.settings, menu); } @Override public void onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.newComp).setVisible(0!=prefs.getYear()); menu.findItem(R.id.deleteComp).setVisible(null!=selectedEvent); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection DialogFragment dialog; Bundle dialogArgs; switch (item.getItemId()) { case R.id.newComp: dialog = new InsertCompDialogFragment(); dialogArgs = new Bundle(); dialogArgs.putInt(InsertCompDialogFragment.SEASON_ARG, prefs.getYear()); dialog.setArguments(dialogArgs); dialog.show(this.getFragmentManager(), "Add Competition"); return true; case R.id.deleteComp: dialog = new DeleteEventDialogFragment(); dialogArgs = new Bundle(); dialogArgs.putSerializable(DeleteEventDialogFragment.EVENT_ARG, selectedEvent); dialog.setArguments(dialogArgs); dialog.show(SettingsFragment.this.getFragmentManager(), "Delete selected compeittion?"); return true; case R.id.refreshCompetitions: getCompetitions(); return true; default: return super.onOptionsItemSelected(item); } } public void getCompetitions() { AsyncExecutor.create().execute(new GetEvents(this.getActivity())); } public void onEventMainThread(Prefs changedPrefs) { String key = changedPrefs.getKeyChanged(); Timber.d( key); if(key.equals(yearPrefString)) { Timber.d("selected season"); year.setSummary(yearArray.get(prefs.getYear())); event.setValue("0"); getActivity().invalidateOptionsMenu(); if(!changedPrefs.isEventsDownloaded()) { getCompetitions(); } } else if(key.equals(eventPrefString)) { Timber.d("selected competition"); selectedEvent = event.get(); } else if(key.equals(measurePrefString)) { Timber.d("selected measure"); } } public void load() { AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() { @Override public void run() throws Exception { List<Event> events = new Select().from(Event.class).where(Event.YEAR + "=?", prefs.getYear()).execute(); EventBus.getDefault().post(new LoadEvents(events)); } }); } public void onEventMainThread(Event eventsChanged) { load(); } public void onEventMainThread(LoadEvents events) { List<Event> eventList = events.getEvents(); Collections.sort(eventList); event.swapAdapter(eventList, prefs.getComp()); if(eventList.size()>0) { event.setEnabled(true); } else { event.setEnabled(false); } if(prefs.getComp()>0) { selectedEvent = event.get(); } else { selectedEvent = null; } } private class LoadEvents { List<Event> events; public LoadEvents(List<Event> events) { this.events = events; } public List<Event> getEvents() { return events; } } }