From 1d1210e863af7cc38473c9d8f2cf5a2a9343bb7a Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Fri, 11 Jul 2025 14:49:10 -0500 Subject: [PATCH] Convert the MediaDetailAdapter to kotlin --- .../nrw/commons/media/MediaDetailAdapter.java | 95 ------------------- .../nrw/commons/media/MediaDetailAdapter.kt | 76 +++++++++++++++ 2 files changed, 76 insertions(+), 95 deletions(-) delete mode 100644 app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.java create mode 100644 app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.kt diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.java deleted file mode 100644 index 106bfb4cb..000000000 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.java +++ /dev/null @@ -1,95 +0,0 @@ -package fr.free.nrw.commons.media; - -import android.view.ViewGroup; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import timber.log.Timber; - -//FragmentStatePagerAdapter allows user to swipe across collection of images (no. of images undetermined) -class MediaDetailAdapter extends FragmentStatePagerAdapter { - - final MediaDetailPagerFragment mediaDetailPagerFragment; - /** - * Keeps track of the current displayed fragment. - */ - private Fragment mCurrentFragment; - - public MediaDetailAdapter(MediaDetailPagerFragment mediaDetailPagerFragment, - FragmentManager fm) { - super(fm); - this.mediaDetailPagerFragment = mediaDetailPagerFragment; - } - - @Override - public Fragment getItem(int i) { - if (i == 0) { - // See bug https://code.google.com/p/android/issues/detail?id=27526 - if (mediaDetailPagerFragment.getActivity() == null) { - Timber.d("Skipping getItem. Returning as activity is destroyed!"); - return null; - } - mediaDetailPagerFragment.binding.mediaDetailsPager.postDelayed( - () -> mediaDetailPagerFragment.getActivity().invalidateOptionsMenu(), 5); - } - if (mediaDetailPagerFragment.isFromFeaturedRootFragment) { - return MediaDetailFragment.forMedia(mediaDetailPagerFragment.position + i, - mediaDetailPagerFragment.editable, mediaDetailPagerFragment.isFeaturedImage, - mediaDetailPagerFragment.isWikipediaButtonDisplayed); - } else { - return MediaDetailFragment.forMedia(i, mediaDetailPagerFragment.editable, - mediaDetailPagerFragment.isFeaturedImage, - mediaDetailPagerFragment.isWikipediaButtonDisplayed); - } - } - - @Override - public int getCount() { - if (mediaDetailPagerFragment.getActivity() == null) { - Timber.d("Skipping getCount. Returning as activity is destroyed!"); - return 0; - } - return mediaDetailPagerFragment.provider.getTotalMediaCount(); - } - - /** - * Get the currently displayed fragment. - * - * @return - */ - public Fragment getCurrentFragment() { - return mCurrentFragment; - } - - /** - * If current fragment is of type MediaDetailFragment, return it, otherwise return null. - * - * @return MediaDetailFragment - */ - public MediaDetailFragment getCurrentMediaDetailFragment() { - if (mCurrentFragment instanceof MediaDetailFragment) { - return (MediaDetailFragment) mCurrentFragment; - } - - return null; - } - - /** - * Called to inform the adapter of which item is currently considered to be the "primary", that - * is the one show to the user as the current page. - * - * @param container - * @param position - * @param object - */ - @Override - public void setPrimaryItem(@NonNull final ViewGroup container, final int position, - @NonNull final Object object) { - // Update the current fragment if changed - if (getCurrentFragment() != object) { - mCurrentFragment = ((Fragment) object); - } - super.setPrimaryItem(container, position, object); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.kt b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.kt new file mode 100644 index 000000000..7aec02d47 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailAdapter.kt @@ -0,0 +1,76 @@ +package fr.free.nrw.commons.media + +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter +import fr.free.nrw.commons.media.MediaDetailFragment.Companion.forMedia +import timber.log.Timber + +// FragmentStatePagerAdapter allows user to swipe across collection of images (no. of images undetermined) +internal class MediaDetailAdapter( + val mediaDetailPagerFragment: MediaDetailPagerFragment, + fm: FragmentManager +) : FragmentStatePagerAdapter(fm) { + /** + * Keeps track of the current displayed fragment. + */ + private var currentFragment: Fragment? = null + + override fun getItem(i: Int): Fragment { + if (i == 0) { + // See bug https://code.google.com/p/android/issues/detail?id=27526 + if (mediaDetailPagerFragment.activity == null) { + Timber.d("Skipping getItem. Returning as activity is destroyed!") + return Fragment() + } + mediaDetailPagerFragment.binding.mediaDetailsPager.postDelayed( + { mediaDetailPagerFragment.requireActivity().invalidateOptionsMenu() }, 5 + ) + } + return if (mediaDetailPagerFragment.isFromFeaturedRootFragment) { + forMedia( + mediaDetailPagerFragment.position + i, + mediaDetailPagerFragment.editable, mediaDetailPagerFragment.isFeaturedImage, + mediaDetailPagerFragment.isWikipediaButtonDisplayed + ) + } else { + forMedia( + i, mediaDetailPagerFragment.editable, + mediaDetailPagerFragment.isFeaturedImage, + mediaDetailPagerFragment.isWikipediaButtonDisplayed + ) + } + } + + override fun getCount(): Int { + if (mediaDetailPagerFragment.activity == null) { + Timber.d("Skipping getCount. Returning as activity is destroyed!") + return 0 + } + return mediaDetailPagerFragment.provider.getTotalMediaCount() + } + + /** + * If current fragment is of type MediaDetailFragment, return it, otherwise return null. + * + * @return MediaDetailFragment + */ + val currentMediaDetailFragment: MediaDetailFragment? + get() = currentFragment as? MediaDetailFragment + + /** + * Called to inform the adapter of which item is currently considered to be the "primary", that + * is the one show to the user as the current page. + */ + override fun setPrimaryItem( + container: ViewGroup, position: Int, + obj: Any + ) { + // Update the current fragment if changed + if (currentFragment !== obj) { + currentFragment = (obj as Fragment) + } + super.setPrimaryItem(container, position, obj) + } +}