Skip to content

Commit

Permalink
Lets user adjust color of toolbar, hide navigation buttons and set cu…
Browse files Browse the repository at this point in the history
…stom text on close button
  • Loading branch information
steinaragustli committed Oct 6, 2017
1 parent 71201b1 commit f3d7f72
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 58 deletions.
132 changes: 85 additions & 47 deletions src/android/InAppBrowser.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ Licensed to the Apache Software Foundation (ASF) under one
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
Expand All @@ -51,6 +54,7 @@ Licensed to the Apache Software Foundation (ASF) under one
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.Config;
Expand Down Expand Up @@ -91,6 +95,8 @@ public class InAppBrowser extends CordovaPlugin {
private static final String SHOULD_PAUSE = "shouldPauseOnSuspend";
private static final Boolean DEFAULT_HARDWARE_BACK = true;
private static final String USER_WIDE_VIEW_PORT = "useWideViewPort";
private static final String CLOSE_BUTTON_TEXT = "closeButtonText";
private static final String CLOSE_BUTTON_COLOR = "closeButtonColor";

private InAppBrowserDialog dialog;
private WebView inAppWebView;
Expand All @@ -109,6 +115,8 @@ public class InAppBrowser extends CordovaPlugin {
private ValueCallback<Uri[]> mUploadCallbackLollipop;
private final static int FILECHOOSER_REQUESTCODE = 1;
private final static int FILECHOOSER_REQUESTCODE_LOLLIPOP = 2;
private String closeButtonText = "";
private int closeButtonColor = android.graphics.Color.LTGRAY;

/**
* Executes the request and returns PluginResult.
Expand All @@ -127,7 +135,7 @@ public boolean execute(String action, CordovaArgs args, final CallbackContext ca
t = SELF;
}
final String target = t;
final HashMap<String, Boolean> features = parseFeature(args.optString(2));
final HashMap<String, String> features = parseFeature(args.optString(2));

LOG.d(LOG_TAG, "target = " + target);

Expand Down Expand Up @@ -366,18 +374,23 @@ public void run() {
* @param optString
* @return
*/
private HashMap<String, Boolean> parseFeature(String optString) {
private HashMap<String, String> parseFeature(String optString) {
if (optString.equals(NULL)) {
return null;
} else {
HashMap<String, Boolean> map = new HashMap<String, Boolean>();
HashMap<String, String> map = new HashMap<String, String>();
StringTokenizer features = new StringTokenizer(optString, ",");
StringTokenizer option;
while(features.hasMoreElements()) {
option = new StringTokenizer(features.nextToken(), "=");
if (option.hasMoreElements()) {
String key = option.nextToken();
Boolean value = option.nextToken().equals("no") ? Boolean.FALSE : Boolean.TRUE;
String value = null;
if (key.equals(CLOSE_BUTTON_TEXT)) value = option.nextToken();
else {
String token = option.nextToken();
value = token.equals("yes") || token.equals("no") ? token : "yes"; // hér!!
}
map.put(key, value);
}
}
Expand Down Expand Up @@ -523,52 +536,60 @@ private InAppBrowser getInAppBrowser(){
* @param url the url to load.
* @param features jsonObject
*/
public String showWebPage(final String url, HashMap<String, Boolean> features) {
public String showWebPage(final String url, HashMap<String, String> features) {
// Determine if we should hide the location bar.
showLocationBar = true;
showZoomControls = true;
openWindowHidden = false;
mediaPlaybackRequiresUserGesture = false;

if (features != null) {
Boolean show = features.get(LOCATION);
String show = features.get(LOCATION);
if (show != null) {
showLocationBar = show.booleanValue();
showLocationBar = show.equals("yes") ? true : false;
}
Boolean zoom = features.get(ZOOM);
String zoom = features.get(ZOOM);
if (zoom != null) {
showZoomControls = zoom.booleanValue();
showZoomControls = zoom.equals("yes") ? true : false;
}
Boolean hidden = features.get(HIDDEN);
String hidden = features.get(HIDDEN);
if (hidden != null) {
openWindowHidden = hidden.booleanValue();
openWindowHidden = hidden.equals("yes") ? true : false;
}
Boolean hardwareBack = features.get(HARDWARE_BACK_BUTTON);
String hardwareBack = features.get(HARDWARE_BACK_BUTTON);
if (hardwareBack != null) {
hadwareBackButton = hardwareBack.booleanValue();
hadwareBackButton = hardwareBack.equals("yes") ? true : false;
} else {
hadwareBackButton = DEFAULT_HARDWARE_BACK;
}
Boolean mediaPlayback = features.get(MEDIA_PLAYBACK_REQUIRES_USER_ACTION);
String mediaPlayback = features.get(MEDIA_PLAYBACK_REQUIRES_USER_ACTION);
if (mediaPlayback != null) {
mediaPlaybackRequiresUserGesture = mediaPlayback.booleanValue();
mediaPlaybackRequiresUserGesture = mediaPlayback.equals("yes") ? true : false;
}
Boolean cache = features.get(CLEAR_ALL_CACHE);
String cache = features.get(CLEAR_ALL_CACHE);
if (cache != null) {
clearAllCache = cache.booleanValue();
clearAllCache = cache.equals("yes") ? true : false;
} else {
cache = features.get(CLEAR_SESSION_CACHE);
if (cache != null) {
clearSessionCache = cache.booleanValue();
clearSessionCache = cache.equals("yes") ? true : false;
}
}
Boolean shouldPause = features.get(SHOULD_PAUSE);
String shouldPause = features.get(SHOULD_PAUSE);
if (shouldPause != null) {
shouldPauseInAppBrowser = shouldPause.booleanValue();
shouldPauseInAppBrowser = shouldPause.equals("yes") ? true : false;
}
Boolean wideViewPort = features.get(USER_WIDE_VIEW_PORT);
String wideViewPort = features.get(USER_WIDE_VIEW_PORT);
if (wideViewPort != null ) {
useWideViewPort = wideViewPort.booleanValue();
useWideViewPort = wideViewPort.equals("yes") ? true : false;
}
String closeButtonTextSet = features.get(CLOSE_BUTTON_TEXT);
if (closeButtonTextSet != null) {
closeButtonText = closeButtonTextSet;
}
String closeButtonTextColorSet = features.get(CLOSE_BUTTON_COLOR);
if (closeButtonTextColorSet != null) {
closeButtonColor = Color.parseColor(closeButtonTextColorSet);
}
}

Expand Down Expand Up @@ -612,7 +633,7 @@ public void run() {
// Toolbar layout
RelativeLayout toolbar = new RelativeLayout(cordova.getActivity());
//Please, no more black!
toolbar.setBackgroundColor(android.graphics.Color.LTGRAY);
toolbar.setBackgroundColor(closeButtonColor);
toolbar.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, this.dpToPixels(44)));
toolbar.setPadding(this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2), this.dpToPixels(2));
toolbar.setHorizontalGravity(Gravity.LEFT);
Expand Down Expand Up @@ -700,29 +721,46 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
});

// Close/Done button
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 (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();

close.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closeDialog();
}
});
if (closeButtonText != "") {
/* Use TextView for text */
TextView close = new TextView(cordova.getActivity());
close.setText(closeButtonText);
close.setTextSize(25);
back.setPadding(0, this.dpToPixels(10), 0, this.dpToPixels(10));
close.setId(Integer.valueOf(5));
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 (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();

close.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
closeDialog();
}
});
toolbar.addView(close);
}

