package com.github.andlyticsproject;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import com.github.andlyticsproject.model.DeveloperAccount;
import com.github.andlyticsproject.sync.AutosyncHandler;
import java.util.List;
/**
* Reference AppCompatPreferenceActivity here:
* https://chromium.googlesource.com/android_tools/+/7200281446186c7192cb02f54dc2b38e02d705e5/
* sdk/extras/android/support/samples/Support7Demos/src/com/example/android/supportv7/app/
* AppCompatPreferenceActivity.java
*/
// Suppressing warnings as there is no SherlockPreferenceFragment
// for us to use instead of a PreferencesActivity
@SuppressWarnings("deprecation")
public class AndlyticsPreferenceActivity extends PreferenceActivity implements
OnPreferenceChangeListener, OnSharedPreferenceChangeListener {
private AppCompatDelegate mDelegate;
private PreferenceCategory accountListPrefCat;
private ListPreference autosyncPref;
private List<DeveloperAccount> developerAccounts;
private AutosyncHandler autosyncHandler = new AutosyncHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
setContentView(R.layout.preference_activity);
setSupportActionBar((Toolbar) findViewById(R.id.pref_toolbar));
findViewById(R.id.pref_toolbar).setBackgroundColor(getResources().getColor(R.color.lightBlue));
PreferenceManager prefMgr = getPreferenceManager();
prefMgr.setSharedPreferencesName(Preferences.PREF);
addPreferencesFromResource(R.xml.preferences);
// Find the preference category used to list all the accounts
accountListPrefCat = (PreferenceCategory) getPreferenceScreen().findPreference(
"prefCatAccountSpecific");
// Now build the list of accounts
buildAccountsList();
// Find and setup a listener for auto sync as we have had to adjust the sync handler
autosyncPref = (ListPreference) getPreferenceScreen().findPreference(
Preferences.AUTOSYNC_PERIOD);
autosyncPref.setOnPreferenceChangeListener(this);
// We have to clear cached date formats when they change
getPreferenceScreen().findPreference(Preferences.DATE_FORMAT_LONG)
.setOnPreferenceChangeListener(this);
for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
initSummary(getPreferenceScreen().getPreference(i));
}
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
private void buildAccountsList() {
developerAccounts = DeveloperAccountManager.getInstance(this).getActiveDeveloperAccounts();
for (DeveloperAccount account : developerAccounts) {
// Create a preference representing the account and add it to the screen
Preference pref = new Preference(this);
pref.setTitle(account.getName());
pref.setOnPreferenceClickListener(accountPrefrenceClickedListener);
accountListPrefCat.addPreference(pref);
}
}
OnPreferenceClickListener accountPrefrenceClickedListener = new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
String accountName = (String) preference.getTitle();
Intent i = new Intent(AndlyticsPreferenceActivity.this, AccountSpecificPreferenceActivity.class);
i.putExtra(BaseActivity.EXTRA_AUTH_ACCOUNT_NAME, accountName);
startActivity(i);
return true;
}
};
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (key.equals(Preferences.AUTOSYNC_PERIOD)) {
Integer newPeriod = Integer.parseInt((String) newValue);
if (!newPeriod.equals(0)) {
// Keep track of the last valid sync period for re-enabling the pref
Preferences.saveLastNonZeroAutosyncPeriod(AndlyticsPreferenceActivity.this, newPeriod);
}
int oldPeriod = Preferences.getAutosyncPeriod(AndlyticsPreferenceActivity.this);
for (DeveloperAccount account : developerAccounts) {
// If syncing is currently on, or it used to be app wide off
// set the new period (and enable it)
if (autosyncHandler.isAutosyncEnabled(account.getName()) || oldPeriod == 0) {
autosyncHandler.setAutosyncPeriod(account.getName(), newPeriod);
}
}
} else if (key.equals(Preferences.DATE_FORMAT_LONG)) {
Preferences.clearCachedDateFormats();
}
return true;
}
@Override
protected void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
// Make sure we are consistent with any system changes/changes in that account
// specific sections
boolean anyEnabled = false;
for (DeveloperAccount account : developerAccounts) {
if (autosyncHandler.isAutosyncEnabled(account.getName())) {
anyEnabled = true;
break;
}
}
if (anyEnabled) {
// At least one account is enabled, so this should show
// the sync period
autosyncPref.setValue(Integer.toString(Preferences
.getLastNonZeroAutosyncPeriod(AndlyticsPreferenceActivity.this)));
} else {
// All the accounts are disabled, so set it to 0
autosyncPref.setValue("0");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// Generic code to provide summaries for preferences based on their values
// Overkill at the moment, but may be useful in the future as we add more options
private void initSummary(Preference p) {
if (p instanceof PreferenceCategory) {
PreferenceCategory pCat = (PreferenceCategory) p;
for (int i = 0; i < pCat.getPreferenceCount(); i++) {
initSummary(pCat.getPreference(i));
}
} else {
updatePrefSummary(p);
}
}
private void updatePrefSummary(Preference p) {
if (p instanceof ListPreference) {
ListPreference listPref = (ListPreference) p;
p.setSummary(listPref.getEntry());
} else if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
p.setSummary(editTextPref.getText());
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
updatePrefSummary(findPreference(key));
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
this);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
getDelegate().onPostCreate(savedInstanceState);
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
getDelegate().setContentView(layoutResID);
}
@Override
protected void onPostResume() {
super.onPostResume();
getDelegate().onPostResume();
}
@Override
protected void onStop() {
super.onStop();
getDelegate().onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
getDelegate().onDestroy();
}
private void setSupportActionBar(@Nullable Toolbar toolbar) {
getDelegate().setSupportActionBar(toolbar);
}
private ActionBar getSupportActionBar() {
return getDelegate().getSupportActionBar();
}
private AppCompatDelegate getDelegate() {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, null);
}
return mDelegate;
}
}