Compare commits

...
41 Commits
Author SHA1 Message Date
EddyVerbruggen 8869b81749 Remove show toast method call from cancel timer to ensure that toast show is called only once. #118 2018-08-22 09:37:36 +02:00
Eddy VerbruggenandGitHub e4e18f143a Merge pull request #118 from patrickfrisch/master
Remove show toast method call from cancel timer to ensure that toast show is called only once.
2018-08-22 09:35:11 +02:00
Patrick Frisch 9757e2c04c Remove show toast method call from cancel timer to ensure that toast show is called only once. 2018-08-21 16:46:09 +02:00
EddyVerbruggen 791beb0bc4 bump 2018-03-16 07:56:27 +01:00
Eddy VerbruggenandGitHub fde8da464f Merge pull request #113 from jeffborg/jeffborg-patch-missing-test-js
removed reference to removed test.js
2018-03-16 07:54:44 +01:00
Jeffrey BorgandGitHub dbf27e63a4 removed reference to removed test.js
Build fails with 2.6.1 due to missing file, removed reference to this file for cordova
2018-03-16 09:40:45 +11:00
EddyVerbruggen 3235b9c8e3 Add npmignore 2018-03-15 21:29:05 +01:00
EddyVerbruggen ed2398455a typo 2018-03-15 21:28:46 +01:00
EddyVerbruggen 2a0ecbc2dd typo 2018-03-15 21:27:03 +01:00
EddyVerbruggen 6351512cf1 bump 2018-03-15 21:25:59 +01:00
Eddy VerbruggenandGitHub 206b7e014e Merge pull request #112 from Capgemini-nantes-df/master
get real top most view controller
2018-03-15 21:22:09 +01:00
yjajkiew a429424107 get real top most view controller 2018-03-15 18:05:00 +01:00
Eddy VerbruggenandGitHub 4324168d2a Update README.md 2017-03-14 20:42:03 +01:00
Eddy VerbruggenandGitHub 75287f6517 cleanup 2017-02-24 21:20:29 +01:00
eddyverbruggen 04b4cf7894 bump 2017-02-18 21:24:18 +01:00
eddyverbruggen d5356d7562 bump 2017-02-18 21:23:47 +01:00
eddyverbruggen 8d4a3d646c cleanup 2017-02-18 21:23:03 +01:00
eddyverbruggen d81936a08a bump 2017-02-18 21:22:06 +01:00
Eddy VerbruggenandGitHub f3f608ee1c Merge pull request #103 from Ph0ndragX/master
Windows platform support.
2017-02-18 21:18:51 +01:00
Piotr Smolarski e3fb477789 Windows platform support. 2017-02-15 14:02:27 +01:00
Eddy Verbruggen ce1dfa79cc Merge pull request #79 from ElNinjaGaiden/master
Changes to send same parameters to success callback when the toast hides automatically
2016-06-01 09:40:56 +02:00
Eddy Verbruggen 7b903b7f72 Update README.md 2016-06-01 09:32:21 +02:00
EddyVerbruggen 093b523dc6 bump 2016-06-01 08:51:18 +02:00
ElNinjaGaiden 37a73baa1f Readme update 2016-05-31 18:04:50 -06:00
ElNinjaGaiden 0b76cb8811 Minor bug fix 2016-05-31 11:25:10 -06:00
ElNinjaGaiden b3e3d8b858 Merge with EddyVerbruggen/master 2016-05-31 11:20:24 -06:00
EddyVerbruggen b5adb0da91 #80 Receiving a callback when a Toast is tapped not trigger in Android 2016-05-23 09:19:38 +02:00
EddyVerbruggen 52e4072ce6 Merge branch 'master' of https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin 2016-05-22 19:11:18 +02:00
EddyVerbruggen 11bcf9b14d #86 Is there anyway to get a significantly larger font on IOS and Android? - center align on Android as well 2016-05-22 19:09:57 +02:00
EddyVerbruggen 55f9b41d87 #86 Is there anyway to get a significantly larger font on IOS and Android? - center align on Android as well 2016-05-20 21:27:23 +02:00
EddyVerbruggen 0aeb2c4f95 #86 Is there anyway to get a significantly larger font on IOS and Android? - center align on iOS 2016-04-29 21:11:24 +02:00
EddyVerbruggen dc6c537125 #86 Is there anyway to get a significantly larger font on IOS and Android? 2016-04-28 19:52:33 +02:00
EddyVerbruggen 9ed9f018a7 #71 ios toast get error while message is integer 2016-03-17 21:30:17 +01:00
EddyVerbruggen fe1aed17e3 #59 Add specific duration of the toast 2016-03-17 21:23:19 +01:00
ElNinjaGaiden 566f6f7392 Changes to support hide notification with data on android devices
-Since android toasts does not support any kind of listener or callback
when the toast hides, the solutions is kind of a hack but it works.
2016-03-04 11:26:00 -06:00
ElNinjaGaiden 9b9365d9da Changes to send same parameters to success callback when the toast hides automatically - no tap 2016-03-04 09:24:55 -06:00
Eddy Verbruggen 4fb9932c9b Merge pull request #78 from NoahYarian/patch-1
README.md - replaced , with : for valid JSON in success callback example
2016-02-29 22:32:58 +01:00
Noah Yarian 4c65555aca README.md - replaced , with : for valid JSON in success callback example 2016-02-29 15:08:59 -06:00
Eddy Verbruggen aa1a771f7b Update README.md 2016-02-19 09:43:44 +01:00
Eddy Verbruggen 35ace3dd9d Update README.md 2016-02-19 09:43:09 +01:00
Eddy Verbruggen c0daed7ce4 Update README.md 2016-02-19 09:42:57 +01:00
11 changed files with 256 additions and 114 deletions
+4
View File
@@ -0,0 +1,4 @@
.idea/
screenshots/
test/
issue_template.md
+19
View File
@@ -0,0 +1,19 @@
[The MIT License (MIT)](http://www.opensource.org/licenses/mit-license.html)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+46 -40
View File
@@ -1,6 +1,9 @@
# PhoneGap Toast plugin
for Android, iOS and WP8, by [Eddy Verbruggen](http://www.x-services.nl/phonegap-toast-plugin/796)
for Android, iOS, WP8, Windows and BlackBerry by [Eddy Verbruggen](http://www.x-services.nl/phonegap-toast-plugin/796)
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=eddyverbruggen%40gmail%2ecom&lc=US&item_name=cordova%2dplugin%2dtoast&currency_code=USD&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted)
If you like this plugin and want to say thanks please send a PR or donation. Both are equally appreciated!
<table width="100%">
@@ -15,14 +18,13 @@ for Android, iOS and WP8, by [Eddy Verbruggen](http://www.x-services.nl/phonegap
1. [Description](#1-description)
2. [Screenshots](#2-screenshots)
3. [Installation](#3-installation)
3. [Automatically (CLI / Plugman)](#automatically-cli--plugman)
3. [Manually](#manually)
3. [PhoneGap Build](#phonegap-build)
3. [Automatically (CLI / Plugman)](#automatically-cli--plugman)
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)
## 1. Description
@@ -30,18 +32,15 @@ This plugin allows you to show a native Toast (a little text popup) on iOS, Andr
It's great for showing a non intrusive native notification which is guaranteed always in the viewport of the browser.
* You can choose where to show the Toast: at the top, center or bottom of the screen.
* You can choose two durations: short (approx. 2 seconds), or long (approx. 5 seconds), after which the Toast automatically disappears.
* Compatible with [Cordova Plugman](https://github.com/apache/cordova-plugman).
* Officially supported by [PhoneGap Build](https://build.phonegap.com/plugins).
* Minimum iOS version is [6](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues/7).
Example usages:
* "There were validation errors"
* "Account created successfully"
* "The record was deleted"
* "Login successful"
* "The battery is almost dead"
* "You are now logged out"
* "Connection failure, please try again later"
* "Created Order #00287
## 2. Screenshots
@@ -138,7 +137,7 @@ Toast.js is brought in automatically. There is no need to change or add anything
### Showing a Toast
You have two choices to make when showing a Toast: where to show it and for how long.
* show(message, duration, position)
* duration: 'short', 'long'
* duration: 'short', 'long', '3000', 900 (the latter are milliseconds)
* position: 'top', 'center', 'bottom'
You can also use any of these convenience methods:
@@ -164,7 +163,7 @@ function showBottom() {
window.plugins.toast.showWithOptions(
{
message: "hey there",
duration: "short",
duration: "short", // which is 2000 ms. "long" is 4000. Or specify the nr of ms yourself.
position: "bottom",
addPixelsY: -40 // added a negative value to move it up a bit (default 0)
},
@@ -183,6 +182,24 @@ function hide() {
}
```
When the toast gets hidden, your success callback will be called (in case you have defined one) with the `event` property equals to `hide` (more details about the callback in the next section).
```js
window.plugins.toast.showWithOptions({
message: 'My message',
// More config here...
},
//Success callback
function(args) {
console.log(args.event);
//This will print 'hide'
},
function(error) {
console.error('toast error: ', error);
}
);
```
### Receiving a callback when a Toast is tapped
On iOS and Android the success handler of your `show` function will be notified (again) when the toast was tapped.
@@ -193,25 +210,29 @@ called again. You can distinguish between those events of course:
window.plugins.toast.showWithOptions(
{
message: "hey there",
duration: "short",
duration: 1500, // ms
position: "bottom",
addPixelsY: -40, // (optional) added a negative value to move it up a bit (default 0)
data: {'foo','bar'} // (optional) pass in a JSON object here (it will be sent back in the success callback below)
data: {'foo':'bar'} // (optional) pass in a JSON object here (it will be sent back in the success callback below)
},
// implement the success callback
function(result) {
if (result && result.event) {
console.log("The toast was tapped");
console.log("Event: " + result.event); // will be defined, with a value of "touch" when it was tapped by the user
console.log("The toast was tapped or got hidden, see the value of result.event");
console.log("Event: " + result.event); // "touch" when the toast was touched by the user or "hide" when the toast geot hidden
console.log("Message: " + result.message); // will be equal to the message you passed in
console.log("data.foo: " + result.data.foo); // .. retrieve passed in data here
} else {
console.log("The toast has been shown");
if (result.event === 'hide') {
console.log("The toast has been shown");
}
}
}
);
```
The success callback is useful when your toast is binded to a notification id in your backend and you have to mark it as `read` when the toast is done, or to update the notifications counter for iOS. The usage of this will be defined by your application logic. Use the `result.data` object to support your specific logic.
### 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.
@@ -221,12 +242,13 @@ Note that on WP this object is currently ignored.
```js
window.plugins.toast.showWithOptions({
message: "hey there",
duration: "short",
duration: "short", // 2000 ms
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
textColor: '#FFFF00', // Ditto. Default #FFFFFF
textSize: 20.5, // Default is approx. 13.
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
@@ -251,6 +273,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.7.0: [Android P compatibility.](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues/116)
- 2.6.2: [iOS view hierarchy fix.](https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/pull/112)
- 2.6.0: Windows support!
- 2.5.2: Multi-line wrapping Toasts are now center aligned.
- 2.5.1: You can now specify the `textSize` used in the font for iOS and Android.
- 2.5.0: By popular demand: Specify the duration of the Toast on iOS and Android. Pass in `short` (2000ms), `long` (4000ms), or any nr of milliseconds: `900`.
- 2.4.2: You can now also set the Toast `opacity` for iOS.
- 2.4.1: As an addition to 2.4.0, [Sino](https://github.com/SinoBoeckmann) added the option to change the text color!
- 2.4.0: You can now style the Toast with a number of properties. See
@@ -259,25 +287,3 @@ For iOS most credits go to this excellent [Toast for iOS project by Charles Scal
- 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
[The MIT License (MIT)](http://www.opensource.org/licenses/mit-license.html)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+3 -1
View File
@@ -1,6 +1,6 @@
{
"name": "cordova-plugin-x-toast",
"version": "2.4.2",
"version": "2.7.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",
@@ -8,6 +8,7 @@
"ios",
"android",
"wp8",
"windows",
"blackberry10"
]
},
@@ -24,6 +25,7 @@
"cordova-ios",
"cordova-android",
"cordova-wp8",
"cordova-windows",
"cordova-blackberry10"
],
"engines": [
+20 -14
View File
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<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.4.2">
version="2.7.0">
<name>Toast</name>
@@ -29,9 +28,6 @@
<clobbers target="window.plugins.toast" />
</js-module>
<js-module src="test/tests.js" name="tests">
</js-module>
<!-- ios -->
<platform name="ios">
@@ -72,13 +68,23 @@
<source-file src="src/wp8/Toast.cs" />
</platform>
<platform name="blackberry10">
<source-file src="src/blackberry10/index.js" target-dir="Toast"/>
<lib-file src="src/blackberry10/native/device/libToast.so" arch="device"/>
<lib-file src="src/blackberry10/native/simulator/libToast.so" arch="simulator"/>
<config-file target="www/config.xml" parent="/widget">
<feature name="Toast" value="Toast" />
</config-file>
</platform>
<platform name="blackberry10">
<source-file src="src/blackberry10/index.js" target-dir="Toast"/>
<lib-file src="src/blackberry10/native/device/libToast.so" arch="device"/>
<lib-file src="src/blackberry10/native/simulator/libToast.so" arch="simulator"/>
<config-file target="www/config.xml" parent="/widget">
<feature name="Toast" value="Toast" />
</config-file>
</platform>
<!-- windows -->
<platform name="windows">
<js-module src="src/windows/toastProxy.js" name="ToastProxy">
<merges target="" />
</js-module>
<config-file target="config.xml" parent="/*">
<feature name="Toast" value="Toast" />
</config-file>
</platform>
</plugin>
+69 -32
View File
@@ -3,6 +3,11 @@ package nl.xservices.plugins;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.os.CountDownTimer;
import android.text.Layout;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.AlignmentSpan;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
@@ -16,16 +21,6 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/*
// TODO nice way for the Toast plugin to offer a longer delay than the default short and long options
// TODO also look at https://github.com/JohnPersano/Supertoasts
new CountDownTimer(6000, 1000) {
public void onTick(long millisUntilFinished) {toast.show();}
public void onFinish() {toast.show();}
}.start();
Also, check https://github.com/JohnPersano/SuperToasts
*/
public class Toast extends CordovaPlugin {
private static final String ACTION_SHOW_EVENT = "show";
@@ -41,41 +36,62 @@ public class Toast extends CordovaPlugin {
private ViewGroup viewGroup;
private static final boolean IS_AT_LEAST_LOLLIPOP = Build.VERSION.SDK_INT >= 21;
private static final boolean IS_AT_LEAST_PIE = Build.VERSION.SDK_INT >= 28;
// note that webView.isPaused() is not Xwalk compatible, so tracking it poor-man style
private boolean isPaused;
private String currentMessage;
private JSONObject currentData;
private static CountDownTimer _timer;
@Override
public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
if (ACTION_HIDE_EVENT.equals(action)) {
if (mostRecentToast != null) {
mostRecentToast.cancel();
getViewGroup().setOnTouchListener(null);
}
returnTapEvent("hide", currentMessage, currentData, callbackContext);
hide();
callbackContext.success();
return true;
} else if (ACTION_SHOW_EVENT.equals(action)) {
if (this.isPaused) {
return true;
}
final JSONObject options = args.getJSONObject(0);
final String msg = options.getString("message");
final Spannable message = new SpannableString(msg);
message.setSpan(
new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
0,
msg.length() - 1,
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
final String message = options.getString("message");
final String duration = options.getString("duration");
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");
currentMessage = msg;
currentData = data;
cordova.getActivity().runOnUiThread(new Runnable() {
public void run() {
int hideAfterMs;
if ("short".equalsIgnoreCase(duration)) {
hideAfterMs = 2000;
} else if ("long".equalsIgnoreCase(duration)) {
hideAfterMs = 4000;
} else {
// assuming a number of ms
hideAfterMs = Integer.parseInt(duration);
}
final android.widget.Toast toast = android.widget.Toast.makeText(
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);
android.widget.Toast.LENGTH_LONG // actually controlled by a timer further down
);
if ("top".equals(position)) {
toast.setGravity(GRAVITY_TOP, 0, BASE_TOP_BOTTOM_OFFSET + addPixelsY);
@@ -94,6 +110,7 @@ public class Toast extends CordovaPlugin {
// the defaults mimic the default toast as close as possible
final String backgroundColor = styling.optString("backgroundColor", "#333333");
final String textColor = styling.optString("textColor", "#ffffff");
final Double textSize = styling.optDouble("textSize", -1);
final double opacity = styling.optDouble("opacity", 0.8);
final int cornerRadius = styling.optInt("cornerRadius", 100);
final int horizontalPadding = styling.optInt("horizontalPadding", 50);
@@ -104,11 +121,14 @@ public class Toast extends CordovaPlugin {
shape.setAlpha((int)(opacity * 255)); // 0-255, where 0 is an invisible background
shape.setColor(Color.parseColor(backgroundColor));
toast.getView().setBackground(shape);
final TextView toastTextView;
toastTextView = (TextView) toast.getView().findViewById(android.R.id.message);
toastTextView.setTextColor(Color.parseColor(textColor));
if (textSize > -1) {
toastTextView.setTextSize(textSize.floatValue());
}
toast.getView().setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding);
// this gives the toast a very subtle shadow on newer devices
@@ -160,24 +180,33 @@ public class Toast extends CordovaPlugin {
final boolean tapped = tapX >= startX && tapX <= endX &&
tapY >= startY && tapY <= endY;
if (tapped) {
getViewGroup().setOnTouchListener(null);
return returnTapEvent(message, data, callbackContext);
}
return false;
return tapped && returnTapEvent("touch", msg, data, callbackContext);
}
});
} else {
toast.getView().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return motionEvent.getAction() == MotionEvent.ACTION_DOWN && returnTapEvent(message, data, callbackContext);
return motionEvent.getAction() == MotionEvent.ACTION_DOWN && returnTapEvent("touch", msg, data, callbackContext);
}
});
}
// trigger show every 2500 ms for as long as the requested duration
_timer = new CountDownTimer(hideAfterMs, 2500) {
public void onTick(long millisUntilFinished) {
// see https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues/116
if (!IS_AT_LEAST_PIE) {
toast.show();
}
}
public void onFinish() {
returnTapEvent("hide", msg, data, callbackContext);
toast.cancel();
}
}.start();
toast.show();
mostRecentToast = toast;
toast.show();
PluginResult pr = new PluginResult(PluginResult.Status.OK);
pr.setKeepCallback(true);
@@ -192,10 +221,21 @@ public class Toast extends CordovaPlugin {
}
}
private boolean returnTapEvent(String message, JSONObject data, CallbackContext callbackContext) {
private void hide() {
if (mostRecentToast != null) {
mostRecentToast.cancel();
getViewGroup().setOnTouchListener(null);
}
if (_timer != null) {
_timer.cancel();
}
}
private boolean returnTapEvent(String eventName, String message, JSONObject data, CallbackContext callbackContext) {
final JSONObject json = new JSONObject();
try {
json.put("event", "touch");
json.put("event", eventName);
json.put("message", message);
json.put("data", data);
} catch (JSONException e) {
@@ -215,10 +255,7 @@ public class Toast extends CordovaPlugin {
@Override
public void onPause(boolean multitasking) {
if (mostRecentToast != null) {
mostRecentToast.cancel();
getViewGroup().setOnTouchListener(null);
}
hide();
this.isPaused = true;
}
+19 -5
View File
@@ -157,7 +157,7 @@ static id styling;
}
- (UIViewController*) getTopMostViewController {
UIViewController *presentingViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController;
UIViewController *presentingViewController = [[UIApplication sharedApplication] keyWindow].rootViewController;
while (presentingViewController.presentedViewController != nil) {
presentingViewController = presentingViewController.presentedViewController;
}
@@ -185,6 +185,15 @@ static id styling;
- (void)toastTimerDidFinish:(NSTimer *)timer {
[self hideToast:(UIView *)timer.userInfo];
// also send an event back to JS
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:msg, @"message", @"hide", @"event", nil];
if (data != nil) {
[dict setObject:data forKey:@"data"];
}
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dict];
[commandDelegate sendPluginResult:pluginResult callbackId:callbackId];
}
- (void)handleToastTapped:(UITapGestureRecognizer *)recognizer {
@@ -323,10 +332,14 @@ static id styling;
UIColor *theColor = backgroundColor == nil ? [UIColor blackColor] : [self colorFromHexString:backgroundColor];
NSNumber * horizontalPadding = styling[@"horizontalPadding"];
NSNumber * verticalPadding = styling[@"verticalPadding"];
CGFloat theHorizontalPadding = horizontalPadding == nil ? CSToastHorizontalPadding : [horizontalPadding floatValue];
NSNumber * verticalPadding = styling[@"verticalPadding"];
CGFloat theVerticalPadding = verticalPadding == nil ? CSToastVerticalPadding : [verticalPadding floatValue];
NSNumber * textSize = styling[@"textSize"];
CGFloat theTextSize = textSize == nil ? CSToastFontSize : [textSize floatValue];
wrapperView.backgroundColor = theColor;
if(image != nil) {
@@ -352,8 +365,8 @@ static id styling;
titleLabel = [[UILabel alloc] init];
titleLabel.numberOfLines = CSToastMaxTitleLines;
titleLabel.font = [UIFont boldSystemFontOfSize:CSToastFontSize];
titleLabel.textAlignment = NSTextAlignmentLeft;
titleLabel.font = [UIFont boldSystemFontOfSize:theTextSize];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
titleLabel.textColor = theTitleLabelTextColor;
titleLabel.backgroundColor = [UIColor clearColor];
@@ -372,8 +385,9 @@ static id styling;
messageLabel = [[UILabel alloc] init];
messageLabel.numberOfLines = CSToastMaxMessageLines;
messageLabel.font = [UIFont systemFontOfSize:CSToastFontSize];
messageLabel.font = [UIFont systemFontOfSize:theTextSize];
messageLabel.lineBreakMode = NSLineBreakByWordWrapping;
messageLabel.textAlignment = NSTextAlignmentCenter;
messageLabel.textColor = theMessageLabelTextColor;
messageLabel.backgroundColor = [UIColor clearColor];
messageLabel.alpha = 1.0;
+12 -16
View File
@@ -5,42 +5,38 @@
@implementation Toast
- (void)show:(CDVInvokedUrlCommand*)command {
NSDictionary* options = [command argumentAtIndex:0];
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'"];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
return;
}
NSInteger durationInt;
if ([duration isEqual: @"short"]) {
durationInt = 2;
} else if ([duration isEqual: @"long"]) {
durationInt = 5;
NSTimeInterval durationMS;
if ([duration.lowercaseString isEqualToString: @"short"]) {
durationMS = 2000;
} else if ([duration.lowercaseString isEqualToString: @"long"]) {
durationMS = 4000;
} else {
CDVPluginResult * pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"invalid duration. valid options are 'short' and 'long'"];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
return;
durationMS = [duration intValue];
}
[self.webView makeToast:message
duration:durationInt
duration:durationMS / 1000
position:position
addPixelsY:addPixelsY == nil ? 0 : [addPixelsY intValue]
data:data
styling:styling
commandDelegate:self.commandDelegate
callbackId:command.callbackId];
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
pluginResult.keepCallback = [NSNumber numberWithBool:YES];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
@@ -48,7 +44,7 @@
- (void)hide:(CDVInvokedUrlCommand*)command {
[self.webView hideToast];
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
+56
View File
@@ -0,0 +1,56 @@
/**
* @author Piotr Smolarski <ph0ndragxdev@gmail.com>
*/
var toastProxy = {
lastDisplayedNotification: null,
show: function(successCallback, errorCallback, options) {
var notifications = Windows.UI.Notifications;
var template = notifications.ToastTemplateType.ToastText01;
var toastXml = notifications.ToastNotificationManager.getTemplateContent(template);
var toastTextElements = toastXml.getElementsByTagName("text");
toastTextElements[0].appendChild(toastXml.createTextNode(options[0].message));
var toastNode = toastXml.selectSingleNode("/toast");
toastNode.setAttribute("duration", options[0].duration);
var toast = new notifications.ToastNotification(toastXml);
toast.onactivated = function (event) {
toastProxy.lastDisplayedNotification = null;
successCallback({
event: "touch",
message: options[0].message,
data: options[0].data
});
};
toast.ondismissed = function (event) {
toastProxy.lastDisplayedNotification = null;
successCallback({
event: "hide",
message: options[0].message,
data: options[0].data
});
};
toast.onfailed = function(err) {
toastProxy.lastDisplayedNotification = null;
errorCallback(err);
};
notifications.ToastNotificationManager.createToastNotifier().show(toast);
},
hide: function() {
if (this.lastDisplayedNotification !== null) {
notifications.ToastNotificationManager.createToastNotifier().hide(toast);
this.lastDisplayedNotification = null;
}
}
};
cordova.commandProxy.add("Toast", toastProxy);
+2 -2
View File
@@ -126,10 +126,10 @@ namespace WPCordovaClassLib.Cordova.Commands
return;
}
int hideDelay = 2800;
int hideDelay = 2500;
if ("long".Equals(duration))
{
hideDelay = 5500;
hideDelay = 5000;
}
else if (!"short".Equals(duration))
{
+6 -4
View File
@@ -11,12 +11,12 @@ Toast.prototype.optionsBuilder = function () {
return {
withMessage: function(m) {
message = m;
message = m.toString();
return this;
},
withDuration: function(d) {
duration = d;
duration = d.toString();
return this;
},
@@ -36,13 +36,15 @@ Toast.prototype.optionsBuilder = function () {
duration: duration,
position: position,
addPixelsY: addPixelsY
}
};
}
}
};
};
Toast.prototype.showWithOptions = function (options, successCallback, errorCallback) {
options.duration = (options.duration === undefined ? 'long' : options.duration.toString());
options.message = options.message.toString();
cordova.exec(successCallback, errorCallback, "Toast", "show", [options]);
};