diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java index f539379a..892d92ac 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/ThreadManager.java @@ -65,7 +65,7 @@ public class ThreadManager implements Loader.LoaderListener { private final Activity activity; private final ThreadManager.ThreadManagerListener threadManagerListener; - private final List> popupQueue = new ArrayList<>(); + private final List popupQueue = new ArrayList<>(); private PostRepliesFragment currentPopupFragment; private int highlightedPost = -1; private int lastPost = -1; @@ -381,6 +381,7 @@ public class ThreadManager implements Loader.LoaderListener { } public void showPostReplies(Post post) { + RepliesPopup l = new RepliesPopup(); List p = new ArrayList<>(); for (int no : post.repliesFrom) { Post r = findPostById(no); @@ -388,9 +389,9 @@ public class ThreadManager implements Loader.LoaderListener { p.add(r); } } - + l.posts = p; if (p.size() > 0) { - showPostsRepliesFragment(p); + showPostsRepliesFragment(l); } } @@ -445,8 +446,8 @@ public class ThreadManager implements Loader.LoaderListener { post = findPostById(id); if (post != null) { - List l = new ArrayList<>(); - l.add(post); + RepliesPopup l = new RepliesPopup(); + l.posts.add(post); showPostsRepliesFragment(l); } } @@ -464,16 +465,16 @@ public class ThreadManager implements Loader.LoaderListener { Utils.openLink(activity, linkable.value); } - private void showPostsRepliesFragment(List list) { + private void showPostsRepliesFragment(RepliesPopup repliesPopup) { // Post popups are now queued up, more than 32 popups on top of each // other makes the system crash! - popupQueue.add(list); + popupQueue.add(repliesPopup); if (currentPopupFragment != null) { currentPopupFragment.dismissNoCallback(); } - PostRepliesFragment popup = PostRepliesFragment.newInstance(list, this); + PostRepliesFragment popup = PostRepliesFragment.newInstance(repliesPopup, this); FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); ft.add(popup, "postPopup"); @@ -489,6 +490,7 @@ public class ThreadManager implements Loader.LoaderListener { popupQueue.remove(popupQueue.size() - 1); if (popupQueue.size() > 0) { + RepliesPopup pop = popupQueue.get(popupQueue.size() - 1); PostRepliesFragment popup = PostRepliesFragment.newInstance(popupQueue.get(popupQueue.size() - 1), this); FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); @@ -576,4 +578,10 @@ public class ThreadManager implements Loader.LoaderListener { public void onScrollTo(Post post); } + + public static class RepliesPopup { + public List posts = new ArrayList<>(); + public int listViewIndex; + public int listViewTop; + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java index 1e9827e0..9a17aa0a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/PostRepliesFragment.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; @@ -31,10 +32,9 @@ import org.floens.chan.R; import org.floens.chan.core.manager.ThreadManager; import org.floens.chan.core.model.Post; import org.floens.chan.ui.view.PostView; +import org.floens.chan.utils.Logger; import org.floens.chan.utils.ThemeHelper; -import java.util.List; - /** * A DialogFragment that shows a list of posts. Use the newInstance method for * instantiating. @@ -42,13 +42,13 @@ import java.util.List; public class PostRepliesFragment extends DialogFragment { private ListView listView; - private List posts; + private ThreadManager.RepliesPopup repliesPopup; private ThreadManager manager; private boolean callback = true; - public static PostRepliesFragment newInstance(List posts, ThreadManager manager) { + public static PostRepliesFragment newInstance(ThreadManager.RepliesPopup repliesPopup, ThreadManager manager) { PostRepliesFragment fragment = new PostRepliesFragment(); - fragment.posts = posts; + fragment.repliesPopup = repliesPopup; fragment.manager = manager; return fragment; @@ -108,7 +108,7 @@ public class PostRepliesFragment extends DialogFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if (posts == null) { + if (repliesPopup == null) { // Restoring from background. dismiss(); } else { @@ -139,8 +139,24 @@ public class PostRepliesFragment extends DialogFragment { } }; - adapter.addAll(posts); + adapter.addAll(repliesPopup.posts); listView.setAdapter(adapter); + + listView.setSelectionFromTop(repliesPopup.listViewIndex, repliesPopup.listViewTop); + listView.setOnScrollListener(new AbsListView.OnScrollListener() { + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (repliesPopup != null) { + repliesPopup.listViewIndex = view.getFirstVisiblePosition(); + View v = view.getChildAt(0); + repliesPopup.listViewTop = (v == null) ? 0 : v.getTop(); + } + } + }); } } }