package org.liberty.android.fantastischmemo.downloader.oauth; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.customtabs.CustomTabsIntent; import android.util.Log; import com.google.common.base.Strings; import org.liberty.android.fantastischmemo.common.AMPrefKeys; import org.liberty.android.fantastischmemo.R; import org.liberty.android.fantastischmemo.common.BaseActivity; import io.reactivex.Completable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.observers.DisposableCompletableObserver; public abstract class Oauth2AccountActivity extends BaseActivity { private CompositeDisposable disposables = new CompositeDisposable(); protected abstract void onAuthenticated(final String authTokens); protected abstract Completable verifyAccessToken(@NonNull final String accessToken); protected abstract String getLoginUrl(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.oauth2_account_activity); String savedToken = activityComponents().oauth2TokenUtil().getSavedToken(); if (savedToken != null) { verifyTokenAndOnAuthenticate(savedToken); } else { requestAuth(); } } @Override public void onDestroy() { super.onDestroy(); disposables.dispose(); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Uri callbackUri = intent.getData(); String tokenPart = callbackUri.getFragment(); String[] parts = tokenPart.split("&"); String token = null; final String partPrefix = "access_token="; for (String part : parts) { if (part.startsWith(partPrefix)) { token = part.substring(partPrefix.length()); break; } } if (!Strings.isNullOrEmpty(token)) { Log.i(TAG, "Auth token: " + token); verifyTokenAndOnAuthenticate(token); } else { Log.e(TAG, "Unable to find auth token"); finish(); } } private void verifyTokenAndOnAuthenticate(@NonNull final String token) { disposables.add(verifyAccessToken(token) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableCompletableObserver() { @Override public void onComplete() { activityComponents().oauth2TokenUtil().saveToken(token); onAuthenticated(token); } @Override public void onError(Throwable e) { activityComponents().oauth2TokenUtil().invalidateSavedToken(); requestAuth(); } })); } private void requestAuth() { CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder() .build(); customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); customTabsIntent.launchUrl(this, Uri.parse(getLoginUrl())); } }