From 67ac92ff573482fa2efe54b68de2792dda6b11ea Mon Sep 17 00:00:00 2001 From: Sonal Yadav Date: Mon, 17 Mar 2025 04:23:58 +0530 Subject: [PATCH 01/20] Fix NullPointerException in onBackPressed() (#6249) --- .../nrw/commons/contributions/MainActivity.kt | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt index a61567393..a83532bdb 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.kt @@ -387,35 +387,40 @@ after opening the app. } override fun onBackPressed() { - if (contributionsFragment != null && activeFragment == ActiveFragment.CONTRIBUTIONS) { + when (activeFragment) { + ActiveFragment.CONTRIBUTIONS -> { // Means that contribution fragment is visible - if (!contributionsFragment!!.backButtonClicked()) { //If this one does not wan't to handle + if (contributionsFragment?.backButtonClicked() != true) { //If this one does not want to handle // the back press, let the activity do so super.onBackPressed() + } } - } else if (nearbyParentFragment != null && activeFragment == ActiveFragment.NEARBY) { + ActiveFragment.NEARBY -> { // Means that nearby fragment is visible - /* If function nearbyParentFragment.backButtonClick() returns false, it means that the bottomsheet is - not expanded. So if the back button is pressed, then go back to the Contributions tab */ - if (!nearbyParentFragment!!.backButtonClicked()) { - supportFragmentManager.beginTransaction().remove(nearbyParentFragment!!) - .commit() + if (nearbyParentFragment?.backButtonClicked() != true) { + nearbyParentFragment?.let { + supportFragmentManager.beginTransaction().remove(it).commit() + } setSelectedItemId(NavTab.CONTRIBUTIONS.code()) + } } - } else if (exploreFragment != null && activeFragment == ActiveFragment.EXPLORE) { - // Means that explore fragment is visible - if (!exploreFragment!!.onBackPressed()) { - if (applicationKvStore!!.getBoolean("login_skipped")) { + ActiveFragment.EXPLORE -> { + // Explore Fragment is visible + if (exploreFragment?.onBackPressed() != true) { + if (applicationKvStore?.getBoolean("login_skipped") == true) { super.onBackPressed() } else { setSelectedItemId(NavTab.CONTRIBUTIONS.code()) + } } } - } else if (bookmarkFragment != null && activeFragment == ActiveFragment.BOOKMARK) { + ActiveFragment.BOOKMARK -> { // Means that bookmark fragment is visible - bookmarkFragment!!.onBackPressed() - } else { + bookmarkFragment?.onBackPressed() + } + else -> { super.onBackPressed() + } } } From fa0bdf5747169812aae9e0fb0d9b7b37bd9f38d9 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 17 Mar 2025 13:01:37 +0100 Subject: [PATCH 02/20] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-oc/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index c097898e9..f837c4732 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -138,7 +138,7 @@ Mercejaments recebuts Paramètres Per defaut - Fosc + Escur Clar Mercejar l\'utilizator From 954a7aee91cab1616d29f39b19bcaf922df3f630 Mon Sep 17 00:00:00 2001 From: Ritika Pahwa <83745993+RitikaPahwa4444@users.noreply.github.com> Date: Tue, 18 Mar 2025 19:58:19 +0530 Subject: [PATCH 03/20] Bump up version code and name (#6250) * Bump up version code and name * Remove unintended change --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6890177e8..bc8e9bd1d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -212,8 +212,8 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1046 - versionName '5.1.3' + versionCode 1048 + versionName '5.2.0' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) minSdkVersion 21 From 828f69fc46a5ba3ab6c5f2ca53307c9e57c01a98 Mon Sep 17 00:00:00 2001 From: Sonal Yadav Date: Thu, 20 Mar 2025 03:51:33 +0530 Subject: [PATCH 04/20] Update Privacy Policy Link to GitHub.io (#6255) * "moved privacy policy" * Update PRIVACY_POLICY_URL to https://commons-app.github.io/privacy-policy as suggested * Use BuildConfig.PRIVACY_POLICY_URL in launchPrivacyPolicy function --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bc8e9bd1d..8e29852e1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -318,7 +318,7 @@ android { buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes\"" buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.org/wiki/Special:PasswordReset\"" - buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"" + buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://commons-app.github.io/privacy-policy\"" buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"" buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons\"" buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.contributions.contentprovider\"" @@ -355,7 +355,7 @@ android { buildConfigField "String", "SIGNUP_LANDING_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes\"" buildConfigField "String", "SIGNUP_SUCCESS_REDIRECTION_URL", "\"https://commons.m.wikimedia.beta.wmflabs.org/w/index.php?title=Main_Page&welcome=yes\"" buildConfigField "String", "FORGOT_PASSWORD_URL", "\"https://commons.wikimedia.beta.wmflabs.org/wiki/Special:PasswordReset\"" - buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://github.com/commons-app/commons-app-documentation/blob/master/android/Privacy-policy.md\"" + buildConfigField "String", "PRIVACY_POLICY_URL", "\"https://commons-app.github.io/privacy-policy\"" buildConfigField "String", "FILE_USAGES_BASE_URL", "\"https://commons.wikimedia.org/w/api.php?action=query&format=json&formatversion=2\"" buildConfigField "String", "ACCOUNT_TYPE", "\"fr.free.nrw.commons.beta\"" buildConfigField "String", "CONTRIBUTION_AUTHORITY", "\"fr.free.nrw.commons.beta.contributions.contentprovider\"" From f1f4e8baff84610ecef8f7ed86bd86809187eee6 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 20 Mar 2025 13:01:41 +0100 Subject: [PATCH 05/20] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-gl/strings.xml | 28 +++++++-------- app/src/main/res/values-pa/strings.xml | 50 ++++++++++++++++++++++++-- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 2c1b78ff7..0cf3aed91 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -40,13 +40,13 @@ (%1$d) (%1$d) - - Iniciando %1$d carga - Iniciando %1$d cargas + + Procesando %d carga + Procesando %d cargas - - %1$d carga - %1$d cargas + + %d carga + %d cargas Esta imaxe quedará baixo a licenza %1$s @@ -80,16 +80,16 @@ A actualizar lendas e descricións Agarde un chisco… Accedeu correctamente! - Erro durante o inició de sesión! + Erro durante o inicio de sesión! Ficheiro non atopado. Por favor, probe con outro. Alcanzouse o límite máximo de reintentos! Cancele o envío e ténteo de novo Desactivar a optimización da batería? Fallou a autenticación. Inicie sesión de novo. A carga comezou! Envío en cola (modo de conexión limitado activado) - Cargouse \"%1$s\"! + Subiuse \"%1$s\"! Prema para ollar a súa carga - A enviar ficheiro: %s + A subir o ficheiro: %s Cargando \"%1$s\" Rematando a carga de \"%1$s\" Produciuse un erro ao enviar %1$s @@ -352,7 +352,7 @@ Agradecementos recibidos Imaxes destacadas Imaxes vía \"Lugares próximos\" - Nivel + Nivel %d Imaxes cargadas Imaxes non revertidas Imaxes usadas @@ -408,14 +408,14 @@ Non volver a preguntar isto nunca Solicitar permiso de localización Pedir permisos de localización cando sexa necesario para a funcionalidade de notificación de proximidade. - Algo foi mal, non puidemos obter as túas achegas + Algo foi mal e non puidemos obter os logros Finaliza o: Amosar campañas Ver as campañas en curso Permitir Descartar Xa non verá as campañas. Porén, pode volver habilitar esta notificación na configuración. - Esta función require conexión de rede, verifique a súa configuración de conexión. + Esta función necesita conexión de rede. Verifique a súa configuración de conexión. Houbo un erro ó procesar a imaxe. Por favor, ténteo de novoǃ Obter un identificador para editar Engadir modelo para o control de categoría @@ -462,8 +462,8 @@ Fallou Non foi posíbel solicitar a eliminación. Un autorretrato que non se emprega en ningún artigo - Borrosa - Sen sentido + completamente borrosa + sen sentido, totalmente inusable en calquera artigo Foto de prensa Foto aleatoria de internet Logo diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 6aa3bcae4..c87a2c6af 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -22,7 +22,7 @@ ਤਸਵੀਰ ਸਾਰੇ ਦਿਨ ਦੀ ਤਸਵੀਰ - + ੧ ਫ਼ਾਈਲ ਚੜ੍ਹਾਈ ਜਾ ਰਹੀ ਹੈ %1$d ਫ਼ਾਈਲਾਂ ਚੜ੍ਹਾਈਆਂ ਜਾ ਰਹੀਆਂ ਹਨ @@ -45,7 +45,7 @@ ਆਮ ਸੁਝਾਅ ਪਰਦੇਦਾਰੀ - ਵਿਕੀਮੀਡੀਆ ਕਾਮਨਜ਼ + ਵਿਕੀਮੀਡੀਆ ਸ਼ਾਮਲਾਟ ਪਸੰਦਾਂ ਚੜ੍ਹਾਉਣਾ ਜਾਰੀ ਐ ਵਰਤੋਂਕਾਰ ਨਾਂ @@ -180,8 +180,11 @@ ਕੋਈ ਉਪਲਬਧ ਨਹੀਂ 2FA ਕੋਡ ਕੀ ਤੁਸੀਂ ਸੱਚੀਂ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + ਲਾਮਾ + ਸਤਰੰਗੀ ਪੁਲ ਵਿਕੀਪੀਡੀਆ \'ਤੇ ਜੀ ਆਇਆਂ ਨੂੰ ਜੀ ਆਇਆਂ ਨੂੰ ਕਾਪੀਰਾਈਟ + ਸਿਡਨੀ ਓਪੇਰਾ ਹਾਊਸ ਰੱਦ ਕਰੋ ਖੋਲ੍ਹੋ ਬੰਦ ਕਰੋ @@ -191,10 +194,13 @@ ਬਾਰੇ ਤਰਜੀਹਾਂ ਸੁਝਾਅ + ਗਿੱਟਹਬ (GitHub) ਰਾਹੀਂ ਸੁਝਾਅ ਬਾਹਰ ਆਉ ਸਿਖਲਾਈ ਸੂਚਨਾਵਾਂ ਪਰਖੋ + ਕੋਈ ਵੇਰਵਾ ਨਹੀਂ ਮਿਲਿਆ + ਵਿਕੀਡਾਟਾ ਵਸਤਾਂ ਵਿਕੀਪੀਡੀਆ ਲੇਖ ਤਸਵੀਰ ਬਹੁਤ ਗੂੜ੍ਹੀ ਹੈ। ਤਸਵੀਰ ਧੁੰਦਲੀ ਹੈ। @@ -203,35 +209,75 @@ ਦਾਖ਼ਲ ਹੋਵੋ ਵਿਕੀਡੇਟਾ ਵਿਕੀਪੀਡੀਆ + ਸਾਨੂੰ ਦਰਜਾ ਦਿਓ ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸੁਆਲ + ਵਰਤੋਂਕਾਰ ਦਸਤਿਆਂ ਸਿਖਲਾਈ ਛੱਡੋ ਤਰਜਮਾ ਕਰੋ ਬੋਲੀਆਂ ਅੱਗੇ ਵਧੋ ਰੱਦ ਕਰੋ + ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ + ਇਸ ਜਗ੍ਹਾ ਨੂੰ ਇੱਕ ਤਸਵੀਰ ਦੀ ਲੋੜ ਏ। + ਇਸ ਜਗ੍ਹਾ \'ਤੇ ਪਹਿਲਾਂ ਹੀ ਇੱਕ ਤਸਵੀਰ ਏ। + ਇਹ ਜਗ੍ਹਾ ਹੁਣ ਮੌਜੂਦ ਨਹੀਂ ਏ। + ਕੋਈ ਤਸਵੀਰ ਨਹੀਂ ਲੱਭੀ! + ਤਸਵੀਰ ਚੜਾਉਨ ਵੇਲੇ ਗਲਤੀ ਆਈ ਏ। + %1$s: ਵੱਲੋਂ ਚੜ੍ਹਾਈ ਗਈ + ਰੋਕ ਲਾਈ ਗਈ + ਦਿਨ ਦੀ ਤਸਵੀਰ ਲੱਭੋ ਲੱਭੋ ਹਾਲੀਆ ਖੋਜਾਂ: ਹਾਲ ਦੀਆਂ ਪੁੱਛਗਿੱਛ ਖੋਜਾਂ ਹਾਲ ਹੀ ਵਿੱਚ ਬੋਲੀਆਂ ਬਾਰੇ ਪੁੱਛਗਿੱਛ ਸ਼੍ਰੇਣੀਆਂ + ਵਸਤਾਂ ਨਕਸ਼ਾ ਸਵਾਲ + ਨਤੀਜਾ ਤੁਹਾਡੇ ਦਾਖਲੇ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ ਦਾਖਲ ਹੋਵੋ। ਜਾਰੀ ਰੱਖੋ + ਸਹੀ ਜਵਾਬ + ਗਲਤ ਜਵਾਬ + ਐਪ ਸਾਂਝਾ ਕਰੋ + ਘੁੰਮਾਓ + ਨੇੜਲੀਆਂ ਥਾਵਾਂ ਲੋਡ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ + ਇਸ ਖੇਤਰ ਵਿੱਚ ਕੋਈ ਤਸਵੀਰਾਂ ਨਹੀਂ ਹਨ। + ਆਲੇ-ਦੁਆਲੇ ਕੋਈ ਨੇੜਲੀ ਥਾਂ ਨਹੀਂ ਏ। + ਨੇਡ਼ਲੇ ਸਮਾਰਕਾਂ ਨੂੰ ਲਿਆਉਣ ਵਿੱਚ ਗਲਤੀ। ਕੋਈ ਤਾਜ਼ਾ ਖੋਜ ਨਹੀਂ + ਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ ਉੱਤੇ ਆਪਣੇ ਖੋਜ ਇਤਿਹਾਸ ਨੂੰ ਸਾਫ਼ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + ਕੀ ਤੁਸੀਂ ਇਸ ਖੋਜ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? + ਖੋਜ ਇਤਿਹਾਸ ਮਿਟਾਇਆ ਗਿਆ + ਮਿਟਾਉਣ ਲਈ ਨਾਮਜ਼ਦ ਕਰੋ ਮਿਟਾਓ ਪ੍ਰਾਪਤੀਆਂ + ਪ੍ਰੋਫਾਈਲ ਅੰਕੜੇ ਧੰਨਵਾਦ ਪ੍ਰਾਪਤ ਹੋਏ + ਵਿਸ਼ੇਸ਼ ਤਸਵੀਰ + \"ਨੇੜਲੀਆਂ ਥਾਵਾਂ\" ਰਾਹੀਂ ਤਸਵੀਰਾਂ ਪੱਧਰ %d + ਤਸਵੀਰਾਂ ਚੜ੍ਹਾਇਆਂ ਗਈਆਂ + ਤਸਵੀਰਾਂ ਵਾਪਸ ਨਹੀਂ ਕੀਤੀ ਗਈਆਂ + ਵਰਤੀ ਗਈਆਂ ਤਸਵੀਰਾਂ ਆਪਣੀਆਂ ਪ੍ਰਾਪਤੀਆਂ ਨੂੰ ਆਪਣੇ ਦੋਸਤਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ! + ਘੱਟੋ-ਘੱਟ ਲੋੜੀਂਦਾ: + ਗਲਤੀ ਆਈ! + ਨੇੜੇ-ਤੇੜੇ + ਸੂਚਨਾਵਾਂ ਸੂਚਨਾਵਾਂ (ਪੜ੍ਹਿਆਂ) ਸੂਚੀ ਅੱਗੇ ਪਿਛਲਾ + ਤਸਵੀਰਾਂ ਟਿਕਾਣਾ ਸ਼੍ਰੇਣੀਆਂ + ਇਸ ਖੇਤਰ ਵਿੱਚ ਖੋਜ ਕਰੋ + ਇਜਾਜ਼ਤ ਦੀ ਬੇਨਤੀ + ਇਹ ਮੁੜ ਕਦੇ ਨਾ ਪੁੱਛੋ + ਟਿਕਾਣੇਂ ਦੀ ਆਗਿਆ ਮੰਗੋ ਨੂੰ ਮਿਆਦ ਪੁਗਦੀ ਮੁਹਿੰਮਾਂ ਵੇਖਾਓ ਇਜਾਜ਼ਤ ਦਿਓ From 2e05a58e8ba545846b45b699b7bb865b95262ff8 Mon Sep 17 00:00:00 2001 From: Ritika Pahwa <83745993+RitikaPahwa4444@users.noreply.github.com> Date: Sat, 22 Mar 2025 14:07:51 +0530 Subject: [PATCH 06/20] Bump up version code to 1049 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8e29852e1..41b3d85de 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -212,7 +212,7 @@ android { defaultConfig { //applicationId 'fr.free.nrw.commons' - versionCode 1048 + versionCode 1049 versionName '5.2.0' setProperty("archivesBaseName", "app-commons-v$versionName-" + getBranchName()) From 5a5e660a4360624720d42fb7929c9c356cefed52 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 24 Mar 2025 13:01:43 +0100 Subject: [PATCH 07/20] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-io/strings.xml | 29 ++++++++++++++++++++++ app/src/main/res/values-krc/strings.xml | 23 ++++++++++++++++- app/src/main/res/values-pt-rBR/strings.xml | 2 +- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-io/strings.xml b/app/src/main/res/values-io/strings.xml index 057e77e10..294b72208 100644 --- a/app/src/main/res/values-io/strings.xml +++ b/app/src/main/res/values-io/strings.xml @@ -385,8 +385,11 @@ Avizi Avizi (lektita) Montrez proxima avizo + Montrar avizo en utensilo \'\'app\'\' pri la maxim proxima loko qua bezonas pikturi Listo Permiso pri enmagazinigo + Ni bezonas vua permiso por acesar l\'extera enmagazinigado di vua utensilo, por sendar imaji. + Vu ne pluse vidos la maxim proxima loko qua bezonas fotografuro. Tamen, vu povas kapabligar itere ca avizo en Ajusti (\'\'Settings\'\'), se vu deziros. Etapo %1$d de %2$d: %3$s Sequanta Antea @@ -411,17 +414,32 @@ Nula deskripturo selektita Cesar kargajo Durar kargajo + (Por omna imaji en la grupo) Serchez ca areo Permiso bezonata Ka vu deziras ke ni uzez vua nuna lokizo por montrar vicina loki qui bezonas imaji? + Ne esas posibla montrar la maxim proxima loko qua bezonas imajo, se vu ne montros vua lokizo Ne pluse demandez to Demandar lokala permiso Demandez lokala permiso, kande bezonata por uzar karto montranta proximeso. + Ulu faliis, ni ne povis montrar vua sucesi + Vu facis plu multa kontributaji, e nia kalkulo-utensilo ne povis kalkular li. To esis la maxim importanta suceso. Finas la: Montrez kampanii Videz la kampanii duranta + Permisez ke l\'utensilo (\'\'app\'\') lokizez, se la kamero ne enrejistros la lokizo. Kelka kameri ne havas utensilo por enrejistrar lokizo. Cakaze, vua kontributado divenos plu utila se vu permisos ke l\'\'\'app\'\' prenez ed enrejistrez lokizi. Vu povos abrogar ca permiso irgatempe en Ajusti (\'\'Settings\'\') Permisar Eskartar + Voluntez kapabligar registrago di lokizo en \'\'Settings\'\', e probez itere.\n\nNoto: l\'arkivo sendanta povas ne havar informo pri lokizo, se l\'\'\'app\'\' ne povas rekuperar l\'informo pri lokizo en kurta intervalo. + Kaptanta \'\'token\'\' por redaktar. + Adjuntanta shablono por verifikar kategorio + Demandanta verifiko di kategorio por %1$s + Demandanta verifiko di kategorio + Verifiko di kategorio demandita + Demando pri verifiko di kategorio ne funcionis + Dema%1$sndita verifiko di kategorio por %1$s + Ne povis demandar verifiko di kategorio por %1$s + Demandanta verifiko di kategorio por %1$s Facita Sendanta danko: Suceso Danko sendita sucese a %1$s @@ -430,6 +448,7 @@ Sendanta danko a %1$s Ka to obedias la reguli pri autoroyuro? Ka lua kategorio esas korekta? + Ka to apartenas al skopo dil projeto? Ka vu deziras dankar la kontributero? Kliktez NO por indikar ca imajo por efaco, se ol ne havas irga utileso. Ho, to ne mem havas kategorio! @@ -452,9 +471,11 @@ Vartez... Kopiita Exempli pri bona imaji por sendar a Commons + Exempli pri imaji por NE SENDAR Saltez ca imajo Descharjo faliis!! Ni ne povis descharjar l\'arkivo sen permiso pri extera konservo. Administrar etiketi EXIF + Dum sendo di arkivi, selektez quala etiketi EXIF devas mantenesar Autoro Autoroyuro Loko @@ -465,10 +486,14 @@ Informo pri imajo Nula kategorio trovesis implicita deskripto-linguo + Indikita por efaco Suceso + Indikita %1$s por efaco. Faliis Ne povis demandar efaco. + \'\'selfie\'\'-imajo qua ne uzesas en irga artiklo komplete neklara + sensencajo, qua ne povas uzesar en irga artiklo Fotografuro de komunikilaro Hazarda imajo de Interreto Emblemo @@ -534,9 +559,13 @@ Koloro obskura Koloro klara Charjez pluse + Adjuntar imajo a Wikipedio + Ka vu deziras adjuntar ca imajo al artiklo de Wikipedio en idiomo %1$s? Konfirmez Instrucioni 1. Uzez la sequanta wikitexto: + Kliktanta \"konfirmar\" (\'\'Confirm\'\') apertos l\'artiklo che Wikipedio + 3. Trovez adequata fako dil artiklo por inkluzar vua imajo pauzar durigar Pauzita diff --git a/app/src/main/res/values-krc/strings.xml b/app/src/main/res/values-krc/strings.xml index bf4f31998..81d8842ff 100644 --- a/app/src/main/res/values-krc/strings.xml +++ b/app/src/main/res/values-krc/strings.xml @@ -101,6 +101,8 @@ Суратха ал Джуўукъда Джюклегенлерим + Джибериуню копия эт + Джибериу алмашдырыу буферге копия этилгенди Юлюшле Файлны бетине къара Тюб джазыу (Амалсыз) @@ -274,6 +276,7 @@ Викитекстни алмашдырыу буферге копия эт Викитекст алмашдырыу буферге копия этилди Джууукъдагыла тюз ишлеялмайды, Локация хайырландырылалмайды. + Интернет джетишмейди. Къуру кэш этилген джерле кёргюзюледиле. Локациягъа джетишиу уналмады. Бу функцияны хайырланыр ючюн, тилейбиз, локациягъызны къолугъуз бла белгилегиз. Джууукъдагъы джерле тизмени кёргюзюр ючююн, эркинлик берирге керекди Джууукъдагъы суратла тизмени кёргюзюр ючююн, эркинлик берирге керекди @@ -357,11 +360,13 @@ Кетер Джетишимле Профиль + Белгичикле Статистика Бюсюреуле Алындыла Сайланнган Суратла \"Джууукъдагъы Джерле\" юсю бла суратла - Дараджа + Дараджа %d + %s (Дараджа %s) Суратла Джюклендиле Суратла Кери Алынмадыла Суратла Хайырландыла @@ -393,6 +398,7 @@ Девайсыгъызда келишген картография къошакъ табылмады. Тилейбиз, бу энчиликни хайырландырыр ючюн картография къошакъ джюклегиз. Суратла Локацияла + Категорияла Китаб белгилени къош/къорат Китаб белгиле Алкъын чырт китаб белги къошмадыгъыз @@ -794,4 +800,19 @@ Бу джерни сураты джокъду, хайда бирин эт! Бу джерни алайсыз да сураты барды. Бу джерни сураты болуб-болмагъанын тинте турама. + Джюкленнген заманда халат + Бир хайырланыучу да табылмады + Гёзен + Башха викиле + Файлны хайырланыулары + SingleWebViewActivity + Хыйсаб + Хыйсабны сюрт + Хыйсаб сюртюуню эсгертиую + Джокъ этиу — <b>ахыр амалды</b>, эмда аны <b>тюзетиуню тамамы бла тохтатыргъа излегесиз хайырланыргъа керекди</b>, неда эскиде ассоциацияланы бир мадар болуб аслам джашырыргъа излесегиз.<br/><br />Викигёзенде хыйсабны кетериу, башхала хыйсабны джокъ этиу атны джюрютген процессде сизни кошумугъузну танымазча, хыйсабыгъызны атын тюрлендириу бла этиледи.<b>Джокъ этиу толу анонимликни гарантия этмейди эмда проектде къошумларыгъызны къоратмайды</b>. + Тюб джазыу + Тюб джазыу алмашдырыу буферге копия этилгенди + Алгъышлайбыз, бу альбомна бютеу сратла не джюкленнгендиле, неда джюкленирге джораланмагъанлача белгиленнгендиле. + Explore-де кёргюз + Nearby-да кёргюз diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index da2de6c82..2949a707a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -419,7 +419,7 @@ Favoritos Não adicionou nenhum favorito Favoritos - A recolha de registos foi iniciada. REINICIE a aplicação, execute a operação que pretende registar e prima outra vez \"Enviar ficheiro de registos\" + A coleta de registros foi iniciada. REINICIE o aplicativo, execute a operação que pretende registrar e toque em ‘Enviar arquivo de registros’ novamente Eu fiz o carregamento por engano Eu não sabia que seria publicamente visível Eu percebi que é ruim para minha privacidade From 669f3043aea15512b238c70acad398af305a470e Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Thu, 27 Mar 2025 13:01:54 +0100 Subject: [PATCH 08/20] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-diq/strings.xml | 2 +- app/src/main/res/values-lb/strings.xml | 3 ++- app/src/main/res/values-pa/strings.xml | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-diq/strings.xml b/app/src/main/res/values-diq/strings.xml index 5ffda9f2e..f6bbf1f0e 100644 --- a/app/src/main/res/values-diq/strings.xml +++ b/app/src/main/res/values-diq/strings.xml @@ -315,7 +315,7 @@ Resımi vıla kerê pê Hewna to iştirak nêkerdo Hesab vıraziya! - Metın kopyayê panoyi biyo + Metın be panoyi ra kopya bi Pêhesnayışi wanaye nışan bıkerê Yew xeta biye! Weziyetê cayi: diff --git a/app/src/main/res/values-lb/strings.xml b/app/src/main/res/values-lb/strings.xml index 2ef0b7c0a..65574cdb9 100644 --- a/app/src/main/res/values-lb/strings.xml +++ b/app/src/main/res/values-lb/strings.xml @@ -70,7 +70,7 @@ D\'Authentifizéierung huet net funktionéiert. Loggt Iech wgl. nach eng Kéier an. D\'Eroplueden huet ugefaang! %1$s eropgelueden! - Dréckt fir de Fichier ze gesinn deen Dir eropgelueden hutt + Tippt fir de Fichier ze gesinn, deen Dir eropgelueden hutt Fichier eroplueden: %s %1$s gëtt eropgelueden Eropluede vu(n) %1$s ofschléissen @@ -274,6 +274,7 @@ Sichen Op Commons sichen Sichen + Rezent gesicht: Medien Kategorien Elementer diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index c87a2c6af..fa2051047 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -265,6 +265,7 @@ ਆਪਣੀਆਂ ਪ੍ਰਾਪਤੀਆਂ ਨੂੰ ਆਪਣੇ ਦੋਸਤਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ! ਘੱਟੋ-ਘੱਟ ਲੋੜੀਂਦਾ: ਗਲਤੀ ਆਈ! + ਯੋਗਦਾਨ ਨੇੜੇ-ਤੇੜੇ ਸੂਚਨਾਵਾਂ ਸੂਚਨਾਵਾਂ (ਪੜ੍ਹਿਆਂ) From 44966645cabb71dfbd47b42d71ef7ccc39f9d061 Mon Sep 17 00:00:00 2001 From: Ritika Pahwa <83745993+RitikaPahwa4444@users.noreply.github.com> Date: Sat, 29 Mar 2025 13:21:03 +0530 Subject: [PATCH 09/20] Add v5.2.0 to CHANGELOG.md --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7accf82b..0da417cfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # Wikimedia Commons for Android +## v5.2.0 + +v5.2.0 boasts several new functionalities like: + +* A new refresh button lets you quickly reload the Nearby map +* Bookmarks now support categories +* Improved feedback and consistency in the user interface +* Bug fixes and performance improvements + +### What's changed +* Implement "Refresh" button to clear the cache and reload the Nearby map. +* `CommonsApplication` migrate to kotlin & some lint fixes. +* Revert back to MainScope for database and UI updates and make database operations thread safe. +* Hide edit options for logged-out users in Explore screen. +* Introduced a button to delete the current folder in custom selector. +* Improve Unique File Name Search. +* Migration of several modules from Java to Kotlin. +* Fix modification on bottom sheet's data when coming from Nearby Banner and clicked on other pins. +* Bug fixes and enhancement of Achievements screen. +* Show where file is being used on Commons and other wikis. +* Migrate android.media.ExifInterface to androidx.exifinterface.media.ExifInterface as android.media.ExifInterface had security flaws on older devices. +* Make dialogs modal and always show the upload icon. +* Fix unintentional deletion of subfolders and non-images by custom selector. +* Bookmark categories. +* Add pull down to refresh in the Contributions screen. +* Fix race condition and lag when loading pin details, faster overlay management. +* Show cached pins in Nearby even when internet is unavailable + + Full changelog with the list of contributors: [`v5.1.2...v5.2.0`](https://github.com/commons-app/apps-android-commons/compare/v5.1.2...v5.2.0). + + ## v5.1.2 ### What's changed From 6e090c8d7a4e1f1e1b0dec574a67653662f93322 Mon Sep 17 00:00:00 2001 From: Jason-Whitmore Date: Mon, 31 Mar 2025 01:49:06 -0700 Subject: [PATCH 10/20] ExploreMapFragment.java: fix marker labels in Explore map fragment to display the username (#6260) Before this change, the labels that would appear on the marker when tapped did not include the author or username. Instead, it displayed "Unknown". After this change, the labels now display the author name. If the author name is not available, the username will be displayed. If both are unavailable, the default value of "Unknown" will be displayed. To improve the readability of the text, any HTML text is removed from the username/author. --- .../explore/map/ExploreMapFragment.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java index 1b1659182..f5657dd1b 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/map/ExploreMapFragment.java @@ -708,8 +708,17 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment GeoPoint point = new GeoPoint( nearbyBaseMarker.getPlace().location.getLatitude(), nearbyBaseMarker.getPlace().location.getLongitude()); - OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name, null, - point); + + Media markerMedia = this.getMediaFromImageURL(nearbyBaseMarker.getPlace().pic); + String authorUser = null; + if (markerMedia != null) { + authorUser = markerMedia.getAuthorOrUser(); + // HTML text is sometimes part of the author string and needs to be removed + authorUser = Html.fromHtml(authorUser, Html.FROM_HTML_MODE_LEGACY).toString(); + } + + OverlayItem item = new OverlayItem(nearbyBaseMarker.getPlace().name, + authorUser, point); item.setMarker(d); items.add(item); ItemizedOverlayWithFocus overlay = new ItemizedOverlayWithFocus(items, @@ -740,6 +749,26 @@ public class ExploreMapFragment extends CommonsDaggerSupportFragment } } + /** + * Retrieves the specific Media object from the mediaList field. + * @param url The specific Media's image URL. + * @return The Media object that matches the URL or null if it could not be found. + */ + private Media getMediaFromImageURL(String url) { + if (mediaList == null || url == null) { + return null; + } + + for (int i = 0; i < mediaList.size(); i++) { + if (mediaList.get(i) != null && mediaList.get(i).getImageUrl() != null + && mediaList.get(i).getImageUrl().equals(url)) { + return mediaList.get(i); + } + } + + return null; + } + /** * Removes a marker from the map based on the specified NearbyBaseMarker. * From fdfd7781e94071b350db06d17cd01bb001d18ff7 Mon Sep 17 00:00:00 2001 From: "translatewiki.net" Date: Mon, 31 Mar 2025 14:01:52 +0200 Subject: [PATCH 11/20] Localisation updates from https://translatewiki.net. --- app/src/main/res/values-fr/strings.xml | 6 ++++++ app/src/main/res/values-zgh/strings.xml | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5aeda5299..179bef168 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -853,8 +853,14 @@ Autres wikis Utilisations du fichier + SingleWebViewActivity + Compte + Faire disparaître le compte + Avertissement de disparition du compte + La disparition est un <b>dernier recours</b> et ne devrait être <b>utilisée que quand vous voulez arrêter d’éditer pour toujours</b> et aussi pour cacher autant que possible vos associations passées.<br/><br/>La suppression de compte sur Wikimedia Commons se fait en changeant le nom de votre compte de sorte que les autres ne peuvent pas identifier vos contributions, lors d’un processus appelé disparition du compte. <b>La disparition ne garantit pas l’anonymat complet ni ne supprime les contributions de vos projets</b>. Légende Légende copiée dans le presse-papier + Félicitations, toutes les images dans cet album ont été soit téléchargées soit marquées comme non téléchargeables. Afficher dans Explorer Afficher à proximité diff --git a/app/src/main/res/values-zgh/strings.xml b/app/src/main/res/values-zgh/strings.xml index 27080b999..b3615cefc 100644 --- a/app/src/main/res/values-zgh/strings.xml +++ b/app/src/main/res/values-zgh/strings.xml @@ -1,5 +1,6 @@ @@ -79,7 +80,7 @@ ⵉⴼⵔⵙ ⵉⵙⵉⴹⵏⵏ ⵜⵉⵙⵖⴰⵍ - ⴰⵏⵙⵙⵎⵔⵙ + ⴰⵏⵙⵎⵔⴰⵙ ⵙⵙⵉⴹⵏ ⴰⵙⴳⵯⵙⴰⵏ ⴰⵏⵎⵍⴰⵙⵙ From 6f75927432cf80923514f9f327c5c0b706f2652c Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Tue, 14 Jan 2025 09:43:16 +0530 Subject: [PATCH 12/20] fix IndexOutOfBounds error when removing thumbnails --- .../main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 020284934..64c79dd36 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -797,7 +797,10 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C } } - override fun onThumbnailDeleted(position: Int) = presenter!!.deletePictureAtIndex(position) + override fun onThumbnailDeleted(position: Int) { + presenter!!.deletePictureAtIndex(position) + thumbnailsAdapter?.notifyItemRemoved(position) + } /** * The adapter used to show image upload intermediate fragments From d0b6ce5c52e00a64e7c445dfaf833d75553223c5 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Tue, 14 Jan 2025 10:04:40 +0530 Subject: [PATCH 13/20] refactor: resolve compiler warnings --- .../free/nrw/commons/upload/UploadActivity.kt | 83 ++++++++++--------- .../mediaDetails/UploadMediaDetailFragment.kt | 2 +- .../mediaDetails/UploadMediaPresenter.kt | 14 ++-- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 64c79dd36..fb8a86d65 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -122,7 +122,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C /** * Set the value of the showPermissionDialog variable. * - * @param showPermissionsDialog `true` to indicate to show + * @property isShowPermissionsDialog `true` to indicate to show * Permissions Dialog if permissions are missing, `false` otherwise. */ /** @@ -187,7 +187,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C } init() - binding.rlContainerTitle.setOnClickListener { v: View? -> onRlContainerTitleClicked() } + binding.rlContainerTitle.setOnClickListener { _: View? -> onRlContainerTitleClicked() } nearbyPopupAnswers = mutableMapOf() //getting the current dpi of the device and if it is less than 320dp i.e. overlapping //threshold, thumbnails automatically minimizes @@ -201,7 +201,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C } locationManager!!.requestLocationUpdatesFromProvider(LocationManager.GPS_PROVIDER) locationManager!!.requestLocationUpdatesFromProvider(LocationManager.NETWORK_PROVIDER) - store = BasicKvStore(this, storeNameForCurrentUploadImagesSize).apply { + store = BasicKvStore(this, STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE).apply { clearAll() } checkStoragePermissions() @@ -241,7 +241,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onPageSelected(position: Int) { currentSelectedPosition = position - if (position >= uploadableFiles!!.size) { + if (position >= uploadableFiles.size) { binding.cvContainerTopCard.visibility = View.GONE } else { thumbnailsAdapter!!.notifyDataSetChanged() @@ -274,7 +274,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .filter { result: Boolean? -> result!! } - .subscribe { result: Boolean? -> + .subscribe { _: Boolean? -> showAlertDialog( this, getString(R.string.block_notification_title), @@ -284,7 +284,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C }) } - fun checkStoragePermissions() { + private fun checkStoragePermissions() { // Check if all required permissions are granted val hasAllPermissions = hasPermission(this, PERMISSIONS_STORAGE) val hasPartialAccess = hasPartialAccess(this) @@ -355,7 +355,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C showLongToast(this, messageResourceId) } - override fun getUploadableFiles(): List? { + override fun getUploadableFiles(): List { return uploadableFiles } @@ -375,8 +375,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C binding.tvTopCardTitle.text = resources .getQuantityString( R.plurals.upload_count_title, - uploadableFiles!!.size, - uploadableFiles!!.size + uploadableFiles.size, + uploadableFiles.size ) } @@ -444,15 +444,16 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C receiveInternalSharedItems() } - if (uploadableFiles == null || uploadableFiles!!.isEmpty()) { + if (uploadableFiles.isEmpty()) { handleNullMedia() } else { //Show thumbnails - if (uploadableFiles!!.size > 1) { - if (!defaultKvStore.getBoolean("hasAlreadyLaunchedCategoriesDialog")) { //If there is only file, no need to show the image thumbnails + if (uploadableFiles.size > 1) { + if (!defaultKvStore.getBoolean("hasAlreadyLaunchedCategoriesDialog")) { + // If there is only file, no need to show the image thumbnails showAlertDialogForCategories() } - if (uploadableFiles!!.size > 3 && + if (uploadableFiles.size > 3 && !defaultKvStore.getBoolean("hasAlreadyLaunchedBigMultiupload") ) { showAlertForBattery() @@ -464,8 +465,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C binding.tvTopCardTitle.text = resources .getQuantityString( R.plurals.upload_count_title, - uploadableFiles!!.size, - uploadableFiles!!.size + uploadableFiles.size, + uploadableFiles.size ) @@ -474,7 +475,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C } - for (uploadableFile in uploadableFiles!!) { + for (uploadableFile in uploadableFiles) { val uploadMediaDetailFragment = UploadMediaDetailFragment() if (!uploadIsOfAPlace) { @@ -497,8 +498,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C object : UploadMediaDetailFragmentCallback { override fun deletePictureAtIndex(index: Int) { store!!.putInt( - keyForCurrentUploadImagesSize, - (store!!.getInt(keyForCurrentUploadImagesSize) - 1) + KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE, + (store!!.getInt(KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE) - 1) ) presenter!!.deletePictureAtIndex(index) } @@ -576,11 +577,11 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C fragments!!.add(mediaLicenseFragment!!) } else { for (i in 1 until fragments!!.size) { - fragments!![i]!!.callback = object : UploadBaseFragment.Callback { + fragments!![i].callback = object : UploadBaseFragment.Callback { override fun onNextButtonClicked(index: Int) { if (index < fragments!!.size - 1) { binding.vpUpload.setCurrentItem(index + 1, false) - fragments!![index + 1]!!.onBecameVisible() + fragments!![index + 1].onBecameVisible() (binding.rvThumbnails.layoutManager as LinearLayoutManager) .scrollToPositionWithOffset( if ((index > 0)) index - 1 else 0, @@ -594,7 +595,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onPreviousButtonClicked(index: Int) { if (index != 0) { binding.vpUpload.setCurrentItem(index - 1, true) - fragments!![index - 1]!!.onBecameVisible() + fragments!![index - 1].onBecameVisible() (binding.rvThumbnails.layoutManager as LinearLayoutManager) .scrollToPositionWithOffset( if ((index > 3)) index - 2 else 0, @@ -632,11 +633,12 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C binding.vpUpload.offscreenPageLimit = fragments!!.size } // Saving size of uploadableFiles - store!!.putInt(keyForCurrentUploadImagesSize, uploadableFiles!!.size) + store!!.putInt(KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE, uploadableFiles.size) } /** - * Changes current image when one image upload is cancelled, to highlight next image in the top thumbnail. + * Changes current image when one image upload is cancelled, to highlight next image in the top + * thumbnail. * Fixes: [Issue](https://github.com/commons-app/apps-android-commons/issues/5511) * * @param index Index of image to be removed @@ -771,7 +773,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onNextButtonClicked(index: Int) { if (index < fragments!!.size - 1) { binding.vpUpload.setCurrentItem(index + 1, false) - fragments!![index + 1]!!.onBecameVisible() + fragments!![index + 1].onBecameVisible() (binding.rvThumbnails.layoutManager as LinearLayoutManager) .scrollToPositionWithOffset(if ((index > 0)) index - 1 else 0, 0) if (index < fragments!!.size - 4) { @@ -786,10 +788,10 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onPreviousButtonClicked(index: Int) { if (index != 0) { binding.vpUpload.setCurrentItem(index - 1, true) - fragments!![index - 1]!!.onBecameVisible() + fragments!![index - 1].onBecameVisible() (binding.rvThumbnails.layoutManager as LinearLayoutManager) .scrollToPositionWithOffset(if ((index > 3)) index - 2 else 0, 0) - if ((index != 1) && ((index - 1) < uploadableFiles!!.size)) { + if ((index != 1) && ((index - 1) < uploadableFiles.size)) { // Shows the top card if it was hidden because of the last image being deleted and // now the user has hit previous button to go back to the media details showHideTopCard(true) @@ -827,11 +829,11 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C } - fun onRlContainerTitleClicked() { + private fun onRlContainerTitleClicked() { binding.rvThumbnails.visibility = if (isTitleExpanded) View.GONE else View.VISIBLE isTitleExpanded = !isTitleExpanded - binding.ibToggleTopCard.rotation = binding.ibToggleTopCard.rotation + 180 + binding.ibToggleTopCard.rotation += 180 } override fun onDestroy() { @@ -882,7 +884,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C .setView(view) .setTitle(getString(R.string.multiple_files_depiction_header)) .setMessage(getString(R.string.multiple_files_depiction)) - .setPositiveButton("OK") { dialog: DialogInterface?, which: Int -> + .setPositiveButton("OK") { _: DialogInterface?, _: Int -> if (checkBox.isChecked) { // Save the user's choice to not show the dialog again defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true) @@ -916,14 +918,14 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C getString(R.string.cancel), { /* Since opening the right settings page might be device dependent, using - https://github.com/WaseemSabir/BatteryPermissionHelper - directly appeared like a promising idea. - However, this simply closed the popup and did not make - the settings page appear on a Pixel as well as a Xiaomi device. - Used the standard intent instead of using this library as - it shows a list of all the apps on the device and allows users to - turn battery optimisation off. - */ + https://github.com/WaseemSabir/BatteryPermissionHelper + directly appeared like a promising idea. + However, this simply closed the popup and did not make + the settings page appear on a Pixel as well as a Xiaomi device. + Used the standard intent instead of using this library as + it shows a list of all the apps on the device and allows users to + turn battery optimisation off. + */ val batteryOptimisationSettingsIntent = Intent( Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS ) @@ -961,7 +963,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C Also, location information is discarded if the difference between current location and location recorded just before capturing the image is greater than 100 meters */ - if (isLocationTagUnchecked || locationDifference > 100 || !defaultKvStore.getBoolean("inAppCameraLocationPref") + if (isLocationTagUnchecked || locationDifference > 100 + || !defaultKvStore.getBoolean("inAppCameraLocationPref") || !isInAppCameraUpload ) { currLocation = null @@ -982,8 +985,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C @JvmField var nearbyPopupAnswers: MutableMap? = null - const val keyForCurrentUploadImagesSize: String = "CurrentUploadImagesSize" - const val storeNameForCurrentUploadImagesSize: String = "CurrentUploadImageQualities" + const val KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE: String = "CurrentUploadImagesSize" + const val STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE: String = "CurrentUploadImageQualities" /** * Sets the flag indicating whether the upload is of a specific place. diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt index af850a7e3..4a4c13ba7 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt @@ -532,7 +532,7 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra basicKvStore!!.putBoolean(keyForShowingAlertDialog, false) if (isInternetConnectionEstablished(requireActivity())) { val sizeOfUploads = basicKvStore!!.getInt( - UploadActivity.keyForCurrentUploadImagesSize + UploadActivity.KEY_FOR_CURRENT_UPLOAD_IMAGE_SIZE ) for (i in indexOfFragment until sizeOfUploads) { presenter.getImageQuality( diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt index 90c426091..1213ffdb1 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt @@ -310,7 +310,7 @@ class UploadMediaPresenter @Inject constructor( private fun storeImageQuality( imageResult: Int, uploadItemIndex: Int, activity: Activity, uploadItem: UploadItem ) { - val store = BasicKvStore(activity, UploadActivity.storeNameForCurrentUploadImagesSize) + val store = BasicKvStore(activity, UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) val value = store.getString(UPLOAD_QUALITIES_KEY, null) try { val jsonObject = value.asJsonObject().apply { @@ -339,8 +339,8 @@ class UploadMediaPresenter @Inject constructor( */ override fun checkImageQuality(uploadItem: UploadItem, index: Int) { if ((uploadItem.imageQuality != IMAGE_OK) && (uploadItem.imageQuality != IMAGE_KEEP)) { - val value = basicKvStoreFactory?.let { it(UploadActivity.storeNameForCurrentUploadImagesSize) } - ?.getString(UPLOAD_QUALITIES_KEY, null) + val value = basicKvStoreFactory(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) + .getString(UPLOAD_QUALITIES_KEY, null) try { val imageQuality = value.asJsonObject()["UploadItem$index"] as Int view.showProgress(false) @@ -363,8 +363,8 @@ class UploadMediaPresenter @Inject constructor( * @param index Index of the UploadItem which was deleted */ override fun updateImageQualitiesJSON(size: Int, index: Int) { - val value = basicKvStoreFactory?.let { it(UploadActivity.storeNameForCurrentUploadImagesSize) } - ?.getString(UPLOAD_QUALITIES_KEY, null) + val value = basicKvStoreFactory(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) + .getString(UPLOAD_QUALITIES_KEY, null) try { val jsonObject = value.asJsonObject().apply { for (i in index until (size - 1)) { @@ -372,8 +372,8 @@ class UploadMediaPresenter @Inject constructor( } remove("UploadItem" + (size - 1)) } - basicKvStoreFactory?.let { it(UploadActivity.storeNameForCurrentUploadImagesSize) } - ?.putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) + basicKvStoreFactory(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) + .putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) } catch (e: Exception) { Timber.e(e) } From c07a6acd0bff068bd34c4fdcbe0c02aebe232b20 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Tue, 14 Jan 2025 10:14:12 +0530 Subject: [PATCH 14/20] refactor: replace deprecated onBackPressed with onBackPressedCallback --- .../free/nrw/commons/upload/UploadActivity.kt | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index fb8a86d65..aeac598f9 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -14,6 +14,7 @@ import android.os.Bundle import android.provider.Settings import android.view.View import android.widget.CheckBox +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -166,6 +167,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C private var _binding: ActivityUploadBinding? = null private val binding: ActivityUploadBinding get() = _binding!! + private lateinit var onBackPressedCallback: OnBackPressedCallback + @SuppressLint("CheckResult") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -173,6 +176,23 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C _binding = ActivityUploadBinding.inflate(layoutInflater) setContentView(binding.root) + // Overrides the back button to make sure the user is prepared to lose their progress + onBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + showAlertDialog( + this@UploadActivity, + getString(R.string.back_button_warning), + getString(R.string.back_button_warning_desc), + getString(R.string.back_button_continue), + getString(R.string.back_button_warning), + null + ) { + finish() + } + } + } + onBackPressedDispatcher.addCallback(this, onBackPressedCallback) + /* If Configuration of device is changed then get the new fragments created by the system and populate the fragments ArrayList @@ -850,21 +870,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C if (uploadCategoriesFragment != null) { uploadCategoriesFragment!!.callback = null } - } - - /** - * Overrides the back button to make sure the user is prepared to lose their progress - */ - @SuppressLint("MissingSuperCall") - override fun onBackPressed() { - showAlertDialog( - this, - getString(R.string.back_button_warning), - getString(R.string.back_button_warning_desc), - getString(R.string.back_button_continue), - getString(R.string.back_button_warning), - null - ) { finish() } + onBackPressedCallback.remove() } /** From a6c9334e3ec3e8125c62c3029297c4818d4c4c9a Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Tue, 14 Jan 2025 10:51:31 +0530 Subject: [PATCH 15/20] test: remove unit test as no longer needed --- .../nrw/commons/upload/UploadActivityUnitTests.kt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadActivityUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadActivityUnitTests.kt index 1173d09b0..97fe68862 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadActivityUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadActivityUnitTests.kt @@ -262,15 +262,4 @@ class UploadActivityUnitTests { method.isAccessible = true method.invoke(activity) } - - @Test - @Throws(Exception::class) - fun testOnBackPressed() { - val method: Method = - UploadActivity::class.java.getDeclaredMethod( - "onBackPressed", - ) - method.isAccessible = true - method.invoke(activity) - } } From b5bee2628f6ccd0d994b2a5d105ab8dfd4c34b25 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Sat, 18 Jan 2025 22:21:38 +0530 Subject: [PATCH 16/20] replace notifyItemDeleted with notifyDatasetChanged --- app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index aeac598f9..71ffb74d8 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -821,7 +821,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onThumbnailDeleted(position: Int) { presenter!!.deletePictureAtIndex(position) - thumbnailsAdapter?.notifyItemRemoved(position) + thumbnailsAdapter?.notifyDataSetChanged() } /** From 566a3c6ee348ca5d21c1c05885699133efe0207d Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Tue, 25 Feb 2025 19:43:10 +0530 Subject: [PATCH 17/20] refactor: resolve compilation issue by using correct property name --- .../upload/mediaDetails/UploadMediaPresenter.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt index 1213ffdb1..77999cf2f 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt @@ -339,8 +339,10 @@ class UploadMediaPresenter @Inject constructor( */ override fun checkImageQuality(uploadItem: UploadItem, index: Int) { if ((uploadItem.imageQuality != IMAGE_OK) && (uploadItem.imageQuality != IMAGE_KEEP)) { - val value = basicKvStoreFactory(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) - .getString(UPLOAD_QUALITIES_KEY, null) + + val value = basicKvStoreFactory?.let { it(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) } + ?.getString(UPLOAD_QUALITIES_KEY, null) + try { val imageQuality = value.asJsonObject()["UploadItem$index"] as Int view.showProgress(false) @@ -363,8 +365,9 @@ class UploadMediaPresenter @Inject constructor( * @param index Index of the UploadItem which was deleted */ override fun updateImageQualitiesJSON(size: Int, index: Int) { - val value = basicKvStoreFactory(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) - .getString(UPLOAD_QUALITIES_KEY, null) + val value = basicKvStoreFactory?.let { it(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) } + ?.getString(UPLOAD_QUALITIES_KEY, null) + try { val jsonObject = value.asJsonObject().apply { for (i in index until (size - 1)) { @@ -372,8 +375,9 @@ class UploadMediaPresenter @Inject constructor( } remove("UploadItem" + (size - 1)) } - basicKvStoreFactory(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) - .putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) + + basicKvStoreFactory?.let { it(UploadActivity.STORE_NAME_FOR_CURRENT_UPLOAD_IMAGE_SIZE) } + ?.putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) } catch (e: Exception) { Timber.e(e) } From e15d8b156d162ded6723e79e8c2177a2202b335a Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Sun, 9 Mar 2025 22:08:45 +0530 Subject: [PATCH 18/20] fix: remove if-condition to prevent hiding top card and refactor code --- .../nrw/commons/upload/UploadPresenter.kt | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt index 9ee8fb483..5d721f408 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt @@ -146,34 +146,31 @@ class UploadPresenter @Inject internal constructor( override fun deletePictureAtIndex(index: Int) { val uploadableFiles = view.getUploadableFiles() - if (index == uploadableFiles!!.size - 1) { - // If the next fragment to be shown is not one of the MediaDetailsFragment - // lets hide the top card so that it doesn't appear on the other fragments - view.showHideTopCard(false) - } - view.setImageCancelled(true) - repository.deletePicture(uploadableFiles[index].getFilePath()) - if (uploadableFiles.size == 1) { - view.showMessage(R.string.upload_cancelled) - view.finish() - return - } - - presenter.updateImageQualitiesJSON(uploadableFiles.size, index) - view.onUploadMediaDeleted(index) - if (index != uploadableFiles.size && index != 0) { - // if the deleted image was not the last item to be uploaded, check quality of next - repository.getUploadItem(index)?.let { - presenter.checkImageQuality(it, index) + uploadableFiles?.let { + view.setImageCancelled(true) + repository.deletePicture(uploadableFiles[index].getFilePath()) + if (uploadableFiles.size == 1) { + view.showMessage(R.string.upload_cancelled) + view.finish() + return } - } - if (uploadableFiles.size < 2) { - view.showHideTopCard(false) - } + presenter.updateImageQualitiesJSON(uploadableFiles.size, index) + view.onUploadMediaDeleted(index) + if (index != uploadableFiles.size && index != 0) { + // if the deleted image was not the last item to be uploaded, check quality of next + repository.getUploadItem(index)?.let { + presenter.checkImageQuality(it, index) + } + } - //In case lets update the number of uploadable media - view.updateTopCardTitle() + if (uploadableFiles.size < 2) { + view.showHideTopCard(false) + } + + //In case lets update the number of uploadable media + view.updateTopCardTitle() + } } override fun onAttachView(view: UploadContract.View) { From 900297829207bb56a6ec06469d0bdf3133e08ce1 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Wed, 2 Apr 2025 16:31:02 +0530 Subject: [PATCH 19/20] fix: hide the thumbnail card on fragments other than MediaDetailFragment --- .../main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 71ffb74d8..8b7e41370 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -387,6 +387,11 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onUploadMediaDeleted(index: Int) { fragments!!.removeAt(index) //Remove the corresponding fragment uploadableFiles.removeAt(index) //Remove the files from the list + + if(fragments!![currentSelectedPosition] !is UploadMediaDetailFragment) { + // Should hide the top card current fragment is not the media detail fragment + showHideTopCard(false) + } thumbnailsAdapter!!.notifyItemRemoved(index) //Notify the thumbnails adapter uploadImagesAdapter!!.notifyDataSetChanged() //Notify the ViewPager } From 3842ba952fdff7e20dbfa42bb4dd2805f96ec857 Mon Sep 17 00:00:00 2001 From: Rohit Verma Date: Wed, 2 Apr 2025 17:07:46 +0530 Subject: [PATCH 20/20] refactor: avoid checking fragment is currentSelectedPosition is out of bounds --- .../main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 8b7e41370..ee0b21210 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -388,7 +388,10 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C fragments!!.removeAt(index) //Remove the corresponding fragment uploadableFiles.removeAt(index) //Remove the files from the list - if(fragments!![currentSelectedPosition] !is UploadMediaDetailFragment) { + val isMediaDetailFragment = fragments!!.getOrNull(currentSelectedPosition)?.let { + it is UploadMediaDetailFragment + } ?: false + if(!isMediaDetailFragment) { // Should hide the top card current fragment is not the media detail fragment showHideTopCard(false) }