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

Commit d8efc7d

Browse files
committed
Keep messages in streams and private messages in view when narrowed.
Fixes #145
1 parent 7597dac commit d8efc7d

File tree

5 files changed

+114
-17
lines changed

5 files changed

+114
-17
lines changed

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

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@ public class MessageListFragment extends Fragment implements MessageListener {
6262
// Whether we've loaded all available messages in that direction
6363
private boolean loadedToTop = false;
6464
private boolean loadedToBottom = false;
65-
6665
private int firstMessageId = -1;
6766
private int lastMessageId = -1;
67+
// anchor message id used while narrowing to a subject or stream
68+
private int anchorId = -1;
6869
private boolean paused = false;
6970
private boolean initialized = false;
7071
private List<Message> messageList;
@@ -212,6 +213,17 @@ public boolean onContextItemSelected(MenuItem item) {
212213
}
213214
}
214215

216+
private void initializeNarrow() {
217+
adapter.clear();
218+
messageIndex.clear();
219+
220+
firstMessageId = -1;
221+
lastMessageId = -1;
222+
223+
loadingMessages = true;
224+
adapter.setFooterShowing(true);
225+
}
226+
215227
public void onReadyToDisplay(boolean registered) {
216228
if (initialized && !registered) {
217229
// Already have state, and already processed any events that came in
@@ -222,19 +234,33 @@ public void onReadyToDisplay(boolean registered) {
222234
return;
223235
}
224236

225-
adapter.clear();
226-
messageIndex.clear();
227-
228-
firstMessageId = -1;
229-
lastMessageId = -1;
237+
initializeNarrow();
238+
fetch();
239+
initialized = true;
240+
}
230241

231-
loadingMessages = true;
232-
adapter.setFooterShowing(true);
242+
/**
243+
* Prepare to display narrowed view with {@param messageId} as anchor
244+
*
245+
* @param registered is event registered
246+
* @param messageId anchor message id
247+
*/
248+
public void onReadyToDisplay(boolean registered, int messageId) {
249+
if (initialized && !registered) {
250+
// Already have state, and already processed any events that came in
251+
// when resuming the existing queue.
252+
adapter.setFooterShowing(false);
253+
loadingMessages = false;
254+
Log.i("onReadyToDisplay", "just a resume");
255+
return;
256+
}
233257

234-
fetch();
258+
initializeNarrow();
259+
fetch(messageId);
235260
initialized = true;
236261
}
237262

263+
238264
private void showEmptyView() {
239265
Log.d("ErrorRecieving", "No Messages found for current list" + ((filter != null) ? ":" + filter.getTitle() : ""));
240266
recyclerView.setVisibility(View.GONE);
@@ -263,6 +289,37 @@ public void onTaskFailure(String result) {
263289
100, filter);
264290
}
265291

292+
/**
293+
* This function fetches messages using {@link MessageListFragment#filter} and anchors them
294+
* around {@param messageID}.
295+
*
296+
* @param messageID anchor message id
297+
*/
298+
private void fetch(int messageID) {
299+
// set the achor for fetching messages as the message clicked
300+
this.anchorId = messageID;
301+
302+
final AsyncGetOldMessages oldMessagesReq = new AsyncGetOldMessages(this);
303+
oldMessagesReq.setCallback(new ZulipAsyncPushTask.AsyncTaskCompleteListener() {
304+
@Override
305+
public void onTaskComplete(String result, JSONObject jsonObject) {
306+
loadingMessages = false;
307+
adapter.setHeaderShowing(false);
308+
if (result.equals("0")) {
309+
showEmptyView();
310+
}
311+
}
312+
313+
@Override
314+
public void onTaskFailure(String result) {
315+
loadingMessages = false;
316+
adapter.setHeaderShowing(false);
317+
}
318+
});
319+
oldMessagesReq.execute(messageID, LoadPosition.INITIAL, 100,
320+
100, filter);
321+
}
322+
266323
private void selectPointer() {
267324
if (filter != null) {
268325
Where<Message, Object> filteredWhere;
@@ -277,10 +334,14 @@ private void selectPointer() {
277334

278335
closestQuery.orderBy(Message.TIMESTAMP_FIELD, false).setWhere(
279336
filteredWhere);
337+
Message closestMessage = closestQuery.queryForFirst();
280338

281-
recyclerView.scrollToPosition(adapter.getItemIndex(closestQuery
282-
.queryForFirst()));
283-
339+
// use anchor message id if message was narrowed
340+
if (anchorId != -1) {
341+
selectMessage(getMessageById(anchorId));
342+
} else {
343+
recyclerView.scrollToPosition(adapter.getItemIndex(closestMessage));
344+
}
284345
} catch (SQLException e) {
285346
throw new RuntimeException(e);
286347
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import android.graphics.drawable.GradientDrawable;
1010
import android.net.Uri;
1111
import android.support.annotation.ColorInt;
12+
import android.support.annotation.Keep;
1213
import android.support.v4.content.ContextCompat;
1314
import android.support.v4.view.ViewCompat;
1415
import android.support.v7.app.AppCompatDelegate;
@@ -117,22 +118,27 @@ public void onItemClick(int viewId, int position) {
117118
MessageHeaderParent messageHeaderParent = (MessageHeaderParent) getItem(position);
118119
if (messageHeaderParent.getMessageType() == MessageType.PRIVATE_MESSAGE) {
119120
Person[] recipientArray = messageHeaderParent.getRecipients(zulipApp);
120-
narrowListener.onNarrow(new NarrowFilterPM(Arrays.asList(recipientArray)));
121+
narrowListener.onNarrow(new NarrowFilterPM(Arrays.asList(recipientArray)),
122+
messageHeaderParent.getMessageId());
121123
narrowListener.onNarrowFillSendBoxPrivate(recipientArray,false);
122124
} else {
123-
124-
narrowListener.onNarrow(new NarrowFilterStream(Stream.getByName(zulipApp, messageHeaderParent.getStream()), null));
125+
narrowListener.onNarrow(new NarrowFilterStream(Stream.getByName(zulipApp,
126+
messageHeaderParent.getStream()), null),
127+
messageHeaderParent.getMessageId());
125128
narrowListener.onNarrowFillSendBoxStream(messageHeaderParent.getStream(), "", false);
126129
}
127130
break;
128131
case R.id.instance: //Topic
129132
MessageHeaderParent messageParent = (MessageHeaderParent) getItem(position);
130133
if (messageParent.getMessageType() == MessageType.STREAM_MESSAGE) {
131-
narrowListener.onNarrow(new NarrowFilterStream(Stream.getByName(zulipApp, messageParent.getStream()), messageParent.getSubject()));
134+
narrowListener.onNarrow(new NarrowFilterStream(Stream.getByName(zulipApp,
135+
messageParent.getStream()), messageParent.getSubject()),
136+
messageParent.getMessageId());
132137
narrowListener.onNarrowFillSendBoxStream(messageParent.getStream(), messageParent.getSubject(), false);
133138
} else {
134139
Person[] recipentArray = messageParent.getRecipients(zulipApp);
135-
narrowListener.onNarrow(new NarrowFilterPM(Arrays.asList(recipentArray)));
140+
narrowListener.onNarrow(new NarrowFilterPM(Arrays.asList(recipentArray)),
141+
messageParent.getMessageId());
136142
narrowListener.onNarrowFillSendBoxPrivate(recipentArray, false);
137143
}
138144
break;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1794,6 +1794,20 @@ public void doNarrow(NarrowFilter filter) {
17941794
showView(appBarLayout);
17951795
}
17961796

1797+
/**
1798+
* This method creates a new Instance of the MessageListFragment and displays it with the filter
1799+
* whiling keeping the view anchored at {@param messageId}.
1800+
* @param filter NarrowFilter passed
1801+
* @param messageId used as anchor for fetching messages
1802+
*/
1803+
public void doNarrow(NarrowFilter filter, int messageId) {
1804+
narrowedList = MessageListFragment.newInstance(filter);
1805+
// Push to the back stack if we are not already narrowed
1806+
pushListFragment(narrowedList, NARROW);
1807+
narrowedList.onReadyToDisplay(true, messageId);
1808+
showView(appBarLayout);
1809+
}
1810+
17971811
@Override
17981812
public void onNarrowFillSendBoxPrivate(Person peopleList[], boolean openSoftKeyboard) {
17991813
displayChatBox(true);
@@ -1868,6 +1882,12 @@ public void onNarrow(NarrowFilter narrowFilter) {
18681882
doNarrow(narrowFilter);
18691883
}
18701884

1885+
1886+
public void onNarrow(NarrowFilter narrowFilter, int messageId) {
1887+
// TODO: check if already narrowed to this particular stream/subject
1888+
doNarrow(narrowFilter, messageId);
1889+
}
1890+
18711891
@Override
18721892
protected void onPostCreate(Bundle savedInstanceState) {
18731893
super.onPostCreate(savedInstanceState);

app/src/main/java/com/zulip/android/filters/NarrowListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
public interface NarrowListener {
1010
void onNarrow(NarrowFilter narrowFilter);
1111

12+
void onNarrow(NarrowFilter narrowFilter, int messageId);
13+
1214
void onNarrowFillSendBox(Message message, boolean openSoftKeyboard);
1315

1416
void onNarrowFillSendBoxStream(String stream, String message, boolean openSoftKeyboard);

app/src/main/java/com/zulip/android/viewholders/MessageHeaderParent.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,14 @@ public String getId() {
8181
return id;
8282
}
8383

84+
/**
85+
* Returns message id of containing message {@link MessageHeaderParent#message}.
86+
* @return message id
87+
*/
88+
public int getMessageId() {
89+
return message.getID();
90+
}
91+
8492
public void setId(String id) {
8593
this.id = id;
8694
}

0 commit comments

Comments
 (0)