package com.alorma.github.ui.activity;
import android.accounts.Account;
import android.accounts.AccountAuthenticatorActivity;
import android.accounts.AccountManager;
import android.os.Bundle;
import com.alorma.github.AccountsHelper;
import com.alorma.github.BuildConfig;
import com.alorma.github.R;
import com.alorma.github.sdk.bean.dto.request.CreateAuthorization;
import com.alorma.github.sdk.bean.dto.response.GithubAuthorization;
import com.alorma.github.sdk.services.login.CreateAuthorizationClient;
import com.alorma.github.sdk.services.user.GetAuthUserClient;
import com.alorma.github.sdk.services.user.TwoFactorAppException;
import com.alorma.github.sdk.services.user.TwoFactorAuthException;
import com.alorma.github.sdk.services.user.UnauthorizedException;
import com.alorma.github.utils.AccountUtils;
import com.alorma.gitskarios.core.Pair;
import core.User;
import java.lang.ref.WeakReference;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
public class WelcomePresenter {
private WelcomePresenterViewInterface welcomePresenterViewInterfaceNull = new WelcomePresenterViewInterface.NullView();
private WelcomePresenterViewInterface welcomePresenterViewInterface = welcomePresenterViewInterfaceNull;
private String username;
private String password;
private WeakReference<AccountAuthenticatorActivity> accountAuthenticatorActivity;
public WelcomePresenter(AccountAuthenticatorActivity accountAuthenticatorActivity) {
this.accountAuthenticatorActivity = new WeakReference<>(accountAuthenticatorActivity);
}
public void login(String username, String password) {
this.username = username;
this.password = password;
createAuthorization(null);
}
public void setOtpCode(String otpCode) {
createAuthorization(otpCode);
}
private void createAuthorization(String otpCode) {
CreateAuthorization createRequest = new CreateAuthorization();
createRequest.note = "gitskarios";
createRequest.scopes = new String[] {
"gist", "user", "notifications", "repo", "delete_repo"
};
createRequest.client_id = BuildConfig.CLIENT_ID;
createRequest.client_secret = BuildConfig.CLIENT_SECRET;
createRequest.note_url = "http://gitskarios.github.io";
CreateAuthorizationClient createAuthorizationClient = new CreateAuthorizationClient(username, password, createRequest);
if (otpCode != null) {
createAuthorizationClient.setOtpCode(otpCode);
}
createAuthorizationClient.observable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe(() -> welcomePresenterViewInterface.willLogin())
.doOnError(this::checkErrorFromAuthorization)
.flatMap(githubAuthorization -> new GetAuthUserClient(githubAuthorization.token).observable())
//.subscribeOn(Schedulers.io())
//.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> welcomePresenterViewInterface.didLogin())
.doOnCompleted(() -> welcomePresenterViewInterface.didLogin())
.subscribe(userStringPair -> addAccount(userStringPair.first, userStringPair.second), this::checkError);
}
private void checkError(Throwable e) {
if (e instanceof UnauthorizedException) {
onErrorUnauthorized();
} else if (!(e instanceof TwoFactorAppException || e instanceof TwoFactorAuthException)) {
onGenericError();
}
}
private void checkErrorFromAuthorization(Throwable e) {
if (e instanceof TwoFactorAppException) {
welcomePresenterViewInterface.onErrorTwoFactorAppException();
} else if (e instanceof TwoFactorAuthException) {
welcomePresenterViewInterface.onErrorTwoFactorException();
}
}
private void onErrorUnauthorized() {
welcomePresenterViewInterface.onErrorUnauthorized();
}
private void onGenericError() {
welcomePresenterViewInterface.onGenericError();
}
public void start(WelcomePresenterViewInterface welcomePresenterViewInterface) {
this.welcomePresenterViewInterface = welcomePresenterViewInterface;
}
public void stop() {
this.welcomePresenterViewInterface = welcomePresenterViewInterfaceNull;
}
private void addAccount(User user, String accessToken) {
if (accessToken != null && accountAuthenticatorActivity != null && accountAuthenticatorActivity.get() != null) {
Account account = new Account(new AccountUtils().getNameForAccount(user.getLogin()),
accountAuthenticatorActivity.get().getString(R.string.account_type));
Bundle userData = AccountsHelper.buildBundle(user.getName(), user.getEmail(), user.getAvatar());
userData.putString(AccountManager.KEY_AUTHTOKEN, accessToken);
AccountManager accountManager = AccountManager.get(accountAuthenticatorActivity.get());
accountManager.addAccountExplicitly(account, null, userData);
accountManager.setAuthToken(account, accountAuthenticatorActivity.get().getString(R.string.account_type), accessToken);
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, accessToken);
accountAuthenticatorActivity.get().setAccountAuthenticatorResult(result);
welcomePresenterViewInterface.finishAccess(user);
}
}
}