package yuku.alkitab.base.sync;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import com.afollestad.materialdialogs.MaterialDialog;
import yuku.afw.V;
import yuku.afw.storage.Preferences;
import yuku.alkitab.base.App;
import yuku.alkitab.base.S;
import yuku.alkitab.base.ac.base.BaseActivity;
import yuku.alkitab.base.model.SyncShadow;
import yuku.alkitab.base.storage.Prefkey;
import yuku.alkitab.base.util.Sqlitil;
import yuku.alkitab.debug.R;
import java.text.DateFormat;
import java.util.Date;
import java.util.Set;
public class SyncSettingsActivity extends BaseActivity {
/** Action to broadcast when sync status needs to be refreshed */
public static final String ACTION_RELOAD = SyncSettingsActivity.class.getName() + ".action.RELOAD";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sync_settings);
final Toolbar toolbar = V.get(this, R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar ab = getSupportActionBar();
assert ab != null;
ab.setDisplayHomeAsUpEnabled(true);
}
public static class SyncSettingsFragment extends PreferenceFragmentCompat {
private static final int REQCODE_login = 1;
private static final int REQCODE_login_initial = 2;
private Preference pref_syncAccountName;
final BroadcastReceiver br = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
if (ACTION_RELOAD.equals(intent.getAction())) {
updateDisplay();
}
}
};
static final ThreadLocal<DateFormat> lastSyncDateFormat = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return android.text.format.DateFormat.getDateFormat(App.context);
}
};
static final ThreadLocal<DateFormat> lastSyncTimeFormat = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return android.text.format.DateFormat.getTimeFormat(App.context);
}
};
@Override
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.sync_settings);
final String syncAccountName = Preferences.getString(R.string.pref_syncAccountName_key);
if (syncAccountName == null) {
startActivityForResult(SyncLoginActivity.createIntent(), REQCODE_login_initial);
}
pref_syncAccountName = findPreference(getString(R.string.pref_syncAccountName_key));
pref_syncAccountName.setOnPreferenceClickListener(pref_syncAccountName_click);
updateDisplay();
App.getLbm().registerReceiver(br, new IntentFilter(ACTION_RELOAD));
}
@Override
public void onDestroy() {
super.onDestroy();
App.getLbm().unregisterReceiver(br);
}
@SuppressWarnings("deprecation")
void updateDisplay() {
final String syncAccountName = Preferences.getString(R.string.pref_syncAccountName_key);
pref_syncAccountName.setSummary(syncAccountName != null ? syncAccountName : getString(R.string.sync_account_not_selected));
for (final String syncSetName : SyncShadow.ALL_SYNC_SET_NAMES) {
final Preference pref = findPreference(Sync.prefkeyForSyncSetEnabled(syncSetName));
pref.setEnabled(syncAccountName != null);
if (syncAccountName != null) {
final Set<String> runningSyncs = SyncAdapter.getRunningSyncs();
if (runningSyncs.contains(syncSetName)) {
pref.setSummary(getString(R.string.sync_sync_set_pref_summary_syncing));
} else {
final int time = SyncRecorder.getLastSuccessTime(syncSetName);
if (time == 0) {
pref.setSummary(getString(R.string.sync_sync_set_pref_summary_never));
} else {
final Date date = Sqlitil.toDate(time);
pref.setSummary(getString(R.string.sync_sync_set_pref_summary_last_synced, lastSyncDateFormat.get().format(date), lastSyncTimeFormat.get().format(date), S.getDb().getRevnoFromSyncShadowBySyncSetName(syncSetName)));
}
}
} else {
pref.setSummary(null);
}
}
}
Preference.OnPreferenceClickListener pref_syncAccountName_click = preference -> {
final String syncAccountName = Preferences.getString(R.string.pref_syncAccountName_key);
if (syncAccountName == null) {
startActivityForResult(SyncLoginActivity.createIntent(), REQCODE_login);
} else { // show logout instead
new MaterialDialog.Builder(getActivity())
.content(R.string.sync_logout_warning)
.positiveText(R.string.ok)
.onPositive((d, w) -> {
SyncRecorder.log(SyncRecorder.EventKind.logout_pre, null, "accountName", syncAccountName);
Preferences.hold();
Preferences.remove(getString(R.string.pref_syncAccountName_key));
Preferences.remove(Prefkey.sync_simpleToken);
Preferences.remove(Prefkey.sync_token_obtained_time);
for (final String syncSetName : SyncShadow.ALL_SYNC_SET_NAMES) {
S.getDb().deleteSyncShadowBySyncSetName(syncSetName);
}
Preferences.unhold();
SyncRecorder.removeAllLastSuccessTimes();
SyncRecorder.log(SyncRecorder.EventKind.logout_post, null, "accountName", syncAccountName);
updateDisplay();
})
.negativeText(R.string.cancel)
.show();
}
return true;
};
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
if (requestCode == REQCODE_login || requestCode == REQCODE_login_initial) {
if (resultCode == RESULT_OK) {
final SyncLoginActivity.Result result = SyncLoginActivity.obtainResult(data);
// Success!
SyncRecorder.log(SyncRecorder.EventKind.login_success_pre, null, "accountName", result.accountName);
Preferences.hold();
Preferences.setString(R.string.pref_syncAccountName_key, result.accountName);
Preferences.setString(Prefkey.sync_simpleToken, result.simpleToken);
Preferences.setInt(Prefkey.sync_token_obtained_time, Sqlitil.nowDateTime());
Preferences.unhold();
SyncRecorder.log(SyncRecorder.EventKind.login_success_post, null, "accountName", result.accountName);
// force sync immediately after login
Sync.forceSyncNow();
updateDisplay();
} else if (resultCode == RESULT_CANCELED) {
if (requestCode == REQCODE_login_initial) {
getActivity().finish();
}
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.activity_sync_settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
final int itemId = item.getItemId();
switch (itemId) {
case R.id.menuSyncNow:
Sync.forceSyncNow();
return true;
case R.id.menuSyncLog:
startActivity(SyncLogActivity.createIntent());
return true;
}
return super.onOptionsItemSelected(item);
}
public static Intent createIntent() {
return new Intent(App.context, SyncSettingsActivity.class);
}
}