package fr.ydelouis.selfoss.config.ui;
import android.accounts.AccountAuthenticatorActivity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.SystemService;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;
import fr.ydelouis.selfoss.R;
import fr.ydelouis.selfoss.config.model.Config;
import fr.ydelouis.selfoss.config.model.ConfigManager;
import fr.ydelouis.selfoss.config.model.ConfigValidator;
import fr.ydelouis.selfoss.sync.SyncManager;
@EActivity(R.layout.activity_config)
public class ConfigActivity extends AccountAuthenticatorActivity implements ConfigValidator.UrlValidationCallback, ConfigValidator.AuthValidationCallback {
@Bean protected ConfigManager configManager;
@Bean protected SyncManager syncManager;
@Bean protected ConfigValidator configValidator;
@SystemService protected InputMethodManager inputMethodManager;
private Config config;
@ViewById(R.id.toolbar) protected Toolbar toolbar;
@ViewById(R.id.title) protected TextView title;
@ViewById(R.id.progress) protected ProgressBar progress;
@ViewById(R.id.urlView) protected ConfigUrlView urlView;
@ViewById(R.id.authView) protected ConfigAuthView authView;
@ViewById(R.id.syncPeriodView) protected ConfigSyncView syncPeriodView;
@ViewById(R.id.next) protected TextView next;
@AfterInject
protected void init() {
config = configManager.get();
if (config == null) {
config = new Config();
}
configValidator.setConfig(config);
}
@AfterViews
protected void initToolbar() {
toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_48dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
@AfterViews
protected void initViews() {
urlView.setUrl(config.getUrl());
authView.setUsername(config.getUsername());
authView.setPassword(config.getPassword());
syncPeriodView.setSyncPeriod(config.getSyncPeriod());
syncPeriodView.setSyncOverWifiOnly(config.syncOverWifiOnly());
}
@Click(R.id.next)
protected void next() {
if (urlView.getVisibility() == View.VISIBLE) {
nextUrl();
} else if (authView.getVisibility() == View.VISIBLE) {
nextAuth();
} else {
nextSyncPeriod();
}
}
private void back() {
if (urlView.getVisibility() == View.VISIBLE) {
quit();
} else if (authView.getVisibility() == View.VISIBLE) {
showUrlView();
} else {
if (configValidator.requireAuth()) {
showAuthView();
} else {
showUrlView();
}
}
}
// URL
private void nextUrl() {
inputMethodManager.hideSoftInputFromWindow(toolbar.getWindowToken(), 0);
setChecking(true);
validateUrl();
}
@Background
protected void validateUrl() {
configValidator.validateUrl(urlView.getUrl(), this);
}
@Override
@UiThread
public void onUrlValidationSuccess() {
setChecking(false);
if (configValidator.requireAuth()) {
showAuthView();
} else {
showSyncPeriodView();
}
}
@Override
@UiThread
public void onUrlValidationFailed(Exception exception) {
setChecking(false);
if (exception instanceof ConfigValidator.CertificateException) {
showCertificateError();
} else {
urlView.showError(exception);
}
}
protected void showCertificateError() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.certificate_error);
builder.setMessage(getString(R.string.certificate_error_message, config.getUrl()));
builder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
trustAllCertificates();
}
});
builder.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {}
});
builder.show();
}
private void trustAllCertificates() {
setChecking(true);
configValidator.validateUrlTrustingAllCertificates(urlView.getUrl(), this);
}
// Auth
private void nextAuth() {
inputMethodManager.hideSoftInputFromWindow(toolbar.getWindowToken(), 0);
setChecking(true);
validateAuth();
}
@Background
protected void validateAuth() {
configValidator.validateUsernameAndPassword(authView.getUsername(), authView.getPassword(), this);
}
@Override
@UiThread
public void onAuthValidationSuccess() {
setChecking(false);
showSyncPeriodView();
}
@Override
@UiThread
public void onAuthValidationFailed(Exception exception) {
setChecking(false);
authView.showError(exception);
}
// SyncPeriod
private void nextSyncPeriod() {
config.setSyncPeriod(syncPeriodView.getSyncPeriod());
config.setSyncOverWifiOnly(syncPeriodView.getSyncOverWifiOnly());
configManager.save(config);
setResult(RESULT_OK);
finish();
}
// Views
private void setChecking(boolean checking){
progress.setVisibility(checking ? View.VISIBLE : View.INVISIBLE);
next.setEnabled(!checking);
}
private void showUrlView() {
title.setText(R.string.account_url_title);
urlView.setVisibility(View.VISIBLE);
authView.setVisibility(View.GONE);
syncPeriodView.setVisibility(View.GONE);
next.setText(R.string.next);
}
private void showAuthView() {
title.setText(R.string.account_auth_title);
urlView.setVisibility(View.GONE);
authView.setVisibility(View.VISIBLE);
syncPeriodView.setVisibility(View.GONE);
next.setText(R.string.next);
}
private void showSyncPeriodView() {
title.setText(R.string.account_syncPeriod_title);
urlView.setVisibility(View.GONE);
authView.setVisibility(View.GONE);
syncPeriodView.setVisibility(View.VISIBLE);
next.setText(R.string.finish);
}
// Back
@OptionsItem(android.R.id.home)
protected void quit() {
setResult(RESULT_CANCELED);
finish();
}
@Override
public void onBackPressed() {
back();
}
}