From bfd8711d9dfd78db9b6d3bc19a1543583f824dd0 Mon Sep 17 00:00:00 2001 From: "Mr. Dragon" Date: Mon, 28 May 2018 20:45:03 +0530 Subject: [PATCH] Fix the iterator behaviour for extreme filters --- .../aurora/fragment/SearchAppsFragment.java | 51 ++++++++++++------- .../dragons/aurora/fragment/TopFreeApps.java | 41 ++++++++++----- app/src/main/res/layout/app_endless_inc.xml | 9 +++- .../main/res/layout/fragment_search_list.xml | 25 +++++---- 4 files changed, 79 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/dragons/aurora/fragment/SearchAppsFragment.java b/app/src/main/java/com/dragons/aurora/fragment/SearchAppsFragment.java index 7fd055a4e..b7cb7860c 100644 --- a/app/src/main/java/com/dragons/aurora/fragment/SearchAppsFragment.java +++ b/app/src/main/java/com/dragons/aurora/fragment/SearchAppsFragment.java @@ -9,6 +9,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; +import android.widget.ProgressBar; import com.dragons.aurora.AppListIterator; import com.dragons.aurora.PlayStoreApiAuthenticator; @@ -27,6 +28,7 @@ import butterknife.BindView; import butterknife.ButterKnife; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class SearchAppsFragment extends SearchTask { @@ -35,24 +37,25 @@ public class SearchAppsFragment extends SearchTask { RecyclerView recyclerView; @BindView(R.id.adaptive_toolbar) AdaptiveToolbar adaptiveToolbar; + @BindView(R.id.progress) + ProgressBar progressBar; private String title; - + private boolean setLooper = true; private boolean loading = true; private int oldItems, visibleItems, totalItems; - + private View view; private AppListIterator iterator; + private EndlessAppsAdapter endlessAppsAdapter; + private Disposable disposable; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_search_list, container, false); - + view = inflater.inflate(R.layout.fragment_search_list, container, false); ButterKnife.bind(this, view); - adaptiveToolbar.getAction_icon().setOnClickListener((v -> this.getActivity().onBackPressed())); adaptiveToolbar.getTitle0().setText(title); adaptiveToolbar.getTitle1().setVisibility(View.GONE); - return view; } @@ -83,18 +86,21 @@ public class SearchAppsFragment extends SearchTask { protected void setupListView(List appsToAdd) { LinearLayoutManager mLayoutManager = new LinearLayoutManager(this.getActivity()); + endlessAppsAdapter = new EndlessAppsAdapter(getActivity(), appsToAdd); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(this.getActivity(), R.anim.layout_anim)); - recyclerView.setAdapter(new EndlessAppsAdapter(getActivity(), appsToAdd)); + recyclerView.setAdapter(endlessAppsAdapter); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if ((visibleItems + oldItems) >= totalItems + 2) + setLooper = false; if (dy > 0) { visibleItems = mLayoutManager.getChildCount(); totalItems = mLayoutManager.getItemCount(); oldItems = mLayoutManager.findFirstVisibleItemPosition(); - if (loading) { + if (loading && !setLooper) { if ((visibleItems + oldItems) >= totalItems - 2) { loading = false; fetchSearchAppsList(true); @@ -103,26 +109,35 @@ public class SearchAppsFragment extends SearchTask { } } }); + getLooper(); } public void fetchSearchAppsList(boolean loadMore) { - Observable.fromCallable(() -> getResult(iterator)) + disposable = Observable.fromCallable(() -> getResult(iterator)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(appList -> { - if (loadMore) { - loading = true; - addApps(appList); - } else - setupListView(appList); + if (view != null) { + if (loadMore) { + loading = true; + addApps(appList); + } else + setupListView(appList); + } }, this::processException); } public void addApps(List appsToAdd) { - EndlessAppsAdapter adapter = (EndlessAppsAdapter) recyclerView.getAdapter(); - for (App app : appsToAdd) { - adapter.add(app); + if (!appsToAdd.isEmpty()) { + for (App app : appsToAdd) + endlessAppsAdapter.add(app); + endlessAppsAdapter.notifyItemInserted(endlessAppsAdapter.getItemCount() - 1); } - adapter.notifyItemInserted(appsToAdd.size()); + getLooper(); + } + + public void getLooper() { + if (iterator.hasNext() && setLooper) + fetchSearchAppsList(true); } } \ No newline at end of file diff --git a/app/src/main/java/com/dragons/aurora/fragment/TopFreeApps.java b/app/src/main/java/com/dragons/aurora/fragment/TopFreeApps.java index a21acda91..a6f7caad7 100644 --- a/app/src/main/java/com/dragons/aurora/fragment/TopFreeApps.java +++ b/app/src/main/java/com/dragons/aurora/fragment/TopFreeApps.java @@ -12,7 +12,6 @@ import android.view.animation.AnimationUtils; import com.dragons.aurora.AppListIterator; import com.dragons.aurora.PlayStoreApiAuthenticator; import com.dragons.aurora.R; -import com.dragons.aurora.activities.AuroraActivity; import com.dragons.aurora.adapters.EndlessAppsAdapter; import com.dragons.aurora.model.App; import com.dragons.aurora.playstoreapiv2.CategoryAppsIterator; @@ -24,15 +23,19 @@ import java.util.List; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class TopFreeApps extends CategoryAppsTask { + private boolean setLooper = true; private boolean loading = true; private int oldItems, visibleItems, totalItems; - + private View view; private AppListIterator iterator; private RecyclerView recyclerView; + private EndlessAppsAdapter endlessAppsAdapter; + private Disposable disposable; public AppListIterator getIterator() { return iterator; @@ -52,7 +55,7 @@ public class TopFreeApps extends CategoryAppsTask { @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.app_endless_inc, container, false); + view = inflater.inflate(R.layout.app_endless_inc, container, false); setRecyclerView(view.findViewById(R.id.endless_apps_list)); setIterator(setupIterator(CategoryAppsFragment.categoryId, GooglePlayAPI.SUBCATEGORY.TOP_FREE)); fetchCategoryApps(false); @@ -62,10 +65,11 @@ public class TopFreeApps extends CategoryAppsTask { protected AppListIterator setupIterator(String categoryId, GooglePlayAPI.SUBCATEGORY subcategory) { AppListIterator iterator; try { - iterator = new AppListIterator(new CategoryAppsIterator(new PlayStoreApiAuthenticator(getContext()).getApi(), + iterator = new AppListIterator(new CategoryAppsIterator( + new PlayStoreApiAuthenticator(getContext()).getApi(), categoryId, subcategory)); - iterator.setFilter(new FilterMenu((AuroraActivity) getContext()).getFilterPreferences()); + iterator.setFilter(new FilterMenu(getContext()).getFilterPreferences()); return iterator; } catch (IOException e) { e.printStackTrace(); @@ -75,18 +79,21 @@ public class TopFreeApps extends CategoryAppsTask { protected void setupListView(List appsToAdd) { LinearLayoutManager mLayoutManager = new LinearLayoutManager(this.getActivity()); + endlessAppsAdapter = new EndlessAppsAdapter(getActivity(), appsToAdd); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setLayoutAnimation(AnimationUtils.loadLayoutAnimation(this.getActivity(), R.anim.layout_anim)); - recyclerView.setAdapter(new EndlessAppsAdapter(getActivity(), appsToAdd)); + recyclerView.setAdapter(endlessAppsAdapter); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + if ((visibleItems + oldItems) >= totalItems + 2) + setLooper = false; if (dy > 0) { visibleItems = mLayoutManager.getChildCount(); totalItems = mLayoutManager.getItemCount(); oldItems = mLayoutManager.findFirstVisibleItemPosition(); - if (loading) { + if (loading && !setLooper) { if ((visibleItems + oldItems) >= totalItems - 2) { loading = false; fetchCategoryApps(true); @@ -95,14 +102,15 @@ public class TopFreeApps extends CategoryAppsTask { } } }); + getLooper(); } - public void fetchCategoryApps(boolean loadMore) { - Observable.fromCallable(() -> getResult(iterator)) + public void fetchCategoryApps(boolean shouldIterate) { + disposable = Observable.fromCallable(() -> getResult(iterator)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(appList -> { - if (loadMore) { + if (shouldIterate) { loading = true; addApps(appList); } else @@ -111,11 +119,16 @@ public class TopFreeApps extends CategoryAppsTask { } public void addApps(List appsToAdd) { - EndlessAppsAdapter adapter = (EndlessAppsAdapter) recyclerView.getAdapter(); - for (App app : appsToAdd) { - adapter.add(app); + if (!appsToAdd.isEmpty()) { + for (App app : appsToAdd) + endlessAppsAdapter.add(app); + endlessAppsAdapter.notifyItemInserted(endlessAppsAdapter.getItemCount() - 1); } - adapter.notifyItemInserted(appsToAdd.size()); + getLooper(); } + public void getLooper() { + if (iterator.hasNext() && setLooper) + fetchCategoryApps(true); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/app_endless_inc.xml b/app/src/main/res/layout/app_endless_inc.xml index a0f8454f6..89baee3de 100644 --- a/app/src/main/res/layout/app_endless_inc.xml +++ b/app/src/main/res/layout/app_endless_inc.xml @@ -7,9 +7,14 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search_list.xml b/app/src/main/res/layout/fragment_search_list.xml index ad8129aa9..f4a78e4fd 100644 --- a/app/src/main/res/layout/fragment_search_list.xml +++ b/app/src/main/res/layout/fragment_search_list.xml @@ -16,20 +16,19 @@ android:background="?android:attr/colorBackground" android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - - - - + android:layout_height="wrap_content" + android:clipToPadding="false" + android:nestedScrollingEnabled="false" + android:paddingBottom="76dp" + android:paddingEnd="5dp" + android:paddingStart="5dp" + android:paddingTop="5dp" + android:scrollbarStyle="outsideOverlay" + android:scrollbars="vertical" />