From 19b00e7810fa84a28d2819bd545347a66ce49285 Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Wed, 24 Jun 2020 10:03:47 +0530 Subject: [PATCH] Sync with upstream (#3) * Make sure to import PushNotificationIOS from react-native first * typo * Delete versions.yml * Update push-notification-ios to 1.2.0 Version 1.1.0 giving a `No known class method for selector 'didReceiveNotificationResponse'`error * Add a Log.e() on fail. * Add option in AndroidManifest to allow/remove notification in foreground (remote-only) * Change the documentation of onNotification. * Implement `onNewToken` for Firebase. * Add an example with sound in project example. * feat: :sparkles: Revoke Token method Added the Revoke Token method to Android only. With this method is possible to generate a new token after a logout case with revoking. * docs: :pencil: Revoke Token method documentation Added Revoke Token method descprition at Android Only Methods section * chore: Added Revoke Token button Updated example with the new Revoke Token method, adding a button, alert feedback and necessary calls * Allow numbers for `number` and `id` in Android. * chore: :ok_hand: Revoke Token method renamed to Abandon Permissions * chore: :ok_hand: Updated to new Abandon Permissions method name The Revoke Token method has been renamed to Abandon Permissions method * docs: :pencil: Updated with new Abandon Permissions method Renamed Revoked Method to Abandon Permissions method. The method from iOS only section was removed and added a new general method section with the new method * Changes in example Application. * Use directly the callNative for `abandonPermissions`. * Put deleteInstanceId() in a separate thread. * Bump to version 3.4.0. * Prevent crash for NaN. * Update CHANGELOG.md. * Prevent sound to be mute in default state. * Missing change on variable name. * feat: multiple push providers fix: fix naming fix: more fixes fix: more fixes fix: add activity service fix: update naming * Change from 18 months to 1 year * feat: explicitly override onNewToken * #1431 * Move back onNewToken to Firebase service. * Bump to 3.5.0. * Switch from support library to androidx. #1449 * Bump to 3.5.1. * Update README.md * Fix sounds volume and DND is ignored. Fix #1455 `onNotification fires every time when the app goes from background to foreground` * Remove extra interface. * Bump to 3.5.2. * Fix changelog, wrong issue mentioned. Co-authored-by: Hans Govind Co-authored-by: Andrew Tremblay (Pear profile) <43054023+andrewtremblay-pear@users.noreply.github.com> Co-authored-by: Boris Tacyniak Co-authored-by: willnaoosmit <55159911+willnaoosmit@users.noreply.github.com> Co-authored-by: Gabriel Consalter Co-authored-by: sarah denaci Co-authored-by: Taymer Ragazzini --- .github/workflows/stale.yml | 2 +- .github/workflows/versions.yml | 15 -- CHANGELOG.md | 45 +++++ README.md | 22 ++- .../modules/RNPushNotification.java | 22 +++ .../modules/RNPushNotificationConfig.java | 12 ++ .../modules/RNPushNotificationHelper.java | 55 ++++-- .../RNPushNotificationListenerService.java | 129 ++----------- .../modules/RNReceivedMessageHandler.java | 171 ++++++++++++++++++ component/index.android.js | 8 +- example/App.js | 24 ++- example/NotifService.js | 56 +++--- example/NotificationHandler.js | 57 ++++++ .../android/app/src/main/AndroidManifest.xml | 2 + .../android/app/src/main/res/raw/sample.mp3 | Bin 0 -> 51457 bytes example/ios/example.xcodeproj/project.pbxproj | 4 + example/ios/sample.mp3 | Bin 0 -> 51457 bytes index.js | 65 ++++++- package.json | 6 +- submitting-a-pull-request.md | 4 +- 20 files changed, 493 insertions(+), 206 deletions(-) delete mode 100644 .github/workflows/versions.yml create mode 100644 android/src/main/java/com/dieam/reactnativepushnotification/modules/RNReceivedMessageHandler.java create mode 100644 example/NotificationHandler.js create mode 100644 example/android/app/src/main/res/raw/sample.mp3 create mode 100644 example/ios/sample.mp3 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 6eca45411..a8b110a8c 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,6 +12,6 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: "This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 30 days if no further activity occurs. Thank you for your contributions." stale-pr-message: "This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 30 days if no further activity occurs. Thank you for your contributions." - days-before-stale: 560 + days-before-stale: 365 days-before-close: 30 operations-per-run: 30 diff --git a/.github/workflows/versions.yml b/.github/workflows/versions.yml deleted file mode 100644 index 8cb398371..000000000 --- a/.github/workflows/versions.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: Check versions -on: - issues: - types: [opened] - -jobs: - check-versions: - runs-on: ubuntu-latest - steps: - - uses: zo0r/react-native-push-notification@master - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - packages: | - react-native-push-notification - @react-native-community/push-notification-ios diff --git a/CHANGELOG.md b/CHANGELOG.md index f6af82f0c..b0e8773c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,51 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Fixed +## [3.5.2] - 2020-05-25 + +### Fixed + +- (Android) Sounds are playing even in Do Not Disturb [#1432](https://github.com/zo0r/react-native-push-notification/issues/1432#issuecomment-633367111) +- (Android) onNotification fires every time when the app goes from background to foreground [#1455](https://github.com/zo0r/react-native-push-notification/issues/1455) +- (Android) java.lang.NullPointerException: Attempt to invoke virtual method 'void com.dieam.reactnativepushnotification.modules.d.c(android.os.Bundle)' on a null object reference [#1431](https://github.com/zo0r/react-native-push-notification/issues/1431#issuecomment-633315150) + +## [3.5.1] - 2020-05-20 + +### Fixed + +- (Android) When updating 3.4 to 3.5, unable to compile Android [#1449](https://github.com/zo0r/react-native-push-notification/pull/1449) + +## [3.5.0] - 2020-05-20 + +### Features + +- (Android) Enables the ability to support multiple push providers [#1445](https://github.com/zo0r/react-native-push-notification/pull/1445) + +### Fixed + +- (Android) No sound on notifications [#1432](https://github.com/zo0r/react-native-push-notification/issues/1432) +- (Android) onNotification is not calling when app is in background [#1446](https://github.com/zo0r/react-native-push-notification/pull/1446) +- (Android) `number` and `id` do not crash if NaN is passed in Android. + +## [3.4.0] - 2020-05-08 + +### Features + +- (Android) Call `onRegister` when [Firebase renew token](). +- (Android) Added Abandon Permissions method to Android [#1425](https://github.com/zo0r/react-native-push-notification/pull/1425) +- (Android) Add a new key in `AndroidManifest.xml` to allow/remove notification in foreground. + +```xml + +``` + +### Fixed + +- (Android) `number` and `id` are now correctly handled as number in Android. +- (iOS) Update push-notification-ios to 1.2.0 [#1410](https://github.com/zo0r/react-native-push-notification/pull/1410) +- Make sure to import PushNotificationIOS from react-native first [#617](https://github.com/zo0r/react-native-push-notification/pull/617) + ## [3.3.1] - 2020-05-01 ### Fixed diff --git a/README.md b/README.md index 34f7c27b6..f06bbfe6c 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,10 @@ In your `android/app/src/main/AndroidManifest.xml` android:value="YOUR NOTIFICATION CHANNEL NAME"/> + + + @@ -199,6 +203,7 @@ public class MainApplication extends Application implements ReactApplication { ## Usage ```javascript +import PushNotificationIOS from "@react-native-community/push-notification-ios"; var PushNotification = require("react-native-push-notification"); PushNotification.configure({ @@ -207,13 +212,13 @@ PushNotification.configure({ console.log("TOKEN:", token); }, - // (required) Called when a remote or local notification is opened or received + // (required) Called when a remote is received or opened, or local notification is opened onNotification: function (notification) { console.log("NOTIFICATION:", notification); // process the notification - // required on iOS only (see fetchCompletionHandler docs: https://github.com/react-native-community/react-native-push-notification-ios) + // (required) Called when a remote is received or opened, or local notification is opened notification.finish(PushNotificationIOS.FetchResult.NoData); }, @@ -269,7 +274,7 @@ EXAMPLE: ```javascript PushNotification.localNotification({ /* Android Only Properties */ - id: "0", // (optional) Valid unique 32 bit integer specified as string. default: Autogenerated Unique ID + id: 0, // (optional) Valid unique 32 bit integer specified as string. default: Autogenerated Unique ID ticker: "My Notification Ticker", // (optional) autoCancel: true, // (optional) default: true largeIcon: "ic_launcher", // (optional) default: "ic_launcher" @@ -413,6 +418,11 @@ Removes the specified notifications from Notification Center | ----------- | ----- | -------- | ---------------------------------- | | identifiers | array | Yes | Array of notification identifiers. | + +## Abandon Permissions + +`PushNotification.abandonPermissions()` Revokes the current token and unregister for all remote notifications received via APNS or FCM. + ## Notification priority (optional) Specify `priority` to set priority of notification. Default value: "high" @@ -468,7 +478,7 @@ https://developer.android.com/training/monitoring-device-state/doze-standby ## Repeating Notifications -(optional) Specify `repeatType` and optionally `repeatTime` while scheduling the local notification. Check the local notification example above. +(optional) Specify `repeatType` and optionally `repeatTime` (Android-only) while scheduling the local notification. Check the local notification example above. Property `repeatType` could be one of `month`, `week`, `day`, `hour`, `minute`, `time`. If specified as time, it should be accompanied by one more parameter `repeatTime` which should the number of milliseconds between each interval. @@ -527,6 +537,8 @@ Same parameters as `PushNotification.localNotification()` `PushNotification.subscribeToTopic(topic: string)` Subscribe to a topic (works only with Firebase) +`PushNotification.unsubscribeFromTopic(topic: string)` Unsubscribe from a topic (works only with Firebase) + ## Checking Notification Permissions `PushNotification.checkPermissions(callback: Function)` Check permissions @@ -540,5 +552,3 @@ Same parameters as `PushNotification.localNotification()` ## iOS Only Methods `PushNotification.getApplicationIconBadgeNumber(callback: Function)` Get badge number - -`PushNotification.abandonPermissions()` Unregister for all remote notifications received via Apple Push Notification service. diff --git a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotification.java b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotification.java index 11c76ebf0..4ceb65d5c 100644 --- a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotification.java +++ b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotification.java @@ -25,6 +25,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Random; @@ -80,6 +81,8 @@ private Bundle getBundleFromIntent(Intent intent) { } return bundle; } + + @Override public void onNewIntent(Intent intent) { Bundle bundle = this.getBundleFromIntent(intent); if (bundle != null) { @@ -129,6 +132,7 @@ public void requestPermissions() { @Override public void onComplete(@NonNull Task task) { if (!task.isSuccessful()) { + Log.e(LOG_TAG, "exception", task.getException()); return; } @@ -257,4 +261,22 @@ public void getDeliveredNotifications(Callback callback) { public void removeDeliveredNotifications(ReadableArray identifiers) { mRNPushNotificationHelper.clearDeliveredNotifications(identifiers); } + + @ReactMethod + /** + * Unregister for all remote notifications received + */ + public void abandonPermissions() { + new Thread(new Runnable() { + @Override + public void run() { + try { + FirebaseInstanceId.getInstance().deleteInstanceId(); + Log.i(LOG_TAG, "InstanceID deleted"); + } catch (IOException e) { + Log.e(LOG_TAG, "exception", e); + } + } + }).start(); + } } diff --git a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationConfig.java b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationConfig.java index 9814e7c55..f65a8dfc5 100644 --- a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationConfig.java +++ b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationConfig.java @@ -10,6 +10,7 @@ class RNPushNotificationConfig { private static final String KEY_CHANNEL_NAME = "com.dieam.reactnativepushnotification.notification_channel_name"; private static final String KEY_CHANNEL_DESCRIPTION = "com.dieam.reactnativepushnotification.notification_channel_description"; + private static final String KEY_NOTIFICATION_FOREGROUND = "com.dieam.reactnativepushnotification.notification_foreground"; private static final String KEY_NOTIFICATION_COLOR = "com.dieam.reactnativepushnotification.notification_color"; private static Bundle metadata; @@ -53,6 +54,7 @@ public String getChannelDescription() { // Default return ""; } + public int getNotificationColor() { try { int resourceId = metadata.getInt(KEY_NOTIFICATION_COLOR); @@ -63,4 +65,14 @@ public int getNotificationColor() { // Default return -1; } + + public boolean getNotificationForeground() { + try { + return metadata.getBoolean(KEY_NOTIFICATION_FOREGROUND, false); + } catch (Exception e) { + Log.w(RNPushNotification.LOG_TAG, "Unable to find " + KEY_NOTIFICATION_FOREGROUND + " in manifest. Falling back to default"); + } + // Default + return false; + } } diff --git a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java index 8858313b1..926cda374 100644 --- a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java +++ b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationHelper.java @@ -88,13 +88,19 @@ private AlarmManager getAlarmManager() { } private PendingIntent toScheduleNotificationIntent(Bundle bundle) { - int notificationID = Integer.parseInt(bundle.getString("id")); + try { + int notificationID = Integer.parseInt(bundle.getString("id")); - Intent notificationIntent = new Intent(context, RNPushNotificationPublisher.class); - notificationIntent.putExtra(RNPushNotificationPublisher.NOTIFICATION_ID, notificationID); - notificationIntent.putExtras(bundle); + Intent notificationIntent = new Intent(context, RNPushNotificationPublisher.class); + notificationIntent.putExtra(RNPushNotificationPublisher.NOTIFICATION_ID, notificationID); + notificationIntent.putExtras(bundle); - return PendingIntent.getBroadcast(context, notificationID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); + return PendingIntent.getBroadcast(context, notificationID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); + } catch (Exception e) { + Log.e(LOG_TAG, "Unable to parse Notification ID", e); + } + + return null; } public void sendNotificationScheduled(Bundle bundle) { @@ -145,6 +151,10 @@ public void sendNotificationScheduledCore(Bundle bundle) { // notification to the user PendingIntent pendingIntent = toScheduleNotificationIntent(bundle); + if(pendingIntent == null) { + return; + } + Log.d(LOG_TAG, String.format("Setting a notification with id %s at time %s", bundle.getString("id"), Long.toString(fireDate))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -367,11 +377,13 @@ public void sendToNotificationCentre(Bundle bundle) { } soundUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + resId); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // API 26 and higher - channel_id = channel_id + "-" + soundName; - } } + } else { + soundName = "default"; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // API 26 and higher + channel_id = channel_id + "-" + soundName; } notification.setSound(soundUri); @@ -658,7 +670,11 @@ private void cancelScheduledNotification(String notificationIDString) { // remove it from the alarm manger schedule Bundle b = new Bundle(); b.putString("id", notificationIDString); - getAlarmManager().cancel(toScheduleNotificationIntent(b)); + PendingIntent pendingIntent = toScheduleNotificationIntent(b); + + if(pendingIntent != null) { + getAlarmManager().cancel(pendingIntent); + } if (scheduledNotificationsPersistence.contains(notificationIDString)) { // remove it from local storage @@ -672,7 +688,11 @@ private void cancelScheduledNotification(String notificationIDString) { // removed it from the notification center NotificationManager notificationManager = notificationManager(); - notificationManager.cancel(Integer.parseInt(notificationIDString)); + try { + notificationManager.cancel(Integer.parseInt(notificationIDString)); + } catch (Exception e) { + Log.e(LOG_TAG, "Unable to parse Notification ID " + notificationIDString, e); + } } private NotificationManager notificationManager() { @@ -691,10 +711,15 @@ public void checkOrCreateDefaultChannel() { NotificationManager manager = notificationManager(); int importance = NotificationManager.IMPORTANCE_HIGH; + Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + + // Instanciate a default channel with default sound. + String channel_id_sound = NOTIFICATION_CHANNEL_ID + "-default-" + importance + "-" + DEFAULT_VIBRATION; + checkOrCreateChannel(manager, channel_id_sound, soundUri, importance, new long[] {0, DEFAULT_VIBRATION}); - String channel_id = NOTIFICATION_CHANNEL_ID + "-" + importance + "-" + DEFAULT_VIBRATION; - - checkOrCreateChannel(manager, channel_id, null, importance, new long[] {0, DEFAULT_VIBRATION}); + // Instanciate a default channel without sound defined for backward compatibility. + String channel_id_no_sound = NOTIFICATION_CHANNEL_ID + "-" + importance + "-" + DEFAULT_VIBRATION; + checkOrCreateChannel(manager, channel_id_no_sound, null, importance, new long[] {0, DEFAULT_VIBRATION}); } private void checkOrCreateChannel(NotificationManager manager, String channel_id, Uri soundUri, int importance, long[] vibratePattern) { @@ -716,7 +741,7 @@ private void checkOrCreateChannel(NotificationManager manager, String channel_id if (soundUri != null) { AudioAttributes audioAttributes = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setUsage(AudioAttributes.USAGE_ALARM) + .setUsage(AudioAttributes.USAGE_NOTIFICATION) .build(); channel.setSound(soundUri, audioAttributes); diff --git a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationListenerService.java b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationListenerService.java index 34ba6f8f0..df0c52d02 100644 --- a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationListenerService.java +++ b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNPushNotificationListenerService.java @@ -1,86 +1,31 @@ package com.dieam.reactnativepushnotification.modules; -import java.util.Map; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; -import android.app.ActivityManager; -import android.app.ActivityManager.RunningAppProcessInfo; -import android.app.Application; -import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; -import com.dieam.reactnativepushnotification.helpers.ApplicationBadgeHelper; +import com.dieam.reactnativepushnotification.modules.RNReceivedMessageHandler; import com.facebook.react.ReactApplication; import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; - -import org.json.JSONObject; - -import java.util.List; -import java.util.Random; +import com.facebook.react.bridge.WritableMap; import static com.dieam.reactnativepushnotification.modules.RNPushNotification.LOG_TAG; public class RNPushNotificationListenerService extends FirebaseMessagingService { - @Override - public void onMessageReceived(RemoteMessage message) { - String from = message.getFrom(); - RemoteMessage.Notification remoteNotification = message.getNotification(); - final Bundle bundle = new Bundle(); - // Putting it from remoteNotification first so it can be overriden if message - // data has it - if (remoteNotification != null) { - // ^ It's null when message is from GCM - bundle.putString("title", remoteNotification.getTitle()); - bundle.putString("message", remoteNotification.getBody()); - bundle.putString("sound", remoteNotification.getSound()); - bundle.putString("color", remoteNotification.getColor()); - } - - Map notificationData = message.getData(); - - // Copy `twi_body` to `message` to support Twilio - if (notificationData.containsKey("twi_body")) { - bundle.putString("message", notificationData.get("twi_body")); - } - JSONObject data = getPushData(notificationData.get("data")); - - if (data != null) { - if (!bundle.containsKey("message")) { - bundle.putString("message", data.optString("alert", null)); - } - if (!bundle.containsKey("title")) { - bundle.putString("title", data.optString("title", null)); - } - if (!bundle.containsKey("sound")) { - bundle.putString("soundName", data.optString("sound", null)); - } - if (!bundle.containsKey("color")) { - bundle.putString("color", data.optString("color", null)); - } - - final int badge = data.optInt("badge", -1); - if (badge >= 0) { - ApplicationBadgeHelper.INSTANCE.setApplicationIconBadgeNumber(this, badge); - } - } - - Bundle dataBundle = new Bundle(); - for(Map.Entry entry : notificationData.entrySet()) { - dataBundle.putString(entry.getKey(), entry.getValue()); - } - bundle.putParcelable("data", dataBundle); + private RNReceivedMessageHandler mMessageReceivedHandler = new RNReceivedMessageHandler(this); - Log.v(LOG_TAG, "onMessageReceived: " + bundle); + @Override + public void onNewToken(String token) { + final String deviceToken = token; + Log.d(LOG_TAG, "Refreshed token: " + deviceToken); - // We need to run this on the main thread, as the React code assumes that is true. - // Namely, DevServerHelper constructs a Handler() without a Looper, which triggers: - // "Can't create handler inside thread that has not called Looper.prepare()" Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run() { @@ -89,12 +34,12 @@ public void run() { ReactContext context = mReactInstanceManager.getCurrentReactContext(); // If it's constructed, send a notification if (context != null) { - handleRemotePushNotification((ReactApplicationContext) context, bundle); + handleNewToken((ReactApplicationContext) context, deviceToken); } else { // Otherwise wait for construction, then send the notification mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() { public void onReactContextInitialized(ReactContext context) { - handleRemotePushNotification((ReactApplicationContext) context, bundle); + handleNewToken((ReactApplicationContext) context, deviceToken); } }); if (!mReactInstanceManager.hasStartedCreatingInitialContext()) { @@ -106,56 +51,16 @@ public void onReactContextInitialized(ReactContext context) { }); } - private JSONObject getPushData(String dataString) { - try { - return new JSONObject(dataString); - } catch (Exception e) { - return null; - } - } - - private void handleRemotePushNotification(ReactApplicationContext context, Bundle bundle) { - - // If notification ID is not provided by the user for push notification, generate one at random - if (bundle.getString("id") == null) { - Random randomNumberGenerator = new Random(System.currentTimeMillis()); - bundle.putString("id", String.valueOf(randomNumberGenerator.nextInt())); - } - - Boolean isForeground = isApplicationInForeground(); - + private void handleNewToken(ReactApplicationContext context, String token) { RNPushNotificationJsDelivery jsDelivery = new RNPushNotificationJsDelivery(context); - bundle.putBoolean("foreground", isForeground); - bundle.putBoolean("userInteraction", false); - jsDelivery.notifyNotification(bundle); - - // If contentAvailable is set to true, then send out a remote fetch event - if (bundle.getString("contentAvailable", "false").equalsIgnoreCase("true")) { - jsDelivery.notifyRemoteFetch(bundle); - } - Log.v(LOG_TAG, "sendNotification: " + bundle); - if (!isForeground) { - Application applicationContext = (Application) context.getApplicationContext(); - RNPushNotificationHelper pushNotificationHelper = new RNPushNotificationHelper(applicationContext); - pushNotificationHelper.sendToNotificationCentre(bundle); - } + WritableMap params = Arguments.createMap(); + params.putString("deviceToken", token); + jsDelivery.sendEvent("remoteNotificationsRegistered", params); } - private boolean isApplicationInForeground() { - ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); - List processInfos = activityManager.getRunningAppProcesses(); - if (processInfos != null) { - for (RunningAppProcessInfo processInfo : processInfos) { - if (processInfo.processName.equals(getApplication().getPackageName())) { - if (processInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { - for (String d : processInfo.pkgList) { - return true; - } - } - } - } - } - return false; + @Override + public void onMessageReceived(RemoteMessage message) { + mMessageReceivedHandler.handleReceivedMessage(message); } } diff --git a/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNReceivedMessageHandler.java b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNReceivedMessageHandler.java new file mode 100644 index 000000000..04038bc07 --- /dev/null +++ b/android/src/main/java/com/dieam/reactnativepushnotification/modules/RNReceivedMessageHandler.java @@ -0,0 +1,171 @@ +package com.dieam.reactnativepushnotification.modules; + +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; + +import android.app.ActivityManager; +import android.app.ActivityManager.RunningAppProcessInfo; +import android.app.Application; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import androidx.annotation.NonNull; + +import com.dieam.reactnativepushnotification.helpers.ApplicationBadgeHelper; +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.bridge.WritableMap; + +import org.json.JSONObject; + +import java.util.Map; +import java.util.List; +import java.util.Random; + +import static android.content.Context.ACTIVITY_SERVICE; +import static com.dieam.reactnativepushnotification.modules.RNPushNotification.LOG_TAG; + +public class RNReceivedMessageHandler { + private FirebaseMessagingService mFirebaseMessagingService; + + public RNReceivedMessageHandler(@NonNull FirebaseMessagingService service) { + this.mFirebaseMessagingService = service; + } + + public void handleReceivedMessage(RemoteMessage message) { + String from = message.getFrom(); + RemoteMessage.Notification remoteNotification = message.getNotification(); + final Bundle bundle = new Bundle(); + // Putting it from remoteNotification first so it can be overriden if message + // data has it + if (remoteNotification != null) { + // ^ It's null when message is from GCM + bundle.putString("title", remoteNotification.getTitle()); + bundle.putString("message", remoteNotification.getBody()); + bundle.putString("sound", remoteNotification.getSound()); + bundle.putString("color", remoteNotification.getColor()); + } + + Map notificationData = message.getData(); + + // Copy `twi_body` to `message` to support Twilio + if (notificationData.containsKey("twi_body")) { + bundle.putString("message", notificationData.get("twi_body")); + } + JSONObject data = getPushData(notificationData.get("data")); + + if (data != null) { + if (!bundle.containsKey("message")) { + bundle.putString("message", data.optString("alert", null)); + } + if (!bundle.containsKey("title")) { + bundle.putString("title", data.optString("title", null)); + } + if (!bundle.containsKey("sound")) { + bundle.putString("soundName", data.optString("sound", null)); + } + if (!bundle.containsKey("color")) { + bundle.putString("color", data.optString("color", null)); + } + + final int badge = data.optInt("badge", -1); + if (badge >= 0) { + ApplicationBadgeHelper.INSTANCE.setApplicationIconBadgeNumber(mFirebaseMessagingService, badge); + } + } + + Bundle dataBundle = new Bundle(); + for(Map.Entry entry : notificationData.entrySet()) { + dataBundle.putString(entry.getKey(), entry.getValue()); + } + bundle.putParcelable("data", dataBundle); + + Log.v(LOG_TAG, "onMessageReceived: " + bundle); + + // We need to run this on the main thread, as the React code assumes that is true. + // Namely, DevServerHelper constructs a Handler() without a Looper, which triggers: + // "Can't create handler inside thread that has not called Looper.prepare()" + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(new Runnable() { + public void run() { + // Construct and load our normal React JS code bundle + ReactInstanceManager mReactInstanceManager = ((ReactApplication) mFirebaseMessagingService.getApplication()).getReactNativeHost().getReactInstanceManager(); + ReactContext context = mReactInstanceManager.getCurrentReactContext(); + // If it's constructed, send a notificationre + if (context != null) { + handleRemotePushNotification((ReactApplicationContext) context, bundle); + } else { + // Otherwise wait for construction, then send the notification + mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() { + public void onReactContextInitialized(ReactContext context) { + handleRemotePushNotification((ReactApplicationContext) context, bundle); + } + }); + if (!mReactInstanceManager.hasStartedCreatingInitialContext()) { + // Construct it in the background + mReactInstanceManager.createReactContextInBackground(); + } + } + } + }); + } + + private JSONObject getPushData(String dataString) { + try { + return new JSONObject(dataString); + } catch (Exception e) { + return null; + } + } + + private void handleRemotePushNotification(ReactApplicationContext context, Bundle bundle) { + + // If notification ID is not provided by the user for push notification, generate one at random + if (bundle.getString("id") == null) { + Random randomNumberGenerator = new Random(System.currentTimeMillis()); + bundle.putString("id", String.valueOf(randomNumberGenerator.nextInt())); + } + + RNPushNotificationConfig config = new RNPushNotificationConfig(mFirebaseMessagingService.getApplication()); + + Boolean isForeground = isApplicationInForeground(); + + RNPushNotificationJsDelivery jsDelivery = new RNPushNotificationJsDelivery(context); + bundle.putBoolean("foreground", isForeground); + bundle.putBoolean("userInteraction", false); + jsDelivery.notifyNotification(bundle); + + // If contentAvailable is set to true, then send out a remote fetch event + if (bundle.getString("contentAvailable", "false").equalsIgnoreCase("true")) { + jsDelivery.notifyRemoteFetch(bundle); + } + + Log.v(LOG_TAG, "sendNotification: " + bundle); + + if (config.getNotificationForeground() || !isForeground) { + Application applicationContext = (Application) context.getApplicationContext(); + RNPushNotificationHelper pushNotificationHelper = new RNPushNotificationHelper(applicationContext); + pushNotificationHelper.sendToNotificationCentre(bundle); + } + } + + private boolean isApplicationInForeground() { + ActivityManager activityManager = (ActivityManager) mFirebaseMessagingService.getSystemService(ACTIVITY_SERVICE); + List processInfos = activityManager.getRunningAppProcesses(); + if (processInfos != null) { + for (RunningAppProcessInfo processInfo : processInfos) { + if (processInfo.processName.equals(mFirebaseMessagingService.getPackageName()) + && processInfo.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND + && processInfo.pkgList.length > 0) { + return true; + } + } + } + return false; + } + +} diff --git a/component/index.android.js b/component/index.android.js index d9e3424da..13a442ead 100644 --- a/component/index.android.js +++ b/component/index.android.js @@ -61,10 +61,6 @@ NotificationsComponent.prototype.setApplicationIconBadgeNumber = function(number RNPushNotification.setApplicationIconBadgeNumber(number); }; -NotificationsComponent.prototype.abandonPermissions = function() { - /* Void */ -}; - NotificationsComponent.prototype.checkPermissions = function(callback) { RNPushNotification.checkPermissions().then(alert => callback({ alert })); }; @@ -131,6 +127,10 @@ NotificationsComponent.prototype.removeDeliveredNotifications = function(identif RNPushNotification.removeDeliveredNotifications(identifiers); } +NotificationsComponent.prototype.abandonPermissions = function() { + RNPushNotification.abandonPermissions(); +} + module.exports = { state: false, component: new NotificationsComponent() diff --git a/example/App.js b/example/App.js index 67675556d..05840d965 100644 --- a/example/App.js +++ b/example/App.js @@ -49,6 +49,13 @@ export default class App extends Component { }}> Local Notification (now) + { + this.notif.localNotif('sample.mp3'); + }}> + Local Notification with sound (now) + { @@ -56,6 +63,13 @@ export default class App extends Component { }}> Schedule Notification in 30s + { + this.notif.scheduleNotif('sample.mp3'); + }}> + Schedule Notification with sound in 30s + { @@ -84,6 +98,13 @@ export default class App extends Component { }}> Request Permissions + { + this.notif.abandonPermissions(); + }}> + Abandon Permissions + @@ -95,13 +116,10 @@ export default class App extends Component { } onRegister(token) { - //Alert.alert('Registered !', JSON.stringify(token)); - console.log(token); this.setState({registerToken: token.token, fcmRegistered: true}); } onNotif(notif) { - console.log('onNotification', notif); Alert.alert(notif.title, notif.message); } diff --git a/example/NotifService.js b/example/NotifService.js index 5e4b19e90..de686b639 100644 --- a/example/NotifService.js +++ b/example/NotifService.js @@ -1,45 +1,26 @@ import PushNotification from 'react-native-push-notification'; +import NotificationHandler from './NotificationHandler'; export default class NotifService { constructor(onRegister, onNotification) { - this.configure(onRegister, onNotification); - this.lastId = 0; - } - - configure(onRegister, onNotification) { - PushNotification.configure({ - // (optional) Called when Token is generated (iOS and Android) - onRegister: onRegister, //this._onRegister.bind(this), - - // (required) Called when a remote or local notification is opened or received - onNotification: onNotification, //this._onNotification, - // IOS ONLY (optional): default: all - Permissions to register. - permissions: { - alert: true, - badge: true, - sound: true, - }, + NotificationHandler.attachRegister(onRegister); + NotificationHandler.attachNotification(onNotification); - // Should the initial notification be popped automatically - // default: true - popInitialNotification: true, - - /** - * (optional) default: true - * - Specified if permissions (ios) and token (android and ios) will requested or not, - * - if not, you must call PushNotificationsHandler.requestPermissions() later - */ - requestPermissions: true, + // Clear badge number at start + PushNotification.getApplicationIconBadgeNumber(function(number) { + if(number > 0) { + PushNotification.setApplicationIconBadgeNumber(0); + } }); } - localNotif() { + localNotif(soundName) { this.lastId++; PushNotification.localNotification({ /* Android Only Properties */ - id: '' + this.lastId, // (optional) Valid unique 32 bit integer specified as string. default: Autogenerated Unique ID + id: this.lastId, // (optional) Valid unique 32 bit integer specified as string. default: Autogenerated Unique ID ticker: 'My Notification Ticker', // (optional) autoCancel: true, // (optional) default: true largeIcon: 'ic_launcher', // (optional) default: "ic_launcher" @@ -61,20 +42,20 @@ export default class NotifService { /* iOS and Android properties */ title: 'Local Notification', // (optional) message: 'My Notification Message', // (required) - playSound: false, // (optional) default: true - soundName: 'default', // (optional) Sound to play when the notification is shown. Value of 'default' plays the default sound. It can be set to a custom sound such as 'android.resource://com.xyz/raw/my_sound'. It will look for the 'my_sound' audio file in 'res/raw' directory and play it. default: 'default' (default sound is played) + playSound: !!soundName, // (optional) default: true + soundName: soundName ? soundName : 'default', // (optional) Sound to play when the notification is shown. Value of 'default' plays the default sound. It can be set to a custom sound such as 'android.resource://com.xyz/raw/my_sound'. It will look for the 'my_sound' audio file in 'res/raw' directory and play it. default: 'default' (default sound is played) number: 10, // (optional) Valid 32 bit integer specified as string. default: none (Cannot be zero) actions: '["Yes", "No"]', // (Android only) See the doc for notification actions to know more }); } - scheduleNotif() { + scheduleNotif(soundName) { this.lastId++; PushNotification.localNotificationSchedule({ date: new Date(Date.now() + 30 * 1000), // in 30 secs /* Android Only Properties */ - id: '' + this.lastId, // (optional) Valid unique 32 bit integer specified as string. default: Autogenerated Unique ID + id: this.lastId, // (optional) Valid unique 32 bit integer specified as string. default: Autogenerated Unique ID ticker: 'My Notification Ticker', // (optional) autoCancel: true, // (optional) default: true largeIcon: 'ic_launcher', // (optional) default: "ic_launcher" @@ -96,8 +77,9 @@ export default class NotifService { /* iOS and Android properties */ title: 'Scheduled Notification', // (optional) message: 'My Notification Message', // (required) - playSound: true, // (optional) default: true - soundName: 'default', // (optional) Sound to play when the notification is shown. Value of 'default' plays the default sound. It can be set to a custom sound such as 'android.resource://com.xyz/raw/my_sound'. It will look for the 'my_sound' audio file in 'res/raw' directory and play it. default: 'default' (default sound is played) + playSound: !!soundName, // (optional) default: true + number: 10, // (optional) Valid 32 bit integer specified as string. default: none (Cannot be zero) + soundName: soundName ? soundName : 'default', // (optional) Sound to play when the notification is shown. Value of 'default' plays the default sound. It can be set to a custom sound such as 'android.resource://com.xyz/raw/my_sound'. It will look for the 'my_sound' audio file in 'res/raw' directory and play it. default: 'default' (default sound is played) }); } @@ -116,4 +98,8 @@ export default class NotifService { cancelAll() { PushNotification.cancelAllLocalNotifications(); } + + abandonPermissions() { + PushNotification.abandonPermissions(); + } } diff --git a/example/NotificationHandler.js b/example/NotificationHandler.js new file mode 100644 index 000000000..d21992416 --- /dev/null +++ b/example/NotificationHandler.js @@ -0,0 +1,57 @@ +import PushNotification from 'react-native-push-notification'; + +class NotificationHandler { + onNotification(notification) { + console.log('NotificationHandler:', notification); + + if (typeof this._onNotification === 'function') { + this._onNotification(notification); + } + } + + onRegister(token) { + console.log('NotificationHandler:', token); + + if (typeof this._onRegister === 'function') { + this._onRegister(token); + } + } + + attachRegister(handler) { + this._onRegister = handler; + } + + attachNotification(handler) { + this._onNotification = handler; + } +} + +const handler = new NotificationHandler(); + +PushNotification.configure({ + // (optional) Called when Token is generated (iOS and Android) + onRegister: handler.onRegister.bind(handler), + + // (required) Called when a remote or local notification is opened or received + onNotification: handler.onNotification.bind(handler), + + // IOS ONLY (optional): default: all - Permissions to register. + permissions: { + alert: true, + badge: true, + sound: true, + }, + + // Should the initial notification be popped automatically + // default: true + popInitialNotification: true, + + /** + * (optional) default: true + * - Specified if permissions (ios) and token (android and ios) will requested or not, + * - if not, you must call PushNotificationsHandler.requestPermissions() later + */ + requestPermissions: true, +}); + +export default handler; diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index b04f84e1e..8f8efe768 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -44,6 +44,8 @@ + !pQ3OFU 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 literal 0 HcmV?d00001 diff --git a/example/ios/example.xcodeproj/project.pbxproj b/example/ios/example.xcodeproj/project.pbxproj index 3fd964f4b..268d7cc50 100644 --- a/example/ios/example.xcodeproj/project.pbxproj +++ b/example/ios/example.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 4303B027D05E61B36AF2D9DA /* libPods-example-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D89C42625470FE853701396C /* libPods-example-tvOS.a */; }; 4BF20923B09DA7D7C7D74054 /* libPods-example-exampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F3EFF15EA907A6500887787 /* libPods-example-exampleTests.a */; }; 66172E2B135131DB9C88C137 /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 67C595176EF92CCFA00C1943 /* libPods-example.a */; }; + AECB905824658DC600ED1B83 /* sample.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = AECB905724658DC600ED1B83 /* sample.mp3 */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +63,7 @@ 67C595176EF92CCFA00C1943 /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 68FB3463CAEF28E88730ADEE /* Pods-example-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-example-tvOSTests/Pods-example-tvOSTests.release.xcconfig"; sourceTree = ""; }; ACCB69D76B81B3D29BE3BB2B /* libPods-example-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + AECB905724658DC600ED1B83 /* sample.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = sample.mp3; sourceTree = ""; }; AED90B1C243E6D21006F11F7 /* example.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = example.entitlements; path = example/example.entitlements; sourceTree = ""; }; B43E6CF3919EF7ACAF9CC8B7 /* Pods-example-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-example-tvOS/Pods-example-tvOS.debug.xcconfig"; sourceTree = ""; }; C528DBA88EA5CBFA010ECC73 /* Pods-example-exampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-exampleTests.release.xcconfig"; path = "Target Support Files/Pods-example-exampleTests/Pods-example-exampleTests.release.xcconfig"; sourceTree = ""; }; @@ -126,6 +128,7 @@ 13B07FAE1A68108700A75B9A /* example */ = { isa = PBXGroup; children = ( + AECB905724658DC600ED1B83 /* sample.mp3 */, AED90B1C243E6D21006F11F7 /* example.entitlements */, 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, @@ -341,6 +344,7 @@ files = ( 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + AECB905824658DC600ED1B83 /* sample.mp3 in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/example/ios/sample.mp3 b/example/ios/sample.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4569ff11fcc042aee5d6ad89bff692bb04409359 GIT binary patch literal 51457 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 literal 0 HcmV?d00001 diff --git a/index.js b/index.js index fdd2e3250..3dd36a8f9 100644 --- a/index.js +++ b/index.js @@ -18,7 +18,7 @@ var Notifications = { onNotification: false, onRemoteFetch: false, isLoaded: false, - hasPoppedInitialNotification: false, + idInitialNotification: null, isPermissionsRequestPending: false, @@ -84,14 +84,17 @@ Notifications.configure = function(options) { this.isLoaded = true; } - if ( this.hasPoppedInitialNotification === false && - ( options.popInitialNotification === undefined || options.popInitialNotification === true ) ) { + if (options.popInitialNotification === undefined || options.popInitialNotification === true) { this.popInitialNotification(function(firstNotification) { if ( firstNotification !== null ) { - this._onNotification(firstNotification, true); + if(this.idInitialNotification === firstNotification.id) { + return; + } + + this.idInitialNotification = firstNotification.id; + this._onNotification(firstNotification, true); } - }.bind(this)); - this.hasPoppedInitialNotification = true; + }.bind(this)); } if ( options.requestPermissions !== false ) { @@ -140,6 +143,27 @@ Notifications.localNotification = function(details) { userInfo: details.userInfo }); } else { + if(details && typeof details.id === 'number') { + if(isNaN(details.id)) { + console.warn('NaN value has been passed as id'); + delete details.id; + } + else { + details.id = '' + details.id; + } + } + + if(details && typeof details.number === 'number') { + if(isNaN(details.number)) { + console.warn('NaN value has been passed as number'); + delete details.number; + } + else { + details.number = '' + details.number; + } + } + + this.handler.presentLocalNotification(details); } }; @@ -178,6 +202,26 @@ Notifications.localNotificationSchedule = function(details) { } this.handler.scheduleLocalNotification(iosDetails); } else { + if(details && typeof details.id === 'number') { + if(isNaN(details.id)) { + console.warn('NaN value has been passed as id'); + delete details.id; + } + else { + details.id = '' + details.id; + } + } + + if(details && typeof details.number === 'number') { + if(isNaN(details.number)) { + console.warn('NaN value has been passed as number'); + delete details.number; + } + else { + details.number = '' + details.number; + } + } + details.fireDate = details.date.getTime(); delete details.date; // ignore iOS only repeatType @@ -315,14 +359,15 @@ Notifications.popInitialNotification = function(handler) { }); }; -Notifications.abandonPermissions = function() { - return this.callNative('abandonPermissions', arguments); -}; - Notifications.checkPermissions = function() { return this.callNative('checkPermissions', arguments); }; +/* Abandon Permissions */ +Notifications.abandonPermissions = function() { + return this.callNative('abandonPermissions', arguments); +} + Notifications.registerNotificationActions = function() { return this.callNative('registerNotificationActions', arguments) } diff --git a/package.json b/package.json index aee08e70a..cc11f1c34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-push-notification", - "version": "3.3.1", + "version": "3.5.2", "description": "React Native Local and Remote Notifications", "main": "index.js", "scripts": { @@ -14,7 +14,7 @@ "notifications", "push", "apns", - "gcm" + "firebase" ], "bugs": { "url": "https://github.com/zo0r/react-native-push-notification/issues" @@ -24,7 +24,7 @@ "url": "git+ssh://git@github.com:zo0r/react-native-push-notification.git" }, "dependencies": { - "@react-native-community/push-notification-ios": "^1.0.1" + "@react-native-community/push-notification-ios": "^1.2.0" }, "peerDependencies": { "react-native": ">=0.33" diff --git a/submitting-a-pull-request.md b/submitting-a-pull-request.md index 53e46e7ce..8611b5230 100644 --- a/submitting-a-pull-request.md +++ b/submitting-a-pull-request.md @@ -23,7 +23,7 @@ If you are testing someones PR, please provide the following feedback: * are you happy that the change in behaviour works as described, and you have tested the change on all affected operating systems? * in your opinion, is the code written _sensibly_? * is it clean and tidy? - * there are and unnecessary changes? + * there are any unnecessary changes? * is it documented appropriately? - \ No newline at end of file +