/*
Copyright (C) 2012 Prasanna Thirumalai
This file is part of StackX.
StackX is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
StackX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with StackX. If not, see <http://www.gnu.org/licenses/>.
*/
package com.prasanna.android.stacknetwork;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.net.Uri.Builder;
import android.net.http.SslError;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.prasanna.android.stacknetwork.sqlite.TagDAO;
import com.prasanna.android.stacknetwork.utils.AlarmUtils;
import com.prasanna.android.stacknetwork.utils.AppUtils;
import com.prasanna.android.stacknetwork.utils.StackUri;
import com.prasanna.android.stacknetwork.utils.StringConstants;
import com.prasanna.android.utils.LogWrapper;
public class OAuthActivity extends Activity {
private static final String TAG = OAuthActivity.class.getName();
private static final String YAHOO_LOGIN_URL = "https://login.yahoo.com";
private static final String PROGRESS_BAR_TEXT = "to stackexchange.com...";
private static final String LOGIN = "Login";
private static boolean TEST_MODE = false;
private ProgressDialog progressDialog;
private String oauthUrl;
protected static void setTestMode() {
TEST_MODE = true;
}
private class OAuthWebViewClient extends WebViewClient {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
if (error != null) {
Log.e(TAG, error.toString());
}
handler.proceed();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
LogWrapper.d(TAG, url);
if (url.startsWith(StackUri.QueryParamDefaultValues.REDIRECT_URI)) {
TagDAO.deleteAll(OAuthActivity.this);
AlarmUtils.cancelInboxRefreshAlarm(getApplicationContext());
AlarmUtils.cancelPeriodicAccountSync(getApplicationContext());
cacheAccessToken(url);
AlarmUtils.activatePeriodicAccountSync(getApplicationContext());
startSiteListActivity(view);
OAuthActivity.this.finish();
} else if (url.endsWith("response_type%3dtoken%26state%3d")
&& url.startsWith("https://stackexchange.com/%2foauth%2fdialog%3fclient_id%3d202")) {
view.loadUrl(oauthUrl);
} else {
view.loadUrl(url);
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
if (oauthUrl != null && url.startsWith(StackUri.OAUTH_DIALOG_URL) && progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
} else {
/*
* Yahoo's login page does not seem to support horizontal scrolling
* inside webview, so enabling wide view port. Note good.
*/
if (url.startsWith(YAHOO_LOGIN_URL))
view.getSettings().setUseWideViewPort(true);
}
super.onPageFinished(view, url);
}
}
private void startSiteListActivity(WebView view) {
Intent listStackNetworkIntent = new Intent(view.getContext(), StackNetworkListActivity.class);
listStackNetworkIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
listStackNetworkIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
listStackNetworkIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(listStackNetworkIntent);
}
private void cacheAccessToken(String url) {
Uri uri = Uri.parse(url);
String accessToken = uri.getFragment();
if (accessToken != null) {
String[] nameValuePair = accessToken.split("=");
if (nameValuePair != null && nameValuePair.length == 2 && nameValuePair[0].equals(StringConstants.ACCESS_TOKEN)) {
AppUtils.setAccessToken(getApplicationContext(), nameValuePair[1]);
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
progressDialog = ProgressDialog.show(OAuthActivity.this, "", PROGRESS_BAR_TEXT);
setContentView(R.layout.webview);
WebView webview = initWebview();
Builder uriBuilder = Uri.parse(StackUri.OAUTH_DIALOG_URL).buildUpon();
uriBuilder.appendQueryParameter(StackUri.QueryParams.CLIENT_ID, StackUri.QueryParamDefaultValues.CLIENT_ID);
uriBuilder.appendQueryParameter(StackUri.QueryParams.REDIRECT_URI, StackUri.QueryParamDefaultValues.REDIRECT_URI);
uriBuilder.appendQueryParameter(StackUri.QueryParams.SCOPE, StackUri.QueryParamDefaultValues.SCOPE);
oauthUrl = uriBuilder.build().toString();
AppUtils.clearDefaultSite(getApplicationContext());
webview.loadUrl(oauthUrl);
}
@SuppressWarnings("deprecation")
@SuppressLint("SetJavaScriptEnabled")
private WebView initWebview() {
final WebView webview = (WebView) findViewById(R.id.web_view);
final ProgressBar progressBar = (ProgressBar) findViewById(R.id.webviewProgress);
webview.setVerticalScrollBarEnabled(true);
webview.setHorizontalScrollBarEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
if (!TEST_MODE) {
webview.getSettings().setSaveFormData(false);
webview.getSettings().setSavePassword(false);
}
webview.getSettings().setUseWideViewPort(false);
webview.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
setTitle("Loading...");
if (progress < 100 && progressBar.getVisibility() == ProgressBar.GONE) {
progressBar.setVisibility(ProgressBar.VISIBLE);
}
progressBar.setProgress(progress);
if (progress == 100) {
progressBar.setVisibility(ProgressBar.GONE);
setTitle(LOGIN);
}
}
});
webview.setWebViewClient(new OAuthWebViewClient());
webview.requestFocus(View.FOCUS_DOWN);
return webview;
}
}