From 7da4bb6dad24f2ae538cdf449bb7cf8a016c81cc Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Mon, 9 Dec 2024 12:11:02 -0600 Subject: [PATCH] Code cleanup and convert CategoriesContract to kotlin --- .../upload/categories/CategoriesContract.java | 97 ------------------- .../upload/categories/CategoriesContract.kt | 88 +++++++++++++++++ .../upload/categories/CategoriesPresenter.kt | 9 +- .../categories/UploadCategoriesFragment.java | 27 +++--- .../UploadCategoriesFragmentUnitTests.kt | 5 +- 5 files changed, 108 insertions(+), 118 deletions(-) delete mode 100644 app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.java create mode 100644 app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.kt diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.java b/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.java deleted file mode 100644 index dc53e1a93..000000000 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.java +++ /dev/null @@ -1,97 +0,0 @@ -package fr.free.nrw.commons.upload.categories; - -import android.content.Context; -import androidx.annotation.NonNull; -import androidx.lifecycle.LiveData; -import fr.free.nrw.commons.BasePresenter; -import fr.free.nrw.commons.Media; -import fr.free.nrw.commons.category.CategoryItem; -import java.util.List; - -/** - * The contract with with UploadCategoriesFragment and its presenter would talk to each other - */ -public interface CategoriesContract { - - interface View { - - void showProgress(boolean shouldShow); - - void showError(String error); - - void showError(int stringResourceId); - - void setCategories(List categories); - - void goToNextScreen(); - - void showNoCategorySelected(); - - /** - * Gets existing category names from media - */ - List getExistingCategories(); - - /** - * Returns required context - */ - Context getFragmentContext(); - - /** - * Returns to previous fragment - */ - void goBackToPreviousScreen(); - - /** - * Shows the progress dialog - */ - void showProgressDialog(); - - /** - * Hides the progress dialog - */ - void dismissProgressDialog(); - - /** - * Refreshes the categories - */ - void refreshCategories(); - - - /** - * Navigate the user to Login Activity - */ - void navigateToLoginScreen(); - } - - interface UserActionListener extends BasePresenter { - - void searchForCategories(String query); - - void verifyCategories(); - - void onCategoryItemClicked(CategoryItem categoryItem); - - /** - * Attaches view and media - */ - void onAttachViewWithMedia(@NonNull CategoriesContract.View view, Media media); - - /** - * Clears previous selections - */ - void clearPreviousSelection(); - - /** - * Update the categories - */ - void updateCategories(Media media, String wikiText); - - LiveData> getCategories(); - - void selectCategories(); - - } - - -} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.kt new file mode 100644 index 000000000..183c7cd93 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesContract.kt @@ -0,0 +1,88 @@ +package fr.free.nrw.commons.upload.categories + +import android.content.Context +import androidx.lifecycle.LiveData +import fr.free.nrw.commons.BasePresenter +import fr.free.nrw.commons.Media +import fr.free.nrw.commons.category.CategoryItem + +/** + * The contract with with UploadCategoriesFragment and its presenter would talk to each other + */ +interface CategoriesContract { + interface View { + fun showProgress(shouldShow: Boolean) + + fun showError(error: String?) + + fun showError(stringResourceId: Int) + + fun setCategories(categories: List?) + + fun goToNextScreen() + + fun showNoCategorySelected() + + /** + * Gets existing category names from media + */ + fun getExistingCategories(): List? + + /** + * Returns required context + */ + fun getFragmentContext(): Context + + /** + * Returns to previous fragment + */ + fun goBackToPreviousScreen() + + /** + * Shows the progress dialog + */ + fun showProgressDialog() + + /** + * Hides the progress dialog + */ + fun dismissProgressDialog() + + /** + * Refreshes the categories + */ + fun refreshCategories() + + /** + * Navigate the user to Login Activity + */ + fun navigateToLoginScreen() + } + + interface UserActionListener : BasePresenter { + fun searchForCategories(query: String) + + fun verifyCategories() + + fun onCategoryItemClicked(categoryItem: CategoryItem) + + /** + * Attaches view and media + */ + fun onAttachViewWithMedia(view: View, media: Media) + + /** + * Clears previous selections + */ + fun clearPreviousSelection() + + /** + * Update the categories + */ + fun updateCategories(media: Media, wikiText: String) + + fun getCategories(): LiveData> + + fun selectCategories() + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesPresenter.kt index 210754bf4..dbeeae6ff 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/CategoriesPresenter.kt @@ -8,7 +8,6 @@ import fr.free.nrw.commons.R import fr.free.nrw.commons.auth.csrf.InvalidLoginTokenException import fr.free.nrw.commons.category.CategoryEditHelper import fr.free.nrw.commons.category.CategoryItem -import fr.free.nrw.commons.di.CommonsApplicationModule import fr.free.nrw.commons.di.CommonsApplicationModule.Companion.IO_THREAD import fr.free.nrw.commons.di.CommonsApplicationModule.Companion.MAIN_THREAD import fr.free.nrw.commons.repository.UploadRepository @@ -175,7 +174,7 @@ class CategoriesPresenter ) { this.view = view this.media = media - repository.setSelectedExistingCategories(view.existingCategories) + repository.setSelectedExistingCategories(view.getExistingCategories() ?: emptyList()) compositeDisposable.add( searchTerms .observeOn(mainThreadScheduler) @@ -224,11 +223,11 @@ class CategoriesPresenter repository.getSelectedCategories().isNotEmpty() || ( - view.existingCategories != null + view.getExistingCategories() != null && repository.getSelectedExistingCategories().size != - view.existingCategories.size + view.getExistingCategories()?.size ) ) { val selectedCategories: MutableList = @@ -244,7 +243,7 @@ class CategoriesPresenter compositeDisposable.add( categoryEditHelper .makeCategoryEdit( - view.fragmentContext, + view.getFragmentContext(), media, selectedCategories, wikiText, diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.java index fbc6bc7c5..bd25ec151 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoriesFragment.java @@ -65,14 +65,14 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate @Nullable @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, + @Nullable final Bundle savedInstanceState) { binding = UploadCategoriesFragmentBinding.inflate(inflater, container, false); return binding.getRoot(); } @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); final Bundle bundle = getArguments(); if (bundle != null) { @@ -104,8 +104,8 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate setTvSubTitle(); binding.tooltip.setOnClickListener(new OnClickListener() { @Override - public void onClick(View v) { - DialogUtil.showAlertDialog(getActivity(), getString(R.string.categories_activity_title), getString(R.string.categories_tooltip), getString(android.R.string.ok), null); + public void onClick(final View v) { + DialogUtil.showAlertDialog(requireActivity(), getString(R.string.categories_activity_title), getString(R.string.categories_tooltip), getString(android.R.string.ok), null, true); } }); if (media == null) { @@ -146,7 +146,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate } } - private void searchForCategory(String query) { + private void searchForCategory(final String query) { presenter.searchForCategories(query); } @@ -170,28 +170,28 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate } @Override - public void showProgress(boolean shouldShow) { + public void showProgress(final boolean shouldShow) { if (binding != null) { binding.pbCategories.setVisibility(shouldShow ? View.VISIBLE : View.GONE); } } @Override - public void showError(String error) { + public void showError(final String error) { if (binding != null) { binding.tilContainerSearch.setError(error); } } @Override - public void showError(int stringResourceId) { + public void showError(final int stringResourceId) { if (binding != null) { binding.tilContainerSearch.setError(getString(stringResourceId)); } } @Override - public void setCategories(List categories) { + public void setCategories(final List categories) { if (categories == null) { adapter.clear(); } else { @@ -229,12 +229,12 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate @Override public void showNoCategorySelected() { if (media == null) { - DialogUtil.showAlertDialog(getActivity(), + DialogUtil.showAlertDialog(requireActivity(), getString(R.string.no_categories_selected), getString(R.string.no_categories_selected_warning_desc), getString(R.string.continue_message), getString(R.string.cancel), - () -> goToNextScreen(), + this::goToNextScreen, null); } else { Toast.makeText(requireContext(), getString(R.string.no_categories_selected), @@ -256,6 +256,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate /** * Returns required context */ + @NonNull @Override public Context getFragmentContext() { return requireContext(); @@ -306,7 +307,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate public void navigateToLoginScreen() { final String username = sessionManager.getUserName(); final CommonsApplication.BaseLogoutListener logoutListener = new CommonsApplication.BaseLogoutListener( - getActivity(), + requireActivity(), requireActivity().getString(R.string.invalid_login_message), username ); diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt index ee2d54ee7..f2d54132c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/categories/UploadCategoriesFragmentUnitTests.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction import androidx.test.core.app.ApplicationProvider -import com.nhaarman.mockitokotlin2.times import fr.free.nrw.commons.Media import fr.free.nrw.commons.OkHttpConnectionFactory import fr.free.nrw.commons.R @@ -184,14 +183,14 @@ class UploadCategoriesFragmentUnitTests { @Throws(Exception::class) fun testGetExistingCategories() { Shadows.shadowOf(Looper.getMainLooper()).idle() - fragment.existingCategories + fragment.getExistingCategories() } @Test @Throws(Exception::class) fun testGetFragmentContext() { Shadows.shadowOf(Looper.getMainLooper()).idle() - fragment.fragmentContext + fragment.getFragmentContext() } @Test