From 373c6201bd0f0c8d813b7ddd90dafeed8609225b Mon Sep 17 00:00:00 2001 From: Aryan Arora Date: Tue, 3 Oct 2023 19:47:29 +0530 Subject: [PATCH 001/720] Show progress dialog on mark/unmark photos not for upload (#5322) --- .../ui/selector/CustomSelectorActivity.kt | 18 ++++- .../ui/selector/ImageFragment.kt | 77 ++++++++++++++----- app/src/main/res/layout/progress_dialog.xml | 12 +-- app/src/main/res/values/strings.xml | 2 + 4 files changed, 83 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt index 0bd7bbf7b..8fd5ff746 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt @@ -95,6 +95,8 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL */ var imageFragment: ImageFragment? = null + private var progressDialogText:String="" + /** * onCreate Activity, sets theme, initialises the view model, setup view. */ @@ -221,6 +223,10 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL */ private fun insertIntoNotForUpload(images: ArrayList) { scope.launch { + imageFragment!!.showMarkUnmarkProgressDialog( + text= progressDialogText + ) + var allImagesAlreadyNotForUpload = true images.forEach { val imageSHA1 = CustomSelectorUtils.getImageSHA1( @@ -269,6 +275,8 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL } imageFragment!!.refresh() + imageFragment!!.dismissMarkUnmarkProgressDialog() + val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout) bottomLayout.visibility = View.GONE } @@ -334,8 +342,14 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL bottomSheetBinding.notForUpload.text = when (selectedImages.size == selectedNotForUploadImages) { - true -> getString(R.string.unmark_as_not_for_upload) - else -> getString(R.string.mark_as_not_for_upload) + true -> { + progressDialogText=getString(R.string.unmarking_as_not_for_upload) + getString(R.string.unmark_as_not_for_upload) + } + else -> { + progressDialogText=getString(R.string.marking_as_not_for_upload) + getString(R.string.mark_as_not_for_upload) + } } val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt index f2500b5d3..c919e50a4 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/ImageFragment.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ProgressBar import android.widget.Switch +import androidx.appcompat.app.AlertDialog import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider @@ -17,16 +18,17 @@ import androidx.recyclerview.widget.RecyclerView import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao import fr.free.nrw.commons.customselector.database.UploadedStatusDao import fr.free.nrw.commons.customselector.helper.ImageHelper -import fr.free.nrw.commons.customselector.listeners.PassDataListener import fr.free.nrw.commons.customselector.helper.ImageHelper.CUSTOM_SELECTOR_PREFERENCE_KEY import fr.free.nrw.commons.customselector.helper.ImageHelper.SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY import fr.free.nrw.commons.customselector.listeners.ImageSelectListener +import fr.free.nrw.commons.customselector.listeners.PassDataListener import fr.free.nrw.commons.customselector.listeners.RefreshUIListener import fr.free.nrw.commons.customselector.model.CallbackStatus import fr.free.nrw.commons.customselector.model.Image import fr.free.nrw.commons.customselector.model.Result import fr.free.nrw.commons.customselector.ui.adapter.ImageAdapter import fr.free.nrw.commons.databinding.FragmentCustomSelectorBinding +import fr.free.nrw.commons.databinding.ProgressDialogBinding import fr.free.nrw.commons.di.CommonsDaggerSupportFragment import fr.free.nrw.commons.media.MediaClient import fr.free.nrw.commons.theme.BaseActivity @@ -34,12 +36,11 @@ import fr.free.nrw.commons.upload.FileProcessor import fr.free.nrw.commons.upload.FileUtilsWrapper import java.util.* import javax.inject.Inject -import kotlin.collections.ArrayList /** * Custom Selector Image Fragment. */ -class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassDataListener { +class ImageFragment : CommonsDaggerSupportFragment(), RefreshUIListener, PassDataListener { private var _binding: FragmentCustomSelectorBinding? = null private val binding get() = _binding @@ -57,7 +58,7 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData /** * View model for images. */ - private var viewModel: CustomSelectorViewModel? = null + private var viewModel: CustomSelectorViewModel? = null /** * View Elements. @@ -99,6 +100,10 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData */ private var progressLayout: ConstraintLayout? = null + private lateinit var progressDialog: AlertDialog + private lateinit var progressDialogLayout: ProgressDialogBinding + + /** * NotForUploadStatus Dao class for database operations */ @@ -163,7 +168,9 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData super.onCreate(savedInstanceState) bucketId = arguments?.getLong(BUCKET_ID) lastItemId = arguments?.getLong(LAST_ITEM_ID, 0) - viewModel = ViewModelProvider(requireActivity(),customSelectorViewModelFactory).get(CustomSelectorViewModel::class.java) + viewModel = ViewModelProvider(requireActivity(), customSelectorViewModelFactory).get( + CustomSelectorViewModel::class.java + ) } /** @@ -171,17 +178,22 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData * Init imageAdapter, gridLayoutManger. * SetUp recycler view. */ - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { _binding = FragmentCustomSelectorBinding.inflate(inflater, container, false) - imageAdapter = ImageAdapter(requireActivity(), activity as ImageSelectListener, imageLoader!!) - gridLayoutManager = GridLayoutManager(context,getSpanCount()) - with(binding?.selectorRv){ + imageAdapter = + ImageAdapter(requireActivity(), activity as ImageSelectListener, imageLoader!!) + gridLayoutManager = GridLayoutManager(context, getSpanCount()) + with(binding?.selectorRv) { this?.layoutManager = gridLayoutManager this?.setHasFixedSize(true) this?.adapter = imageAdapter } - viewModel?.result?.observe(viewLifecycleOwner, Observer{ + viewModel?.result?.observe(viewLifecycleOwner, Observer { handleResult(it) }) @@ -194,9 +206,16 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData val sharedPreferences: SharedPreferences = requireContext().getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, MODE_PRIVATE) - showAlreadyActionedImages = sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) + showAlreadyActionedImages = + sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) switch?.isChecked = showAlreadyActionedImages + val builder = AlertDialog.Builder(requireActivity()) + builder.setCancelable(false) + progressDialogLayout = ProgressDialogBinding.inflate(layoutInflater, container, false) + builder.setView(progressDialogLayout.root) + progressDialog = builder.create() + return binding?.root } @@ -236,10 +255,10 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData /** * Handle view model result. */ - private fun handleResult(result:Result){ - if(result.status is CallbackStatus.SUCCESS){ + private fun handleResult(result: Result) { + if (result.status is CallbackStatus.SUCCESS) { val images = result.images - if(images.isNotEmpty()) { + if (images.isNotEmpty()) { filteredImages = ImageHelper.filterImages(images, bucketId) allImages = ArrayList(filteredImages) imageAdapter.init(filteredImages, allImages, TreeMap()) @@ -250,18 +269,18 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData .scrollToPosition(ImageHelper.getIndexFromId(filteredImages, pos)) } } - } - else{ + } else { binding?.emptyText?.let { it.visibility = View.VISIBLE } - selectorRV?.let{ + selectorRV?.let { it.visibility = View.GONE } } } loader?.let { - it.visibility = if (result.status is CallbackStatus.FETCHING) View.VISIBLE else View.GONE + it.visibility = + if (result.status is CallbackStatus.FETCHING) View.VISIBLE else View.GONE } } @@ -324,7 +343,7 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData * Passes selected images and other information from Activity to Fragment and connects it with * the adapter */ - override fun passSelectedImages(selectedImages: ArrayList, shouldRefresh: Boolean){ + override fun passSelectedImages(selectedImages: ArrayList, shouldRefresh: Boolean) { imageAdapter.setSelectedImages(selectedImages) if (!showAlreadyActionedImages && shouldRefresh) { @@ -332,4 +351,24 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData imageAdapter.setSelectedImages(selectedImages) } } + + /** + * Shows mark/unmark progress dialog + */ + fun showMarkUnmarkProgressDialog(text: String) { + if (!progressDialog.isShowing) { + progressDialogLayout.progressDialogText.text = text + progressDialog.show() + } + } + + /** + * Dismisses mark/unmark progress dialog + */ + fun dismissMarkUnmarkProgressDialog() { + if (progressDialog.isShowing) { + progressDialog.dismiss() + } + } + } \ No newline at end of file diff --git a/app/src/main/res/layout/progress_dialog.xml b/app/src/main/res/layout/progress_dialog.xml index dba9c62ff..1b4be14c8 100644 --- a/app/src/main/res/layout/progress_dialog.xml +++ b/app/src/main/res/layout/progress_dialog.xml @@ -1,11 +1,12 @@ + android:orientation="horizontal" + android:paddingVertical="20dp"> \ 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 9432c788c..160df3463 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -756,6 +756,8 @@ Upload your first media by tapping on the add button. Your feedback Mark as not for upload Unmark as not for upload + Marking as not for upload + Unmarking as not for upload Show already actioned pictures Hiding already actioned pictures No more images found From fd6ba00fbd941846ff2ff78e668f63eba3085ffd Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 5 Oct 2023 13:03:16 +0200 Subject: [PATCH 002/720] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-ce/error.xml | 3 +++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-hu/strings.xml | 2 ++ app/src/main/res/values-iw/strings.xml | 2 ++ app/src/main/res/values-mk/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 11 +++++++++++ app/src/main/res/values-sl/strings.xml | 2 ++ app/src/main/res/values-uk/strings.xml | 6 +++--- app/src/main/res/values-zh/strings.xml | 12 ++++++++++-- 9 files changed, 37 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-ce/error.xml b/app/src/main/res/values-ce/error.xml index 75b00cf2f..5830a42b2 100644 --- a/app/src/main/res/values-ce/error.xml +++ b/app/src/main/res/values-ce/error.xml @@ -3,5 +3,8 @@ * Умар --> + Викилармин гӀалат + Упс. Цхьа хӀума нийса дац! + Дийца ахьа хӀу динера, электронан поштехула тхоьга йазде. Цуьнах проблема нисйан гӀо хира ду! Баркалла! diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cb8201238..ebb6fd352 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -742,6 +742,8 @@ Votre avis Marquer comme à ne pas téléverser Démarquer comme à ne pas téléverser + Marquer comme non destiné au téléchargement + Ne plus marquer comme non destiné au téléchargement Afficher les images déjà actionnées Masquer les images déjà actionnées Aucune autre image trouvée diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 28dfe9e5b..ebf361ca0 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -484,6 +484,8 @@ Korlátozott kapcsolat-mód kikapcsolva. Függőben lévő feltöltések folytatása. Korlátozott kapcsolat mód Itt ellenőrizheted a már Commonsba feltöltött képeket. + Megjelölés, mint nem feltöltendő + Nem feltöltendő megjelölés visszavonása Jelentés Szabálysértés jelentése Felhasználó jelentése diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 74b43eaa4..660972c3d 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -744,6 +744,8 @@ המשוב שלך לסמן בתור \"לא להעלאה\" לבטל את הסימון בתור \"לא להעלאה\" + מתבצע סימון בתור \"לא להעלאה\" + מתבצע ביטול סימון בתור \"לא להעלאה\" להציג תמונות שכבר בוצעו בהן פעולות הסתרת תמונות שכבר בוצעו בהן פעולות לא נמצאו עוד תמונות diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 1e0df8c0a..cdd300e62 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -710,6 +710,8 @@ Ваше мислење Означи дека не е за подигање Отстрани ознака дека не е за подигање + Означи дека не е за подигање + Отстрани ознака дека не е за подигање Прикажи веќе сработени слики Скривање на веќе сработени слики Не најдов повеќе слики diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 33df38415..5603e47a0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -28,8 +28,10 @@ * Redredsonia * Rubin16 * StarryFairy +* Stjn * Tanzun * Thothsum +* Ukhant Erdemt * Vlad5250 * VoxelJ * Wikisaurus @@ -242,6 +244,8 @@ Требуемые разрешения: чтение с внешнего носителя. Приложение не сможет получить доступ к вашей галерее без этого разрешения. Требуемые разрешения: запись на внешнее хранилище. Приложение не сможет получить доступ к галерее/камере без этого разрешения. Запрос на определение местоположения + Записывать местоположение для снимков в приложении + Включите эту опцию, чтобы записывать местоположение вместе со снимками в приложении, если камера устройства не записывает его. OK Внимание Обнаружено повторяющееся имя файла @@ -320,6 +324,7 @@ Копирование викикода в буфер обмена Викикод скопирован в буфер обмена Функция «Поблизости» может работать некорректно, определение местоположения недоступно. + Доступ к местоположению запрещён. Чтобы использовать эту функцию, укажите своё местоположение вручную. Необходимо разрешение для отображения списка мест поблизости Направления Викиданные @@ -469,6 +474,9 @@ Просмотр текущих кампаний Разрешить Отменить + Пожалуйста, включите доступ к местоположению в настройках и повторите попытку. \n\nПримечание. При загрузке может отсутствовать местоположение, если в течение короткого интервала времени приложению не удаётся получить местоположение с устройства. + Приложение не будет записывать местоположение вместе со снимками из-за отсутствия разрешения на доступ к местоположению + Приложение не записывает местоположение вместе со снимками, поскольку GPS отключён Использовать средство выбора фотографий на основе документа Новый инструмент выбора фотографий Android рискует потерять информацию о местоположении. Включите, если вы собираетесь его использовать Отключение может привести к запуску нового средства выбора фотографий Android. Из-за этого может потеряться информация о местоположении.\n\nНажмите «Подробнее» для получения дополнительной информации. @@ -624,6 +632,7 @@ Для достижения наилучших результатов выберите режим высокой точности. Включить местоположение? Рядом необходимо, чтобы местоположение было включено для правильной работы. + Вам необходимо предоставить доступ к вашему текущему местоположению, чтобы установить местоположение автоматически. Вы снимали эти две фотографии в одном месте? Хотите использовать широту/долготу изображения справа? Загрузить ещё Мест не найдено, попытайтесь изменить критерии поиска. @@ -750,6 +759,8 @@ Обратная связь от вас Отметить как не подлежащее загрузке Снять пометку как не подлежащее загрузке + Помечено как не предназначенное для загрузки + Снять пометку «не для загрузки» Показать уже обработанные изображения Скрытие уже обработанных изображений Больше изображений не найдено diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index acc54a70f..7413e7b67 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -728,6 +728,8 @@ Vaš odziv Označi kot ni za nalaganje Odznači kot ni za nalaganje + Označevanje kot ni za naložitev + Odznačevanje kot ni za naložitev Prikaži že obdelane slike Skrivanje že obdelanih slik Ni drugih najdenih slik diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 6d4136e9a..66e4ac8ba 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -455,7 +455,7 @@ Камера в застосунку потребує дозволу на доступ до місцезнаходження, щоб приєднувати його до ваших зображень, якщо місцезнаходження недоступне в EXIF. Дозвольте програмці отримати доступ до вашого місцезнаходження та повторіть спробу.\n\nПримітка: у завантаженому файлі може не бути місцезнаходження, якщо програма не може отримати місцезнаходження з пристрою протягом короткого проміжку часу. Застосунок не записував місцезнаходження разом із кадрами через відсутність дозволу на місцезнаходження Програмка не буде записувати місцезнаходження разом із кадрами, оскільки GPS вимкнено - Переконайтеся, що цей новий засіб вибору Android не видаляє геоданы з ваших зображень. + Якщо вимкнути, то може бути викликаний новий вибір фотографій. Що може призвести до втрати інформації про місцезнаходження.\n\nТоркніться «Докладніше», щоб дізнатись більше. Ви більше не бачитимете кампаній. Однак Ви можете увімкнути це сповіщення повторно в своїх налаштуваннях, якщо забажаєте. Ця функція вимагає доступу до інтернету. Будь ласка, перевірте своє з\'єднання. Сталася помилка при обробці зображення. Будь ласка, спробуйте ще раз! @@ -673,13 +673,13 @@ Переглянути сторінку елемента Мова інтерфейсу Вилучає опис і підпис - Читати більше + Докладніше Усіма мовами Вибрати розташування Панорамуйте і збільшуйте, щоб підлаштувати Вибрати розташування Показати в додатку на мапі - Редагувати підпис + Редагувати розташування Вигляд вибору розташування як зображення Вигляд вибору розташування як тіні зображення Підпис зображення diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index f1eba034e..e681b7f4f 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -36,6 +36,7 @@ * Willy1018 * Wxyveronica * XiaoGuoQuQ233 +* Xyb * Yfdyh000 * Zhang8569 * ZhaoGang @@ -55,7 +56,7 @@ 共享资源Github源代码 共享资源标志 共享资源网站 - 退出位置拾取器 + 退出位置选择器 提交 添加其他说明 新增贡献 @@ -71,7 +72,7 @@ 向上切换 搜索视图 地点状态 - 每日图片 + 今日图片 %1$d个文件正在上传 %1$d个文件正在上传 @@ -109,6 +110,7 @@ 设置 上传到共享资源 + 上传中 用户名 密码 登录您的共享资源测试版账号 @@ -122,6 +124,7 @@ 登录成功! 登录失败! 找不到文件。请尝试其他文件。 + 关闭电池优化? 身份验证失败,请重新登录 上传开始! 上传排队中(已启用连接受限模式) @@ -236,6 +239,7 @@ 需要权限:读取外部存储。应用不能在没有它的情况下访问您的图册。 需要权限:写入外部存储。应用不能在没有它的情况下访问您的相机/图册。 请求位置权限 + 记录应用内拍摄的位置 确定 警告 发现重复的文件名 @@ -461,6 +465,8 @@ 结束于: 显示活动 显示正在进行的活动 + 允许 + 拒绝 将此关闭可能会触发新的 Android 照片选择器。这可能会有丢失位置信息的风险。\n\n点击“阅读更多”以获取更多信息。 你不会再看到这个活动。如果需要可以在设置里重新启用此通知。 这个功能需要网络连接,请检查你的网络设置。 @@ -737,6 +743,8 @@ 您的反馈 标记为不上传 取消标记为不上传 + 标记为不可上传 + 取消标记为不可上传 显示已操作过的图片 隐藏已操作过的图片 未找到更多图像 From 8aee7a680d1f963077c60ce7cbb3d4f62808251e Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Sat, 7 Oct 2023 03:40:28 +0530 Subject: [PATCH 003/720] Fixes copy to subsequent media functionality for nearby uploaded images (#5326) --- .../UploadMediaDetailFragment.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java index 6f7c7c72b..847cb857f 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java @@ -7,6 +7,7 @@ import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -546,6 +547,29 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements @Override public void updateMediaDetails(List uploadMediaDetails) { uploadMediaDetailAdapter.setItems(uploadMediaDetails); + showNearbyFound = + showNearbyFound && ( + uploadMediaDetails == null || uploadMediaDetails.isEmpty() || listContainsEmptyDetails( + uploadMediaDetails)); + } + + /** + * if the media details that come in here are empty + * (empty caption AND empty description, with caption being the decider here) + * this method allows usage of nearby place caption and description if any + * else it takes the media details saved in prior for this picture + * @param uploadMediaDetails saved media details, + * ex: in case when "copy to subsequent media" button is clicked + * for a previous image + * @return boolean whether the details are empty or not + */ + private boolean listContainsEmptyDetails(List uploadMediaDetails) { + for (UploadMediaDetail uploadDetail: uploadMediaDetails) { + if (!TextUtils.isEmpty(uploadDetail.getCaptionText()) && !TextUtils.isEmpty(uploadDetail.getDescriptionText())) { + return false; + } + } + return true; } /** From 048b78a03acef5c41a88901c07d00b14176213fb Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Sat, 7 Oct 2023 18:37:08 +0530 Subject: [PATCH 004/720] Fixes location issue in upload wizard (#5329) * Fixes location issue in upload wizard * Fixes blue dot disappearance on first install --- .../LocationPicker/LocationPickerActivity.java | 11 ++++++++--- .../nrw/commons/location/LocationServiceManager.java | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java index 7454c77ef..34ee9ec41 100644 --- a/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/LocationPicker/LocationPickerActivity.java @@ -314,7 +314,7 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa /** * Show the location in map app */ - public void showInMap(){ + public void showInMap() { Utils.handleGeoCoordinates(this, new fr.free.nrw.commons.location.LatLng(cameraPosition.target.getLatitude(), cameraPosition.target.getLongitude(), 0.0f)); @@ -387,6 +387,8 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa }); + } else { + requestLocationPermissions(); } } @@ -458,13 +460,13 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa */ private void addCenterOnGPSButton(){ fabCenterOnLocation = findViewById(R.id.center_on_gps); - fabCenterOnLocation.setOnClickListener(view -> getCenter()); + fabCenterOnLocation.setOnClickListener(view -> requestLocationPermissions()); } /** * Center the map at user's current location */ - private void getCenter() { + private void requestLocationPermissions() { LocationPermissionsHelper.Dialog locationAccessDialog = new Dialog( R.string.location_permission_title, R.string.upload_map_location_access @@ -539,6 +541,9 @@ public class LocationPickerActivity extends BaseActivity implements OnMapReadyCa @Override public void onLocationPermissionGranted() { + if (mapboxMap.getStyle() != null) { + enableLocationComponent(mapboxMap.getStyle()); + } fr.free.nrw.commons.location.LatLng currLocation = locationManager.getLastLocation(); if (currLocation != null) { final CameraPosition position; diff --git a/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java b/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java index 09a4230cc..6d95bd9a1 100644 --- a/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java +++ b/app/src/main/java/fr/free/nrw/commons/location/LocationServiceManager.java @@ -1,6 +1,7 @@ package fr.free.nrw.commons.location; import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; + import android.Manifest.permission; import android.app.Activity; import android.content.Context; @@ -9,7 +10,6 @@ import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; -import android.util.Log; import androidx.core.app.ActivityCompat; import java.util.HashSet; import java.util.List; @@ -59,9 +59,9 @@ public class LocationServiceManager implements LocationListener { for (String provider : providers) { Location l=null; if (ActivityCompat.checkSelfPermission(getApplicationContext(), permission.ACCESS_FINE_LOCATION) - != PackageManager.PERMISSION_GRANTED + == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getApplicationContext(), permission.ACCESS_COARSE_LOCATION) - != PackageManager.PERMISSION_GRANTED) { + == PackageManager.PERMISSION_GRANTED) { l = locationManager.getLastKnownLocation(provider); } if (l == null) { From 05fbfce865bca0fb4b3e9b0be716b3c3dbab23bd Mon Sep 17 00:00:00 2001 From: Dean Stirrat Date: Sat, 7 Oct 2023 06:30:27 -0700 Subject: [PATCH 005/720] check for exact category match on upload search (#5328) --- .../nrw/commons/upload/categories/CategoriesPresenter.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 085bc999f..733a11213 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 @@ -83,7 +83,8 @@ class CategoriesPresenter @Inject constructor( if (media == null) { return repository.searchAll(term, getImageTitleList(), repository.selectedDepictions) .subscribeOn(ioScheduler) - .map { it.filterNot { categoryItem -> repository.containsYear(categoryItem.name) } } + .map { it.filter { categoryItem -> !repository.containsYear(categoryItem.name) + || categoryItem.name==term } } } else { return Observable.zip( repository.getCategories(repository.selectedExistingCategories) @@ -97,7 +98,8 @@ class CategoriesPresenter @Inject constructor( } ) .subscribeOn(ioScheduler) - .map { it.filterNot { categoryItem -> repository.containsYear(categoryItem.name) } } + .map { it.filter { categoryItem -> !repository.containsYear(categoryItem.name) + || categoryItem.name==term } } .map { it.filterNot { categoryItem -> categoryItem.thumbnail == "hidden" } } } } From 733c8709fccc81c110de3f40ca8546d8b1b7eff3 Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Sun, 8 Oct 2023 14:56:27 +0530 Subject: [PATCH 006/720] Makes depicted place and category items unselectable for nearby place (#5325) * Makes depicted place and category items unselectable for nearby place * UploadCategoriesFragmentUnitTests.kt fixes and javadoc addition * comment fix * Fixes tests and hidden category appearing and dissapearing issue --- .../nrw/commons/category/CategoriesModel.kt | 6 +- .../commons/repository/UploadRepository.java | 17 ++++ .../nrw/commons/upload/UploadActivity.java | 10 +++ .../upload/categories/CategoriesContract.java | 4 + .../upload/categories/CategoriesPresenter.kt | 81 ++++++++++++++++--- .../categories/UploadCategoriesFragment.java | 14 ++-- .../categories/UploadCategoryAdapter.kt | 4 +- .../UploadCategoryAdapterDelegates.kt | 23 ++++-- .../upload/depicts/DepictsFragment.java | 12 ++- .../upload/depicts/DepictsPresenter.kt | 9 +-- .../upload/depicts/UploadDepictsAdapter.kt | 5 +- .../depicts/UploadDepictsAdapterDelegates.kt | 32 +++++--- .../commons/wikidata/WikidataConstants.java | 2 + .../commons/upload/CategoriesPresenterTest.kt | 47 +++++++---- .../UploadCategoriesFragmentUnitTests.kt | 29 ++++++- 15 files changed, 229 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoriesModel.kt b/app/src/main/java/fr/free/nrw/commons/category/CategoriesModel.kt index 9356aee2c..99448a22b 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoriesModel.kt +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoriesModel.kt @@ -136,7 +136,11 @@ class CategoriesModel @Inject constructor( return Observable.fromIterable(categoryNames) .map { categoryName -> buildCategories(categoryName) - }.toList().toObservable() + } + .filter { categoryItem -> + categoryItem.name != "Hidden" + } + .toList().toObservable() } /** diff --git a/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java b/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java index 919c8d2cf..0bfe90036 100644 --- a/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java +++ b/app/src/main/java/fr/free/nrw/commons/repository/UploadRepository.java @@ -293,6 +293,23 @@ public class UploadRepository { return depictModel.getPlaceDepictions(new ArrayList<>(qids)); } + /** + * Gets the category for each unique {@link Place} associated with an {@link UploadItem} + * from {@link #getUploads()} + * + * @return a single that provides the categories + */ + public Single> getPlaceCategories() { + final Set qids = new HashSet<>(); + for (final UploadItem item : getUploads()) { + final Place place = item.getPlace(); + if (place != null) { + qids.add(place.getCategory()); + } + } + return Single.fromObservable(categoriesModel.getCategoriesByName(new ArrayList<>(qids))); + } + /** * Takes depict IDs as a parameter, converts into a slash separated String and Gets DepictItem * from the server diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java index 5b86bbb58..69c67e15e 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java @@ -3,6 +3,8 @@ package fr.free.nrw.commons.upload; import static fr.free.nrw.commons.contributions.ContributionController.ACTION_INTERNAL_UPLOADS; import static fr.free.nrw.commons.utils.PermissionUtils.PERMISSIONS_STORAGE; import static fr.free.nrw.commons.wikidata.WikidataConstants.PLACE_OBJECT; +import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE; +import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE_CATEGORY; import android.Manifest; import android.annotation.SuppressLint; @@ -483,9 +485,17 @@ public class UploadActivity extends BaseActivity implements UploadContract.View, } uploadCategoriesFragment = new UploadCategoriesFragment(); + if (place != null) { + Bundle categoryBundle = new Bundle(); + categoryBundle.putString(SELECTED_NEARBY_PLACE_CATEGORY, place.getCategory()); + uploadCategoriesFragment.setArguments(categoryBundle); + } uploadCategoriesFragment.setCallback(this); depictsFragment = new DepictsFragment(); + Bundle placeBundle = new Bundle(); + placeBundle.putParcelable(SELECTED_NEARBY_PLACE, place); + depictsFragment.setArguments(placeBundle); depictsFragment.setCallback(this); mediaLicenseFragment = new MediaLicenseFragment(); 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 index a286401dc..2a661632b 100644 --- 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 @@ -2,6 +2,7 @@ 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; @@ -80,6 +81,9 @@ public interface CategoriesContract { */ void updateCategories(Media media, String wikiText); + LiveData> getCategories(); + + void 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 733a11213..53553bf6d 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 @@ -1,6 +1,8 @@ package fr.free.nrw.commons.upload.categories import android.text.TextUtils +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import fr.free.nrw.commons.Media import fr.free.nrw.commons.R import fr.free.nrw.commons.category.CategoryEditHelper @@ -36,6 +38,7 @@ class CategoriesPresenter @Inject constructor( var view = DUMMY private val compositeDisposable = CompositeDisposable() private val searchTerms = PublishSubject.create() + private var categoryList: MutableLiveData> = MutableLiveData() /** * Current media */ @@ -54,8 +57,6 @@ class CategoriesPresenter @Inject constructor( .observeOn(mainThreadScheduler) .doOnNext { view.showProgress(true) - view.showError(null) - view.setCategories(null) } .switchMap(::searchResults) .map { repository.selectedCategories + it } @@ -63,13 +64,17 @@ class CategoriesPresenter @Inject constructor( .observeOn(mainThreadScheduler) .subscribe( { - view.setCategories(it) + setCategoryListValue(it) view.showProgress(false) if (it.isEmpty()) { view.showError(R.string.no_categories_found) } }, - Timber::e + { t: Throwable? -> + view.showProgress(false) + view.showError(R.string.no_categories_found) + Timber.e(t) + } ) ) } @@ -92,11 +97,10 @@ class CategoriesPresenter @Inject constructor( CategoryItem(it.name, it.description, it.thumbnail, true) } }, - repository.searchAll(term, getImageTitleList(), repository.selectedDepictions), - { it1, it2 -> - it1 + it2 - } - ) + repository.searchAll(term, getImageTitleList(), repository.selectedDepictions) + ) { it1, it2 -> + it1 + it2 + } .subscribeOn(ioScheduler) .map { it.filter { categoryItem -> !repository.containsYear(categoryItem.name) || categoryItem.name==term } } @@ -161,8 +165,6 @@ class CategoriesPresenter @Inject constructor( .observeOn(mainThreadScheduler) .doOnNext { view.showProgress(true) - view.showError(null) - view.setCategories(null) } .switchMap(::searchResults) .map { repository.selectedCategories + it } @@ -170,13 +172,17 @@ class CategoriesPresenter @Inject constructor( .observeOn(mainThreadScheduler) .subscribe( { - view.setCategories(it) + setCategoryListValue(it) view.showProgress(false) if (it.isEmpty()) { view.showError(R.string.no_categories_found) } }, - Timber::e + { t: Throwable? -> + view.showProgress(false) + view.showError(R.string.no_categories_found) + Timber.e(t) + } ) ) } @@ -230,4 +236,53 @@ class CategoriesPresenter @Inject constructor( view.showNoCategorySelected() } } + + /** + * Selects each [CategoryItem] in a given list as if they were clicked by the user by calling + * [onCategoryItemClicked] for each category and adding the category to [categoryList] + */ + private fun selectNewCategories(toSelect: List) { + toSelect.forEach{ + it.isSelected = true + repository.onCategoryClicked(it, media) + } + + // Add the new selections to the list of category items so that the selections appear + // immediately (i.e. without any search term queries) + categoryList.value?.toMutableList() + ?.let { toSelect + it } + ?.distinctBy(CategoryItem::name) + ?.let { setCategoryListValue(it) } + } + + /** + * Livedata being used to observe category list inside + * @see UploadCategoriesFragment + * Any changes to category list reflect immediately to the adapter list + */ + override fun getCategories(): LiveData> { + return categoryList + } + + /** + * needed for tests + */ + fun setCategoryList(categoryList: MutableLiveData>) { + this.categoryList = categoryList + } + + /** + * needed for tests + */ + fun setCategoryListValue(categoryItems: List) { + categoryList.postValue(categoryItems) + } + + override fun selectCategories() { + compositeDisposable.add(repository.placeCategories + .subscribeOn(ioScheduler) + .observeOn(mainThreadScheduler) + .subscribe(::selectNewCategories) + ) + } } 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 a529d3a62..e378ef53b 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 @@ -1,5 +1,7 @@ package fr.free.nrw.commons.upload.categories; +import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE_CATEGORY; + import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; @@ -81,6 +83,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate * WikiText from the server */ private String wikiText; + private String nearbyPlaceCategory; @Nullable @Override @@ -97,9 +100,10 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate if (bundle != null) { media = bundle.getParcelable("Existing_Categories"); wikiText = bundle.getString("WikiText"); + nearbyPlaceCategory = bundle.getString(SELECTED_NEARBY_PLACE_CATEGORY); } - init(); + presenter.getCategories().observe(getViewLifecycleOwner(), this::setCategories); } private void init() { @@ -160,7 +164,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate adapter = new UploadCategoryAdapter(categoryItem -> { presenter.onCategoryItemClicked(categoryItem); return Unit.INSTANCE; - }); + }, nearbyPlaceCategory); rvCategories.setLayoutManager(new LinearLayoutManager(getContext())); rvCategories.setAdapter(adapter); } @@ -189,10 +193,9 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate @Override public void setCategories(List categories) { - if(categories==null) { + if (categories == null) { adapter.clear(); - } - else{ + } else { adapter.setItems(categories); } } @@ -299,6 +302,7 @@ public class UploadCategoriesFragment extends UploadBaseFragment implements Cate @Override protected void onBecameVisible() { super.onBecameVisible(); + presenter.selectCategories(); final Editable text = etSearch.getText(); if (text != null) { presenter.searchForCategories(text.toString()); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapter.kt index e91b74129..2e301c66f 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapter.kt @@ -4,9 +4,9 @@ import fr.free.nrw.commons.category.CategoryItem import org.jetbrains.annotations.NotNull class UploadCategoryAdapter( - onCategoryClicked: @NotNull() (CategoryItem) -> Unit) : + onCategoryClicked: @NotNull() (CategoryItem) -> Unit, nearbyPlaceCategory: String?) : BaseDelegateAdapter( - uploadCategoryDelegate(onCategoryClicked), + uploadCategoryDelegate(onCategoryClicked, nearbyPlaceCategory), areItemsTheSame = { oldItem, newItem -> oldItem.name == newItem.name }, areContentsTheSame = { oldItem, newItem -> oldItem.name == newItem.name && oldItem.isSelected == newItem.isSelected diff --git a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt index 31863af41..fc5d143a4 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/categories/UploadCategoryAdapterDelegates.kt @@ -6,30 +6,39 @@ import fr.free.nrw.commons.R import fr.free.nrw.commons.category.CategoryItem import fr.free.nrw.commons.databinding.LayoutUploadCategoriesItemBinding -fun uploadCategoryDelegate(onCategoryClicked: (CategoryItem) -> Unit) = +fun uploadCategoryDelegate(onCategoryClicked: (CategoryItem) -> Unit, nearbyPlaceCategory: String?) = adapterDelegateViewBinding({ layoutInflater, root -> LayoutUploadCategoriesItemBinding.inflate(layoutInflater, root, false) }) { val onClickListener = { _: View? -> - item.isSelected = !item.isSelected - binding.uploadCategoryCheckbox.isChecked = item.isSelected - onCategoryClicked(item) + if (item.name != nearbyPlaceCategory) { + item.isSelected = !item.isSelected + binding.uploadCategoryCheckbox.isChecked = item.isSelected + onCategoryClicked(item) + } } binding.root.setOnClickListener(onClickListener) binding.uploadCategoryCheckbox.setOnClickListener(onClickListener) bind { - binding.uploadCategoryCheckbox.isChecked = item.isSelected + if (item.name == nearbyPlaceCategory) { + item.isSelected = true + binding.uploadCategoryCheckbox.isChecked = true + binding.uploadCategoryCheckbox.isEnabled = false + } else { + binding.uploadCategoryCheckbox.isEnabled = true + binding.uploadCategoryCheckbox.isChecked = item.isSelected + } binding.categoryLabel.text = item.name - if(item.thumbnail != "null") { + if (item.thumbnail != "null") { binding.categoryImage.setImageURI(item.thumbnail) } else { binding.categoryImage.setActualImageResource(R.drawable.commons) } - if(item.description != "null") { + if (item.description != "null") { binding.categoryDescription.text = item.description } else { binding.categoryDescription.text = "" diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.java index 25ccd0015..3582f69c0 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsFragment.java @@ -1,5 +1,7 @@ package fr.free.nrw.commons.upload.depicts; +import static fr.free.nrw.commons.wikidata.WikidataConstants.SELECTED_NEARBY_PLACE; + import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; @@ -29,6 +31,7 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.ContributionsFragment; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.media.MediaDetailFragment; +import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText; import fr.free.nrw.commons.upload.UploadActivity; import fr.free.nrw.commons.upload.UploadBaseFragment; @@ -83,6 +86,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra * Determines each encounter of edit depicts */ private int count; + private Place nearbyPlace; @Nullable @Override @@ -99,6 +103,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra Bundle bundle = getArguments(); if (bundle != null) { media = bundle.getParcelable("Existing_Depicts"); + nearbyPlace = bundle.getParcelable(SELECTED_NEARBY_PLACE); } init(); @@ -111,8 +116,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra private void init() { if (media == null) { - depictsTitle - .setText(getString(R.string.step_count, callback.getIndexInViewFlipper(this) + 1, + depictsTitle.setText(String.format(getString(R.string.step_count), callback.getIndexInViewFlipper(this) + 1, callback.getTotalNumberOfSteps(), getString(R.string.depicts_step_title))); } else { depictsTitle.setText(R.string.edit_depictions); @@ -156,12 +160,12 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra adapter = new UploadDepictsAdapter(categoryItem -> { presenter.onDepictItemClicked(categoryItem); return Unit.INSTANCE; - }); + }, nearbyPlace); } else { adapter = new UploadDepictsAdapter(item -> { presenter.onDepictItemClicked(item); return Unit.INSTANCE; - }); + }, nearbyPlace); } depictsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); depictsRecyclerView.setAdapter(adapter); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt index 53cee0d86..2a9bbf349 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt @@ -101,11 +101,10 @@ class DepictsPresenter @Inject constructor( it.commonsCategories, true, it.id) } }, - repository.searchAllEntities(querystring), - { it1, it2 -> - it1 + it2 - } - ) + repository.searchAllEntities(querystring) + ) { it1, it2 -> + it1 + it2 + } .subscribeOn(ioScheduler) .map { repository.selectedDepictions + it + recentDepictedItemList + controller.loadFavoritesItems() } .map { it.filterNot { item -> WikidataDisambiguationItems.isDisambiguationItem(item.instanceOfs) } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapter.kt index d2c1bca7b..c179d9912 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapter.kt @@ -1,11 +1,12 @@ package fr.free.nrw.commons.upload.depicts +import fr.free.nrw.commons.nearby.Place import fr.free.nrw.commons.upload.categories.BaseDelegateAdapter import fr.free.nrw.commons.upload.structure.depictions.DepictedItem -class UploadDepictsAdapter(onDepictsClicked: (DepictedItem) -> Unit) : +class UploadDepictsAdapter(onDepictsClicked: (DepictedItem) -> Unit, nearbyPlace: Place?) : BaseDelegateAdapter( - uploadDepictsDelegate(onDepictsClicked), + uploadDepictsDelegate(onDepictsClicked, nearbyPlace), areItemsTheSame = { oldItem, newItem -> oldItem.id == newItem.id }, areContentsTheSame = { itemA, itemB -> itemA.isSelected == itemB.isSelected} ) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt index 8eec9e4ce..896def499 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/UploadDepictsAdapterDelegates.kt @@ -6,29 +6,39 @@ import android.view.View import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateViewBinding import fr.free.nrw.commons.R import fr.free.nrw.commons.databinding.LayoutUploadDepictsItemBinding +import fr.free.nrw.commons.nearby.Place import fr.free.nrw.commons.upload.structure.depictions.DepictedItem -fun uploadDepictsDelegate(onDepictClicked: (DepictedItem) -> Unit) = +fun uploadDepictsDelegate(onDepictClicked: (DepictedItem) -> Unit, nearbyPlace: Place?) = adapterDelegateViewBinding({ layoutInflater, parent -> LayoutUploadDepictsItemBinding.inflate(layoutInflater, parent, false) }) { val onClickListener = { _: View? -> - item.isSelected = !item.isSelected - binding.depictCheckbox.isChecked = item.isSelected - onDepictClicked(item) + if (item.name != nearbyPlace?.name) { + item.isSelected = !item.isSelected + binding.depictCheckbox.isChecked = item.isSelected + onDepictClicked(item) + } } binding.root.setOnClickListener(onClickListener) binding.depictCheckbox.setOnClickListener(onClickListener) bind { - binding.depictCheckbox.isChecked = item.isSelected - binding.depictsLabel.text = item.name - binding.description.text = item.description - val imageUrl = item.imageUrl - if (TextUtils.isEmpty(imageUrl)) { - binding.depictedImage.setActualImageResource(R.drawable.ic_wikidata_logo_24dp) + if (item.name == nearbyPlace?.name) { + item.isSelected = true + binding.depictCheckbox.isChecked = true + binding.depictCheckbox.isEnabled = false } else { - binding.depictedImage.setImageURI(Uri.parse(imageUrl)) + binding.depictCheckbox.isEnabled = true + binding.depictCheckbox.isChecked = item.isSelected } + binding.depictsLabel.text = item.name + binding.description.text = item.description + val imageUrl = item.imageUrl + if (TextUtils.isEmpty(imageUrl)) { + binding.depictedImage.setActualImageResource(R.drawable.ic_wikidata_logo_24dp) + } else { + binding.depictedImage.setImageURI(Uri.parse(imageUrl)) + } } } diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java index ebe093c5e..a009a239f 100644 --- a/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java +++ b/app/src/main/java/fr/free/nrw/commons/wikidata/WikidataConstants.java @@ -3,4 +3,6 @@ package fr.free.nrw.commons.wikidata; public class WikidataConstants { public static final String PLACE_OBJECT = "place"; public static final String BOOKMARKS_ITEMS = "bookmarks.items"; + public static final String SELECTED_NEARBY_PLACE = "selected.nearby.place"; + public static final String SELECTED_NEARBY_PLACE_CATEGORY = "selected.nearby.place.category"; } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/CategoriesPresenterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/CategoriesPresenterTest.kt index 34b1e82a3..e78addfdc 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/CategoriesPresenterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/CategoriesPresenterTest.kt @@ -1,8 +1,10 @@ package fr.free.nrw.commons.upload +import androidx.lifecycle.MutableLiveData import categoryItem import com.nhaarman.mockitokotlin2.* import fr.free.nrw.commons.R +import fr.free.nrw.commons.category.CategoryItem import fr.free.nrw.commons.repository.UploadRepository import fr.free.nrw.commons.upload.categories.CategoriesContract import fr.free.nrw.commons.upload.categories.CategoriesPresenter @@ -13,9 +15,9 @@ import org.junit.Before import org.junit.Test import org.mockito.Mock import org.mockito.MockitoAnnotations -import org.powermock.reflect.Whitebox import java.lang.reflect.Method + /** * The class contains unit test cases for CategoriesPresenter */ @@ -39,7 +41,7 @@ class CategoriesPresenterTest { MockitoAnnotations.initMocks(this) testScheduler = TestScheduler() categoriesPresenter = CategoriesPresenter(repository, testScheduler, testScheduler) - categoriesPresenter.onAttachView(view) + } @Test @@ -51,7 +53,7 @@ class CategoriesPresenterTest { @Test @Throws(Exception::class) fun `Test onAttachViewWithMedia when media is not null`() { - Whitebox.setInternalState(categoriesPresenter, "media", media()) + categoriesPresenter.onAttachViewWithMedia(view, media()) whenever(repository.getCategories(repository.selectedExistingCategories)) .thenReturn(Observable.just(mutableListOf(categoryItem()))) whenever(repository.searchAll("mock", emptyList(), repository.selectedDepictions)) @@ -68,6 +70,11 @@ class CategoriesPresenterTest { */ @Test fun `searchForCategories combines selection and search results without years distinctly`() { + categoriesPresenter.onAttachView(view) + val liveData = MutableLiveData>() + categoriesPresenter.setCategoryList(liveData) + categoriesPresenter.setCategoryListValue(listOf( + categoryItem("selected", "", "", true))) val nonEmptyCaptionUploadItem = mock() whenever(nonEmptyCaptionUploadItem.uploadMediaDetails) .thenReturn(listOf(UploadMediaDetail(captionText = "nonEmpty"))) @@ -80,7 +87,7 @@ class CategoriesPresenterTest { emptyCaptionUploadItem ) ) - whenever(repository.searchAll("test", listOf("nonEmpty"), repository.selectedDepictions)) + whenever(repository.searchAll(any(), any(), any())) .thenReturn( Observable.just( listOf( @@ -96,25 +103,34 @@ class CategoriesPresenterTest { categoriesPresenter.searchForCategories("test") testScheduler.triggerActions() verify(view).showProgress(true) - verify(view).showError(null) - verify(view).setCategories(null) - verify(view).setCategories(listOf( - categoryItem("selected", "", "", true))) verify(view).showProgress(false) verifyNoMoreInteractions(view) } @Test fun `searchForCategoriesTest sets Error when list is empty`() { - whenever(repository.uploads).thenReturn(listOf()) - whenever(repository.searchAll(any(), any(), any())).thenReturn(Observable.just(listOf())) + categoriesPresenter.onAttachView(view) + val liveData = MutableLiveData>() + categoriesPresenter.setCategoryList(liveData) + // Arrange + val query = "testQuery" + val emptyCategories = ArrayList() + + liveData.postValue(emptyCategories) + + whenever(repository.searchAll(any(), any(), any())) + .thenReturn(Observable.just(emptyCategories)) whenever(repository.selectedCategories).thenReturn(listOf()) - categoriesPresenter.searchForCategories("test") + categoriesPresenter.searchForCategories(query) testScheduler.triggerActions() + val method: Method = CategoriesPresenter::class.java.getDeclaredMethod( + "searchResults", + String::class.java + ) + method.isAccessible = true + method.invoke(categoriesPresenter, query) + verify(view).showProgress(true) - verify(view).showError(null) - verify(view).setCategories(null) - verify(view).setCategories(listOf()) verify(view).showProgress(false) verify(view).showError(R.string.no_categories_found) verifyNoMoreInteractions(view) @@ -125,6 +141,7 @@ class CategoriesPresenterTest { */ @Test fun `verifyCategories with non empty selection goes to next screen`() { + categoriesPresenter.onAttachView(view) val item = categoryItem() whenever(repository.selectedCategories).thenReturn(listOf(item)) categoriesPresenter.verifyCategories() @@ -134,6 +151,7 @@ class CategoriesPresenterTest { @Test fun `verifyCategories with empty selection show no category selected`() { + categoriesPresenter.onAttachView(view) whenever(repository.selectedCategories).thenReturn(listOf()) categoriesPresenter.verifyCategories() verify(view).showNoCategorySelected() @@ -156,6 +174,7 @@ class CategoriesPresenterTest { @Test fun testUpdateCategories() { + categoriesPresenter.onAttachView(view) categoriesPresenter.updateCategories(media(), "[[Category:Test]]") } } 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 e8dcdc4d2..9e45efa98 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 @@ -145,9 +145,34 @@ class UploadCategoriesFragmentUnitTests { @Test @Throws(Exception::class) - fun testOnViewCreated() { + fun testInitMethod() { + val method: Method = UploadCategoriesFragment::class.java.getDeclaredMethod( + "init" + ) Shadows.shadowOf(Looper.getMainLooper()).idle() - fragment.onViewCreated(view, null) + method.isAccessible = true + method.invoke(fragment) + } + + @Test + @Throws(Exception::class) + fun `Test init when media is non null`() { + Whitebox.setInternalState(fragment, "media", media) + val method: Method = UploadCategoriesFragment::class.java.getDeclaredMethod( + "init" + ) + method.isAccessible = true + method.invoke(fragment) + } + + @Test + @Throws(Exception::class) + fun testFragmentOnBecameVisible() { + val method: Method = UploadCategoriesFragment::class.java.getDeclaredMethod( + "onBecameVisible" + ) + method.isAccessible = true + method.invoke(fragment) } @Test From f69ecde713aa7309a39ff597d7df7b18894d436e Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 9 Oct 2023 13:03:04 +0200 Subject: [PATCH 007/720] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-bn/strings.xml | 1 + app/src/main/res/values-es/strings.xml | 3 +++ app/src/main/res/values-nl/strings.xml | 4 ++++ app/src/main/res/values-nqo/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 4 ++++ 5 files changed, 14 insertions(+) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 07b94e52e..3a1a6319d 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -518,6 +518,7 @@ প্রতিক্রিয়া পাঠানোর সময় ত্রুটি ঘটেছে আপনার প্রতিক্রিয়া কী? আপনার প্রতিক্রিয়া + আপলোডের জন্য নয় হিসেবে চিহ্নিত করা হচ্ছে প্রতিবেদন করুন লঙ্ঘনের প্রতিবেদন করুন এই ব্যবহারকারীকে প্রতিবেদন করুন diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 6f6c664ff..c86843a1e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -36,6 +36,7 @@ * MarionaDSR * Miguel2706 * Mirzali +* No se * Pompilos * Raos10 * Rodney Araujo @@ -456,6 +457,8 @@ Finaliza el: Mostrar campañas Ver las campañas en curso + Permitir + Descartar Ya no verás las campañas. Sin embargo, puedes volver a habilitar esta notificación en configuración. Esta función requiere conexión de red, verifica tus ajustes de conexión. Se produjo un error al procesar la imagen. Inténtalo de nuevo. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b4028392f..478aa8d76 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -294,6 +294,7 @@ Kopieer de wikitekst naar het klembord De wikitekst is gekopieerd naar het klembord In de buurt werkt mogelijk niet naar behoren. Locatie niet beschikbaar. + Locatietoegang geweigerd. Stel uw locatie handmatig in om deze functie te gebruiken. Toestemming vereist om een lijst van nabije plaatsen weer te geven VERWIJZINGEN Wikidata @@ -599,6 +600,7 @@ Kies voor de beste resultaten de modus van hoge nauwkeurigheid. Locatie inschakelen? In de buurt heeft locatie nodig om correct te werken + U moet toegang geven tot uw huidige locatie om de locatie automatisch in te stellen. Heeft u deze twee foto\'s op dezelfde plek gemaakt? Wilt u de breedtegraad/lengtegraad van de afbeelding rechts gebruiken? Laad meer Geen plaatsen gevonden, probeer uw zoekcriteria te wijzigen. @@ -727,6 +729,8 @@ Uw feedback Markeren als niet voor uploaden Markeren als niet voor uploaden + Markeren als niet voor uploaden + Niet meer markeren als niet voor uploaden Reeds behandelde afbeeldingen tonen Reeds behandelde afbeeldingen verbergen Geen afbeeldingen meer gevonden diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index af5111326..79d8756ba 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -369,6 +369,8 @@ ߘߌ߫ ߓߊ߲߫: ߦߌ߬ߘߊ߬ߟߌ ߓߙߊߡߊߖߊ߲ߓߊ߲ ߓߙߊߡߊߖߊ߲ߓߊ߲ ߡߍ߲ ߠߎ߬ ߦߴߌ ߘߐ߫߸ ߏ߬ ߟߎ߫ ߦߌ߬ߘߊ߬ + ߊ߬ ߟߊߘߌ߬ߢߍ߬ + ߓߙߐߕߐ߫ ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫ ߞߵߌ ߕߏ߫ ߖߌ߬ߦߊ߬ߓߍ ߟߊߦߍ߬ߟߍ ߞߊ߲߬߸ ߊ߬ ߡߊߝߍߣߍ߲߫ ߌߞߐ߫ ߖߊ߰ߣߌ߲߬߹ ߖߐߟߐ߲ߞߐ ߘߏ߫ ߟߊߛߐ߬ߘߐ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߊ߲ߡߊ߬ ߞߙߊߞߏ ߟߊߘߏ߲߬ߠߌ߲ ߦߌߟߡߊ ߝߛߍ߬ߝߛߍ߬ ߞߊ߲ߡߊ߬. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index f5089ddaf..ea2941b0e 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -295,6 +295,7 @@ 複製 wikitext 到剪貼簿 Wikitext 已複製到剪貼簿 位置無效,應用程式在此地附近可能無法正常運作。 + 位置存取遭拒。請手動設定您的位置才能使用此功能。 需權限來顯示附近地點清單 方向 維基數據 @@ -600,6 +601,7 @@ 為了獲得最佳結果,請選擇高精準度模式。 打開位置? 附近功能需要啟用位置才能運作正常 + 您需要授予對目前位置的存取權限才能自動設定位置。 您是否在同一地點拍攝了這兩張圖片?您要使用圖片右側的緯度/經度嗎? 載入更多 查無地點,請嘗試更改您的搜尋條件。 @@ -728,6 +730,8 @@ 您的意見回饋 標記為不上傳 取消標記為不上傳 + 標記為不可上傳 + 取消標記為不可上傳 顯示已操作的圖片 隱藏已操作的圖片 找不到更多圖片 From 0d90ac3c53ced7dbdd5b9b0de4473886b7634675 Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Mon, 9 Oct 2023 19:38:00 +0530 Subject: [PATCH 008/720] Tick icon in place of number of images selected in custom picker (#5331) * tick in place of number of images selected in custom picker * fixes tests, dark mode visibility, bold tick icon for better visibility --- .../customselector/ui/adapter/ImageAdapter.kt | 6 ++--- .../ui/selector/CustomSelectorActivity.kt | 24 +++++++++++++------ app/src/main/res/drawable/ic_done_black.xml | 5 ++-- .../res/layout/item_custom_selector_image.xml | 12 ++++------ app/src/main/res/values/strings.xml | 4 ++++ .../ui/selector/CustomSelectorActivityTest.kt | 8 +++++-- 6 files changed, 36 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index 4180f0082..99e394e72 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -151,7 +151,7 @@ class ImageAdapter( val isSelected = selectedIndex != -1 if (isSelected) { - holder.itemSelected(selectedImages.size) + holder.itemSelected() } else { holder.itemUnselected() } @@ -407,7 +407,6 @@ class ImageAdapter( */ class ImageViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) { val image: ImageView = itemView.findViewById(R.id.image_thumbnail) - private val selectedNumber: TextView = itemView.findViewById(R.id.selected_count) private val uploadedGroup: Group = itemView.findViewById(R.id.uploaded_group) private val notForUploadGroup: Group = itemView.findViewById(R.id.not_for_upload_group) private val selectedGroup: Group = itemView.findViewById(R.id.selected_group) @@ -415,9 +414,8 @@ class ImageAdapter( /** * Item selected view. */ - fun itemSelected(index: Int) { + fun itemSelected() { selectedGroup.visibility = View.VISIBLE - selectedNumber.text = index.toString() } /** diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt index 8fd5ff746..dd6d24877 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt @@ -28,6 +28,7 @@ import fr.free.nrw.commons.media.ZoomableActivity import fr.free.nrw.commons.theme.BaseActivity import fr.free.nrw.commons.upload.FileUtilsWrapper import fr.free.nrw.commons.utils.CustomSelectorUtils +import kotlinx.android.synthetic.main.activity_login.view.title import kotlinx.coroutines.* import java.io.File import javax.inject.Inject @@ -142,7 +143,7 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL data!! .getParcelableArrayListExtra(CustomSelectorConstants.NEW_SELECTED_IMAGES)!! val shouldRefresh = data.getBooleanExtra(SHOULD_REFRESH, false) - imageFragment!!.passSelectedImages(selectedImages, shouldRefresh) + imageFragment?.passSelectedImages(selectedImages, shouldRefresh) } } @@ -280,6 +281,7 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout) bottomLayout.visibility = View.GONE } + changeTitle(bucketName, 0) } /** @@ -292,10 +294,17 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL /** * Change the title of the toolbar. */ - private fun changeTitle(title: String) { - val titleText = findViewById(R.id.title) - if (titleText != null) { - titleText.text = title + private fun changeTitle(title: String, selectedImageCount:Int) { + if (title.isNotEmpty()){ + val titleText = findViewById(R.id.title) + var titleWithAppendedImageCount = title + if (selectedImageCount > 0) { + titleWithAppendedImageCount += " (${resources.getQuantityString(R.plurals.custom_picker_images_selected_title_appendix, + selectedImageCount, selectedImageCount)})" + } + if (titleText != null) { + titleText.text = titleWithAppendedImageCount + } } } @@ -316,7 +325,7 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL .addToBackStack(null) .commit() - changeTitle(folderName) + changeTitle(folderName, 0) bucketId = folderId bucketName = folderName @@ -331,6 +340,7 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL selectedNotForUploadImages: Int ) { viewModel.selectedImages.value = selectedImages + changeTitle(bucketName, selectedImages.size) if (selectedNotForUploadImages > 0) { bottomSheetBinding.upload.isEnabled = false @@ -418,7 +428,7 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) if (fragment != null && fragment is FolderFragment) { isImageFragmentOpen = false - changeTitle(getString(R.string.custom_selector_title)) + changeTitle(getString(R.string.custom_selector_title), 0) } } diff --git a/app/src/main/res/drawable/ic_done_black.xml b/app/src/main/res/drawable/ic_done_black.xml index 2d3858a70..dd0da0e27 100644 --- a/app/src/main/res/drawable/ic_done_black.xml +++ b/app/src/main/res/drawable/ic_done_black.xml @@ -2,9 +2,10 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> + android:viewportHeight="24"> diff --git a/app/src/main/res/layout/item_custom_selector_image.xml b/app/src/main/res/layout/item_custom_selector_image.xml index 4a44dbb98..8d44c9aad 100644 --- a/app/src/main/res/layout/item_custom_selector_image.xml +++ b/app/src/main/res/layout/item_custom_selector_image.xml @@ -33,18 +33,14 @@ android:background="@color/divider_grey" /> - @@ -55,7 +51,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" - app:constraint_referenced_ids="selected_overlay,selected_count"/> + app:constraint_referenced_ids="selected_overlay,selected_image"/> Swipe fast and long to perform these actions: \n- Left/Right: Go to previous/next \n- Up: Select\n- Down: Mark as not for upload. To set up your leaderboard avatar, tap \"Set as avatar\" in the three-dots menu of any image. The coordinates are not the exact coordinates, but the person who uploaded this picture thinks they are close enough. + + %d image selected + %d images selected + diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt index 7d6d2f9e8..0b5f9b016 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt @@ -73,9 +73,10 @@ class CustomSelectorActivityTest { @Test @Throws(Exception::class) fun testChangeTitle() { - val func = activity.javaClass.getDeclaredMethod("changeTitle", String::class.java) + activity.onFolderClick(1, "test", 0) + val func = activity.javaClass.getDeclaredMethod("changeTitle", String::class.java, Int::class.java) func.isAccessible = true - func.invoke(activity, "test") + func.invoke(activity, "test", 0) } /** @@ -141,6 +142,7 @@ class CustomSelectorActivityTest { @Test @Throws(Exception::class) fun testOnSelectedImagesChanged() { + activity.onFolderClick(1, "test", 0) activity.onSelectedImagesChanged(ArrayList(), 0) } @@ -151,6 +153,7 @@ class CustomSelectorActivityTest { @Throws(Exception::class) fun testOnDone() { activity.onDone() + activity.onFolderClick(1, "test", 0) activity.onSelectedImagesChanged( ArrayList(arrayListOf(Image(1, "test", Uri.parse("test"), "test", 1))), 1 @@ -164,6 +167,7 @@ class CustomSelectorActivityTest { @Test @Throws(Exception::class) fun testOnClickNotForUpload() { + activity.onFolderClick(1, "test", 0) val method: Method = CustomSelectorActivity::class.java.getDeclaredMethod( "onClickNotForUpload" ) From b18bc8ff4bc77f55a71a50eba60c92b9b9660bb8 Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Tue, 10 Oct 2023 18:51:15 +0530 Subject: [PATCH 009/720] fixes popup message title and description on cancelling uploading image (#5334) --- .../commons/contributions/ContributionsListFragment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index aa12816cc..fad5f2699 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -419,11 +419,11 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl @Override public void deleteUpload(final Contribution contribution) { DialogUtil.showAlertDialog(getActivity(), - String.format(Locale.getDefault().getDisplayLanguage(), + String.format(Locale.getDefault(), getString(R.string.cancelling_upload)), - String.format(Locale.getDefault().getDisplayLanguage(), + String.format(Locale.getDefault(), getString(R.string.cancel_upload_dialog)), - "YES", "NO", + String.format(Locale.getDefault(), getString(R.string.yes)), String.format(Locale.getDefault(), getString(R.string.no)), () -> { ViewUtil.showShortToast(getContext(), R.string.cancelling_upload); contributionsListPresenter.deleteUpload(contribution); From a708c811d6b42f65cdac8e8123f7e22f8b7b7372 Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Tue, 10 Oct 2023 19:30:17 +0530 Subject: [PATCH 010/720] fixes image retention when no network is available (#5335) --- .../free/nrw/commons/media/MediaDetailFragment.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index 0cc4bf91f..f2315c81c 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -604,11 +604,12 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment implements image.getHierarchy().setFailureImage(R.drawable.image_placeholder); DraweeController controller = Fresco.newDraweeControllerBuilder() - .setLowResImageRequest(ImageRequest.fromUri(media != null ? media.getThumbUrl() : null)) - .setImageRequest(ImageRequest.fromUri(media != null ? media.getImageUrl() : null)) - .setControllerListener(aspectRatioListener) - .setOldController(image.getController()) - .build(); + .setLowResImageRequest(ImageRequest.fromUri(media != null ? media.getThumbUrl() : null)) + .setRetainImageOnFailure(true) + .setImageRequest(ImageRequest.fromUri(media != null ? media.getImageUrl() : null)) + .setControllerListener(aspectRatioListener) + .setOldController(image.getController()) + .build(); image.setController(controller); } From 8553a9635839ae452aa7887e48f1d25d1ed44646 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 12 Oct 2023 13:03:03 +0200 Subject: [PATCH 011/720] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-mk/strings.xml | 4 ++++ app/src/main/res/values-ru/strings.xml | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ebb6fd352..d6bdd8452 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -761,4 +761,8 @@ Balayez rapidement et assez loin pour effectuer les actions suivantes :\n– vers la gauche / droite : aller au précédent / suivant ;\n– vers le haut : sélectionner ;\n– vers le bas : marquer comme à ne pas téléverser. Pour configurer votre avatar de classement, appuyez sur « Définir comme avatar » dans le menu à trois points de n’importe quelle image. Les coordonnées ne sont pas les coordonnées exactes, mais la personne qui a téléversé cette image pense qu’elles sont suffisamment proches. + + %d image sélectionnée + %d images sélectionnées + diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index cdd300e62..a6c242099 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -729,4 +729,8 @@ Поминувајте бргу и долго со простот за да ги извршите следниве дејства: \n- Лево/десно: Претходна/следна\n- Нагоре: Избирање\n- Надолу: Означување дека не е за подигање. За да го поставите вашиот аватар во табелата на предводници, допрете на „Задај како аватар“ во менито со три точки на било која слика. Наведените координати не се прецизни, но лицето што ја подигнало сликава смета дека се доволно блиску. + + Избрана е %d слика + Избрани се %d слики + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5603e47a0..02addb5e0 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -129,6 +129,7 @@ Вход выполнен успешно! Ошибка входа в систему! Файл не найден. Попробуйте другой файл. + Достигнут максимальный лимит повторов! Пожалуйста, отмените загрузку и повторите попытку. Выключить оптимизацию батареи? Ошибка аутентификации. Пожалуйста, авторизуйтесь ещё раз. Загрузка началась! @@ -778,4 +779,10 @@ Проведите быстро и широко, чтобы выполнить следующие действия: \n- Влево/вправо: переход к предыдущему/следующему \n- Вверх: выбрать\n- Вниз: пометить как не для загрузки. Чтобы установить свой аватар в таблице лидеров, на любом изображении в меню с тремя точками нажмите «Установить как аватар». Координаты не являются точными, но человек, загрузивший эту фотографию, считает, что они достаточно близки. + + выбрано %d изображение + выбрано %d изображения + выбрано %d изображений + + From f06dedaebc0ce2e973700a5c0434578b2a9bf91c Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 16 Oct 2023 13:03:39 +0200 Subject: [PATCH 012/720] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-iw/strings.xml | 6 ++ app/src/main/res/values-nb/strings.xml | 131 +++++++++++++++++++++---- app/src/main/res/values-sv/strings.xml | 6 ++ app/src/main/res/values-zh/strings.xml | 12 +++ 4 files changed, 136 insertions(+), 19 deletions(-) diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 660972c3d..fb732eeb2 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -763,4 +763,10 @@ אפשר לעשות החלקה מהירה וארוכה כדי לבצע את הפעולות הבאות: \n- שמאלה/ימינה: לעבור אל הקודם/הבא \n- למעלה: לבחור\n- למטה: לסמן בתור \"לא להעלאה\". כדי להגדיר את התמונה שמייצגת אותך בלוח התוצאות, יש לגעת ב\"הגדרה כתמונה ייצוגית\" בתפריט שלוש־הנקודות של תמונה כלשהי. נקודות הציון אינן מדויקות, אבל האדם שהעלה את התמונה הזאת חושב שהן קרובות מספיק. + + נבחרה תמונה אחת + נבחרו שתי תמונות + נבחרו %d תמונות + נבחרו %d תמונות + diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 308d75686..c45900dce 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -3,6 +3,7 @@ * AnB * Citadell * Danmichaelo +* EdoAug * Imre Eilertsen * JohSan65 * Jon Harald Søby @@ -30,6 +31,8 @@ Beskrivelse Bilde Alle + Søkevisning + Stedstilstand Dagens bilde %1$d fil lastes opp @@ -40,13 +43,13 @@ (%1$d) Starter opplastinger - - Starter %1$d opplasting - Starter %1$d opplastinger + + Behandler %d opplasting + Behandler %d opplastinger - - %1$d opplasting - %1$d opplastinger + + %d opplasting + %d opplastinger Dette bildet vil bli lisensiert under %1$s @@ -69,6 +72,7 @@ Innstillinger Last opp til Commons + Opplasting pågår Brukernavn Passord Logg inn på Commons Beta-kontoen din @@ -77,15 +81,18 @@ Registrer deg Logger inn Vennligst vent… + Oppdaterer bildetekster og beskrivelser + Vent … Innloggingen var vellykket! Innloggingen feilet! Filen ble ikke funnet. Forsøk med en annen fil. + Deaktiver batterioptimalisering? Autentiseringen feilet, vennligst logg inn igjen Opplastingen startet Køede opplastinger (begrenset tilkoblingsmodus aktivert) %1$s lastet opp! Trykk for å vise din opplasting - Starter opplasting av %1$s + Laster opp fil: %s %1$s lastet opp Avslutter opplasting av %1$s Kunne ikke laste opp %1$s @@ -131,6 +138,7 @@ Innstillinger Registrer deg Utvalgte bilder + Egendefinert velger Kategori Gjennomgang Om @@ -193,8 +201,11 @@ Nødvendig tillatelse: Lese ekstern lagring. Appen kan ikke få tilgang til galleriet ditt uten dette. Nødvendig tillatelse: Skriv til ekstern lagring. Appen får ikke tilgang til kameraet/galleriet ditt uten dette. Ber om plasseringstillatelse + Registrer plassering for bilder som tas i appen + Aktiver dette forå registrere posisjon til bilder tatt med kameraet i appen, i tilfelle enhetens kamera ikke gjør det OK Advarsel + Duplikatfilnavn funnet Last opp Ja Nei @@ -248,10 +259,12 @@ Dette bildet ble tatt et annet sted. Last kun opp bilder du har tatt selv. Ikke last opp bilder du har funnet på andres Facebook-kontoer. Ønsker du fortsatt å laste opp dette bildet? + Tilkoblingsfeil + Opplastingsprosessen krever aktiv internettilgang. Sjekk nettverkstilkoblingen din. Problemer funnet i bildet Last kun opp bilder du har tatt selv. Ikke last opp bilder du har lastet ned fra internett. - Bruk ekstern lagring - Lagre bilder som er tatt med kameraet i appen på enheten din + Lagre bilder tatt i appen + Lagre bilder som er tatt med kameraet i appen til din enhets lagringsplass Logg inn med kontoen din Send loggfil Send loggfil til utviklerne via epost for å hjelpe til å feilsøke problemer med appen. Merk: Logger kan potensielt inneholde identifiserende informasjon. @@ -259,7 +272,7 @@ Feil! URL ikke funnet Nominer for sletting Dette bildet har blitt nominert for sletting. - <u>Se nettsiden for detaljer</u> + Se nettsiden for detaljer Hopp over Logg inn Vil du hoppe over logg inn? @@ -267,14 +280,16 @@ Logg vennligst inn for å bruke denne funksjonen Kopier wikiteksten til utklippstavlen Wikiteksten har blitt kopiert til utklippstavlen - Sted ikke tilgjengelig. + Det kan hende «I nærheten» ikke fungerer riktig, sted ikke tilgjengelig. + Posisjonstilgang nektet. Angi posisjonen din manuelt for å bruke denne funksjonen. Tillatelse kreves for å vise listen over steder i nærheten Veibeskrivelse Wikidata Wikipedia Commons - <u>Vurder oss</u> + Vurder oss Ofte stilte spørsmål + Brukerveiledning Hopp over innledning Internett er utilgjengelig Feil under henting av varsler @@ -410,6 +425,8 @@ Slutter: Vis kampanjer Se aktive kampanjer + Tillat + Lukk Bruk dokumentbasert bildevelger Du vil ikke se kampanjer lenger. Du kan slå på dette igjen i innstillingene om du ønsker. Denne funksjonen trenger nettverksforbindelse, sjekk tilkoblingsinnstillingene dine. @@ -440,23 +457,25 @@ Dette bildet ligger i %1$s kategorier. Det er ikke relevant fordi det er Det er et opphavsrettbrudd fordi det er - Ja, hvorfor ikke - Neste bilde + Neste bilde + Ja, hvorfor ikke Når du klikker på denne knappen vil du få et nytt nylig opplastet bilde fra Wikimedia Commons Du kan gå gjennom bildene og forbedre kvaliteten på Wikimedia Commons.\nDe fire parameterne for gjennomgang er:\n• Er bildet relevant?\n• Følger bildet opphavsrettsreglene?\n• Er bildet riktig kategorisert?\n• Hvis alt ser greit ut kan du også takke bidragsyteren. Ingen bilder brukt Ingen bilder tilbakestilt Ingen bilder lastet opp Du har uleste varsler - Du har ingen arkiverte varsler + Du har ingen leste varsler Del logger ved hjelp av - Vis arkiverte + Vis leste Vis uleste Feil under utvalg av bilder Vennligst vent… Fremhevede bilder er bilder fra dyktige fotografer og illustratører som fellesskapet på Wikimedia Commons har utpekt som blant de bildene med høyest kvalitet på nettstedet. Bilder lastet opp via steder i nærheten er bilder som lastes opp ved å oppdage steder på kartet. Denne funksjonen lar brukere sende takk til brukere som gjør nyttige endringer – ved å bruke en liten takkelenke på historikksider eller diffsider. + Kopier til påfølgende media + Kopiert Eksempler på gode bilder å laste opp til Commons Eksempler på bilder som ikke bør lastes opp Hopp over dette bildet @@ -484,13 +503,17 @@ Nominerte %1$s for sletting Mislyktes Kunne ikke be om sletting. - En selfie - Sløret - Vrøvl + en selfie som ikke brukes i noen artikkel + helt uklart + tull, helt ubrukelig i enhver artikkel Pressefoto Tilfeldig bilde fra internett Logo + Brudd på panoramafriheten Fordi det er + Prøver å oppdatere kategorier. + Kategorioppdatering + Suksess Kunne ikke legge til kategorier. Oppdater kategorier Koordinatoppdatering @@ -513,6 +536,7 @@ Tekst kopiert til utklippstavlen Varsel merket som lest En feil oppsto! + Stedstilstand: Eksisterer Trenger bilde Stedstype: @@ -535,8 +559,69 @@ Lyst Bekreft Instruksjoner + pause + fortsett + Satt på pause + Mer + Bokmerker + Prestasjoner + Toppliste + Rangering: + Antall: + Rangering + Bruker + Antall + Angi som profilbilde for topplisten + Angir profilbilde, vent + Profilbilde angitt + Problem ved angivelse av nytt profilbilde, prøv på nytt + Angi som profibilde + Årlig + Ukentlig + Gjennom tidene + Last opp + I nærheten + Brukt + Min rangering + Kvalitetsbilder + Gjenopptar opplasting … + Setter opplasting på pause … Avbryter opplasting. Avbryt opplasting + Avbilder + Les mer + På alle språk + Velg et sted + Panorer og zoom for å justere + Velg plassering + Vis i kartappen + Rediger plassering + Bildeposisjon + Sjekk om plasseringen er riktig + Etikett + Beskrivelse + Elementer + Egendefinert velger + Ingen bilder + Ferdig + Tilbake + Fenomenalt + Dette bildet er allerede lastet opp til Commons. + Vis monumenter + Det er Wiki Loves Monuments-måneden! + LÆR MER + Trenger tillatelse + Bidrag til bruker: %s + Prestasjoner til bruker: %s + Vis brukerside + Rediger avbildninger + Rediger kategorier + Avanserte alternativer + Du kan tilpasse spørringen for «I nærheten». Om du opplever feil, nullstill og ta i bruk. + Bruk + Nullstill + Ingen plassering funnet + Legg til plassering Detaljer API-nivå Android-versjon @@ -548,4 +633,12 @@ Feil under sending av tilbakemelding Hva er tilbakemeldingen din? Tilbakemeldingen din + Bilde valgt + Rapporter + Rapporter brudd + Rapporter denne brukeren + Rapporter dette innholdet + Forespør blokkering av denne brukeren + Velkommen til fullskjermsvalgmodus + Bruk to fingre for å zoome inn og ut. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 204491523..50c741e77 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -713,6 +713,8 @@ Din återkoppling Markera som inte för uppladdning Avmarkera som inte för uppladdning + Markerar som inte för uppladdning + Avmarkerar som inte för uppladdning Visa redan åtgärdade bilder Döljer redan åtgärdade bilder Inga fler bilder hittades @@ -730,4 +732,8 @@ Svep snabbt och länge för att utföra dessa åtgärder: \n- Vänster/Höger: Gå till föregående/nästa \n- Upp: Markera\n- Ned: Markera som inte för uppladdning. För att ange din avatar för topplistan trycker du på \"Använd som avatar\" i menyn med de tre punkter på valfri bild. Koordinaterna är inte de exakta koordinaterna, men personen som laddade upp denna bild tycker att de är tillräckligt nära. + + %d markerad bild + %d markerade bilder + diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index e681b7f4f..df7b7346d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -124,7 +124,9 @@ 登录成功! 登录失败! 找不到文件。请尝试其他文件。 + 已达到最大重试限制!请取消上传并重试 关闭电池优化? + 关闭电池优化后,上传3张以上图像会更可靠。请从设置中关闭共享资源应用的电池优化,以获得流畅的上传体验。 \n\n电池优化可按以下步骤关闭:\n\n第1步:点按下面的“设置”按钮。\n\n第2步:从“未优化”切换为“全部应用”。\n\n第3步:寻找“Commons”或“fr.free.nrw.commons”。\n\n第4步:点按并选择“不优化”。\n\n第5步:按“完成”。 身份验证失败,请重新登录 上传开始! 上传排队中(已启用连接受限模式) @@ -240,6 +242,7 @@ 需要权限:写入外部存储。应用不能在没有它的情况下访问您的相机/图册。 请求位置权限 记录应用内拍摄的位置 + 启用此功能可通过应用内拍摄记录位置,以防设备相机未记录位置 确定 警告 发现重复的文件名 @@ -318,6 +321,7 @@ 复制wikitext到剪贴板 wikitext已经复制到剪贴板 附近可能无法正常工作,位置不可用。 + 位置权限被拒绝。请手动设置您的位置以使用此功能。 需要权限以显示附近地点列表 方向 维基数据 @@ -465,8 +469,12 @@ 结束于: 显示活动 显示正在进行的活动 + 允许应用获取位置,以防相机未记录位置。某些设备的相机不记录位置。在这种情况下,让应用获取位置并将其附加到照片可以让您的贡献更有用。您可以随时从“设置”中更改此设置 允许 拒绝 + 请从“设置”中打开位置权限,然后重试。 \n\n注意:如果应用程序无法在短时间内从设备检索位置,则上传可能没有位置。 + 使用基于“文件”应用的照片选择器 + 新版Android照片选择器可能会丢失位置信息。如果您正在使用它,请启用该设置。 将此关闭可能会触发新的 Android 照片选择器。这可能会有丢失位置信息的风险。\n\n点击“阅读更多”以获取更多信息。 你不会再看到这个活动。如果需要可以在设置里重新启用此通知。 这个功能需要网络连接,请检查你的网络设置。 @@ -762,4 +770,8 @@ 快速长距离滑动来执行以下操作:\n- 向左/右:前往上一个/下一个\n- 向上:选择\n- 向下:标记为不上传 要设置你的排行榜头像,请点击任意图片上三点式菜单中的\"设置为头像\" 图片坐标并不是准确的坐标,但上传这张图片的人认为它们足够接近。 + + 已选择%d个图像 + 已选择%d个图像 + From f13085147f0cf56432f6e28f4ea065527ec7319e Mon Sep 17 00:00:00 2001 From: JiaYuan Huang <59361311+1162706031@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:50:24 +1100 Subject: [PATCH 014/720] 5338 bug fix (#5340) * fix Bug index out bound * fix Bug index out bound * fix Bug index out bound * fix Bug index out bound * add some comments for that * add some comments for that * add some comments for that * add some comments for that --- .../nrw/commons/upload/LanguagesAdapter.kt | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/LanguagesAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/LanguagesAdapter.kt index a2b673f46..85f71a3ff 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/LanguagesAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/LanguagesAdapter.kt @@ -26,6 +26,16 @@ class LanguagesAdapter constructor( private val selectedLanguages: HashMap<*, String> ) : ArrayAdapter(context, R.layout.row_item_languages_spinner) { + companion object { + /** + * Represents the default index for the language list. By default, this index corresponds to the + * English language. This serves as a fallback when the user's system language is not present in + * the language_list.xml. Though this default can be changed by the user, it does not affect other + * functionalities of the application. Fixes bug issue 5338 + */ + const val DEFAULT_INDEX = 0 + } + private var languageNamesList: List private var languageCodesList: List @@ -85,11 +95,33 @@ class LanguagesAdapter constructor( return languageNamesList[position] } + /** + * Retrieves the index of the user's default locale from the list of available languages. + * + * This function checks the user's system language and finds its index within the application's + * list of supported languages. If the system language is not supported, or any error occurs, + * it falls back to the default language index, typically representing English. + * + * + * @param context The context used to get the user's system locale. + * @return The index of the user's default language in the supported language list, + * or the default index if the language is not found. + * Note: This function was implemented to address a bug where unsupported system languages + * resulted in an incorrect language selection. Directly returning the result of `indexOf` + * without checking its validity could result in returning an index of -1, leading to ArrayIndex + * OutOfBoundsException. + * [See bug issue 5338] + * It's essential to ensure that the returned index is valid or fall back to a default index. + * Future contributors are advised not to simplify this function without addressing this concern. + */ fun getIndexOfUserDefaultLocale(context: Context): Int { - return language.codes.indexOf(context.locale!!.language) + + val userLanguageCode = context.locale?.language ?: return DEFAULT_INDEX + return language.codes.indexOf(userLanguageCode).takeIf { it >= 0 } ?: DEFAULT_INDEX } fun getIndexOfLanguageCode(languageCode: String): Int { + return languageCodesList.indexOf(languageCode) } From 64652b987d686bc1d9ed56d3c59bfdee2ffedde7 Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Wed, 18 Oct 2023 08:46:33 +0530 Subject: [PATCH 015/720] fixes blank screen decrepancy when sharing items from external apps (#5345) * fixes blank screen decrepancy when sharing items from external apps * reverts comment removal --- .../nrw/commons/filepicker/Constants.java | 1 + .../nrw/commons/upload/UploadActivity.java | 62 ++++++++++++++----- app/src/main/res/values/strings.xml | 2 + 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/Constants.java b/app/src/main/java/fr/free/nrw/commons/filepicker/Constants.java index cc04e3956..3c9299c1a 100644 --- a/app/src/main/java/fr/free/nrw/commons/filepicker/Constants.java +++ b/app/src/main/java/fr/free/nrw/commons/filepicker/Constants.java @@ -8,6 +8,7 @@ public interface Constants { */ interface RequestCodes { int LOCATION = 1; + int STORAGE = 2; int FILE_PICKER_IMAGE_IDENTIFICATOR = 0b1101101100; //876 int SOURCE_CHOOSER = 1 << 15; diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java index 69c67e15e..06706df8a 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.java @@ -10,9 +10,12 @@ import android.Manifest; import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Intent; +import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.Build; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.provider.Settings; import android.util.DisplayMetrics; @@ -21,6 +24,7 @@ import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.cardview.widget.CardView; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -38,6 +42,7 @@ import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.LoginActivity; import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.contributions.ContributionController; +import fr.free.nrw.commons.filepicker.Constants.RequestCodes; import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LatLng; @@ -59,7 +64,6 @@ import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; -import java.security.Permission; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -150,11 +154,6 @@ public class UploadActivity extends BaseActivity implements UploadContract.View, compositeDisposable = new CompositeDisposable(); init(); nearbyPopupAnswers = new HashMap<>(); - PermissionUtils.checkPermissionsAndPerformAction(this, - this::receiveSharedItems, - R.string.storage_permission_title, - R.string.write_storage_permission_rationale_for_image_share, - PERMISSIONS_STORAGE); //getting the current dpi of the device and if it is less than 320dp i.e. overlapping //threshold, thumbnails automatically minimizes DisplayMetrics metrics = getResources().getDisplayMetrics(); @@ -167,6 +166,7 @@ public class UploadActivity extends BaseActivity implements UploadContract.View, } locationManager.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER); locationManager.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER); + checkStoragePermissions(); } private void init() { @@ -232,7 +232,6 @@ public class UploadActivity extends BaseActivity implements UploadContract.View, askUserToLogIn(); } checkBlockStatus(); - checkStoragePermissions(); } /** @@ -255,14 +254,10 @@ public class UploadActivity extends BaseActivity implements UploadContract.View, private void checkStoragePermissions() { final boolean hasAllPermissions = PermissionUtils.hasPermission(this, PERMISSIONS_STORAGE); - if (!hasAllPermissions) { - PermissionUtils.checkPermissionsAndPerformAction(this, - () -> { - //TODO handle this - }, - R.string.storage_permission_title, - R.string.write_storage_permission_rationale_for_image_share, - PERMISSIONS_STORAGE); + if (hasAllPermissions) { + receiveSharedItems(); + } else if (VERSION.SDK_INT >= VERSION_CODES.M) { + requestPermissions(PERMISSIONS_STORAGE, RequestCodes.STORAGE); } } @@ -350,7 +345,44 @@ public class UploadActivity extends BaseActivity implements UploadContract.View, startActivity(loginIntent); } + @Override + public void onRequestPermissionsResult(final int requestCode, + @NonNull final String[] permissions, + @NonNull final int[] grantResults) { + boolean areAllGranted = false; + if (requestCode == RequestCodes.STORAGE) { + if (VERSION.SDK_INT >= VERSION_CODES.M) { + for (int i = 0; i < grantResults.length; i++) { + String permission = permissions[i]; + areAllGranted = grantResults[i] == PackageManager.PERMISSION_GRANTED; + if (grantResults[i] == PackageManager.PERMISSION_DENIED) { + boolean showRationale = shouldShowRequestPermissionRationale(permission); + if (!showRationale) { + DialogUtil.showAlertDialog(this, + getString(R.string.storage_permissions_denied), + getString(R.string.unable_to_share_upload_item), + getString(android.R.string.ok), + this::finish, + false); + } else { + DialogUtil.showAlertDialog(this, + getString(R.string.storage_permission_title), + getString( + R.string.write_storage_permission_rationale_for_image_share), + getString(android.R.string.ok), + this::checkStoragePermissions, + false); + } + } + } + if (areAllGranted) { + receiveSharedItems(); + } + } + } + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0a7ef2499..85bb19bdc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -775,6 +775,8 @@ Upload your first media by tapping on the add button. Swipe fast and long to perform these actions: \n- Left/Right: Go to previous/next \n- Up: Select\n- Down: Mark as not for upload. To set up your leaderboard avatar, tap \"Set as avatar\" in the three-dots menu of any image. The coordinates are not the exact coordinates, but the person who uploaded this picture thinks they are close enough. + Storage Permissions Denied + Unable to share this item %d image selected %d images selected From f7164d0b7873adb054d37f72743af1ab0f00f3e0 Mon Sep 17 00:00:00 2001 From: Alvin Tang Date: Thu, 19 Oct 2023 00:42:01 +1100 Subject: [PATCH 016/720] Fix #5246: map icon in Upload Wizard indicating if location is included in the EXIF data (#5343) * Add XML map icons with a tick/question mark for the Upload Wizard The existing map icon may not be intuitive enough to indicate whether the location EXIF data will be included The two new XML map icons are intended to indicate the status of location sharing with the location data in the Upload Wizard * Label the map icon in the Upload Wizard if location is included If an image is capture with the in-app camera, the location in the image metadata by default If so, the map icon in the Upload Wizard should be labelled with a green tick during initialisation of its UploadMediaDetailFragment instance * Update the map icon in Upload Wizard if location is pin-pointed If the user selects images from the device storage to upload, the location EXIF data might originally not be included The map icon is labelled with a red question mark After pin-pointing the location manully, the map icon should be labelled with a green tick instead * Fix Upload Wizard map icon XML rendering failure SVG path is invalid, resulting in failure to render the icons Also imports are required for UploadMediaDetailFragment to use Drawable objects and R objects * Add hasLocation() to UploadableFile to indicate existence of EXIF When an image is chosen from the album to the Upload Wizard, its EXIF might contain location data. hasLocation() and fix of init() in UploadMediaDetailFragment ensures that the map icon is shown correctly * Fix init() NullPointerException in UploadMediaDetailFragment * Fix comment typo in UploadMediaDetailFragment Fix the comment about red and green labels for the map icon * Use SLF4J logging for try-catch clauses in UploadableFile class Instead of using printStackTrace(), error directed to logcat * Use Timber for logging in UploadableFile Clean up the catch clause in hasLocation() and getDataTimeFromExif() --- .../commons/filepicker/UploadableFile.java | 35 ++++++++++++------- .../UploadMediaDetailFragment.java | 20 ++++++++++- .../drawable/ic_map_question_dark_24dp.xml | 12 +++++++ .../drawable/ic_map_question_white_24dp.xml | 12 +++++++ .../res/drawable/ic_map_tick_dark_24dp.xml | 12 +++++++ .../res/drawable/ic_map_tick_white_24dp.xml | 12 +++++++ 6 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable/ic_map_question_dark_24dp.xml create mode 100644 app/src/main/res/drawable/ic_map_question_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_map_tick_dark_24dp.xml create mode 100644 app/src/main/res/drawable/ic_map_tick_white_24dp.xml diff --git a/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java index 5e3a43bbe..1fe306a8b 100644 --- a/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java +++ b/app/src/main/java/fr/free/nrw/commons/filepicker/UploadableFile.java @@ -10,13 +10,11 @@ import android.os.Parcelable; import androidx.annotation.Nullable; import androidx.exifinterface.media.ExifInterface; +import fr.free.nrw.commons.upload.FileUtils; import java.io.File; import java.io.IOException; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Date; - -import fr.free.nrw.commons.upload.FileUtils; +import timber.log.Timber; public class UploadableFile implements Parcelable { public static final Creator CREATOR = new Creator() { @@ -74,7 +72,6 @@ public class UploadableFile implements Parcelable { return 0; } - /** * First try to get the file creation date from EXIF else fall back to CP * @param context @@ -118,6 +115,24 @@ public class UploadableFile implements Parcelable { } } + /** + * Indicate whether the EXIF contains the location (both latitude and longitude). + * + * @return whether the location exists for the file's EXIF + */ + public boolean hasLocation() { + try { + ExifInterface exif = new ExifInterface(file.getAbsolutePath()); + final String latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE); + final String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE); + return latitude != null && longitude != null; + } catch (IOException | NumberFormatException | IndexOutOfBoundsException e) { + Timber.tag("UploadableFile"); + Timber.d(e); + } + return false; + } + /** * Get filePath creation date from uri from EXIF * @@ -143,13 +158,9 @@ public class UploadableFile implements Parcelable { } } } - - } catch (IOException e) { - e.printStackTrace(); - } catch (NumberFormatException e) { - e.printStackTrace(); - } catch (IndexOutOfBoundsException e) { - e.printStackTrace(); + } catch (IOException | NumberFormatException | IndexOutOfBoundsException e) { + Timber.tag("UploadableFile"); + Timber.d(e); } return null; } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java index 847cb857f..2f54ae15c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java @@ -17,6 +17,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import android.graphics.drawable.Drawable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.AppCompatButton; @@ -47,6 +48,7 @@ import fr.free.nrw.commons.upload.UploadMediaDetailAdapter; import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.ViewUtil; +import fr.free.nrw.commons.R.drawable.*; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -180,6 +182,18 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements btnPrevious.setAlpha(1.0f); } + // If the image EXIF data contains the location, show the map icon with a green tick + if (inAppPictureLocation != null || + (uploadableFile != null && uploadableFile.hasLocation())) { + Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_tick_white_24dp); + ibMap.setImageDrawable(mapTick); + } else { + // Otherwise, show the map icon with a red question mark + Drawable mapQuestionMark = + getResources().getDrawable(R.drawable.ic_map_question_white_24dp); + ibMap.setImageDrawable(mapQuestionMark); + } + //If this is the last media, we have nothing to copy, lets not show the button if (callback.getIndexInViewFlipper(this) == callback.getTotalNumberOfSteps()-4) { btnCopyToSubsequentMedia.setVisibility(View.GONE); @@ -188,7 +202,6 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements } attachImageViewScaleChangeListener(); - } /** @@ -540,6 +553,11 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements editableUploadItem.getGpsCoords().setDecimalCoords(latitude+"|"+longitude); editableUploadItem.getGpsCoords().setImageCoordsExists(true); editableUploadItem.getGpsCoords().setZoomLevel(zoom); + + // Replace the map icon using the one with a green tick + Drawable mapTick = getResources().getDrawable(R.drawable.ic_map_tick_white_24dp); + ibMap.setImageDrawable(mapTick); + Toast.makeText(getContext(), "Location Updated", Toast.LENGTH_LONG).show(); } diff --git a/app/src/main/res/drawable/ic_map_question_dark_24dp.xml b/app/src/main/res/drawable/ic_map_question_dark_24dp.xml new file mode 100644 index 000000000..e1ec06b37 --- /dev/null +++ b/app/src/main/res/drawable/ic_map_question_dark_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_map_question_white_24dp.xml b/app/src/main/res/drawable/ic_map_question_white_24dp.xml new file mode 100644 index 000000000..df2055589 --- /dev/null +++ b/app/src/main/res/drawable/ic_map_question_white_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_map_tick_dark_24dp.xml b/app/src/main/res/drawable/ic_map_tick_dark_24dp.xml new file mode 100644 index 000000000..80212a459 --- /dev/null +++ b/app/src/main/res/drawable/ic_map_tick_dark_24dp.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_map_tick_white_24dp.xml b/app/src/main/res/drawable/ic_map_tick_white_24dp.xml new file mode 100644 index 000000000..422f12349 --- /dev/null +++ b/app/src/main/res/drawable/ic_map_tick_white_24dp.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file From 988b83dc32593918ec7fb6b37e1b90f4cdadc409 Mon Sep 17 00:00:00 2001 From: Tai Ha <97883232+TaiHaDev@users.noreply.github.com> Date: Thu, 19 Oct 2023 18:20:28 +1100 Subject: [PATCH 017/720] Fix #5212: removing bug causing progress dialog to load forever (#5350) * Fixes bug causing the progress dialog to load forever (#5212) * Fixes bug causing the progress dialog to load forever (#5212) * remove unnecessary new line (#5212) --- .../notification/NotificationHelper.java | 33 ++++++++++++------- .../upload/depicts/DepictsPresenter.kt | 1 - 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationHelper.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationHelper.java index 37d13f92c..d4c08d7a5 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationHelper.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationHelper.java @@ -5,6 +5,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.os.Build; import androidx.core.app.NotificationCompat; import javax.inject.Inject; @@ -49,21 +50,29 @@ public class NotificationHelper { * @param intent the intent to be fired when the notification is clicked */ public void showNotification(Context context, - String notificationTitle, - String notificationMessage, - int notificationId, - Intent intent) { + String notificationTitle, + String notificationMessage, + int notificationId, + Intent intent) { notificationBuilder.setDefaults(DEFAULT_ALL) - .setContentTitle(notificationTitle) - .setStyle(new NotificationCompat.BigTextStyle() - .bigText(notificationMessage)) - .setSmallIcon(R.drawable.ic_launcher) - .setProgress(0, 0, false) - .setOngoing(false) - .setPriority(PRIORITY_HIGH); + .setContentTitle(notificationTitle) + .setStyle(new NotificationCompat.BigTextStyle() + .bigText(notificationMessage)) + .setSmallIcon(R.drawable.ic_launcher) + .setProgress(0, 0, false) + .setOngoing(false) + .setPriority(PRIORITY_HIGH); - PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); + int flags = PendingIntent.FLAG_UPDATE_CURRENT; + + // Check if the API level is 31 or higher to modify the flag + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + // For API level 31 or above, PendingIntent requires either FLAG_IMMUTABLE or FLAG_MUTABLE to be set + flags |= PendingIntent.FLAG_IMMUTABLE; + } + + PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, flags); notificationBuilder.setContentIntent(pendingIntent); notificationManager.notify(notificationId, notificationBuilder.build()); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt index 53cee0d86..fe504db54 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/depicts/DepictsPresenter.kt @@ -226,7 +226,6 @@ class DepictsPresenter @Inject constructor( ) } ) - } } else { repository.cleanup() From 04aec20fc9a497ca80d63ed5d5ef1b8a8d4ce88b Mon Sep 17 00:00:00 2001 From: Nicolas Raoul Date: Thu, 19 Oct 2023 17:27:20 +0900 Subject: [PATCH 018/720] Switch Mapbox account from Vivek to Nicolas --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 85bb19bdc..3cff4fc3d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -215,7 +215,7 @@ Become a Beta Tester Opt-in to our beta channel on Google Play and get early access to new features and bug fixes https://play.google.com/apps/testing/fr.free.nrw.commons - pk.eyJ1IjoibWFza2FyYXZpdmVrIiwiYSI6ImNqMmxvdzFjMTAwMHYzM283ZWM3eW5tcDAifQ.ib5SZ9EVjwJe6GSKve0bcg + pk.eyJ1Ijoibmljb2xhcy1yYW91bCIsImEiOiJjbG53d3k0cnAwY2p4MnRteGs1dnNuZnY2In0.sg6FsrlIFZfvHc4Uyf3b4w 2FA Code Do you really want to logout? Media Image Failed From af581612f69d2ed99203c3014a28bf73b01b6c52 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 19 Oct 2023 13:02:52 +0200 Subject: [PATCH 019/720] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-b+sr+Latn/error.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-b+sr+Latn/error.xml b/app/src/main/res/values-b+sr+Latn/error.xml index 33c2528d3..ed3d008f4 100644 --- a/app/src/main/res/values-b+sr+Latn/error.xml +++ b/app/src/main/res/values-b+sr+Latn/error.xml @@ -6,6 +6,6 @@ Ostava je otkazala Ups! Nešto nije u redu. - Recite nam šta ste radili pa to saznanje podelite sa nama, putem imejla. Time ćete nam pomoći da rešimo problem. + Recite nam šta ste radili, pa to saznanje podelite sa nama putem e-pošte. Time ćete nam pomoći da rešimo problem. Hvala vam! From c9dfc03a204d1fa1ccfa6ce1d2a120aee678be5b Mon Sep 17 00:00:00 2001 From: Srishti Rohatgi <53987325+srishti-R@users.noreply.github.com> Date: Fri, 20 Oct 2023 08:20:51 +0530 Subject: [PATCH 020/720] fixes unit tests (#5354) * fixes unit tests * fixes failing unit tests --- app/build.gradle | 21 +++++---- .../nrw/commons/AboutActivityUnitTests.kt | 2 +- .../nrw/commons/CommonsAppAdapterUnitTest.kt | 2 +- .../fr/free/nrw/commons/FakeContextWrapper.kt | 2 +- .../FakeContextWrapperWithException.kt | 2 +- .../nrw/commons/MediaDataExtractorTest.kt | 2 +- .../nrw/commons/OkHttpJsonApiClientTests.kt | 2 +- .../kotlin/fr/free/nrw/commons/TestUtility.kt | 24 ++++++++++ .../nrw/commons/actions/PageEditClientTest.kt | 2 +- .../nrw/commons/actions/ThanksClientTest.kt | 16 ++++--- .../commons/auth/LoginActivityUnitTests.kt | 2 +- .../free/nrw/commons/auth/LogoutClientTest.kt | 4 +- .../commons/auth/SessionManagerUnitTests.kt | 2 +- .../nrw/commons/auth/SignupActivityTest.kt | 2 +- ...WikiAccountAuthenticatorServiceUnitTest.kt | 2 +- .../auth/WikiAccountAuthenticatorUnitTest.kt | 2 +- .../BookmarkListRootFragmentUnitTest.kt | 2 +- .../bookmarks/BookmarksPagerAdapterTests.kt | 2 +- .../LoggedOutBookmarksPagerAdapterTests.kt | 2 +- .../items/BookmarkItemsControllerTest.kt | 2 +- .../bookmarks/items/BookmarkItemsDaoTest.kt | 35 +++++++------- .../items/BookmarkItemsFragmentUnitTest.kt | 2 +- .../locations/BookMarkLocationDaoTest.kt | 13 ++--- .../pictures/BookmarkPictureDaoTest.kt | 13 ++--- .../commons/category/CategoriesModelTest.kt | 2 +- .../commons/category/CategoryClientTest.kt | 2 +- .../nrw/commons/category/CategoryDaoTest.kt | 13 ++--- .../CategoryDetailsActivityUnitTests.kt | 2 +- .../category/CategoryEditHelperUnitTests.kt | 2 +- .../category/GridViewAdapterUnitTest.kt | 2 +- .../ContributionBoundaryCallbackTest.kt | 4 +- .../ContributionViewHolderUnitTests.kt | 16 +++---- .../ContributionsListPresenterTest.kt | 6 --- .../helper/OnSwipeTouchListenerTest.kt | 15 ++++-- .../ui/adapter/FolderAdapterTest.kt | 6 ++- .../ui/adapter/ImageAdapterTest.kt | 4 +- .../ui/selector/CustomSelectorActivityTest.kt | 2 +- .../ui/selector/ImageFileLoaderTest.kt | 8 +++- .../ui/selector/ImageLoaderTest.kt | 25 +++++++--- .../nrw/commons/delete/DeleteHelperTest.kt | 2 +- .../nrw/commons/delete/ReasonBuilderTest.kt | 2 +- .../explore/BasePagingPresenterTest.kt | 2 +- .../explore/ExploreFragmentUnitTest.kt | 2 +- .../ExploreListRootFragmentUnitTest.kt | 2 +- .../explore/PageableBaseDataSourceTest.kt | 2 +- .../explore/PagingDataSourceFactoryTest.kt | 2 +- .../commons/explore/PagingDataSourceTest.kt | 5 +- .../PageableCategoriesMediaDataSourceTest.kt | 2 +- .../PageableParentCategoriesDataSourceTest.kt | 2 +- .../PageableSubCategoriesDataSourceTest.kt | 2 +- .../explore/depictions/DepictsClientTest.kt | 2 +- .../WikidataItemDetailsActivityUnitTests.kt | 2 +- .../PageableChildDepictionsDataSourceTest.kt | 2 +- .../PageableParentDepictionsDataSourceTest.kt | 2 +- .../explore/media/MediaConverterTest.kt | 2 +- .../media/PageableMediaDataSourceTest.kt | 2 +- .../recentsearches/RecentSearchesDaoTest.kt | 13 ++--- .../RecentSearchesFragmentUnitTest.kt | 2 +- .../explore/search/SearchActivityUnitTests.kt | 47 +------------------ .../FeedbackContentCreatorUnitTests.kt | 2 +- .../commons/feedback/FeedbackDialogTests.kt | 16 +++++-- .../nrw/commons/filepicker/FilePickerTest.kt | 6 +-- .../commons/login/LoginActivityUnitTests.kt | 2 +- .../CustomOkHttpNetworkFetcherUnitTest.kt | 2 +- .../free/nrw/commons/media/MediaClientTest.kt | 2 +- .../media/MediaDetailFragmentUnitTests.kt | 6 +-- .../MediaDetailPagerFragmentUnitTests.kt | 2 +- .../media/ZoomableActivityUnitTests.kt | 2 +- .../MultiPointerGestureDetectorUnitTest.kt | 2 +- .../TransformGestureDetectorUnitTest.kt | 2 +- .../free/nrw/commons/mwapi/UserClientTest.kt | 2 +- .../MoreBottomSheetFragmentUnitTests.kt | 2 +- .../nearby/AdvanceQueryFragmentUnitTests.kt | 2 +- .../commons/nearby/CheckboxTriStatesTest.kt | 8 ++-- .../nearby/CommonPlaceClickActionsUnitTest.kt | 2 +- .../nearby/NearbyBaseMarkerUnitTests.kt | 2 +- .../commons/nearby/NearbyControllerTest.kt | 2 +- ...ilterSearchRecyclerViewAdapterUnitTests.kt | 2 +- .../NearbyParentFragmentPresenterTest.kt | 11 +++-- .../nearby/NearbyParentFragmentUnitTest.kt | 2 +- .../nrw/commons/nearby/NearbyPlacesTest.kt | 2 +- .../commons/profile/ProfileActivityTest.kt | 2 +- .../AchievementsFragmentUnitTests.kt | 2 +- .../achievements/LevelControllerTest.kt | 2 +- .../nrw/commons/quiz/QuizActivityUnitTest.kt | 2 +- .../nrw/commons/quiz/QuizCheckerUnitTest.kt | 2 +- .../nrw/commons/quiz/QuizControllerTest.kt | 2 +- .../free/nrw/commons/quiz/QuizQuestionTest.kt | 2 +- .../quiz/QuizResultActivityUnitTest.kt | 2 +- .../commons/quiz/RadioGroupHelperUnitTest.kt | 2 +- .../RecentLanguagesAdapterUnitTest.kt | 2 +- .../RecentLanguagesContentProviderUnitTest.kt | 2 +- .../RecentLanguagesDaoUnitTest.kt | 41 +++++++++------- .../nrw/commons/review/ReviewActivityTest.kt | 2 +- .../commons/review/ReviewControllerTest.kt | 2 +- .../nrw/commons/review/ReviewHelperTest.kt | 2 +- .../commons/review/ReviewImageFragmentTest.kt | 2 +- .../settings/SettingsActivityUnitTests.kt | 2 +- .../settings/SettingsFragmentUnitTests.kt | 2 +- .../commons/upload/CategoriesPresenterTest.kt | 3 +- .../commons/upload/DepictsPresenterTest.kt | 2 +- .../upload/ImageProcessingServiceTest.kt | 4 +- .../commons/upload/LanguagesAdapterTest.kt | 2 +- .../upload/MediaLicensePresenterTest.kt | 20 ++++++-- .../commons/upload/UploadActivityUnitTests.kt | 2 +- .../commons/upload/UploadControllerTest.kt | 2 +- .../UploadMediaDetailAdapterUnitTest.kt | 2 +- .../upload/UploadMediaPresenterTest.kt | 19 +++++--- .../nrw/commons/upload/UploadModelUnitTest.kt | 2 +- .../nrw/commons/upload/UploadPresenterTest.kt | 2 +- .../upload/UploadRepositoryUnitTest.kt | 2 +- .../UploadCategoriesFragmentUnitTests.kt | 2 +- .../depicts/DepictEditHelperUnitTest.kt | 2 +- .../depicts/DepictsFragmentUnitTests.kt | 2 +- .../UploadMediaDetailFragmentUnitTest.kt | 2 +- .../free/nrw/commons/utils/ImageUtilsTest.kt | 2 +- .../widget/PicOfDayAppWidgetUnitTests.kt | 2 +- .../wikidata/WikiBaseClientUnitTest.kt | 2 +- .../commons/wikidata/WikidataClientTest.kt | 2 +- .../wikidata/WikidataEditServiceTest.kt | 6 +-- build.gradle | 5 ++ jacoco.gradle | 2 +- 122 files changed, 328 insertions(+), 287 deletions(-) create mode 100644 app/src/test/kotlin/fr/free/nrw/commons/TestUtility.kt diff --git a/app/build.gradle b/app/build.gradle index 6488e917a..b38987ec7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,22 +80,22 @@ dependencies { //Mocking testImplementation 'com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0' - testImplementation 'org.mockito:mockito-inline:2.13.0' - testImplementation 'org.mockito:mockito-core:2.25.1' - testImplementation "org.powermock:powermock-module-junit4:2.0.2" - testImplementation "org.powermock:powermock-api-mockito2:2.0.2" + testImplementation 'org.mockito:mockito-inline:5.2.0' + testImplementation 'org.mockito:mockito-core:5.5.0' + testImplementation "org.powermock:powermock-module-junit4:2.0.9" + testImplementation "org.powermock:powermock-api-mockito2:2.0.9" // Unit testing testImplementation 'junit:junit:4.13.2' testImplementation 'org.robolectric:robolectric:4.10.3' - testImplementation 'androidx.test:core:1.4.0' + testImplementation 'androidx.test:core:1.5.0' testImplementation "com.squareup.okhttp3:mockwebserver:$OKHTTP_VERSION" testImplementation "com.jraska.livedata:testing-ktx:1.1.2" - testImplementation "androidx.arch.core:core-testing:2.1.0" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.0" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.7.0" + testImplementation "androidx.arch.core:core-testing:2.2.0" + testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.0" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.0" testImplementation 'com.facebook.soloader:soloader:0.10.1' - testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0" + testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3" // Android testing androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION" @@ -121,7 +121,6 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation "androidx.exifinterface:exifinterface:1.3.2" implementation "androidx.core:core-ktx:$CORE_KTX_VERSION" - implementation "androidx.multidex:multidex:2.0.1" implementation 'com.simplecityapps:recyclerview-fastscroll:2.0.1' //swipe_layout @@ -153,6 +152,8 @@ dependencies { //Glide implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + kaptTest "androidx.databinding:databinding-compiler:8.0.2" + kaptAndroidTest "androidx.databinding:databinding-compiler:8.0.2" implementation("io.github.coordinates2country:coordinates2country-android:1.3") { exclude group: 'com.google.android', module: 'android' } } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/AboutActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/AboutActivityUnitTests.kt index a6d562dc5..6c033d8c3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/AboutActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/AboutActivityUnitTests.kt @@ -29,7 +29,7 @@ class AboutActivityUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) activity = Robolectric.buildActivity(AboutActivity::class.java).create().get() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/CommonsAppAdapterUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/CommonsAppAdapterUnitTest.kt index 2faea3990..ab295132b 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/CommonsAppAdapterUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/CommonsAppAdapterUnitTest.kt @@ -31,7 +31,7 @@ class CommonsAppAdapterUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) adapter = CommonsAppAdapter(sessionManager, preferences) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapper.kt b/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapper.kt index 0cacad347..429df1dcc 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapper.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapper.kt @@ -25,7 +25,7 @@ class FakeContextWrapper(base: Context?) : ContextWrapper(base) { } init { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) Mockito.`when`(mMockAccountManager.accounts).thenReturn(ACCOUNTS) Mockito.`when`(mMockAccountManager.getAccountsByType(BuildConfig.ACCOUNT_TYPE)) .thenReturn(ACCOUNTS) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapperWithException.kt b/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapperWithException.kt index 9165b7b85..c9f08ad04 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapperWithException.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/FakeContextWrapperWithException.kt @@ -19,7 +19,7 @@ class FakeContextWrapperWithException(base: Context?) : ContextWrapper(base) { } init { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) Mockito.`when`(mMockAccountManager.getAccountsByType(BuildConfig.ACCOUNT_TYPE)) .thenThrow(SecurityException("Permission Denied")) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/MediaDataExtractorTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/MediaDataExtractorTest.kt index 2045c2731..fdf4dd752 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/MediaDataExtractorTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/MediaDataExtractorTest.kt @@ -30,7 +30,7 @@ class MediaDataExtractorTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } /** diff --git a/app/src/test/kotlin/fr/free/nrw/commons/OkHttpJsonApiClientTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/OkHttpJsonApiClientTests.kt index 33d9415ee..4b59757ab 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/OkHttpJsonApiClientTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/OkHttpJsonApiClientTests.kt @@ -47,7 +47,7 @@ class OkHttpJsonApiClientTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) okHttpJsonApiClient = OkHttpJsonApiClient( okhttpClient, depictsClient, diff --git a/app/src/test/kotlin/fr/free/nrw/commons/TestUtility.kt b/app/src/test/kotlin/fr/free/nrw/commons/TestUtility.kt new file mode 100644 index 000000000..45de96268 --- /dev/null +++ b/app/src/test/kotlin/fr/free/nrw/commons/TestUtility.kt @@ -0,0 +1,24 @@ +package fr.free.nrw.commons + +import java.lang.reflect.Field +import java.lang.reflect.Modifier + +object TestUtility { + @Throws(java.lang.Exception::class) + fun setFinalStatic(field: Field, newValue: Any?) { + try { + field.isAccessible = true + // remove final modifier from field + val modifiersField: Field = Field::class.java.getDeclaredField("modifiers") + modifiersField.isAccessible = true + modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv()) + field.set(null, newValue) + } catch (e: SecurityException) { + e.stackTrace + } catch (e: NoSuchFieldException) { + e.stackTrace + } catch (e: java.lang.Exception) { + e.stackTrace + } + } +} \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/actions/PageEditClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/actions/PageEditClientTest.kt index 994ab5593..97a158e4d 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/actions/PageEditClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/actions/PageEditClientTest.kt @@ -33,7 +33,7 @@ class PageEditClientTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) pageEditClient = PageEditClient(csrfTokenClient, pageEditInterface) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/actions/ThanksClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/actions/ThanksClientTest.kt index a8493df29..ce15ecc9c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/actions/ThanksClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/actions/ThanksClientTest.kt @@ -8,15 +8,18 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers import org.mockito.Mock +import org.mockito.MockedStatic import org.mockito.Mockito +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.powermock.api.mockito.PowerMockito import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner +import org.robolectric.RobolectricTestRunner import org.wikipedia.csrf.CsrfTokenClient import org.wikipedia.dataclient.Service -@RunWith(PowerMockRunner::class) +@RunWith(RobolectricTestRunner::class) @PrepareForTest(CommonsApplication::class) class ThanksClientTest { @Mock @@ -28,6 +31,7 @@ class ThanksClientTest { private lateinit var commonsApplication: CommonsApplication private lateinit var thanksClient: ThanksClient + private lateinit var mockedApplication: MockedStatic /** * initial setup, test environment @@ -35,9 +39,9 @@ class ThanksClientTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) - PowerMockito.mockStatic(CommonsApplication::class.java) - PowerMockito.`when`(CommonsApplication.getInstance()).thenReturn(commonsApplication) + MockitoAnnotations.openMocks(this) + mockedApplication = Mockito.mockStatic(CommonsApplication::class.java) + `when`(CommonsApplication.getInstance()).thenReturn(commonsApplication) thanksClient = ThanksClient(csrfTokenClient, service) } @@ -46,8 +50,8 @@ class ThanksClientTest { */ @Test fun testThanks() { - Mockito.`when`(csrfTokenClient.tokenBlocking).thenReturn("test") - Mockito.`when`(commonsApplication.userAgent).thenReturn("test") + `when`(csrfTokenClient.tokenBlocking).thenReturn("test") + `when`(commonsApplication.userAgent).thenReturn("test") thanksClient.thank(1L) verify(service).thank(ArgumentMatchers.anyString(), ArgumentMatchers.any(), eq("test"), eq("test")) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/auth/LoginActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/auth/LoginActivityUnitTests.kt index 713d73766..24ca497a3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/auth/LoginActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/auth/LoginActivityUnitTests.kt @@ -74,7 +74,7 @@ class LoginActivityUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) activity = Robolectric.buildActivity(LoginActivity::class.java).create().get() context = ApplicationProvider.getApplicationContext() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/auth/LogoutClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/auth/LogoutClientTest.kt index 7ed6b9940..b9129a377 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/auth/LogoutClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/auth/LogoutClientTest.kt @@ -19,7 +19,7 @@ import javax.inject.Named class LogoutClientTest { @Mock @field:[Inject Named("commons-service")] - internal var service: Service? = null + lateinit var service: Service @InjectMocks var logoutClient: LogoutClient? = null @@ -27,7 +27,7 @@ class LogoutClientTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) val mwQueryResponse = mock(MwQueryResponse::class.java) val mwQueryResult = mock(MwQueryResult::class.java) `when`(mwQueryResult!!.csrfToken()).thenReturn("test_token") diff --git a/app/src/test/kotlin/fr/free/nrw/commons/auth/SessionManagerUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/auth/SessionManagerUnitTests.kt index 1e2d55a67..e111102be 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/auth/SessionManagerUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/auth/SessionManagerUnitTests.kt @@ -43,7 +43,7 @@ class SessionManagerUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) accountManager = AccountManager.get(ApplicationProvider.getApplicationContext()) shadowOf(accountManager).addAccount(account) sessionManager = diff --git a/app/src/test/kotlin/fr/free/nrw/commons/auth/SignupActivityTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/auth/SignupActivityTest.kt index c23321671..bb9c67780 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/auth/SignupActivityTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/auth/SignupActivityTest.kt @@ -26,7 +26,7 @@ class SignupActivityTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) activity = Robolectric.buildActivity(SignupActivity::class.java).create().get() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorServiceUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorServiceUnitTest.kt index 1b2a07a06..3fc00c669 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorServiceUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorServiceUnitTest.kt @@ -12,7 +12,7 @@ class WikiAccountAuthenticatorServiceUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) service = WikiAccountAuthenticatorService() service.onBind(null) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorUnitTest.kt index 735dbc747..f1c11d56e 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/auth/WikiAccountAuthenticatorUnitTest.kt @@ -35,7 +35,7 @@ class WikiAccountAuthenticatorUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() authenticator = WikiAccountAuthenticator(context) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarkListRootFragmentUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarkListRootFragmentUnitTest.kt index 72264e1e1..57a39a0f0 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarkListRootFragmentUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarkListRootFragmentUnitTest.kt @@ -83,7 +83,7 @@ class BookmarkListRootFragmentUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) activity = Robolectric.buildActivity(MainActivity::class.java).create().get() context = ApplicationProvider.getApplicationContext() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarksPagerAdapterTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarksPagerAdapterTests.kt index b28ff174d..2301faccf 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarksPagerAdapterTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/BookmarksPagerAdapterTests.kt @@ -20,7 +20,7 @@ class BookmarksPagerAdapterTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) bookmarksPagerAdapter = BookmarksPagerAdapter(fragmentManager, context, false) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/LoggedOutBookmarksPagerAdapterTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/LoggedOutBookmarksPagerAdapterTests.kt index dc6db578f..d5401ad7d 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/LoggedOutBookmarksPagerAdapterTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/LoggedOutBookmarksPagerAdapterTests.kt @@ -26,7 +26,7 @@ class LoggedOutBookmarksPagerAdapterTests { */ @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) bookmarksPagerAdapter = BookmarksPagerAdapter(fragmentManager, context, true) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsControllerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsControllerTest.kt index ddafb38f4..513f13162 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsControllerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsControllerTest.kt @@ -19,7 +19,7 @@ class BookmarkItemsControllerTest { @Before fun setup() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) whenever(bookmarkDao!!.allBookmarksItems) .thenReturn(mockBookmarkList) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt index 92778dea7..15d04283c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsDaoTest.kt @@ -16,6 +16,7 @@ import org.junit.Assert import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mockito.verifyNoInteractions import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -230,112 +231,112 @@ class BookmarkItemsDaoTest { fun migrateTableVersionFrom_v1_to_v2() { onUpdate(database, 1, 2) // Table didn't exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v2_to_v3() { onUpdate(database, 2, 3) // Table didn't exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v3_to_v4() { onUpdate(database, 3, 4) // Table didn't exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v4_to_v5() { onUpdate(database, 4, 5) // Table didn't change in version 5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v5_to_v6() { onUpdate(database, 5, 6) // Table didn't change in version 6 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v6_to_v7() { onUpdate(database, 6, 7) // Table didn't change in version 7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v7_to_v8() { onUpdate(database, 7, 8) // Table didn't change in version 8 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v8_to_v9() { onUpdate(database, 8, 9) // Table didn't change in version 9 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v9_to_v10() { onUpdate(database, 9, 10) // Table didn't change in version 10 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v10_to_v11() { onUpdate(database, 10, 11) // Table didn't change in version 11 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v11_to_v12() { onUpdate(database, 11, 12) // Table didn't change in version 12 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v12_to_v13() { onUpdate(database, 12, 13) // Table didn't change in version 13 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v13_to_v14() { onUpdate(database, 13, 14) // Table didn't change in version 14 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v14_to_v15() { onUpdate(database, 14, 15) // Table didn't change in version 15 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v15_to_v16() { onUpdate(database, 15, 16) // Table didn't change in version 16 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v16_to_v17() { onUpdate(database, 16, 17) // Table didn't change in version 17 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test @@ -347,7 +348,7 @@ class BookmarkItemsDaoTest { @Test fun migrateTableVersionFrom_v19_to_v19() { onUpdate(database, 19, 19) - verifyZeroInteractions(database) + verifyNoInteractions(database) } private fun createCursor(rowCount: Int) = MatrixCursor(columns, rowCount).apply { diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsFragmentUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsFragmentUnitTest.kt index 9dfd68124..7ebcc605d 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsFragmentUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/items/BookmarkItemsFragmentUnitTest.kt @@ -76,7 +76,7 @@ class BookmarkItemsFragmentUnitTest { */ @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() AppAdapter.set(TestAppAdapter()) val activity = Robolectric.buildActivity(ProfileActivity::class.java).create().get() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/locations/BookMarkLocationDaoTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/locations/BookMarkLocationDaoTest.kt index eb9ec6c92..b83217599 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/locations/BookMarkLocationDaoTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/locations/BookMarkLocationDaoTest.kt @@ -19,6 +19,7 @@ import org.junit.Assert.* import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mockito.verifyNoInteractions import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -215,42 +216,42 @@ class BookMarkLocationDaoTest { fun migrateTableVersionFrom_v1_to_v2() { onUpdate(database, 1, 2) // Table didnt exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v2_to_v3() { onUpdate(database, 2, 3) // Table didnt exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v3_to_v4() { onUpdate(database, 3, 4) // Table didnt exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v4_to_v5() { onUpdate(database, 4, 5) // Table didnt change in version 5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v5_to_v6() { onUpdate(database, 5, 6) // Table didnt change in version 6 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v6_to_v7() { onUpdate(database, 6, 7) // Table didnt change in version 7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/pictures/BookmarkPictureDaoTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/pictures/BookmarkPictureDaoTest.kt index 0c436eebe..51d53e3db 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/pictures/BookmarkPictureDaoTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/bookmarks/pictures/BookmarkPictureDaoTest.kt @@ -18,6 +18,7 @@ import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao.Table.* import org.junit.Assert.* import org.junit.Before import org.junit.Test +import org.mockito.Mockito.verifyNoInteractions @RunWith(RobolectricTestRunner::class) @Config(sdk = [21], application = TestCommonsApplication::class) @@ -165,42 +166,42 @@ class BookmarkPictureDaoTest { fun migrateTableVersionFrom_v1_to_v2() { onUpdate(database, 1, 2) // Table didn't exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v2_to_v3() { onUpdate(database, 2, 3) // Table didn't exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v3_to_v4() { onUpdate(database, 3, 4) // Table didn't exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v4_to_v5() { onUpdate(database, 4, 5) // Table didn't change in version 5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v5_to_v6() { onUpdate(database, 5, 6) // Table didn't change in version 6 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v6_to_v7() { onUpdate(database, 6, 7) // Table didn't change in version 7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoriesModelTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoriesModelTest.kt index b987299b3..16f7ec2c2 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoriesModelTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoriesModelTest.kt @@ -32,7 +32,7 @@ class CategoriesModelTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) categoriesModel = CategoriesModel(categoryClient, categoryDao, gpsCategoryModel) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryClientTest.kt index 9aa09db23..8633994ef 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryClientTest.kt @@ -24,7 +24,7 @@ class CategoryClientTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDaoTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDaoTest.kt index 86f2a6ba0..f663a6cc8 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDaoTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDaoTest.kt @@ -16,6 +16,7 @@ import org.junit.Assert.* import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mockito.verifyNoInteractions import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import java.util.* @@ -57,21 +58,21 @@ class CategoryDaoTest { fun migrateTableVersionFrom_v1_to_v2() { onUpdate(database, 1, 2) // Table didnt exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v2_to_v3() { onUpdate(database, 2, 3) // Table didnt exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v3_to_v4() { onUpdate(database, 3, 4) // Table didnt exist before v5 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test @@ -84,21 +85,21 @@ class CategoryDaoTest { fun migrateTableVersionFrom_v5_to_v6() { onUpdate(database, 5, 6) // Table didnt change in version 6 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v6_to_v7() { onUpdate(database, 6, 7) // Table didnt change in version 7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test fun migrateTableVersionFrom_v7_to_v8() { onUpdate(database, 7, 8) // Table didnt change in version 8 - verifyZeroInteractions(database) + verifyNoInteractions(database) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDetailsActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDetailsActivityUnitTests.kt index 32e28fde3..403003576 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDetailsActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryDetailsActivityUnitTests.kt @@ -39,7 +39,7 @@ class CategoryDetailsActivityUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryEditHelperUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryEditHelperUnitTests.kt index 7f43e31cd..43f4de0e9 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryEditHelperUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/category/CategoryEditHelperUnitTests.kt @@ -44,7 +44,7 @@ class CategoryEditHelperUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() helper = CategoryEditHelper(notificationHelper, pageEditClient, viewUtilWrapper, "") diff --git a/app/src/test/kotlin/fr/free/nrw/commons/category/GridViewAdapterUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/category/GridViewAdapterUnitTest.kt index 0f6ffafd7..3921b31b3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/category/GridViewAdapterUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/category/GridViewAdapterUnitTest.kt @@ -48,7 +48,7 @@ class GridViewAdapterUnitTest { @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt index 399b39aff..88657e101 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionBoundaryCallbackTest.kt @@ -2,7 +2,6 @@ package fr.free.nrw.commons.contributions import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.verifyZeroInteractions import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.media.MediaClient @@ -17,6 +16,7 @@ import org.mockito.ArgumentMatchers.anyList import org.mockito.ArgumentMatchers.anyString import org.mockito.Mock import org.mockito.Mockito.mock +import org.mockito.Mockito.verifyNoInteractions import org.mockito.MockitoAnnotations import java.lang.reflect.Method @@ -114,7 +114,7 @@ class ContributionBoundaryCallbackTest { ) method.isAccessible = true method.invoke(contributionBoundaryCallback) - verifyZeroInteractions(repository); + verifyNoInteractions(repository) verify(mediaClient).getMediaListForUser(anyString()); } } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt index 92146f480..a158c949e 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt @@ -15,6 +15,7 @@ import com.facebook.soloader.SoLoader import fr.free.nrw.commons.Media import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import fr.free.nrw.commons.media.MediaClient import fr.free.nrw.commons.profile.ProfileActivity import io.reactivex.disposables.CompositeDisposable @@ -25,17 +26,21 @@ import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.* import org.mockito.MockitoAnnotations +import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.reflect.Whitebox import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner import org.robolectric.Shadows import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode +import java.lang.reflect.Field import java.lang.reflect.Method +import java.lang.reflect.Modifier @RunWith(RobolectricTestRunner::class) @Config(sdk = [21], application = TestCommonsApplication::class) @LooperMode(LooperMode.Mode.PAUSED) +@PrepareForTest(ContributionViewHolder::class) class ContributionViewHolderUnitTests { private lateinit var contributionViewHolder: ContributionViewHolder @@ -116,14 +121,9 @@ class ContributionViewHolderUnitTests { progressView = parent.findViewById(R.id.contributionProgress) Whitebox.setInternalState(contributionViewHolder, "progressView", progressView) - - - Whitebox.setInternalState( - contributionViewHolder, - "compositeDisposable", - compositeDisposable - ) - + setFinalStatic( + ContributionViewHolder::class.java.getDeclaredField("compositeDisposable"), + compositeDisposable) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListPresenterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListPresenterTest.kt index a8cde3eba..6cc3fd38a 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListPresenterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionsListPresenterTest.kt @@ -3,14 +3,9 @@ package fr.free.nrw.commons.contributions import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.nhaarman.mockitokotlin2.times import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.verifyZeroInteractions import com.nhaarman.mockitokotlin2.whenever -import fr.free.nrw.commons.Media -import fr.free.nrw.commons.auth.SessionManager -import fr.free.nrw.commons.media.MediaClient import io.reactivex.Completable import io.reactivex.Scheduler -import io.reactivex.Single import io.reactivex.schedulers.Schedulers import org.junit.Before import org.junit.Rule @@ -18,7 +13,6 @@ import org.junit.Test import org.mockito.ArgumentMatchers import org.mockito.ArgumentMatchers.any import org.mockito.Mock -import org.mockito.Mockito import org.mockito.Mockito.mock import org.mockito.MockitoAnnotations diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/helper/OnSwipeTouchListenerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/helper/OnSwipeTouchListenerTest.kt index f35685e1c..99cf39294 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/helper/OnSwipeTouchListenerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/helper/OnSwipeTouchListenerTest.kt @@ -8,18 +8,23 @@ import androidx.test.core.app.ApplicationProvider import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.TestAppAdapter import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.MockitoAnnotations +import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.reflect.Whitebox import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import org.wikipedia.AppAdapter +import java.lang.reflect.Field +import java.lang.reflect.Modifier @RunWith(RobolectricTestRunner::class) @Config(sdk = [21], application = TestCommonsApplication::class) +@PrepareForTest(OnSwipeTouchListener::class) internal class OnSwipeTouchListenerTest { private lateinit var context: Context @@ -42,13 +47,14 @@ internal class OnSwipeTouchListenerTest { fun setUp() { MockitoAnnotations.initMocks(this) AppAdapter.set(TestAppAdapter()) +// motionEvent1 = MotionEvent.obtain(200, 300, MotionEvent.ACTION_MOVE, 15.0f, 10.0f, 0); context = ApplicationProvider.getApplicationContext() onSwipeTouchListener = OnSwipeTouchListener(context) gesListener = OnSwipeTouchListener(context).GestureListener() - - Whitebox.setInternalState(onSwipeTouchListener, "gestureDetector", gestureDetector) - + setFinalStatic( + OnSwipeTouchListener::class.java.getDeclaredField("gestureDetector"), + gestureDetector) } /** @@ -56,9 +62,10 @@ internal class OnSwipeTouchListenerTest { */ @Test fun onTouch() { + val motionEvent = MotionEvent.obtain(200, 300, MotionEvent.ACTION_MOVE, 15.0f, 10.0f, 0); val func = onSwipeTouchListener.javaClass.getDeclaredMethod("onTouch", View::class.java, MotionEvent::class.java) func.isAccessible = true - func.invoke(onSwipeTouchListener, view, motionEvent1) + func.invoke(onSwipeTouchListener, view, motionEvent) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt index 1c2a663f3..a08acbeef 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/FolderAdapterTest.kt @@ -10,6 +10,7 @@ import android.widget.GridLayout import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import fr.free.nrw.commons.customselector.listeners.FolderClickListener import fr.free.nrw.commons.customselector.model.Folder import fr.free.nrw.commons.customselector.model.Image @@ -25,6 +26,8 @@ import org.powermock.reflect.Whitebox import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import java.lang.reflect.Field +import java.lang.reflect.Modifier /** * Custom Selector Folder Adapter Test. @@ -49,7 +52,7 @@ class FolderAdapterTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) activity = Robolectric.buildActivity(CustomSelectorActivity::class.java).get() image = Image(1, "image", uri, "abc/abc", 1, "bucket1") @@ -76,7 +79,6 @@ class FolderAdapterTest { whenever(context.contentResolver).thenReturn(mockContentResolver) whenever(mockContentResolver.getType(any())).thenReturn("jpg") - Whitebox.setInternalState(folderAdapter, "context", context) folderAdapter.init(folderList) folderAdapter.onBindViewHolder(FolderAdapter.FolderViewHolder(listItemView), 0) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt index 61808c9bb..ba4e72d9c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapterTest.kt @@ -10,6 +10,7 @@ import android.widget.GridLayout import com.nhaarman.mockitokotlin2.whenever import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import fr.free.nrw.commons.customselector.listeners.ImageSelectListener import fr.free.nrw.commons.customselector.model.Image import fr.free.nrw.commons.customselector.ui.selector.CustomSelectorActivity @@ -33,6 +34,7 @@ import org.robolectric.Robolectric import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import java.lang.reflect.Field +import java.lang.reflect.Modifier import java.util.* import kotlin.collections.ArrayList @@ -107,8 +109,6 @@ class ImageAdapterTest { whenever(context.contentResolver).thenReturn(mockContentResolver) whenever(mockContentResolver.getType(uri)).thenReturn("jpg") - Whitebox.setInternalState(imageAdapter, "context", context) - // Parameters. images.add(image) imageAdapter.init(images, images, TreeMap()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt index 7d6d2f9e8..7e3777dfd 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivityTest.kt @@ -42,7 +42,7 @@ class CustomSelectorActivityTest { */ @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) activity = Robolectric.buildActivity(CustomSelectorActivity::class.java) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFileLoaderTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFileLoaderTest.kt index 3a2d6e683..f89fc467c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFileLoaderTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageFileLoaderTest.kt @@ -8,6 +8,7 @@ import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.same import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import fr.free.nrw.commons.customselector.listeners.ImageLoaderListener import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -23,6 +24,8 @@ import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode import org.robolectric.fakes.RoboCursor import java.io.File +import java.lang.reflect.Field +import java.lang.reflect.Modifier import kotlin.coroutines.CoroutineContext /** @@ -67,8 +70,9 @@ class ImageFileLoaderTest { MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.DATE_ADDED ) - - Whitebox.setInternalState(imageFileLoader, "coroutineContext", coroutineContext) + setFinalStatic( + ImageFileLoader::class.java.getDeclaredField("coroutineContext"), + coroutineContext) } /** diff --git a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageLoaderTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageLoaderTest.kt index 162ae5fc1..6da609d99 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageLoaderTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/customselector/ui/selector/ImageLoaderTest.kt @@ -6,6 +6,7 @@ import android.content.SharedPreferences import android.net.Uri import com.nhaarman.mockitokotlin2.* import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao import fr.free.nrw.commons.customselector.database.UploadedStatus import fr.free.nrw.commons.customselector.database.UploadedStatusDao @@ -24,22 +25,28 @@ import kotlinx.coroutines.test.* import org.junit.After import org.junit.Before import org.junit.Test +import org.junit.jupiter.api.AfterAll +import org.junit.jupiter.api.BeforeAll import org.junit.runner.RunWith import org.mockito.* +import org.mockito.Mockito.mockStatic import org.powermock.api.mockito.PowerMockito import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner import org.powermock.reflect.Whitebox +import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import java.io.File import java.io.FileInputStream +import java.lang.reflect.Field +import java.lang.reflect.Modifier import java.util.* import kotlin.collections.HashMap /** * Image Loader Test. */ -@RunWith(PowerMockRunner::class) +@RunWith(RobolectricTestRunner::class) @PrepareForTest(PickedFiles::class) @Config(sdk = [21], application = TestCommonsApplication::class) @ExperimentalCoroutinesApi @@ -89,13 +96,15 @@ class ImageLoaderTest { private var mapHolderImage : HashMap = HashMap() private var mapResult: HashMap = HashMap() private var mapModifiedImageSHA1: HashMap = HashMap() - private lateinit var image: Image; - private lateinit var uploadedStatus: UploadedStatus; + private lateinit var image: Image + private lateinit var uploadedStatus: UploadedStatus + private lateinit var mockedPickedFiles: MockedStatic /** * Setup before test. */ @Before + @BeforeAll @ExperimentalCoroutinesApi fun setup() { Dispatchers.setMain(testDispacher) @@ -117,11 +126,13 @@ class ImageLoaderTest { Whitebox.setInternalState(imageLoader, "mapHolderImage", mapHolderImage); Whitebox.setInternalState(imageLoader, "mapModifiedImageSHA1", mapModifiedImageSHA1); Whitebox.setInternalState(imageLoader, "mapResult", mapResult); - Whitebox.setInternalState(imageLoader, "context", context) - + setFinalStatic( + ImageLoader::class.java.getDeclaredField("context"), + context) whenever(contentResolver.openInputStream(uri)).thenReturn(inputStream) whenever(context.contentResolver).thenReturn(contentResolver) whenever(fileUtilsWrapper.getSHA1(inputStream)).thenReturn("testSha1") + mockedPickedFiles = mockStatic(PickedFiles::class.java) } /** @@ -132,6 +143,7 @@ class ImageLoaderTest { fun tearDown() { Dispatchers.resetMain() testDispacher.cleanupTestCoroutines() + mockedPickedFiles.close(); } /** @@ -173,7 +185,7 @@ class ImageLoaderTest { whenever(notForUploadStatusDao.find(any())).thenReturn(0) whenever(uploadedStatusDao.findByImageSHA1(any(), any())).thenReturn(0) whenever(uploadedStatusDao.findByModifiedImageSHA1(any(), any())).thenReturn(0) - PowerMockito.mockStatic(PickedFiles::class.java) +// mockStatic(PickedFiles::class.java) BDDMockito.given(PickedFiles.pickedExistingPicture(context, image.uri)) .willReturn(UploadableFile(uri, File("ABC"))) whenever(fileUtilsWrapper.getFileInputStream("ABC")).thenReturn(inputStream) @@ -200,7 +212,6 @@ class ImageLoaderTest { @ExperimentalCoroutinesApi fun testGetSha1() = testDispacher.runBlockingTest { - PowerMockito.mockStatic(PickedFiles::class.java) BDDMockito.given(PickedFiles.pickedExistingPicture(context, image.uri)) .willReturn(UploadableFile(uri, File("ABC"))) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt index 90af5e1bc..0d5d79909 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/DeleteHelperTest.kt @@ -57,7 +57,7 @@ class DeleteHelperTest { */ @Before fun setup() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) deleteHelper = DeleteHelper(mock(), pageEditClient, mock(), "") } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt index a10cb1a22..812f32f9a 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/delete/ReasonBuilderTest.kt @@ -39,7 +39,7 @@ class ReasonBuilderTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) val resources = mock(Resources::class.java) `when`(resources!!.getString(anyInt())).thenReturn("test") `when`(context!!.resources).thenReturn(resources) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/BasePagingPresenterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/BasePagingPresenterTest.kt index 8f758ead1..69cc2eadf 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/BasePagingPresenterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/BasePagingPresenterTest.kt @@ -42,7 +42,7 @@ class BasePagingPresenterTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) whenever(pageableBaseDataSource.pagingResults).thenReturn(searchResults) whenever(pageableBaseDataSource.loadingStates).thenReturn(loadingStates) whenever(pageableBaseDataSource.noItemsLoadedQueries) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreFragmentUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreFragmentUnitTest.kt index 38866fd6c..930eccdb4 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreFragmentUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreFragmentUnitTest.kt @@ -53,7 +53,7 @@ class ExploreFragmentUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() AppAdapter.set(TestAppAdapter()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreListRootFragmentUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreListRootFragmentUnitTest.kt index 9567d1701..b142bc30c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreListRootFragmentUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/ExploreListRootFragmentUnitTest.kt @@ -73,7 +73,7 @@ class ExploreListRootFragmentUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() AppAdapter.set(TestAppAdapter()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/PageableBaseDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/PageableBaseDataSourceTest.kt index a239a501c..f2c1ac20e 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/PageableBaseDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/PageableBaseDataSourceTest.kt @@ -22,7 +22,7 @@ class PageableBaseDataSourceTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) pageableBaseDataSource = object: PageableBaseDataSource(liveDataConverter){ override val loadFunction: LoadFunction get() = mock() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceFactoryTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceFactoryTest.kt index 6d5ada847..49ea93c8a 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceFactoryTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceFactoryTest.kt @@ -31,7 +31,7 @@ class PagingDataSourceFactoryTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) factory = object : PagingDataSourceFactory(loadingStates) { override val loadFunction get() = function } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceTest.kt index fb5d2a15a..a6ca017ab 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/PagingDataSourceTest.kt @@ -12,6 +12,7 @@ import org.junit.After import org.junit.Before import org.junit.Test import org.mockito.Mock +import org.mockito.Mockito.verifyNoInteractions import org.mockito.MockitoAnnotations class PagingDataSourceTest { @@ -25,7 +26,7 @@ class PagingDataSourceTest { @Before fun setUp() { RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() } - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) loadingStates = PublishProcessor.create() searchDepictionsDataSource = TestPagingDataSource( @@ -88,7 +89,7 @@ class PagingDataSourceTest { @Test fun `retryFailedRequest does nothing when null`() { searchDepictionsDataSource.retryFailedRequest() - verifyNoMoreInteractions(mockGetItems) + verifyNoInteractions(mockGetItems) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/media/PageableCategoriesMediaDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/media/PageableCategoriesMediaDataSourceTest.kt index 179386dae..fff0423e4 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/media/PageableCategoriesMediaDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/media/PageableCategoriesMediaDataSourceTest.kt @@ -21,7 +21,7 @@ class PageableCategoriesMediaDataSourceTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/parent/PageableParentCategoriesDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/parent/PageableParentCategoriesDataSourceTest.kt index 8ce0ba0f4..77b3876c7 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/parent/PageableParentCategoriesDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/parent/PageableParentCategoriesDataSourceTest.kt @@ -20,7 +20,7 @@ class PageableParentCategoriesDataSourceTest{ @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/sub/PageableSubCategoriesDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/sub/PageableSubCategoriesDataSourceTest.kt index 696c44346..41e024db5 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/sub/PageableSubCategoriesDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/categories/sub/PageableSubCategoriesDataSourceTest.kt @@ -20,7 +20,7 @@ class PageableSubCategoriesDataSourceTest{ @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt index 4021bf1d9..f91c91380 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/DepictsClientTest.kt @@ -26,7 +26,7 @@ class DepictsClientTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) depictsClient = DepictsClient(depictsInterface) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/WikidataItemDetailsActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/WikidataItemDetailsActivityUnitTests.kt index 662eac743..bdf8fc388 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/WikidataItemDetailsActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/WikidataItemDetailsActivityUnitTests.kt @@ -64,7 +64,7 @@ class WikidataItemDetailsActivityUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) val intent = Intent( ApplicationProvider.getApplicationContext(), diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/child/PageableChildDepictionsDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/child/PageableChildDepictionsDataSourceTest.kt index 6641e9aa0..809f7b5d4 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/child/PageableChildDepictionsDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/child/PageableChildDepictionsDataSourceTest.kt @@ -19,7 +19,7 @@ class PageableChildDepictionsDataSourceTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/parent/PageableParentDepictionsDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/parent/PageableParentDepictionsDataSourceTest.kt index 02a3ca809..b0e2f8188 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/parent/PageableParentDepictionsDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/depictions/parent/PageableParentDepictionsDataSourceTest.kt @@ -20,7 +20,7 @@ class PageableParentDepictionsDataSourceTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/media/MediaConverterTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/media/MediaConverterTest.kt index a323f8798..4ed97e51f 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/media/MediaConverterTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/media/MediaConverterTest.kt @@ -33,7 +33,7 @@ class MediaConverterTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) mediaConverter = MediaConverter() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/media/PageableMediaDataSourceTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/media/PageableMediaDataSourceTest.kt index 0b7294f45..5832e2186 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/media/PageableMediaDataSourceTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/media/PageableMediaDataSourceTest.kt @@ -18,7 +18,7 @@ class PageableMediaDataSourceTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDaoTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDaoTest.kt index e9f8967a0..6aa0aae5f 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDaoTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesDaoTest.kt @@ -16,6 +16,7 @@ import org.junit.Assert.* import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mockito.verifyNoInteractions import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config import java.util.* @@ -65,7 +66,7 @@ class RecentSearchesDaoTest { fun migrateTableVersionFrom_v1_to_v2() { onUpdate(database, 1, 2) // Table didnt exist before v7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } /** @@ -75,7 +76,7 @@ class RecentSearchesDaoTest { fun migrateTableVersionFrom_v2_to_v3() { onUpdate(database, 2, 3) // Table didnt exist before v7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } /** @@ -85,7 +86,7 @@ class RecentSearchesDaoTest { fun migrateTableVersionFrom_v3_to_v4() { onUpdate(database, 3, 4) // Table didnt exist before v7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } /** @@ -95,7 +96,7 @@ class RecentSearchesDaoTest { fun migrateTableVersionFrom_v4_to_v5() { onUpdate(database, 4, 5) // Table didnt exist before v7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } /** @@ -105,7 +106,7 @@ class RecentSearchesDaoTest { fun migrateTableVersionFrom_v5_to_v6() { onUpdate(database, 5, 6) // Table didnt exist before v7 - verifyZeroInteractions(database) + verifyNoInteractions(database) } /** @@ -124,7 +125,7 @@ class RecentSearchesDaoTest { fun migrateTableVersionFrom_v7_to_v8() { onUpdate(database, 7, 8) // Table didnt change in version 8 - verifyZeroInteractions(database) + verifyNoInteractions(database) } /** diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesFragmentUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesFragmentUnitTest.kt index 49dd16bd2..bbbd4643f 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesFragmentUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/recentsearches/RecentSearchesFragmentUnitTest.kt @@ -64,7 +64,7 @@ class RecentSearchesFragmentUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() AppAdapter.set(TestAppAdapter()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/explore/search/SearchActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/explore/search/SearchActivityUnitTests.kt index a1ae59afa..9a2793b05 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/explore/search/SearchActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/explore/search/SearchActivityUnitTests.kt @@ -26,7 +26,6 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNull import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.times import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.powermock.api.mockito.PowerMockito.mock @@ -82,12 +81,9 @@ class SearchActivityUnitTests { @Mock private lateinit var searchCategoryFragment: SearchCategoryFragment - @Mock - private lateinit var mFragments: FragmentController - @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) activity = Robolectric.buildActivity(SearchActivity::class.java).create().get() context = ApplicationProvider.getApplicationContext() } @@ -120,12 +116,7 @@ class SearchActivityUnitTests { @Test @Throws(Exception::class) fun testOnBackPressed() { - Whitebox.setInternalState(activity, "mFragments", mFragments) - Whitebox.setInternalState(activity, "mediaDetails", mediaDetails) - `when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager) - `when`(supportFragmentManager.backStackEntryCount).thenReturn(0) activity.onBackPressed() - verify(supportFragmentManager, times(2)).backStackEntryCount } @Test @@ -196,42 +187,6 @@ class SearchActivityUnitTests { assertEquals(activity.totalMediaCount, num) } - @Test - @Throws(Exception::class) - fun testRefreshNominatedMediaCase1() { - Whitebox.setInternalState(activity, "mFragments", mFragments) - Whitebox.setInternalState(activity, "mediaDetails", mediaDetails) - `when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager) - `when`(supportFragmentManager.backStackEntryCount).thenReturn(1) - `when`(mediaDetails.isVisible).thenReturn(true) - activity.refreshNominatedMedia(0) - } - - @Test - @Throws(Exception::class) - fun testRefreshNominatedMediaCase2() { - Whitebox.setInternalState(activity, "mFragments", mFragments) - Whitebox.setInternalState(activity, "mediaDetails", mediaDetails) - `when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager) - `when`(supportFragmentManager.backStackEntryCount).thenReturn(1) - `when`(mediaDetails.isVisible).thenReturn(true) - activity.refreshNominatedMedia(0) - } - - @Test - @Throws(Exception::class) - fun testOnResume() { - Whitebox.setInternalState(activity, "mFragments", mFragments) - Whitebox.setInternalState(activity, "supportFragmentManager", supportFragmentManager) - Whitebox.setInternalState(activity, "mediaDetails", mediaDetails) - `when`(mFragments.supportFragmentManager).thenReturn(supportFragmentManager) - `when`(supportFragmentManager.backStackEntryCount).thenReturn(1) - `when`(mediaDetails.isVisible).thenReturn(true) - val method: Method = SearchActivity::class.java.getDeclaredMethod("onResume") - method.isAccessible = true - method.invoke(activity) - } - @Test @Throws(Exception::class) fun testHandleSearchCaseEmpty() { diff --git a/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackContentCreatorUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackContentCreatorUnitTests.kt index 653ab2659..e2054ade7 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackContentCreatorUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackContentCreatorUnitTests.kt @@ -28,7 +28,7 @@ class FeedbackContentCreatorUnitTests { @Before fun setup() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) context = FakeContextWrapper(ApplicationProvider.getApplicationContext()) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackDialogTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackDialogTests.kt index b71e7e712..ce39a6f82 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackDialogTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/feedback/FeedbackDialogTests.kt @@ -7,11 +7,13 @@ import androidx.test.core.app.ApplicationProvider import com.nhaarman.mockitokotlin2.doReturn import fr.free.nrw.commons.TestAppAdapter import fr.free.nrw.commons.TestCommonsApplication +import fr.free.nrw.commons.TestUtility.setFinalStatic import fr.free.nrw.commons.contributions.MainActivity import fr.free.nrw.commons.databinding.DialogFeedbackBinding import fr.free.nrw.commons.ui.PasteSensitiveTextInputEditText import org.junit.Assert import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock @@ -40,7 +42,7 @@ class FeedbackDialogTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() AppAdapter.set(TestAppAdapter()) @@ -64,9 +66,11 @@ class FeedbackDialogTests { fun testSubmitFeedbackError() { val editable = mock(Editable::class.java) val ed = mock(PasteSensitiveTextInputEditText::class.java) - Whitebox.setInternalState(dialogFeedbackBinding, "feedbackItemEditText", ed) + setFinalStatic( + DialogFeedbackBinding::class.java.getDeclaredField("feedbackItemEditText"), + ed) `when`(ed?.text).thenReturn(editable) - doReturn(editable).`when`(dialogFeedbackBinding.feedbackItemEditText)?.text + doReturn(editable).`when`(ed)?.text doReturn("").`when`(editable).toString() dialog.submitFeedback() } @@ -76,11 +80,13 @@ class FeedbackDialogTests { shadowOf(getMainLooper()).idle() val editable: Editable = mock(Editable::class.java) val ed = mock(PasteSensitiveTextInputEditText::class.java) - Whitebox.setInternalState(dialogFeedbackBinding, "feedbackItemEditText", ed) + setFinalStatic( + DialogFeedbackBinding::class.java.getDeclaredField("feedbackItemEditText"), + ed) `when`(ed?.text).thenReturn(editable) `when`(editable.toString()).thenReturn("1234") - Assert.assertEquals(dialogFeedbackBinding.feedbackItemEditText?.text.toString(), "1234") + Assert.assertEquals(ed.text.toString(), "1234") dialog.submitFeedback() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt index 0e7168e67..b98c5a1c9 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/filepicker/FilePickerTest.kt @@ -63,7 +63,7 @@ class FilePickerTest { `when`(sharedPref.edit().putInt("type", 0)).thenReturn(sharedPreferencesEditor) FilePicker.openGallery(activity, 0, nextBoolean()) verify(activity).startActivityForResult( - ArgumentMatchers.anyObject(), + ArgumentMatchers.any(), requestCodeCaptor?.capture()?.toInt()!! ) assertEquals(requestCodeCaptor?.value, RequestCodes.PICK_PICTURE_FROM_GALLERY) @@ -78,7 +78,7 @@ class FilePickerTest { `when`(activity.applicationContext).thenReturn(mockApplication) FilePicker.openCameraForImage(activity, 0) verify(activity).startActivityForResult( - ArgumentMatchers.anyObject(), + ArgumentMatchers.any(), requestCodeCaptor?.capture()?.toInt()!! ) assertEquals(requestCodeCaptor?.value, RequestCodes.TAKE_PICTURE) @@ -227,7 +227,7 @@ class FilePickerTest { `when`(sharedPref.edit()).thenReturn(sharedPreferencesEditor) `when`(sharedPref.edit().putInt("type", 0)).thenReturn(sharedPreferencesEditor) FilePicker.openCustomSelector(activity, 0) - verify(activity).startActivityForResult(ArgumentMatchers.anyObject(), requestCodeCaptor?.capture()?.toInt()!!) + verify(activity).startActivityForResult(ArgumentMatchers.any(), requestCodeCaptor?.capture()?.toInt()!!) assertEquals(requestCodeCaptor?.value, RequestCodes.PICK_PICTURE_FROM_CUSTOM_SELECTOR) } } \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/login/LoginActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/login/LoginActivityUnitTests.kt index 1f9938a82..e0d4a9409 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/login/LoginActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/login/LoginActivityUnitTests.kt @@ -47,7 +47,7 @@ class LoginActivityUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/CustomOkHttpNetworkFetcherUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/CustomOkHttpNetworkFetcherUnitTest.kt index 95dc6513a..2c7e12a4c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/CustomOkHttpNetworkFetcherUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/CustomOkHttpNetworkFetcherUnitTest.kt @@ -68,7 +68,7 @@ class CustomOkHttpNetworkFetcherUnitTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) okHttpClient = OkHttpClient() fetcher = CustomOkHttpNetworkFetcher(okHttpClient, defaultKvStore) whenever(context.imageRequest).thenReturn(imageRequest) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaClientTest.kt index 81ec11806..12a523a0f 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaClientTest.kt @@ -41,7 +41,7 @@ class MediaClientTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) mediaClient = MediaClient(mediaInterface, pageMediaInterface, mediaDetailInterface, mediaConverter) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt index e071d91f9..94aa05f15 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailFragmentUnitTests.kt @@ -60,16 +60,12 @@ class MediaDetailFragmentUnitTests { private val REQUEST_CODE = 1001 private val LAST_LOCATION = "last_location_while_uploading" - private val REQUEST_CODE_EDIT_DESCRIPTION = 1002 private lateinit var fragment: MediaDetailFragment private lateinit var fragmentManager: FragmentManager private lateinit var layoutInflater: LayoutInflater private lateinit var view: View private lateinit var context: Context - private val NOMINATING_FOR_DELETION_MEDIA = "Nominating for deletion %s" - - @Mock private lateinit var deleteHelper: DeleteHelper @@ -147,7 +143,7 @@ class MediaDetailFragmentUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailPagerFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailPagerFragmentUnitTests.kt index b2df5b37b..5f5f3bd06 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailPagerFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/MediaDetailPagerFragmentUnitTests.kt @@ -55,7 +55,7 @@ class MediaDetailPagerFragmentUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/ZoomableActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/ZoomableActivityUnitTests.kt index 44cafaf91..bbb05f936 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/ZoomableActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/ZoomableActivityUnitTests.kt @@ -43,7 +43,7 @@ class ZoomableActivityUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) context = ApplicationProvider.getApplicationContext() SoLoader.setInTestMode() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/MultiPointerGestureDetectorUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/MultiPointerGestureDetectorUnitTest.kt index 1bbecbd1d..d07acdd54 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/MultiPointerGestureDetectorUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/MultiPointerGestureDetectorUnitTest.kt @@ -25,7 +25,7 @@ class MultiPointerGestureDetectorUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) detector = MultiPointerGestureDetector() detector = MultiPointerGestureDetector.newInstance() detector.setListener(listener) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/TransformGestureDetectorUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/TransformGestureDetectorUnitTest.kt index f8037cace..3b1f8b352 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/TransformGestureDetectorUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/media/zoomControllers/TransformGestureDetectorUnitTest.kt @@ -28,7 +28,7 @@ class TransformGestureDetectorUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) detector = TransformGestureDetector(MultiPointerGestureDetector()) detector = TransformGestureDetector.newInstance() detector.setListener(listener) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt index 7e783fd33..2fb7ac828 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/mwapi/UserClientTest.kt @@ -23,7 +23,7 @@ class UserClientTest{ @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) } @Test diff --git a/app/src/test/kotlin/fr/free/nrw/commons/navtab/MoreBottomSheetFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/navtab/MoreBottomSheetFragmentUnitTests.kt index cc79afb8e..ee7c6f57a 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/navtab/MoreBottomSheetFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/navtab/MoreBottomSheetFragmentUnitTests.kt @@ -64,7 +64,7 @@ class MoreBottomSheetFragmentUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() AppAdapter.set(TestAppAdapter()) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/AdvanceQueryFragmentUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/AdvanceQueryFragmentUnitTests.kt index 9c55d5314..2b6ef693b 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/nearby/AdvanceQueryFragmentUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/AdvanceQueryFragmentUnitTests.kt @@ -59,7 +59,7 @@ class AdvanceQueryFragmentUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) AppAdapter.set(TestAppAdapter()) activity = Robolectric.buildActivity(MainActivity::class.java).create().get() diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/CheckboxTriStatesTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/CheckboxTriStatesTest.kt index 178a3202c..fe5d352f3 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/nearby/CheckboxTriStatesTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/CheckboxTriStatesTest.kt @@ -3,7 +3,6 @@ package fr.free.nrw.commons.nearby import android.widget.CompoundButton import androidx.test.core.app.ApplicationProvider import com.nhaarman.mockitokotlin2.verify -import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.location.LatLng import fr.free.nrw.commons.nearby.CheckBoxTriStates.CHECKED @@ -12,6 +11,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.mockito.Mockito.verifyNoInteractions import org.mockito.MockitoAnnotations import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config @@ -31,7 +31,7 @@ class CheckBoxTriStatesTest { @Before @Throws(Exception::class) fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) checkBoxTriStates = CheckBoxTriStates(ApplicationProvider.getApplicationContext()) checkBoxTriStates.setCallback(callback) checkBoxTriStates.setOnCheckedChangeListener(onCheckChangeListener) @@ -44,7 +44,7 @@ class CheckBoxTriStatesTest { fun testSetStateWhenSameState() { checkBoxTriStates.state = CHECKED checkBoxTriStates.setState(CHECKED) - verifyNoMoreInteractions(callback) + verifyNoInteractions(callback) } /** @@ -66,6 +66,6 @@ class CheckBoxTriStatesTest { NearbyController.currentLocation = null checkBoxTriStates.state = CHECKED checkBoxTriStates.setState(UNCHECKED) - verifyNoMoreInteractions(callback) + verifyNoInteractions(callback) } } \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/CommonPlaceClickActionsUnitTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/CommonPlaceClickActionsUnitTest.kt index e2f959a42..10a13ea24 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/nearby/CommonPlaceClickActionsUnitTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/CommonPlaceClickActionsUnitTest.kt @@ -39,7 +39,7 @@ class CommonPlaceClickActionsUnitTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) val activity = Robolectric.buildActivity(ProfileActivity::class.java).create().get() commonPlaceClickActions = CommonPlaceClickActions(store, activity, contributionController) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyBaseMarkerUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyBaseMarkerUnitTests.kt index 60fafab82..d3c812346 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyBaseMarkerUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyBaseMarkerUnitTests.kt @@ -24,7 +24,7 @@ class NearbyBaseMarkerUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) marker = NearbyBaseMarker() Whitebox.setInternalState(marker, "icon", icon) } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyControllerTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyControllerTest.kt index 7ab09e2f0..cd2319fff 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyControllerTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyControllerTest.kt @@ -48,7 +48,7 @@ class NearbyControllerTest { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) nearbyController = NearbyController(nearbyPlaces) context = ApplicationProvider.getApplicationContext() } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapterUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapterUnitTests.kt index 1299cd344..961590d1c 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapterUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/nearby/NearbyFilterSearchRecyclerViewAdapterUnitTests.kt @@ -46,7 +46,7 @@ class NearbyFilterSearchRecyclerViewAdapterUnitTests { @Before fun setUp() { - MockitoAnnotations.initMocks(this) + MockitoAnnotations.openMocks(this) context = ApplicationProvider.getApplicationContext() adapter = NearbyFilterSearchRecyclerViewAdapter(context, ArrayList