Skip to content

Commit 70de7bd

Browse files
committed
feat(server/app): support pass through
Signed-off-by: Trumeet <[email protected]>
1 parent 6456f5f commit 70de7bd

File tree

8 files changed

+68
-19
lines changed

8 files changed

+68
-19
lines changed

app/src/main/java/moe/yuuta/mipushtester/push/PushReceiver.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package moe.yuuta.mipushtester.push;
22

33
import android.content.Context;
4+
import android.content.Intent;
5+
import android.widget.Toast;
46

57
import com.elvishew.xlog.XLog;
68
import com.xiaomi.mipush.sdk.ErrorCode;
79
import com.xiaomi.mipush.sdk.MiPushClient;
810
import com.xiaomi.mipush.sdk.MiPushCommandMessage;
911
import com.xiaomi.mipush.sdk.MiPushMessage;
12+
import com.xiaomi.mipush.sdk.PushMessageHelper;
1013
import com.xiaomi.mipush.sdk.PushMessageReceiver;
1114

15+
import moe.yuuta.mipushtester.R;
1216
import moe.yuuta.mipushtester.status.RegistrationStatus;
1317

1418
public class PushReceiver extends PushMessageReceiver {
1519
@Override
1620
public void onReceivePassThroughMessage(Context context, MiPushMessage miPushMessage) {
17-
// TODO: Add actions
18-
super.onReceivePassThroughMessage(context, miPushMessage);
21+
Toast.makeText(context.getApplicationContext(), context.getString(R.string.push_receiver_pass_through_received,
22+
miPushMessage.getMessageId()), Toast.LENGTH_SHORT).show();
23+
context.startActivity(new Intent(context, MessageDetailActivity.class)
24+
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
25+
.putExtra(PushMessageHelper.KEY_MESSAGE, miPushMessage));
1926
}
2027

2128
@Override

app/src/main/java/moe/yuuta/mipushtester/push/PushRequest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ class PushRequest {
4949
private Map<String, String> extras;
5050
@SerializedName("global")
5151
private boolean global;
52+
@SerializedName("pass_through_notification")
53+
private boolean passThroughNotification;
54+
55+
public boolean isPassThroughNotification() {
56+
return passThroughNotification;
57+
}
58+
59+
public void setPassThroughNotification(boolean passThroughNotification) {
60+
this.passThroughNotification = passThroughNotification;
61+
}
5262

5363
public boolean isGlobal() {
5464
return global;

app/src/main/java/moe/yuuta/mipushtester/push/SendPushFragment.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ public void onCreate(Bundle savedInstanceState) {
5151
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
5252
addPreferencesFromResource(R.xml.preference_send_push);
5353
updateUriLimitStatus(null);
54-
updateSoundUriLimitStatus(null);
54+
updatePassThroughLimitStatus(null);
5555
findPreference("click_type").setOnPreferenceChangeListener((preference, newValue) -> {
5656
updateUriLimitStatus(newValue);
5757
return true;
5858
});
5959
findPreference("pass_through").setOnPreferenceChangeListener((preference, newValue) -> {
60-
updateSoundUriLimitStatus(Boolean.parseBoolean(newValue.toString()));
60+
updatePassThroughLimitStatus(Boolean.parseBoolean(newValue.toString()));
6161
return true;
6262
});
6363
SimpleMenuPreference limitLocale = (SimpleMenuPreference) findPreference("limit_locale");
@@ -87,9 +87,11 @@ private void updateUriLimitStatus(@Nullable Object newValue) {
8787
findPreference("click_url").setEnabled("1".equals(newValue == null ? ((SimpleMenuPreference) findPreference("click_type")).getValue() : newValue));
8888
}
8989

90-
private void updateSoundUriLimitStatus(@Nullable Boolean passThrough) {
90+
private void updatePassThroughLimitStatus(@Nullable Boolean passThrough) {
9191
findPreference("sound_uri").setEnabled(!(passThrough == null ? ((SwitchPreference) findPreference("pass_through")).isChecked() :
9292
passThrough));
93+
findPreference("pass_through_notification").setEnabled((passThrough == null ? ((SwitchPreference) findPreference("pass_through")).isChecked() :
94+
passThrough));
9395
}
9496

9597
@Override
@@ -198,6 +200,7 @@ private void handleSend () {
198200
request.setSoundUri("android.resource://" + BuildConfig.APPLICATION_ID + "/raw/centaurus");
199201
}
200202
request.setGlobal(((SwitchPreference) findPreference("global")).isChecked());
203+
request.setPassThroughNotification(((SwitchPreference) findPreference("pass_through_notification")).isChecked());
201204

202205
stopTask();
203206
mTask = new PushTask(this, request);

app/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@
8585
</string-array>
8686
<string name="send_push_global">Use Global server</string>
8787
<string name="send_push_global_summary">Switch to global MiPush server, it may improve message receiving if you are not in China</string>
88+
<string name="send_push_pass_through_notification">Pass through notification</string>
89+
<string name="send_push_pass_through_notification_summary">Still display a notification if it\'s a pass through message</string>
8890
<!-- Message detail -->
8991
<string name="detail">Message ID: %1$s\n\nMiPushTester custom Extras: %2$s\n\nMiPush Extras: \n%3$s\n\nPass Through: %4$s\n\nFull message:\n%5$s</string>
9092
<string name="detail_title">Message Detail</string>
@@ -95,4 +97,6 @@
9597
<string name="error_send_push_need_register">Sending push requires registration at first</string>
9698
<string name="update_available">Update available: %1$s</string>
9799
<string name="view">View</string>
100+
<!-- Push Receiver -->
101+
<string name="push_receiver_pass_through_received">Pass through message received, id: %1$s</string>
98102
</resources>

app/src/main/res/xml/preference_send_push.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
android:title="@string/send_push_global"
3434
android:summary="@string/send_push_global_summary"
3535
android:defaultValue="false" />
36+
<SwitchPreference
37+
android:key="pass_through_notification"
38+
android:title="@string/send_push_pass_through_notification"
39+
android:summary="@string/send_push_pass_through_notification_summary"
40+
android:defaultValue="true" />
3641
<PreferenceCategory
3742
android:title="@string/send_push_click_action">
3843
<SimpleMenuPreference

server/src/main/java/moe/yuuta/server/api/ApiHandlerImpl.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44
import java.text.SimpleDateFormat;
55
import java.util.Calendar;
6+
import java.util.Date;
67
import java.util.HashMap;
78
import java.util.Locale;
89
import java.util.Map;
@@ -84,18 +85,21 @@ public void handlePush(RoutingContext routingContext) {
8485
routingContext.response().setStatusCode(400).end();
8586
return;
8687
}
87-
String title = Resources.getString("push_title", routingContext);
88-
String ticker = Resources.getString("push_ticker", routingContext);
89-
String description = Resources.getString("push_description", routingContext,
90-
new SimpleDateFormat("HH:mm:ss", Locale.CHINA).format(Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")).getTime()));
9188
Message message = new Message();
92-
message.setTicker(ticker);
89+
if (!request.isPassThrough() || request.isPassThroughNotification()) {
90+
String title = Resources.getString("push_title", routingContext);
91+
String ticker = Resources.getString("push_ticker", routingContext);
92+
String description = Resources.getString("push_description", routingContext,
93+
new SimpleDateFormat("HH:mm:ss", Locale.CHINA).format(Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")).getTime()));
94+
message.setTicker(ticker);
95+
message.setTitle(title);
96+
message.setDescription(description);
97+
}
98+
// Payload is required for pass through messages
99+
message.setPayload(new Date().toString());
93100
message.setRestrictedPackageName(routingContext.request().getHeader(Constants.HEADER_PRODUCT));
94-
// FIXME
95101
message.setPassThrough(request.isPassThrough() ? Message.PASS_THROUGH_ENABLED :
96102
Message.PASS_THROUGH_DISABLED);
97-
message.setTitle(title);
98-
message.setDescription(description);
99103
message.setNotifyForeground(request.isNotifyForeground() ? Message.NOTIFY_FOREGROUND_ENABLE :
100104
Message.NOTIFY_FOREGROUND_DISABLE);
101105
message.setConnpt(request.isEnforceWifi() ? Message.CONNPT_WIFI : null);

server/src/main/java/moe/yuuta/server/api/PushRequest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ class PushRequest {
6464
private Map<String, String> extras;
6565
@JsonProperty("global")
6666
private boolean global;
67+
@JsonProperty("pass_through_notification")
68+
private boolean passThroughNotification;
69+
70+
boolean isPassThroughNotification() {
71+
return passThroughNotification;
72+
}
6773

6874
Map<String, String> getExtras() {
6975
return extras;
@@ -208,4 +214,8 @@ public void setExtras(Map<String, String> extras) {
208214
public void setGlobal(boolean global) {
209215
this.global = global;
210216
}
217+
218+
public void setPassThroughNotification(boolean passThroughNotification) {
219+
this.passThroughNotification = passThroughNotification;
220+
}
211221
}

server/src/test/java/moe/yuuta/server/api/ApiHandlerImplTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -351,17 +351,22 @@ public void shouldHandleSuccessfulPush(TestContext testContext) {
351351
final String requestLocale = "zh_TW";
352352
final String packageName = "android.sms";
353353
final boolean global = true;
354+
final boolean passThrough = true;
355+
final boolean passThroughNotification = false;
354356

355357
// TODO: Test multiple situations for variety arguments (e.g. display)
356358
this.sendPushCallback = (Message message, String[] regIds, Map<String, String> customExtras, boolean useGlobal, Handler<AsyncResult<HttpResponse<SendMessageResponse>>> handler) -> {
357359
testContext.assertNotNull(message);
358-
testContext.assertEquals(message.getTitle(), Resources.getString("push_title", Locale.ENGLISH));
359-
testContext.assertEquals(message.getTicker(), Resources.getString("push_ticker", Locale.ENGLISH));
360-
// TODO: Fully match the description
361-
testContext.assertNotNull(message.getDescription());
362-
testContext.assertNotEquals(message.getDescription(), "");
360+
if (!passThrough || passThroughNotification) {
361+
testContext.assertEquals(message.getTitle(), Resources.getString("push_title", Locale.ENGLISH));
362+
testContext.assertEquals(message.getTicker(), Resources.getString("push_ticker", Locale.ENGLISH));
363+
// TODO: Fully match the description
364+
testContext.assertNotNull(message.getDescription());
365+
testContext.assertNotEquals(message.getDescription(), "");
366+
}
363367
testContext.assertEquals(message.getRestrictedPackageName(), packageName);
364-
testContext.assertEquals(message.getPassThrough(), Message.PASS_THROUGH_ENABLED);
368+
testContext.assertNotNull(message.getPayload());
369+
testContext.assertEquals(message.getPassThrough(), passThrough ? Message.PASS_THROUGH_ENABLED : Message.PASS_THROUGH_DISABLED);
365370
testContext.assertEquals(message.getNotifyForeground(), Message.NOTIFY_FOREGROUND_DISABLE);
366371
testContext.assertEquals(message.getConnpt(), Message.CONNPT_WIFI);
367372
testContext.assertEquals(message.getNotifyType(), Message.NOTIFY_TYPE_DEFAULT_VIBRATE);
@@ -401,6 +406,7 @@ public void shouldHandleSuccessfulPush(TestContext testContext) {
401406
request.setVersionsExcept(versionsOut);
402407
request.setDelayMs(delayMs);
403408
request.setGlobal(global);
409+
request.setPassThroughNotification(passThroughNotification);
404410
vertx.createHttpClient().post(8080, "localhost", ApiVerticle.ROUTE_TEST, httpClientResponse -> {
405411
async.countDown();
406412
})

0 commit comments

Comments
 (0)