Skip to content

Commit c7a4de8

Browse files
authored
Merge pull request #3 from Trumeet/canary
Merge canary to master
2 parents 048b3b4 + b5bb5dd commit c7a4de8

33 files changed

+1133
-51
lines changed

README.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1-
[![](https://img.shields.io/docker/build/thnuiwelr/mipush.svg)](https://hub.docker.com/r/thnuiwelr/mipush/)
2-
[![](https://img.shields.io/docker/pulls/thnuiwelr/mipush.svg)](https://hub.docker.com/r/thnuiwelr/mipush/)
3-
[![](https://img.shields.io/microbadger/image-size/thnuiwelr/mipush.svg)](https://hub.docker.com/r/thnuiwelr/mipush/)
4-
[![Build Status](https://travis-ci.org/Trumeet/MiPushTester.svg?branch=master)](https://travis-ci.org/Trumeet/MiPushTester)
1+
<p align="center">
2+
<a href="https://hub.docker.com/r/thnuiwelr/mipush/"><img src="https://img.shields.io/docker/build/thnuiwelr/mipush.svg" alt="" /></a>
3+
<a href="https://hub.docker.com/r/thnuiwelr/mipush/"><img src="https://img.shields.io/docker/pulls/thnuiwelr/mipush.svg" alt="" /></a>
4+
<a href="https://hub.docker.com/r/thnuiwelr/mipush/"><img src="https://img.shields.io/microbadger/image-size/thnuiwelr/mipush.svg" alt="" /></a>
5+
<a href="https://travis-ci.org/Trumeet/MiPushTester"><img src="https://travis-ci.org/Trumeet/MiPushTester.svg?branch=master" alt="Build Status" /></a>
6+
<a href="https://github.com/Trumeet/MiPushTester/releases"><img src="https://img.shields.io/github/release-pre/Trumeet/MiPushTester.svg" alt="Latest release" /></a>
7+
<a href="https://github.com/Trumeet/MiPushTester/blob/master/LICENSE"><img src="https://img.shields.io/github/license/Trumeet/MiPushTester.svg" alt="Licenses" /></a>
8+
<a href="https://github.com/Trumeet/MiPushTester/releases"><img src="https://img.shields.io/github/downloads/Trumeet/MiPushTester/total.svg" alt="APK Downloads" /></a>
9+
<a href="https://github.com/Trumeet/MiPushTester/issues"><img src="https://img.shields.io/github/issues/Trumeet/MiPushTester.svg" alt="Open Issues" /></a>
10+
<a href="https://github.com/Trumeet/MiPushTester/pulls"><img src="https://img.shields.io/github/issues-pr/Trumeet/MiPushTester.svg" alt="Open PR" /></a>
11+
<a href="https://github.com/Trumeet/MiPushTester/stargazers"><img src="https://img.shields.io/github/stars/Trumeet/MiPushTester.svg?label=Stars&amp;style=social" alt="Stars" /></a>
12+
<a href="https://status.yuuta.moe/781665748"><img src="https://img.shields.io/uptimerobot/ratio/7/m781665748-4f4339573e81d66d561994f8.svg" alt="Web Status" /></a></p>
13+
</p>
514

615
# MiPush Tester (Alpha)
716

app/src/main/java/moe/yuuta/mipushtester/MainFragment.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@
3434
import androidx.appcompat.app.AlertDialog;
3535
import androidx.core.content.ContextCompat;
3636
import androidx.databinding.DataBindingUtil;
37+
import androidx.databinding.Observable;
3738
import androidx.fragment.app.Fragment;
3839
import androidx.navigation.Navigation;
40+
import moe.yuuta.mipushtester.api.APIManager;
3941
import moe.yuuta.mipushtester.databinding.FragmentMainBinding;
4042
import moe.yuuta.mipushtester.log.LogUtils;
41-
import moe.yuuta.mipushtester.push.APIManager;
4243
import moe.yuuta.mipushtester.status.RegistrationStatus;
44+
import moe.yuuta.mipushtester.topic.TopicStore;
4345
import moe.yuuta.mipushtester.update.Update;
4446
import retrofit2.Call;
4547
import retrofit2.Callback;
@@ -66,11 +68,22 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
6668
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
6769
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false);
6870
mRegistrationStatus = RegistrationStatus.get(requireContext());
71+
mRegistrationStatus.registered.addOnPropertyChangedCallback(mRestoreSubscriptionListener);
6972
binding.setStatus(mRegistrationStatus);
7073
binding.setUiHandler(this);
7174
return binding.getRoot();
7275
}
7376

77+
private Observable.OnPropertyChangedCallback mRestoreSubscriptionListener =new Observable.OnPropertyChangedCallback() {
78+
@Override
79+
public void onPropertyChanged(Observable sender, int propertyId) {
80+
if (mRegistrationStatus.registered.get()) {
81+
for (String id : TopicStore.create(requireContext()).getSubscribedIds())
82+
MiPushClient.subscribe(requireContext(), id, null);
83+
}
84+
}
85+
};
86+
7487
@Override
7588
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
7689
super.onViewCreated(view, savedInstanceState);
@@ -204,6 +217,13 @@ public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflat
204217
@Override
205218
public void onDestroyView() {
206219
if (mGetUpdateCall != null) mGetUpdateCall.cancel();
220+
mRegistrationStatus.registered.removeOnPropertyChangedCallback(mRestoreSubscriptionListener);
207221
super.onDestroyView();
208222
}
223+
224+
@Override
225+
public void handleSubscribeTopic(View v) {
226+
Navigation.findNavController(requireActivity(), R.id.nav_host)
227+
.navigate(R.id.action_mainFragment_to_topicSubscriptionFragment);
228+
}
209229
}

app/src/main/java/moe/yuuta/mipushtester/MainFragmentUIHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ public interface MainFragmentUIHandler {
66
void handleToggleRegister (View v);
77
void handleCreatePush (View v);
88
void handleReset (View v);
9+
void handleSubscribeTopic (View v);
910
}

app/src/main/java/moe/yuuta/mipushtester/push/APIInterface.java renamed to app/src/main/java/moe/yuuta/mipushtester/api/APIInterface.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
package moe.yuuta.mipushtester.push;
1+
package moe.yuuta.mipushtester.api;
22

33
import com.google.gson.JsonObject;
44

5+
import java.util.List;
6+
7+
import moe.yuuta.mipushtester.push.PushRequest;
8+
import moe.yuuta.mipushtester.topic.Topic;
59
import moe.yuuta.mipushtester.update.Update;
610
import retrofit2.Call;
711
import retrofit2.http.Body;
@@ -14,4 +18,7 @@ public interface APIInterface {
1418

1519
@GET("/update")
1620
Call<Update> getUpdate ();
21+
22+
@GET("/test/topic")
23+
Call<List<Topic>> getAvailableTopics ();
1724
}

app/src/main/java/moe/yuuta/mipushtester/push/APIManager.java renamed to app/src/main/java/moe/yuuta/mipushtester/api/APIManager.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
package moe.yuuta.mipushtester.push;
1+
package moe.yuuta.mipushtester.api;
22

33
import com.elvishew.xlog.Logger;
44
import com.elvishew.xlog.XLog;
55
import com.google.gson.JsonObject;
66

7+
import java.util.List;
78
import java.util.Locale;
89

910
import androidx.annotation.NonNull;
1011
import moe.yuuta.common.Constants;
1112
import moe.yuuta.mipushtester.BuildConfig;
13+
import moe.yuuta.mipushtester.push.PushRequest;
14+
import moe.yuuta.mipushtester.topic.Topic;
1215
import moe.yuuta.mipushtester.update.Update;
1316
import okhttp3.OkHttpClient;
1417
import okhttp3.Request;
@@ -51,4 +54,8 @@ public Call<JsonObject> push (@NonNull PushRequest request) {
5154
public Call<Update> getUpdate () {
5255
return apiInterface.getUpdate();
5356
}
57+
58+
public Call<List<Topic>> getAvailableTopics () {
59+
return apiInterface.getAvailableTopics();
60+
}
5461
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import java.util.Map;
77

88
@SuppressWarnings("unused")
9-
class PushRequest {
9+
public class PushRequest {
1010
@SerializedName("registration_id")
1111
private String registrationId;
1212
@SerializedName("delay_ms")

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import moe.yuuta.common.Constants;
3434
import moe.yuuta.mipushtester.BuildConfig;
3535
import moe.yuuta.mipushtester.R;
36+
import moe.yuuta.mipushtester.api.APIManager;
3637
import moe.yuuta.mipushtester.status.RegistrationStatus;
3738
import retrofit2.Response;
3839

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package moe.yuuta.mipushtester.topic;
2+
3+
import com.google.gson.annotations.Expose;
4+
import com.google.gson.annotations.SerializedName;
5+
6+
public class Topic {
7+
@SerializedName(value = "title")
8+
private String title;
9+
@SerializedName(value = "description")
10+
private String description;
11+
@SerializedName(value = "id")
12+
private String id;
13+
@Expose
14+
private boolean subscribed;
15+
16+
public boolean isSubscribed() {
17+
return subscribed;
18+
}
19+
20+
public void setSubscribed(boolean subscribed) {
21+
this.subscribed = subscribed;
22+
}
23+
24+
public String getId() {
25+
return id;
26+
}
27+
28+
public void setId(String id) {
29+
this.id = id;
30+
}
31+
32+
public String getTitle() {
33+
return title;
34+
}
35+
36+
public void setTitle(String title) {
37+
this.title = title;
38+
}
39+
40+
public String getDescription() {
41+
return description;
42+
}
43+
44+
public void setDescription(String description) {
45+
this.description = description;
46+
}
47+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package moe.yuuta.mipushtester.topic;
2+
3+
import android.view.LayoutInflater;
4+
import android.view.View;
5+
import android.view.ViewGroup;
6+
import android.widget.CheckBox;
7+
import android.widget.TextView;
8+
9+
import java.util.ArrayList;
10+
import java.util.HashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
14+
import androidx.annotation.NonNull;
15+
import androidx.recyclerview.widget.RecyclerView;
16+
import moe.yuuta.mipushtester.R;
17+
18+
public class TopicListAdapter extends RecyclerView.Adapter<TopicListAdapter.ViewHolder> {
19+
private List<Topic> mItemList = new ArrayList<>(0);
20+
private Set<String> mSelected = new HashSet<>(3);
21+
private OnSelectedListener mSelectListener;
22+
23+
@FunctionalInterface
24+
interface OnSelectedListener {
25+
void trigger (@NonNull Topic topic, boolean selected);
26+
}
27+
28+
TopicListAdapter (@NonNull OnSelectedListener listener) {
29+
super();
30+
mSelectListener = listener;
31+
}
32+
33+
@NonNull
34+
@Override
35+
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
36+
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_topic, parent, false));
37+
}
38+
39+
@Override
40+
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
41+
Topic topic = mItemList.get(position);
42+
if (topic.isSubscribed()) mSelected.add(topic.getId());
43+
else mSelected.remove(topic.getId());
44+
if (mSelected.contains(topic.getId())) {
45+
holder.checkBox.setChecked(true);
46+
} else {
47+
holder.checkBox.setChecked(false);
48+
}
49+
holder.checkBox.setOnClickListener(v -> {
50+
boolean checked = holder.checkBox.isChecked();
51+
mSelectListener.trigger(topic, checked);
52+
if (checked) mSelected.add(topic.getId());
53+
else mSelected.remove(topic.getId());
54+
});
55+
holder.title.setText(topic.getTitle());
56+
holder.description.setText(topic.getDescription());
57+
}
58+
59+
@Override
60+
public int getItemCount() {
61+
return mItemList.size();
62+
}
63+
64+
public Topic getItemAt (int position) {
65+
return mItemList.get(position);
66+
}
67+
68+
public void setItems (@NonNull List<Topic> newList) {
69+
mItemList = newList;
70+
}
71+
72+
static class ViewHolder extends RecyclerView.ViewHolder {
73+
private TextView title;
74+
private TextView description;
75+
private CheckBox checkBox;
76+
77+
ViewHolder(@NonNull View itemView) {
78+
super(itemView);
79+
title = itemView.findViewById(android.R.id.text1);
80+
description = itemView.findViewById(android.R.id.text2);
81+
checkBox = itemView.findViewById(R.id.check_subscribe);
82+
}
83+
}
84+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package moe.yuuta.mipushtester.topic;
2+
3+
import android.annotation.SuppressLint;
4+
import android.content.Context;
5+
import android.content.SharedPreferences;
6+
7+
import java.util.Collections;
8+
import java.util.HashSet;
9+
import java.util.Set;
10+
11+
import androidx.annotation.NonNull;
12+
import androidx.annotation.Nullable;
13+
14+
public class TopicStore {
15+
private static TopicStore instance;
16+
private final Object lock = new Object();
17+
18+
public TopicStore getInstance (@Nullable Context context) {
19+
if (instance == null) {
20+
if (context == null)
21+
throw new IllegalArgumentException("Context shouldn't be null if it isn't created yet");
22+
instance = TopicStore.create(context.getApplicationContext());
23+
}
24+
return instance;
25+
}
26+
27+
public static TopicStore create (@NonNull Context context) {
28+
return new TopicStore(context.getSharedPreferences("subscription", Context.MODE_PRIVATE));
29+
}
30+
31+
private final SharedPreferences sharedPreferences;
32+
33+
private TopicStore (@NonNull SharedPreferences sharedPreferences) {
34+
this.sharedPreferences = sharedPreferences;
35+
}
36+
37+
public Set<String> getSubscribedIds () {
38+
synchronized (this.lock) {
39+
return sharedPreferences.getStringSet("subscribed", Collections.emptySet());
40+
}
41+
}
42+
43+
public boolean isSubscribed (@NonNull String id) {
44+
return getSubscribedIds().contains(id);
45+
}
46+
47+
@SuppressLint("ApplySharedPref")
48+
public void subscribe (@NonNull String id) {
49+
synchronized (this.lock) {
50+
Set<String> current = new HashSet<>(getSubscribedIds());
51+
current.add(id);
52+
sharedPreferences.edit()
53+
.putStringSet("subscribed", current)
54+
.commit();
55+
}
56+
}
57+
58+
@SuppressLint("ApplySharedPref")
59+
public void unsubscribe (@NonNull String id) {
60+
synchronized (this.lock) {
61+
Set<String> current = new HashSet<>(getSubscribedIds());
62+
current.remove(id);
63+
sharedPreferences.edit()
64+
.putStringSet("subscribed", current)
65+
.commit();
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)