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

Commit ae9f23f

Browse files
committed
Restore narrow and scroll after theme switch.
Fix#406
1 parent cb6c4a7 commit ae9f23f

File tree

3 files changed

+137
-5
lines changed

3 files changed

+137
-5
lines changed

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

+46
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.j256.ormlite.misc.TransactionManager;
2727
import com.zulip.android.activities.ZulipActivity;
2828
import com.zulip.android.database.DatabaseHelper;
29+
import com.zulip.android.filters.NarrowFilter;
2930
import com.zulip.android.models.Emoji;
3031
import com.zulip.android.models.Message;
3132
import com.zulip.android.models.MessageType;
@@ -123,6 +124,19 @@ public void setZulipActivity(ZulipActivity zulipActivity) {
123124
this.zulipActivity = zulipActivity;
124125
}
125126

127+
//store narrowFilter before switching theme
128+
private NarrowFilter narrowFilter = null;
129+
130+
//set it after restore
131+
//for narrowed view
132+
private int tempNarrowedViewPointer = -1;
133+
//for home view
134+
private int tempHomeViewPointer = -1;
135+
136+
//useful when switch takes place from narrowed view
137+
//on switch theme activity is recreated
138+
private boolean isThemeSwitchedFromHome = true;
139+
126140
@Override
127141
public void onCreate() {
128142
super.onCreate();
@@ -560,4 +574,36 @@ public void setMessageContentEditParams(int seconds, boolean param) {
560574
}
561575
}
562576
}
577+
578+
public NarrowFilter getNarrowFilter() {
579+
return narrowFilter;
580+
}
581+
582+
public void setNarrowFilter(NarrowFilter narrowFilter) {
583+
this.narrowFilter = narrowFilter;
584+
}
585+
586+
public void setTempNarrowedViewPointer(int mID) {
587+
this.tempNarrowedViewPointer = mID;
588+
}
589+
590+
public int getTempNarrowedViewPointer() {
591+
return tempNarrowedViewPointer;
592+
}
593+
594+
public int getTempHomeViewPointer() {
595+
return tempHomeViewPointer;
596+
}
597+
598+
public void setTempHomeViewPointer(int tempHomeViewPointer) {
599+
this.tempHomeViewPointer = tempHomeViewPointer;
600+
}
601+
602+
public boolean isThemeSwitchedFromHome() {
603+
return isThemeSwitchedFromHome;
604+
}
605+
606+
public void setThemeSwitchedFromHome(boolean themeSwitchedFromHome) {
607+
isThemeSwitchedFromHome = themeSwitchedFromHome;
608+
}
563609
}

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

+58-4
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ public void onTaskFailure(String result) {
347347
100, filter);
348348
}
349349

