From 5f4a0f5636a007d422381587a0a0d0e6463b8016 Mon Sep 17 00:00:00 2001 From: EddyVerbruggen <eddyverbruggen@gmail.com> Date: Wed, 27 Jan 2016 20:49:03 +0100 Subject: [PATCH] #4 styling --- README.md | 48 +++++++++++--- package.json | 2 +- plugin.xml | 2 +- screenshots/styling-green.png | Bin 0 -> 16857 bytes screenshots/styling-red.png | Bin 0 -> 22311 bytes src/android/nl/xservices/plugins/Toast.java | 38 ++++++++--- src/ios/Toast+UIView.h | 2 +- src/ios/Toast+UIView.m | 66 +++++++++++++++----- src/ios/Toast.m | 14 +++-- 9 files changed, 128 insertions(+), 44 deletions(-) create mode 100644 screenshots/styling-green.png create mode 100644 screenshots/styling-red.png diff --git a/README.md b/README.md index b28d3ef..12ece21 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ for Android, iOS and WP8, by [Eddy Verbruggen](http://www.x-services.nl/phonegap 3. [Manually](#manually) 3. [PhoneGap Build](#phonegap-build) 4. [Usage](#4-usage) + 4. [Styling](#styling) 5. [Credits](#5-credits) 6. [Changelog](#6-changelog) 7. [License](#7-license) @@ -48,10 +49,18 @@ iOS  +A few styling options + + + + + + Android  + Windows Phone 8  @@ -203,6 +212,30 @@ called again. You can distinguish between those events of course: ); ``` +### Styling +Since version 2.4.0 you can pass an optional `styling` object to the plugin. +The defaults make sure the Toast looks the same as when you would not pass in the `styling` object at all. + +Note that on WP this object is currently ignored. + +```js + window.plugins.toast.showWithOptions({ + message: "hey there", + duration: "short", + position: "bottom", + styling: { + opacity: 0.75, // 0.0 (transparent) to 1.0 (opaque). Default 0.8 + backgroundColor: '#FF0000', // make sure you use #RRGGBB. Default #333333 + cornerRadius: 16, // minimum is 0 (square). iOS default 20, Android default 100 + horizontalPadding: 20, // iOS default 16, Android default 50 + verticalPadding: 16 // iOS default 12, Android default 30 + } + }); +``` + +Tip: if you need to pass different values for iOS and Android you can use fi. the device plugin +to determine the platform and pass `opacity: isAndroid() ? 0.7 : 0.9`. + ### WP8 quirks The WP8 implementation needs a little more work, but it's perfectly useable when you keep this in mind: * You can't show two Toasts simultaneously. @@ -217,15 +250,12 @@ The Android code was entirely created by me. For iOS most credits go to this excellent [Toast for iOS project by Charles Scalesse] (https://github.com/scalessec/Toast). ## 6. CHANGELOG -2.3.2: The click event introduced with 2.3.0 did not work with Android 5+. - -2.3.0: The plugin will now report back to JS if Toasts were tapped by the user. - -2.0.1: iOS messages are hidden when another one is shown. [Thanks Richie Min!](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/pull/13) - -2.0: WP8 support - -1.0: initial version supporting Android and iOS +- 2.4.0: You can now style the Toast with a number of properties. See +- 2.3.2: The click event introduced with 2.3.0 did not work with Android 5+. +- 2.3.0: The plugin will now report back to JS if Toasts were tapped by the user. +- 2.0.1: iOS messages are hidden when another one is shown. [Thanks Richie Min!](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/pull/13) +- 2.0: WP8 support +- 1.0: initial version supporting Android and iOS ## 7. License diff --git a/package.json b/package.json index 8e6cae3..3571666 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-x-toast", - "version": "2.3.2", + "version": "2.4.0", "description": "This plugin allows you to show a Toast. A Toast is a little non intrusive buttonless popup which automatically disappears.", "cordova": { "id": "cordova-plugin-x-toast", diff --git a/plugin.xml b/plugin.xml index 4ea80a7..8028b8e 100755 --- a/plugin.xml +++ b/plugin.xml @@ -2,7 +2,7 @@ <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-x-toast" - version="2.3.2"> + version="2.4.0"> <name>Toast</name> diff --git a/screenshots/styling-green.png b/screenshots/styling-green.png new file mode 100644 index 0000000000000000000000000000000000000000..f325fe0a734e1a78a979192f1ef54f13676d54e0 GIT binary patch literal 16857 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 VohyUd>wn#O{X+G5@iXI({||=eac%$r literal 0 HcmV?d00001 diff --git a/screenshots/styling-red.png b/screenshots/styling-red.png new file mode 100644 index 0000000000000000000000000000000000000000..aac1432111196a173cf2286de91c14778e93964d GIT binary patch literal 22311 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 A;{X5v literal 0 HcmV?d00001 diff --git a/src/android/nl/xservices/plugins/Toast.java b/src/android/nl/xservices/plugins/Toast.java index dc58576..580daac 100644 --- a/src/android/nl/xservices/plugins/Toast.java +++ b/src/android/nl/xservices/plugins/Toast.java @@ -1,5 +1,7 @@ package nl.xservices.plugins; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; import android.os.Build; import android.view.Gravity; import android.view.MotionEvent; @@ -37,7 +39,7 @@ public class Toast extends CordovaPlugin { private android.widget.Toast mostRecentToast; private ViewGroup viewGroup; - private static final boolean IS_AT_LEAST_ANDROID5 = Build.VERSION.SDK_INT >= 21; + private static final boolean IS_AT_LEAST_LOLLIPOP = Build.VERSION.SDK_INT >= 21; // note that webView.isPaused() is not Xwalk compatible, so tracking it poor-man style private boolean isPaused; @@ -65,20 +67,15 @@ public class Toast extends CordovaPlugin { final String position = options.getString("position"); final int addPixelsY = options.has("addPixelsY") ? options.getInt("addPixelsY") : 0; final JSONObject data = options.has("data") ? options.getJSONObject("data") : null; + final JSONObject styling = options.optJSONObject("styling"); cordova.getActivity().runOnUiThread(new Runnable() { public void run() { final android.widget.Toast toast = android.widget.Toast.makeText( - IS_AT_LEAST_ANDROID5 ? cordova.getActivity().getWindow().getContext() : cordova.getActivity().getApplicationContext(), + IS_AT_LEAST_LOLLIPOP ? cordova.getActivity().getWindow().getContext() : cordova.getActivity().getApplicationContext(), message, "short".equals(duration) ? android.widget.Toast.LENGTH_SHORT : android.widget.Toast.LENGTH_LONG); - // if we want to change the background color some day, we can use this -// try { -// final Method setTintMethod = Drawable.class.getMethod("setTint", int.class); -// setTintMethod.invoke(toast.getView().getBackground(), Color.RED); // default is Color.DKGRAY -// } catch (Exception ignore) { -// } if ("top".equals(position)) { toast.setGravity(GRAVITY_TOP, 0, BASE_TOP_BOTTOM_OFFSET + addPixelsY); } else if ("bottom".equals(position)) { @@ -90,9 +87,32 @@ public class Toast extends CordovaPlugin { return; } + // if one of the custom layout options have been passed in, draw our own shape + if (styling != null && Build.VERSION.SDK_INT >= 16) { + + // the defaults mimic the default toast as close as possible + final String backgroundColor = styling.optString("backgroundColor", "#333333"); + final double opacity = styling.optDouble("opacity", 0.8); + final int cornerRadius = styling.optInt("cornerRadius", 100); + final int horizontalPadding = styling.optInt("horizontalPadding", 50); + final int verticalPadding = styling.optInt("verticalPadding", 30); + + GradientDrawable shape = new GradientDrawable(); + shape.setCornerRadius(cornerRadius); + shape.setAlpha((int)(opacity * 255)); // 0-255, where 0 is an invisible background + shape.setColor(Color.parseColor(backgroundColor)); + toast.getView().setBackground(shape); + toast.getView().setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding); + + // this gives the toast a very subtle shadow on newer devices + if (Build.VERSION.SDK_INT >= 21) { + toast.getView().setElevation(6); + } + } + // On Android >= 5 you can no longer rely on the 'toast.getView().setOnTouchListener', // so created something funky that compares the Toast position to the tap coordinates. - if (IS_AT_LEAST_ANDROID5) { + if (IS_AT_LEAST_LOLLIPOP) { getViewGroup().setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { diff --git a/src/ios/Toast+UIView.h b/src/ios/Toast+UIView.h index 346f853..b2b1e7f 100644 --- a/src/ios/Toast+UIView.h +++ b/src/ios/Toast+UIView.h @@ -6,7 +6,7 @@ // each makeToast method creates a view and displays it as toast - (void)makeToast:(NSString *)message; - (void)makeToast:(NSString *)message duration:(NSTimeInterval)interval position:(id)position; -- (void)makeToast:(NSString *)message duration:(NSTimeInterval)duration position:(id)position addPixelsY:(int)addPixelsY data:(NSDictionary*)data commandDelegate:(id <CDVCommandDelegate>)commandDelegate callbackId:(NSString *)callbackId; +- (void)makeToast:(NSString *)message duration:(NSTimeInterval)duration position:(id)position addPixelsY:(int)addPixelsY data:(NSDictionary*)data styling:(NSDictionary*)styling commandDelegate:(id <CDVCommandDelegate>)commandDelegate callbackId:(NSString *)callbackId; - (void)makeToast:(NSString *)message duration:(NSTimeInterval)interval position:(id)position image:(UIImage *)image; - (void)makeToast:(NSString *)message duration:(NSTimeInterval)interval position:(id)position title:(NSString *)title; - (void)makeToast:(NSString *)message duration:(NSTimeInterval)interval position:(id)position title:(NSString *)title image:(UIImage *)image; diff --git a/src/ios/Toast+UIView.m b/src/ios/Toast+UIView.m index 83b32d6..4d4cf1b 100644 --- a/src/ios/Toast+UIView.m +++ b/src/ios/Toast+UIView.m @@ -53,6 +53,7 @@ static id commandDelegate; static id callbackId; static id msg; static id data; +static id styling; @interface UIView (ToastPrivate) @@ -79,13 +80,22 @@ static id data; [self showToast:toast duration:duration position:position]; } -- (void)makeToast:(NSString *)message duration:(NSTimeInterval)duration position:(id)position addPixelsY:(int)addPixelsY data:(NSDictionary*)_data commandDelegate:(id <CDVCommandDelegate>)_commandDelegate callbackId:(NSString *)_callbackId { - commandDelegate = _commandDelegate; - callbackId = _callbackId; - msg = message; - data = _data; - UIView *toast = [self viewForMessage:message title:nil image:nil]; - [self showToast:toast duration:duration position:position addedPixelsY:addPixelsY]; +- (void)makeToast:(NSString *)message + duration:(NSTimeInterval)duration + position:(id)position addPixelsY:(int)addPixelsY + data:(NSDictionary*)_data + styling:(NSDictionary*)_styling + commandDelegate:(id <CDVCommandDelegate>)_commandDelegate + callbackId:(NSString *)_callbackId { + + commandDelegate = _commandDelegate; + callbackId = _callbackId; + msg = message; + data = _data; + styling = _styling; + + UIView *toast = [self viewForMessage:message title:nil image:nil]; + [self showToast:toast duration:duration position:position addedPixelsY:addPixelsY]; } - (void)makeToast:(NSString *)message duration:(NSTimeInterval)duration position:(id)position title:(NSString *)title { @@ -295,7 +305,9 @@ static id data; // create the parent view UIView *wrapperView = [[UIView alloc] init]; wrapperView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin); - wrapperView.layer.cornerRadius = CSToastCornerRadius; + + NSNumber * cornerRadius = styling[@"cornerRadius"]; + wrapperView.layer.cornerRadius = cornerRadius == nil ? CSToastCornerRadius : [cornerRadius floatValue]; if (CSToastDisplayShadow) { wrapperView.layer.shadowColor = [UIColor blackColor].CGColor; @@ -304,12 +316,23 @@ static id data; wrapperView.layer.shadowOffset = CSToastShadowOffset; } - wrapperView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:CSToastOpacity]; + NSString * backgroundColor = styling[@"backgroundColor"]; + UIColor *theColor = backgroundColor == nil ? [UIColor blackColor] : [self colorFromHexString:backgroundColor]; + + NSNumber * opacity = styling[@"opacity"]; + CGFloat theOpacity = opacity == nil ? CSToastOpacity : [opacity floatValue]; + + NSNumber * horizontalPadding = styling[@"horizontalPadding"]; + NSNumber * verticalPadding = styling[@"verticalPadding"]; + CGFloat theHorizontalPadding = horizontalPadding == nil ? CSToastHorizontalPadding : [horizontalPadding floatValue]; + CGFloat theVerticalPadding = verticalPadding == nil ? CSToastVerticalPadding : [verticalPadding floatValue]; + + wrapperView.backgroundColor = [theColor colorWithAlphaComponent:theOpacity]; if(image != nil) { imageView = [[UIImageView alloc] initWithImage:image]; imageView.contentMode = UIViewContentModeScaleAspectFit; - imageView.frame = CGRectMake(CSToastHorizontalPadding, CSToastVerticalPadding, CSToastImageViewWidth, CSToastImageViewHeight); + imageView.frame = CGRectMake(theHorizontalPadding, theVerticalPadding, CSToastImageViewWidth, CSToastImageViewHeight); } CGFloat imageWidth, imageHeight, imageLeft; @@ -318,7 +341,7 @@ static id data; if(imageView != nil) { imageWidth = imageView.bounds.size.width; imageHeight = imageView.bounds.size.height; - imageLeft = CSToastHorizontalPadding; + imageLeft = theHorizontalPadding; } else { imageWidth = imageHeight = imageLeft = 0.0; } @@ -362,8 +385,8 @@ static id data; if(titleLabel != nil) { titleWidth = titleLabel.bounds.size.width; titleHeight = titleLabel.bounds.size.height; - titleTop = CSToastVerticalPadding; - titleLeft = imageLeft + imageWidth + CSToastHorizontalPadding; + titleTop = theVerticalPadding; + titleLeft = imageLeft + imageWidth + theHorizontalPadding; } else { titleWidth = titleHeight = titleTop = titleLeft = 0.0; } @@ -374,8 +397,8 @@ static id data; if(messageLabel != nil) { messageWidth = messageLabel.bounds.size.width; messageHeight = messageLabel.bounds.size.height; - messageLeft = imageLeft + imageWidth + CSToastHorizontalPadding; - messageTop = titleTop + titleHeight + CSToastVerticalPadding; + messageLeft = imageLeft + imageWidth + theHorizontalPadding; + messageTop = titleTop + titleHeight + theVerticalPadding; } else { messageWidth = messageHeight = messageLeft = messageTop = 0.0; } @@ -384,8 +407,8 @@ static id data; CGFloat longerLeft = MAX(titleLeft, messageLeft); // wrapper width uses the longerWidth or the image width, whatever is larger. same logic applies to the wrapper height - CGFloat wrapperWidth = MAX((imageWidth + (CSToastHorizontalPadding * 2)), (longerLeft + longerWidth + CSToastHorizontalPadding)); - CGFloat wrapperHeight = MAX((messageTop + messageHeight + CSToastVerticalPadding), (imageHeight + (CSToastVerticalPadding * 2))); + CGFloat wrapperWidth = MAX((imageWidth + (theHorizontalPadding * 2)), (longerLeft + longerWidth + theHorizontalPadding)); + CGFloat wrapperHeight = MAX((messageTop + messageHeight + theVerticalPadding), (imageHeight + (theVerticalPadding * 2))); wrapperView.frame = CGRectMake(0.0, 0.0, wrapperWidth, wrapperHeight); @@ -406,4 +429,13 @@ static id data; return wrapperView; } +// Assumes input like "#00FF00" (#RRGGBB) +- (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]; +} + @end diff --git a/src/ios/Toast.m b/src/ios/Toast.m index 54e59b4..bd8e4e9 100644 --- a/src/ios/Toast.m +++ b/src/ios/Toast.m @@ -6,13 +6,14 @@ - (void)show:(CDVInvokedUrlCommand*)command { - NSDictionary* options = [command.arguments objectAtIndex:0]; + NSDictionary* options = [command argumentAtIndex:0]; - NSString *message = [options objectForKey:@"message"]; - NSString *duration = [options objectForKey:@"duration"]; - NSString *position = [options objectForKey:@"position"]; - NSDictionary *data = [options objectForKey:@"data"]; - NSNumber *addPixelsY = [options objectForKey:@"addPixelsY"]; + NSString *message = options[@"message"]; + NSString *duration = options[@"duration"]; + NSString *position = options[@"position"]; + NSDictionary *data = options[@"data"]; + NSNumber *addPixelsY = options[@"addPixelsY"]; + NSDictionary *styling = options[@"styling"]; if (![position isEqual: @"top"] && ![position isEqual: @"center"] && ![position isEqual: @"bottom"]) { CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"invalid position. valid options are 'top', 'center' and 'bottom'"]; @@ -36,6 +37,7 @@ position:position addPixelsY:addPixelsY == nil ? 0 : [addPixelsY intValue] data:data + styling:styling commandDelegate:self.commandDelegate callbackId:command.callbackId];