WIP #471 Handling basic notifications in native code
This commit is contained in:
		| @@ -80,6 +80,7 @@ flutter { | |||||||
| dependencies { | dependencies { | ||||||
|     implementation 'com.google.firebase:firebase-analytics:17.2.2' |     implementation 'com.google.firebase:firebase-analytics:17.2.2' | ||||||
|     implementation 'com.google.firebase:firebase-messaging:20.2.0' |     implementation 'com.google.firebase:firebase-messaging:20.2.0' | ||||||
|  |     implementation 'androidx.work:work-runtime:2.3.4' | ||||||
|     testImplementation 'junit:junit:4.12' |     testImplementation 'junit:junit:4.12' | ||||||
|     androidTestImplementation 'com.android.support.test:runner:1.0.2' |     androidTestImplementation 'com.android.support.test:runner:1.0.2' | ||||||
|     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' |     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' | ||||||
|   | |||||||
| @@ -48,15 +48,15 @@ | |||||||
|                 <category android:name="android.intent.category.LAUNCHER"/> |                 <category android:name="android.intent.category.LAUNCHER"/> | ||||||
|             </intent-filter> |             </intent-filter> | ||||||
|         </activity> |         </activity> | ||||||
| <!-- |  | ||||||
|         <service |         <service | ||||||
|             android:name=".java.MyFirebaseMessagingService" |             android:name=".MessagingService" | ||||||
|             android:exported="false"> |             android:exported="false"> | ||||||
|             <intent-filter> |             <intent-filter> | ||||||
|                 <action android:name="com.google.firebase.MESSAGING_EVENT" /> |                 <action android:name="com.google.firebase.MESSAGING_EVENT" /> | ||||||
|             </intent-filter> |             </intent-filter> | ||||||
|         </service> |         </service> | ||||||
|     --> |      | ||||||
|         <service |         <service | ||||||
|             android:name="io.flutter.plugins.androidalarmmanager.AlarmService" |             android:name="io.flutter.plugins.androidalarmmanager.AlarmService" | ||||||
|             android:permission="android.permission.BIND_JOB_SERVICE" |             android:permission="android.permission.BIND_JOB_SERVICE" | ||||||
|   | |||||||
| @@ -0,0 +1,95 @@ | |||||||
|  | package com.keyboardcrumbs.hassclient; | ||||||
|  |  | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
|  | import android.app.NotificationChannel; | ||||||
|  | import android.app.NotificationManager; | ||||||
|  | import android.app.PendingIntent; | ||||||
|  | import android.content.Context; | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.media.RingtoneManager; | ||||||
|  | import android.net.Uri; | ||||||
|  | import android.os.Build; | ||||||
|  | import androidx.core.app.NotificationCompat; | ||||||
|  | import android.util.Log; | ||||||
|  |  | ||||||
|  | import com.google.firebase.messaging.FirebaseMessagingService; | ||||||
|  | import com.google.firebase.messaging.RemoteMessage; | ||||||
|  |  | ||||||
|  | import androidx.work.OneTimeWorkRequest; | ||||||
|  | import androidx.work.WorkManager; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | public class MessagingService extends FirebaseMessagingService { | ||||||
|  |  | ||||||
|  |     private static final String TAG = "MessagingService"; | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onMessageReceived(RemoteMessage remoteMessage) { | ||||||
|  |         Log.d(TAG, "From: " + remoteMessage.getFrom()); | ||||||
|  |         Map<String, String> data = remoteMessage.getData(); | ||||||
|  |         if (data.size() > 0) { | ||||||
|  |            Log.d(TAG, "Message data payload: " + data); | ||||||
|  |            if (data.containsKey("body") || data.containsKey("title")) { | ||||||
|  |                 sendNotification( | ||||||
|  |                     data.get("body"), | ||||||
|  |                     data.get("title"), | ||||||
|  |                     data.get("channelId"), | ||||||
|  |                     data.get("action1"), | ||||||
|  |                     data.get("action2"), | ||||||
|  |                     data.get("action3") | ||||||
|  |                     ); | ||||||
|  |            } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void onNewToken(String token) { | ||||||
|  |         Log.d(TAG, "Refreshed token: " + token); | ||||||
|  |         //TODO update token | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void executeAction() { | ||||||
|  |         OneTimeWorkRequest work = new OneTimeWorkRequest.Builder(NotificationActionWorker.class) | ||||||
|  |                 .build(); | ||||||
|  |         WorkManager.getInstance().beginWith(work).enqueue(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void sendNotification(String messageBody, String messageTitle, String channelId, String action1, String action2, String action3) { | ||||||
|  |         if (channelId == null) { | ||||||
|  |             channelId = "ha_notify"; | ||||||
|  |         } | ||||||
|  |         if (messageBody == null) { | ||||||
|  |             messageBody = ""; | ||||||
|  |         } | ||||||
|  |         if (messageTitle == null) { | ||||||
|  |             messageTitle = "HA Client"; | ||||||
|  |         } | ||||||
|  |         Intent intent = new Intent(this, MainActivity.class); | ||||||
|  |         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | ||||||
|  |         PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, | ||||||
|  |                 PendingIntent.FLAG_ONE_SHOT); | ||||||
|  |         Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); | ||||||
|  |         NotificationCompat.Builder notificationBuilder = | ||||||
|  |                 new NotificationCompat.Builder(this, channelId) | ||||||
|  |                         .setSmallIcon(R.drawable.mini_icon) | ||||||
|  |                         .setContentTitle(messageTitle) | ||||||
|  |                         .setContentText(messageBody) | ||||||
|  |                         .setAutoCancel(false) | ||||||
|  |                         .setSound(defaultSoundUri) | ||||||
|  |                         .setContentIntent(pendingIntent); | ||||||
|  |  | ||||||
|  |         NotificationManager notificationManager = | ||||||
|  |                 (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); | ||||||
|  |  | ||||||
|  |         // Since android Oreo notification channel is needed. | ||||||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||||||
|  |             NotificationChannel channel = new NotificationChannel(channelId, | ||||||
|  |                     "Home Assistant notifications", | ||||||
|  |                     NotificationManager.IMPORTANCE_DEFAULT); | ||||||
|  |             notificationManager.createNotificationChannel(channel); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,25 @@ | |||||||
|  | package com.keyboardcrumbs.hassclient; | ||||||
|  |  | ||||||
|  | import android.content.Context; | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | import android.util.Log; | ||||||
|  |  | ||||||
|  | import androidx.work.Worker; | ||||||
|  | import androidx.work.WorkerParameters; | ||||||
|  |  | ||||||
|  | public class NotificationActionWorker extends Worker { | ||||||
|  |  | ||||||
|  |     private static final String TAG = "NotificationActionWorker"; | ||||||
|  |  | ||||||
|  |     public NotificationActionWorker(@NonNull Context appContext, @NonNull WorkerParameters workerParams) { | ||||||
|  |         super(appContext, workerParams); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @NonNull | ||||||
|  |     @Override | ||||||
|  |     public Result doWork() { | ||||||
|  |         Log.d(TAG, "Performing long running task in scheduled job"); | ||||||
|  |         // TODO(developer): add long running task here. | ||||||
|  |         return Result.success(); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user