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!