// Copyright (C) 2012 LMIT Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.lmit.jenkins.android.activity;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.webkit.HttpAuthHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.lmit.jenkins.android.activity.R;
import com.lmit.jenkins.android.addon.LocalStorage;
import com.lmit.jenkins.android.configuration.Configuration;
import com.lmit.jenkinscloud.commons.JenkinsCloudPage;
public class BrowserDisplay extends Activity {
private WebView myWebView;
private String url;
private boolean running;
private Menu actionMenu;
private static final int MENU_STOP_REFRESH = 1;
private boolean showStopReloadControls = true;
private JenkinsCloudPage htmlPage;
private String title;
private MenuItem menuItem;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (showStopReloadControls) {
actionMenu = menu;
if (running) {
menuItem = menu.add(0, MENU_STOP_REFRESH, 0, getText(R.string.stop));
menuItem.setIcon(
R.drawable.navigation_cancel_dark);
} else {
menuItem = menu.add(0, MENU_STOP_REFRESH, 0, getText(R.string.reload));
menuItem.setIcon(
R.drawable.refresh_dark);
}
return true;
} else {
return false;
}
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
super.onMenuItemSelected(featureId, item);
if (!running) {
// we are stopped, restart
setProgressBarIndeterminateVisibility(true);
setProgressBarVisibility(true);
running = true;
item.setTitle(R.string.stop);
menuItem.setIcon(
R.drawable.navigation_cancel_dark);
myWebView.reload();
} else {
myWebView.stopLoading();
setProgressBarIndeterminateVisibility(false);
setProgressBarVisibility(false);
running = false;
item.setTitle(R.string.reload);
menuItem.setIcon(
R.drawable.refresh_dark);
}
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
requestWindowFeature(Window.FEATURE_PROGRESS);
showStopReloadControls =
getIntent().getBooleanExtra("showStopReloadControls", true);
url = getIntent().getStringExtra("url");
title = getIntent().getStringExtra("title");
htmlPage = LocalStorage.getInstance().getPage(url);
myWebView = new WebView(this);
setContentView(myWebView);
setProgressBarIndeterminateVisibility(true);
setProgressBarVisibility(true);
if (title != null) {
setTitle(title);
} else {
try {
setTitle(new URL(url).getFile());
} catch (MalformedURLException e) {
setTitle(url);
}
}
running = true;
new WebViewTask(this).execute();
}
private class WebViewTask extends AsyncTask<Void, Void, Boolean> {
Activity parent;
public WebViewTask(Activity parent) {
this.parent = parent;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected Boolean doInBackground(Void... param) {
SystemClock.sleep(1000);
return false;
}
@Override
protected void onPostExecute(Boolean result) {
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setUseWideViewPort(true);
myWebView.setPadding(0, 0, 0, 0);
myWebView.setInitialScale(100);
myWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
parent.setProgress(progress * 100);
}
});
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm) {
String username = Configuration.getInstance().getUsername();
String password = Configuration.getInstance().getPassword();
handler.proceed(username, password);
}
@Override
public void onPageFinished(WebView view, String url) {
running = false;
if (actionMenu != null) {
actionMenu.getItem(0).setTitle(R.string.reload);
}
}
});
if (htmlPage == null) {
if (!url.startsWith("http")) {
String hudsonHostname = Configuration.getInstance()
.getHudsonHostname();
if (!hudsonHostname.endsWith("/") && !url.startsWith("/")) {
url = "/" + url;
} else if (hudsonHostname.endsWith("/")
&& url.startsWith("/")) {
url = url.substring(1);
}
url = hudsonHostname + url;
}
myWebView.loadUrl(url);
} else {
String[] contentTypeParts = htmlPage.contentType.split(";");
String contentType = contentTypeParts[0].trim();
String charSet = "utf-8";
for (int i = 1; i < contentTypeParts.length; i++) {
String contentTypePart = contentTypeParts[i].trim();
if (contentTypePart.startsWith("charset=")) {
charSet = contentTypePart.substring(contentTypePart
.indexOf('=') + 1);
}
}
myWebView.loadDataWithBaseURL(url, htmlPage.html, contentType, charSet, null);
}
}
}
}