package ryan.org.wordpress.android; import java.util.HashMap; import java.util.Vector; import org.apache.http.protocol.HTTP; import ryan.org.wordpress.android.R; import ryan.org.wordpress.android.util.EscapeUtils; import ryan.org.xmlrpc.android.XMLRPCClient; import ryan.org.xmlrpc.android.XMLRPCException; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.res.Configuration; import android.net.http.SslError; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.Window; import android.webkit.HttpAuthHandler; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.ImageButton; import android.widget.Toast; public class ViewPost extends Activity { /** Called when the activity is first created. */ private XMLRPCClient client; public String[] authors; public String[] comments; private int id; private String postID = ""; private String accountName = ""; private String httpuser = ""; private String httppassword = ""; private boolean loadReader = false; private boolean isPage = false; ImageButton backButton, forwardButton; public ProgressDialog pd; private WebView wv; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.viewpost); //setProgressBarIndeterminateVisibility(true); Bundle extras = getIntent().getExtras(); if(extras !=null) { id = WordPress.currentBlog.getId(); postID = extras.getString("postID"); accountName = extras.getString("accountName"); isPage = extras.getBoolean("isPage"); loadReader = extras.getBoolean("loadReader"); } if (loadReader) { this.setTitle(getResources().getText(R.string.reader)); wv = (WebView) findViewById(R.id.webView); wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); backButton = (ImageButton) findViewById(R.id.browserBack); backButton.setVisibility(View.VISIBLE); backButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { wv.goBack(); } }); forwardButton = (ImageButton) findViewById(R.id.browserForward); forwardButton.setVisibility(View.VISIBLE); forwardButton.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { wv.goForward(); } }); new loadReaderTask().execute(null, null, null, null); } else { if (isPage){ this.setTitle(EscapeUtils.unescapeHtml(accountName) + " - " + getResources().getText(R.string.preview_page)); } else{ this.setTitle(EscapeUtils.unescapeHtml(accountName) + " - " + getResources().getText(R.string.preview_post)); } Thread t = new Thread() { public void run() { loadPostFromPermalink(); } }; t.start(); } } protected void loadPostFromPermalink() { WordPressDB settingsDB = new WordPressDB(this); Vector<?> settings = settingsDB.loadSettings(this, id); String username = settings.get(2).toString(); String password = settings.get(3).toString(); httpuser = settings.get(4).toString(); httppassword = settings.get(5).toString(); String url = settings.get(0).toString(); client = new XMLRPCClient(url, httpuser, httppassword); Object[] vParams = { postID, username, password }; Object versionResult = new Object(); try { versionResult = (Object) client.call("metaWeblog.getPost", vParams); } catch (XMLRPCException e) { //e.printStackTrace(); } String permaLink = null, status = "", html = ""; if (versionResult != null){ try { HashMap<?, ?> contentHash = (HashMap<?, ?>) versionResult; permaLink = contentHash.get("permaLink").toString(); status = contentHash.get("post_status").toString(); html = contentHash.get("description").toString(); } catch (Exception e) { } } displayResults(permaLink, html, status); } private void displayResults(final String permaLink, final String html, final String status) { Thread t = new Thread() { public void run() { if (permaLink != null){ WebView wv = (WebView) findViewById(R.id.webView); wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); //pretend we're a desktop browser //wv.getSettings().setUserAgentString("Mozilla/5.0 (Linux) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17"); wv.getSettings().setBuiltInZoomControls(true); wv.getSettings().setJavaScriptEnabled(true); wv.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { ViewPost.this.setTitle("Loading..."); ViewPost.this.setProgress(progress * 100); if(progress == 100){ if (isPage){ ViewPost.this.setTitle(EscapeUtils.unescapeHtml(accountName) + " - " + getResources().getText(R.string.preview_page)); } else{ ViewPost.this.setTitle(EscapeUtils.unescapeHtml(accountName) + " - " + getResources().getText(R.string.preview_post)); } } } }); wv.setWebViewClient(new WordPressWebViewClient()); if (status.equals("publish")){ int sdk_int = 0; try { sdk_int = Integer.valueOf(android.os.Build.VERSION.SDK); } catch (Exception e1) { sdk_int = 3; //assume they are on cupcake } if (sdk_int >= 8){ //only 2.2 devices can load https correctly wv.loadUrl(permaLink); } else{ String url = permaLink.replace("https:", "http:"); wv.loadUrl(url); } } else{ wv.loadData(html, "text/html", "utf-8"); Toast.makeText(ViewPost.this, getResources().getText(R.string.basic_html), Toast.LENGTH_SHORT).show(); } } else{ setProgressBarIndeterminateVisibility(false); AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(ViewPost.this); dialogBuilder.setTitle(getResources().getText(R.string.connection_error)); dialogBuilder.setMessage(getResources().getText(R.string.permalink_not_found)); dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Just close the window. } }); dialogBuilder.setCancelable(true); if (!isFinishing()) { dialogBuilder.create().show(); } } } }; this.runOnUiThread(t); } private class WordPressWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url){ //setProgressBarIndeterminateVisibility(false); view.clearCache(true); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){ handler.proceed(); } @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { handler.proceed(httpuser, httppassword); } } @Override public void onConfigurationChanged(Configuration newConfig) { //ignore orientation change super.onConfigurationChanged(newConfig); } private class loadReaderTask extends AsyncTask<String, Void, Vector<?>> { protected void onPostExecute(Vector<?> result) { } @Override protected Vector<?> doInBackground(String... args) { WordPressDB settingsDB = new WordPressDB(ViewPost.this); Vector<?> settings = settingsDB.loadSettings(ViewPost.this, id); try { String responseContent = "<head>" +"<script type=\"text/javascript\">" +"function submitform(){document.loginform.submit();} </script>" +"</head>" +"<body onload=\"submitform()\">" + "<form style=\"visibility:hidden;\" name=\"loginform\" id=\"loginform\" action=\"" + settings.get(0).toString().replace("xmlrpc.php", "wp-login.php") + "\" method=\"post\">" + "<input type=\"text\" name=\"log\" id=\"user_login\" value=\""+settings.get(2).toString()+"\"/></label>" + "<input type=\"password\" name=\"pwd\" id=\"user_pass\" value=\""+settings.get(3).toString()+"\" /></label>" + "<input type=\"submit\" name=\"wp-submit\" id=\"wp-submit\" value=\"Log In\" />" + "<input type=\"hidden\" name=\"redirect_to\" value=\""+"http://wordpress.com/reader/mobile"+"\" />" + "</form>" +"</body>"; wv.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url){ view.loadUrl(url); return false; } }); wv.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { ViewPost.this.setTitle("Loading..."); ViewPost.this.setProgress(progress * 100); if(progress == 100){ ViewPost.this.setTitle(getResources().getText(R.string.reader)); //commenting out for now, may not be possible to support this with the WP.com reader /*if (wv.getTitle() != null) { if (!wv.canGoBack() || wv.getTitle().equals("WordPress.com Mobile Reader � WordPress.com")) { backButton.setEnabled(false); } else { backButton.setEnabled(true); } if (!wv.canGoForward()) { forwardButton.setEnabled(false); } else { forwardButton.setEnabled(true); } }*/ } } }); wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); wv.getSettings().setBuiltInZoomControls(true); wv.getSettings().setJavaScriptEnabled(true); wv.loadData(responseContent, "text/html", HTTP.UTF_8); } catch (Exception ex) { ex.printStackTrace(); } return null; } } }