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