package org.wordpress.android.ui; import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; import java.net.URLEncoder; import java.util.Map; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.webkit.HttpAuthHandler; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.justsystems.hpb.pad.R; import org.wordpress.android.Constants; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; /** * Basic activity for displaying a WebView. */ public class DashboardActivity extends SherlockActivity { /** Primary webview used to display content. */ protected WebView mWebView; /** * Blog for which this activity is loading content. */ protected Blog mBlog; @Override public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_PROGRESS); super.onCreate(savedInstanceState); setContentView(R.layout.webview); getSupportActionBar().setDisplayHomeAsUpEnabled(true); setTitle(R.string.view_admin); ActionBar ab = getSupportActionBar(); ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); ab.setDisplayShowTitleEnabled(true); mWebView = (WebView) findViewById(R.id.webView); mWebView.getSettings().setUserAgentString(Constants.USER_AGENT); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); Bundle extras = getIntent().getExtras(); if (extras.containsKey("blogID")) { try { mBlog = new Blog(extras.getInt("blogID", -1)); } catch (Exception e) { mBlog = WordPress.getCurrentBlog(); } } if (mBlog == null) { Toast.makeText(this, getResources().getText(R.string.blog_not_found), Toast.LENGTH_SHORT).show(); finish(); } mWebView.setWebViewClient(new WordPressWebViewClient(mBlog)); mWebView.setWebChromeClient(new WordPressWebChromeClient(this)); mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); mWebView.getSettings().setSavePassword(false); loadDashboard(); } @Override protected void onResume() { super.onResume(); // Friendly reminder that they are in the dashboard :) Toast.makeText(this, getString(R.string.dashboard_tip), Toast.LENGTH_LONG).show(); } private void loadDashboard() { String dashboardUrl = 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("admin_url"); if (homeURLMap != null) dashboardUrl = homeURLMap.get("value").toString(); } // Try to guess the URL of the dashboard if blogOptions is null (blog not added to the app), or WP version is < 3.6 if (dashboardUrl == null) { if (mBlog.getUrl().lastIndexOf("/") != -1) { dashboardUrl = mBlog.getUrl().substring(0, mBlog.getUrl().lastIndexOf("/")) + "/wp-admin"; } else { dashboardUrl = mBlog.getUrl().replace("xmlrpc.php", "wp-admin"); } } loadAuthenticatedUrl(dashboardUrl); } /** * Load the specified URL in the webview. * * @param url * URL to load in the webview. */ protected void loadUrl(String url) { mWebView.loadUrl(url); } @Override public void onBackPressed() { if (mWebView != null && mWebView.canGoBack()) mWebView.goBack(); else super.onBackPressed(); } /** * Get the URL of the WordPress login page. * * @return URL of the login page. */ protected String getLoginUrl() { 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"); } } /** * Login to the WordPress 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", mBlog.getUsername(), mBlog.getPassword(), URLEncoder.encode(url, "UTF-8")); mWebView.postUrl(getLoginUrl(), postData.getBytes()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** * WebChromeClient that displays "Loading..." title until the content of the * webview is fully loaded. */ protected class WordPressWebChromeClient extends WebChromeClient { private Context context; public WordPressWebChromeClient(Context context) { this.context = context; } public void onProgressChanged(WebView webView, int progress) { setTitle(context.getResources().getText(R.string.loading)); setSupportProgress(progress * 100); if (progress == 100) { setTitle(webView.getTitle()); } } } /** * WebViewClient that is capable of handling HTTP authentication requests * using the HTTP username and password of the blog configured for this * activity. */ private class WordPressWebViewClient extends WebViewClient { private Blog blog; WordPressWebViewClient(Blog blog) { super(); this.blog = blog; } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { } @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { handler.proceed(blog.getHttpuser(), blog.getHttppassword()); } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.dashboard, 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_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); } } return true; } else if (itemID == android.R.id.home) { finish(); } return super.onOptionsItemSelected(item); } }