Skip to content
This repository was archived by the owner on Jul 25, 2024. It is now read-only.

Commit c437032

Browse files
yadav-rahulkunall17
authored andcommitted
Add feature to star/unstar message
1 parent 9553669 commit c437032

File tree

18 files changed

+365
-4
lines changed

18 files changed

+365
-4
lines changed

app/src/main/java/com/zulip/android/activities/MessageListFragment.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import com.zulip.android.networking.util.DefaultCallback;
4545
import com.zulip.android.util.CommonProgressDialog;
4646
import com.zulip.android.util.Constants;
47+
import com.zulip.android.networking.response.StarResponse;
4748
import com.zulip.android.util.MessageListener;
4849
import com.zulip.android.util.MutedTopics;
4950
import com.zulip.android.util.ZLog;
@@ -244,12 +245,18 @@ public boolean onContextItemSelected(MenuItem item) {
244245
return true;
245246
case R.id.edit_message:
246247
editMessage(message, adapter.getContextMenuItemSelectedPosition());
248+
case R.id.star_message:
249+
starMessage(message, adapter.getContextMenuItemSelectedPosition());
250+
return true;
251+
case R.id.un_star_message:
252+
unStarMessage(message, adapter.getContextMenuItemSelectedPosition());
247253
return true;
248254
default:
249255
return super.onContextItemSelected(item);
250256
}
251257
}
252258

