package me.ccrama.redditslide.Activities; import android.app.Dialog; import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import android.webkit.CookieManager; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import com.afollestad.materialdialogs.AlertDialogWrapper; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import net.dean.jraw.http.NetworkException; import net.dean.jraw.http.oauth.Credentials; import net.dean.jraw.http.oauth.OAuthData; import net.dean.jraw.http.oauth.OAuthException; import net.dean.jraw.http.oauth.OAuthHelper; import net.dean.jraw.models.LoggedInAccount; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.UserSubscriptions; import me.ccrama.redditslide.util.LogUtil; /** * Created by ccrama on 5/27/2015. */ public class Reauthenticate extends BaseActivityAnim { private static final String CLIENT_ID = "KI2Nl9A_ouG9Qw"; private static final String REDIRECT_URL = "http://www.ccrama.me"; Dialog d; ArrayList<String> subNames; @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); applyColorTheme(""); setContentView(R.layout.activity_login); setupAppBar(R.id.toolbar, "Re-authenticate", true, true); String[] scopes = {"identity", "modcontributors", "modconfig", "modothers", "modwiki", "creddits", "livemanage", "account", "privatemessages", "modflair", "modlog", "report", "modposts", "modwiki", "read", "vote", "edit", "submit", "subscribe", "save", "wikiread", "flair", "history", "mysubreddits"}; final OAuthHelper oAuthHelper = Authentication.reddit.getOAuthHelper(); final Credentials credentials = Credentials.installedApp(CLIENT_ID, REDIRECT_URL); String authorizationUrl = oAuthHelper.getAuthorizationUrl(credentials, true, scopes) .toExternalForm(); authorizationUrl = authorizationUrl.replace("www.", "i."); authorizationUrl = authorizationUrl.replace("%3A%2F%2Fi", "://www"); Log.v(LogUtil.getTag(), "Auth URL: " + authorizationUrl); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); final WebView webView = (WebView) findViewById(R.id.web); webView.loadUrl(authorizationUrl); webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // activity.setProgress(newProgress * 1000); } }); webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (url.contains("code=")) { Log.v(LogUtil.getTag(), "WebView URL: " + url); // Authentication code received, prevent HTTP call from being made. webView.stopLoading(); new UserChallengeTask(oAuthHelper, credentials).execute(url); webView.setVisibility(View.GONE); webView.clearCache(true); webView.clearHistory(); } } }); } private final class UserChallengeTask extends AsyncTask<String, Void, OAuthData> { private final OAuthHelper mOAuthHelper; private final Credentials mCredentials; private MaterialDialog mMaterialDialog; public UserChallengeTask(OAuthHelper oAuthHelper, Credentials credentials) { Log.v(LogUtil.getTag(), "UserChallengeTask()"); mOAuthHelper = oAuthHelper; mCredentials = credentials; } @Override protected void onPreExecute() { //Show a dialog to indicate progress MaterialDialog.Builder builder = new MaterialDialog.Builder(Reauthenticate.this) .title(R.string.login_authenticating) .progress(true, 0) .content(R.string.misc_please_wait) .cancelable(false); mMaterialDialog = builder.build(); mMaterialDialog.show(); } @Override protected OAuthData doInBackground(String... params) { try { OAuthData oAuthData = mOAuthHelper.onUserChallenge(params[0], mCredentials); if (oAuthData != null) { Authentication.reddit.authenticate(oAuthData); Authentication.isLoggedIn = true; String refreshToken = Authentication.reddit.getOAuthData().getRefreshToken(); SharedPreferences.Editor editor = Authentication.authentication.edit(); Set<String> accounts = Authentication.authentication.getStringSet("accounts", new HashSet<String>()); LoggedInAccount me = Authentication.reddit.me(); String toRemove = ""; for (String s : accounts) { if (s.contains(me.getFullName())) { toRemove = s; } } if (!toRemove.isEmpty()) accounts.remove(toRemove); accounts.add(me.getFullName() + ":" + refreshToken); Authentication.name = me.getFullName(); editor.putStringSet("accounts", accounts); Set<String> tokens = Authentication.authentication.getStringSet("tokens", new HashSet<String>()); tokens.add(refreshToken); editor.putStringSet("tokens", tokens); editor.putString("lasttoken", refreshToken); editor.remove("backedCreds"); Reddit.appRestart.edit().remove("back").apply(); editor.apply(); } else { Log.e(LogUtil.getTag(), "Passed in OAuthData was null"); } return oAuthData; } catch (IllegalStateException | NetworkException | OAuthException e) { // Handle me gracefully Log.e(LogUtil.getTag(), "OAuth failed"); Log.e(LogUtil.getTag(), e.getMessage()); } return null; } @Override protected void onPostExecute(OAuthData oAuthData) { //Dismiss old progress dialog mMaterialDialog.dismiss(); new AlertDialogWrapper.Builder(Reauthenticate.this) .setTitle(R.string.reauth_complete) .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).setCancelable(false) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { finish(); } }).show(); } } }