-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathFirebaseCloudMessaging.java
More file actions
117 lines (97 loc) · 3.83 KB
/
Copy pathFirebaseCloudMessaging.java
File metadata and controls
117 lines (97 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package org.spacebison.fcmjava;
import com.google.firebase.fcm.FcmDownstreamMessage;
import com.google.firebase.fcm.FcmDownstreamMessageResult;
import com.google.firebase.fcm.FcmDownstreamTopicMessageResult;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by cmb on 11.11.16.
*/
public class FirebaseCloudMessaging {
public static final int ERROR_NETWORK_ERROR = -1;
public static final int ERROR_INVALID_RESPONSE = -2;
public static final int ERROR_NO_API_KEY = -3;
private final Gson mGson = new Gson();
private final FirebaseCloudMessagingService mService = new Retrofit.Builder()
.client(new OkHttpClient.Builder()
.addInterceptor(new NoCacheRequestHeaderInterceptor())
.build())
.addConverterFactory(GsonConverterFactory.create(mGson))
.baseUrl("https://fcm.googleapis.com/fcm/")
.build()
.create(FirebaseCloudMessagingService.class);
private String mApiKey;
private FirebaseCloudMessaging() {}
public static FirebaseCloudMessaging getInstance() {
return Holder.INSTANCE;
}
public void setApiKey(String apiKey) {
mApiKey = apiKey;
}
public void sendMessage(FcmDownstreamMessage message, Listener<FcmDownstreamMessageResult> listener) {
if (mApiKey == null) {
listener.onError(ERROR_NO_API_KEY, "Missing api key");
return;
}
mService.send(getApiKeyHeader(mApiKey), message).enqueue(new BaseCallback<>(listener));
}
public void sendTopicMessage(FcmDownstreamMessage message, Listener<FcmDownstreamTopicMessageResult> listener) {
if (mApiKey == null) {
listener.onError(ERROR_NO_API_KEY, "Missing api key");
return;
}
mService.sendTopic(getApiKeyHeader(mApiKey), message).enqueue(new BaseCallback<>(listener));
}
private static String getApiKeyHeader(String apiKey) {
return "key=" + apiKey;
}
public interface Listener<T> {
void onCompleted(T result);
void onError(int code, String message);
}
private class BaseCallback<T> implements Callback<T> {
private final Listener<T> mListener;
private BaseCallback(Listener<T> listener) {
mListener = listener;
}
@Override
public void onResponse(Call<T> call, Response<T> response) {
if (mListener == null) {
return;
}
if (response.isSuccessful()) {
mListener.onCompleted(response.body());
} else {
try {
String errorBody = response.errorBody().string();
try {
T result = mGson.fromJson(errorBody, new TypeToken<T>(){}.getType());
mListener.onCompleted(result);
} catch (JsonSyntaxException | ClassCastException e) {
System.out.println(errorBody);
mListener.onError(ERROR_INVALID_RESPONSE, errorBody);
}
} catch (IOException e) {
mListener.onError(ERROR_INVALID_RESPONSE, null);
}
}
}
@Override
public void onFailure(Call<T> call, Throwable t) {
if (mListener != null) {
mListener.onError(ERROR_NETWORK_ERROR, t.getLocalizedMessage());
}
}
}
private static class Holder {
private static final FirebaseCloudMessaging INSTANCE = new FirebaseCloudMessaging();
}
}