mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 12:23:58 +01:00
Merge branch 'main' into fix/crash-on-lower-api
This commit is contained in:
commit
8c08e88465
44 changed files with 436 additions and 58 deletions
|
|
@ -18,12 +18,12 @@ if (isRunningOnTravisAndIsNotPRBuild) {
|
|||
|
||||
android {
|
||||
namespace = "fr.free.nrw.commons"
|
||||
compileSdk = 34
|
||||
compileSdk = 35
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "fr.free.nrw.commons"
|
||||
minSdk = 21
|
||||
targetSdk = 34
|
||||
targetSdk = 35
|
||||
versionCode = 1055
|
||||
versionName = "5.6.1"
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import fr.free.nrw.commons.utils.ConfigUtils.getVersionNameWithSha
|
|||
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
|
||||
import java.util.Collections
|
||||
import androidx.core.net.toUri
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
|
||||
import fr.free.nrw.commons.utils.handleWebUrl
|
||||
import fr.free.nrw.commons.utils.setUnderlinedText
|
||||
|
||||
|
|
@ -47,6 +48,7 @@ class AboutActivity : BaseActivity() {
|
|||
*/
|
||||
binding = ActivityAboutBinding.inflate(layoutInflater)
|
||||
val view: View = binding!!.root
|
||||
applyEdgeToEdgeTopInsets(binding!!.toolbarLayout)
|
||||
setContentView(view)
|
||||
|
||||
setSupportActionBar(binding!!.toolbarBinding.toolbar)
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import fr.free.nrw.commons.databinding.ActivityWelcomeBinding
|
|||
import fr.free.nrw.commons.databinding.PopupForCopyrightBinding
|
||||
import fr.free.nrw.commons.quiz.QuizActivity
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
|
||||
|
||||
class WelcomeActivity : BaseActivity() {
|
||||
|
|
@ -23,6 +24,7 @@ class WelcomeActivity : BaseActivity() {
|
|||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = ActivityWelcomeBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding!!.welcomePager.rootView)
|
||||
setContentView(binding!!.root)
|
||||
|
||||
isQuiz = intent?.extras?.getBoolean("isQuiz", false) ?: false
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import androidx.appcompat.app.AlertDialog
|
|||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import androidx.core.app.NavUtils
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.WindowCompat
|
||||
import fr.free.nrw.commons.BuildConfig
|
||||
import fr.free.nrw.commons.CommonsApplication
|
||||
import fr.free.nrw.commons.R
|
||||
|
|
@ -32,11 +33,13 @@ import fr.free.nrw.commons.contributions.MainActivity
|
|||
import fr.free.nrw.commons.databinding.ActivityLoginBinding
|
||||
import fr.free.nrw.commons.di.ApplicationlessInjection
|
||||
import fr.free.nrw.commons.kvstore.JsonKvStore
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.utils.AbstractTextWatcher
|
||||
import fr.free.nrw.commons.utils.ActivityUtils.startActivityWithFlags
|
||||
import fr.free.nrw.commons.utils.ConfigUtils.isBetaFlavour
|
||||
import fr.free.nrw.commons.utils.SystemThemeUtils
|
||||
import fr.free.nrw.commons.utils.ViewUtil.hideKeyboard
|
||||
import fr.free.nrw.commons.utils.handleKeyboardInsets
|
||||
import fr.free.nrw.commons.utils.handleWebUrl
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import timber.log.Timber
|
||||
|
|
@ -79,7 +82,14 @@ class LoginActivity : AccountAuthenticatorActivity() {
|
|||
delegate.installViewFactory()
|
||||
delegate.onCreate(savedInstanceState)
|
||||
|
||||
WindowCompat.getInsetsController(window, window.decorView)
|
||||
.isAppearanceLightStatusBars = !isDarkTheme
|
||||
|
||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||
|
||||
binding = ActivityLoginBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding!!.root)
|
||||
binding?.aboutPrivacyPolicy?.handleKeyboardInsets()
|
||||
with(binding!!) {
|
||||
setContentView(root)
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import android.widget.Toast
|
|||
import fr.free.nrw.commons.BuildConfig
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import timber.log.Timber
|
||||
|
||||
class SignupActivity : BaseActivity() {
|
||||
|
|
@ -21,6 +22,7 @@ class SignupActivity : BaseActivity() {
|
|||
Timber.d("Signup Activity started")
|
||||
|
||||
webView = WebView(this)
|
||||
applyEdgeToEdgeAllInsets(webView!!)
|
||||
with(webView!!) {
|
||||
setContentView(this)
|
||||
webViewClient = MyWebViewClient()
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ import fr.free.nrw.commons.explore.categories.sub.SubCategoriesFragment
|
|||
import fr.free.nrw.commons.media.MediaDetailPagerFragment
|
||||
import fr.free.nrw.commons.media.MediaDetailProvider
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.utils.handleWebUrl
|
||||
import fr.free.nrw.commons.wikidata.model.WikiSite
|
||||
import fr.free.nrw.commons.wikidata.model.page.PageTitle
|
||||
|
|
@ -57,6 +58,7 @@ class CategoryDetailsActivity : BaseActivity(),
|
|||
|
||||
binding = ActivityCategoryDetailsBinding.inflate(layoutInflater)
|
||||
val view = binding.root
|
||||
applyEdgeToEdgeAllInsets(view)
|
||||
setContentView(view)
|
||||
supportFragmentManager = getSupportFragmentManager()
|
||||
viewPagerAdapter = ViewPagerAdapter(this, supportFragmentManager)
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ import fr.free.nrw.commons.quiz.QuizChecker
|
|||
import fr.free.nrw.commons.settings.SettingsFragment
|
||||
import fr.free.nrw.commons.startWelcome
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.upload.UploadProgressActivity
|
||||
import fr.free.nrw.commons.upload.worker.WorkRequestHelper.Companion.makeOneTimeWorkRequest
|
||||
import fr.free.nrw.commons.utils.ViewUtilWrapper
|
||||
|
|
@ -112,6 +113,7 @@ class MainActivity : BaseActivity(), FragmentManager.OnBackStackChangedListener
|
|||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = MainBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding!!.root)
|
||||
setContentView(binding!!.root)
|
||||
setSupportActionBar(binding!!.toolbarBinding.toolbar)
|
||||
tabLayout = binding!!.fragmentMainNavTabLayout
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ import androidx.compose.ui.tooling.preview.Preview
|
|||
import androidx.compose.ui.unit.dp
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.ViewGroupCompat
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.customselector.database.NotForUploadStatus
|
||||
|
|
@ -56,6 +57,8 @@ 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 fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
|
|
@ -198,6 +201,9 @@ class CustomSelectorActivity :
|
|||
.fillMaxWidth(),
|
||||
)
|
||||
}
|
||||
ViewGroupCompat.installCompatInsetsDispatch(binding.root)
|
||||
applyEdgeToEdgeTopInsets(toolbarBinding.toolbarLayout)
|
||||
bottomSheetBinding.bottomLayout.applyEdgeToEdgeBottomPaddingInsets()
|
||||
val view = binding.root
|
||||
setContentView(view)
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import fr.free.nrw.commons.databinding.FragmentCustomSelectorBinding
|
|||
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
|
||||
import fr.free.nrw.commons.media.MediaClient
|
||||
import fr.free.nrw.commons.upload.FileProcessor
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
|
|
@ -99,6 +100,7 @@ class FolderFragment : CommonsDaggerSupportFragment() {
|
|||
selectorRV = binding?.selectorRv
|
||||
loader = binding?.loader
|
||||
with(binding?.selectorRv) {
|
||||
this?.applyEdgeToEdgeBottomPaddingInsets()
|
||||
this?.layoutManager = gridLayoutManager
|
||||
this?.setHasFixedSize(true)
|
||||
this?.adapter = folderAdapter
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ import fr.free.nrw.commons.media.MediaClient
|
|||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.upload.FileProcessor
|
||||
import fr.free.nrw.commons.upload.FileUtilsWrapper
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
|
|
@ -217,6 +218,7 @@ class ImageFragment :
|
|||
imageAdapter.setSingleSelection(singleSelection)
|
||||
gridLayoutManager = GridLayoutManager(context, getSpanCount())
|
||||
with(binding?.selectorRv) {
|
||||
this?.applyEdgeToEdgeBottomPaddingInsets()
|
||||
this?.layoutManager = gridLayoutManager
|
||||
this?.setHasFixedSize(true)
|
||||
this?.adapter = imageAdapter
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import android.speech.RecognizerIntent
|
|||
import android.view.View
|
||||
import androidx.activity.result.ActivityResult
|
||||
import androidx.activity.result.contract.ActivityResultContracts
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import fr.free.nrw.commons.CommonsApplication
|
||||
|
|
@ -20,9 +21,11 @@ import fr.free.nrw.commons.description.EditDescriptionConstants.WIKITEXT
|
|||
import fr.free.nrw.commons.recentlanguages.RecentLanguagesDao
|
||||
import fr.free.nrw.commons.settings.Prefs
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomInsets
|
||||
import fr.free.nrw.commons.upload.UploadMediaDetail
|
||||
import fr.free.nrw.commons.upload.UploadMediaDetailAdapter
|
||||
import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopPaddingInsets
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.functions.Consumer
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
|
|
@ -87,6 +90,10 @@ class DescriptionEditActivity :
|
|||
super.onCreate(savedInstanceState)
|
||||
|
||||
binding = ActivityDescriptionEditBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeBottomInsets(binding.btnEditSubmit)
|
||||
WindowCompat.getInsetsController(window, window.decorView)
|
||||
.isAppearanceLightStatusBars = false
|
||||
binding.toolbar.applyEdgeToEdgeTopPaddingInsets()
|
||||
setContentView(binding.root)
|
||||
|
||||
val bundle = intent.extras
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import fr.free.nrw.commons.media.MediaDetailProvider
|
|||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.FragmentUtils.isFragmentUIActive
|
||||
import fr.free.nrw.commons.utils.ViewUtil.hideKeyboard
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import timber.log.Timber
|
||||
import java.util.Date
|
||||
|
|
@ -48,6 +49,7 @@ class SearchActivity : BaseActivity(), MediaDetailProvider, CategoryImagesCallba
|
|||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = ActivitySearchBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding!!.root)
|
||||
setContentView(binding!!.root)
|
||||
|
||||
title = getString(R.string.title_activity_search)
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import fr.free.nrw.commons.media.MediaDetailProvider
|
|||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.upload.structure.depictions.DepictModel
|
||||
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.utils.handleWebUrl
|
||||
import fr.free.nrw.commons.wikidata.WikidataConstants
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
|
|
@ -55,6 +56,7 @@ class WikidataItemDetailsActivity : BaseActivity(), MediaDetailProvider, Categor
|
|||
super.onCreate(savedInstanceState)
|
||||
|
||||
binding = ActivityWikidataItemDetailsBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding!!.root)
|
||||
setContentView(binding!!.root)
|
||||
supportFragmentManager = getSupportFragmentManager()
|
||||
viewPagerAdapter = ViewPagerAdapter(this, getSupportFragmentManager())
|
||||
|
|
|
|||
|
|
@ -296,10 +296,19 @@ object FilePicker : Constants {
|
|||
* https://github.com/commons-app/apps-android-commons/issues/6357
|
||||
*/
|
||||
private fun takePersistableUriPermissions(context: Context, result: ActivityResult) {
|
||||
result.data?.data?.also { uri ->
|
||||
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
|
||||
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
|
||||
result.data?.let { intentData ->
|
||||
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
// Persist the URI permission for all URIs in the clip data
|
||||
// if multiple images are selected,
|
||||
// or for the single URI if only one image is selected
|
||||
intentData.clipData?.let { clipData ->
|
||||
for (i in 0 until clipData.itemCount) {
|
||||
context.contentResolver.takePersistableUriPermission(
|
||||
clipData.getItemAt(i).uri, takeFlags)
|
||||
}
|
||||
} ?: intentData.data?.let { uri ->
|
||||
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -358,6 +367,7 @@ object FilePicker : Constants {
|
|||
callbacks: Callbacks
|
||||
) {
|
||||
if (result.resultCode == Activity.RESULT_OK && !isPhoto(result.data)) {
|
||||
takePersistableUriPermissions(activity, result)
|
||||
try {
|
||||
val files = getFilesFromGalleryPictures(result.data, activity)
|
||||
callbacks.onImagesPicked(files, ImageSource.GALLERY, restoreType(activity))
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import androidx.core.content.ContextCompat
|
|||
import androidx.core.content.IntentCompat
|
||||
import androidx.core.os.BundleCompat
|
||||
import androidx.core.text.HtmlCompat
|
||||
import androidx.core.view.WindowCompat
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import fr.free.nrw.commons.CameraPosition
|
||||
import fr.free.nrw.commons.CommonsApplication
|
||||
|
|
@ -44,6 +45,8 @@ import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Compani
|
|||
import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.Companion.LAST_ZOOM
|
||||
import fr.free.nrw.commons.utils.DialogUtil
|
||||
import fr.free.nrw.commons.utils.MapUtils.ZOOM_LEVEL
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomInsets
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopPaddingInsets
|
||||
import fr.free.nrw.commons.utils.handleGeoCoordinates
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
|
|
@ -330,6 +333,9 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
|
|||
*/
|
||||
private fun getToolbarUI() {
|
||||
val toolbar: ConstraintLayout = findViewById(R.id.location_picker_toolbar)
|
||||
WindowCompat.getInsetsController(window, window.decorView)
|
||||
.isAppearanceLightStatusBars = false
|
||||
toolbar.applyEdgeToEdgeTopPaddingInsets()
|
||||
largeToolbarText = findViewById(R.id.location_picker_toolbar_primary_text_view)
|
||||
smallToolbarText = findViewById(R.id.location_picker_toolbar_secondary_text_view)
|
||||
toolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.primaryColor))
|
||||
|
|
@ -460,6 +466,7 @@ class LocationPickerActivity : BaseActivity(), LocationPermissionCallback {
|
|||
*/
|
||||
private fun addPlaceSelectedButton() {
|
||||
placeSelectedButton = findViewById(R.id.location_chosen_button)
|
||||
applyEdgeToEdgeBottomInsets(placeSelectedButton)
|
||||
placeSelectedButton.setOnClickListener { placeSelected() }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import android.os.Bundle
|
|||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import androidx.core.view.ViewGroupCompat
|
||||
import androidx.recyclerview.widget.DividerItemDecoration
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
|
|
@ -19,8 +20,10 @@ import fr.free.nrw.commons.databinding.ActivityNotificationBinding
|
|||
import fr.free.nrw.commons.notification.models.Notification
|
||||
import fr.free.nrw.commons.notification.models.NotificationType
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeTopInsets
|
||||
import fr.free.nrw.commons.utils.NetworkUtils
|
||||
import fr.free.nrw.commons.utils.ViewUtil
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeBottomPaddingInsets
|
||||
import fr.free.nrw.commons.utils.handleWebUrl
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
|
|
@ -56,6 +59,9 @@ class NotificationActivity : BaseActivity() {
|
|||
super.onCreate(savedInstanceState)
|
||||
isRead = intent.getStringExtra("title") == "read"
|
||||
binding = ActivityNotificationBinding.inflate(layoutInflater)
|
||||
ViewGroupCompat.installCompatInsetsDispatch(binding.root)
|
||||
applyEdgeToEdgeTopInsets(binding.toolbar.toolbar)
|
||||
binding.listView.applyEdgeToEdgeBottomPaddingInsets()
|
||||
setContentView(binding.root)
|
||||
mNotificationWorkerFragment = supportFragmentManager.findFragmentByTag(
|
||||
tagNotificationWorkerFragment
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import fr.free.nrw.commons.databinding.ActivityProfileBinding
|
|||
import fr.free.nrw.commons.profile.achievements.AchievementsFragment
|
||||
import fr.free.nrw.commons.profile.leaderboard.LeaderboardFragment
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.utils.DialogUtil
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
|
|
@ -61,6 +62,7 @@ class ProfileActivity : BaseActivity() {
|
|||
super.onCreate(savedInstanceState)
|
||||
|
||||
binding = ActivityProfileBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding.root)
|
||||
setContentView(binding.root)
|
||||
setSupportActionBar(binding.toolbarBinding.toolbar)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,11 @@ package fr.free.nrw.commons.quiz
|
|||
import android.annotation.SuppressLint
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
|
||||
|
||||
import com.facebook.drawee.drawable.ProgressBarDrawable
|
||||
|
|
@ -15,6 +17,7 @@ import fr.free.nrw.commons.databinding.ActivityQuizBinding
|
|||
import java.util.ArrayList
|
||||
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
|
||||
|
||||
class QuizActivity : AppCompatActivity() {
|
||||
|
|
@ -37,7 +40,11 @@ class QuizActivity : AppCompatActivity() {
|
|||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
binding = ActivityQuizBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding.root)
|
||||
WindowCompat.getInsetsController(window, window.decorView)
|
||||
.isAppearanceLightStatusBars = true
|
||||
setContentView(binding.root)
|
||||
|
||||
quizController.initialize(this)
|
||||
|
|
|
|||
|
|
@ -12,9 +12,11 @@ import android.view.MenuItem
|
|||
import android.view.View
|
||||
import android.widget.ImageView
|
||||
import android.widget.TextView
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.WindowCompat
|
||||
|
||||
import fr.free.nrw.commons.databinding.ActivityQuizResultBinding
|
||||
import java.io.File
|
||||
|
|
@ -22,6 +24,7 @@ import java.io.FileOutputStream
|
|||
|
||||
import fr.free.nrw.commons.R
|
||||
import fr.free.nrw.commons.contributions.MainActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -35,7 +38,11 @@ class QuizResultActivity : AppCompatActivity() {
|
|||
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
binding = ActivityQuizResultBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding!!.root)
|
||||
WindowCompat.getInsetsController(window, window.decorView)
|
||||
.isAppearanceLightStatusBars = true
|
||||
setContentView(binding?.root)
|
||||
|
||||
setSupportActionBar(binding?.toolbar?.toolbar)
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ import fr.free.nrw.commons.databinding.ActivityReviewBinding
|
|||
import fr.free.nrw.commons.delete.DeleteHelper
|
||||
import fr.free.nrw.commons.media.MediaDetailFragment
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.utils.DialogUtil
|
||||
import fr.free.nrw.commons.utils.ViewUtil
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
|
|
@ -73,6 +74,7 @@ class ReviewActivity : BaseActivity() {
|
|||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = ActivityReviewBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding.root)
|
||||
setContentView(binding.root)
|
||||
|
||||
setSupportActionBar(binding.toolbarBinding?.toolbar)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import android.os.Bundle
|
|||
import android.view.MenuItem
|
||||
import fr.free.nrw.commons.databinding.ActivitySettingsBinding
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -21,6 +22,7 @@ class SettingsActivity : BaseActivity() {
|
|||
super.onCreate(savedInstanceState)
|
||||
binding = ActivitySettingsBinding.inflate(layoutInflater)
|
||||
val view = binding.root
|
||||
applyEdgeToEdgeAllInsets(view)
|
||||
setContentView(view)
|
||||
|
||||
setSupportActionBar(binding.toolbarBinding.toolbar)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import android.content.res.Configuration
|
|||
import android.os.Bundle
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.WindowManager
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Named
|
||||
import fr.free.nrw.commons.R
|
||||
|
|
@ -36,6 +37,7 @@ abstract class BaseActivity : CommonsDaggerAppCompatActivity() {
|
|||
1f
|
||||
)
|
||||
adjustFontScale(resources.configuration, fontScale)
|
||||
enableEdgeToEdge()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ import fr.free.nrw.commons.mwapi.UserClient
|
|||
import fr.free.nrw.commons.nearby.Place
|
||||
import fr.free.nrw.commons.settings.Prefs
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import fr.free.nrw.commons.upload.ThumbnailsAdapter.OnThumbnailDeletedListener
|
||||
import fr.free.nrw.commons.upload.categories.UploadCategoriesFragment
|
||||
import fr.free.nrw.commons.upload.depicts.DepictsFragment
|
||||
|
|
@ -177,6 +178,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C
|
|||
presenter?.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) }
|
||||
|
||||
_binding = ActivityUploadBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(_binding!!.root, false)
|
||||
setContentView(binding.root)
|
||||
|
||||
// Overrides the back button to make sure the user is prepared to lose their progress
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import fr.free.nrw.commons.ViewPagerAdapter
|
|||
import fr.free.nrw.commons.contributions.ContributionDao
|
||||
import fr.free.nrw.commons.databinding.ActivityUploadProgressBinding
|
||||
import fr.free.nrw.commons.theme.BaseActivity
|
||||
import fr.free.nrw.commons.utils.applyEdgeToEdgeAllInsets
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
|
|
@ -35,6 +36,7 @@ class UploadProgressActivity : BaseActivity() {
|
|||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = ActivityUploadProgressBinding.inflate(layoutInflater)
|
||||
applyEdgeToEdgeAllInsets(binding.root)
|
||||
setContentView(binding.root)
|
||||
viewPagerAdapter = ViewPagerAdapter(this, supportFragmentManager)
|
||||
binding.uploadProgressViewPager.setAdapter(viewPagerAdapter)
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ import fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK
|
|||
import fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult
|
||||
import fr.free.nrw.commons.utils.NetworkUtils.isInternetConnectionEstablished
|
||||
import fr.free.nrw.commons.utils.ViewUtil.showLongToast
|
||||
import fr.free.nrw.commons.utils.handleKeyboardInsets
|
||||
import timber.log.Timber
|
||||
import java.io.File
|
||||
import java.util.ArrayList
|
||||
|
|
@ -153,6 +154,7 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra
|
|||
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
|
||||
): View {
|
||||
_binding = FragmentUploadMediaDetailFragmentBinding.inflate(inflater, container, false)
|
||||
_binding!!.mediaDetailCardView.handleKeyboardInsets()
|
||||
return binding.root
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -393,6 +393,12 @@ class UploadWorker(
|
|||
makeWikiDataEdit(uploadResult, contribution)
|
||||
}
|
||||
showSuccessNotification(contribution)
|
||||
if (appContext.contentResolver.persistedUriPermissions.any {
|
||||
it.uri == contribution.contentUri }) {
|
||||
appContext.contentResolver.releasePersistableUriPermission(
|
||||
contribution.contentUri!!, Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
)
|
||||
}
|
||||
} else {
|
||||
Timber.e("Stash Upload failed")
|
||||
showFailedNotification(contribution)
|
||||
|
|
|
|||
|
|
@ -12,9 +12,9 @@ object ConfigUtils {
|
|||
val isBetaFlavour: Boolean = BuildConfig.FLAVOR == "beta"
|
||||
|
||||
@JvmStatic
|
||||
private fun Context.getVersionName(): String =
|
||||
private fun Context.getVersionName(): String? =
|
||||
try {
|
||||
packageManager.getPackageInfo(packageName, 0).versionName
|
||||
packageManager.getPackageInfo(packageName, 0).versionName ?: BuildConfig.VERSION_NAME
|
||||
} catch (e: PackageManager.NameNotFoundException) {
|
||||
BuildConfig.VERSION_NAME
|
||||
}
|
||||
|
|
|
|||
229
app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt
Normal file
229
app/src/main/java/fr/free/nrw/commons/utils/EdgeToEdgeUtils.kt
Normal file
|
|
@ -0,0 +1,229 @@
|
|||
package fr.free.nrw.commons.utils
|
||||
|
||||
import android.view.View
|
||||
import android.view.ViewGroup.MarginLayoutParams
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsAnimationCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import androidx.core.view.marginBottom
|
||||
import androidx.core.view.marginLeft
|
||||
import androidx.core.view.marginRight
|
||||
import androidx.core.view.marginTop
|
||||
import androidx.core.view.updateLayoutParams
|
||||
import androidx.core.view.updatePadding
|
||||
import fr.free.nrw.commons.R
|
||||
|
||||
/**
|
||||
* Applies edge-to-edge system bar insets to a [View]’s margins using a custom adjustment block.
|
||||
*
|
||||
* Stores the initial margins to ensure inset calculations are additive, and applies the provided
|
||||
* [block] with an [InsetsAccumulator] containing initial and system bar inset values.
|
||||
*
|
||||
* @param typeMask The type of window insets to apply. Defaults to [WindowInsetsCompat.Type.systemBars].
|
||||
* @param shouldConsumeInsets If `true`, the insets are consumed and not propagated to child views.
|
||||
* @param block Lambda applied to update [MarginLayoutParams] using the accumulated insets.
|
||||
*/
|
||||
fun View.applyEdgeToEdgeInsets(
|
||||
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
|
||||
shouldConsumeInsets: Boolean = true,
|
||||
block: MarginLayoutParams.(InsetsAccumulator) -> Unit
|
||||
) {
|
||||
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
|
||||
val insets = windowInsets.getInsets(typeMask)
|
||||
|
||||
val initialTop = if (view.getTag(R.id.initial_margin_top) != null) {
|
||||
view.getTag(R.id.initial_margin_top) as Int
|
||||
} else {
|
||||
view.setTag(R.id.initial_margin_top, view.marginTop)
|
||||
view.marginTop
|
||||
}
|
||||
|
||||
val initialBottom = if (view.getTag(R.id.initial_margin_bottom) != null) {
|
||||
view.getTag(R.id.initial_margin_bottom) as Int
|
||||
} else {
|
||||
view.setTag(R.id.initial_margin_bottom, view.marginBottom)
|
||||
view.marginBottom
|
||||
}
|
||||
|
||||
val initialLeft = if (view.getTag(R.id.initial_margin_left) != null) {
|
||||
view.getTag(R.id.initial_margin_left) as Int
|
||||
} else {
|
||||
view.setTag(R.id.initial_margin_left, view.marginLeft)
|
||||
view.marginLeft
|
||||
}
|
||||
|
||||
val initialRight = if (view.getTag(R.id.initial_margin_right) != null) {
|
||||
view.getTag(R.id.initial_margin_right) as Int
|
||||
} else {
|
||||
view.setTag(R.id.initial_margin_right, view.marginRight)
|
||||
view.marginRight
|
||||
}
|
||||
|
||||
val accumulator = InsetsAccumulator(
|
||||
initialTop,
|
||||
insets.top,
|
||||
initialBottom,
|
||||
insets.bottom,
|
||||
initialLeft,
|
||||
insets.left,
|
||||
initialRight,
|
||||
insets.right
|
||||
)
|
||||
|
||||
view.updateLayoutParams<MarginLayoutParams> {
|
||||
apply { block(accumulator) }
|
||||
}
|
||||
|
||||
if(shouldConsumeInsets) WindowInsetsCompat.CONSUMED else windowInsets
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies edge-to-edge system bar insets to the top padding of the view.
|
||||
*
|
||||
* @param typeMask The type of window insets to apply. Defaults to [WindowInsetsCompat.Type.systemBars].
|
||||
*/
|
||||
fun View.applyEdgeToEdgeTopPaddingInsets(
|
||||
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
|
||||
) {
|
||||
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
|
||||
val insets = windowInsets.getInsets(typeMask)
|
||||
|
||||
view.updatePadding(
|
||||
left = insets.left,
|
||||
right = insets.right,
|
||||
top = insets.top
|
||||
)
|
||||
|
||||
WindowInsetsCompat.CONSUMED
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies edge-to-edge system bar insets to the bottom padding of the view.
|
||||
*
|
||||
* @param typeMask The type of window insets to apply. Defaults to [WindowInsetsCompat.Type.systemBars].
|
||||
*/
|
||||
fun View.applyEdgeToEdgeBottomPaddingInsets(
|
||||
typeMask: Int = WindowInsetsCompat.Type.systemBars(),
|
||||
) {
|
||||
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
|
||||
val insets = windowInsets.getInsets(typeMask)
|
||||
|
||||
view.updatePadding(
|
||||
left = insets.left,
|
||||
right = insets.right,
|
||||
bottom = insets.bottom
|
||||
)
|
||||
|
||||
WindowInsetsCompat.CONSUMED
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies system bar insets to all margins (top, bottom, left, right) of the view.
|
||||
*
|
||||
* @param view The target view.
|
||||
* @param shouldConsumeInsets If `true`, the insets are consumed and not propagated to child views.
|
||||
*/
|
||||
fun applyEdgeToEdgeAllInsets(
|
||||
view: View,
|
||||
shouldConsumeInsets: Boolean = true
|
||||
) = view.applyEdgeToEdgeInsets(shouldConsumeInsets = shouldConsumeInsets) { insets ->
|
||||
leftMargin = insets.left
|
||||
rightMargin = insets.right
|
||||
topMargin = insets.top
|
||||
bottomMargin = insets.bottom
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies system bar insets to the top and horizontal margins of the view.
|
||||
*
|
||||
* @param view The target view.
|
||||
*/
|
||||
fun applyEdgeToEdgeTopInsets(view: View) = view.applyEdgeToEdgeInsets { insets ->
|
||||
leftMargin = insets.left
|
||||
rightMargin = insets.right
|
||||
topMargin = insets.top
|
||||
}
|
||||
|
||||
/**
|
||||
* Applies system bar insets to the bottom and horizontal margins of the view.
|
||||
*
|
||||
* @param view The target view.
|
||||
*/
|
||||
fun applyEdgeToEdgeBottomInsets(view: View) = view.applyEdgeToEdgeInsets { insets ->
|
||||
leftMargin = insets.left
|
||||
rightMargin = insets.right
|
||||
bottomMargin = insets.bottom
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjusts a [View]'s bottom margin dynamically to account for the on-screen keyboard (IME),
|
||||
* ensuring the view remains visible above the keyboard during transitions.
|
||||
*
|
||||
* Preserves the initial margin, adjusts during IME visibility changes,
|
||||
* and accounts for navigation bar insets to avoid double offsets.
|
||||
*/
|
||||
fun View.handleKeyboardInsets() {
|
||||
var existingBottomMargin = 0
|
||||
|
||||
ViewCompat.setOnApplyWindowInsetsListener(this) { view, windowInsets ->
|
||||
existingBottomMargin = if (view.getTag(R.id.initial_margin_bottom) != null) {
|
||||
view.getTag(R.id.initial_margin_bottom) as Int
|
||||
} else {
|
||||
view.setTag(R.id.initial_margin_bottom, view.marginBottom)
|
||||
view.marginBottom
|
||||
}
|
||||
|
||||
WindowInsetsCompat.CONSUMED
|
||||
}
|
||||
|
||||
// Animate during IME transition
|
||||
ViewCompat.setWindowInsetsAnimationCallback(
|
||||
this,
|
||||
object : WindowInsetsAnimationCompat.Callback(
|
||||
DISPATCH_MODE_CONTINUE_ON_SUBTREE
|
||||
) {
|
||||
override fun onProgress(
|
||||
insets: WindowInsetsCompat,
|
||||
runningAnimations: MutableList<WindowInsetsAnimationCompat>
|
||||
): WindowInsetsCompat {
|
||||
val lp = layoutParams as MarginLayoutParams
|
||||
val navBarInsets = insets.getInsets(WindowInsetsCompat.Type.navigationBars())
|
||||
val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
|
||||
val imeVisible = insets.isVisible(WindowInsetsCompat.Type.ime())
|
||||
|
||||
// Avoid extra space due to system nav bar when the keyboard is shown
|
||||
val imeBottomMargin = imeInsets.bottom - navBarInsets.bottom
|
||||
|
||||
lp.bottomMargin = if(imeVisible && imeBottomMargin >= existingBottomMargin)
|
||||
imeBottomMargin + existingBottomMargin
|
||||
else existingBottomMargin
|
||||
|
||||
layoutParams = lp
|
||||
return WindowInsetsCompat.CONSUMED
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds both initial margin values and system bar insets, providing summed values
|
||||
* for each side (top, bottom, left, right) to apply in layout updates.
|
||||
*/
|
||||
data class InsetsAccumulator(
|
||||
private val initialTop: Int,
|
||||
private val insetTop: Int,
|
||||
private val initialBottom: Int,
|
||||
private val insetBottom: Int,
|
||||
private val initialLeft: Int,
|
||||
private val insetLeft: Int,
|
||||
private val initialRight: Int,
|
||||
private val insetRight: Int
|
||||
) {
|
||||
val top = initialTop + insetTop
|
||||
val bottom = initialBottom + insetBottom
|
||||
val left = initialLeft + insetLeft
|
||||
val right = initialRight + insetRight
|
||||
}
|
||||
|
|
@ -24,6 +24,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
|
|||
import io.reactivex.disposables.CompositeDisposable
|
||||
import io.reactivex.schedulers.Schedulers
|
||||
import timber.log.Timber
|
||||
import androidx.core.graphics.createBitmap
|
||||
|
||||
/**
|
||||
* Created by blueSir9 on 3/10/17.
|
||||
|
|
@ -307,16 +308,19 @@ object ImageUtils {
|
|||
* * @return
|
||||
*/
|
||||
@JvmStatic
|
||||
fun addRedBorder(bitmap: Bitmap, borderSize: Int, context: Context): Bitmap {
|
||||
val bmpWithBorder = Bitmap.createBitmap(
|
||||
bitmap.width + borderSize * 2,
|
||||
bitmap.height + borderSize * 2,
|
||||
bitmap.config
|
||||
)
|
||||
val canvas = Canvas(bmpWithBorder)
|
||||
canvas.drawColor(ContextCompat.getColor(context, R.color.deleteRed))
|
||||
canvas.drawBitmap(bitmap, borderSize.toFloat(), borderSize.toFloat(), null)
|
||||
return bmpWithBorder
|
||||
fun addRedBorder(bitmap: Bitmap, borderSize: Int, context: Context): Bitmap? {
|
||||
return bitmap.config?.let { config ->
|
||||
val bmpWithBorder =
|
||||
createBitmap(
|
||||
width = bitmap.width + borderSize * 2,
|
||||
height = bitmap.height + borderSize * 2,
|
||||
config = config
|
||||
)
|
||||
val canvas = Canvas(bmpWithBorder)
|
||||
canvas.drawColor(ContextCompat.getColor(context, R.color.deleteRed))
|
||||
canvas.drawBitmap(bitmap, borderSize.toFloat(), borderSize.toFloat(), null)
|
||||
return bmpWithBorder
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
android:scrollbars="vertical"
|
||||
android:fadeScrollbars="false"
|
||||
android:scrollbarThumbVertical="@color/primaryColor"
|
||||
android:clipToPadding="false"
|
||||
android:scrollbarSize="@dimen/dimen_6"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/switchWidget"
|
||||
android:clipToPadding="false"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
app:actualImageScaleType="fitXY" />
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/media_detail_card_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentBottom="true"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/location_picker_toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="78dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingVertical="@dimen/small_gap"
|
||||
tools:background="@color/primaryColor">
|
||||
|
||||
<TextView
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@
|
|||
<string name="media_detail_description">Περιγραφή</string>
|
||||
<string name="media_detail_discussion">Συζήτηση</string>
|
||||
<string name="media_detail_author">Συγγραφέας</string>
|
||||
<string name="media_detail_uploader">Ανεβαστής</string>
|
||||
<string name="media_detail_uploaded_date">Ημερομηνία μεταφόρτωσης</string>
|
||||
<string name="media_detail_license">Άδεια</string>
|
||||
<string name="media_detail_coordinates">Συντεταγμένες</string>
|
||||
|
|
@ -433,7 +434,7 @@
|
|||
<string name="deletion_reason_bad_for_my_privacy">Συνειδητοποίησα ότι είναι κακό για την ιδιωτικότητά μου</string>
|
||||
<string name="deletion_reason_no_longer_want_public">Άλλαξα γνώμη, δε θέλω να προβάλλεται πλέον δημόσια</string>
|
||||
<string name="deletion_reason_not_interesting">Συγγνώμη, αυτή η φωτογραφία δεν είναι ενδιαφέρουσα για μια εγκυκλοπαίδεια</string>
|
||||
<string name="uploaded_by_myself" fuzzy="true">Ανέβηκε από εμένα στο %1$s, χρησιμοποιήθηκε σε %2$d άρθρο/α</string>
|
||||
<string name="uploaded_by_myself">Ανέβηκε από εμένα στο %1$s, χρησιμοποιήθηκε σε τουλάχιστον %2$d άρθρο/α.</string>
|
||||
<string name="no_uploads">Καλώς ήρθατε στα Commons!\n\nΑνεβάστε τα πρώτα σας πολυμέσα πατώντας το κουμπί της προσθήκης.</string>
|
||||
<string name="no_categories_selected">Δεν επιλέχθηκαν κατηγορίες</string>
|
||||
<string name="no_categories_selected_warning_desc">Οι εικόνες χωρίς κατηγορίες χρησιμοποιούνται σπάνια. Θέλετε πράγματι να συνεχίσετε δίχως να επιλέξετε κατηγορίες;</string>
|
||||
|
|
@ -773,7 +774,7 @@
|
|||
<string name="permissions_are_required_for_functionality">Απαιτούνται δικαιώματα για τη λειτουργικότητα</string>
|
||||
<string name="learn_how_to_write_a_useful_description">Μάθετε πώς να γράψετε μια χρήσιμη περιγραφή</string>
|
||||
<string name="learn_how_to_write_a_useful_caption">Μάθετε πώς να γράψετε μια χρήσιμη λεζάντα</string>
|
||||
<string name="see_your_achievements" fuzzy="true">Δείτε τα επιτεύγματά σας</string>
|
||||
<string name="see_your_achievements">Δείτε τα επιτεύγματά σας</string>
|
||||
<string name="edit_image">Επεξεργασία εικόνας</string>
|
||||
<string name="edit_location">Επεξεργασία τοποθεσίας</string>
|
||||
<string name="location_updated">Η τοποθεσία ενημερώθηκε!</string>
|
||||
|
|
@ -834,4 +835,5 @@
|
|||
<string name="show_in_nearby">Εμφάνιση στα Κοντινά</string>
|
||||
<string name="image_tag_line_created_and_uploaded_by">Δημιουργήθηκε και μεταφορτώθηκε από: %1$s</string>
|
||||
<string name="image_tag_line_created_by_and_uploaded_by">Δημιουργήθηκε από %1$s και μεταφορτώθηκε από %2$s</string>
|
||||
<string name="nominated_for_deletion_btn">Προτάθηκε για Διαγραφή</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@
|
|||
<string name="wikicode_copied">Texto wiki copiado ó portapapeis</string>
|
||||
<string name="nearby_location_not_available">A localización non está dispoñible. A identificación de sitios próximos pode non funcionar correctamente.</string>
|
||||
<string name="location_permission_rationale_nearby">Precísase permiso para amosar unha lista de lugares preto de aquí</string>
|
||||
<string name="nearby_directions">COMO CHEGAR</string>
|
||||
<string name="nearby_directions">Indicacións</string>
|
||||
<string name="nearby_wikidata">WIKIDATA</string>
|
||||
<string name="nearby_wikipedia">Wikipedia</string>
|
||||
<string name="nearby_commons">COMMONS</string>
|
||||
|
|
@ -354,6 +354,7 @@
|
|||
<string name="statistics_featured">Imaxes destacadas</string>
|
||||
<string name="statistics_wikidata_edits">Imaxes vía \"Lugares próximos\"</string>
|
||||
<string name="level">Nivel %d</string>
|
||||
<string name="profile_withLevel">%s (nivel %s)</string>
|
||||
<string name="images_uploaded">Imaxes cargadas</string>
|
||||
<string name="image_reverts">Imaxes non revertidas</string>
|
||||
<string name="images_used_by_wiki">Imaxes usadas</string>
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@
|
|||
<string name="categories_not_found">%1$s와(과) 일치하는 분류를 찾을 수 없습니다</string>
|
||||
<string name="depictions_not_found">%1$s에 대한 위키데이터 검색 결과가 없습니다</string>
|
||||
<string name="no_child_classes">%1$s에 자식 클래스가 없습니다</string>
|
||||
<string name="no_parent_classes">%1$s에 부모 클래스가 없습니다</string>
|
||||
<string name="no_parent_classes">%1$s에 상위 클래스가 없습니다</string>
|
||||
<string name="categories_skip_explanation">위키미디어 공용에서 그림을 더 찾기 쉽게 만들기 위해 분류를 추가합니다.\n분류를 추가하려면 입력을 시작하세요.</string>
|
||||
<string name="categories_activity_title">분류</string>
|
||||
<string name="title_activity_settings">설정</string>
|
||||
|
|
|
|||
|
|
@ -226,7 +226,7 @@
|
|||
<string name="nearby_location_not_available">ဗဒင်ဏအ် ဟွံကၠောန်ကမၠောန် ဗွဲဓမ္မတာ၊ ဒၞာဲဒတန် ဟွံသၟဟ်အစောမ်။</string>
|
||||
<string name="location_permission_rationale_nearby">အာတ်မိက်ဒၟံင် အခေါင် သွက်ဂွံထ္ၜး စရင်ဒၞာဲဒတန် ဗဒင်ဗဒင်</string>
|
||||
<string name="nearby_directions">စမၞောန်ဂမၠိုင်</string>
|
||||
<string name="nearby_wikidata">ဝဳကဳဒါတာ</string>
|
||||
<string name="nearby_wikidata">ဝဳကဳတင်ဂၞင်</string>
|
||||
<string name="nearby_wikipedia" fuzzy="true">ဝဳကဳပဳဒဳယာ</string>
|
||||
<string name="nearby_commons">ခမ်မောန်</string>
|
||||
<string name="about_rate_us">ကဵုင္ၚုဟ် ကုပိုယ်</string>
|
||||
|
|
|
|||
|
|
@ -322,6 +322,7 @@
|
|||
<string name="statistics_featured">ߖߌ߬ߦߊ߬ߓߍ߫ ߟߊߓߊ߯ߙߕߊ ߟߎ߬</string>
|
||||
<string name="statistics_wikidata_edits">ߖߌ߬ߦߊ߬ߓߍ ߞߊߕߙߍ߬ \"ߛߌ߰ߢߐ߲߰ ߦߙߐ\" ߡߊ߬</string>
|
||||
<string name="level" fuzzy="true">ߞߊߓߋ</string>
|
||||
<string name="profile_withLevel">%s (ߞߊߓߋ %s)</string>
|
||||
<string name="images_uploaded">ߖߌ߬ߦߊ߬ߓߍ ߓߘߊ߫ ߟߊߦߟߍ߬</string>
|
||||
<string name="image_reverts">ߖߌ߬ߦߊ߬ߓߍ ߡߊ߫ ߖߏ߰ߛߌ߬</string>
|
||||
<string name="images_used_by_wiki">ߖߌ߬ߦߊ߬ߓߍ߬ ߟߊߓߊ߯ߙߊߣߍ߲ ߠߎ߬</string>
|
||||
|
|
|
|||
|
|
@ -302,14 +302,29 @@
|
|||
<string name="image_reverts">انځورونه په څټگرځولشوي نه دي</string>
|
||||
<string name="images_used_by_wiki">کارولشوي انځورونه</string>
|
||||
<string name="error_occurred">تېروتنه رامنځته شوه!</string>
|
||||
<string name="preference_author_name">د ليکوال نوم دوديزول</string>
|
||||
<string name="contributions_fragment">ونډې</string>
|
||||
<string name="nearby_fragment">څېرمه</string>
|
||||
<string name="notifications">خبرتياوې</string>
|
||||
<string name="read_notifications">خبرتیاوې (لوستلشوې)</string>
|
||||
<string name="display_nearby_notification">څېرمه خبرتياوې ښکارهکول</string>
|
||||
<string name="list_sheet">لړليک</string>
|
||||
<string name="storage_permission">زخيره کولو اجازه</string>
|
||||
<string name="next">راتلونکی</string>
|
||||
<string name="previous">مخکنی</string>
|
||||
<string name="title_page_bookmarks_pictures">انځورونه</string>
|
||||
<string name="title_page_bookmarks_locations">ځايونه</string>
|
||||
<string name="title_page_bookmarks_categories">وېشنيزې</string>
|
||||
<string name="menu_bookmark">په کتابنښو کې ورگډول/لرېکول</string>
|
||||
<string name="provider_bookmarks">کتابنښې</string>
|
||||
<string name="bookmark_empty">تاسو هېڅ کتابنښې نه دې ورگډېکړې</string>
|
||||
<string name="provider_bookmarks_location">کتابنښې</string>
|
||||
<string name="deletion_reason_uploaded_by_mistake">په تېروتنې سره مې راپورتهکړی دی</string>
|
||||
<string name="deletion_reason_publicly_visible">زه نه پوهېدم چې دا به ټولو ته ښکاره شي</string>
|
||||
<string name="deletion_reason_bad_for_my_privacy">زه پوه شوم چې دا زما د پټنتيا لپاره بد دی</string>
|
||||
<string name="deletion_reason_no_longer_want_public">زما اند توپير وکړ، زه نه غواړم چې دا نور په ټوليزه توگه ښکاره شي</string>
|
||||
<string name="deletion_reason_not_interesting">په بښنې سره دا انځور د يو پوهنغونډ لپاره خواپورې نه دی</string>
|
||||
<string name="no_categories_selected">هېڅ وېشنيزې نه دې ټاکل شوې</string>
|
||||
<string name="ends_on">پای ته رسېږي په:</string>
|
||||
<string name="display_campaigns">ټاکنيزېسيالۍ ښکارهکول</string>
|
||||
<string name="display_campaigns_explanation">روانې ټاکنيزېسيالۍ وگورئ</string>
|
||||
|
|
@ -337,6 +352,8 @@
|
|||
<string name="review_spam">ايا دا د منلو وړ دي؟</string>
|
||||
<string name="review_thanks">ايا تاسو غواړئ له ونډهوال نه مننه وکړئ؟</string>
|
||||
<string name="review_spam_explanation">که دا انځور ټولگټی نه وي؛ نو ړنگېدو ته د نوماندولو لپاره يې په نه کليک وکړئ.</string>
|
||||
<string name="review_thanks_yes_button_text">بل انځور</string>
|
||||
<string name="review_thanks_no_button_text">هو، ولې نه</string>
|
||||
<string name="exif_tag_name_author">ليکوال</string>
|
||||
<string name="exif_tag_name_copyright">لمېسلرېښتې</string>
|
||||
<string name="exif_tag_name_location">ځای</string>
|
||||
|
|
@ -348,7 +365,12 @@
|
|||
<string name="image_info">انځور مالومات</string>
|
||||
<string name="no_categories_found">هېڅ وېشنيزې ونه موندل شوې</string>
|
||||
<string name="delete_helper_ask_reason_copyright_logo">نښان</string>
|
||||
<string name="caption_edit_helper_show_edit_title">نيونگ هممهالول</string>
|
||||
<string name="coordinates_edit_helper_show_edit_title_success">بریالیتوب</string>
|
||||
<string name="coordinates_edit_helper_show_edit_message">همغږيتوبونه %1$s ورگډ شول.</string>
|
||||
<string name="description_edit_helper_show_edit_message">څرگنداوي ورگډل شول.</string>
|
||||
<string name="caption_edit_helper_show_edit_message">نيونگ ورگډ شو.</string>
|
||||
<string name="coordinates_edit_helper_edit_message_else">همغږيتوبونه نشي ورگډېدای.</string>
|
||||
<string name="share_image_via">انځور وېشل په وسيله د</string>
|
||||
<string name="theme_dark_name">تياره</string>
|
||||
<string name="theme_light_name">روښانه</string>
|
||||
|
|
|
|||
|
|
@ -44,29 +44,29 @@
|
|||
<string name="nearby_filter_state">Estado do Local</string>
|
||||
<string name="appwidget_img">Imagem do Dia</string>
|
||||
<plurals name="uploads_pending_notification_indicator">
|
||||
<item quantity="one">a carregar %1$d ficheiro</item>
|
||||
<item quantity="other">a carregar %1$d ficheiros</item>
|
||||
<item quantity="one">a enviar %1$d ficheiro</item>
|
||||
<item quantity="other">a enviar %1$d ficheiros</item>
|
||||
</plurals>
|
||||
<plurals name="contributions_subtitle">
|
||||
<item quantity="one">(%1$d)</item>
|
||||
<item quantity="other">(%1$d)</item>
|
||||
</plurals>
|
||||
<string name="starting_uploads">A iniciar carregamentos</string>
|
||||
<string name="starting_uploads">A iniciar envios</string>
|
||||
<plurals name="starting_multiple_uploads">
|
||||
<item quantity="one">A processar %d carregamento</item>
|
||||
<item quantity="other">A processar %d carregamentos</item>
|
||||
<item quantity="one">A processar %d envio</item>
|
||||
<item quantity="other">A processar %d envios</item>
|
||||
</plurals>
|
||||
<plurals name="multiple_uploads_title">
|
||||
<item quantity="one">%d carregamento</item>
|
||||
<item quantity="other">%d carregamentos</item>
|
||||
<item quantity="one">%d envio</item>
|
||||
<item quantity="other">%d envios</item>
|
||||
</plurals>
|
||||
<plurals name="share_license_summary">
|
||||
<item quantity="one">Esta imagem será licenciada com a %1$s</item>
|
||||
<item quantity="other">Estas imagens serão licenciadas com a %1$s</item>
|
||||
</plurals>
|
||||
<plurals name="upload_count_title">
|
||||
<item quantity="one">%1$d carregamento</item>
|
||||
<item quantity="other">%1$d carregamentos</item>
|
||||
<item quantity="one">%1$d envio</item>
|
||||
<item quantity="other">%1$d envios</item>
|
||||
</plurals>
|
||||
<plurals name="receiving_shared_content">
|
||||
<item quantity="one">A receber conteúdo partilhado. O processamento da imagem pode demorar algum tempo, dependendo do tamanho da mesma e do seu dispositivo</item>
|
||||
|
|
@ -83,8 +83,8 @@
|
|||
<string name="upload_in_progress">Envio em progresso</string>
|
||||
<string name="username">Nome de utilizador</string>
|
||||
<string name="password">Palavra-passe</string>
|
||||
<string name="login_credential">Entrar na sua conta da wiki Commons Beta</string>
|
||||
<string name="login">Entrar</string>
|
||||
<string name="login_credential">Inicie a sessão na sua conta de Commons Beta</string>
|
||||
<string name="login">Iniciar sessão</string>
|
||||
<string name="forgot_password">Esqueceu-se da palavra-passe?</string>
|
||||
<string name="signup">Registar-se</string>
|
||||
<string name="logging_in_title">A iniciar sessão</string>
|
||||
|
|
@ -99,27 +99,27 @@
|
|||
<string name="suggest_unrestricted_mode">O carregamento de mais de três imagens funciona de maneira mais fiável quando a otimização da bateria está desligada. Desligue a otimização da bateria para a aplicação Commons nas configurações, de forma a ter uma experiência de carregamento mais fluida. \n\nPossíveis passos para desativar a otimização da bateria:\n\nEtapa 1: premir o botão \'Configurações\' abaixo.\n\nEtapa 2: mudar de \'Não otimizado\' para \'Todas as aplicações\'.\n\nEtapa 3: pesquisar \"Commons\" ou \"fr.free.nrw.commons\".\n\nEtapa 4: premir esta e selecionar \'Não otimizar\'.\n\nEtapa 5: pressionar \'Concluído\'.</string>
|
||||
<string name="authentication_failed">Falha na autenticação. Por favor faça login novamente.</string>
|
||||
<string name="uploading_started">Carregamento iniciado!</string>
|
||||
<string name="uploading_queued">Fila de carregamento (modo de ligação limitada ativado)</string>
|
||||
<string name="upload_completed_notification_title">%1$s carregado!</string>
|
||||
<string name="upload_completed_notification_text">Toque para ver o seu carregamento</string>
|
||||
<string name="upload_progress_notification_title_start">A carregar o ficheiro %s</string>
|
||||
<string name="upload_progress_notification_title_in_progress">A carregar %1$s</string>
|
||||
<string name="upload_progress_notification_title_finishing">A terminar o carregamento de %1$s</string>
|
||||
<string name="upload_failed_notification_title">O carregamento de %1$s falhou</string>
|
||||
<string name="upload_paused_notification_title">Carregamento de %1$s em pausa</string>
|
||||
<string name="uploading_queued">Envio em fila (modo de ligação limitada ativado)</string>
|
||||
<string name="upload_completed_notification_title">%1$s enviado!</string>
|
||||
<string name="upload_completed_notification_text">Toque para ver o seu envio</string>
|
||||
<string name="upload_progress_notification_title_start">A enviar o ficheiro %s</string>
|
||||
<string name="upload_progress_notification_title_in_progress">A enviar %1$s</string>
|
||||
<string name="upload_progress_notification_title_finishing">A terminar o envio de %1$s</string>
|
||||
<string name="upload_failed_notification_title">O envio de %1$s falhou</string>
|
||||
<string name="upload_paused_notification_title">Envio de %1$s pausado</string>
|
||||
<string name="upload_failed_notification_subtitle">Tocar para ver</string>
|
||||
<string name="upload_paused_notification_subtitle">Tocar para ver</string>
|
||||
<string name="title_activity_contributions">Carregamentos recentes</string>
|
||||
<string name="contribution_state_queued">Em espera</string>
|
||||
<string name="contribution_state_failed">Falhado</string>
|
||||
<string name="contribution_state_in_progress">%1$d%% transferido</string>
|
||||
<string name="contribution_state_starting">A carregar</string>
|
||||
<string name="title_activity_contributions">Meus Envios Recentes</string>
|
||||
<string name="contribution_state_queued">Em fila</string>
|
||||
<string name="contribution_state_failed">Falhou</string>
|
||||
<string name="contribution_state_in_progress">%1$d%% concluído</string>
|
||||
<string name="contribution_state_starting">A enviar</string>
|
||||
<string name="menu_from_gallery">Da galeria</string>
|
||||
<string name="menu_from_camera">Tirar foto</string>
|
||||
<string name="menu_from_camera">Tirar fotografia</string>
|
||||
<string name="menu_nearby">Nas redondezas</string>
|
||||
<string name="provider_contributions">Carregamentos</string>
|
||||
<string name="menu_copy_link">Copiar ligação</string>
|
||||
<string name="menu_link_copied">A ligação foi copiada para a área de transferência</string>
|
||||
<string name="provider_contributions">Meus envios</string>
|
||||
<string name="menu_copy_link">Copiar hiperligação</string>
|
||||
<string name="menu_link_copied">A hiperligação foi copiada para a área de transferência</string>
|
||||
<string name="menu_share">Partilhar</string>
|
||||
<string name="menu_view_file_page">Ver página do ficheiro</string>
|
||||
<string name="share_title_hint">Legenda (obrigatória)</string>
|
||||
|
|
@ -132,13 +132,14 @@
|
|||
<string name="login_failed_2fa_needed">Tem de fornecer o seu código de autenticação de dois fatores.</string>
|
||||
<string name="login_failed_email_auth_needed">Foi enviado um código de verificação de autenticação para o seu endereço de correio eletrónico. Por favor, forneça o código para iniciar a sessão.</string>
|
||||
<string name="login_failed_generic">O início de sessão falhou</string>
|
||||
<string name="share_upload_button">Carregar</string>
|
||||
<string name="share_upload_button">Enviar</string>
|
||||
<string name="multiple_share_base_title">Dê um nome a este conjunto</string>
|
||||
<string name="provider_modifications">Modificações</string>
|
||||
<string name="menu_upload_single">Carregar</string>
|
||||
<string name="categories_search_text_hint">Pesquisar categorias</string>
|
||||
<string name="depicts_search_text_hint">Procurar elementos que o seu conteúdo multimédia retrata (montanha, o Taj Mahal, etc.)</string>
|
||||
<string name="menu_save_categories">Gravar</string>
|
||||
<string name="menu_overflow_desc">Menu de fluxo</string>
|
||||
<string name="refresh_button">Atualizar</string>
|
||||
<string name="display_list_button">Lista</string>
|
||||
<string name="contributions_subtitle_zero">(Ainda não foi carregado nenhum ficheiro)</string>
|
||||
|
|
@ -148,7 +149,7 @@
|
|||
<string name="no_parent_classes">%1$s não tem nenhuma classe progenitora</string>
|
||||
<string name="categories_skip_explanation">Adicione categorias para tornar as suas imagens mais fáceis de encontrar na wiki Wikimedia Commons.\nComece a escrever para adicionar categorias.</string>
|
||||
<string name="categories_activity_title">Categorias</string>
|
||||
<string name="title_activity_settings">Configurações</string>
|
||||
<string name="title_activity_settings">Definições</string>
|
||||
<string name="title_activity_signup">Registar-se</string>
|
||||
<string name="title_activity_featured_images">Imagens destacadas</string>
|
||||
<string name="title_activity_custom_selector">Seletor personalizado</string>
|
||||
|
|
@ -784,17 +785,21 @@
|
|||
<string name="file_saved_successfully">Ficheiro guardado com sucesso</string>
|
||||
<string name="do_you_want_to_open_gpx_file">Deseja abrir o ficheiro GPX?</string>
|
||||
<string name="do_you_want_to_open_kml_file">Deseja abrir o ficheiro KML?</string>
|
||||
<string name="failed_to_save_kml_file">Não foi possível guardar o ficheiro KML.</string>
|
||||
<string name="failed_to_save_gpx_file">Não foi possível guardar o ficheiro GPX.</string>
|
||||
<string name="saving_kml_file">Guardar Ficheiro KML</string>
|
||||
<string name="saving_gpx_file">Guardar Ficheiro GPX</string>
|
||||
<plurals name="custom_picker_images_selected_title_appendix">
|
||||
<item quantity="one">%d imagem selecionada</item>
|
||||
<item quantity="other">%d imagens selecionadas</item>
|
||||
</plurals>
|
||||
<string name="multiple_files_depiction_header">Nota sobre múltiplos envios</string>
|
||||
<string name="nearby_wikitalk">Reporte um problema sobre este item na Wikidados</string>
|
||||
<string name="please_enter_some_comments">Por favor, insira alguns comentários</string>
|
||||
<string name="talk">Discussão</string>
|
||||
<string name="other_problem_or_information_please_explain_below">Outro problema ou informação (por favor, explique em baixo).</string>
|
||||
<string name="feedback_destination_note">O seu comentário é publicado na seguinte página da wiki: <a href=\"https://commons.wikimedia.org/wiki/Commons:Mobile_app/Feedback\">Commons:Mobile app/Feedback</a></string>
|
||||
<string name="cancelling_all_the_uploads">A cancelar todos os envios...</string>
|
||||
<string name="uploads">Envios</string>
|
||||
<string name="pending">Pendente</string>
|
||||
<string name="failed">Falhou</string>
|
||||
|
|
@ -803,6 +808,8 @@
|
|||
<string name="custom_selector_confirm_deletion_title">Confirmar Eliminação</string>
|
||||
<string name="custom_selector_delete">Eliminar</string>
|
||||
<string name="custom_selector_cancel">Cancelar</string>
|
||||
<string name="error_while_loading">Erro ao carregar</string>
|
||||
<string name="no_usages_found">Não foram encontradas utilizações</string>
|
||||
<string name="usages_on_commons_heading">Commons</string>
|
||||
<string name="usages_on_other_wikis_heading">Outras wikis</string>
|
||||
<string name="file_usages_container_heading">Utilização de ficheiro</string>
|
||||
|
|
|
|||
7
app/src/main/res/values/ids.xml
Normal file
7
app/src/main/res/values/ids.xml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<item name="initial_margin_top" type="id" />
|
||||
<item name="initial_margin_bottom" type="id" />
|
||||
<item name="initial_margin_left" type="id" />
|
||||
<item name="initial_margin_right" type="id" />
|
||||
</resources>
|
||||
|
|
@ -123,6 +123,9 @@
|
|||
<item name="custom_selector_back">@drawable/ic_arrow_back_black</item>
|
||||
<item name="android:windowEnableSplitTouch">false</item>
|
||||
<item name="android:splitMotionEvents">false</item>
|
||||
<!--For edge to edge backward compatibility-->
|
||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||
</style>
|
||||
|
||||
<style name="LightMoreBottomSheetStyle" parent="LightAppTheme">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
[versions]
|
||||
agp = "8.9.1"
|
||||
agp = "8.12.0"
|
||||
acra = "5.8.4"
|
||||
activityCompose = "1.9.3"
|
||||
adapterdelegates = "4.3.0"
|
||||
|
|
@ -19,7 +19,7 @@ githubTripletPlay = "2.7.2"
|
|||
kotlinxCoroutinesRx2 = "1.8.0"
|
||||
osmdroidAndroid = "6.1.17"
|
||||
testCore = "1.4.0"
|
||||
coreKtx = "1.9.0"
|
||||
coreKtx = "1.16.0"
|
||||
coreTesting = "2.2.0"
|
||||
dagger = "2.23"
|
||||
databindingCompiler = "8.0.2"
|
||||
|
|
@ -57,7 +57,7 @@ preference = "1.2.1"
|
|||
recyclerview = "1.2.0-alpha02"
|
||||
recyclerviewFastscroll = "2.0.1"
|
||||
retrofit = "2.8.1"
|
||||
robolectric = "4.11.1"
|
||||
robolectric = "4.14.1"
|
||||
room = "2.6.1"
|
||||
rules = "1.5.0"
|
||||
runner = "1.5.2"
|
||||
|
|
|
|||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
|
|
@ -1,6 +1,6 @@
|
|||
#Sun Apr 23 18:22:54 IST 2023
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
Loading…
Add table
Add a link
Reference in a new issue