* Login the login token way, handle LoginResult minutely, add account based on LoginResult (#3151)

This commit is contained in:
Ashish Kumar 2019-09-15 18:28:17 +05:30 committed by Vivek Maskara
parent 90d4e49496
commit 41789980c7
3 changed files with 78 additions and 48 deletions

View file

@ -31,7 +31,7 @@ dependencies {
implementation 'com.facebook.fresco:fresco:1.13.0' implementation 'com.facebook.fresco:fresco:1.13.0'
implementation 'com.drewnoakes:metadata-extractor:2.11.0' implementation 'com.drewnoakes:metadata-extractor:2.11.0'
implementation 'org.apache.commons:commons-lang3:3.8.1' implementation 'org.apache.commons:commons-lang3:3.8.1'
implementation 'com.github.maskaravivek:wikimedia-android-data-client:v0.0.26' implementation 'com.github.maskaravivek:wikimedia-android-data-client:v0.0.27'
// UI // UI
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'

View file

@ -1,5 +1,10 @@
package fr.free.nrw.commons.auth; package fr.free.nrw.commons.auth;
import static android.view.KeyEvent.KEYCODE_ENTER;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
import static fr.free.nrw.commons.di.NetworkingModule.NAMED_COMMONS_WIKI_SITE;
import android.accounts.AccountAuthenticatorActivity; import android.accounts.AccountAuthenticatorActivity;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
@ -16,30 +21,20 @@ import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.ColorRes; import androidx.annotation.ColorRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.app.NavUtils; import androidx.core.app.NavUtils;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.google.android.material.textfield.TextInputLayout;
import org.wikipedia.AppAdapter;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.login.LoginClient;
import org.wikipedia.login.LoginResult;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import butterknife.OnClick; import butterknife.OnClick;
import butterknife.OnEditorAction; import butterknife.OnEditorAction;
import butterknife.OnFocusChange; import butterknife.OnFocusChange;
import com.google.android.material.textfield.TextInputLayout;
import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.BuildConfig;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.Utils;
@ -52,18 +47,21 @@ import fr.free.nrw.commons.mwapi.MediaWikiApi;
import fr.free.nrw.commons.theme.NavigationBaseActivity; import fr.free.nrw.commons.theme.NavigationBaseActivity;
import fr.free.nrw.commons.utils.ConfigUtils; import fr.free.nrw.commons.utils.ConfigUtils;
import fr.free.nrw.commons.utils.ViewUtil; import fr.free.nrw.commons.utils.ViewUtil;
import io.reactivex.Completable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.functions.Action; import javax.inject.Inject;
import io.reactivex.schedulers.Schedulers; import javax.inject.Named;
import org.wikipedia.AppAdapter;
import org.wikipedia.dataclient.ServiceFactory;
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.dataclient.mwapi.MwQueryResponse;
import org.wikipedia.login.LoginClient;
import org.wikipedia.login.LoginClient.LoginCallback;
import org.wikipedia.login.LoginResult;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import timber.log.Timber; import timber.log.Timber;
import static android.view.KeyEvent.KEYCODE_ENTER;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
import static fr.free.nrw.commons.di.NetworkingModule.NAMED_COMMONS_WIKI_SITE;
public class LoginActivity extends AccountAuthenticatorActivity { public class LoginActivity extends AccountAuthenticatorActivity {
@Inject @Inject
@ -111,6 +109,7 @@ public class LoginActivity extends AccountAuthenticatorActivity {
private AppCompatDelegate delegate; private AppCompatDelegate delegate;
private LoginTextWatcher textWatcher = new LoginTextWatcher(); private LoginTextWatcher textWatcher = new LoginTextWatcher();
private CompositeDisposable compositeDisposable = new CompositeDisposable(); private CompositeDisposable compositeDisposable = new CompositeDisposable();
private Call<MwQueryResponse> loginToken;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -238,6 +237,9 @@ public class LoginActivity extends AccountAuthenticatorActivity {
passwordEdit.removeTextChangedListener(textWatcher); passwordEdit.removeTextChangedListener(textWatcher);
twoFactorEdit.removeTextChangedListener(textWatcher); twoFactorEdit.removeTextChangedListener(textWatcher);
delegate.onDestroy(); delegate.onDestroy();
if(null!=loginClient) {
loginClient.cancel();
}
super.onDestroy(); super.onDestroy();
} }
@ -255,34 +257,62 @@ public class LoginActivity extends AccountAuthenticatorActivity {
private void doLogin(String username, String password, String twoFactorCode) { private void doLogin(String username, String password, String twoFactorCode) {
progressDialog.show(); progressDialog.show();
loginToken = ServiceFactory.get(commonsWikiSite).getLoginToken();
Action action = () -> { loginToken.enqueue(
try { new Callback<MwQueryResponse>() {
loginClient.loginBlocking(commonsWikiSite, username, password, twoFactorCode); @Override
} catch (Throwable throwable) { public void onResponse(Call<MwQueryResponse> call,
throwable.printStackTrace(); Response<MwQueryResponse> response) {
loginClient.login(commonsWikiSite, username, password, null, twoFactorCode,
response.body().query().loginToken(), new LoginCallback() {
@Override
public void success(@NonNull LoginResult result) {
Timber.d("Login Success");
onLoginSuccess(result);
} }
};
compositeDisposable.add(Completable.fromAction(action) @Override
.subscribeOn(Schedulers.io()) public void twoFactorPrompt(@NonNull Throwable caught,
.observeOn(AndroidSchedulers.mainThread()) @Nullable String token) {
.subscribe(() -> onLoginSuccess(username, password), Timber.d("Requesting 2FA prompt");
error -> { hideProgress();
if (error instanceof LoginClient.LoginFailedException) {
LoginClient.LoginFailedException exception = (LoginClient.LoginFailedException) error;
if (exception.getMessage().equals("2FA")) {
askUserForTwoFactorAuth(); askUserForTwoFactorAuth();
} }
@Override
public void passwordResetPrompt(@Nullable String token) {
Timber.d("Showing password reset prompt");
hideProgress();
showPasswordResetPrompt();
} }
if (!progressDialog.isShowing()) {
return; @Override
public void error(@NonNull Throwable caught) {
Timber.e(caught);
hideProgress();
showMessageAndCancelDialog(caught.getLocalizedMessage());
} }
});
}
@Override
public void onFailure(Call<MwQueryResponse> call, Throwable t) {
Timber.e(t);
showMessageAndCancelDialog(t.getLocalizedMessage());
}
});
}
private void hideProgress() {
progressDialog.dismiss(); progressDialog.dismiss();
showMessageAndCancelDialog(R.string.error_occurred);
}));
} }
private void showPasswordResetPrompt() {
showMessageAndCancelDialog(getString(R.string.you_must_reset_your_passsword));
}
/** /**
* This function is called when user skips the login. * This function is called when user skips the login.
* It redirects the user to Explore Activity. * It redirects the user to Explore Activity.
@ -302,13 +332,12 @@ public class LoginActivity extends AccountAuthenticatorActivity {
progressDialog.show(); progressDialog.show();
} }
private void onLoginSuccess(String username, String password) { private void onLoginSuccess(LoginResult loginResult) {
if (!progressDialog.isShowing()) { if (!progressDialog.isShowing()) {
// no longer attached to activity! // no longer attached to activity!
return; return;
} }
sessionManager.setUserLoggedIn(true); sessionManager.setUserLoggedIn(true);
LoginResult loginResult = new LoginResult(commonsWikiSite, "PASS", username, password, "");
AppAdapter.get().updateAccount(loginResult); AppAdapter.get().updateAccount(loginResult);
progressDialog.dismiss(); progressDialog.dismiss();
showSuccessAndDismissDialog(); showSuccessAndDismissDialog();

View file

@ -576,4 +576,5 @@ Upload your first media by tapping on the add button.</string>
<string name="delete_helper_ask_reason_copyright_logo">Logo</string> <string name="delete_helper_ask_reason_copyright_logo">Logo</string>
<string name="delete_helper_ask_reason_copyright_other">Other</string> <string name="delete_helper_ask_reason_copyright_other">Other</string>
<string name="delete_helper_ask_alert_set_positive_button_reason">Because it is</string> <string name="delete_helper_ask_alert_set_positive_button_reason">Because it is</string>
<string name="you_must_reset_your_passsword">Something went wrong with login, you must reset your password !!</string>
</resources> </resources>