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

Commit f5e0dea

Browse files
committed
Restore narrow and scroll after theme switch.
Fix:#406
1 parent 7041b4d commit f5e0dea

File tree

3 files changed

+135
-5
lines changed

3 files changed

+135
-5
lines changed

app/src/main/java/com/zulip/android/ZulipApp.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.j256.ormlite.misc.TransactionManager;
2828
import com.zulip.android.activities.ZulipActivity;
2929
import com.zulip.android.database.DatabaseHelper;
30+
import com.zulip.android.filters.NarrowFilter;
3031
import com.zulip.android.models.Emoji;
3132
import com.zulip.android.models.Message;
3233
import com.zulip.android.models.MessageType;
@@ -133,6 +134,19 @@ public void setZulipActivity(ZulipActivity zulipActivity) {
133134
this.zulipActivity = zulipActivity;
134135
}
135136

137+
//store narrowFilter before switching theme
138+
private NarrowFilter narrowFilter = null;
139+
140+
//set it after restore
141+
//for narrowed view
142+
private int tempNarrowedViewPointer = -1;
143+
//for home view
144+
private int tempHomeViewPointer = -1;
145+
146+
//useful when switch takes place from narrowed view
147+
//on switch theme activity is recreated
148+
private boolean isThemeSwitchedFromHome = true;
149+
136150
@Override
137151
public void onCreate() {
138152
super.onCreate();
@@ -602,4 +616,36 @@ public void setMessageContentEditParams(int seconds, boolean param) {
602616
}
603617
}
604618
}
619+
620+
public NarrowFilter getNarrowFilter() {
621+
return narrowFilter;
622+
}
623+
624+
public void setNarrowFilter(NarrowFilter narrowFilter) {
625+
this.narrowFilter = narrowFilter;
626+
}
627+
628+
public void setTempNarrowedViewPointer(int mID) {
629+
this.tempNarrowedViewPointer = mID;
630+
}
631+
632+
public int getTempNarrowedViewPointer() {
633+
return tempNarrowedViewPointer;
634+
}
635+
636+
public int getTempHomeViewPointer() {
637+
return tempHomeViewPointer;
638+
}
639+
640+
public void setTempHomeViewPointer(int tempHomeViewPointer) {
641+
this.tempHomeViewPointer = tempHomeViewPointer;
642+
}
643+
644+
public boolean isThemeSwitchedFromHome() {
645+
return isThemeSwitchedFromHome;
646+
}
647+
648+
public void setThemeSwitchedFromHome(boolean themeSwitchedFromHome) {
649+
isThemeSwitchedFromHome = themeSwitchedFromHome;
650+
}
605651
}

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

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ public void onTaskFailure(String result) {
422422
100, filter);
423423
}
424424