350-
private void selectPointer() {
350+
public void selectPointer() {
351351
if (filter != null) {
352352
Where<Message, Object> filteredWhere;
353353
try {
@@ -365,16 +365,38 @@ private void selectPointer() {
365365

366366
// use anchor message id if message was narrowed
367367
if (anchorId != -1) {
368-
selectMessage(getMessageById(anchorId));
368+
if (app.getTempNarrowedViewPointer() != -1 && app.getTempNarrowedViewPointer() < anchorId) {
369+
//user have scrolled above before switching theme
370+
scrollWithZeroOffset(getMessageById(app.getTempNarrowedViewPointer()));
371+
app.setTempNarrowedViewPointer(-1);
372+
} else {
373+
selectMessage(getMessageById(anchorId));
374+
}
369375
} else {
370-
recyclerView.scrollToPosition(adapter.getItemIndex(closestMessage));
376+
if (app.getTempNarrowedViewPointer() != -1 && adapter.getItemIndex(getMessageById(app.getTempNarrowedViewPointer())) < adapter.getItemIndex(closestMessage)) {
377+
//user have scrolled above before switching theme
378+
scrollWithZeroOffset(getMessageById(app.getTempNarrowedViewPointer()));
379+
app.setTempNarrowedViewPointer(-1);
380+
}else {
381+
recyclerView.scrollToPosition(adapter.getItemIndex(closestMessage));
382+
}
371383
}
372384
} catch (SQLException e) {
373385
throw new RuntimeException(e);
374386
}
375387
} else {
376388
int anc = app.getPointer();
377-
selectMessage(getMessageById(anc));
389+
int tempPointer = app.getTempHomeViewPointer();
390+
if (tempPointer != -1 && tempPointer < anc) {
391+
//user have scrolled above before switching theme
392+
scrollWithZeroOffset(getMessageById(tempPointer));
393+
//will be useful when user switch theme from narrowed view and back trace to home
394+
if (app.isThemeSwitchedFromHome()) {
395+
app.setTempHomeViewPointer(-1);
396+
}
397+
} else {
398+
selectMessage(getMessageById(anc));
399+
}
378400
}
379401
}
380402

@@ -693,6 +715,16 @@ private void selectMessage(final Message message) {
693715
recyclerView.scrollToPosition(adapter.getItemIndex(message));
694716
}
695717

718+
/**
719+
* scroll such that message comes to top of the view
720+
*
721+
* @param message that should come to top
722+
* @see {@link <a href="http://stackoverflow.com/questions/26875061/scroll-recyclerview-to-show-selected-item-on-top"/>}
723+
*/
724+
private void scrollWithZeroOffset(Message message) {
725+
linearLayoutManager.scrollToPositionWithOffset(adapter.getItemIndex(message), 0);
726+
}
727+
696728
private Message getMessageById(int id) {
697729
return this.messageIndex.get(id);
698730
}
@@ -732,4 +764,26 @@ public boolean scrolledToLastMessage() {
732764
public RecyclerMessageAdapter getAdapter() {
733765
return this.adapter;
734766
}
767+
768+
/**
769+
* get messageId of FirstCompletelyVisibleItem
770+
* loop until we get message
771+
* skip message header
772+
*
773+
* @return messagedId of message which is at top
774+
*/
775+
public int getTopMessageId() {
776+
int position = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
777+
//if there aren't any visible items position = -1
778+
if (position >= 0) {
779+
for (int i = position; i < adapter.getItemCount(); i++) {
780+
Object topObject = adapter.getItem(i);
781+
if (topObject instanceof Message) {
782+
return ((Message) topObject).getID();
783+
}
784+
}
785+
}
786+
return -1;
787+
788+
}
735789
}

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

+33-1
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,8 @@ public Cursor runQuery(CharSequence charSequence) {
576576
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
577577
}
578578

579+
580+
579581
/**
580582
* Called when fragment is changed
581583
* When narrowedList == null means home page show Today in menu
@@ -588,10 +590,14 @@ public void onBackStackChanged() {
588590
if (menu == null)
589591
return;
590592
if (narrowedList == null) {
593+
//will be useful when user switch theme from narrowed view and back trace to home
594+
app.setThemeSwitchedFromHome(true);
591595
calendar = Calendar.getInstance();
592596
menu.getItem(2).getSubMenu().getItem(0).setTitle(R.string.menu_today);
593597
switchToStream();
594598
checkForChatBoxFocusRequest();
599+
//on narrowed view is restored after switching and coming back to homeView set pointer accordingly
600+
homeList.selectPointer();
595601
} else if (narrowedList.filter instanceof NarrowFilterByDate) {
596602
menu.getItem(2).getSubMenu().getItem(0).setTitle(R.string.menu_one_day_before);
597603
}
@@ -821,6 +827,17 @@ protected void onNewIntent(Intent intent) {
821827
}
822828
}
823829

830+
@Override
831+
public void onAttachedToWindow() {
832+
super.onAttachedToWindow();
833+
//check if it was narrowed before switching theme
834+
if (app.getNarrowFilter() != null) {
835+
//restore narrow
836+
doNarrow(app.getNarrowFilter());
837+
app.setNarrowFilter(null);
838+
}
839+
}
840+
824841
@Override
825842
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
826843
if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
@@ -1763,7 +1780,12 @@ private void pushListFragment(MessageListFragment list, String back) {
17631780
transaction.replace(R.id.list_fragment_container, list);
17641781
if (back != null) {
17651782
transaction.addToBackStack(back);
1766-
clearSearch();
1783+
//searchView is in menu
1784+
//menu is inflated in onCreateOptionsMenu
1785+
//onCreateOptionsMenu is called somewhere in between onCreate is executing
1786+
if (searchView != null) {
1787+
clearSearch();
1788+
}
17671789
}
17681790
transaction.commit();
17691791
getSupportFragmentManager().executePendingTransactions();
@@ -2057,6 +2079,16 @@ public void onClick(
20572079
}
20582080
break;
20592081
case R.id.daynight:
2082+
//for narrowed view
2083+
if (narrowedList != null) {
2084+
app.setNarrowFilter(narrowedList.filter);
2085+
app.setTempNarrowedViewPointer(narrowedList.getTopMessageId());
2086+
app.setThemeSwitchedFromHome(false);
2087+
}
2088+
//for home view
2089+
if (app.getTempHomeViewPointer() == -1 || app.isThemeSwitchedFromHome()) {
2090+
app.setTempHomeViewPointer(homeList.getTopMessageId());
2091+
}
20602092
switch (AppCompatDelegate.getDefaultNightMode()) {
20612093
case -1:
20622094
case AppCompatDelegate.MODE_NIGHT_NO:

0 commit comments

Comments
 (0)