From ecebe4c584a99383b553ee74837bf402415ec6cd Mon Sep 17 00:00:00 2001 From: Ujjwal Agrawal Date: Wed, 8 Aug 2018 03:37:48 +0530 Subject: [PATCH] Crash fixed due to notifyDataSetChange --- .../category/CategoryDetailsActivity.java | 20 ++++++++++++ .../category/CategoryImagesActivity.java | 20 ++++++++++++ .../category/CategoryImagesListFragment.java | 25 ++++++++++++++- .../nrw/commons/explore/SearchActivity.java | 21 ++++++++++++ .../explore/images/SearchImageFragment.java | 6 +++- .../media/MediaDetailPagerFragment.java | 32 +++++++++++++++++-- 6 files changed, 120 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java index 3ab3c2c07..fce2fac5e 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryDetailsActivity.java @@ -250,4 +250,24 @@ public class CategoryDetailsActivity extends NavigationBaseActivity } super.onBackPressed(); } + + /** + * This method is called on success of API call for Images inside a category. + * The viewpager will notified that number of items have changed. + */ + public void viewPagerNotifyDataSetChanged() { + if (mediaDetails!=null){ + mediaDetails.notifyDataSetChanged(); + } + } + + /** + * This method is called when viewPager has reached its end. + * Fetches more images using search query and adds it to the grid view and viewpager adapter + */ + public void requestMoreImages() { + if (categoryImagesListFragment!=null){ + categoryImagesListFragment.fetchMoreImagesViewPager(); + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java index 382134472..eafc46e68 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesActivity.java @@ -170,6 +170,16 @@ public class CategoryImagesActivity } } + /** + * This method is called on success of API call for featured Images. + * The viewpager will notified that number of items have changed. + */ + public void viewPagerNotifyDataSetChanged() { + if (mediaDetails!=null){ + mediaDetails.notifyDataSetChanged(); + } + } + /** * This method is called on from getCount of MediaDetailPagerFragment * The viewpager will contain same number of media items as that of media elements in adapter. @@ -236,4 +246,14 @@ public class CategoryImagesActivity return super.onOptionsItemSelected(item); } } + + /** + * This method is called when viewPager has reached its end. + * Fetches more images using search query and adds it to the gridView and viewpager adapter + */ + public void requestMoreImages() { + if (categoryImagesListFragment!=null){ + categoryImagesListFragment.fetchMoreImagesViewPager(); + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesListFragment.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesListFragment.java index 385662a05..a78157ee2 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryImagesListFragment.java @@ -190,6 +190,20 @@ public class CategoryImagesListFragment extends DaggerFragment { }); } + /** + * This method is called when viewPager has reached its end. + * Fetches more images for the category and adds it to the grid view and viewpager adapter + */ + public void fetchMoreImagesViewPager(){ + if (hasMoreImages && !isLoading) { + isLoading = true; + fetchMoreImages(); + } + if (!hasMoreImages){ + progressBar.setVisibility(GONE); + } + } + /** * Fetches more images for the category and adds it to the grid view adapter */ @@ -228,8 +242,17 @@ public class CategoryImagesListFragment extends DaggerFragment { return; } gridAdapter.addItems(collection); + try { + ((CategoryImagesActivity) getContext()).viewPagerNotifyDataSetChanged(); + }catch (Exception e){ + e.printStackTrace(); + } + try { + ((CategoryDetailsActivity) getContext()).viewPagerNotifyDataSetChanged(); + }catch (Exception e){ + e.printStackTrace(); + } } - progressBar.setVisibility(GONE); isLoading = false; statusTextView.setVisibility(GONE); diff --git a/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java b/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java index 475b3900a..38d78fb34 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/SearchActivity.java @@ -53,6 +53,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai private FragmentManager supportFragmentManager; private MediaDetailPagerFragment mediaDetails; ViewPagerAdapter viewPagerAdapter; + private String query; @Override protected void onCreate(Bundle savedInstanceState) { @@ -104,6 +105,7 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai .debounce(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe( query -> { + this.query = query.toString(); //update image list if (!TextUtils.isEmpty(query)) { viewPager.setVisibility(View.VISIBLE); @@ -145,7 +147,16 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai */ @Override public void notifyDatasetChanged() { + } + /** + * This method is called on success of API call for image Search. + * The viewpager will notified that number of items have changed. + */ + public void viewPagerNotifyDataSetChanged() { + if (mediaDetails!=null){ + mediaDetails.notifyDataSetChanged(); + } } /** @@ -245,4 +256,14 @@ public class SearchActivity extends NavigationBaseActivity implements MediaDetai // https://stackoverflow.com/questions/6117967/how-to-remove-focus-without-setting-focus-to-another-control/15481511 viewPager.requestFocus(); } + + /** + * This method is called when viewPager has reached its end. + * Fetches more images using search query and adds it to the recycler view and viewpager adapter + */ + public void requestMoreImages() { + if (searchImageFragment!=null){ + searchImageFragment.addImagesToList(query); + } + } } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java index a503207e4..b6c81135f 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java @@ -13,6 +13,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; + import com.pedrogomez.renderers.RVRendererAdapter; import java.util.ArrayList; import java.util.Date; @@ -160,6 +162,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment { progressBar.setVisibility(View.GONE); imagesAdapter.addAll(mediaList); imagesAdapter.notifyDataSetChanged(); + ((SearchActivity)getContext()).viewPagerNotifyDataSetChanged(); } @@ -179,6 +182,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment { progressBar.setVisibility(View.GONE); imagesAdapter.addAll(mediaList); imagesAdapter.notifyDataSetChanged(); + ((SearchActivity)getContext()).viewPagerNotifyDataSetChanged(); // check if user is waiting for 5 seconds if yes then save search query to history. Handler handler = new Handler(); @@ -239,7 +243,7 @@ public class SearchImageFragment extends CommonsDaggerSupportFragment { return null; } else { - return new Media(imagesAdapter.getItem(i).getFilename()); + return imagesAdapter.getItem(i); } } } diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index fc58ae990..d5e4fac2f 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -35,9 +35,12 @@ import javax.inject.Named; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.SessionManager; +import fr.free.nrw.commons.category.CategoryDetailsActivity; +import fr.free.nrw.commons.category.CategoryImagesActivity; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.contributions.ContributionsActivity; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; +import fr.free.nrw.commons.explore.SearchActivity; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.utils.ImageUtils; import timber.log.Timber; @@ -62,6 +65,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple ViewPager pager; private Boolean editable; private boolean isFeaturedImage; + MediaDetailAdapter adapter; public MediaDetailPagerFragment() { this(false, false); @@ -81,7 +85,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple ButterKnife.bind(this,view); pager.addOnPageChangeListener(this); - final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager()); + adapter = new MediaDetailAdapter(getChildFragmentManager()); if (savedInstanceState != null) { final int pageNumber = savedInstanceState.getInt("current-page"); @@ -269,11 +273,35 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple public void showImage(int i) { Handler handler = new Handler(); - handler.postDelayed(() -> pager.setCurrentItem(i), 10); + handler.postDelayed(() -> pager.setCurrentItem(i), 5); + } + + /** + * The method notify the viewpager that number of items have changed. + */ + public void notifyDataSetChanged(){ + adapter.notifyDataSetChanged(); } @Override public void onPageScrolled(int i, float v, int i2) { + if (i+1 >= adapter.getCount()){ + try{ + ((CategoryImagesActivity) getContext()).requestMoreImages(); + }catch (Exception e){ + e.printStackTrace(); + } + try{ + ((CategoryDetailsActivity) getContext()).requestMoreImages(); + }catch (Exception e){ + e.printStackTrace(); + } + try{ + ((SearchActivity) getContext()).requestMoreImages(); + }catch (Exception e){ + e.printStackTrace(); + } + } getActivity().supportInvalidateOptionsMenu(); }