package com.boardgamegeek.pref;
import android.app.Fragment;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.support.v4.util.ArrayMap;
import android.support.v7.app.ActionBar;
import android.view.MenuItem;
import com.boardgamegeek.R;
import com.boardgamegeek.service.SyncService;
import com.boardgamegeek.ui.DrawerActivity;
import com.mikepenz.aboutlibraries.Libs;
import com.mikepenz.aboutlibraries.LibsBuilder;
public class SettingsActivity extends DrawerActivity {
private static final String TAG_SINGLE_PANE = "single_pane";
private static final String KEY_SETTINGS_FRAGMENT = "SETTINGS_FRAGMENT";
private static final String ACTION_PREFIX = "com.boardgamegeek.prefs.";
private static final String ACTION_LOG = ACTION_PREFIX + "LOG";
private static final String ACTION_SYNC = ACTION_PREFIX + "SYNC";
private static final String ACTION_ADVANCED = ACTION_PREFIX + "ADVANCED";
private static final String ACTION_ABOUT = ACTION_PREFIX + "ABOUT";
private static final String ACTION_AUTHORS = ACTION_PREFIX + "AUTHORS";
private static final ArrayMap<String, Integer> FRAGMENT_MAP = buildFragmentMap();
private static ArrayMap<String, Integer> buildFragmentMap() {
ArrayMap<String, Integer> map = new ArrayMap<>();
map.put(ACTION_LOG, R.xml.preference_log);
map.put(ACTION_SYNC, R.xml.preference_sync);
map.put(ACTION_ADVANCED, R.xml.preference_advanced);
map.put(ACTION_ABOUT, R.xml.preference_about);
map.put(ACTION_AUTHORS, R.xml.preference_authors);
return map;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.root_container, new PrefFragment(), TAG_SINGLE_PANE).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (!getFragmentManager().popBackStackImmediate()) {
super.onBackPressed();
}
}
void replaceFragment(String key) {
Bundle args = new Bundle();
args.putString(KEY_SETTINGS_FRAGMENT, key);
Fragment fragment = new PrefFragment();
fragment.setArguments(args);
getFragmentManager().beginTransaction().replace(R.id.root_container, fragment).addToBackStack(null).commitAllowingStateLoss();
}
public static class PrefFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
private int syncType = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final String fragment = getArguments() == null ? null : getArguments().getString(KEY_SETTINGS_FRAGMENT);
if (fragment == null) {
addPreferencesFromResource(R.xml.preference_headers);
} else {
Integer fragmentId = FRAGMENT_MAP.get(fragment);
if (fragmentId != null) {
addPreferencesFromResource(fragmentId);
}
}
Preference oslPref = findPreference("open_source_licenses");
if (oslPref != null) {
oslPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
new LibsBuilder()
.withFields(R.string.class.getFields())
.withLibraries(
"Hugo",
"PhotoView",
"AndroidIcons",
"MPAndroidChart",
"AndroidRandomColor",
"LeakCanary",
"MaterialRangeBar")
.withAutoDetect(true)
.withLicenseShown(true)
.withActivityTitle(getString(R.string.pref_about_licenses))
.withActivityTheme(R.style.Theme_bgglight_About)
.withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR)
.withAboutIconShown(true)
.withAboutAppName(getString(R.string.app_name))
.withAboutVersionShownName(true)
.start(getActivity());
return true;
}
});
}
}
@Override
public void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onStop() {
super.onStop();
if (syncType > 0) {
SyncService.sync(getActivity(), syncType);
syncType = 0;
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
switch (key) {
case "syncStatuses":
SyncService.clearCollection(getActivity());
syncType |= SyncService.FLAG_SYNC_COLLECTION;
break;
case "syncPlays":
SyncService.clearPlays(getActivity());
syncType |= SyncService.FLAG_SYNC_PLAYS;
break;
case "syncBuddies":
SyncService.clearBuddies(getActivity());
syncType |= SyncService.FLAG_SYNC_BUDDIES;
break;
}
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
String key = preference.getKey();
if (key != null && key.startsWith(ACTION_PREFIX)) {
((SettingsActivity) getActivity()).replaceFragment(key);
return true;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
}
}