WIP #471 Handling basic notifications in native code
This commit is contained in:
		| @@ -80,6 +80,7 @@ flutter { | ||||
| dependencies { | ||||
|     implementation 'com.google.firebase:firebase-analytics:17.2.2' | ||||
|     implementation 'com.google.firebase:firebase-messaging:20.2.0' | ||||
|     implementation 'androidx.work:work-runtime:2.3.4' | ||||
|     testImplementation 'junit:junit:4.12' | ||||
|     androidTestImplementation 'com.android.support.test:runner:1.0.2' | ||||
|     androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' | ||||
|   | ||||
| @@ -48,15 +48,15 @@ | ||||
|                 <category android:name="android.intent.category.LAUNCHER"/> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
| <!-- | ||||
|  | ||||
|         <service | ||||
|             android:name=".java.MyFirebaseMessagingService" | ||||
|             android:name=".MessagingService" | ||||
|             android:exported="false"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="com.google.firebase.MESSAGING_EVENT" /> | ||||
|             </intent-filter> | ||||
|         </service> | ||||
|     --> | ||||
|      | ||||
|         <service | ||||
|             android:name="io.flutter.plugins.androidalarmmanager.AlarmService" | ||||
|             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