Fix Notification

This commit is contained in:
phanhuuloi27
2022-06-15 21:22:29 +07:00
parent f26cacbfa5
commit 77c393a191
29 changed files with 614 additions and 249 deletions
+10 -7
View File
@@ -46,20 +46,23 @@ dependencies {
//Add library
implementation 'com.google.firebase:firebase-core:10.2.0'
implementation 'com.google.firebase:firebase-database:10.2.0'
implementation 'com.google.firebase:firebase-core:11.8.0'
implementation 'com.google.firebase:firebase-database:11.8.0'
implementation 'com.firebaseui:firebase-ui-database:1.2.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.google.firebase:firebase-auth:10.2.0'
implementation 'com.google.firebase:firebase-storage:10.2.0'
implementation 'com.google.firebase:firebase-auth:11.8.0'
implementation 'com.google.firebase:firebase-storage:11.8.0'
implementation 'com.github.jd-alexander:android-flat-button:v1.1'
implementation 'com.rengwuxian.materialedittext:library:2.1.4'
implementation 'com.jaredrummler:material-spinner:1.1.0'
implementation 'com.google.android.gms:play-services-maps:10.2.0'
implementation 'com.google.android.gms:play-services:10.2.0'
implementation 'com.google.android.gms:play-services-maps:11.8.0'
implementation 'com.google.android.gms:play-services:11.8.0'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.google.firebase:firebase-messaging:11.8.0'
}
apply plugin: 'com.google.gms.google-services'
+15 -5
View File
@@ -20,11 +20,6 @@
android:name=".OrderDetail"
android:exported="false" />
<service
android:name=".Service.ListenOrder"
android:enabled="true"
android:exported="true" />
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
@@ -70,6 +65,21 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".Service.MyFirebaseIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<service
android:name=".Service.MyFirebaseMessaging"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>
@@ -7,6 +7,7 @@ import android.graphics.Paint;
import com.waterbase.foodifyServer.Model.Request;
import com.waterbase.foodifyServer.Model.User;
import com.waterbase.foodifyServer.Remote.APIService;
import com.waterbase.foodifyServer.Remote.IGeoCoordinates;
import com.waterbase.foodifyServer.Remote.RetrofitClient;
@@ -20,6 +21,12 @@ public class Common {
public static final String baseUrl = "https://maps.googleapis.com";
private static final String fcmUrl = "https://fcm.googleapis.com/";
public static APIService getFCMClient(){
return RetrofitClient.getClient(fcmUrl).create(APIService.class);
}
public static String coverCodeToStatus(String code){
if(code.equals("0"))
return "Placed";
@@ -35,6 +35,7 @@ import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
@@ -44,7 +45,7 @@ import com.squareup.picasso.Picasso;
import com.waterbase.foodifyServer.Model.Category;
import com.waterbase.foodifyServer.Common.Common;
import com.waterbase.foodifyServer.Interface.ItemClickListener;
import com.waterbase.foodifyServer.Service.ListenOrder;
import com.waterbase.foodifyServer.Model.Token;
import com.waterbase.foodifyServer.ViewHolder.MenuViewHolder;
import java.util.UUID;
@@ -118,12 +119,18 @@ public class Home extends AppCompatActivity implements NavigationView.OnNavigati
loadMenu();
//Call service
Intent service = new Intent(Home.this, ListenOrder.class);
startService(service);
//Send token
updateToken(FirebaseInstanceId.getInstance().getToken());
}
private void updateToken(String token) {
FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference tokens = db.getReference("Tokens");
Token data = new Token(token, true);
tokens.child(Common.currentUser.getPhone()).setValue(data);
}
private void showDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(Home.this);
alertDialog.setTitle("Thêm danh mục:");
@@ -0,0 +1,11 @@
package com.waterbase.foodifyServer.Model;
import java.util.List;
public class MyResponse {
public long multicast_id;
public int success;
public int failure;
public int canonical_ids;
public List<Result> results;
}
@@ -0,0 +1,27 @@
package com.waterbase.foodifyServer.Model;
public class Notification {
public String body;
public String title;
public Notification(String body, String title) {
this.body = body;
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
@@ -0,0 +1,5 @@
package com.waterbase.foodifyServer.Model;
public class Result {
public String message_id;
}
@@ -0,0 +1,11 @@
package com.waterbase.foodifyServer.Model;
public class Sender {
public String to;
public Notification notification;
public Sender(String to, Notification notification) {
this.to = to;
this.notification = notification;
}
}
@@ -0,0 +1,27 @@
package com.waterbase.foodifyServer.Model;
public class Token {
private String token;
private boolean isServerToken;
public Token(String token, boolean isServerToken) {
this.token = token;
this.isServerToken = isServerToken;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public boolean isServerToken() {
return isServerToken;
}
public void setServerToken(boolean serverToken) {
isServerToken = serverToken;
}
}
@@ -9,19 +9,33 @@ import androidx.recyclerview.widget.RecyclerView;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.jaredrummler.materialspinner.MaterialSpinner;
import com.waterbase.foodifyServer.Common.Common;
import com.waterbase.foodifyServer.Interface.ItemClickListener;
import com.waterbase.foodifyServer.Model.MyResponse;
import com.waterbase.foodifyServer.Model.Notification;
import com.waterbase.foodifyServer.Model.Request;
import com.waterbase.foodifyServer.Model.Sender;
import com.waterbase.foodifyServer.Model.Token;
import com.waterbase.foodifyServer.Remote.APIService;
import com.waterbase.foodifyServer.ViewHolder.OrderViewHolder;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class OrderStatus extends AppCompatActivity {
RecyclerView recyclerView;
@@ -34,6 +48,8 @@ public class OrderStatus extends AppCompatActivity {
MaterialSpinner spinner;
APIService mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -42,7 +58,10 @@ public class OrderStatus extends AppCompatActivity {
//Firebase
db = FirebaseDatabase.getInstance();
requests = db.getReference("Requests");
//Init Service
mService = Common.getFCMClient();
//Init
recyclerView = (RecyclerView) findViewById(R.id.listOrders);
recyclerView.setHasFixedSize(true);
@@ -73,12 +92,13 @@ public class OrderStatus extends AppCompatActivity {
Intent trackingOrder = new Intent(OrderStatus.this, TrackingOrder.class);
Common.currentRequest = model;
startActivity(trackingOrder);
} else {
Intent orderDetail = new Intent(OrderStatus.this, OrderDetail.class);
Common.currentRequest = model;
orderDetail.putExtra("OrderId", adapter.getRef(position).getKey());
startActivity(orderDetail);
}
// else {
// Intent orderDetail = new Intent(OrderStatus.this, OrderDetail.class);
// Common.currentRequest = model;
// orderDetail.putExtra("OrderId", adapter.getRef(position).getKey());
// startActivity(orderDetail);
// }
}
});
}
@@ -122,6 +142,8 @@ public class OrderStatus extends AppCompatActivity {
item.setStatus(String.valueOf(spinner.getSelectedIndex()));
requests.child(localKey).setValue(item);
sendOrderStatusToUser(localKey, item);
}
});
alertDialog.setNegativeButton("Huỷ", new DialogInterface.OnClickListener() {
@@ -133,4 +155,43 @@ public class OrderStatus extends AppCompatActivity {
alertDialog.show();
}
private void sendOrderStatusToUser(String localKey, Request item) {
DatabaseReference tokens = db.getReference("Tokens");
tokens.orderByKey().equalTo(item.getPhone())
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot postSnapShot: dataSnapshot.getChildren()) {
Token token = postSnapShot.getValue(Token.class);
//Make raw payload
Notification notification = new Notification("Foodify", "Đơn của bạn " + localKey + " đã được cập nhật!");
Sender content = new Sender(token.getToken(), notification);
mService.sendNotification(content)
.enqueue(new Callback<MyResponse>() {
@Override
public void onResponse(Call<MyResponse> call, Response<MyResponse> response) {
if(response.body().success == 1) {
Toast.makeText(OrderStatus.this, "Đơn hàng của bạn đã được cập nhật!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(OrderStatus.this, "Đơn hàng đã được cập nhật nhưng chưa gửi thông báo!", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<MyResponse> call, Throwable t) {
Log.e("ERROR", t.getMessage());
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@@ -0,0 +1,24 @@
package com.waterbase.foodifyServer.Remote;
import com.waterbase.foodifyServer.Model.MyResponse;
import com.waterbase.foodifyServer.Model.Sender;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
public interface APIService {
@Headers(
{
"Content-Type:application/json",
"Authorization:key=AAAAvBRs8TM:APA91bGQ-HvHMz4_UxiTsq4wY9H9j_ScuMRGOd03BYpQ4RKTuGpN_5CPhtQwycJaVCWMaS2T5S850QgUBhWZauOeM5aVeZsW3VGk1sXFu5GnlOgk2ev0VjzkK8fDsV4mO8D8k5uIknsC"
}
)
@POST("fcm/send")
Call<MyResponse> sendNotification(@Body Sender body);
}
@@ -1,105 +0,0 @@
package com.waterbase.foodifyServer.Service;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.IBinder;
import androidx.core.app.NotificationCompat;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.waterbase.foodifyServer.Model.Request;
import com.waterbase.foodifyServer.OrderStatus;
import com.waterbase.foodifyServer.R;
import java.util.Random;
public class ListenOrder extends Service implements ChildEventListener {
FirebaseDatabase db;
DatabaseReference orders;
@Override
public void onCreate() {
super.onCreate();
db = FirebaseDatabase.getInstance();
orders = db.getReference("Requests");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
orders.addChildEventListener(this);
return super.onStartCommand(intent, flags, startId);
}
public ListenOrder() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Request request = dataSnapshot.getValue(Request.class);
if(request.getStatus().equals("0"))
showNotification(dataSnapshot.getKey(), request);
}
private void showNotification(String key, Request request) {
Intent intent = new Intent(getBaseContext(), OrderStatus.class);
PendingIntent contentIntent = PendingIntent.getActivity(getBaseContext(), 0, intent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel=
new NotificationChannel("newOrder","newOrder",NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager notificationManager=getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(getBaseContext(), "newOrder");
builder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setTicker("CBNV")
.setContentInfo("Đơn hàng mới")
.setContentText("Bạn có đơn hàng mới #" + key)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(contentIntent);
NotificationManager manager = (NotificationManager) getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
//Show many notification
int randomInt = new Random().nextInt(9999-1)+1;
manager.notify(randomInt, builder.build());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}
@@ -0,0 +1,25 @@
package com.waterbase.foodifyServer.Service;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
import com.waterbase.foodifyServer.Common.Common;
import com.waterbase.foodifyServer.Model.Token;
public class MyFirebaseIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
super.onTokenRefresh();
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
updateToServer(refreshedToken);
}
private void updateToServer(String refreshedToken) {
FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference tokens = db.getReference("Tokens");
Token data = new Token(refreshedToken, true);
tokens.child(Common.currentUser.getPhone()).setValue(data);
}
}
@@ -0,0 +1,56 @@
package com.waterbase.foodifyServer.Service;
import android.app.Notification;
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 android.util.Log;
import androidx.core.app.NotificationCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.waterbase.foodifyServer.Home;
import com.waterbase.foodifyServer.R;
public class MyFirebaseMessaging extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
showNotification(remoteMessage);
Log.e("INFO", remoteMessage.getNotification().getBody());
}
private void showNotification(RemoteMessage remoteMessage) {
RemoteMessage.Notification notification = remoteMessage.getNotification();
Intent intent = new Intent(this, Home.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
NotificationChannel channel=
new NotificationChannel("foodStatus","foodStatus",NotificationManager.IMPORTANCE_DEFAULT);
NotificationManager notificationManager=getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder=new NotificationCompat.Builder(getBaseContext(),"foodStatus");
builder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setContentText(notification.getBody())
.setContentIntent(pendingIntent)
.setContentTitle(notification.getTitle())
.setSound(defaultSoundUri)
.setSmallIcon(R.mipmap.ic_launcher_round);
NotificationManager notificationManager=(NotificationManager)getBaseContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1,builder.build());
}
}