From f71418a4f66b931d2a30e437f71d499d5c11e7d8 Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Sat, 12 Jul 2025 14:42:43 -0500 Subject: [PATCH] Convert ExploreListRootFragment to kotlin --- .../explore/ExploreListRootFragment.java | 215 ------------------ .../explore/ExploreListRootFragment.kt | 182 +++++++++++++++ 2 files changed, 182 insertions(+), 215 deletions(-) delete mode 100644 app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.java create mode 100644 app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.kt diff --git a/app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.java deleted file mode 100644 index e3ad90119..000000000 --- a/app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.java +++ /dev/null @@ -1,215 +0,0 @@ -package fr.free.nrw.commons.explore; - -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import fr.free.nrw.commons.Media; -import fr.free.nrw.commons.R; -import fr.free.nrw.commons.category.CategoryImagesCallback; -import fr.free.nrw.commons.contributions.MainActivity; -import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding; -import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; -import fr.free.nrw.commons.explore.categories.media.CategoriesMediaFragment; -import fr.free.nrw.commons.media.MediaDetailPagerFragment; -import fr.free.nrw.commons.media.MediaDetailProvider; -import fr.free.nrw.commons.navtab.NavTab; - -public class ExploreListRootFragment extends CommonsDaggerSupportFragment implements - MediaDetailProvider, CategoryImagesCallback { - - private MediaDetailPagerFragment mediaDetails; - private CategoriesMediaFragment listFragment; - - private FragmentFeaturedRootBinding binding; - - public ExploreListRootFragment() { - //empty constructor necessary otherwise crashes on recreate - } - - public ExploreListRootFragment(Bundle bundle) { - String title = bundle.getString("categoryName"); - listFragment = new CategoriesMediaFragment(); - Bundle featuredArguments = new Bundle(); - featuredArguments.putString("categoryName", title); - listFragment.setArguments(featuredArguments); - } - - @Nullable - @Override - public View onCreateView(@NonNull final LayoutInflater inflater, - @Nullable final ViewGroup container, - @Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - binding = FragmentFeaturedRootBinding.inflate(inflater, container, false); - return binding.getRoot(); - } - - @Override - public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - if (savedInstanceState == null) { - setFragment(listFragment, mediaDetails); - } - } - - public void setFragment(Fragment fragment, Fragment otherFragment) { - if (fragment.isAdded() && otherFragment != null) { - getChildFragmentManager() - .beginTransaction() - .hide(otherFragment) - .show(fragment) - .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") - .commit(); - getChildFragmentManager().executePendingTransactions(); - } else if (fragment.isAdded() && otherFragment == null) { - getChildFragmentManager() - .beginTransaction() - .show(fragment) - .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") - .commit(); - getChildFragmentManager().executePendingTransactions(); - } else if (!fragment.isAdded() && otherFragment != null) { - getChildFragmentManager() - .beginTransaction() - .hide(otherFragment) - .add(R.id.explore_container, fragment) - .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") - .commit(); - getChildFragmentManager().executePendingTransactions(); - } else if (!fragment.isAdded()) { - getChildFragmentManager() - .beginTransaction() - .replace(R.id.explore_container, fragment) - .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") - .commit(); - getChildFragmentManager().executePendingTransactions(); - } - } - - public void removeFragment(Fragment fragment) { - getChildFragmentManager() - .beginTransaction() - .remove(fragment) - .commit(); - getChildFragmentManager().executePendingTransactions(); - } - - @Override - public void onAttach(final Context context) { - super.onAttach(context); - } - - @Override - public void onMediaClicked(int position) { - if (binding!=null) { - binding.exploreContainer.setVisibility(View.VISIBLE); - } - if (((ExploreFragment) getParentFragment()).binding!=null) { - ((ExploreFragment) getParentFragment()).binding.tabLayout.setVisibility(View.GONE); - } - mediaDetails = MediaDetailPagerFragment.newInstance(false, true); - ((ExploreFragment) getParentFragment()).setScroll(false); - setFragment(mediaDetails, listFragment); - mediaDetails.showImage(position); - } - - /** - * 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 (listFragment != null) { - return listFragment.getMediaAtPosition(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 (listFragment != null) { - return listFragment.getTotalMediaCount(); - } else { - return 0; - } - } - - @Override - public Integer getContributionStateAt(int position) { - return null; - } - - /** - * Reload media detail fragment once media is nominated - * - * @param index item position that has been nominated - */ - @Override - public void refreshNominatedMedia(int index) { - if (mediaDetails != null && !listFragment.isVisible()) { - removeFragment(mediaDetails); - onMediaClicked(index); - } - } - - /** - * 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. - */ - @Override - public void viewPagerNotifyDataSetChanged() { - if (mediaDetails != null) { - mediaDetails.notifyDataSetChanged(); - } - } - - /** - * Performs back pressed action on the fragment. Return true if the event was handled by the - * mediaDetails otherwise returns false. - * - * @return - */ - public boolean backPressed() { - if (null != mediaDetails && mediaDetails.isVisible()) { - if (((ExploreFragment) getParentFragment()).binding != null) { - ((ExploreFragment) getParentFragment()).binding.tabLayout.setVisibility(View.VISIBLE); - } - removeFragment(mediaDetails); - ((ExploreFragment) getParentFragment()).setScroll(true); - setFragment(listFragment, mediaDetails); - ((MainActivity) getActivity()).showTabs(); - return true; - } else { - if (((MainActivity) getActivity()) != null) { - ((MainActivity) getActivity()).setSelectedItemId(NavTab.CONTRIBUTIONS.code()); - } - } - if (((MainActivity) getActivity()) != null) { - ((MainActivity) getActivity()).showTabs(); - } - return false; - } - - @Override - public void onDestroy() { - super.onDestroy(); - - binding = null; - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.kt b/app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.kt new file mode 100644 index 000000000..1f0087ada --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/explore/ExploreListRootFragment.kt @@ -0,0 +1,182 @@ +package fr.free.nrw.commons.explore + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import fr.free.nrw.commons.Media +import fr.free.nrw.commons.R +import fr.free.nrw.commons.category.CategoryImagesCallback +import fr.free.nrw.commons.contributions.MainActivity +import fr.free.nrw.commons.databinding.FragmentFeaturedRootBinding +import fr.free.nrw.commons.di.CommonsDaggerSupportFragment +import fr.free.nrw.commons.explore.categories.media.CategoriesMediaFragment +import fr.free.nrw.commons.media.MediaDetailPagerFragment +import fr.free.nrw.commons.media.MediaDetailPagerFragment.MediaDetailProvider +import fr.free.nrw.commons.navtab.NavTab + +class ExploreListRootFragment : CommonsDaggerSupportFragment, MediaDetailProvider, + CategoryImagesCallback { + private var mediaDetails: MediaDetailPagerFragment? = null + private var listFragment: CategoriesMediaFragment? = null + private var binding: FragmentFeaturedRootBinding? = null + + constructor() + + constructor(bundle: Bundle) { + listFragment = CategoriesMediaFragment().apply { + arguments = bundleOf( + "categoryName" to bundle.getString("categoryName") + ) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + super.onCreate(savedInstanceState) + + binding = FragmentFeaturedRootBinding.inflate(inflater, container, false) + return binding!!.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + if (savedInstanceState == null) { + setFragment(listFragment!!, mediaDetails) + } + } + + fun setFragment(fragment: Fragment, otherFragment: Fragment?) { + if (fragment.isAdded && otherFragment != null) { + childFragmentManager + .beginTransaction() + .hide(otherFragment) + .show(fragment) + .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") + .commit() + childFragmentManager.executePendingTransactions() + } else if (fragment.isAdded && otherFragment == null) { + childFragmentManager + .beginTransaction() + .show(fragment) + .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") + .commit() + childFragmentManager.executePendingTransactions() + } else if (!fragment.isAdded && otherFragment != null) { + childFragmentManager + .beginTransaction() + .hide(otherFragment) + .add(R.id.explore_container, fragment) + .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") + .commit() + childFragmentManager.executePendingTransactions() + } else if (!fragment.isAdded) { + childFragmentManager + .beginTransaction() + .replace(R.id.explore_container, fragment) + .addToBackStack("CONTRIBUTION_LIST_FRAGMENT_TAG") + .commit() + childFragmentManager.executePendingTransactions() + } + } + + private fun removeFragment(fragment: Fragment) { + childFragmentManager + .beginTransaction() + .remove(fragment) + .commit() + childFragmentManager.executePendingTransactions() + } + + override fun onMediaClicked(position: Int) { + if (binding != null) { + binding!!.exploreContainer.visibility = View.VISIBLE + } + if ((parentFragment as ExploreFragment).binding != null) { + (parentFragment as ExploreFragment).binding.tabLayout.visibility = + View.GONE + } + mediaDetails = MediaDetailPagerFragment.newInstance(false, true) + (parentFragment as ExploreFragment).setScroll(false) + setFragment(mediaDetails!!, listFragment) + mediaDetails!!.showImage(position) + } + + /** + * 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 fun getMediaAtPosition(i: Int): Media? = listFragment?.getMediaAtPosition(i) + + /** + * 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 fun getTotalMediaCount(): Int = listFragment?.totalMediaCount ?: 0 + + override fun getContributionStateAt(position: Int): Int? = null + + /** + * Reload media detail fragment once media is nominated + * + * @param index item position that has been nominated + */ + override fun refreshNominatedMedia(index: Int) { + if (mediaDetails != null && !listFragment!!.isVisible) { + removeFragment(mediaDetails!!) + onMediaClicked(index) + } + } + + /** + * 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. + */ + override fun viewPagerNotifyDataSetChanged() { + mediaDetails?.notifyDataSetChanged() + } + + /** + * Performs back pressed action on the fragment. Return true if the event was handled by the + * mediaDetails otherwise returns false. + * + * @return + */ + fun backPressed(): Boolean { + if (null != mediaDetails && mediaDetails!!.isVisible) { + if ((parentFragment as ExploreFragment).binding != null) { + (parentFragment as ExploreFragment).binding.tabLayout.visibility = + View.VISIBLE + } + removeFragment(mediaDetails!!) + (parentFragment as ExploreFragment).setScroll(true) + setFragment(listFragment!!, mediaDetails) + (activity as MainActivity).showTabs() + return true + } else { + if ((activity as MainActivity?) != null) { + (activity as MainActivity).setSelectedItemId(NavTab.CONTRIBUTIONS.code()) + } + } + if ((activity as MainActivity?) != null) { + (activity as MainActivity).showTabs() + } + return false + } + + override fun onDestroy() { + super.onDestroy() + + binding = null + } +}