Compare commits

...
34 Commits
Author SHA1 Message Date
EddyVerbruggen 55856bcb44 bump 2021-11-10 15:59:03 +01:00
Eddy VerbruggenandGitHub 28cc48357c Merge pull request #142 from tomburger/fix/api-30-crashing
fix the crash for API 30
2021-11-10 14:48:38 +01:00
Tom Burger 4399bed9e1 fix the crash for API 30 2021-11-09 15:12:20 +01:00
Eddy VerbruggenandGitHub 09d536b9ec Merge pull request #132 from cherouvim/patch-2
docs: Typo.
2019-10-14 22:08:52 +02:00
Ioannis CherouvimandGitHub 653aed37a3 docs: Typo. 2019-10-13 22:58:56 +03:00
EddyVerbruggen 82f72d2da7 duration does not seem to accept values on "show" and "showWithOptions"methods (Android 8.0) #117 2018-11-11 17:39:04 +01:00
EddyVerbruggen 440ea5bded Toast not shown in Honor 8XS #120 2018-11-10 20:40:18 +01:00
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
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
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
7 changed files with 166 additions and 43 deletions
+4
View File
@@ -0,0 +1,4 @@
.idea/
screenshots/
test/
issue_template.md
+36 -12
View File
@@ -1,6 +1,6 @@
# 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!
@@ -18,9 +18,9 @@ If you like this plugin and want to say thanks please send a PR or donation. Bot
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)
@@ -32,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
@@ -185,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.
@@ -203,17 +218,21 @@ called again. You can distinguish between those events of course:
// 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 bound 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.
@@ -254,6 +273,11 @@ 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.2: Even better Android compatibility, but you're limited to short and long durations now, on Android.
- 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.
+3 -1
View File
@@ -1,6 +1,6 @@
{
"name": "cordova-plugin-x-toast",
"version": "2.5.2",
"version": "2.7.3",
"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.5.2">
version="2.7.3">
<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>
+37 -15
View File
@@ -35,16 +35,22 @@ public class Toast extends CordovaPlugin {
private android.widget.Toast mostRecentToast;
private ViewGroup viewGroup;
private static final boolean IS_AT_LEAST_JELLY_BEAN = Build.VERSION.SDK_INT >= 16;
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;
private static final boolean IS_AT_LEAST_R = Build.VERSION.SDK_INT >= 30;
// 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)) {
returnTapEvent("hide", currentMessage, currentData, callbackContext);
hide();
callbackContext.success();
return true;
@@ -69,6 +75,9 @@ public class Toast extends CordovaPlugin {
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;
@@ -83,7 +92,7 @@ public class Toast extends CordovaPlugin {
final android.widget.Toast toast = android.widget.Toast.makeText(
IS_AT_LEAST_LOLLIPOP ? cordova.getActivity().getWindow().getContext() : cordova.getActivity().getApplicationContext(),
message,
android.widget.Toast.LENGTH_LONG // actually controlled by a timer further down
"short".equalsIgnoreCase(duration) ? android.widget.Toast.LENGTH_SHORT : android.widget.Toast.LENGTH_LONG
);
if ("top".equals(position)) {
@@ -98,7 +107,8 @@ public class Toast extends CordovaPlugin {
}
// if one of the custom layout options have been passed in, draw our own shape
if (styling != null && Build.VERSION.SDK_INT >= 16) {
// (but disabled on Android >= 11 since custom toast views are deprecated)
if (styling != null && IS_AT_LEAST_JELLY_BEAN && !IS_AT_LEAST_R) {
// the defaults mimic the default toast as close as possible
final String backgroundColor = styling.optString("backgroundColor", "#333333");
@@ -125,14 +135,18 @@ public class Toast extends CordovaPlugin {
toast.getView().setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding);
// this gives the toast a very subtle shadow on newer devices
if (Build.VERSION.SDK_INT >= 21) {
if (IS_AT_LEAST_LOLLIPOP) {
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_LOLLIPOP) {
if (IS_AT_LEAST_R) {
// On Android >= 11 the 'toast.getView()' will always return null
// so no touchListener can be used or mocked
// DO NOTHING
} else if (IS_AT_LEAST_LOLLIPOP) {
// 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.
getViewGroup().setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
@@ -173,22 +187,30 @@ public class Toast extends CordovaPlugin {
final boolean tapped = tapX >= startX && tapX <= endX &&
tapY >= startY && tapY <= endY;
return tapped && returnTapEvent(msg, data, callbackContext);
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(msg, 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) {toast.show();}
public void onFinish() {toast.cancel();}
public void onTick(long millisUntilFinished) {
// see https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues/116
// and https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin/issues/120
// if (!IS_AT_LEAST_PIE) {
// toast.show();
// }
}
public void onFinish() {
returnTapEvent("hide", msg, data, callbackContext);
toast.cancel();
}
}.start();
mostRecentToast = toast;
@@ -207,6 +229,7 @@ public class Toast extends CordovaPlugin {
}
}
private void hide() {
if (mostRecentToast != null) {
mostRecentToast.cancel();
@@ -217,17 +240,16 @@ public class Toast extends CordovaPlugin {
}
}
private boolean returnTapEvent(String message, JSONObject data, CallbackContext callbackContext) {
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) {
e.printStackTrace();
}
callbackContext.success(json);
hide();
return true;
}
@@ -249,4 +271,4 @@ public class Toast extends CordovaPlugin {
public void onResume(boolean multitasking) {
this.isPaused = false;
}
}
}
+10 -1
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 {
+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);