package kr.kdev.dg1s.biowiki.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.wordpress.passcodelock.AppLockManager;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.util.Map;
import kr.kdev.dg1s.biowiki.BioWiki;
import kr.kdev.dg1s.biowiki.R;
import kr.kdev.dg1s.biowiki.models.Blog;
import kr.kdev.dg1s.biowiki.util.AppLog;
import kr.kdev.dg1s.biowiki.util.BWWebChromeClient;
import kr.kdev.dg1s.biowiki.util.BWWebViewClient;
/**
* Activity for displaying WordPress content in a webview which may require authentication.
* Currently, this activity can only load content for the {@link kr.kdev.dg1s.biowiki.BioWiki.currentBlog}.
*/
public class AuthenticatedWebViewActivity extends WebViewActivity {
public static final String LOAD_AUTHENTICATED_URL = "loadAuthenticatedUrl";
/**
* Blog for which this activity is loading content.
*/
protected Blog mBlog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBlog = BioWiki.getCurrentBlog();
if (mBlog == null) {
Toast.makeText(this, getResources().getText(R.string.blog_not_found),
Toast.LENGTH_SHORT).show();
finish();
}
mWebView.setWebViewClient(new BWWebViewClient(mBlog));
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
mWebView.getSettings().setSavePassword(false);
Bundle extras = getIntent().getExtras();
if (extras != null && extras.containsKey(LOAD_AUTHENTICATED_URL)) {
String authUrl = extras.getString(LOAD_AUTHENTICATED_URL);
loadAuthenticatedUrl(authUrl);
}
mWebView.setWebChromeClient(new BWWebChromeClient(this, (ProgressBar) findViewById(R.id.progress_bar)));
}
/**
* Get the URL of the WordPress login page.
*
* @return URL of the login page.
*/
protected String getLoginUrl() {
String loginURL = null;
Gson gson = new Gson();
Type type = new TypeToken<Map<?, ?>>() {
}.getType();
Map<?, ?> blogOptions = gson.fromJson(mBlog.getBlogOptions(), type);
if (blogOptions != null) {
Map<?, ?> homeURLMap = (Map<?, ?>) blogOptions.get("login_url");
if (homeURLMap != null)
loginURL = homeURLMap.get("value").toString();
}
// Try to guess the login URL if blogOptions is null (blog not added to the app), or WP version is < 3.6
if (loginURL == null) {
if (mBlog.getUrl().lastIndexOf("/") != -1) {
return mBlog.getUrl().substring(0, mBlog.getUrl().lastIndexOf("/"))
+ "/wp-login.php";
} else {
return mBlog.getUrl().replace("xmlrpc.php", "wp-login.php");
}
}
return loginURL;
}
/**
* Login to the BioWiki blog and load the specified URL.
*
* @param url URL to be loaded in the webview.
*/
protected void loadAuthenticatedUrl(String url) {
try {
String postData = String.format("log=%s&pwd=%s&redirect_to=%s",
URLEncoder.encode(mBlog.getUsername(), "UTF-8"), URLEncoder.encode(mBlog.getPassword(), "UTF-8"),
URLEncoder.encode(url, "UTF-8"));
mWebView.postUrl(getLoginUrl(), postData.getBytes());
} catch (UnsupportedEncodingException e) {
AppLog.e(AppLog.T.UTILS, e);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.webview, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (mWebView == null)
return false;
int itemID = item.getItemId();
if (itemID == R.id.menu_refresh) {
mWebView.reload();
return true;
} else if (itemID == R.id.menu_share) {
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, mWebView.getUrl());
startActivity(Intent.createChooser(share, getResources().getText(R.string.share_link)));
return true;
} else if (itemID == R.id.menu_browser) {
String url = mWebView.getUrl();
if (url != null) {
Uri uri = Uri.parse(url);
if (uri != null) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(uri);
startActivity(i);
AppLockManager.getInstance().setExtendedTimeout();
}
}
return true;
}
return super.onOptionsItemSelected(item);
}
}