From 5f4a0f5636a007d422381587a0a0d0e6463b8016 Mon Sep 17 00:00:00 2001 From: EddyVerbruggen 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 ![ScreenShot](screenshots/screenshot-ios-toast.png) +A few styling options + +![ScreenShot](screenshots/styling-green.png) + +![ScreenShot](screenshots/styling-red.png) + + Android ![ScreenShot](screenshots/screenshot-android-toast.png) + Windows Phone 8 ![ScreenShot](screenshots/screenshot-wp8.jpg) @@ -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 @@ + version="2.4.0"> Toast 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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 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 )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 )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 )_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 )_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];