diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt
index 47ee8588b..75c4ac26d 100644
--- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt
+++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.kt
@@ -184,32 +184,32 @@ class LoginActivity : AccountAuthenticatorActivity() {
// if progressDialog is visible during the configuration change then store state as true else false so that
// we maintain visibility of progressDialog after configuration change
if (progressDialog != null && progressDialog!!.isShowing) {
- outState.putBoolean(saveProgressDialog, true)
+ outState.putBoolean(SAVE_PROGRESS_DIALOG, true)
} else {
- outState.putBoolean(saveProgressDialog, false)
+ outState.putBoolean(SAVE_PROGRESS_DIALOG, false)
}
outState.putString(
- saveErrorMessage,
+ SAVE_ERROR_MESSAGE,
binding!!.errorMessage.text.toString()
) //Save the errorMessage
outState.putString(
- saveUsername,
+ SAVE_USERNAME,
binding!!.loginUsername.text.toString()
) // Save the username
outState.putString(
- savePassword,
+ SAVE_PASSWORD,
binding!!.loginPassword.text.toString()
) // Save the password
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
- binding!!.loginUsername.setText(savedInstanceState.getString(saveUsername))
- binding!!.loginPassword.setText(savedInstanceState.getString(savePassword))
- if (savedInstanceState.getBoolean(saveProgressDialog)) {
+ binding!!.loginUsername.setText(savedInstanceState.getString(SAVE_USERNAME))
+ binding!!.loginPassword.setText(savedInstanceState.getString(SAVE_PASSWORD))
+ if (savedInstanceState.getBoolean(SAVE_PROGRESS_DIALOG)) {
performLogin()
}
- val errorMessage = savedInstanceState.getString(saveErrorMessage)
+ val errorMessage = savedInstanceState.getString(SAVE_ERROR_MESSAGE)
if (sessionManager.isUserLoggedIn) {
showMessage(R.string.login_success, R.color.primaryDarkColor)
} else {
@@ -396,9 +396,9 @@ class LoginActivity : AccountAuthenticatorActivity() {
fun startYourself(context: Context) =
context.startActivity(Intent(context, LoginActivity::class.java))
- const val saveProgressDialog: String = "ProgressDialog_state"
- const val saveErrorMessage: String = "errorMessage"
- const val saveUsername: String = "username"
- const val savePassword: String = "password"
+ const val SAVE_PROGRESS_DIALOG: String = "ProgressDialog_state"
+ const val SAVE_ERROR_MESSAGE: String = "errorMessage"
+ const val SAVE_USERNAME: String = "username"
+ const val SAVE_PASSWORD: String = "password"
}
}
diff --git a/app/src/main/java/fr/free/nrw/commons/settings/Prefs.kt b/app/src/main/java/fr/free/nrw/commons/settings/Prefs.kt
index 13e8efb57..05c850a03 100644
--- a/app/src/main/java/fr/free/nrw/commons/settings/Prefs.kt
+++ b/app/src/main/java/fr/free/nrw/commons/settings/Prefs.kt
@@ -1,11 +1,7 @@
package fr.free.nrw.commons.settings
object Prefs {
- const val GLOBAL_PREFS = "fr.free.nrw.commons.preferences"
-
- const val TRACKING_ENABLED = "eventLogging"
const val DEFAULT_LICENSE = "defaultLicense"
- const val UPLOADS_SHOWING = "uploadsShowing"
const val MANAGED_EXIF_TAGS = "managed_exif_tags"
const val DESCRIPTION_LANGUAGE = "languageDescription"
const val APP_UI_LANGUAGE = "appUiLanguage"
diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.kt b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.kt
index da79244bc..91c88d7b0 100644
--- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.kt
+++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsActivity.kt
@@ -12,7 +12,6 @@ import fr.free.nrw.commons.theme.BaseActivity
class SettingsActivity : BaseActivity() {
private lateinit var binding: ActivitySettingsBinding
-// private var settingsDelegate: AppCompatDelegate? = null
/**
* to be called when the activity starts
diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.kt b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.kt
index 36528a919..166cb1e97 100644
--- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.kt
+++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.kt
@@ -1,7 +1,6 @@
package fr.free.nrw.commons.settings
import android.Manifest.permission
-import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.content.Context.MODE_PRIVATE
@@ -11,7 +10,6 @@ import android.net.Uri
import android.os.Bundle
import android.text.Editable
import android.text.TextWatcher
-import android.view.KeyEvent
import android.view.View
import android.widget.AdapterView
import android.widget.Button
@@ -131,7 +129,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
inAppCameraLocationPref?.setOnPreferenceChangeListener { _, newValue ->
val isInAppCameraLocationTurnedOn = newValue as Boolean
if (isInAppCameraLocationTurnedOn) {
- createDialogsAndHandleLocationPermissions(requireActivity())
+ createDialogsAndHandleLocationPermissions()
}
true
}
@@ -256,7 +254,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
*
* @param activity
*/
- private fun createDialogsAndHandleLocationPermissions(activity: Activity) {
+ private fun createDialogsAndHandleLocationPermissions() {
inAppCameraLocationPermissionLauncher.launch(arrayOf(permission.ACCESS_FINE_LOCATION))
}
@@ -284,7 +282,6 @@ class SettingsFragment : PreferenceFragmentCompat() {
return object : PreferenceGroupAdapter(preferenceScreen) {
override fun onBindViewHolder(holder: PreferenceViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
- val preference = getItem(position)
val iconFrame: View? = holder.itemView.findViewById(R.id.icon_frame)
iconFrame?.visibility = View.GONE
}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt
index fc57ffe41..5b3eb5140 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt
+++ b/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt
@@ -1,5 +1,8 @@
package fr.free.nrw.commons.upload
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context.CLIPBOARD_SERVICE
import android.net.Uri
import android.text.TextUtils
import android.view.LayoutInflater
@@ -13,6 +16,7 @@ import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.facebook.imagepipeline.request.ImageRequest
+import com.google.android.material.snackbar.Snackbar
import fr.free.nrw.commons.R
import fr.free.nrw.commons.contributions.Contribution
import java.io.File
@@ -51,6 +55,24 @@ class FailedUploadsAdapter(
position: Int,
) {
val item: Contribution? = getItem(position)
+ val itemView = holder.itemView
+ val clipboardManager =
+ itemView.context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
+
+ itemView.setOnLongClickListener {
+ val clip = ClipData.newPlainText(
+ itemView.context.getString(R.string.caption),
+ item?.media?.displayTitle
+ )
+ clipboardManager.setPrimaryClip(clip)
+ Snackbar.make(
+ itemView,
+ itemView.context.getString(R.string.caption_copied_to_clipboard),
+ Snackbar.LENGTH_SHORT
+ ).show()
+ true
+ }
+
if (item != null) {
holder.titleTextView.setText(item.media.displayTitle)
}
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.kt b/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.kt
index aa1f8aed6..68a3cb362 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.kt
+++ b/app/src/main/java/fr/free/nrw/commons/upload/FileUtilsWrapper.kt
@@ -49,9 +49,10 @@ class FileUtilsWrapper @Inject constructor(private val context: Context) {
while ((bis.read(buffer).also { size = it }) > 0) {
buffers.add(
writeToFile(
- buffer.copyOf(size),
+ buffer,
file.name ?: "",
- getFileExt(file.name)
+ getFileExt(file.name),
+ size
)
)
}
@@ -67,7 +68,7 @@ class FileUtilsWrapper @Inject constructor(private val context: Context) {
* Create a temp file containing the passed byte data.
*/
@Throws(IOException::class)
- private fun writeToFile(data: ByteArray, fileName: String, fileExtension: String): File {
+ private fun writeToFile(data: ByteArray, fileName: String, fileExtension: String, size: Int): File {
val file = File.createTempFile(fileName, fileExtension, context.cacheDir)
try {
if (!file.exists()) {
@@ -75,7 +76,7 @@ class FileUtilsWrapper @Inject constructor(private val context: Context) {
}
FileOutputStream(file).use { fos ->
- fos.write(data)
+ fos.write(data, 0, size)
}
} catch (throwable: Exception) {
Timber.e(throwable, "Failed to create file")
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt
index 8edfcb472..7f0b8aba1 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt
+++ b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt
@@ -1,5 +1,8 @@
package fr.free.nrw.commons.upload
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context.CLIPBOARD_SERVICE
import android.net.Uri
import android.text.TextUtils
import android.view.LayoutInflater
@@ -13,6 +16,7 @@ import androidx.paging.PagedListAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.facebook.imagepipeline.request.ImageRequest
+import com.google.android.material.snackbar.Snackbar
import fr.free.nrw.commons.R
import fr.free.nrw.commons.contributions.Contribution
import java.io.File
@@ -99,6 +103,22 @@ class PendingUploadsAdapter(
fun bind(contribution: Contribution) {
titleTextView.text = contribution.media.displayTitle
+ val clipboardManager =
+ itemView.context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
+
+ itemView.setOnLongClickListener {
+ val clip = ClipData.newPlainText(
+ itemView.context.getString(R.string.caption),
+ titleTextView.text
+ )
+ clipboardManager.setPrimaryClip(clip)
+ Snackbar.make(
+ itemView,
+ itemView.context.getString(R.string.caption_copied_to_clipboard),
+ Snackbar.LENGTH_SHORT
+ ).show()
+ true
+ }
val imageSource: String = contribution.localUri.toString()
var imageRequest: ImageRequest? = null
diff --git a/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwQueryPage.kt b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwQueryPage.kt
index 74dfa511e..7ab1db9bc 100644
--- a/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwQueryPage.kt
+++ b/app/src/main/java/fr/free/nrw/commons/wikidata/mwapi/MwQueryPage.kt
@@ -34,7 +34,7 @@ class MwQueryPage : BaseModel() {
fun title(): String = title!!
- fun categoryInfo(): CategoryInfo = categoryinfo!!
+ fun categoryInfo(): CategoryInfo? = categoryinfo
fun index(): Int = index
diff --git a/app/src/main/res/drawable/ic_my_location_black_24dp.xml b/app/src/main/res/drawable/ic_my_location_black_24dp.xml
index 708ec0444..9afb0a239 100644
--- a/app/src/main/res/drawable/ic_my_location_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_my_location_black_24dp.xml
@@ -4,6 +4,6 @@
android:viewportWidth="24.0"
android:viewportHeight="24.0">
diff --git a/app/src/main/res/layout/fragment_nearby_parent.xml b/app/src/main/res/layout/fragment_nearby_parent.xml
index e1d82e6e7..8dcfe0fef 100644
--- a/app/src/main/res/layout/fragment_nearby_parent.xml
+++ b/app/src/main/res/layout/fragment_nearby_parent.xml
@@ -117,12 +117,12 @@
android:layout_alignParentRight="true"
android:clickable="true"
android:visibility="visible"
- app:backgroundTint="@color/main_background_light"
+ android:layout_margin="16dp"
+ app:backgroundTint="?attr/mainBackground"
app:elevation="@dimen/dimen_6"
app:fabSize="normal"
app:layout_anchorGravity="top|right|end"
- app:srcCompat="@drawable/ic_my_location_black_24dp"
- app:useCompatPadding="true" />
+ app:srcCompat="@drawable/ic_my_location_black_24dp" />
+ app:srcCompat="@drawable/ic_info_outline_24dp" />
Uğurlu giriş!
Giriş baş tutmadı!
Fayl tapılmadı. Xahiş edirik başqa bir fayl üzərində cəhd edin.
- Maksimum təkrar cəhd limitinə çatdınız! Yükləməni ləğv edin və yenidən cəhd edin
- Batareya optimallaşdırılmasını söndürmək?
+ Maksimum təkrar cəhd limitinə çatdınız! Zəhmət olmasa, yükləməni ləğv edin və yenidən cəhd edin
+ Batareya optimallaşdırılması söndürülsün?
Doğrulama alınmadı, xahiş edirəm yenidən daxil olun
Yükləmə başladı!
%1$s yükləndi!
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 38d827669..d75dfbe17 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -26,6 +26,7 @@
* Reedy
* RucolaSpacecat
* Sebastian Wallroth
+* SergeCroise
* SpaceEnergy
* Sujan
* Sushi
@@ -313,6 +314,7 @@
Den Wikitext in die Zwischenablage kopieren
Der Wikitext wurde in die Zwischenablage kopiert
„In der Nähe“ arbeiten möglicherwiese nicht richtig. Der Standort ist nicht verfügbar.
+ Internet ist nicht verfügbar. Es werden nur zwischengespeicherte Orte angezeigt.
Standortzugriff verweigert. Bitte lege deinen Standort manuell fest, um diese Funktion nutzen zu können.
Berechtigung zur Anzeige einer Liste mit Orten in der Nähe erforderlich
Berechtigung zur Anzeige einer Liste mit Orten in der Nähe erforderlich
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 90669d8c3..6901b37ae 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -4,6 +4,7 @@
* Astralnet
* Domdomegg
* Evropi
+* Fotis A.
* Geraki
* Giannaras99
* Giorgos456
@@ -296,6 +297,7 @@
Αντιγράψτε το wikitext στο πρόχειρο
Το wikitext αντιγράφηκε στο πρόχειρο
Η λειτουργία «Κοντά σας» ενδέχεται να μη δουλεύει σωστά, η Τοποθεσία δεν είναι διαθέσιμη.
+ Το Διαδίκτυο δεν είναι διαθέσιμο. Εμφάνιση μόνο αποθηκευμένων τοποθεσιών.
Δεν επιτρέπεται η πρόσβαση στην τοποθεσία. Ρυθμίστε την τοποθεσία σας με χειροκίνητο τρόπο για να χρησιμοποιήσετε αυτήν τη δυνατότητα.
Απαιτείται άδεια για την εμφάνιση καταλόγου κοντινών σημείων
Απαιτείται άδεια για την εμφάνιση καταλόγου κοντινών εικόνων
diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml
index 7ec1b9834..f12022169 100644
--- a/app/src/main/res/values-ia/strings.xml
+++ b/app/src/main/res/values-ia/strings.xml
@@ -100,6 +100,8 @@
Prender photo
A proximitate
Mi incargamentos
+ Copiar ligamine
+ Le ligamine ha essite copiate al area de transferentia
Condivider
Visitar le pagina del file
Legenda (obligatori)
@@ -118,6 +120,7 @@
Cercar categorias
Cerca elementos que tu file representa (montania, Taj Mahal, etc.)
Salveguardar
+ Menu de disbordamento
Refrescar
Listar
(Nihil incargate ancora)
@@ -269,6 +272,7 @@
Copiar le wikitexto al area de transferentia
Le wikitexto ha essite copiate al area de transferentia
“A proximitate” poterea non functionar perque le localisation non es disponibile.
+ Internet indisponibile. Appare solmente le locos in cache.
Le accesso al localisation ha essite refusate. Per favor indica tu localisation manualmente pro usar iste function.
Permission necessari pro monstrar un lista de locos a proximitate
Permission necessari pro monstrar un lista de imagines a proximitate
@@ -352,11 +356,13 @@
Deler
Realisationes
Profilo
+ Insignias
Statisticas
Regratiamentos recipite
Imagines eminente
Imagines via “Locos a proximitate”
- Nivello
+ Nivello %d
+ %s (Nivello %s)
Imagines incargate
Imagines non revertite
Imagines usate
@@ -388,6 +394,7 @@
Necun application cartographic compatibile pote esser trovate sur tu apparato. Per favor installa un application cartographic pro usar iste function.
Imagines
Locos
+ Categorias
Adder al/Remover del marcapaginas
Marcapaginas
Tu non ha addite alcun marcapagina
@@ -469,6 +476,7 @@
Tu non ha notificationes non legite
Tu non ha notificationes legite
Condivider registros usante
+ Consulta tu cassa de entrata
Vider legites
Vider non legites
Un error ha occurrite durante le selection de imagines
@@ -776,4 +784,21 @@
Pendente
Fallite
Non poteva cargar le datos del loco
+ Deler dossier
+ Confirmar deletion
+ Es tu secur de voler deler le dossier %1$s que contine %2$d objectos?
+ Deler
+ Cancellar
+ Le dossier %1$s ha essite delite
+ Le dossier %1$s non ha potite esser delite
+ Error durante le elimination del contento del dossier: %1$s
+ Non poteva recuperar le percurso al dossier pro le “bucket ID” %1$d
+ Iste loco non ha ancora un photo. Proque non prender un?
+ Iste loco ja ha un photo.
+ Ora se verifica si iste loco ha un photo.
+ Error durante le cargamento
+ Necun uso trovate
+ Commons
+ Altere wikis
+ Usos del file
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 17e4b2556..354c44b5c 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -1,6 +1,7 @@