From 2400265cfcc49d5050aaaefb505cdc7b54812fcc Mon Sep 17 00:00:00 2001 From: nicole-chen-fivestars Date: Wed, 1 Aug 2018 14:50:22 -0700 Subject: [PATCH 1/5] Add sendGlobalBroadcast --- src/android/CDVBroadcaster.java | 36 +++++++++++++++++++++++++++++++-- www/broadcaster.js | 4 ++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/android/CDVBroadcaster.java b/src/android/CDVBroadcaster.java index 79930ce..9e41979 100644 --- a/src/android/CDVBroadcaster.java +++ b/src/android/CDVBroadcaster.java @@ -60,7 +60,8 @@ else if( data instanceof JSONObject ) { * @param filter */ protected void registerReceiver(android.content.BroadcastReceiver receiver, android.content.IntentFilter filter) { - LocalBroadcastManager.getInstance(super.webView.getContext()).registerReceiver(receiver,filter); + // LocalBroadcastManager.getInstance(super.webView.getContext()).registerReceiver(receiver,filter); + this.webView.getContext().registerReceiver(receiver, filter); } /** @@ -68,7 +69,8 @@ protected void registerReceiver(android.content.BroadcastReceiver receiver, andr * @param receiver */ protected void unregisterReceiver(android.content.BroadcastReceiver receiver) { - LocalBroadcastManager.getInstance(super.webView.getContext()).unregisterReceiver(receiver); + // LocalBroadcastManager.getInstance(super.webView.getContext()).unregisterReceiver(receiver); + this.webView.getContext().unregisterReceiver(receiver); } /** @@ -107,6 +109,18 @@ private void fireNativeEvent( final String eventName, JSONObject userData ) { sendBroadcast( intent ); } + private void sendGlobalBroadcast(final String eventName, final String actionName, JSONObject userData) { + if( eventName == null ) { + throw new IllegalArgumentException("eventName parameter is null!"); + } + + final Intent intent = new Intent(eventName) + .setAction(actionName) + .putExtras(toBundle(new Bundle(), userData)); + + this.webView.getContext().sendBroadcast(intent); + } + /** * * @param action The action to execute. @@ -137,6 +151,24 @@ public void run() { callbackContext.success(); return true; } + else if (action.equals("sendGlobalBroadcast")) { + final String eventName = args.getString(0); + if( eventName==null || eventName.isEmpty() ) { + callbackContext.error(EVENTNAME_ERROR); + } + final String actionName = args.getString(1); + final JSONObject userData = args.getJSONObject(2); + + cordova.getThreadPool().execute(new Runnable() { + @Override + public void run() { + sendGlobalBroadcast(eventName, actionName, userData); + } + }); + + callbackContext.success(); + return true; + } else if (action.equals("addEventListener")) { final String eventName = args.getString(0); diff --git a/www/broadcaster.js b/www/broadcaster.js index d8f4a4d..3816ace 100644 --- a/www/broadcaster.js +++ b/www/broadcaster.js @@ -43,6 +43,10 @@ Broadcaster.prototype.fireNativeEvent = function(eventname, data, success, error exec(success, error, "broadcaster", "fireNativeEvent", [ eventname, data ]); } +Broadcaster.prototype.sendGlobalBroadcast = function(eventname, actionname, data, success, error) { + exec(success, error, "broadcaster", "sendGlobalBroadcast", [eventname, actionname, data]) +} + Broadcaster.prototype.fireEvent = function(type, data) { if( !this.channelExists(type) ) return; From 0051a14e28e8a2ffc0921bc8ea12f7a3f052508c Mon Sep 17 00:00:00 2001 From: nicole-chen-fivestars Date: Wed, 1 Aug 2018 14:58:32 -0700 Subject: [PATCH 2/5] Add Log statements --- src/android/CDVBroadcaster.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/android/CDVBroadcaster.java b/src/android/CDVBroadcaster.java index 9e41979..762d171 100644 --- a/src/android/CDVBroadcaster.java +++ b/src/android/CDVBroadcaster.java @@ -114,6 +114,9 @@ private void sendGlobalBroadcast(final String eventName, final String actionName throw new IllegalArgumentException("eventName parameter is null!"); } + Log.w("eventName: ", eventName); + Log.w("actionName: ", actionName); + final Intent intent = new Intent(eventName) .setAction(actionName) .putExtras(toBundle(new Bundle(), userData)); From 3c6db3cdd0b1e571ec5503b93fbaa70a802d1e51 Mon Sep 17 00:00:00 2001 From: nicole-chen-fivestars Date: Wed, 1 Aug 2018 15:58:51 -0700 Subject: [PATCH 3/5] Add return statement for debugging --- src/android/CDVBroadcaster.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/android/CDVBroadcaster.java b/src/android/CDVBroadcaster.java index 762d171..9561504 100644 --- a/src/android/CDVBroadcaster.java +++ b/src/android/CDVBroadcaster.java @@ -109,7 +109,7 @@ private void fireNativeEvent( final String eventName, JSONObject userData ) { sendBroadcast( intent ); } - private void sendGlobalBroadcast(final String eventName, final String actionName, JSONObject userData) { + private String sendGlobalBroadcast(final String eventName, final String actionName, JSONObject userData) { if( eventName == null ) { throw new IllegalArgumentException("eventName parameter is null!"); } @@ -122,6 +122,7 @@ private void sendGlobalBroadcast(final String eventName, final String actionName .putExtras(toBundle(new Bundle(), userData)); this.webView.getContext().sendBroadcast(intent); + return intent.toString(); } /** From 352e33d74b7c9c1b22d68a6a808380fa7892afa8 Mon Sep 17 00:00:00 2001 From: nicole-chen-fivestars Date: Fri, 3 Aug 2018 10:41:37 -0700 Subject: [PATCH 4/5] Update readme --- README.md | 134 ++++++++++++------------------------------------------ 1 file changed, 29 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index 22ae631..748fb8b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cordova Broadcaster -Cordova Plugin to allow message exchange between javascript and native (and viceversa). +Cordova Plugin to allow global message exchange between javascript and native (and viceversa). Based (forked off of) on [bsorrentino's cordova broadcaster](https://github.com/bsorrentino/cordova-broadcaster) [![npm](https://img.shields.io/npm/v/cordova-plugin-broadcaster.svg)](https://www.npmjs.com/package/cordova-plugin-broadcaster) [![Join the chat at https://gitter.im/bsorrentino/cordova-broadcaster](https://badges.gitter.im/bsorrentino/cordova-broadcaster.svg)](https://gitter.im/bsorrentino/cordova-broadcaster?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) @@ -14,133 +14,57 @@ Broadcaster plugin providing bridge for the following native technologies: IOS | **[NotificationCenter](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/index.html#//apple_ref/occ/instm/NSNotificationCenter/addObserverForName%3aobject%3aqueue%3ausingBlock%3a)** Android | **[LocalBroadcastManager](http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html)** -## News - date | infos | refs ----- | ---- | ---- -Jan 16, 2018 | I've developed a complete **ionic3** sample project using **broadcaster** | [ionic-broadcaster-sample](https://github.com/bsorrentino/ionic-broadcaster-sample) -Jan 28, 2017 | such plugin has been added to [ionic-native](https://ionicframework.com/docs/v2/native/broadcaster/) distribution | **How to** is available [here](https://ionicframework.com/docs/v2/native/broadcaster/) - - - -## Installation - -```javascript -$ cordova create [ID [NAME [CONFIG]]] [options] -$ cd -$ cordova platform add [ios|android] -$ cordova plugin add cordova-plugin-broadcaster -``` - ## Usage: -### From Native to Javascript +### From Native to Javascript (global broadcast) #### Javascript ```javascript - console.log( "register didShow received!" ); - - var listener = function( e ) { - //log: didShow received! userInfo: {"data":"test"} - console.log( "didShow received! userInfo: " + JSON.stringify(e) ); - } - - window.broadcaster.addEventListener( "didShow", listener); +window.broadcaster.addEventListener(“INTENT_NAME”, sample_func) +var sample_func = function (intent_extras) { + var sample_extra = intent_extras['EXAMPLE_KEY']; + console.log(sample_extra); // "EXAMPLE_DATA" +} ``` #### ANDROID ```Java -final Intent intent = new Intent("didShow"); - -Bundle b = new Bundle(); -b.putString( "data", "test" ); -intent.putExtras( b); - -LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent); +val sample_intent = Intent(“INTENT_NAME”) +sample_intent.putExtra("EXAMPLE_KEY", "EXAMPLE_DATA") +applicationContext.sendBroadcast(sample_intent) ``` -#### IOS - -##### Objective-C -```Objective-C -[[NSNotificationCenter defaultCenter] postNotificationName:@"didShow" - object:nil - userInfo:@{ @"data":@"test"}]; -``` - -##### Swift -```swift -let nc = NSNotificationCenter.default -nc.post(name:"didShow", object: nil, userInfo: ["data":"test"]) -``` - -#### BROWSER - -```javascript - -let event = new CustomEvent("didShow", { detail: { data:"test"} } ); -document.dispatchEvent( event ) - -``` -### From Javascript to Native +### From Javascript to Native (global broadcast) #### Javascript ```javascript - window.broadcaster.fireNativeEvent( "test.event", { item:'test data' }, function() { - console.log( "event fired!" ); - } ); +window.broadcaster.sendGlobalBroadcast(“INTENT_NAME”, “INTENT_ACTION”, {“example_key”: “example_data”}) ``` #### ANDROID ```Java -final BroadcastReceiver receiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String data = intent.getExtras().getString("data"); - - Log.d("CDVBroadcaster", - String.format("Native event [%s] received with data [%s]", intent.getAction(), data)); - +// First create an inner class (non-static) that can be registered dynamically in the code. +// (non-static -> register dynamically programmatically; static -> register in manifest) +inner class MTabBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + // TO GET INTENT_EXTRAS + val extra = intent?.extras.get(“example_key”) // “example_data” + when (intent?.action) { + “INTENT_ACTION” -> {} + else -> {} } -}; - -LocalBroadcastManager.getInstance(this) - .registerReceiver(receiver, new IntentFilter("test.event")); + } } -``` - -#### IOS - -##### Objective-C - -```Objective-C -[[NSNotificationCenter defaultCenter] addObserverForName:@"test.event" - object:nil - queue:[NSOperationQueue mainQueue] - usingBlock:^(NSNotification *notification) { - NSLog(@"Handled 'test.event' [%@]", notification.userInfo[@"item"]); - }]; -``` - -##### Swift 3.0 - -```swift -let nc = NotificationCenter.default -nc.addObserver(forName:Notification.Name(rawValue:"test.event"), - object:nil, queue:nil) { - notification in - print( "\(notification.userInfo)") -} -``` - -#### BROWSER - -```javascript -document.addEventListener( "test.event", ( ev:Event ) => { - console.log( "test event", ev.detail ); -}); +// Then, register the receiver in onCreate() or onServiceConnected() +mtabReceiver = MTabBroadcastReceiver() +val mtabIntent = IntentFilter(“INTENT_NAME”) // must match or else it won’t be received +mtabIntent.addAction(“INTENT_ACTION”) // must match or else it won’t be received +registerReceiver(mtabReceiver, mtabIntent) +// Remember to unregister the receiver in onDestroy() to prevent a leak +unregister(mtabReceiver) ``` From 58a8e86ea9e53a67de49f5f9add1d289ff0cb69d Mon Sep 17 00:00:00 2001 From: nicole-chen-fivestars Date: Fri, 3 Aug 2018 14:34:58 -0700 Subject: [PATCH 5/5] Put back readme for local broadcasts --- README.md | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/README.md b/README.md index 748fb8b..104a5d9 100644 --- a/README.md +++ b/README.md @@ -68,3 +68,115 @@ registerReceiver(mtabReceiver, mtabIntent) // Remember to unregister the receiver in onDestroy() to prevent a leak unregister(mtabReceiver) ``` + +### From Native to Javascript (locally) + +#### Javascript +```javascript + console.log( "register didShow received!" ); + + var listener = function( e ) { + //log: didShow received! userInfo: {"data":"test"} + console.log( "didShow received! userInfo: " + JSON.stringify(e) ); + } + + window.broadcaster.addEventListener( "didShow", listener); +``` + +#### ANDROID + +```Java +final Intent intent = new Intent("didShow"); + +Bundle b = new Bundle(); +b.putString( "data", "test" ); +intent.putExtras( b); + +LocalBroadcastManager.getInstance(this).sendBroadcastSync(intent); +``` + +#### IOS + +##### Objective-C +```Objective-C +[[NSNotificationCenter defaultCenter] postNotificationName:@"didShow" + object:nil + userInfo:@{ @"data":@"test"}]; +``` + +##### Swift +```swift +let nc = NSNotificationCenter.default +nc.post(name:"didShow", object: nil, userInfo: ["data":"test"]) +``` + +#### BROWSER + +```javascript + +let event = new CustomEvent("didShow", { detail: { data:"test"} } ); +document.dispatchEvent( event ) + +``` +### From Javascript to Native (locally) + +#### Javascript + +```javascript + window.broadcaster.fireNativeEvent( "test.event", { item:'test data' }, function() { + console.log( "event fired!" ); + } ); + ``` + +#### ANDROID + +```Java +final BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String data = intent.getExtras().getString("data"); + + Log.d("CDVBroadcaster", + String.format("Native event [%s] received with data [%s]", intent.getAction(), data)); + + } +}; + +LocalBroadcastManager.getInstance(this) + .registerReceiver(receiver, new IntentFilter("test.event")); +} +``` + +#### IOS + +##### Objective-C + +```Objective-C +[[NSNotificationCenter defaultCenter] addObserverForName:@"test.event" + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *notification) { + NSLog(@"Handled 'test.event' [%@]", notification.userInfo[@"item"]); + }]; +``` + +##### Swift 3.0 + +```swift +let nc = NotificationCenter.default +nc.addObserver(forName:Notification.Name(rawValue:"test.event"), + object:nil, queue:nil) { + notification in + print( "\(notification.userInfo)") +} +``` + +#### BROWSER + +```javascript + +document.addEventListener( "test.event", ( ev:Event ) => { + console.log( "test event", ev.detail ); +}); + +``` \ No newline at end of file