// WebView
inAppWebView = new WebView(cordova.getActivity());
Expand Down Expand Up @@ -828,7 +866,7 @@ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType)
// Add the views to our toolbar
toolbar.addView(actionButtonContainer);
toolbar.addView(edittext);
toolbar.addView(close);
// toolbar.addView(close);

// Don't add the toolbar if its been disabled
if (getShowLocationBar()) {
Expand Down
11 changes: 7 additions & 4 deletions src/ios/CDVInAppBrowser.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@
@property (nonatomic, assign) BOOL location;
@property (nonatomic, assign) BOOL toolbar;
@property (nonatomic, copy) NSString* closebuttoncaption;
@property (nonatomic, copy) NSString* closebuttoncolor;
@property (nonatomic, copy) NSString* toolbarposition;
@property (nonatomic, copy) NSString* toolbarcolor;
@property (nonatomic, assign) BOOL toolbartranslucent;
@property (nonatomic, assign) BOOL hideToolbarNavigationButtons;
@property (nonatomic, assign) BOOL clearcache;
@property (nonatomic, assign) BOOL clearsessioncache;

Expand All @@ -74,13 +78,13 @@
NSString* _prevUserAgent;
NSInteger _userAgentLockToken;
CDVInAppBrowserOptions *_browserOptions;

#ifdef __CORDOVA_4_0_0
CDVUIWebViewDelegate* _webViewDelegate;
#else
CDVWebViewDelegate* _webViewDelegate;
#endif

}

@property (nonatomic, strong) IBOutlet UIWebView* webView;
Expand All @@ -99,7 +103,7 @@
- (void)navigateTo:(NSURL*)url;
- (void)showLocationBar:(BOOL)show;
- (void)showToolBar:(BOOL)show : (NSString *) toolbarPosition;
- (void)setCloseButtonTitle:(NSString*)title;
- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString;

- (id)initWithUserAgent:(NSString*)userAgent prevUserAgent:(NSString*)prevUserAgent browserOptions: (CDVInAppBrowserOptions*) browserOptions;

Expand All @@ -110,4 +114,3 @@
@property (nonatomic, weak) id <CDVScreenOrientationDelegate> orientationDelegate;

@end

42 changes: 35 additions & 7 deletions src/ios/CDVInAppBrowser.m
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,8 @@ - (void)openInInAppBrowser:(NSURL*)url withOptions:(NSString*)options

