package com.alorma.github.ui.activity.login; 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.services.login.CreateAuthorizationClient; import com.alorma.github.sdk.services.user.GetAuthUserClient; 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 AlternateLoginPresenter { private AlternateLoginPresenterViewInterface alternateLoginPresenterViewInterfaceNull = new AlternateLoginPresenterViewInterface.NullView(); private AlternateLoginPresenterViewInterface alternateLoginPresenterViewInterface = alternateLoginPresenterViewInterfaceNull; private String username; private String token; private WeakReference<AccountAuthenticatorActivity> accountAuthenticatorActivity; public AlternateLoginPresenter(AccountAuthenticatorActivity accountAuthenticatorActivity) { this.accountAuthenticatorActivity = new WeakReference<>(accountAuthenticatorActivity); } public void login(String username, String token) { this.username = username; this.token = token; createAuthorization(null); } 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, token, createRequest); if (otpCode != null) { createAuthorizationClient.setOtpCode(otpCode); } Observable<Pair<User, String>> observable = new GetAuthUserClient(token).observable(); observable.subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnSubscribe(() -> alternateLoginPresenterViewInterface.willLogin()) .doOnError(throwable -> alternateLoginPresenterViewInterface.didLogin()) .doOnCompleted(() -> alternateLoginPresenterViewInterface.didLogin()) .subscribe(new UserSubscription()); } private void onGenericError() { alternateLoginPresenterViewInterface.onGenericError(); } public void start(AlternateLoginPresenterViewInterface welcomePresenterViewInterface) { this.alternateLoginPresenterViewInterface = welcomePresenterViewInterface; } public void stop() { this.alternateLoginPresenterViewInterface = alternateLoginPresenterViewInterfaceNull; } 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); alternateLoginPresenterViewInterface.finishAccess(user); } } private class UserSubscription extends rx.Subscriber<Pair<User, String>> { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onGenericError(); } @Override public void onNext(Pair<User, String> userStringPair) { addAccount(userStringPair.first, userStringPair.second); } } }