259+
253260
private void initializeNarrow() {
254261
adapter.clear();
255262
messageIndex.clear();
@@ -261,6 +268,63 @@ private void initializeNarrow() {
261268
adapter.setFooterShowing(true);
262269
}
263270

271+
/**
272+
* Stars a message passed as parameter
273+
* @param message Message to be starred
274+
*/
275+
private void starMessage(final Message message, final int position) {
276+
app.getZulipServices().
277+
starMessage("starred", "add", "[" + String.valueOf(message.getID()) + "]").
278+
enqueue(new Callback<StarResponse>() {
279+
@Override
280+
public void onResponse(Call<StarResponse> call, Response<StarResponse> response) {
281+
if (response.isSuccessful()) {
282+
message.setMessageStar(true);
283+
recyclerView.getAdapter().notifyItemChanged(position);
284+
Toast.makeText(getContext(), R.string.message_starred, Toast.LENGTH_SHORT).show();
285+
} else {
286+
Log.d("starMessage", "Response : " + response.body().getMessage());
287+
Toast.makeText(getContext(), R.string.network_error, Toast.LENGTH_SHORT).show();
288+
}
289+
}
290+
291+
@Override
292+
public void onFailure(Call<StarResponse> call, Throwable t) {
293+
ZLog.logException(t);
294+
Toast.makeText(getContext(), R.string.network_error, Toast.LENGTH_SHORT).show();
295+
}
296+
});
297+
}
298+
299+
/**
300+
* Unstars a message passed as parameter
301+
* @param message Message to be unstarred
302+
*/
303+
private void unStarMessage(final Message message, final int position) {
304+
app.getZulipServices().
305+
starMessage("starred", "remove", "[" + String.valueOf(message.getID()) + "]").
306+
enqueue(new Callback<StarResponse>() {
307+
@Override
308+
public void onResponse(Call<StarResponse> call, Response<StarResponse> response) {
309+
if (response.isSuccessful()) {
310+
message.setMessageStar(false);
311+
recyclerView.getAdapter().notifyItemChanged(position);
312+
Toast.makeText(getContext(), R.string.message_un_starred, Toast.LENGTH_SHORT).show();
313+
} else {
314+
Log.d("unStarMessage", "Response : " + response.body().getMessage());
315+
Toast.makeText(getContext(), R.string.network_error, Toast.LENGTH_SHORT).show();
316+
}
317+
}
318+
319+
@Override
320+
public void onFailure(Call<StarResponse> call, Throwable t) {
321+
ZLog.logException(t);
322+
Toast.makeText(getContext(), R.string.network_error, Toast.LENGTH_SHORT).show();
323+
}
324+
});
325+
326+
}
327+
264328
public void onReadyToDisplay(boolean registered) {
265329
if (initialized && !registered) {
266330
// Already have state, and already processed any events that came in

app/src/main/java/com/zulip/android/activities/RecyclerMessageAdapter.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,7 @@ public void onClick(View view) {
426426

427427
setUpGravatar(message, messageHolder);
428428
setUpTime(message, messageHolder);
429+
setUpStar(message, messageHolder);
429430
break;
430431
}
431432
}
@@ -481,6 +482,21 @@ private void setUpTime(Message message, MessageHolder messageHolder) {
481482
}
482483
}
483484

485+
private void setUpStar(Message message, MessageHolder messageHolder) {
486+
if (message.getFlags() != null) {
487+
if (message.getFlags().contains("starred")) {
488+
message.setMessageStar(true);
489+
}
490+
}
491+
//Checking for a starred message
492+
if (message.getMessageStar()) {
493+
//Make star's imageView visibility to VISIBLE
494+
messageHolder.starImage.setVisibility(View.VISIBLE);
495+
} else {
496+
//Make star's imageView visibility to GONE
497+
messageHolder.starImage.setVisibility(View.GONE);
498+
}
499+
}
484500

485501
private void setUpGravatar(final Message message, final MessageHolder messageHolder) {
486502
//Setup Gravatar

app/src/main/java/com/zulip/android/activities/ZulipActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import com.zulip.android.filters.NarrowFilterByDate;
8383
import com.zulip.android.filters.NarrowFilterPM;
8484
import com.zulip.android.filters.NarrowFilterSearch;
85+
import com.zulip.android.filters.NarrowFilterStar;
8586
import com.zulip.android.filters.NarrowFilterStream;
8687
import com.zulip.android.filters.NarrowListener;
8788
import com.zulip.android.gcm.GcmBroadcastReceiver;
@@ -2094,6 +2095,9 @@ public void onClick(
20942095
//else Narrow to Today
20952096
onNarrow(new NarrowFilterByDate());
20962097
break;
2098+
case R.id.isStarred:
2099+
onNarrow(new NarrowFilterStar());
2100+
break;
20972101
case R.id.enterDate:
20982102
//show Dialog with calendar date as selected to pick Date
20992103
DatePickerDialog datePickerDialog = new DatePickerDialog(ZulipActivity.this, new DatePickerDialog.OnDateSetListener() {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.zulip.android.filters;
2+
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
import com.j256.ormlite.stmt.SelectArg;
7+
import com.j256.ormlite.stmt.Where;
8+
import com.zulip.android.R;
9+
import com.zulip.android.ZulipApp;
10+
import com.zulip.android.models.Message;
11+
import com.zulip.android.models.Stream;
12+
13+
import org.json.JSONException;
14+
15+
import java.sql.SQLException;
16+
17+
public class NarrowFilterStar implements NarrowFilter {
18+
19+
public static final Parcelable.Creator<NarrowFilterStar> CREATOR = new Parcelable.Creator<NarrowFilterStar>() {
20+
public NarrowFilterStar createFromParcel(Parcel in) {
21+
return new NarrowFilterStar();
22+
}
23+
24+
public NarrowFilterStar[] newArray(int size) {
25+
return new NarrowFilterStar[size];
26+
}
27+
};
28+
29+
private boolean isStarred;
30+
31+
public int describeContents() {
32+
return 0;
33+
}
34+
35+
public void writeToParcel(Parcel dest, int flags) {
36+
}
37+
38+
@Override
39+
public Where<Message, Object> modWhere(Where<Message, Object> where)
40+
throws SQLException {
41+
where.eq(Message.MESSAGE_STAR_FIELD, new SelectArg(isStarred));
42+
return where;
43+
}
44+
45+
@Override
46+
public String toString() {
47+
try {
48+
return getJsonFilter();
49+
} catch (JSONException e) {
50+
return null;
51+
}
52+
}
53+
54+
@Override
55+
public boolean matches(Message msg) {
56+
return (msg.getFlags() != null && msg.getFlags().contains("starred")) ||
57+
(msg.getMessageStar());
58+
}
59+
60+
@Override
61+
public String getTitle() {
62+
return ZulipApp.get().getString(R.string.starred_messages);
63+
}
64+
65+
@Override
66+
public String getSubtitle() {
67+
return null;
68+
}
69+
70+
@Override
71+
public Stream getComposeStream() {
72+
return null;
73+
}
74+
75+
@Override
76+
public String getComposePMRecipient() {
77+
return null;
78+
}
79+
80+
@Override
81+
public String getJsonFilter() throws JSONException {
82+
return "{}";
83+
}
84+
85+
@Override
86+
public boolean equals(NarrowFilter filter) {
87+
return filter instanceof NarrowFilterStar;
88+
}
89+
}

app/src/main/java/com/zulip/android/models/Message.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public class Message {
5656
public static final String RECIPIENTS_FIELD = "recipients";
5757
public static final String STREAM_FIELD = "stream";
5858
public static final String MESSAGE_READ_FIELD = "read";
59+
public static final String MESSAGE_STAR_FIELD = "star";
5960
private static final String SENDER_FIELD = "sender";
6061
private static final String FORMATTED_CONTENT_FIELD = "formattedContent";
6162
private static final String MESSAGE_EDITED = "MESSAGE_EDITED";
@@ -117,6 +118,10 @@ public class Message {
117118
private Stream stream;
118119
@DatabaseField(columnName = MESSAGE_READ_FIELD)
119120
private Boolean messageRead;
121+
@SerializedName("flags")
122+
private List<String> flags;
123+
@DatabaseField(columnName = MESSAGE_STAR_FIELD)
124+
private boolean messageStar;
120125
@DatabaseField(columnDefinition = MESSAGE_EDITED)
121126
private Boolean hasBeenEdited;
122127
//endregion
@@ -371,6 +376,21 @@ public static HTMLSchema getSchema() {
371376
return schema;
372377
}
373378

379+
public boolean getMessageStar() {
380+
return messageStar;
381+
}
382+
383+
public void setMessageStar(boolean messageStar) {
384+
this.messageStar = messageStar;
385+
if (this.getFlags() != null) {
386+
if (messageStar && !this.getFlags().contains("starred")) {
387+
this.getFlags().add("starred");
388+
} else if (!messageStar && this.getFlags().contains("starred")) {
389+
this.getFlags().remove("starred");
390+
}
391+
}
392+
}
393+
374394
public Boolean getMessageRead() {
375395
return messageRead;
376396
}
@@ -682,6 +702,14 @@ public void setRecipients(String recipients) {
682702
this.recipients = recipients;
683703
}
684704

705+
public List<String> getFlags() {
706+
return flags;
707+
}
708+
709+
public void setFlags(List<String> flags) {
710+
this.flags = flags;
711+
}
712+
685713
public Person[] getRecipientsCache() {
686714
return recipientsCache;
687715
}

app/src/main/java/com/zulip/android/networking/AsyncGetEvents.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.j256.ormlite.dao.Dao;
1111
import com.j256.ormlite.dao.RuntimeExceptionDao;
1212
import com.j256.ormlite.misc.TransactionManager;
13+
import com.j256.ormlite.stmt.UpdateBuilder;
1314
import com.zulip.android.R;
1415
import com.zulip.android.ZulipApp;
1516
import com.zulip.android.activities.LoginActivity;
@@ -26,6 +27,7 @@
2627
import com.zulip.android.networking.response.events.MessageWrapper;
2728
import com.zulip.android.networking.response.events.MutedTopicsWrapper;
2829
import com.zulip.android.networking.response.events.StreamWrapper;
30+
import com.zulip.android.networking.response.events.StarWrapper;
2931
import com.zulip.android.networking.response.events.SubscriptionWrapper;
3032
import com.zulip.android.networking.response.events.UpdateMessageWrapper;
3133
import com.zulip.android.util.MutedTopics;
@@ -382,6 +384,11 @@ public Message convert(MessageWrapper messageWrapper) {
382384
processStreams(streamEvents);
383385
}
384386

387+
//get star events
388+
List<EventsBranch> starEvents = events.getEventsOfBranchType(EventsBranch.BranchType.STAR_MESSAGE);
389+
if (!starEvents.isEmpty()) {
390+
processStarEvents(starEvents);
391+
}
385392
}
386393

387394
/**
@@ -489,6 +496,7 @@ public void run() {
489496
*
490497
* @param messageEditLimitEvents list of events {@link EventsBranch}
491498
*/
499+
492500
private void processMessageEditParam(List<EventsBranch> messageEditLimitEvents) {
493501
for (EventsBranch wrapper : messageEditLimitEvents) {
494502
EditMessageWrapper timeLimitResponse = (EditMessageWrapper) wrapper;
@@ -552,11 +560,46 @@ public void processStreams(List<EventsBranch> events) {
552560
ZLog.logException(e);
553561
}
554562
}
563+
555564
} else {
556565
// TODO: handle other operations of stream event
557566
Log.d("AsyncEvents", "unhandled operation for stream type event");
558567
return;
559568
}
560569
}
561570
}
571+
572+
private void processStarEvents(List<EventsBranch> starEvents) {
573+
for (EventsBranch wrapper : starEvents) {
574+
StarWrapper starResponse = (StarWrapper) wrapper;
575+
576+
if (starResponse.getFlag().equals("starred")) {
577+
UpdateBuilder<Message, Object> updateBuilder =
578+
app.getDao(Message.class).updateBuilder();
579+
if (starResponse.getOperation().equals("add")) {
580+
try {
581+
Log.i("AsyncGetEvents", "Star add: " + starResponse.getMessageId().get(0) +
582+
" || " + starResponse.getOperation() +
583+
" || " + starResponse.getFlag());
584+
updateBuilder.where().eq(Message.ID_FIELD, starResponse.getMessageId().get(0));
585+
updateBuilder.updateColumnValue(Message.MESSAGE_STAR_FIELD, true);
586+
updateBuilder.update();
587+
} catch (SQLException e) {
588+
ZLog.logException(e);
589+
}
590+
} else if (starResponse.getOperation().equals("remove")) {
591+
try {
592+
Log.i("AsyncGetEvents", "Star remove: " + starResponse.getMessageId().get(0) +
593+
" || " + starResponse.getOperation() +
594+
" || " + starResponse.getFlag());
595+
updateBuilder.where().eq(Message.ID_FIELD, starResponse.getMessageId().get(0));
596+
updateBuilder.updateColumnValue(Message.MESSAGE_STAR_FIELD, false);
597+
updateBuilder.update();
598+
} catch (SQLException e) {
599+
ZLog.logException(e);
600+
}
601+
}
602+
}
603+
}
604+
}
562605
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.zulip.android.networking.response;
2+
3+
import com.google.gson.annotations.SerializedName;
4+
5+
public class StarResponse {
6+
@SerializedName("msg")
7+
private String message;
8+
9+
@SerializedName("result")
10+
private String result;
11+
12+
public String getMessage() {
13+
return message;
14+
}
15+
16+
public String getResult() {
17+
return result;
18+
}
19+
}

app/src/main/java/com/zulip/android/networking/response/events/EventsBranch.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public enum BranchType {
2828
MUTED_TOPICS(MutedTopicsWrapper.class, "muted_topics"),
2929
EDIT_MESSAGE_TIME_LIMIT(EditMessageWrapper.class, "realm"),
3030
UPDATE_MESSAGE(UpdateMessageWrapper.class, "update_message"),
31-
STREAM(StreamWrapper.class, "stream");
32-
31+
STREAM(StreamWrapper.class, "stream"),
32+
STAR_MESSAGE(StarWrapper.class, "update_message_flags");
3333

3434
private final Class<? extends EventsBranch> klazz;
3535
private final String key;

0 commit comments

Comments
 (0)