You are viewing a plain text version of this content. The canonical link for it is here.
Posted to photark-commits@incubator.apache.org by bh...@apache.org on 2012/08/13 09:20:06 UTC
svn commit: r1372338 - in
/incubator/photark/mobile/trunk/src/main/java/com/phonegap: ./ plugins/
plugins/childBrowser/ plugins/childBrowser/ChildBrowser.java
Author: bhargav
Date: Mon Aug 13 09:20:05 2012
New Revision: 1372338
URL: http://svn.apache.org/viewvc?rev=1372338&view=rev
Log:
Adding the modified src folder
Added:
incubator/photark/mobile/trunk/src/main/java/com/phonegap/
incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/
incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/childBrowser/
incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/childBrowser/ChildBrowser.java
Added: incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/childBrowser/ChildBrowser.java
URL: http://svn.apache.org/viewvc/incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/childBrowser/ChildBrowser.java?rev=1372338&view=auto
==============================================================================
--- incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/childBrowser/ChildBrowser.java (added)
+++ incubator/photark/mobile/trunk/src/main/java/com/phonegap/plugins/childBrowser/ChildBrowser.java Mon Aug 13 09:20:05 2012
@@ -0,0 +1,463 @@
+/*
+ * PhoneGap is available under *either* the terms of the modified BSD license *or* the
+ * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
+ *
+ * Copyright (c) 2005-2011, Nitobi Software Inc.
+ * Copyright (c) 2010-2011, IBM Corporation
+ */
+package com.phonegap.plugins.childBrowser;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.cordova.api.Plugin;
+import org.apache.cordova.api.PluginResult;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.R;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.text.InputType;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+
+public class ChildBrowser extends Plugin {
+
+ protected static final String LOG_TAG = "ChildBrowser";
+ private static int CLOSE_EVENT = 0;
+ private static int LOCATION_CHANGED_EVENT = 1;
+
+ private String browserCallbackId = null;
+
+ private Dialog dialog;
+ private WebView webview;
+ private EditText edittext;
+ private boolean showLocationBar = true;
+
+ /**
+ * Executes the request and returns PluginResult.
+ *
+ * @param action The action to execute.
+ * @param args JSONArry of arguments for the plugin.
+ * @param callbackId The callback id used when calling back into JavaScript.
+ * @return A PluginResult object with a status and message.
+ */
+ public PluginResult execute(String action, JSONArray args, String callbackId) {
+ PluginResult.Status status = PluginResult.Status.OK;
+ String result = "";
+
+ try {
+ if (action.equals("showWebPage")) {
+ this.browserCallbackId = callbackId;
+
+ // If the ChildBrowser is already open then throw an error
+ if (dialog != null && dialog.isShowing()) {
+ return new PluginResult(PluginResult.Status.ERROR, "ChildBrowser is already open");
+ }
+
+ result = this.showWebPage(args.getString(0), args.optJSONObject(1));
+
+ if (result.length() > 0) {
+ status = PluginResult.Status.ERROR;
+ return new PluginResult(status, result);
+ } else {
+ PluginResult pluginResult = new PluginResult(status, result);
+ pluginResult.setKeepCallback(true);
+ return pluginResult;
+ }
+ }
+ else if (action.equals("close")) {
+ closeDialog();
+
+ JSONObject obj = new JSONObject();
+ obj.put("type", CLOSE_EVENT);
+
+ PluginResult pluginResult = new PluginResult(status, obj);
+ pluginResult.setKeepCallback(false);
+ return pluginResult;
+ }
+ else if (action.equals("openExternal")) {
+ result = this.openExternal(args.getString(0), args.optBoolean(1));
+ if (result.length() > 0) {
+ status = PluginResult.Status.ERROR;
+ }
+ }
+ else {
+ status = PluginResult.Status.INVALID_ACTION;
+ }
+ return new PluginResult(status, result);
+ } catch (JSONException e) {
+ return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
+ }
+ }
+
+ /**
+ * Display a new browser with the specified URL.
+ *
+ * @param url The url to load.
+ * @param usePhoneGap Load url in PhoneGap webview
+ * @return "" if ok, or error message.
+ */
+ public String openExternal(String url, boolean usePhoneGap) {
+ try {
+ Intent intent = null;
+ if (usePhoneGap) {
+ intent = new Intent().setClass(this.ctx.getContext(), org.apache.cordova.DroidGap.class);
+ intent.setData(Uri.parse(url)); // This line will be removed in future.
+ intent.putExtra("url", url);
+
+ // Timeout parameter: 60 sec max - May be less if http device timeout is less.
+ intent.putExtra("loadUrlTimeoutValue", 60000);
+
+ // These parameters can be configured if you want to show the loading dialog
+ intent.putExtra("loadingDialog", "Wait,Loading web page..."); // show loading dialog
+ intent.putExtra("hideLoadingDialogOnPageLoad", true); // hide it once page has completely loaded
+ }
+ else {
+ intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse(url));
+ }
+ this.ctx.startActivity(intent);
+ return "";
+ } catch (android.content.ActivityNotFoundException e) {
+ Log.d(LOG_TAG, "ChildBrowser: Error loading url "+url+":"+ e.toString());
+ return e.toString();
+ }
+ }
+
+ /**
+ * Closes the dialog
+ */
+ private void closeDialog() {
+ if (dialog != null) {
+ dialog.dismiss();
+ }
+ }
+
+ /**
+ * Checks to see if it is possible to go back one page in history, then does so.
+ */
+ private void goBack() {
+ if (this.webview.canGoBack()) {
+ this.webview.goBack();
+ }
+ }
+
+ /**
+ * Checks to see if it is possible to go forward one page in history, then does so.
+ */
+ private void goForward() {
+ if (this.webview.canGoForward()) {
+ this.webview.goForward();
+ }
+ }
+
+ /**
+ * Navigate to the new page
+ *
+ * @param url to load
+ */
+ private void navigate(String url) {
+ InputMethodManager imm = (InputMethodManager)this.ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(edittext.getWindowToken(), 0);
+
+ if (!url.startsWith("http") && !url.startsWith("file:")) {
+ this.webview.loadUrl("http://" + url);
+ } else {
+ this.webview.loadUrl(url);
+ }
+ this.webview.requestFocus();
+ }
+
+
+ /**
+ * Should we show the location bar?
+ *
+ * @return boolean
+ */
+ private boolean getShowLocationBar() {
+ return this.showLocationBar;
+ }
+
+ /**
+ * Display a new browser with the specified URL.
+ *
+ * @param url The url to load.
+ * @param jsonObject
+ */
+ public String showWebPage(final String url, JSONObject options) {
+ // Determine if we should hide the location bar.
+ if (options != null) {
+ showLocationBar = options.optBoolean("showLocationBar", true);
+ }
+
+ // Create dialog in new thread
+ Runnable runnable = new Runnable() {
+ /**
+ * Convert our DIP units to Pixels
+ *
+ * @return int
+ */
+ private int dpToPixels(int dipValue) {
+ int value = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP,
+ (float) dipValue,
+ ctx.getContext().getResources().getDisplayMetrics()
+ );
+
+ return value;
+ }
+
+ public void run() {
+ // Let's create the main dialog
+ dialog = new Dialog(ctx.getContext(), android.R.style.Theme_NoTitleBar);
+ dialog.getWindow().getAttributes().windowAnimations = android.R.style.Animation_Dialog;
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ dialog.setCancelable(true);
+ dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ public void onDismiss(DialogInterface dialog) {
+ try {
+ JSONObject obj = new JSONObject();
+ obj.put("type", CLOSE_EVENT);
+
+ sendUpdate(obj, false);
+ } catch (JSONException e) {
+ Log.d(LOG_TAG, "Should never happen");
+ }
+ }
+ });
+
+ // Main container layout
+ LinearLayout main = new LinearLayout(ctx.getContext());
+ main.setOrientation(LinearLayout.VERTICAL);
+
+ // Toolbar layout
+ RelativeLayout toolbar = new RelativeLayout(ctx.getContext());
+ toolbar.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, this.dpToPixels(44)));
+ toolbar.setPadding(this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2));
+ toolbar.setHorizontalGravity(Gravity.LEFT);
+ toolbar.setVerticalGravity(Gravity.TOP);
+
+ // Action Button Container layout
+ RelativeLayout actionButtonContainer = new RelativeLayout(ctx.getContext());
+ actionButtonContainer.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
+ actionButtonContainer.setHorizontalGravity(Gravity.LEFT);
+ actionButtonContainer.setVerticalGravity(Gravity.CENTER_VERTICAL);
+ actionButtonContainer.setId(1);
+
+ // Back button
+ ImageButton back = new ImageButton(ctx.getContext());
+ RelativeLayout.LayoutParams backLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
+ backLayoutParams.addRule(RelativeLayout.ALIGN_LEFT);
+ back.setLayoutParams(backLayoutParams);
+ back.setContentDescription("Back Button");
+ back.setId(2);
+ try {
+ back.setImageBitmap(loadDrawable("www/childbrowser/icon_arrow_left.png"));
+ } catch (IOException e) {
+ Log.e(LOG_TAG, e.getMessage(), e);
+ }
+ back.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ goBack();
+ }
+ });
+
+ // Forward button
+ ImageButton forward = new ImageButton(ctx.getContext());
+ RelativeLayout.LayoutParams forwardLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
+ forwardLayoutParams.addRule(RelativeLayout.RIGHT_OF, 2);
+ forward.setLayoutParams(forwardLayoutParams);
+ forward.setContentDescription("Forward Button");
+ forward.setId(3);
+ try {
+ forward.setImageBitmap(loadDrawable("www/childbrowser/icon_arrow_right.png"));
+ } catch (IOException e) {
+ Log.e(LOG_TAG, e.getMessage(), e);
+ }
+ forward.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ goForward();
+ }
+ });
+
+ // Edit Text Box
+ edittext = new EditText(ctx.getContext());
+ RelativeLayout.LayoutParams textLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+ textLayoutParams.addRule(RelativeLayout.RIGHT_OF, 1);
+ textLayoutParams.addRule(RelativeLayout.LEFT_OF, 5);
+ edittext.setLayoutParams(textLayoutParams);
+ edittext.setId(4);
+ edittext.setSingleLine(true);
+ edittext.setText(url);
+ edittext.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
+ edittext.setImeOptions(EditorInfo.IME_ACTION_GO);
+ edittext.setInputType(InputType.TYPE_NULL); // Will not except input... Makes the text NON-EDITABLE
+ edittext.setOnKeyListener(new View.OnKeyListener() {
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ // If the event is a key-down event on the "enter" button
+ if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
+ navigate(edittext.getText().toString());
+ return true;
+ }
+ return false;
+ }
+ });
+
+ // Close button
+ ImageButton close = new ImageButton(ctx.getContext());
+ RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT);
+ closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+ close.setLayoutParams(closeLayoutParams);
+ forward.setContentDescription("Close Button");
+ close.setId(5);
+ try {
+ close.setImageBitmap(loadDrawable("www/childbrowser/icon_close.png"));
+ } catch (IOException e) {
+ Log.e(LOG_TAG, e.getMessage(), e);
+ }
+ close.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ closeDialog();
+ }
+ });
+
+ // WebView
+ webview = new WebView(ctx.getContext());
+ webview.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ webview.setWebChromeClient(new WebChromeClient());
+ WebViewClient client = new ChildBrowserClient(edittext);
+ webview.setWebViewClient(client);
+ WebSettings settings = webview.getSettings();
+ settings.setJavaScriptEnabled(true);
+ settings.setJavaScriptCanOpenWindowsAutomatically(true);
+ settings.setBuiltInZoomControls(true);
+ settings.setPluginsEnabled(true);
+ settings.setDomStorageEnabled(true);
+ webview.loadUrl(url);
+ webview.setId(6);
+ webview.getSettings().setLoadWithOverviewMode(true);
+ webview.getSettings().setUseWideViewPort(true);
+ webview.requestFocus();
+ webview.requestFocusFromTouch();
+
+ // Add the back and forward buttons to our action button container layout
+ actionButtonContainer.addView(back);
+ actionButtonContainer.addView(forward);
+
+ // Add the views to our toolbar
+ toolbar.addView(actionButtonContainer);
+ toolbar.addView(edittext);
+ toolbar.addView(close);
+
+ // Don't add the toolbar if its been disabled
+ if (getShowLocationBar()) {
+ // Add our toolbar to our main view/layout
+ main.addView(toolbar);
+ }
+
+ // Add our webview to our main view/layout
+ main.addView(webview);
+
+ WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
+ lp.copyFrom(dialog.getWindow().getAttributes());
+ lp.width = WindowManager.LayoutParams.FILL_PARENT;
+ lp.height = WindowManager.LayoutParams.FILL_PARENT;
+
+ dialog.setContentView(main);
+ dialog.show();
+ dialog.getWindow().setAttributes(lp);
+ }
+
+ private Bitmap loadDrawable(String filename) throws java.io.IOException {
+ InputStream input = ctx.getAssets().open(filename);
+ return BitmapFactory.decodeStream(input);
+ }
+ };
+ this.ctx.runOnUiThread(runnable);
+ return "";
+ }
+
+ /**
+ * Create a new plugin result and send it back to JavaScript
+ *
+ * @param obj a JSONObject contain event payload information
+ */
+ private void sendUpdate(JSONObject obj, boolean keepCallback) {
+ if (this.browserCallbackId != null) {
+ PluginResult result = new PluginResult(PluginResult.Status.OK, obj);
+ result.setKeepCallback(keepCallback);
+ this.success(result, this.browserCallbackId);
+ }
+ }
+
+ /**
+ * The webview client receives notifications about appView
+ */
+ public class ChildBrowserClient extends WebViewClient {
+ EditText edittext;
+
+ /**
+ * Constructor.
+ *
+ * @param mContext
+ * @param edittext
+ */
+ public ChildBrowserClient(EditText mEditText) {
+ this.edittext = mEditText;
+ }
+
+ /**
+ * Notify the host application that a page has started loading.
+ *
+ * @param view The webview initiating the callback.
+ * @param url The url of the page.
+ */
+ @Override
+ public void onPageStarted(WebView view, String url, Bitmap favicon) {
+ super.onPageStarted(view, url, favicon);
+ String newloc;
+ if (url.startsWith("http:") || url.startsWith("https:") || url.startsWith("file:")) {
+ newloc = url;
+ } else {
+ newloc = "http://" + url;
+ }
+
+ if (!newloc.equals(edittext.getText().toString())) {
+ edittext.setText(newloc);
+ }
+
+ try {
+ JSONObject obj = new JSONObject();
+ obj.put("type", LOCATION_CHANGED_EVENT);
+ obj.put("location", url);
+
+ sendUpdate(obj, true);
+ } catch (JSONException e) {
+ Log.d("ChildBrowser", "This should never happen");
+ }
+ }
+ }
+}
\ No newline at end of file