From 43655cbe29654f32e6a8bdccfe2659197c0b8180 Mon Sep 17 00:00:00 2001 From: Ashish Date: Sun, 15 Sep 2019 18:09:58 +0530 Subject: [PATCH] * Login the login token way, handle LoginResult minutely, add account based on LoginResult --- app/build.gradle | 2 +- .../free/nrw/commons/auth/LoginActivity.java | 125 +++++++++++------- app/src/main/res/values/strings.xml | 1 + 3 files changed, 79 insertions(+), 49 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 464965fff3..19c02d1009 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,7 +31,7 @@ dependencies { implementation 'com.facebook.fresco:fresco:1.13.0' implementation 'com.drewnoakes:metadata-extractor:2.11.0' 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 implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index 6915d075a4..0441abf2bd 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -1,5 +1,10 @@ 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.app.ProgressDialog; import android.content.Context; @@ -16,30 +21,20 @@ import android.widget.Button; import android.widget.EditText; import android.widget.TextView; - import androidx.annotation.ColorRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.core.app.NavUtils; 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.ButterKnife; import butterknife.OnClick; import butterknife.OnEditorAction; import butterknife.OnFocusChange; +import com.google.android.material.textfield.TextInputLayout; import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; @@ -52,18 +47,21 @@ import fr.free.nrw.commons.theme.NavigationBaseActivity; import fr.free.nrw.commons.utils.ConfigUtils; 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.functions.Action; -import io.reactivex.schedulers.Schedulers; +import javax.inject.Inject; +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 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 { @Inject @@ -111,6 +109,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { private AppCompatDelegate delegate; private LoginTextWatcher textWatcher = new LoginTextWatcher(); private CompositeDisposable compositeDisposable = new CompositeDisposable(); + private Call loginToken; @Override public void onCreate(Bundle savedInstanceState) { @@ -238,6 +237,9 @@ protected void onDestroy() { passwordEdit.removeTextChangedListener(textWatcher); twoFactorEdit.removeTextChangedListener(textWatcher); delegate.onDestroy(); + if(null!=loginClient) { + loginClient.cancel(); + } super.onDestroy(); } @@ -255,34 +257,62 @@ public void performLogin() { private void doLogin(String username, String password, String twoFactorCode) { progressDialog.show(); + loginToken = ServiceFactory.get(commonsWikiSite).getLoginToken(); + loginToken.enqueue( + new Callback() { + @Override + public void onResponse(Call call, + Response 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); + } + + @Override + public void twoFactorPrompt(@NonNull Throwable caught, + @Nullable String token) { + Timber.d("Requesting 2FA prompt"); + hideProgress(); + askUserForTwoFactorAuth(); + } + + @Override + public void passwordResetPrompt(@Nullable String token) { + Timber.d("Showing password reset prompt"); + hideProgress(); + showPasswordResetPrompt(); + } + + @Override + public void error(@NonNull Throwable caught) { + Timber.e(caught); + hideProgress(); + showMessageAndCancelDialog(caught.getLocalizedMessage()); + } + }); + } + + @Override + public void onFailure(Call call, Throwable t) { + Timber.e(t); + showMessageAndCancelDialog(t.getLocalizedMessage()); + } + }); + + } + + private void hideProgress() { + progressDialog.dismiss(); + } - Action action = () -> { - try { - loginClient.loginBlocking(commonsWikiSite, username, password, twoFactorCode); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - }; - - compositeDisposable.add(Completable.fromAction(action) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(() -> onLoginSuccess(username, password), - error -> { - if (error instanceof LoginClient.LoginFailedException) { - LoginClient.LoginFailedException exception = (LoginClient.LoginFailedException) error; - if (exception.getMessage().equals("2FA")) { - askUserForTwoFactorAuth(); - } - } - if (!progressDialog.isShowing()) { - return; - } - 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. * It redirects the user to Explore Activity. @@ -302,13 +332,12 @@ private void showLoggingProgressBar() { progressDialog.show(); } - private void onLoginSuccess(String username, String password) { + private void onLoginSuccess(LoginResult loginResult) { if (!progressDialog.isShowing()) { // no longer attached to activity! return; } sessionManager.setUserLoggedIn(true); - LoginResult loginResult = new LoginResult(commonsWikiSite, "PASS", username, password, ""); AppAdapter.get().updateAccount(loginResult); progressDialog.dismiss(); showSuccessAndDismissDialog(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50f1621cb7..9a5570a2d9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -576,4 +576,5 @@ Upload your first media by tapping on the add button. Logo Other Because it is + Something went wrong with login, you must reset your password !!