From 4d685a9ac4d5b7033823e65aaa5980951086506d Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Tue, 24 Jan 2017 10:00:42 +0200 Subject: [PATCH 1/9] #327799 Add a "before prepare" hook to amend the build.gradle file, if project targets Android and doesn't use the google service plugin. --- hooks/before-prepare.js | 31 ++++++++++ hooks/utils.js | 130 ++++++++++++++++++++++++++++++++++++++++ package.json | 16 ++++- postinstall.js | 6 ++ preuninstall.js | 1 + 5 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 hooks/before-prepare.js create mode 100644 hooks/utils.js create mode 100644 postinstall.js create mode 100644 preuninstall.js diff --git a/hooks/before-prepare.js b/hooks/before-prepare.js new file mode 100644 index 0000000..bb440cd --- /dev/null +++ b/hooks/before-prepare.js @@ -0,0 +1,31 @@ +var utils = require('./utils'); + +module.exports = function ($logger, $projectData) { + + // No need to check if file exists cause it's a before-prepare hook and + // if android cmd is run, it is added as a platform automatically + + utils.setLogger(_log); + + if (utils.targetsAndroid($projectData.projectDir)) { + _log('parsing'); + utils.parseAndAdd($projectData.platformsDir); + } else { + _log('NOT parsing'); + } + + function _log (str) { + $logger.info(str); + } +}; + +// function _printObj (obj) { +// var str; +// try { +// str = JSON.stringify(obj); +// } catch (ex) { +// str = 'keys: ' + JSON.stringify(Object.keys(obj)); +// } + +// return str; +// } diff --git a/hooks/utils.js b/hooks/utils.js new file mode 100644 index 0000000..a1174d2 --- /dev/null +++ b/hooks/utils.js @@ -0,0 +1,130 @@ +var path = require('path'); +var fs = require('fs'); +var os = require('os'); + +var PLUGIN_VERSION = '3.0.0'; +var _log = console.log.bind(console); + +function targetsAndroid (projectDir) { + var pkg = require(path.join(projectDir, 'package.json')); + if (!pkg.nativescript) { + throw new Error('Not a NativeScript project'); + } + + return ('tns-android' in pkg.nativescript); +} + +function buildGradleExists (platformsDir) { + return fs.existsSync(_getBuildGradlePath(platformsDir)); +} + +function checkForGoogleServicesJson (projectDir, resourcesDir) { + var androidIsTargeted = targetsAndroid(projectDir); + var resourcesPath = path.join(resourcesDir, 'Android', 'google-services.json'); + + if (androidIsTargeted && !fs.existsSync(resourcesPath)) { + _log('|!| google-services.json appears to be missing. Please make sure it is present in the "app/App_Resources/Android" folder, in order to use FCM push notifications |!|'); + } +} + +function parseAndAdd (platformsDir) { + var path = _getBuildGradlePath(platformsDir); + var fileContents = fs.readFileSync(path, 'utf8'); + + var pluginImported = _checkForImport(fileContents); + var pluginApplied = _checkForApplication(fileContents); + _log('imp: ' + pluginImported); + _log('app: ' + pluginApplied); + + var newContents = fileContents; + + if (!pluginImported) { + newContents = _addPluginImport(fileContents); + } + + if (!pluginApplied) { + newContents = _addPluginApplication(newContents); + } + + fs.writeFileSync(path, newContents, 'utf8'); +} + +function setLogger (logFunc) { + _log = logFunc; +} + +// ============= private + +function _addPluginImport (buildGradleContents) { + var importStatement = 'classpath "com.android.tools.build:gradle'; + + var ind = buildGradleContents.indexOf(importStatement); + if (ind === -1) { + ind = buildGradleContents.indexOf('classpath \'com.android.tools.build:gradle'); // with single quote + } + + if (ind === -1) { + _log('build.gradle has unexpected contents -- please check it manually'); + return buildGradleContents; + } + + var result = buildGradleContents.substring(0, ind); + result += 'classpath "com.google.gms:google-services:' + PLUGIN_VERSION + '"' + os.EOL; + result += '\t\t' + importStatement; + result += buildGradleContents.substring(ind + 'classpath "com.android.tools.build:gradle'.length); + return result; +} + +function _addPluginApplication (buildGradleContents) { + buildGradleContents += os.EOL + 'apply plugin: "com.google.gms.google-services"' + os.EOL; + return buildGradleContents; +} + +function _formNamePartOfRegExp () { + var pluginName = 'com.google.gms.google-services'; + return '[\'"]' + pluginName; +} + +function _checkForImport (buildGradleContents) { + var re = new RegExp('classpath +' + _formNamePartOfRegExp(), 'i'); + return re.test(buildGradleContents); +} + +function _checkForApplication (buildGradleContents) { + var re = new RegExp('apply plugin: +' + _formNamePartOfRegExp(), 'i'); + return re.test(buildGradleContents); +} + +function _getBuildGradlePath (platformsDir) { + return path.join(platformsDir, 'android', 'build.gradle'); +} + +// ============= end private + +module.exports = { + setLogger: setLogger, + parseAndAdd: parseAndAdd, + targetsAndroid: targetsAndroid, + buildGradleExists: buildGradleExists, + checkForGoogleServicesJson: checkForGoogleServicesJson +}; + + + +// TODO: remove + +// function _printObj (obj) { +// var str; +// try { +// str = JSON.str(obj); +// } catch (ex) { +// str = JSON.stringify(Object.keys(obj)); +// } + +// return str; +// } + + + +// parseAndAdd('./', function (str) {console.log(str)}); + diff --git a/package.json b/package.json index 7cc4b6f..df848d1 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,20 @@ "platforms": { "ios": "2.4.0", "android": "2.4.1" - } + }, + "hooks": [ + { + "type": "before-prepare", + "script": "hooks/before-prepare.js", + "inject": true + } + ] + }, + "scripts": { + "postinstall": "node postinstall.js", + "preuninstall": "node preuninstall.js" + }, + "dependencies": { + "nativescript-hook": "0.2.1" } } diff --git a/postinstall.js b/postinstall.js new file mode 100644 index 0000000..2570712 --- /dev/null +++ b/postinstall.js @@ -0,0 +1,6 @@ +require('nativescript-hook')(__dirname).postinstall(); +var path = require('path'); +var utils = require('./hooks/utils'); +var projDir = path.resolve(__dirname, '../../'); + +utils.checkForGoogleServicesJson(projDir, path.join(projDir, 'app', 'App_Resources')); diff --git a/preuninstall.js b/preuninstall.js new file mode 100644 index 0000000..66718d9 --- /dev/null +++ b/preuninstall.js @@ -0,0 +1 @@ +require('nativescript-hook')(__dirname).preuninstall(); From 5eb81ab0152b08bd24ba50e42cbfed7073474b59 Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Tue, 24 Jan 2017 10:36:16 +0200 Subject: [PATCH 2/9] #327799 Add check for missing file, despite project targeting Android. --- hooks/before-prepare.js | 10 ++++------ hooks/utils.js | 8 +++++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hooks/before-prepare.js b/hooks/before-prepare.js index bb440cd..2b77460 100644 --- a/hooks/before-prepare.js +++ b/hooks/before-prepare.js @@ -2,20 +2,18 @@ var utils = require('./utils'); module.exports = function ($logger, $projectData) { - // No need to check if file exists cause it's a before-prepare hook and - // if android cmd is run, it is added as a platform automatically + // No need to check if file exists cause it's a before-prepare hook + // and if project targets Android, platforms dir is already created. + // If Android is not set up correctly, platform is not added and then we log an error utils.setLogger(_log); if (utils.targetsAndroid($projectData.projectDir)) { - _log('parsing'); utils.parseAndAdd($projectData.platformsDir); - } else { - _log('NOT parsing'); } function _log (str) { - $logger.info(str); + $logger.info('nativescript-push-notifications -- ' + str); } }; diff --git a/hooks/utils.js b/hooks/utils.js index a1174d2..8b2356a 100644 --- a/hooks/utils.js +++ b/hooks/utils.js @@ -29,12 +29,14 @@ function checkForGoogleServicesJson (projectDir, resourcesDir) { function parseAndAdd (platformsDir) { var path = _getBuildGradlePath(platformsDir); - var fileContents = fs.readFileSync(path, 'utf8'); + + if (!fs.existsSync(path)) { + return _log('build.gradle file not found'); + } + var fileContents = fs.readFileSync(path, 'utf8'); var pluginImported = _checkForImport(fileContents); var pluginApplied = _checkForApplication(fileContents); - _log('imp: ' + pluginImported); - _log('app: ' + pluginApplied); var newContents = fileContents; From 63b9ea6614e5e0b1045d7a6e705490c5972a8fe0 Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Tue, 24 Jan 2017 13:48:32 +0200 Subject: [PATCH 3/9] #327799 Add removal of gradle plugin upon uninstall of the push plugin. --- hooks/before-prepare.js | 15 +---- hooks/utils.js | 127 ++++++++++++++++++++++++---------------- postinstall.js | 1 + preuninstall.js | 5 ++ 4 files changed, 85 insertions(+), 63 deletions(-) diff --git a/hooks/before-prepare.js b/hooks/before-prepare.js index 2b77460..f40057b 100644 --- a/hooks/before-prepare.js +++ b/hooks/before-prepare.js @@ -4,26 +4,15 @@ module.exports = function ($logger, $projectData) { // No need to check if file exists cause it's a before-prepare hook // and if project targets Android, platforms dir is already created. - // If Android is not set up correctly, platform is not added and then we log an error + // If Android is not set up correctly, platform is not added and we log an error utils.setLogger(_log); if (utils.targetsAndroid($projectData.projectDir)) { - utils.parseAndAdd($projectData.platformsDir); + utils.addIfNecessary($projectData.platformsDir); } function _log (str) { $logger.info('nativescript-push-notifications -- ' + str); } }; - -// function _printObj (obj) { -// var str; -// try { -// str = JSON.stringify(obj); -// } catch (ex) { -// str = 'keys: ' + JSON.stringify(Object.keys(obj)); -// } - -// return str; -// } diff --git a/hooks/utils.js b/hooks/utils.js index 8b2356a..1910a84 100644 --- a/hooks/utils.js +++ b/hooks/utils.js @@ -2,7 +2,7 @@ var path = require('path'); var fs = require('fs'); var os = require('os'); -var PLUGIN_VERSION = '3.0.0'; +var PLUGIN_VERSION = '+'; var _log = console.log.bind(console); function targetsAndroid (projectDir) { @@ -27,42 +27,87 @@ function checkForGoogleServicesJson (projectDir, resourcesDir) { } } -function parseAndAdd (platformsDir) { +function addOnPluginInstall (platformsDir) { var path = _getBuildGradlePath(platformsDir); - - if (!fs.existsSync(path)) { + if (buildGradleExists(platformsDir)) { + addIfNecessary(platformsDir); + } +} + +function addIfNecessary (platformsDir) { + _amendBuildGradle(platformsDir, function (pluginImported, pluginApplied, fileContents) { + var newContents = fileContents; + if (!pluginImported) { + newContents = _addPluginImport(newContents); + } + + if (!pluginApplied) { + newContents = _addPluginApplication(newContents); + } + return newContents; + }); +} + +function removeIfPresent (platformsDir) { + _amendBuildGradle(platformsDir, function (pluginImported, pluginApplied, fileContents) { + var newFileContents = fileContents; + if (pluginImported) { + newFileContents = _removePluginImport(newFileContents); + } + + if (pluginApplied) { + newFileContents = _removePluginApplication(newFileContents); + } + return newFileContents; + }); +} + +function setLogger (logFunc) { + _log = logFunc; +} + +// ============= private + +var _quotesRegExp = '["\']'; +var _versionRegExp = '[^\'"]+'; +var _pluginImportName = 'com.google.gms:google-services'; +var _pluginApplicationName = 'com.google.gms.google-services'; + +function _amendBuildGradle (platformsDir, applyAmendment) { + var path = _getBuildGradlePath(platformsDir); + + if (!buildGradleExists(platformsDir)) { return _log('build.gradle file not found'); } var fileContents = fs.readFileSync(path, 'utf8'); var pluginImported = _checkForImport(fileContents); var pluginApplied = _checkForApplication(fileContents); + var newContents = applyAmendment(pluginImported, pluginApplied, fileContents); - var newContents = fileContents; - - if (!pluginImported) { - newContents = _addPluginImport(fileContents); - } - - if (!pluginApplied) { - newContents = _addPluginApplication(newContents); - } - fs.writeFileSync(path, newContents, 'utf8'); } -function setLogger (logFunc) { - _log = logFunc; +function _removePluginImport (buildGradleContents) { + var regExpStr = '\\s*classpath +' + _formNamePartOfRegExp(true) + '{0,0}:' + _versionRegExp + _quotesRegExp; + var regExp = new RegExp(regExpStr, 'i'); + return buildGradleContents.replace(regExp, ''); } -// ============= private +function _removePluginApplication (buildGradleContents) { + var regExpStr = '\\s*apply plugin: +' + _formNamePartOfRegExp(false); + var regExp = new RegExp(regExpStr, 'i'); + return buildGradleContents.replace(regExp, ''); +} function _addPluginImport (buildGradleContents) { - var importStatement = 'classpath "com.android.tools.build:gradle'; + var androidGradle = 'com.android.tools.build:gradle'; + var insertBeforeDoubleQuotes = 'classpath "' + androidGradle; + var insertBeforeSingleQoutes = 'classpath \'' + androidGradle; - var ind = buildGradleContents.indexOf(importStatement); + var ind = buildGradleContents.indexOf(insertBeforeDoubleQuotes); if (ind === -1) { - ind = buildGradleContents.indexOf('classpath \'com.android.tools.build:gradle'); // with single quote + ind = buildGradleContents.indexOf(insertBeforeSingleQoutes); } if (ind === -1) { @@ -71,29 +116,29 @@ function _addPluginImport (buildGradleContents) { } var result = buildGradleContents.substring(0, ind); - result += 'classpath "com.google.gms:google-services:' + PLUGIN_VERSION + '"' + os.EOL; - result += '\t\t' + importStatement; - result += buildGradleContents.substring(ind + 'classpath "com.android.tools.build:gradle'.length); + result += 'classpath "' + _pluginImportName + ':' + PLUGIN_VERSION + '"' + os.EOL; + result += '\t\t' + insertBeforeDoubleQuotes; + result += buildGradleContents.substring(ind + ('classpath "' + androidGradle).length); return result; } function _addPluginApplication (buildGradleContents) { - buildGradleContents += os.EOL + 'apply plugin: "com.google.gms.google-services"' + os.EOL; + buildGradleContents += os.EOL + 'apply plugin: "' + _pluginApplicationName + '"' + os.EOL; return buildGradleContents; } -function _formNamePartOfRegExp () { - var pluginName = 'com.google.gms.google-services'; - return '[\'"]' + pluginName; +function _formNamePartOfRegExp (useImportName) { + var name = useImportName ? _pluginImportName : _pluginApplicationName; + return _quotesRegExp + name + _quotesRegExp; } function _checkForImport (buildGradleContents) { - var re = new RegExp('classpath +' + _formNamePartOfRegExp(), 'i'); + var re = new RegExp('classpath +' + _formNamePartOfRegExp(true) + '{0,0}', 'i'); return re.test(buildGradleContents); } function _checkForApplication (buildGradleContents) { - var re = new RegExp('apply plugin: +' + _formNamePartOfRegExp(), 'i'); + var re = new RegExp('apply plugin: +' + _formNamePartOfRegExp(false), 'i'); return re.test(buildGradleContents); } @@ -104,29 +149,11 @@ function _getBuildGradlePath (platformsDir) { // ============= end private module.exports = { + removeIfPresent: removeIfPresent, setLogger: setLogger, - parseAndAdd: parseAndAdd, + addIfNecessary: addIfNecessary, targetsAndroid: targetsAndroid, buildGradleExists: buildGradleExists, + addOnPluginInstall: addOnPluginInstall, checkForGoogleServicesJson: checkForGoogleServicesJson }; - - - -// TODO: remove - -// function _printObj (obj) { -// var str; -// try { -// str = JSON.str(obj); -// } catch (ex) { -// str = JSON.stringify(Object.keys(obj)); -// } - -// return str; -// } - - - -// parseAndAdd('./', function (str) {console.log(str)}); - diff --git a/postinstall.js b/postinstall.js index 2570712..3604e32 100644 --- a/postinstall.js +++ b/postinstall.js @@ -4,3 +4,4 @@ var utils = require('./hooks/utils'); var projDir = path.resolve(__dirname, '../../'); utils.checkForGoogleServicesJson(projDir, path.join(projDir, 'app', 'App_Resources')); +utils.addOnPluginInstall(path.join(projDir, 'platforms')); diff --git a/preuninstall.js b/preuninstall.js index 66718d9..5865817 100644 --- a/preuninstall.js +++ b/preuninstall.js @@ -1 +1,6 @@ require('nativescript-hook')(__dirname).preuninstall(); +var path = require('path'); +var utils = require('./hooks/utils'); +var platformsDir = path.resolve(__dirname, '../../platforms'); + +utils.removeIfPresent(platformsDir); From fe13eb660a0f7fcd4cd2f13e24f092e8683d8db9 Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Tue, 24 Jan 2017 14:50:23 +0200 Subject: [PATCH 4/9] #327800 Add the "foreground" property to the data object, passed to the onMessageReceived callback. --- .../com/telerik/pushplugin/PushPlugin.java | 1 + platforms/android/pushplugin.aar | Bin 58963 -> 59013 bytes 2 files changed, 1 insertion(+) diff --git a/native-src/android/app/src/main/java/com/telerik/pushplugin/PushPlugin.java b/native-src/android/app/src/main/java/com/telerik/pushplugin/PushPlugin.java index 21e396c..0ccf066 100644 --- a/native-src/android/app/src/main/java/com/telerik/pushplugin/PushPlugin.java +++ b/native-src/android/app/src/main/java/com/telerik/pushplugin/PushPlugin.java @@ -89,6 +89,7 @@ private static JsonObjectExtended convertMapToJson(Map data) { for (String key: data.keySet()) { json.put(key, JsonObjectExtended.wrap(data.get(key))); } + json.put("foreground", PushPlugin.isActive); } catch (JSONException ex) { Log.d(TAG, "Error thrown while parsing push notification data bundle to json: " + ex.getMessage()); } diff --git a/platforms/android/pushplugin.aar b/platforms/android/pushplugin.aar index 9f507c0241ab9ce18f093f20fa6bdfec0932fad1..7cc48a69de56bc973ebe456e6213fdb166ca9cf4 100644 GIT binary patch delta 14768 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 E3j%E%4FCWD delta 14690 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 Date: Tue, 24 Jan 2017 16:42:08 +0200 Subject: [PATCH 5/9] #326191 Add Typescript definitions for both platforms. --- definitions.d.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 definitions.d.ts diff --git a/definitions.d.ts b/definitions.d.ts new file mode 100644 index 0000000..e138828 --- /dev/null +++ b/definitions.d.ts @@ -0,0 +1,60 @@ +export declare interface IosInteractiveNotificationAction { + identifier: string; + title: string; + activationMode?: string; + destructive?: boolean; + authenticationRequired?: boolean; + behavior?: string; +} + +export declare interface IosInteractiveNotificationCategory { + identifier: string; + actionsForDefaultContext: string[]; + actionsForMinimalContext: string[]; +} + +export declare interface IosRegistrationOptions { + badge: boolean; + sound: boolean; + alert: boolean; + clearBadge: boolean; + interactiveSettings: { + actions: IosInteractiveNotificationAction[], + categories: IosInteractiveNotificationCategory[] + }, + notificationCallbackIOS: (message: string) => void; +} + +export declare interface NSError { + code: number; + domain: string; + userInfo: any +} + +export declare interface FcmNotificaion { + getBody(): string; + getBodyLocalizationArgs(): string[]; + getBodyLocalizationKey(): string; + getClickAction(): string; + getColor(): string; + getIcon(): string; + getSound(): string; + getTag(): string; + getTitle(): string; + getTitleLocalizationArgs(): string[]; + getTitleLocalizationKey(): string; +} + +// Common +export declare function register(options: IosRegistrationOptions, successCallback: (token: string) => void, errorCallback: (error: NSError) => void); +export declare function register(options: { senderID: string }, successCallback: (fcmRegistrationToken: string) => void, errorCallback: (errorMessage: string) => void); +export declare function unregister(successCallback: (successMessage: string) => void); // iOS +export declare function unregister(successCallback: (successMessage: string) => void, errorCallback: (errorMessage: string) => void, options: { senderID: string }); +export declare function areNotificationsEnabled(callback: (boolean) => void); + +// Android only +export declare function onMessageReceived(callback: (message: string, stringifiedData: string, fcmNotification: FcmNotificaion) => void); +export declare function onTokenRefresh(callback: () => void); + +// iOS only +export declare function registerUserNotificationSettings(successCallback: () => void, errorCallback: (error: NSError) => void); diff --git a/package.json b/package.json index 7cc4b6f..f8595da 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,6 @@ "ios": "2.4.0", "android": "2.4.1" } - } + }, + "typings": "./definitions.d.ts" } From a7b42fab702d487815cc629bfeef8d54e208f640 Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Wed, 25 Jan 2017 12:06:11 +0200 Subject: [PATCH 6/9] #326191 Fix hooking to native Android app events to be after app launches. --- push-plugin.android.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/push-plugin.android.js b/push-plugin.android.js index 60c986c..4ae5564 100644 --- a/push-plugin.android.js +++ b/push-plugin.android.js @@ -1,15 +1,14 @@ module.exports = (function () { var app = require('application'); - - (function() { - // Hook on the application events + + // Hook on the application events + app.on(app.launchEvent, function () { com.telerik.pushplugin.PushLifecycleCallbacks.registerCallbacks(app.android.nativeApp); - })(); + }); var pluginObject = { register: function (options, successCallback, errorCallback) { com.telerik.pushplugin.PushPlugin.register(app.android.context, options.senderID, - //Success new com.telerik.pushplugin.PushPluginListener( { success: successCallback, From c27cdcdcd6ecd72c33654b1fb3b129bfd3e33c69 Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Wed, 1 Feb 2017 13:39:30 +0200 Subject: [PATCH 7/9] #326191 Fix return types of plugin functions. --- definitions.d.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/definitions.d.ts b/definitions.d.ts index e138828..367bf4c 100644 --- a/definitions.d.ts +++ b/definitions.d.ts @@ -46,15 +46,15 @@ export declare interface FcmNotificaion { } // Common -export declare function register(options: IosRegistrationOptions, successCallback: (token: string) => void, errorCallback: (error: NSError) => void); -export declare function register(options: { senderID: string }, successCallback: (fcmRegistrationToken: string) => void, errorCallback: (errorMessage: string) => void); -export declare function unregister(successCallback: (successMessage: string) => void); // iOS -export declare function unregister(successCallback: (successMessage: string) => void, errorCallback: (errorMessage: string) => void, options: { senderID: string }); -export declare function areNotificationsEnabled(callback: (boolean) => void); +export declare function register(options: IosRegistrationOptions, successCallback: (token: string) => void, errorCallback: (error: NSError) => void): void; +export declare function register(options: { senderID: string }, successCallback: (fcmRegistrationToken: string) => void, errorCallback: (errorMessage: string) => void): void; +export declare function unregister(successCallback: (successMessage: string) => void): void; // iOS +export declare function unregister(successCallback: (successMessage: string) => void, errorCallback: (errorMessage: string) => void, options: { senderID: string }): void; +export declare function areNotificationsEnabled(callback: (boolean) => void): void; // Android only -export declare function onMessageReceived(callback: (message: string, stringifiedData: string, fcmNotification: FcmNotificaion) => void); -export declare function onTokenRefresh(callback: () => void); +export declare function onMessageReceived(callback: (message: string, stringifiedData: string, fcmNotification: FcmNotificaion) => void): void; +export declare function onTokenRefresh(callback: () => void): void; // iOS only -export declare function registerUserNotificationSettings(successCallback: () => void, errorCallback: (error: NSError) => void); +export declare function registerUserNotificationSettings(successCallback: () => void, errorCallback: (error: NSError) => void): void; From b7bf90a205be75420b6537f7387a8ab0ec3885df Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Wed, 1 Feb 2017 16:08:06 +0200 Subject: [PATCH 8/9] #326191 Rebuild .arr file with all changes. --- platforms/android/pushplugin.aar | Bin 59013 -> 58997 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/platforms/android/pushplugin.aar b/platforms/android/pushplugin.aar index 7cc48a69de56bc973ebe456e6213fdb166ca9cf4..ac9f7928ea7127a1b7d9136982cddf0f5557f3e2 100644 GIT binary patch delta 14723 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 delta 14756 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 P4}=5(x%k@w0`h+V>h~cZ From ee7f7dd57bc0eef16df69385078095d7adbbfe58 Mon Sep 17 00:00:00 2001 From: Georgi Prodanov Date: Thu, 2 Feb 2017 11:34:50 +0200 Subject: [PATCH 9/9] #326191 Fix attaching to native android app lifecycle events. --- .../telerik/pushplugin/PushLifecycleCallbacks.java | 2 +- push-plugin.android.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/native-src/android/app/src/main/java/com/telerik/pushplugin/PushLifecycleCallbacks.java b/native-src/android/app/src/main/java/com/telerik/pushplugin/PushLifecycleCallbacks.java index 363c594..4da892f 100644 --- a/native-src/android/app/src/main/java/com/telerik/pushplugin/PushLifecycleCallbacks.java +++ b/native-src/android/app/src/main/java/com/telerik/pushplugin/PushLifecycleCallbacks.java @@ -42,7 +42,7 @@ public void onActivityPaused(Activity activity) { } public void onActivityResumed(Activity activity) { - Log.d(PushPlugin.TAG, "onActivityPaused: Application has been started"); + Log.d(PushPlugin.TAG, "onActivityResumed: Application has been started"); // the application has been resumed-> the push plugin is now in active/foreground state PushPlugin.isActive = true; diff --git a/push-plugin.android.js b/push-plugin.android.js index 4ae5564..b55e0ab 100644 --- a/push-plugin.android.js +++ b/push-plugin.android.js @@ -1,10 +1,15 @@ module.exports = (function () { var app = require('application'); + var registerLifecycleEvents = function () { + com.telerik.pushplugin.PushLifecycleCallbacks.registerCallbacks(app.android.nativeApp); + }; // Hook on the application events - app.on(app.launchEvent, function () { - com.telerik.pushplugin.PushLifecycleCallbacks.registerCallbacks(app.android.nativeApp); - }); + if (app.android.nativeApp) { + registerLifecycleEvents(); + } else { + app.on(app.launchEvent, registerLifecycleEvents); + } var pluginObject = { register: function (options, successCallback, errorCallback) {