[self.inAppBrowserViewController showLocationBar:browserOptions.location];
[self.inAppBrowserViewController showToolBar:browserOptions.toolbar :browserOptions.toolbarposition];
if (browserOptions.closebuttoncaption != nil) {
[self.inAppBrowserViewController setCloseButtonTitle:browserOptions.closebuttoncaption];
if (browserOptions.closebuttoncaption != nil || browserOptions.closebuttoncolor != nil) {
[self.inAppBrowserViewController setCloseButtonTitle:browserOptions.closebuttoncaption :browserOptions.closebuttoncolor];
}
// Set Presentation Style
UIModalPresentationStyle presentationStyle = UIModalPresentationFullScreen; // default
Expand Down Expand Up @@ -599,6 +599,12 @@ - (void)createViews
self.toolbar.multipleTouchEnabled = NO;
self.toolbar.opaque = NO;
self.toolbar.userInteractionEnabled = YES;
if (_browserOptions.toolbarcolor != nil) { // Set toolbar color if user sets it in options
self.toolbar.barTintColor = [self colorFromHexString:_browserOptions.toolbarcolor];
}
if (!_browserOptions.toolbartranslucent) { // Set toolbar translucent to no if user sets it in options
self.toolbar.translucent = NO;
}

CGFloat labelInset = 5.0;
float locationBarY = toolbarIsAtBottom ? self.view.bounds.size.height - FOOTER_HEIGHT : self.view.bounds.size.height - LOCATIONBAR_HEIGHT;
Expand Down Expand Up @@ -642,7 +648,13 @@ - (void)createViews
self.backButton.enabled = YES;
self.backButton.imageInsets = UIEdgeInsetsZero;

[self.toolbar setItems:@[self.closeButton, flexibleSpaceButton, self.backButton, fixedSpaceButton, self.forwardButton]];
// Filter out Navigation Buttons if user requests so
if (_browserOptions.hideToolbarNavigationButtons) {
[self.toolbar setItems:@[self.closeButton, flexibleSpaceButton]];
} else {
[self.toolbar setItems:@[self.closeButton, flexibleSpaceButton, self.backButton, fixedSpaceButton, self.forwardButton]];
}
[self.toolbar setItems:@[self.closeButton, flexibleSpaceButton]];

self.view.backgroundColor = [UIColor grayColor];
[self.view addSubview:self.toolbar];
Expand All @@ -655,14 +667,16 @@ - (void) setWebViewFrame : (CGRect) frame {
[self.webView setFrame:frame];
}

- (void)setCloseButtonTitle:(NSString*)title
- (void)setCloseButtonTitle:(NSString*)title : (NSString*) colorString
{
// the advantage of using UIBarButtonSystemItemDone is the system will localize it for you automatically
// but, if you want to set this yourself, knock yourself out (we can't set the title for a system Done button, so we have to create a new one)
self.closeButton = nil;
self.closeButton = [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleBordered target:self action:@selector(close)];
// Initialize with title if title is set, otherwise the title will be 'Done' localized
self.closeButton = title != nil ? [[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStyleBordered target:self action:@selector(close)] : [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(close)];
self.closeButton.enabled = YES;
self.closeButton.tintColor = [UIColor colorWithRed:60.0 / 255.0 green:136.0 / 255.0 blue:230.0 / 255.0 alpha:1];
// If color on closebutton is requested then initialize with that that color, otherwise use initialize with default
self.closeButton.tintColor = colorString != nil ? [self colorFromHexString:colorString] : [UIColor colorWithRed:60.0 / 255.0 green:136.0 / 255.0 blue:230.0 / 255.0 alpha:1];

NSMutableArray* items = [self.toolbar.items mutableCopy];
[items replaceObjectAtIndex:0 withObject:self.closeButton];
Expand Down Expand Up @@ -877,6 +891,17 @@ - (void) rePositionViews {
}
}

// Helper function to convert hex color string to UIColor
// Assumes input like "#00FF00" (#RRGGBB).
// Taken from https://stackoverflow.com/questions/1560081/how-can-i-create-a-uicolor-from-a-hex-string
- (UIColor *)colorFromHexString:(NSString *)hexString {
unsigned rgbValue = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&rgbValue];
return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0];
}

#pragma mark UIWebViewDelegate

- (void)webViewDidStartLoad:(UIWebView*)theWebView
Expand Down Expand Up @@ -995,6 +1020,10 @@ - (id)init
self.suppressesincrementalrendering = NO;
self.hidden = NO;
self.disallowoverscroll = NO;
self.hideToolbarNavigationButtons = NO;
self.closebuttoncolor = nil;
self.toolbarcolor = nil;
self.toolbartranslucent = YES;
}

return self;
Expand Down Expand Up @@ -1104,4 +1133,3 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface


@end

0 comments on commit f3d7f72

Please sign in to comment.