diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 00f3c9f55..23be4f580 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,6 +109,11 @@ android:label="@string/title_activity_featured_images" android:parentActivityName=".contributions.MainActivity" /> + + fragmentList = new ArrayList<>(); + List titleList = new ArrayList<>(); + + featuredImagesListFragment = new CategoryImagesListFragment(); + Bundle featuredArguments = new Bundle(); + featuredArguments.putString("categoryName", FEATURED_IMAGES_CATEGORY); + featuredImagesListFragment.setArguments(featuredArguments); + fragmentList.add(featuredImagesListFragment); + titleList.add(getString(R.string.explore_tab_title_featured)); + + mobileImagesListFragment = new CategoryImagesListFragment(); + Bundle mobileArguments = new Bundle(); + mobileArguments.putString("categoryName", MOBILE_UPLOADS_CATEGORY); + mobileImagesListFragment.setArguments(mobileArguments); + fragmentList.add(mobileImagesListFragment); + titleList.add(getString(R.string.explore_tab_title_mobile)); + + viewPagerAdapter.setTabData(fragmentList, titleList); + viewPagerAdapter.notifyDataSetChanged(); + } + + /** + * This method is called mediaDetailPagerFragment. It returns the Media Object at that Index + * + * @param i It is the index of which media object is to be returned which is same as + * current index of viewPager. + * @return Media Object + */ + @Override + public Media getMediaAtPosition(int i) { + if (mobileImagesListFragment.getAdapter() != null && tabLayout.getSelectedTabPosition() == 1) { + return (Media) mobileImagesListFragment.getAdapter().getItem(i); + } else if (featuredImagesListFragment.getAdapter() != null && tabLayout.getSelectedTabPosition() == 0) { + return (Media) featuredImagesListFragment.getAdapter().getItem(i); + } else { + return null; + } + } + + /** + * 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. + * + * @return Total Media count in the adapter + */ + @Override + public int getTotalMediaCount() { + if (mobileImagesListFragment.getAdapter() != null && tabLayout.getSelectedTabPosition() == 1) { + return mobileImagesListFragment.getAdapter().getCount(); + } else if (featuredImagesListFragment.getAdapter() != null && tabLayout.getSelectedTabPosition() == 0) { + return featuredImagesListFragment.getAdapter().getCount(); + } else { + return 0; + } + } + + /** + * This method is never called but it was in MediaDetailProvider Interface + * so it needs to be overrided. + */ + @Override + public void notifyDatasetChanged() { + } + + /** + * This method is called on success of API call for featured images or mobile uploads. + * The viewpager will notified that number of items have changed. + */ + public void viewPagerNotifyDataSetChanged() { + if (mediaDetails != null) { + mediaDetails.notifyDataSetChanged(); + } + } + + /** + * This method is never called but it was in MediaDetailProvider Interface + * so it needs to be overrided. + */ + @Override + public void registerDataSetObserver(DataSetObserver observer) { + + } + + /** + * This method is never called but it was in MediaDetailProvider Interface + * so it needs to be overrided. + */ + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + + } + + /** + * This method is called on Screen Rotation + */ + @Override + protected void onResume() { + if (supportFragmentManager.getBackStackEntryCount() == 1) { + //FIXME: Temporary fix for screen rotation inside media details. If we don't call onBackPressed then fragment stack is increasing every time. + //FIXME: Similar issue like this https://github.com/commons-app/apps-android-commons/issues/894 + // + onBackPressed(); + } + super.onResume(); + } + + /** + * This method is called on backPressed of anyFragment in the activity. + * If condition is called when mediaDetailFragment is opened. + */ + @Override + public void onBackPressed() { + if (supportFragmentManager.getBackStackEntryCount() == 1) { + tabLayout.setVisibility(View.VISIBLE); + viewPager.setVisibility(View.VISIBLE); + mediaContainer.setVisibility(View.GONE); + } + initDrawer(); + super.onBackPressed(); + } + + + /** + * This method is called when viewPager has reached its end. + * Fetches more images and adds them to the recycler view and viewpager adapter + */ + public void requestMoreImages() { + if (mobileImagesListFragment != null && tabLayout.getSelectedTabPosition() == 1) { + mobileImagesListFragment.fetchMoreImagesViewPager(); + } else if (featuredImagesListFragment != null && tabLayout.getSelectedTabPosition() == 0) { + featuredImagesListFragment.fetchMoreImagesViewPager(); + } + } + + /** + * This method is called onClick of media inside category featured images or mobile uploads. + */ + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + tabLayout.setVisibility(View.GONE); + viewPager.setVisibility(View.GONE); + mediaContainer.setVisibility(View.VISIBLE); + if (mediaDetails == null || !mediaDetails.isVisible()) { + // set isFeaturedImage true for featured images, to include author field on media detail + mediaDetails = new MediaDetailPagerFragment(false, true); + FragmentManager supportFragmentManager = getSupportFragmentManager(); + supportFragmentManager + .beginTransaction() + .hide(supportFragmentManager.getFragments().get(supportFragmentManager.getBackStackEntryCount())) + .add(R.id.mediaContainer, mediaDetails) + .addToBackStack(null) + .commit(); + // Reason for using hide, add instead of replace is to maintain scroll position after + // coming back to the explore activity. See https://github.com/commons-app/apps-android-commons/issues/1631 + // https://stackoverflow.com/questions/11353075/how-can-i-maintain-fragment-state-when-added-to-the-back-stack/19022550#19022550 supportFragmentManager.executePendingTransactions(); + } + mediaDetails.showImage(i); + forceInitBackButton(); + } + + /** + * This method inflates the menu in the toolbar + */ + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_search, menu); + return super.onCreateOptionsMenu(menu); + } + + /** + * This method handles the logic on ItemSelect in toolbar menu + * Currently only 1 choice is available to open search page of the app + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + // Handle item selection + switch (item.getItemId()) { + case R.id.action_search: + NavigationBaseActivity.startActivityWithFlags(this, SearchActivity.class); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + +} + 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 9b5db358f..99ad96abe 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 @@ -39,7 +39,7 @@ import fr.free.nrw.commons.category.CategoryImagesActivity; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.explore.SearchActivity; -import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.explore.categories.ExploreActivity; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.mwapi.MediaWikiApi; import fr.free.nrw.commons.utils.ImageUtils; @@ -347,6 +347,11 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple }catch (Exception e){ e.printStackTrace(); } + try{ + ((ExploreActivity) getContext()).requestMoreImages(); + }catch (Exception e){ + e.printStackTrace(); + } } getActivity().invalidateOptionsMenu(); } diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java index 705330bea..923115475 100644 --- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java @@ -35,8 +35,8 @@ import fr.free.nrw.commons.WelcomeActivity; import fr.free.nrw.commons.achievements.AchievementsActivity; import fr.free.nrw.commons.auth.LoginActivity; import fr.free.nrw.commons.bookmarks.BookmarksActivity; -import fr.free.nrw.commons.category.CategoryImagesActivity; import fr.free.nrw.commons.contributions.MainActivity; +import fr.free.nrw.commons.explore.categories.ExploreActivity; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.logging.CommonsLogSender; import fr.free.nrw.commons.settings.SettingsActivity; @@ -45,7 +45,6 @@ import timber.log.Timber; public abstract class NavigationBaseActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener { - private static final String FEATURED_IMAGES_CATEGORY = "Category:Featured_pictures_on_Wikimedia_Commons"; private boolean isRestoredToTop; @BindView(R.id.toolbar) @@ -222,7 +221,7 @@ public abstract class NavigationBaseActivity extends BaseActivity return true; case R.id.action_explore: drawerLayout.closeDrawer(navigationView); - CategoryImagesActivity.startYourself(this, getString(R.string.title_activity_explore), FEATURED_IMAGES_CATEGORY); + ExploreActivity.startYourself(this); return true; case R.id.action_bookmarks: drawerLayout.closeDrawer(navigationView); diff --git a/app/src/main/res/layout/activity_category_details.xml b/app/src/main/res/layout/activity_category_details.xml index 7005470f8..9fdaef47b 100644 --- a/app/src/main/res/layout/activity_category_details.xml +++ b/app/src/main/res/layout/activity_category_details.xml @@ -12,8 +12,9 @@ + android:layout_height="wrap_content" + android:background="@color/primaryDarkColor"> + + app:tabSelectedTextColor="?attr/tabSelectedTextColor" + app:tabTextColor="?attr/tabTextColor" /> - + android:orientation="horizontal" + android:visibility="gone" /> + android:layout_below="@id/toolbar_layout" /> + app:menu="@menu/drawer" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_explore.xml b/app/src/main/res/layout/activity_explore.xml new file mode 100644 index 000000000..3955caa36 --- /dev/null +++ b/app/src/main/res/layout/activity_explore.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f8c00b9de..caa3493db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -317,6 +317,8 @@ Error occurred while loading subcategories. MEDIA CATEGORIES + FEATURED + UPLOADED VIA MOBILE Image successfully added to %1$s on Wikidata! Failed to update corresponding Wikidata entity!