package org.wordpress.android;
import java.util.Vector;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.wordpress.android.models.Blog;
import org.wordpress.android.util.EscapeUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.HttpAuthHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.Toast;
public class Read extends Activity {
/** Called when the activity is first created. */
public String[] authors;
public String[] comments;
private String httpuser = "";
private String httppassword = "";
private String loginURL = "";
private boolean loadReader = false;
private boolean loadAdmin = false;
private boolean isPage = false;
ImageButton backButton, forwardButton, refreshButton;
public ProgressDialog pd;
private WebView wv;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.reader);
// setProgressBarIndeterminateVisibility(true);
Bundle extras = getIntent().getExtras();
if (extras != null) {
loadReader = extras.getBoolean("loadReader");
loadAdmin = extras.getBoolean("loadAdmin");
}
if (WordPress.wpDB == null)
WordPress.wpDB = new WordPressDB(this);
if (WordPress.currentBlog == null) {
try {
WordPress.currentBlog = new Blog(
WordPress.wpDB.getLastBlogID(this), this);
} catch (Exception e) {
Toast.makeText(this, getResources().getText(R.string.blog_not_found), Toast.LENGTH_SHORT).show();
finish();
}
}
if (loadReader || loadAdmin) {
this.setTitle(getResources().getText(R.string.reader));
wv = (WebView) findViewById(R.id.webView);
wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
new loadReaderTask().execute(null, null, null, null);
} else {
if (isPage) {
this.setTitle(EscapeUtils.unescapeHtml(WordPress.currentBlog
.getBlogName())
+ " - "
+ getResources().getText(R.string.preview_page));
} else {
this.setTitle(EscapeUtils.unescapeHtml(WordPress.currentBlog
.getBlogName())
+ " - "
+ getResources().getText(R.string.preview_post));
}
loadPostFromPermalink();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
if (loadReader) {
menu.add(0, 0, 0, getResources().getText(R.string.home));
MenuItem menuItem = menu.findItem(0);
menuItem.setIcon(R.drawable.ic_menu_home);
menu.add(0, 1, 0, getResources().getText(R.string.view_in_browser));
menuItem = menu.findItem(1);
menuItem.setIcon(android.R.drawable.ic_menu_view);
menu.add(0, 2, 0, getResources().getText(R.string.refresh));
menuItem = menu.findItem(2);
menuItem.setIcon(R.drawable.ic_menu_refresh);
}
return true;
}
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case 0:
finish();
break;
case 1:
if (!wv.getUrl().contains("wp-login.php")) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(wv.getUrl()));
startActivity(i);
}
break;
case 2:
wv.reload();
new Thread(new Runnable() {
public void run() {
// refresh stat
try {
HttpClient httpclient = new DefaultHttpClient();
HttpProtocolParams.setUserAgent(httpclient.getParams(),
"wp-android");
String readerURL = Constants.readerURL + "/?template=stats&stats_name=home_page_refresh";
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4) {
readerURL += "&per_page=20";
}
httpclient.execute(new HttpGet(readerURL));
} catch (Exception e) {
// oh well
}
}
}).start();
break;
}
return false;
}
protected void loadPostFromPermalink() {
WebView wv = (WebView) findViewById(R.id.webView);
wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setJavaScriptEnabled(true);
wv.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
Read.this.setTitle("Loading...");
Read.this.setProgress(progress * 100);
if (progress == 100) {
if (isPage) {
Read.this.setTitle(EscapeUtils
.unescapeHtml(WordPress.currentBlog
.getBlogName())
+ " - "
+ getResources().getText(R.string.preview_page));
} else {
Read.this.setTitle(EscapeUtils
.unescapeHtml(WordPress.currentBlog
.getBlogName())
+ " - "
+ getResources().getText(R.string.preview_post));
}
}
}
});
wv.setWebViewClient(new WordPressWebViewClient());
if (WordPress.currentPost != null) {
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(WordPress.currentPost.getPermaLink());
} else {
String url = WordPress.currentPost.getPermaLink().replace(
"https:", "http:");
wv.loadUrl(url);
}
}
}
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 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) {
new Thread(new Runnable() {
public void run() {
try {
HttpClient httpclient = new DefaultHttpClient();
HttpProtocolParams.setUserAgent(httpclient.getParams(),
"wp-android");
String readerURL = Constants.readerURL + "/?template=stats&stats_name=home_page";
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4) {
readerURL += "&per_page=20";
}
httpclient.execute(new HttpGet(readerURL));
} catch (Exception e) {
// oh well
}
}
}).start();
}
@Override
protected Vector<?> doInBackground(String... args) {
if (WordPress.currentBlog == null) {
try {
WordPress.currentBlog = new Blog(
WordPress.wpDB.getLastBlogID(Read.this), Read.this);
} catch (Exception e) {
e.printStackTrace();
}
}
loginURL = WordPress.currentBlog.getUrl()
.replace("xmlrpc.php", "wp-login.php");
if (WordPress.currentBlog.getUrl().lastIndexOf("/") != -1)
loginURL = WordPress.currentBlog.getUrl().substring(0, WordPress.currentBlog.getUrl().lastIndexOf("/")) + "/wp-login.php";
else
loginURL = WordPress.currentBlog.getUrl().replace("xmlrpc.php", "wp-login.php");
String readerURL = Constants.readerURL;
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4) {
readerURL += "/?per_page=20";
}
if (loadAdmin) {
if (WordPress.currentBlog.getUrl().lastIndexOf("/") != -1)
readerURL = WordPress.currentBlog.getUrl().substring(0, WordPress.currentBlog.getUrl().lastIndexOf("/")) + "/wp-admin";
else
readerURL = WordPress.currentBlog.getUrl().replace("xmlrpc.php", "wp-admin");
}
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=\""
+ loginURL
+ "\" method=\"post\">"
+ "<input type=\"text\" name=\"log\" id=\"user_login\" value=\""
+ WordPress.currentBlog.getUsername()
+ "\"/></label>"
+ "<input type=\"password\" name=\"pwd\" id=\"user_pass\" value=\""
+ WordPress.currentBlog.getPassword()
+ "\" /></label>"
+ "<input type=\"submit\" name=\"wp-submit\" id=\"wp-submit\" value=\"Log In\" />"
+ "<input type=\"hidden\" name=\"redirect_to\" value=\""
+ readerURL + "\" />" + "</form>" + "</body>";
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view,
String url) {
view.loadUrl(url);
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
}
});
wv.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
Read.this.setTitle("Loading...");
Read.this.setProgress(progress * 100);
if (progress == 100) {
if (loadReader)
Read.this.setTitle(getResources().getText(
R.string.reader));
else
Read.this.setTitle(getResources().getText(
R.string.wp_admin));
}
}
});
wv.getSettings().setUserAgentString("wp-android");
wv.getSettings().setCacheMode(
WebSettings.LOAD_NO_CACHE);
wv.getSettings().setSavePassword(false);
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setPluginsEnabled(true);
wv.getSettings().setDomStorageEnabled(true);
wv.loadData(Uri.encode(responseContent), "text/html", HTTP.UTF_8);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
@Override
public boolean onKeyDown(int i, KeyEvent event) {
if (i == KeyEvent.KEYCODE_BACK) {
if (loadReader) {
if (wv.canGoBack()
&& !wv.getUrl().startsWith(Constants.readerURL)
&& !wv.getUrl().equals(loginURL)) {
wv.goBack();
} else {
finish();
}
} else {
finish();
}
}
return false;
}
}