From 80350cfe208ea532c6449d89eadc1429bf33edf9 Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Wed, 5 Dec 2018 10:55:28 -0800 Subject: [PATCH 1/3] Add Set External ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Adds functions to set an external ID for a user so that developers can use their own internal userID's with OneSignal --- example/lib/main.dart | 46 ++++++++++++++++++++++++++++++++++- ios/Classes/OneSignalPlugin.m | 4 +++ lib/onesignal.dart | 12 +++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 2305d05c..7a24016d 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -14,6 +14,7 @@ class MyApp extends StatefulWidget { class _MyAppState extends State { String _debugLabelString = ""; String _emailAddress; + String _externalUserId; bool _enableConsentButton = false; // CHANGE THIS parameter to true if you want to test GDPR privacy consent @@ -141,6 +142,21 @@ class _MyAppState extends State { }); } + void _handleSetExternalUserId() { + print("Setting external user ID"); + OneSignal.shared.setExternalUserId(_externalUserId); + this.setState(() { + _debugLabelString = "Set External User ID"; + }); + } + + void _handleRemoveExternalUserId() { + OneSignal.shared.removeExternalUserId(); + this.setState(() { + _debugLabelString = "Removed external user ID"; + }); + } + void _handleConsent() { print("Setting consent to true"); OneSignal.shared.consentGranted(true); @@ -285,12 +301,40 @@ class _MyAppState extends State { new OneSignalButton("Post Silent Notification", _handleSendSilentNotification, !_enableConsentButton) ]), + new TableRow(children: [ + new TextField( + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: "External User ID", + labelStyle: TextStyle( + color: Color.fromARGB(255, 212, 86, 83), + )), + onChanged: (text) { + this.setState(() { + _externalUserId = text == "" ? null : text; + }); + }, + ) + ]), + new TableRow(children: [ + Container( + height: 8.0, + ) + ]), + new TableRow(children: [ + new OneSignalButton( + "Set External User ID", _handleSetExternalUserId, !_enableConsentButton) + ]), + new TableRow(children: [ + new OneSignalButton( + "Remove External User ID", _handleRemoveExternalUserId, !_enableConsentButton) + ]), new TableRow(children: [ new Container( child: new Text(_debugLabelString), alignment: Alignment.center, ) - ]) + ]), ], ), ), diff --git a/ios/Classes/OneSignalPlugin.m b/ios/Classes/OneSignalPlugin.m index a9024ce5..e0c7b224 100644 --- a/ios/Classes/OneSignalPlugin.m +++ b/ios/Classes/OneSignalPlugin.m @@ -126,6 +126,10 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self logoutEmail:call withResult:result]; } else if ([@"OneSignal#didSetNotificationOpenedHandler" isEqualToString:call.method]) { [self didSetNotificationOpenedHandler]; + } else if ([@"OneSignal#setExternalUserId" isEqualToString:call.method]) { + [OneSignal setExternalUserId:call.arguments[@"externalUserId"]]; + } else if ([@"OneSignal#removeExternalUserId" isEqualToString:call.method]) { + [OneSignal removeExternalUserId]; } else { result(FlutterMethodNotImplemented); } diff --git a/lib/onesignal.dart b/lib/onesignal.dart index 35ee8663..a39c4e7f 100644 --- a/lib/onesignal.dart +++ b/lib/onesignal.dart @@ -262,6 +262,18 @@ class OneSignal { return await _channel.invokeMethod("OneSignal#logoutEmail"); } + /// OneSignal allows you to set a custom ID for your users. This makes it so that + /// if your app has its own user ID's, you can use your own custom user ID's with + /// our API instead of having to save their OneSignal user ID's. + Future setExternalUserId(String externalId) async { + return await _channel.invokeMethod("OneSignal#setExternalUserId", {'externalUserId' : externalId}); + } + + /// Removes the external user ID that was set for the current user. + Future removeExternalUserId() async { + return await _channel.invokeMethod("OneSignal#removeExternalUserId"); + } + // Private function that gets called by ObjC/Java Future _handleMethod(MethodCall call) async { if (call.method == 'OneSignal#handleReceivedNotification' && From cef7773146e4974594414d493738f8680c42a6fa Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 6 Dec 2018 17:25:39 -0800 Subject: [PATCH 2/3] Android Implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Implements the external ID methods for Android • Updates Android and iOS native SDKs --- android/build.gradle | 2 +- .../onesignal/flutter/OneSignalPlugin.java | 16 ++++++++++ example/ios/Podfile | 2 +- example/lib/main.dart | 30 +++++++++---------- example/pubspec.yaml | 3 -- ios/onesignal.podspec | 2 +- pubspec.yaml | 4 +-- 7 files changed, 36 insertions(+), 23 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 58a69aba..2001c506 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -34,7 +34,7 @@ android { } dependencies { - compile('com.onesignal:OneSignal:3.10.3') + compile('com.onesignal:OneSignal:3.10.5') } // Adds required manifestPlaceholders keys to allow mainifest merge gradle step to complete diff --git a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java index 7ed88415..e5bb1ba1 100644 --- a/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java +++ b/android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java @@ -92,6 +92,10 @@ else if (call.method.contentEquals("OneSignal#promptPermission")) Log.e("onesignal", "promptPermission() is not applicable in Android."); else if (call.method.contentEquals("OneSignal#didSetNotificationOpenedHandler")) this.didSetNotificationOpenedHandler(); + else if (call.method.contentEquals("OneSignal#setExternalUserId")) + this.setExternalUserId(call, result); + else if (call.method.contentEquals("OneSignal#removeExternalUserId")) + this.removeExternalUserId(result); else result.notImplemented(); } @@ -250,6 +254,18 @@ private void didSetNotificationOpenedHandler() { } } + private void setExternalUserId(MethodCall call, Result result) { + OneSignal.setExternalUserId((String)call.argument("externalUserId")); + + result.success(null); + } + + private void removeExternalUserId(Result result) { + OneSignal.removeExternalUserId(); + + result.success(null); + } + @Override public void onOSSubscriptionChanged(OSSubscriptionStateChanges stateChanges) { this.channel.invokeMethod("OneSignal#subscriptionChanged", OneSignalSerializer.convertSubscriptionStateChangesToMap(stateChanges)); diff --git a/example/ios/Podfile b/example/ios/Podfile index e60b61b2..fe0497d1 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -55,7 +55,7 @@ target 'Runner' do end target 'OneSignalNotificationServiceExtension' do - pod 'OneSignal', '>= 2.9.3', '< 3.0' + pod 'OneSignal', '>= 2.9.4', '< 3.0' end post_install do |installer| diff --git a/example/lib/main.dart b/example/lib/main.dart index 7a24016d..d0e56d03 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -142,21 +142,6 @@ class _MyAppState extends State { }); } - void _handleSetExternalUserId() { - print("Setting external user ID"); - OneSignal.shared.setExternalUserId(_externalUserId); - this.setState(() { - _debugLabelString = "Set External User ID"; - }); - } - - void _handleRemoveExternalUserId() { - OneSignal.shared.removeExternalUserId(); - this.setState(() { - _debugLabelString = "Removed external user ID"; - }); - } - void _handleConsent() { print("Setting consent to true"); OneSignal.shared.consentGranted(true); @@ -181,6 +166,21 @@ class _MyAppState extends State { }); } + void _handleSetExternalUserId() { + print("Setting external user ID"); + OneSignal.shared.setExternalUserId(_externalUserId); + this.setState(() { + _debugLabelString = "Set External User ID"; + }); + } + + void _handleRemoveExternalUserId() { + OneSignal.shared.removeExternalUserId(); + this.setState(() { + _debugLabelString = "Removed external user ID"; + }); + } + void _handleSendNotification() async { var status = await OneSignal.shared.getPermissionSubscriptionState(); diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e41e708a..e5395782 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -4,9 +4,6 @@ description: Demonstrates how to use the onesignal plugin. dependencies: flutter: sdk: flutter - - flutter_test: - sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 diff --git a/ios/onesignal.podspec b/ios/onesignal.podspec index 1098774e..f1a6203b 100644 --- a/ios/onesignal.podspec +++ b/ios/onesignal.podspec @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.dependency 'OneSignal', '>= 2.9.3', '< 3.0' + s.dependency 'OneSignal', '>= 2.9.4', '< 3.0' s.ios.deployment_target = '8.0' end diff --git a/pubspec.yaml b/pubspec.yaml index 7dc42725..4f9f45e8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,5 +18,5 @@ dev_dependencies: sdk: flutter environment: - sdk: ">=2.1.0-dev.7.1 <3.0.0" - flutter: ">=0.10.1-pre.45 <2.0.0" + sdk: ">=2.0.0-dev.28.0 <3.0.0" + flutter: ">=0.1.4 <2.0.0" \ No newline at end of file From 27ddffe962acf1dfb02ff5f00de324274c322a65 Mon Sep 17 00:00:00 2001 From: Brad Hesse Date: Thu, 6 Dec 2018 17:45:41 -0800 Subject: [PATCH 3/3] Fix Tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Fixes an issue with the tests. Apparently Flutter no longer bundles its test framework automatically and it must now be included as an explicit dependency. --- pubspec.yaml | 1 + test/mock_channel.dart | 7 +++++++ test/onesignal_test.dart | 12 ++++++++++++ 3 files changed, 20 insertions(+) diff --git a/pubspec.yaml b/pubspec.yaml index 4f9f45e8..e7718f8e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: sdk: flutter dev_dependencies: + test: ^1.5.1 flutter_test: sdk: flutter diff --git a/test/mock_channel.dart b/test/mock_channel.dart index b2d435a2..d3706bf6 100644 --- a/test/mock_channel.dart +++ b/test/mock_channel.dart @@ -64,6 +64,12 @@ class OneSignalMockChannelController { case "OneSignal#deleteTags": this.state.deleteTags = call.arguments; return {"success": true}; + case "OneSignal#setExternalUserId": + this.state.externalId = (call.arguments as Map)['externalUserId'] as String; + return {"success" : true}; + case "OneSignal#removeExternalUserId": + this.state.externalId = null; + return {"success" : true}; } } } @@ -90,6 +96,7 @@ class OneSignalState { bool locationShared; OSNotificationDisplayType inFocusDisplayType; bool subscriptionState; + String externalId; // tags Map tags; diff --git a/test/onesignal_test.dart b/test/onesignal_test.dart index 9c73beab..fb975dd6 100644 --- a/test/onesignal_test.dart +++ b/test/onesignal_test.dart @@ -111,4 +111,16 @@ void main() { expect(channelController.state.deleteTags, ['test1']); })); }); + + test('setting external user ID', () { + onesignal.setExternalUserId('test_ext_id').then(expectAsync1((v) { + expect(channelController.state.externalId, 'test_ext_id'); + })); + }); + + test('removing external user ID', () { + onesignal.removeExternalUserId().then(expectAsync1((v) { + expect(channelController.state.externalId, null); + })); + }); }