Merge pull request #258 from dpa99c/CB-13791
CB-13791: (android) Add Android support for a footer close button
diff --git a/README.md b/README.md
index 7a2ec96..936f1dc 100644
--- a/README.md
+++ b/README.md
@@ -112,9 +112,13 @@
- __hidden__: set to `yes` to create the browser and load the page, but not show it. The loadstop event fires when loading is complete. Omit or set to `no` (default) to have the browser open and load normally.
- __clearcache__: set to `yes` to have the browser's cookie cache cleared before the new window is opened
- __clearsessioncache__: set to `yes` to have the session cookie cache cleared before the new window is opened
- - __closebuttoncaption__: set to a string to use as the close buttons caption instead of a X. Note that you need to localize this value yourself.
+ - __closebuttoncaption__: set to a string to use as the close button's caption instead of a X. Note that you need to localize this value yourself.
- __closebuttoncolor__: set to a valid hex color string, for example: `#00ff00`, and it will change the
close button color from default, regardless of being a text or default X. Only has effect if user has location set to `yes`.
+ - __footer__: set to `yes` to show a close button in the footer similar to the iOS __Done__ button.
+ The close button will appear the same as for the header hence use __closebuttoncaption__ and __closebuttoncolor__ to set its properties.
+ - __footercolor__: set to a valid hex color string, for example `#00ff00` or `#CC00ff00` (`#aarrggbb`) , and it will change the footer color from default.
+ Only has effect if user has __footer__ set to `yes`.
- __hardwareback__: set to `yes` to use the hardware back button to navigate backwards through the `InAppBrowser`'s history. If there is no previous page, the `InAppBrowser` will close. The default value is `yes`, so you must set it to `no` if you want the back button to simply close the InAppBrowser.
- __hidenavigationbuttons__: set to `yes` to hide the navigation buttons on the location toolbar, only has effect if user has location set to `yes`. The default value is `no`.
- __hideurlbar__: set to `yes` to hide the url bar on the location toolbar, only has effect if user has location set to `yes`. The default value is `no`.
diff --git a/src/android/InAppBrowser.java b/src/android/InAppBrowser.java
index 8f937fb..2b0dbe0 100644
--- a/src/android/InAppBrowser.java
+++ b/src/android/InAppBrowser.java
@@ -103,8 +103,10 @@
private static final String HIDE_NAVIGATION = "hidenavigationbuttons";
private static final String NAVIGATION_COLOR = "navigationbuttoncolor";
private static final String HIDE_URL = "hideurlbar";
+ private static final String FOOTER = "footer";
+ private static final String FOOTER_COLOR = "footercolor";
- private static final List customizableOptions = Arrays.asList(CLOSE_BUTTON_CAPTION, TOOLBAR_COLOR, NAVIGATION_COLOR, CLOSE_BUTTON_COLOR);
+ private static final List customizableOptions = Arrays.asList(CLOSE_BUTTON_CAPTION, TOOLBAR_COLOR, NAVIGATION_COLOR, CLOSE_BUTTON_COLOR, FOOTER_COLOR);
private InAppBrowserDialog dialog;
private WebView inAppWebView;
@@ -129,6 +131,8 @@
private boolean hideNavigationButtons = false;
private String navigationButtonColor = "";
private boolean hideUrlBar = false;
+ private boolean showFooter = false;
+ private String footerColor = "";
/**
* Executes the request and returns PluginResult.
@@ -397,11 +401,9 @@
option = new StringTokenizer(features.nextToken(), "=");
if (option.hasMoreElements()) {
String key = option.nextToken();
- String value = null;
- if (customizableOptions.contains(key)) value = option.nextToken();
- else {
- String token = option.nextToken();
- value = token.equals("yes") || token.equals("no") ? token : "yes";
+ String value = option.nextToken();
+ if (!customizableOptions.contains(key)){
+ value = value.equals("yes") || value.equals("no") ? value : "yes";
}
map.put(key, value);
}
@@ -431,7 +433,7 @@
intent.putExtra(Browser.EXTRA_APPLICATION_ID, cordova.getActivity().getPackageName());
this.cordova.getActivity().startActivity(intent);
return "";
- // not catching FileUriExposedException explicitly because buildtools<24 doesn't know about it
+ // not catching FileUriExposedException explicitly because buildtools<24 doesn't know about it
} catch (java.lang.RuntimeException e) {
LOG.d(LOG_TAG, "InAppBrowser: Error loading url "+url+":"+ e.toString());
return e.toString();
@@ -561,10 +563,10 @@
showLocationBar = show.equals("yes") ? true : false;
}
if(showLocationBar) {
- String hideNavigation = features.get(HIDE_NAVIGATION);
- String hideUrl = features.get(HIDE_URL);
- if(hideNavigation != null) hideNavigationButtons = hideNavigation.equals("yes") ? true : false;
- if(hideUrl != null) hideUrlBar = hideUrl.equals("yes") ? true : false;
+ String hideNavigation = features.get(HIDE_NAVIGATION);
+ String hideUrl = features.get(HIDE_URL);
+ if(hideNavigation != null) hideNavigationButtons = hideNavigation.equals("yes") ? true : false;
+ if(hideUrl != null) hideUrlBar = hideUrl.equals("yes") ? true : false;
}
String zoom = features.get(ZOOM);
if (zoom != null) {
@@ -599,7 +601,7 @@
}
String wideViewPort = features.get(USER_WIDE_VIEW_PORT);
if (wideViewPort != null ) {
- useWideViewPort = wideViewPort.equals("yes") ? true : false;
+ useWideViewPort = wideViewPort.equals("yes") ? true : false;
}
String closeButtonCaptionSet = features.get(CLOSE_BUTTON_CAPTION);
if (closeButtonCaptionSet != null) {
@@ -607,7 +609,7 @@
}
String closeButtonColorSet = features.get(CLOSE_BUTTON_COLOR);
if (closeButtonColorSet != null) {
- closeButtonColor = closeButtonColorSet;
+ closeButtonColor = closeButtonColorSet;
}
String toolbarColorSet = features.get(TOOLBAR_COLOR);
if (toolbarColorSet != null) {
@@ -617,6 +619,14 @@
if (navigationButtonColorSet != null) {
navigationButtonColor = navigationButtonColorSet;
}
+ String showFooterSet = features.get(FOOTER);
+ if (showFooterSet != null) {
+ showFooter = showFooterSet.equals("yes") ? true : false;
+ }
+ String footerColorSet = features.get(FOOTER_COLOR);
+ if (footerColorSet != null) {
+ footerColor = footerColorSet;
+ }
}
final CordovaWebView thatWebView = this.webView;
@@ -630,13 +640,60 @@
*/
private int dpToPixels(int dipValue) {
int value = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP,
- (float) dipValue,
- cordova.getActivity().getResources().getDisplayMetrics()
+ (float) dipValue,
+ cordova.getActivity().getResources().getDisplayMetrics()
);
return value;
}
+ private View createCloseButton(int id){
+ View _close;
+ Resources activityRes = cordova.getActivity().getResources();
+
+ if (closeButtonCaption != "") {
+ // Use TextView for text
+ TextView close = new TextView(cordova.getActivity());
+ close.setText(closeButtonCaption);
+ close.setTextSize(20);
+ if (closeButtonColor != "") close.setTextColor(android.graphics.Color.parseColor(closeButtonColor));
+ close.setGravity(android.view.Gravity.CENTER_VERTICAL);
+ close.setPadding(this.dpToPixels(10), 0, this.dpToPixels(10), 0);
+ _close = close;
+ }
+ else {
+ ImageButton close = new ImageButton(cordova.getActivity());
+ int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", cordova.getActivity().getPackageName());
+ Drawable closeIcon = activityRes.getDrawable(closeResId);
+ if (closeButtonColor != "") close.setColorFilter(android.graphics.Color.parseColor(closeButtonColor));
+ close.setImageDrawable(closeIcon);
+ close.setScaleType(ImageView.ScaleType.FIT_CENTER);
+ if (Build.VERSION.SDK_INT >= 16)
+ close.getAdjustViewBounds();
+
+ _close = close;
+ }
+
+ RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
+ closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+ _close.setLayoutParams(closeLayoutParams);
+
+ if (Build.VERSION.SDK_INT >= 16)
+ _close.setBackground(null);
+ else
+ _close.setBackgroundDrawable(null);
+
+ _close.setContentDescription("Close Button");
+ _close.setId(Integer.valueOf(id));
+ _close.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ closeDialog();
+ }
+ });
+
+ return _close;
+ }
+
@SuppressLint("NewApi")
public void run() {
@@ -741,67 +798,37 @@
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;
+ navigate(edittext.getText().toString());
+ return true;
}
return false;
}
});
- // Close/Done button
- if (closeButtonCaption != "") {
- // Use TextView for text
- TextView close = new TextView(cordova.getActivity());
- close.setText(closeButtonCaption);
- close.setTextSize(20);
- if (closeButtonColor != "") close.setTextColor(android.graphics.Color.parseColor(closeButtonColor));
- close.setGravity(android.view.Gravity.CENTER_VERTICAL);
- RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
- closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
- close.setLayoutParams(closeLayoutParams);
- close.setContentDescription("Close Button");
- close.setId(Integer.valueOf(5));
- if (Build.VERSION.SDK_INT >= 16)
- close.setBackground(null);
- else
- close.setBackgroundDrawable(null);
- back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
- close.setPadding(this.dpToPixels(10), 0, this.dpToPixels(10), 0);
- close.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- closeDialog();
- }
- });
- toolbar.addView(close);
- }
- else {
- ImageButton close = new ImageButton(cordova.getActivity());
- RelativeLayout.LayoutParams closeLayoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
- closeLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
- close.setLayoutParams(closeLayoutParams);
- close.setContentDescription("Close Button");
- close.setId(Integer.valueOf(5));
- int closeResId = activityRes.getIdentifier("ic_action_remove", "drawable", cordova.getActivity().getPackageName());
- Drawable closeIcon = activityRes.getDrawable(closeResId);
- if (closeButtonColor != "") close.setColorFilter(android.graphics.Color.parseColor(closeButtonColor));
- if (Build.VERSION.SDK_INT >= 16)
- close.setBackground(null);
- else
- close.setBackgroundDrawable(null);
- close.setImageDrawable(closeIcon);
- close.setScaleType(ImageView.ScaleType.FIT_CENTER);
- back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
- if (Build.VERSION.SDK_INT >= 16)
- close.getAdjustViewBounds();
+ // Header Close/Done button
+ View close = createCloseButton(5);
+ toolbar.addView(close);
- close.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- closeDialog();
- }
- });
- toolbar.addView(close);
+ // Footer
+ RelativeLayout footer = new RelativeLayout(cordova.getActivity());
+ int _footerColor;
+ if(footerColor != ""){
+ _footerColor = Color.parseColor(footerColor);
+ }else{
+ _footerColor = android.graphics.Color.LTGRAY;
}
+ footer.setBackgroundColor(_footerColor);
+ RelativeLayout.LayoutParams footerLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44));
+ footerLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
+ footer.setLayoutParams(footerLayout);
+ if (closeButtonCaption != "") footer.setPadding(this.dpToPixels(8), this.dpToPixels(8), this.dpToPixels(8), this.dpToPixels(8));
+ footer.setHorizontalGravity(Gravity.LEFT);
+ footer.setVerticalGravity(Gravity.BOTTOM);
+
+ View footerClose = createCloseButton(7);
+ footer.addView(footerClose);
+
// WebView
inAppWebView = new WebView(cordova.getActivity());
@@ -915,7 +942,14 @@
}
// Add our webview to our main view/layout
- main.addView(inAppWebView);
+ RelativeLayout webViewLayout = new RelativeLayout(cordova.getActivity());
+ webViewLayout.addView(inAppWebView);
+ main.addView(webViewLayout);
+
+ // Don't add the footer unless it's been enabled
+ if (showFooter) {
+ webViewLayout.addView(footer);
+ }
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
@@ -1105,7 +1139,7 @@
// Update the UI if we haven't already
if (!newloc.equals(edittext.getText().toString())) {
edittext.setText(newloc);
- }
+ }
try {
JSONObject obj = new JSONObject();