425-
private void selectPointer() {
425+
public void selectPointer() {
426426
if (filter != null) {
427427
Where<Message, Object> filteredWhere;
428428
try {
@@ -440,16 +440,38 @@ private void selectPointer() {
440440

441441
// use anchor message id if message was narrowed
442442
if (anchorId != -1) {
443-
selectMessage(getMessageById(anchorId));
443+
if (app.getTempNarrowedViewPointer() != -1 && app.getTempNarrowedViewPointer() < anchorId) {
444+
//user have scrolled above before switching theme
445+
scrollWithZeroOffset(getMessageById(app.getTempNarrowedViewPointer()));
446+
app.setTempNarrowedViewPointer(-1);
447+
} else {
448+
selectMessage(getMessageById(anchorId));
449+
}
444450
} else {
445-
recyclerView.scrollToPosition(adapter.getItemIndex(closestMessage));
451+
if (app.getTempNarrowedViewPointer() != -1 && adapter.getItemIndex(getMessageById(app.getTempNarrowedViewPointer())) < adapter.getItemIndex(closestMessage)) {
452+
//user have scrolled above before switching theme
453+
scrollWithZeroOffset(getMessageById(app.getTempNarrowedViewPointer()));
454+
app.setTempNarrowedViewPointer(-1);
455+
}else {
456+
recyclerView.scrollToPosition(adapter.getItemIndex(closestMessage));
457+
}
446458
}
447459
} catch (SQLException e) {
448460
throw new RuntimeException(e);
449461
}
450462
} else {
451463
int anc = app.getPointer();
452-
selectMessage(getMessageById(anc));
464+
int tempPointer = app.getTempHomeViewPointer();
465+
if (tempPointer != -1 && tempPointer < anc) {
466+
//user have scrolled above before switching theme
467+
scrollWithZeroOffset(getMessageById(tempPointer));
468+
//will be useful when user switch theme from narrowed view and back trace to home
469+
if (app.isThemeSwitchedFromHome()) {
470+
app.setTempHomeViewPointer(-1);
471+
}
472+
} else {
473+
selectMessage(getMessageById(anc));
474+
}
453475
}
454476
}
455477

@@ -849,6 +871,16 @@ private void selectMessage(final Message message) {
849871
recyclerView.scrollToPosition(adapter.getItemIndex(message));
850872
}
851873

874+
/**
875+
* scroll such that message comes to top of the view
876+
*
877+
* @param message that should come to top
878+
* @see {@link <a href="http://stackoverflow.com/questions/26875061/scroll-recyclerview-to-show-selected-item-on-top"/>}
879+
*/
880+
private void scrollWithZeroOffset(Message message) {
881+
linearLayoutManager.scrollToPositionWithOffset(adapter.getItemIndex(message), 0);
882+
}
883+
852884
private Message getMessageById(int id) {
853885
return this.messageIndex.get(id);
854886
}
@@ -889,4 +921,26 @@ public interface Listener {
889921
void setLayoutBehaviour(LinearLayoutManager linearLayoutManager, RecyclerMessageAdapter adapter);
890922

891923
}
924+
925+
/**
926+
* get messageId of FirstCompletelyVisibleItem
927+
* loop until we get message
928+
* skip message header
929+
*
930+
* @return messagedId of message which is at top
931+
*/
932+
public int getTopMessageId() {
933+
int position = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
934+
//if there aren't any visible items position = -1
935+
if (position >= 0) {
936+
for (int i = position; i < adapter.getItemCount(); i++) {
937+
Object topObject = adapter.getItem(i);
938+
if (topObject instanceof Message) {
939+
return ((Message) topObject).getID();
940+
}
941+
}
942+
}
943+
return -1;
944+
945+
}
892946
}

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,10 +642,14 @@ public void onBackStackChanged() {
642642
if (menu == null)
643643
return;
644644
if (narrowedList == null) {
645+
//will be useful when user switch theme from narrowed view and back trace to home
646+
app.setThemeSwitchedFromHome(true);
645647
calendar = Calendar.getInstance();
646648
menu.getItem(2).getSubMenu().getItem(0).setTitle(R.string.menu_today);
647649
switchToStream();
648650
checkForChatBoxFocusRequest();
651+
//on narrowed view is restored after switching and coming back to homeView set pointer accordingly
652+
homeList.selectPointer();
649653
} else if (narrowedList.filter instanceof NarrowFilterByDate) {
650654
menu.getItem(2).getSubMenu().getItem(0).setTitle(R.string.menu_one_day_before);
651655
}
@@ -933,6 +937,17 @@ protected void onNewIntent(Intent intent) {
933937
}
934938
}
935939

940+
@Override
941+
public void onAttachedToWindow() {
942+
super.onAttachedToWindow();
943+
//check if it was narrowed before switching theme
944+
if (app.getNarrowFilter() != null) {
945+
//restore narrow
946+
doNarrow(app.getNarrowFilter());
947+
app.setNarrowFilter(null);
948+
}
949+
}
950+
936951
@Override
937952
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
938953
if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
@@ -2061,7 +2076,12 @@ private void pushListFragment(MessageListFragment list, String back) {
20612076
transaction.replace(R.id.list_fragment_container, list);
20622077
if (back != null) {
20632078
transaction.addToBackStack(back);
2064-
clearSearch();
2079+
//searchView is in menu
2080+
//menu is inflated in onCreateOptionsMenu
2081+
//onCreateOptionsMenu is called somewhere in between onCreate is executing
2082+
if (searchView != null) {
2083+
clearSearch();
2084+
}
20652085
}
20662086
transaction.commit();
20672087
getSupportFragmentManager().executePendingTransactions();
@@ -2355,6 +2375,16 @@ public void onClick(
23552375
}
23562376
break;
23572377
case R.id.daynight:
2378+
//for narrowed view
2379+
if (narrowedList != null) {
2380+
app.setNarrowFilter(narrowedList.filter);
2381+
app.setTempNarrowedViewPointer(narrowedList.getTopMessageId());
2382+
app.setThemeSwitchedFromHome(false);
2383+
}
2384+
//for home view
2385+
if (app.getTempHomeViewPointer() == -1 || app.isThemeSwitchedFromHome()) {
2386+
app.setTempHomeViewPointer(homeList.getTopMessageId());
2387+
}
23582388
switch (AppCompatDelegate.getDefaultNightMode()) {
23592389
case -1:
23602390
case AppCompatDelegate.MODE_NIGHT_NO:

0 commit comments

Comments
 (0)