From 0c492464f0093552b8ae222de96feb461f51ffbb Mon Sep 17 00:00:00 2001 From: ViscousPot Date: Mon, 23 Dec 2024 11:15:18 +0000 Subject: [PATCH 1/4] add sendService --- .../plus/androidintent/IntentSender.java | 18 ++++++++++++++++++ .../androidintent/MethodCallHandlerImpl.java | 3 +++ .../android_intent_plus_test.dart | 7 +++++++ .../lib/android_intent.dart | 14 ++++++++++++++ .../test/android_intent_test.dart | 14 ++++++++++++++ 5 files changed, 56 insertions(+) diff --git a/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java b/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java index ef2bd7a549..e2c22a36d7 100644 --- a/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java +++ b/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java @@ -63,6 +63,24 @@ void send(Intent intent) { } } + + /** Creates an intent and launches it as a Service. */ + void sendService(Intent intent) { + if (applicationContext == null) { + Log.wtf(TAG, "Trying to send an intent before the applicationContext was initialized."); + return; + } + + Log.v(TAG, "Sending service intent " + intent); + + if (activity != null) { + activity.startService(intent); + } else { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + applicationContext.startService(intent); + } + } + /** * Like with {@code send}, creates and launches an intent with the given params, but wraps the * {@code Intent} with {@code Intent.createChooser}. diff --git a/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/MethodCallHandlerImpl.java b/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/MethodCallHandlerImpl.java index 0cd0a0765f..73c5c65558 100644 --- a/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/MethodCallHandlerImpl.java +++ b/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/MethodCallHandlerImpl.java @@ -114,6 +114,9 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { sender.launchChooser(intent, title); result.success(null); + } else if ("sendService".equalsIgnoreCase(call.method)) { + sender.sendService(intent); + result.success(null); } else if ("sendBroadcast".equalsIgnoreCase(call.method)) { sender.sendBroadcast(intent); result.success(null); diff --git a/packages/android_intent_plus/example/integration_test/android_intent_plus_test.dart b/packages/android_intent_plus/example/integration_test/android_intent_plus_test.dart index 5a81d9e914..341cac544a 100644 --- a/packages/android_intent_plus/example/integration_test/android_intent_plus_test.dart +++ b/packages/android_intent_plus/example/integration_test/android_intent_plus_test.dart @@ -85,6 +85,13 @@ void main() { await intent.launchChooser('title'); }, skip: !Platform.isAndroid); + testWidgets('sendService should not throw', (WidgetTester tester) async { + const intent = AndroidIntent( + action: 'com.example.service', + ); + await intent.sendService(); + }, skip: !Platform.isAndroid); + testWidgets('SendBroadcast should not throw', (WidgetTester tester) async { const intent = AndroidIntent( action: 'com.example.broadcast', diff --git a/packages/android_intent_plus/lib/android_intent.dart b/packages/android_intent_plus/lib/android_intent.dart index 42494eb4aa..b190440ef7 100644 --- a/packages/android_intent_plus/lib/android_intent.dart +++ b/packages/android_intent_plus/lib/android_intent.dart @@ -179,6 +179,20 @@ class AndroidIntent { ); } + /// Sends intent as broadcast. + /// + /// This works only on Android platforms. + Future sendService() async { + if (!_platform.isAndroid) { + return; + } + + await _channel.invokeMethod( + 'sendService', + _buildArguments(), + ); + } + /// Sends intent as broadcast. /// /// This works only on Android platforms. diff --git a/packages/android_intent_plus/test/android_intent_test.dart b/packages/android_intent_plus/test/android_intent_test.dart index 1d39129f2e..120344b8ad 100644 --- a/packages/android_intent_plus/test/android_intent_test.dart +++ b/packages/android_intent_plus/test/android_intent_test.dart @@ -236,6 +236,20 @@ void main() { }); }); + group('sendService', () { + test('send a broadcast', () async { + androidIntent = AndroidIntent.private( + action: 'com.example.service', + channel: mockChannel, + platform: FakePlatform(operatingSystem: 'android'), + ); + await androidIntent.sendService(); + verify(mockChannel.invokeMethod('sendService', { + 'action': 'com.example.service', + })); + }); + }); + group('sendBroadcast', () { test('send a broadcast', () async { androidIntent = AndroidIntent.private( From b9a424e59577f3974f7001f6061d0a410a0c0bbd Mon Sep 17 00:00:00 2001 From: ViscousPot Date: Mon, 23 Dec 2024 11:23:07 +0000 Subject: [PATCH 2/4] fix formatting --- .../dev/fluttercommunity/plus/androidintent/IntentSender.java | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java b/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java index e2c22a36d7..398245cb43 100644 --- a/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java +++ b/packages/android_intent_plus/android/src/main/java/dev/fluttercommunity/plus/androidintent/IntentSender.java @@ -63,7 +63,6 @@ void send(Intent intent) { } } - /** Creates an intent and launches it as a Service. */ void sendService(Intent intent) { if (applicationContext == null) { From 8b6123e7c30bf32cac6154bbdefe3e0a8f1f9fd8 Mon Sep 17 00:00:00 2001 From: ViscousPot <167028444+ViscousPot@users.noreply.github.com> Date: Fri, 3 Jan 2025 20:15:44 +0000 Subject: [PATCH 3/4] Update packages/android_intent_plus/lib/android_intent.dart Co-authored-by: Miguel Beltran --- packages/android_intent_plus/lib/android_intent.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/android_intent_plus/lib/android_intent.dart b/packages/android_intent_plus/lib/android_intent.dart index b190440ef7..d6e2fff3f1 100644 --- a/packages/android_intent_plus/lib/android_intent.dart +++ b/packages/android_intent_plus/lib/android_intent.dart @@ -179,7 +179,7 @@ class AndroidIntent { ); } - /// Sends intent as broadcast. + /// Starts intent as service. /// /// This works only on Android platforms. Future sendService() async { From d6b37cb62cfe45831a71832ca7ccc13ce2331b9f Mon Sep 17 00:00:00 2001 From: ViscousPot <167028444+ViscousPot@users.noreply.github.com> Date: Fri, 3 Jan 2025 20:15:51 +0000 Subject: [PATCH 4/4] Update packages/android_intent_plus/test/android_intent_test.dart Co-authored-by: Miguel Beltran --- packages/android_intent_plus/test/android_intent_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/android_intent_plus/test/android_intent_test.dart b/packages/android_intent_plus/test/android_intent_test.dart index 120344b8ad..ce6fd3d4c5 100644 --- a/packages/android_intent_plus/test/android_intent_test.dart +++ b/packages/android_intent_plus/test/android_intent_test.dart @@ -237,7 +237,7 @@ void main() { }); group('sendService', () { - test('send a broadcast', () async { + test('start a service', () async { androidIntent = AndroidIntent.private( action: 'com.example.service', channel: mockChannel,