Check credentials before saving
This commit is contained in:
parent
1b45ff3b12
commit
baa24fbf17
5 changed files with 146 additions and 77 deletions
|
@ -87,6 +87,7 @@ dependencies {
|
||||||
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.4.1'
|
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.4.1'
|
||||||
compile "frankiesardo:icepick:$ICEPICK_VERSION"
|
compile "frankiesardo:icepick:$ICEPICK_VERSION"
|
||||||
provided "frankiesardo:icepick-processor:$ICEPICK_VERSION"
|
provided "frankiesardo:icepick-processor:$ICEPICK_VERSION"
|
||||||
|
compile 'com.github.dmytrodanylyk.android-process-button:library:1.0.4'
|
||||||
|
|
||||||
compile "com.google.dagger:dagger:$DAGGER_VERSION"
|
compile "com.google.dagger:dagger:$DAGGER_VERSION"
|
||||||
apt "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
|
apt "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
|
||||||
|
|
|
@ -0,0 +1,127 @@
|
||||||
|
package eu.kanade.mangafeed.ui.dialog;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.DialogPreference;
|
||||||
|
import android.text.method.PasswordTransformationMethod;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.dd.processbutton.iml.ActionProcessButton;
|
||||||
|
|
||||||
|
import butterknife.Bind;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import eu.kanade.mangafeed.R;
|
||||||
|
import eu.kanade.mangafeed.data.helpers.PreferencesHelper;
|
||||||
|
import eu.kanade.mangafeed.sources.base.Source;
|
||||||
|
import rx.Subscription;
|
||||||
|
import rx.android.schedulers.AndroidSchedulers;
|
||||||
|
import rx.schedulers.Schedulers;
|
||||||
|
|
||||||
|
public class LoginDialogPreference extends DialogPreference {
|
||||||
|
|
||||||
|
@Bind(R.id.accounts_login)
|
||||||
|
TextView title;
|
||||||
|
@Bind(R.id.username)
|
||||||
|
EditText username;
|
||||||
|
@Bind(R.id.password) EditText password;
|
||||||
|
@Bind(R.id.show_password)
|
||||||
|
CheckBox showPassword;
|
||||||
|
@Bind(R.id.login)
|
||||||
|
ActionProcessButton loginBtn;
|
||||||
|
|
||||||
|
private PreferencesHelper preferences;
|
||||||
|
private Source source;
|
||||||
|
private AlertDialog dialog;
|
||||||
|
private Subscription requestSubscription;
|
||||||
|
|
||||||
|
public LoginDialogPreference(Context context, PreferencesHelper preferences, Source source) {
|
||||||
|
super(context, null);
|
||||||
|
this.preferences = preferences;
|
||||||
|
this.source = source;
|
||||||
|
|
||||||
|
setDialogLayoutResource(R.layout.pref_account_login);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onBindDialogView(View view) {
|
||||||
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
|
title.setText(getContext().getString(R.string.accounts_login_title, source.getName()));
|
||||||
|
|
||||||
|
username.setText(preferences.getSourceUsername(source));
|
||||||
|
password.setText(preferences.getSourcePassword(source));
|
||||||
|
showPassword.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
||||||
|
if (isChecked)
|
||||||
|
password.setTransformationMethod(null);
|
||||||
|
else
|
||||||
|
password.setTransformationMethod(new PasswordTransformationMethod());
|
||||||
|
});
|
||||||
|
|
||||||
|
loginBtn.setMode(ActionProcessButton.Mode.ENDLESS);
|
||||||
|
loginBtn.setOnClickListener(v -> checkLogin());
|
||||||
|
|
||||||
|
super.onBindDialogView(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showDialog(Bundle state) {
|
||||||
|
super.showDialog(state);
|
||||||
|
dialog = ((AlertDialog) getDialog());
|
||||||
|
setSubmitButtonEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDialogClosed(boolean positiveResult) {
|
||||||
|
if (requestSubscription != null)
|
||||||
|
requestSubscription.unsubscribe();
|
||||||
|
|
||||||
|
if(!positiveResult)
|
||||||
|
return;
|
||||||
|
|
||||||
|
preferences.setSourceCredentials(source,
|
||||||
|
username.getText().toString(),
|
||||||
|
password.getText().toString());
|
||||||
|
|
||||||
|
super.onDialogClosed(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSubmitButtonEnabled(boolean enabled) {
|
||||||
|
if (dialog != null) {
|
||||||
|
dialog.getButton(DialogInterface.BUTTON_POSITIVE)
|
||||||
|
.setEnabled(enabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkLogin() {
|
||||||
|
if (requestSubscription != null)
|
||||||
|
requestSubscription.unsubscribe();
|
||||||
|
|
||||||
|
loginBtn.setProgress(1);
|
||||||
|
|
||||||
|
requestSubscription = source.login(username.getText().toString(),
|
||||||
|
password.getText().toString())
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(logged -> {
|
||||||
|
if (logged) {
|
||||||
|
loginBtn.setProgress(100);
|
||||||
|
loginBtn.setEnabled(false);
|
||||||
|
username.setEnabled(false);
|
||||||
|
password.setEnabled(false);
|
||||||
|
setSubmitButtonEnabled(true);
|
||||||
|
} else {
|
||||||
|
loginBtn.setProgress(-1);
|
||||||
|
}
|
||||||
|
}, throwable -> {
|
||||||
|
loginBtn.setProgress(-1);
|
||||||
|
loginBtn.setText("Unknown error");
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,33 +1,21 @@
|
||||||
package eu.kanade.mangafeed.ui.fragment;
|
package eu.kanade.mangafeed.ui.fragment;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.DialogPreference;
|
|
||||||
import android.preference.PreferenceFragment;
|
import android.preference.PreferenceFragment;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.text.method.PasswordTransformationMethod;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.CheckBox;
|
|
||||||
import android.widget.EditText;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import butterknife.Bind;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import eu.kanade.mangafeed.App;
|
import eu.kanade.mangafeed.App;
|
||||||
import eu.kanade.mangafeed.R;
|
import eu.kanade.mangafeed.R;
|
||||||
import eu.kanade.mangafeed.data.helpers.PreferencesHelper;
|
import eu.kanade.mangafeed.data.helpers.PreferencesHelper;
|
||||||
import eu.kanade.mangafeed.data.helpers.SourceManager;
|
import eu.kanade.mangafeed.data.helpers.SourceManager;
|
||||||
import eu.kanade.mangafeed.sources.base.Source;
|
import eu.kanade.mangafeed.sources.base.Source;
|
||||||
import eu.kanade.mangafeed.ui.activity.base.BaseActivity;
|
import eu.kanade.mangafeed.ui.activity.base.BaseActivity;
|
||||||
|
import eu.kanade.mangafeed.ui.dialog.LoginDialogPreference;
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
import rx.android.schedulers.AndroidSchedulers;
|
|
||||||
import rx.schedulers.Schedulers;
|
|
||||||
import timber.log.Timber;
|
|
||||||
|
|
||||||
public class SettingsAccountsFragment extends PreferenceFragment {
|
public class SettingsAccountsFragment extends PreferenceFragment {
|
||||||
|
|
||||||
|
@ -50,7 +38,7 @@ public class SettingsAccountsFragment extends PreferenceFragment {
|
||||||
|
|
||||||
for (Source source : sourceAccounts) {
|
for (Source source : sourceAccounts) {
|
||||||
LoginDialogPreference dialog = new LoginDialogPreference(
|
LoginDialogPreference dialog = new LoginDialogPreference(
|
||||||
screen.getContext(), null, source);
|
screen.getContext(), preferences, source);
|
||||||
dialog.setTitle(source.getName());
|
dialog.setTitle(source.getName());
|
||||||
|
|
||||||
screen.addPreference(dialog);
|
screen.addPreference(dialog);
|
||||||
|
@ -72,60 +60,4 @@ public class SettingsAccountsFragment extends PreferenceFragment {
|
||||||
.single();
|
.single();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LoginDialogPreference extends DialogPreference {
|
|
||||||
|
|
||||||
@Bind(R.id.accounts_login) TextView title;
|
|
||||||
@Bind(R.id.username) EditText username;
|
|
||||||
@Bind(R.id.password) EditText password;
|
|
||||||
@Bind(R.id.show_password) CheckBox showPassword;
|
|
||||||
|
|
||||||
private Source source;
|
|
||||||
|
|
||||||
public LoginDialogPreference(Context context, AttributeSet attrs, Source source) {
|
|
||||||
super(context, attrs);
|
|
||||||
this.source = source;
|
|
||||||
|
|
||||||
setDialogLayoutResource(R.layout.pref_account_login);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBindDialogView(View view) {
|
|
||||||
ButterKnife.bind(this, view);
|
|
||||||
|
|
||||||
title.setText(getString(R.string.accounts_login_title, source.getName()));
|
|
||||||
|
|
||||||
username.setText(preferences.getSourceUsername(source));
|
|
||||||
password.setText(preferences.getSourcePassword(source));
|
|
||||||
showPassword.setOnCheckedChangeListener((buttonView, isChecked) -> {
|
|
||||||
if (isChecked)
|
|
||||||
password.setTransformationMethod(null);
|
|
||||||
else
|
|
||||||
password.setTransformationMethod(new PasswordTransformationMethod());
|
|
||||||
});
|
|
||||||
|
|
||||||
super.onBindDialogView(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDialogClosed(boolean positiveResult) {
|
|
||||||
if(!positiveResult)
|
|
||||||
return;
|
|
||||||
|
|
||||||
preferences.setSourceCredentials(source,
|
|
||||||
username.getText().toString(),
|
|
||||||
password.getText().toString());
|
|
||||||
|
|
||||||
source.login(username.getText().toString(), password.getText().toString())
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(result -> {
|
|
||||||
Timber.e("Result is " + result);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
super.onDialogClosed(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical" android:layout_width="match_parent"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:padding="24dp">
|
android:padding="24dp">
|
||||||
|
|
||||||
|
@ -50,12 +52,15 @@
|
||||||
android:id="@+id/show_password"
|
android:id="@+id/show_password"
|
||||||
android:layout_marginTop="10dp"/>
|
android:layout_marginTop="10dp"/>
|
||||||
|
|
||||||
<Button
|
<com.dd.processbutton.iml.ActionProcessButton
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/check_credentials"
|
android:textColor="@android:color/white"
|
||||||
android:id="@+id/check_credentials" />
|
android:text="@string/login"
|
||||||
|
android:id="@+id/login"
|
||||||
|
app:pb_textComplete="@string/success"
|
||||||
|
app:pb_textProgress="@string/loading"
|
||||||
|
app:pb_textError="@string/invalid_login"
|
||||||
|
android:layout_marginTop="20dp"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
|
@ -67,5 +67,9 @@
|
||||||
<string name="password">Password</string>
|
<string name="password">Password</string>
|
||||||
<string name="show_password">Show password</string>
|
<string name="show_password">Show password</string>
|
||||||
<string name="check_credentials">Check credentials</string>
|
<string name="check_credentials">Check credentials</string>
|
||||||
|
<string name="login">Login</string>
|
||||||
|
<string name="success">Success</string>
|
||||||
|
<string name="invalid_login">Login error</string>
|
||||||
|
<string name="loading">Loading…</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Reference in a new issue