Compare commits

...

41 Commits

Author SHA1 Message Date
Matthieu 187c29a751 Merge branch 'translations' into 'master'
Translations update from Weblate

See merge request pixeldroid/PixelDroid!590
2024-04-15 03:09:08 +00:00
Balaraz f9a07a5dd0 Translated using Weblate (Ukrainian)
Currently translated at 73.0% (19 of 26 strings)

Translated using Weblate (Ukrainian)

Currently translated at 97.2% (248 of 255 strings)

Translated using Weblate (Ukrainian)

Currently translated at 97.2% (248 of 255 strings)

Co-authored-by: Balaraz <balaraz@tuta.io>
Translate-URL: https://weblate.pixeldroid.org/projects/pixeldroid/app/uk/
Translate-URL: https://weblate.pixeldroid.org/projects/pixeldroid/fastlane/uk/
Translation: PixelDroid/Fastlane
Translation: PixelDroid/pixeldroid
2024-04-08 06:15:38 +00:00
Alexandre NICOLADIE fb9296187a Translated using Weblate (French)
Currently translated at 100.0% (26 of 26 strings)

Translated using Weblate (French)

Currently translated at 100.0% (255 of 255 strings)

Translated using Weblate (French)

Currently translated at 26.9% (7 of 26 strings)

Translated using Weblate (French)

Currently translated at 80.3% (205 of 255 strings)

Co-authored-by: Alexandre NICOLADIE <github@nicoladie.fr>
Translate-URL: https://weblate.pixeldroid.org/projects/pixeldroid/app/fr/
Translate-URL: https://weblate.pixeldroid.org/projects/pixeldroid/fastlane/fr/
Translation: PixelDroid/Fastlane
Translation: PixelDroid/pixeldroid
2024-04-08 06:15:37 +00:00
Matthieu 04324577ea Merge branch 'dependencies_upgrade' into 'master'
Dependencies upgrade

See merge request pixeldroid/PixelDroid!589
2024-03-29 08:33:37 +00:00
Matthieu 73f08e5a5f Update dependencies 2024-03-29 09:03:48 +01:00
Matthieu a7feab380b Merge remote-tracking branch 'origin/master' 2024-03-23 15:39:07 +01:00
Matthieu 1a4e023091 Merge branch 'translations' into 'master'
Translations update from Weblate

See merge request pixeldroid/PixelDroid!588
2024-03-22 14:35:59 +00:00
Regu_Miabyss 2fb4c91ffd Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (255 of 255 strings)

Co-authored-by: Regu_Miabyss <Regu_Miabyss@outlook.com>
Translate-URL: https://weblate.pixeldroid.org/projects/pixeldroid/app/zh_Hant/
Translation: PixelDroid/pixeldroid
2024-03-22 14:34:56 +00:00
Matthieu 720c099f0a Merge branch 'changelog_update' into 'master'
Adapt to multiplied version numbers

See merge request pixeldroid/PixelDroid!587
2024-03-16 09:11:38 +00:00
Matthieu 869479d53f Adapt to multiplied version numbers 2024-03-16 09:11:31 +00:00
Matthieu 018f893388 Adapt to multiplied version numbers 2024-03-16 10:10:39 +01:00
Matthieu f27ae611be Merge branch 'release33_3' into 'master'
Fix build typo

See merge request pixeldroid/PixelDroid!586
2024-03-16 07:53:28 +00:00
Matthieu 234be72f59 Fix build typo 2024-03-16 08:52:58 +01:00
Matthieu 7eaac2e903 Merge branch 'release33_2' into 'master'
Release33 fixup

See merge request pixeldroid/PixelDroid!585
2024-03-16 07:41:21 +00:00
Matthieu a9849c13e6 Switch submodule to http pull 2024-03-16 08:37:43 +01:00
Matthieu d1562f18e9 Fix order of abiCodes 2024-03-16 08:34:55 +01:00
Matthieu 4a1248bcab Merge branch 'translations' into 'master'
Translations update from Weblate

See merge request pixeldroid/PixelDroid!583
2024-03-15 18:15:14 +00:00
Regu_Miabyss e9122e6d72 Translated using Weblate (Chinese (Traditional))
Currently translated at 29.0% (74 of 255 strings)

Co-authored-by: Regu_Miabyss <Regu_Miabyss@outlook.com>
Translate-URL: https://weblate.pixeldroid.org/projects/pixeldroid/app/zh_Hant/
Translation: PixelDroid/pixeldroid
2024-03-15 18:07:42 +00:00
Matthieu 76eac62d73 Merge branch 'seperate-apks2' into 'master'
Seperate version codes per architecture

See merge request pixeldroid/PixelDroid!584
2024-03-15 18:07:39 +00:00
Matthieu dd27555d83 Release 33 2024-03-15 18:10:10 +01:00
Matthieu c0feb8a37d Seperate version codes per architecture 2024-03-15 18:01:04 +01:00
Matthieu 7acd4cface Merge branch 'view_models' into 'master'
Use ViewModel in AlbumActivity

See merge request pixeldroid/PixelDroid!558
2024-03-10 10:22:07 +00:00
Matthieu 10e93c90b7 Merge branch 'master' into view_models 2024-03-08 11:06:33 +01:00
Matthieu 2311627473 Merge branch 'translations' into 'master'
Translations update from Weblate

See merge request pixeldroid/PixelDroid!582
2024-03-08 09:04:39 +00:00
Regu_Miabyss 6c7ab2333e Added translation using Weblate (Chinese (Traditional))
Co-authored-by: Regu_Miabyss <Regu_Miabyss@outlook.com>
2024-03-08 09:04:03 +00:00
Matthieu 54711d4e81 Hide dot indicator in fullscreen album 2024-03-07 07:56:30 +01:00
Matthieu 908d1a54c9 Merge branch 'master' into view_models 2024-03-05 10:59:52 +01:00
Matthieu 2b91543137 Merge branch 'seperate-apks' into 'master'
Split apks into ABIs to make them smaller

See merge request pixeldroid/PixelDroid!581
2024-03-01 15:41:30 +00:00
Matthieu 0688dd4d02 Release 32 2024-03-01 16:41:02 +01:00
Matthieu 319da7c11c Split apks into ABIs to make them smaller 2024-03-01 16:36:08 +01:00
Matthieu 7b327fc0d6 Merge branch 'readme-matrix' into 'master'
Update README.md

See merge request pixeldroid/PixelDroid!580
2024-02-27 13:48:08 +00:00
Matthieu 64ab2c2ac5 Update README.md 2024-02-27 13:23:07 +00:00
Matthieu 37b83f5ae2 Merge branch 'fix_uri_mess' into 'master'
Fix crashes due to ClassCastException

See merge request pixeldroid/PixelDroid!579
2024-02-25 11:03:55 +00:00
Matthieu 1516452ab5 Release 31 2024-02-25 12:03:05 +01:00
Matthieu cb50db7730 Fix crashes due to ClassCastException 2024-02-25 11:54:09 +01:00
Matthieu afe6f71152 Merge branch 'release30' into 'master'
Release 30

See merge request pixeldroid/PixelDroid!578
2024-02-14 21:23:13 +00:00
Matthieu d66c365934 Update dependencies 2024-02-14 22:00:48 +01:00
Matthieu 7815ecba08 Release 30 2024-02-14 21:59:49 +01:00
Matthieu b4533014b3 Update media_editor (bugfix) 2024-02-14 21:57:42 +01:00
Fred f15c23cceb Prepare code for click listener in AlbumActivity 2023-07-30 13:45:33 +02:00
Fred d9da842df7 Create ViewModel for AlbumActivity 2023-07-18 18:22:30 +02:00
57 changed files with 890 additions and 107 deletions

2
.gitmodules vendored
View File

@ -3,4 +3,4 @@
url = https://gitlab.com/artectrex/scrambler.git
[submodule "pixel_common"]
path = pixel_common
url = git@gitlab.shinice.net:pixeldroid/pixel_common.git
url = https://gitlab.shinice.net/pixeldroid/pixel_common.git

View File

@ -9,13 +9,16 @@ Free (as in freedom) Android client for Pixelfed, the federated image sharing pl
<img src="https://pixeldroid.org/badge-fdroid.png" alt="Get it on F-Droid" width="206">
</a>
Come talk to us on Matrix, at <a href="https://matrix.to/#/#pixeldroid:gnugen.ch">#pixeldroid:gnugen.ch</a> !
## 🔧 Compiling the code yourself
If you want to try out PixelDroid on your own device, you can compile the source code yourself. To do that you can install [Android Studio](https://developer.android.com/studio/).
## 🎨 Art attribution
Our mascot was commissioned using funds from NLnet. The original file is `pixeldroid_mascot.svg` and it is adapted to work as an Android Drawable. This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/) (CC BY-SA).
Various works have been used from the pixelfed branding repository ( https://github.com/pixelfed/brand-assets ). In addition, a drawing of a red panda is used for some error messages ( https://thenounproject.com/search/?q=red+panda&i=2877785 ).
Various works have been used from the pixelfed branding repository ( https://github.com/pixelfed/brand-assets ).
## 🤝 Contribute
If you want to contribute, you can check out [CONTRIBUTING.md](CONTRIBUTING.md) and/or [TRANSLATION.md](TRANSLATION.md)

View File

@ -8,6 +8,21 @@ plugins {
id("kotlin-parcelize")
id("com.google.devtools.ksp")
}
// Map for the version code that gives each ABI a value.
ext.abiCodes = ['armeabi-v7a': 1, 'arm64-v8a': 2, x86: 3, x86_64: 4]
//Different version codes per architecture (for F-Droid support)
android.applicationVariants.configureEach { variant ->
variant.outputs.each { output ->
def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(com.android.build.OutputFile.ABI))
if (baseAbiVersionCode != null) {
output.versionCodeOverride = (100 * project.android.defaultConfig.versionCode) + baseAbiVersionCode
} else {
output.versionCodeOverride = 100 * project.android.defaultConfig.versionCode
}
}
}
android {
@ -30,8 +45,8 @@ android {
}
defaultConfig {
minSdkVersion 23
versionCode 29
targetSdkVersion 34
versionCode 33
versionName "1.0.beta" + versionCode
//TODO add resConfigs("en", "fr", "ja",...) ?
@ -80,6 +95,30 @@ android {
proguardFiles 'proguard-rules.pro'
}
}
splits {
// Configures multiple APKs based on ABI.
abi {
// Enables building multiple APKs per ABI.
enable true
// By default all ABIs are included, so use reset() and include to specify that we only
// want APKs for "x86", "x86_64", "arm64-v8a" and "armeabi-v7a".
// Resets the list of ABIs for Gradle to create APKs for to none.
reset()
// Specifies a list of ABIs for Gradle to create APKs for.
//noinspection ChromeOsAbiSupport
include project.ext.abiCodes.keySet() as String[]
// Specifies that we don't want to also generate a universal APK that includes all ABIs.
universalApk false
}
}
/**
* Make a string with the application_id (available in xml etc)
*/
@ -136,13 +175,13 @@ dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.preference:preference-ktx:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.6'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
implementation "androidx.browser:browser:1.7.0"
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
implementation "androidx.browser:browser:1.8.0"
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.6'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.6'
implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7'
implementation 'androidx.navigation:navigation-ui-ktx:2.7.7'
implementation 'androidx.paging:paging-runtime-ktx:3.2.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
@ -159,7 +198,7 @@ dependencies {
// Use the most recent version of CameraX
def cameraX_version = '1.3.1'
def cameraX_version = '1.3.2'
implementation "androidx.camera:camera-core:$cameraX_version"
implementation "androidx.camera:camera-camera2:$cameraX_version"
// CameraX Lifecycle library
@ -184,21 +223,21 @@ dependencies {
implementation 'com.google.android.material:material:1.11.0'
//Dagger (dependency injection)
implementation 'com.google.dagger:dagger:2.50'
ksp 'com.google.dagger:dagger-compiler:2.50'
implementation 'com.google.dagger:dagger:2.51'
ksp 'com.google.dagger:dagger-compiler:2.51'
implementation("com.google.dagger:hilt-android:2.50")
ksp "com.google.dagger:hilt-compiler:2.50"
implementation('com.google.dagger:hilt-android:2.51')
ksp 'com.google.dagger:hilt-compiler:2.51'
implementation 'com.squareup.okhttp3:okhttp:4.12.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
implementation 'com.squareup.retrofit2:retrofit:2.10.0'
implementation 'com.squareup.retrofit2:converter-gson:2.10.0'
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.10.0'
implementation 'io.reactivex.rxjava3:rxjava:3.1.8'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
implementation 'com.github.connyduck:sparkbutton:4.1.0'
implementation 'org.pixeldroid.pixeldroid:android-media-editor:1.6'
implementation 'org.pixeldroid.pixeldroid:android-media-editor:2.0'
implementation project(path: ':scrambler')
implementation project(path: ':pixel_common')
@ -248,7 +287,7 @@ dependencies {
testImplementation "androidx.room:room-testing:$room_version"
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.3.0'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
@ -261,6 +300,8 @@ dependencies {
}
tasks.withType(Test).configureEach {
jacoco.includeNoLocationClasses = true
jacoco.excludes = ['jdk.internal.*']

View File

@ -1,5 +1,9 @@
package org.pixeldroid.app.postCreation
import android.content.ClipData
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
@ -15,6 +19,31 @@ class PostCreationActivity : BaseActivity() {
internal const val POST_REDRAFT = "post_redraft"
internal const val POST_NSFW = "post_nsfw"
internal const val TEMP_FILES = "temp_files"
fun intentForUris(context: Context, uris: List<Uri>) =
Intent(Intent.ACTION_SEND_MULTIPLE).apply {
// Pass downloaded images to new post creation activity
putParcelableArrayListExtra(
Intent.EXTRA_STREAM, ArrayList(uris)
)
uris.forEach {
// Why are we using ClipData in addition to parcelableArrayListExtra here?
// Because the FLAG_GRANT_READ_URI_PERMISSION needs to be applied to the URIs, and
// for some reason it doesn't get applied to all of them when not using ClipData
if (clipData == null) {
clipData = ClipData("", emptyArray(), ClipData.Item(it))
} else {
clipData!!.addItem(ClipData.Item(it))
}
}
setClass(context, PostCreationActivity::class.java)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
}
}
private lateinit var binding: ActivityPostCreationBinding
@ -32,4 +61,5 @@ class PostCreationActivity : BaseActivity() {
}
override fun onSupportNavigateUp() = navController.navigateUp() || super.onSupportNavigateUp()
}

View File

@ -39,6 +39,8 @@ import org.pixeldroid.app.utils.bindingLifecycleAware
import org.pixeldroid.app.utils.db.entities.InstanceDatabaseEntity
import org.pixeldroid.app.utils.fileExtension
import org.pixeldroid.app.utils.getMimeType
import org.pixeldroid.media_editor.common.PICTURE_POSITION
import org.pixeldroid.media_editor.common.PICTURE_URI
import org.pixeldroid.media_editor.photoEdit.PhotoEditActivity
import org.pixeldroid.media_editor.videoEdit.VideoEditActivity
import java.io.File
@ -47,7 +49,6 @@ import java.text.SimpleDateFormat
import java.util.Locale
class PostCreationFragment : BaseFragment() {
private var binding: FragmentPostCreationBinding by bindingLifecycleAware()
private val model: PostCreationViewModel by activityViewModels()
@ -307,7 +308,7 @@ class PostCreationFragment : BaseFragment() {
ActivityResultContracts.StartActivityForResult()){
result: ActivityResult? ->
if (result?.resultCode == Activity.RESULT_OK && result.data != null) {
val position: Int = result.data!!.getIntExtra(PhotoEditActivity.PICTURE_POSITION, 0)
val position: Int = result.data!!.getIntExtra(PICTURE_POSITION, 0)
model.modifyAt(position, result.data!!)
?: Toast.makeText(requireActivity(), R.string.error_editing, Toast.LENGTH_SHORT).show()
} else if(result?.resultCode != Activity.RESULT_CANCELED){
@ -320,8 +321,8 @@ class PostCreationFragment : BaseFragment() {
requireActivity(),
if (model.getPhotoData().value!![position].video) VideoEditActivity::class.java else PhotoEditActivity::class.java
)
.putExtra(PhotoEditActivity.PICTURE_URI, model.getPhotoData().value!![position].imageUri)
.putExtra(PhotoEditActivity.PICTURE_POSITION, position)
.putExtra(PICTURE_URI, model.getPhotoData().value!![position].imageUri)
.putExtra(PICTURE_POSITION, position)
editResultContract.launch(intent)
}

View File

@ -1,6 +1,6 @@
package org.pixeldroid.app.postCreation
import android.content.Context
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Parcelable
@ -33,13 +33,14 @@ import kotlinx.parcelize.Parcelize
import okhttp3.MultipartBody
import org.pixeldroid.app.MainActivity
import org.pixeldroid.app.R
import org.pixeldroid.app.postCreation.camera.CameraFragment
import org.pixeldroid.app.utils.api.objects.Attachment
import org.pixeldroid.app.utils.db.AppDatabase
import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity
import org.pixeldroid.app.postCreation.camera.CameraFragment
import org.pixeldroid.app.utils.api.objects.Attachment
import org.pixeldroid.app.utils.db.AppDatabase
import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity
import org.pixeldroid.app.utils.di.PixelfedAPIHolder
import org.pixeldroid.app.utils.fileExtension
import org.pixeldroid.app.utils.getMimeType
import org.pixeldroid.media_editor.common.PICTURE_URI
import org.pixeldroid.media_editor.videoEdit.VideoEditActivity
import retrofit2.HttpException
import java.io.File
@ -101,15 +102,31 @@ data class PhotoData(
class PostCreationViewModel @Inject constructor(
private val state: SavedStateHandle,
@ApplicationContext private val applicationContext: Context,
db: AppDatabase
db: AppDatabase,
): ViewModel() {
private var storyPhotoDataBackup: MutableList<PhotoData>? = null
private val photoData: MutableLiveData<MutableList<PhotoData>> by lazy {
//FIXME We should be able to access the Intent action somehow, to determine if there are
// 1 or multiple Uris instead of relying on the ClassCastException
// This should not work like this (reading its source code, get() function should return null
// if it's the wrong type but instead throws ClassCastException).
// Lucky for us that it does though: we first try to get a single Uri (which we could be
// getting from a share of a single picture to the app), when the cast to Uri fails
// we try to get a list of Uris instead (casting ourselves from Parcelable as suggested
// in get() documentation)
val uris = try {
val singleUri: Uri? = state[Intent.EXTRA_STREAM]
listOfNotNull(singleUri)
} catch (e: ClassCastException) {
state.get<ArrayList<Parcelable>>(Intent.EXTRA_STREAM)?.map { it as Uri }
}
MutableLiveData<MutableList<PhotoData>>(
addPossibleImages(
state.get<ArrayList<Uri>>(Intent.EXTRA_STREAM),
uris,
state.get<ArrayList<String>>(PostCreationActivity.PICTURE_DESCRIPTIONS),
mutableListOf()
previousList = mutableListOf()
)
)
}
@ -160,7 +177,7 @@ class PostCreationViewModel @Inject constructor(
* as are legal (if any) and a dialog will be shown to the user alerting them of this fact.
*/
fun addPossibleImages(
uris: ArrayList<Uri>?,
uris: List<Uri>?,
descriptions: List<String>?,
previousList: MutableList<PhotoData>? = photoData.value,
): MutableList<PhotoData> {
@ -283,7 +300,7 @@ class PostCreationViewModel @Inject constructor(
}
}
} else {
imageUri = data.getStringExtra(org.pixeldroid.media_editor.photoEdit.PhotoEditActivity.PICTURE_URI)!!.toUri()
imageUri = data.getStringExtra(PICTURE_URI)!!.toUri()
val (imageSize, imageVideo) = getSizeAndVideoValidate(imageUri, position)
size = imageSize
video = imageVideo

View File

@ -32,7 +32,7 @@ class CameraActivity : BaseActivity() {
// If this CameraActivity wasn't started from the shortcut,
// tell the fragment it's in an activity (so that it sends back the result instead of
// starting a new post creation process)
if (intent.action != "android.intent.action.VIEW") {
if (intent.action != Intent.ACTION_VIEW) {
val arguments = Bundle()
arguments.putBoolean(CAMERA_ACTIVITY, true)
arguments.putBoolean(CAMERA_ACTIVITY_STORY, story)
@ -47,7 +47,7 @@ class CameraActivity : BaseActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// If this CameraActivity wasn't started from the shortcut, behave as usual
if (intent.action != "android.intent.action.VIEW") return super.onOptionsItemSelected(item)
if (intent.action != Intent.ACTION_VIEW) return super.onOptionsItemSelected(item)
// Else, start a new MainActivity when "going back" on this activity
when (item.itemId) {

View File

@ -2,7 +2,6 @@ package org.pixeldroid.app.postCreation.camera
import android.Manifest
import android.app.Activity
import android.content.ClipData
import android.content.ContentUris
import android.content.Intent
import android.content.pm.PackageManager
@ -38,7 +37,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.pixeldroid.app.databinding.FragmentCameraBinding
import org.pixeldroid.app.postCreation.PostCreationActivity
import org.pixeldroid.app.posts.fromHtml
import org.pixeldroid.app.utils.BaseFragment
import java.io.File
import java.util.concurrent.ExecutorService
@ -450,16 +448,7 @@ class CameraFragment : BaseFragment() {
private fun startAlbumCreation(uris: ArrayList<String>) {
val intent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
// Pass downloaded images to new post creation activity
putParcelableArrayListExtra(
Intent.EXTRA_STREAM, ArrayList(uris.map { it.toUri() })
)
setClass(requireContext(), PostCreationActivity::class.java)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
}
val intent = PostCreationActivity.intentForUris(requireContext(), uris.map { it.toUri() })
if(inActivity && !addToStory){
requireActivity().setResult(Activity.RESULT_OK, intent)

View File

@ -3,40 +3,99 @@ package org.pixeldroid.app.posts
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.viewpager2.widget.ViewPager2
import kotlinx.coroutines.launch
import org.pixeldroid.app.databinding.ActivityAlbumBinding
import org.pixeldroid.app.utils.api.objects.Attachment
class AlbumActivity : AppCompatActivity() {
private val model: AlbumViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityAlbumBinding.inflate(layoutInflater)
val binding = ActivityAlbumBinding.inflate(layoutInflater)
setContentView(binding.root)
val mediaAttachments = intent.getSerializableExtra("images") as ArrayList<Attachment>
val index = intent.getIntExtra("index", 0)
binding.albumPager.adapter = AlbumViewPagerAdapter(mediaAttachments,
binding.albumPager.adapter = AlbumViewPagerAdapter(
model.uiState.value.mediaAttachments,
sensitive = false,
opened = true,
//In the activity, we assume we want to show everything
alwaysShowNsfw = true
alwaysShowNsfw = true,
clickCallback = ::clickCallback
)
binding.albumPager.currentItem = index
if(mediaAttachments.size == 1){
binding.albumPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) { model.positionSelected(position) }
})
if (model.uiState.value.mediaAttachments.size == 1) {
binding.albumPager.isUserInputEnabled = false
}
else if((mediaAttachments.size) > 1) {
} else if ((model.uiState.value.mediaAttachments.size) > 1) {
binding.postIndicator.setViewPager(binding.albumPager)
binding.postIndicator.visibility = View.VISIBLE
} else {
binding.postIndicator.visibility = View.GONE
}
// Not really necessary because the ViewPager saves its state in onSaveInstanceState, but
// it's good to stay consistent in case something gets out of sync
binding.albumPager.setCurrentItem(model.uiState.value.index, false)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowTitleEnabled(false)
supportActionBar?.setBackgroundDrawable(null)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
model.uiState.collect { uiState ->
binding.albumPager.currentItem = uiState.index
}
}
}
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
model.isActionBarHidden.collect { isActionBarHidden ->
val windowInsetsController =
WindowCompat.getInsetsController(this@AlbumActivity.window, binding.albumPager)
if (isActionBarHidden) {
// Configure the behavior of the hidden system bars
windowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Hide both the status bar and the navigation bar
supportActionBar?.hide()
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
binding.postIndicator.visibility = View.GONE
} else {
// Configure the behavior of the hidden system bars
windowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Show both the status bar and the navigation bar
supportActionBar?.show()
windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
if ((model.uiState.value.mediaAttachments.size) > 1) {
binding.postIndicator.visibility = View.VISIBLE
}
}
}
}
}
}
/**
* Callback passed to the AlbumViewPagerAdapter to signal a single click on the image
*/
private fun clickCallback(){
model.barHide()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {

View File

@ -0,0 +1,46 @@
package org.pixeldroid.app.posts
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import org.pixeldroid.app.utils.api.objects.Attachment
import javax.inject.Inject
data class AlbumUiState(
val mediaAttachments: ArrayList<Attachment> = arrayListOf(),
val index: Int = 0,
)
@HiltViewModel
class AlbumViewModel @Inject constructor(state: SavedStateHandle) : ViewModel() {
companion object {
const val ALBUM_IMAGES = "AlbumViewImages"
const val ALBUM_INDEX = "AlbumViewIndex"
}
private val _uiState: MutableStateFlow<AlbumUiState>
private val _isActionBarHidden: MutableStateFlow<Boolean>
init {
_uiState = MutableStateFlow(AlbumUiState(
mediaAttachments = state[ALBUM_IMAGES] ?: ArrayList(),
index = state[ALBUM_INDEX] ?: 0
))
_isActionBarHidden = MutableStateFlow(false)
}
val uiState: StateFlow<AlbumUiState> = _uiState.asStateFlow()
val isActionBarHidden: StateFlow<Boolean> = _isActionBarHidden
fun barHide() {
_isActionBarHidden.update { !it }
}
fun positionSelected(position: Int) {
_uiState.update { it.copy(index = position) }
}
}

View File

@ -88,8 +88,8 @@ class NestedScrollableHost(context: Context, attrs: AttributeSet? = null) :
}
val intent = Intent(context, AlbumActivity::class.java)
intent.putExtra("images", images)
intent.putExtra("index", (child as ViewPager2).currentItem)
intent.putExtra(AlbumViewModel.ALBUM_IMAGES, images)
intent.putExtra(AlbumViewModel.ALBUM_INDEX, (child as ViewPager2).currentItem)
context.startActivity(intent)

View File

@ -1,7 +1,6 @@
package org.pixeldroid.app.posts
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager.PERMISSION_DENIED
import android.graphics.Typeface
@ -18,11 +17,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.activity.result.ActivityResultLauncher
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView
@ -536,18 +531,7 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold
).show()
// Create new post creation activity
//TODO use this instead of clipdata (everywhere)
val intent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
// Pass downloaded images to new post creation activity
putParcelableArrayListExtra(
Intent.EXTRA_STREAM, ArrayList(imageUris)
)
setClass(context, PostCreationActivity::class.java)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
val intent = PostCreationActivity.intentForUris(context, imageUris).apply {
putExtra(
PostCreationActivity.PICTURE_DESCRIPTIONS,
ArrayList(imageDescriptions)
@ -817,17 +801,15 @@ class StatusViewHolder(val binding: PostFragmentBinding) : RecyclerView.ViewHold
class AlbumViewPagerAdapter(
private val media_attachments: List<Attachment>, private var sensitive: Boolean?,
private val opened: Boolean, private val alwaysShowNsfw: Boolean,
) :
RecyclerView.Adapter<AlbumViewPagerAdapter.ViewHolder>() {
private var isActionBarHidden: Boolean = false
private val clickCallback: (() -> Unit)? = null
) : RecyclerView.Adapter<AlbumViewPagerAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return if(!opened) ViewHolderClosed(AlbumImageViewBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)) else ViewHolderOpen(OpenedAlbumBinding.inflate(
LayoutInflater.from(parent.context), parent, false
))
), clickCallback!!)
}
override fun getItemCount() = media_attachments.size
@ -858,24 +840,6 @@ class AlbumViewPagerAdapter(
setDoubleTapZoomDpi(240)
resetScaleAndCenter()
}
holder.image.setOnClickListener {
val windowInsetsController = WindowCompat.getInsetsController((it.context as Activity).window, it)
// Configure the behavior of the hidden system bars
if (isActionBarHidden) {
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Hide both the status bar and the navigation bar
(it.context as AppCompatActivity).supportActionBar?.show()
windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
isActionBarHidden = false
} else {
// Configure the behavior of the hidden system bars
windowInsetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Hide both the status bar and the navigation bar
(it.context as AppCompatActivity).supportActionBar?.hide()
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
isActionBarHidden = true
}
}
}
else Glide.with(holder.binding.root)
.asDrawable().fitCenter()
@ -921,9 +885,13 @@ class AlbumViewPagerAdapter(
abstract val videoPlayButton: ImageView
}
class ViewHolderOpen(override val binding: OpenedAlbumBinding) : ViewHolder(binding) {
class ViewHolderOpen(override val binding: OpenedAlbumBinding, clickCallback: () -> Unit) : ViewHolder(binding) {
override val image: SubsamplingScaleImageView = binding.imageImageView
override val videoPlayButton: ImageView = binding.videoPlayButton
init {
image.setOnClickListener { clickCallback() }
}
}
class ViewHolderClosed(override val binding: AlbumImageViewBinding) : ViewHolder(binding) {
override val image: ImageView = binding.imageImageView

View File

@ -138,35 +138,45 @@
<plurals name="nb_following">
<item quantity="one">%d
\nAbonnement</item>
<item quantity="many">%d
\nAbonnements</item>
<item quantity="other">%d
\nAbonnements</item>
</plurals>
<plurals name="nb_followers">
<item quantity="one">%d
\nAbonné·e</item>
<item quantity="many">%d
\nAbonné·e·s</item>
<item quantity="other">%d
\nAbonné·e·s</item>
</plurals>
<plurals name="nb_posts">
<item quantity="one">%d
\nPublication</item>
<item quantity="many">%d
\nPublications</item>
<item quantity="other">%d
\nPublications</item>
</plurals>
<plurals name="number_comments">
<item quantity="one">%d commentaire</item>
<item quantity="many">%d commentaires</item>
<item quantity="other">%d commentaires</item>
</plurals>
<plurals name="shares">
<item quantity="one">%d Partage</item>
<item quantity="many">%d Partages</item>
<item quantity="other">%d Partages</item>
</plurals>
<plurals name="likes">
<item quantity="one">%d J\'aime</item>
<item quantity="many">%d J\'aime</item>
<item quantity="other">%d J\'aime</item>
</plurals>
<plurals name="description_max_characters">
<item quantity="one">La description doit contenir au moins %d lettre.</item>
<item quantity="many">La description doit contenir au moins %d lettres.</item>
<item quantity="other">La description doit contenir au moins %d lettres.</item>
</plurals>
<string name="delete_post_failed_error">Impossible de supprimer la publication, erreur %1$d</string>
@ -184,7 +194,7 @@
<string name="followed_notification_channel">Nouveaux·elles abonné·e·s</string>
<string name="mention_notification_channel">Mentions</string>
<string name="shared_notification_channel">Partages</string>
<string name="liked_notification_channel">Favoris</string>
<string name="liked_notification_channel">J\'aime</string>
<string name="comment_notification_channel">Commentaires</string>
<string name="poll_notification_channel">Sondages</string>
<string name="other_notification_channel">Autre</string>
@ -223,6 +233,85 @@
<string name="profile_saved">Modifications enregistrées!</string>
<string name="change_profile_picture">Changer votre image de profil</string>
<string name="switch_accounts">Permutation de comptes</string>
<string name="edit_link_failed">Échec de l\'ouverture de la page de modifications</string>
<string name="edit_link_failed">Impossible d\'ouvrir la page d\'édition</string>
<string name="follow_requested">Abonnement demandé</string>
<string name="comment_noun">Commentaire</string>
<string name="redraft_dialog_launch">La reformulation de cet article vous permettra de modifier la photo et sa description, mais supprimera tous les commentaires et les mentions \"J\'aime\". Poursuivre ?</string>
<string name="notification_thumbnail">Vignette de l\'image dans ce message</string>
<string name="always_show_nsfw">Toujours afficher les contenus sensibles</string>
<string name="post_preview">Aperçu d\'un message</string>
<plurals name="notification_title_summary">
<item quantity="one">%d nouvelle notification</item>
<item quantity="many">%d nouvelles notifications</item>
<item quantity="other">%d nouvelles notifications</item>
</plurals>
<plurals name="items_load_success">
<item quantity="one">%d article chargé avec succès</item>
<item quantity="many">%d articles chargés avec succès</item>
<item quantity="other">%d articles chargés avec succès</item>
</plurals>
<string name="notification_summary_large">%1$s, %2$s, %3$s et %4$d autres</string>
<string name="notification_summary_medium">%1$s, %2$s, et %3$s</string>
<string name="video_not_supported">Le serveur que vous utilisez ne prend pas en charge les téléchargements de vidéos, il se peut que vous ne puissiez pas télécharger les vidéos incluses dans cet article</string>
<string name="new_collection_link_failed">Échec de l\'ouverture de la page de création d\'une collection</string>
<string name="bookmark">Favori</string>
<string name="unknown_error_in_error">Erreur inconnue, vérifiez si le serveur est en panne : %1$s</string>
<string name="profile_error">Impossible de charger le profil</string>
<string name="add_images_error">Erreur lors de l\'ajout des images</string>
<string name="description_template_summary">Remplir la description des nouveaux messages avec ceci</string>
<string name="description_template">Modèle de description</string>
<string name="explore_accounts">Explorer les comptes populaires de cette instance</string>
<string name="explore_hashtags">Explorer les hashtags en vogue sur cette instance</string>
<string name="daily_trending">Voir les messages populaires de la journée</string>
<string name="notification_summary_small">%1$s et %2$s</string>
<string name="extraneous_pictures_stories">Les images après la première ont été supprimées mais peuvent être restaurées en revenant à la création d\'un message</string>
<string name="summary_always_show_nsfw">Les messages NSFW/CW ne seront pas floutés et seront affichés par défaut.</string>
<string name="encode_progress">Encodage de %1$d%%</string>
<string name="still_encoding">Une ou plusieurs vidéos sont en cours d\'encodage. Attendez qu\'elles soient terminées avant d\'envoyer</string>
<string name="notifications_settings_summary">Gérer les notifications que vous souhaitez recevoir</string>
<string name="login_notifications">Impossible de récupérer les dernières notifications</string>
<string name="no_camera_permission">L\'autorisation pour l\'appareil photo n\'est pas accordée, accordez cette autorisation dans les paramètres si vous voulez permettre à PixelDroid d\'utiliser l\'appareil photo</string>
<string name="play_video">Lire la vidéo</string>
<string name="public_feed">Publique</string>
<string name="accentColorTitle">Couleur d\'accentuation</string>
<string name="accentColorSummary">Choisir une couleur d\'accentuation</string>
<string name="color_choice_button">Choisir cette couleur d\'accentuation</string>
<string name="explore_posts">Explorer aléatoirement les messages d\'aujourd\'hui</string>
<string name="grid_view">Vue en grille</string>
<string name="feed_view">Vue du flux</string>
<string name="encode_error">Erreur d\'encodage</string>
<string name="encode_success">Encodage réussi !</string>
<string name="more_profile_settings">Autres paramètres du profil</string>
<string name="private_account_explanation">Quand votre compte est privé, seules les personnes que vous autorisez peuvent voir vos photos et vidéos sur PixelFed. Les personnes qui vous suivent déjà ne seront pas affectées.</string>
<string name="saving_profile">Sauvegarde de votre profil</string>
<string name="use_dynamic_color">Utiliser la couleur dynamique de votre système</string>
<string name="type_story">Story</string>
<string name="story_image">Image de la Story</string>
<string name="replyToStory">Répondre à %1$s</string>
<string name="story_reply_error">Un problème s\'est produit lors de l\'envoi de la réponse</string>
<string name="error_fetch_story">Un problème s\'est produit lors de la récupération du carrousel</string>
<string name="sent_reply_story">Envoyer la réponse</string>
<string name="fetching_profile">Recherche de votre profil…</string>
<string name="redraft_dialog_cancel">Si vous annulez ce remaniement, le message original ne figurera plus sur votre compte. Poursuivre sans réécrire ?</string>
<string name="redraft_post_failed_error">Impossible de réécrire le message, erreur %1$d</string>
<string name="redraft_post_failed_io_except">Impossible de réécrire le message, vérifiez votre connexion ?</string>
<string name="bookmark_post_failed_error">Impossible de mettre/enlever le message en favoris, erreur %1$d</string>
<string name="bookmark_post_failed_io_except">Impossible de mettre/enlever le message des favoris, vérifiez votre connexion ?</string>
<string name="no_storage_permission">L\'autorisation pour le stockage n\'est pas accordée, accordez l\'autorisation dans les paramètres si vous voulez permettre à PixelDroid d\'afficher la vignette</string>
<string name="analyzing_stabilization">Analyse pour stabiliser %1$d%%</string>
<string name="color_chosen">Couleur d\'accentuation choisie</string>
<string name="error_profile">Un problème s\'est produit. Appuyez pour réessayer</string>
<string name="delete_collection_warning">Êtes-vous sûr de vouloir supprimer cette collection ?</string>
<string name="added_post_to_collection">Ajouter le message à la collection</string>
<string name="error_add_post_to_collection">Échec de l\'ajout du message à la collection</string>
<string name="removed_post_from_collection">Enlever le message de la collection</string>
<string name="error_remove_post_from_collection">Échec pour retirer le message de la collection</string>
<string name="contains_nsfw">Contient des médias NSFW</string>
<string name="add_story">Ajouter une Story</string>
<string name="story_could_not_see">Erreur : Impossible de marquer la Story comme vu</string>
<string name="story_pause">Démarrer ou interrompre les Stories</string>
<string name="my_story">Ma Story</string>
<string name="type_post">Message</string>
<string name="continue_post_creation">Continuer</string>
<string name="story_duration">Durée de la Story</string>
</resources>

View File

@ -9,7 +9,7 @@
<string name="theme_header">Тема</string>
<string name="mention_notification">%1$s вас згадує</string>
<string name="description">Опис…</string>
<string name="post">надіслати</string>
<string name="post">Оприлюднити</string>
<string name="save_to_gallery">Зберегти до галереї…</string>
<string name="image_download_downloading">Завантаження…</string>
<string name="image_download_success">Зображення успішно завантажено</string>
@ -146,13 +146,13 @@
<string name="default_nfollowing">-
\nпідписок</string>
<string name="search">Пошук</string>
<string name="edit_profile">Редагувати</string>
<string name="edit_profile">Редагувати профіль</string>
<string name="posts">ДОПИСИ</string>
<string name="accounts">ОБЛІКОВІ ЗАПИСИ</string>
<string name="license_info">PixelDroid — вільне й відкрите програмне забезпечення, доступне на умовах Загальної громадської ліцензії GNU (версії 3 чи новішої)</string>
<string name="about">Про застосунок</string>
<string name="post_title">Допис %1$s</string>
<string name="reported">Скаргу надіслано {gmd_check_circle}</string>
<string name="reported">Скаргу надіслано</string>
<string name="profile_picture">Зображення профілю</string>
<string name="open_drawer_menu">Відкрити висувне меню</string>
<string name="something_went_wrong">Щось пішло не так…</string>
@ -223,4 +223,108 @@
<string name="video_not_supported">Використовуваний сервер не підтримує вивантаження відео. Ймовірно, вивантажити відео цього допису не вдасться</string>
<string name="post_is_video">Це відеодопис</string>
<string name="play_video">Відтворити відео</string>
<string name="bookmarks">Закладки</string>
<string name="collections">Колекції</string>
<string name="delete_collection">Видалити колекцію</string>
<string name="collection_add_post">Додати публікацію</string>
<string name="collection_remove_post">Вилучити публікацію</string>
<string name="comment_noun">Коментар</string>
<string name="add_to_collection">Оберіть публікацію для додавання</string>
<plurals name="replies_count">
<item quantity="one">%d відповідь</item>
<item quantity="few">%d відповіді</item>
<item quantity="many">%d відповідей</item>
<item quantity="other">%d відповідей</item>
</plurals>
<string name="delete_from_collection">Оберіть публікацію для вилучення</string>
<string name="redraft_dialog_cancel">Якщо ви скасуєте цю переробку, оригінального допису більше не буде у вашому акаунті. Продовжити без перепосту?</string>
<string name="accentColorTitle">Акцентний колір</string>
<string name="explore_posts">Ознайомтеся з випадковими дописами дня</string>
<string name="private_account_explanation">Коли ваш акаунт приватний, тільки люди, яких ви схвалите, зможуть бачити ваші фотографії та відео на pixelfed. На ваших існуючих підписників це не вплине.</string>
<string name="always_show_nsfw">Завжди показувати чутливий вміст</string>
<string name="profile_error">Не вдалося завантажити профіль</string>
<string name="explore_accounts">Ознайомтеся з популярними акаунтами на цьому екземплярі</string>
<string name="added_post_to_collection">Публікацію додано в колекцію</string>
<string name="summary_always_show_nsfw">Дописи NSFW/CW не будуть розмиті і відображатимуться за замовчуванням.</string>
<string name="type_story">Історія</string>
<string name="new_collection_link_failed">Не вдалося відкрити сторінку створення колекції</string>
<string name="redraft_dialog_launch">При переробці цього допису ви зможете відредагувати фотографію та її опис, але при цьому будуть видалені всі поточні коментарі та вподобання. Продовжити?</string>
<string name="notification_thumbnail">Ескіз зображення в дописі цього повідомлення</string>
<string name="redraft">Переробити</string>
<string name="delete_collection_warning">Ви впевнені що хочете видалити цю колекцію?</string>
<string name="error_add_post_to_collection">Не вдалося додати публікацію до колекції</string>
<string name="use_dynamic_color">Використовувати динамічні кольори з вашої системи</string>
<string name="story_could_not_see">Помилка: не вдалося позначити історію як побачену</string>
<string name="encode_error">Помилка кодування</string>
<string name="encode_success">Кодування успішно завершено!</string>
<string name="encode_progress">Кодувати %1$d%%</string>
<string name="still_encoding">Одне або кілька відео все ще кодуються. Зачекайте, поки кодування завершиться, перш ніж завантажувати</string>
<string name="new_post_shortcut_short">Нова публікація</string>
<string name="follow_request">%1$s надіслав запит на відстеження вас</string>
<plurals name="items_load_success">
<item quantity="one">%d елемент успішно завантажено</item>
<item quantity="few">%d елемента успішно завантажено</item>
<item quantity="many">%d елементів успішно завантажено</item>
<item quantity="other">%d елементів успішно завантажено</item>
</plurals>
<string name="home_feed">Домівка</string>
<string name="search_discover_feed">Пошук</string>
<string name="story_image">Зображення історії</string>
<string name="replyToStory">Відповісти на %1$s</string>
<string name="fetching_profile">Отримання вашого профілю…</string>
<string name="continue_post_creation">Продовжити</string>
<string name="extraneous_pictures_stories">Зображення після першого були вилучені, але їх можна відновити, повернувшись до створення публікації</string>
<string name="upload_next_step">Наступний крок</string>
<string name="add_details">Додати деякі деталі</string>
<string name="unknown_error_in_error">Невідома помилка, перевірте, чи не працює сервер: %1$s</string>
<string name="collection_title">%1$s колекція</string>
<string name="bookmark">Закладка</string>
<string name="unbookmark">Видалити закладку</string>
<string name="feed_view">Вигляд стрічки</string>
<string name="redraft_post_failed_error">Не вдалося переробити пост, помилка %1$d</string>
<string name="redraft_post_failed_io_except">Не вдалося переписати пост, перевірити ваше зʼєднання?</string>
<string name="bookmark_post_failed_error">Не вдалося додати/видалити закладку, помилка %1$d</string>
<string name="bookmark_post_failed_io_except">Не вдалося додати/видалити закладку, перевірити зʼєднання?</string>
<string name="analyzing_stabilization">Аналіз для стабілізації %1$d%%</string>
<string name="new_post_shortcut_long">Створити нову публікацію</string>
<string name="status_notification">%1$s створив публікацію</string>
<string name="create_feed">Створити</string>
<string name="notifications_feed">Оновлення</string>
<string name="public_feed">Публічний</string>
<string name="accentColorSummary">Виберіть акцентний колір</string>
<string name="color_choice_button">Вибрати цей колір як акцентний</string>
<string name="color_chosen">Обрано акцентний колір</string>
<string name="from_other_domain">з %1$s</string>
<string name="add_images_error">Помилка під час додавання зображень</string>
<string name="post_preview">Попередній перегляд публікації</string>
<string name="description_template_summary">Доповніть опис нових дописів цим</string>
<string name="description_template">Шаблон опису</string>
<string name="popular_accounts">Популярні акаунти</string>
<string name="explore_hashtags">Дослідіть популярні хештеги на цьому екземплярі</string>
<string name="trending_hashtags">Популярні хештеги</string>
<string name="daily_trending">Переглядайте щоденні популярні дописи</string>
<string name="trending_posts">Популярні публікації</string>
<string name="grid_view">Вигляд сітки</string>
<string name="error_remove_post_from_collection">Не вдалося вилучити публікацію з колекції</string>
<string name="removed_post_from_collection">Публікацію вилучено з колекції</string>
<string name="save">Зберегти</string>
<string name="more_profile_settings">Більше налаштувань профілю</string>
<string name="private_account">Приватний обліковий запис</string>
<string name="your_bio">Ваша біографія</string>
<string name="your_name">Ваге імʼя</string>
<string name="profile_save_changes">Ви не зберегли зміни. Вийти?</string>
<string name="saving_profile">Збереження вашого профілю</string>
<string name="profile_saved">Зміни збережено!</string>
<string name="error_profile">Щось пішло не так. Натисніть, щоб повторити спробу</string>
<string name="change_profile_picture">Змінити зображення профілю</string>
<string name="contains_nsfw">Містить носії NSFW</string>
<string name="switch_accounts">Змінити обліковий запис</string>
<string name="story_reply_error">Щось пішло не так під час надсилання відповіді</string>
<string name="error_fetch_story">Щось пішло не так з каруселлю</string>
<string name="sent_reply_story">Відповідь надіслано</string>
<string name="add_story">Додати історію</string>
<string name="story_pause">Запустити або призупинити історії</string>
<string name="my_story">Моя історія</string>
<string name="type_post">Публікація</string>
<string name="story_duration">Тривалість історії</string>
</resources>

View File

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="menu_settings">設定</string>
<string name="menu_account">關於我</string>
<string name="invalid_domain">無效的網域</string>
<string name="registration_failed">無法在此伺服器上註冊</string>
<string name="auth_failed">無法認證</string>
<string name="verify_credentials">無法獲取使用者資訊</string>
<string name="token_error">獲取Token的時候發生錯誤</string>
<string name="instance_error">無法獲取實例資訊</string>
<string name="instance_not_pixelfed_continue">無論如何繼續</string>
<string name="instance_not_pixelfed_cancel">取消登入</string>
<string name="title_activity_settings2">設定</string>
<string name="theme_title">應用主題</string>
<string name="theme_header">主題</string>
<string name="default_system">默認(跟隨系統)</string>
<string name="light_theme">明亮</string>
<string name="dark_theme">黑暗</string>
<string name="always_show_nsfw">總是展示敏感內容</string>
<string name="followed_notification">%1$s 追蹤了你</string>
<string name="mention_notification">%1$s 提及了你</string>
<string name="shared_notification">%1$s 分享了你的貼文</string>
<string name="comment_notification">%1$s 在你的貼文下留言了</string>
<string name="poll_notification">%1$s的投票已經結束</string>
<string name="other_notification">從%1$s的通知</string>
<string name="followed_notification_channel">新的追蹤者</string>
<string name="mention_notification_channel">提及</string>
<string name="shared_notification_channel">分享</string>
<string name="liked_notification_channel">喜歡</string>
<string name="comment_notification_channel">留言</string>
<string name="poll_notification_channel">投票</string>
<string name="other_notification_channel">其他</string>
<string name="notification_summary_large">%1$s, %2$s, %3$s 和 %4$d 更多</string>
<string name="notification_summary_medium">%1$s, %2$s, 和 %3$s</string>
<string name="notification_summary_small">%1$s 和 %2$s</string>
<string name="whats_an_instance">「實例」是什麼?</string>
<string name="domain_of_your_instance">你所在實例的網域</string>
<string name="connect_to_pixelfed">連接至Pixelfed</string>
<string name="login_connection_required_once">你需要連上網際網路才能新增第一個賬戶來使用PixelDroid :(</string>
<string name="api_not_enabled_dialog">這個實例上的API並沒有被啟用。請與你的管理員聯絡。</string>
<string name="logout">登出</string>
<plurals name="description_max_characters">
<item quantity="other">介紹必須含有最少%d個字元。</item>
</plurals>
<string name="upload_picture_failed">上載圖片失敗!</string>
<string name="picture_format_error">上載失敗:錯誤的圖片格式。</string>
<string name="request_format_error">上載失敗:請求格式錯誤</string>
<string name="upload_post_failed">貼文上載失敗</string>
<string name="upload_post_error">貼文上載錯誤</string>
<string name="description">介紹……</string>
<string name="post">貼文</string>
<string name="upload_next_step">下一步</string>
<string name="add_details">新增點細節</string>
<string name="add_photo">新增圖片</string>
<string name="post_image">本貼文中的一個圖片</string>
<string name="switch_to_grid">切換到網格視圖</string>
<string name="save_image_description">保存圖片介紹</string>
<string name="no_media_description">在這裡新增媒體描述……</string>
<string name="size_exceeds_instance_limit">第%1$d個圖片超過了實例所允許的最大大小(%2$dkB限制為%3$dkB),你可能無法上載。</string>
<string name="upload_error">伺服器返回了「%1$d」的錯誤碼</string>
<string name="capture_button_alt">拍照</string>
<string name="switch_camera_button_alt">切換攝像頭</string>
<string name="gallery_button_alt">相簿</string>
<string name="loading_toast">載入時發生錯誤</string>
<string name="feed_failed">無法獲得Feed</string>
<string name="unknown_error_in_error">未知錯誤,看看伺服器是否停運:%1$s</string>
<string name="browser_launch_failed">無法拉起瀏覽器,你有安裝嗎?</string>
<string name="app_name">PixelDroid</string>
<string name="instance_not_pixelfed_warning">這看起來不是個Pixelfed實例應用可能會以意想不到的方式崩潰。</string>
<string name="liked_notification">%1$s 喜歡了你的貼文</string>
<string name="upload_post_success">成功上載了貼文</string>
<string name="switch_to_carousel">切換到輪播</string>
<string name="video_not_supported">你選擇的伺服器不支援上載影片,你可能無法在此貼文中新增影片</string>
<plurals name="notification_title_summary">
<item quantity="other">%d 則新通知</item>
</plurals>
<string name="whats_an_instance_explanation">你可能因被要求填入「實例」而困惑。
\n
\nPixelfed是個聯邦平台「聯邦宇宙」的一員可以和其他平台上相同語言的使用者相互交談就像Mastodon(去https://joinmastodon.org看看)
\n
\n也就是說你必須選擇一個伺服器或者是Pixelfed的「實例」來使用。如果沒有的話請訪問https://pixelfed.org/join
\n
\n欲瞭解Pixelfed的更多資訊請訪問https://pixelfed.org</string>
<string name="add_account_name">新增賬戶</string>
<string name="add_account_description">新增另一個Pixelfed賬戶</string>
<string name="total_exceeds_album_limit">你可以選擇該伺服器最多允許的圖片數量(%1$s個)。超過限制的會被忽略。</string>
<string name="share_picture">分享相片……</string>
<string name="save_to_gallery">存儲至相簿……</string>
<string name="image_download_failed">下載失敗,請重試</string>
<string name="image_download_downloading">下載中……</string>
<string name="image_download_success">相片下載成功</string>
<plurals name="items_load_success">
<item quantity="other">%d個物件已被成功載入</item>
</plurals>
<string name="no_description">沒有描述</string>
<plurals name="likes">
<item quantity="other">%d個喜歡</item>
</plurals>
<plurals name="shares">
<item quantity="other">%d個分享</item>
</plurals>
<string name="posted_on">在%1$s發表</string>
<string name="NoCommentsToShow">此貼文下沒有回覆……</string>
<string name="empty_comment">回覆内容不能為空!</string>
<string name="share_image">分享相片</string>
<string name="comment_error">回覆失敗!</string>
<string name="comment_posted">回覆「%1$s」已發表</string>
<string name="comment_verb">回覆</string>
<string name="comment_noun">回覆</string>
<plurals name="number_comments">
<item quantity="other">%d則回覆</item>
</plurals>
<string name="add_comment">發表回覆</string>
<string name="submit_comment">發表回覆</string>
<string name="post_is_album">這則貼文是一個集合</string>
<string name="post_is_video">這則貼文是一支影片</string>
<plurals name="nb_posts">
<item quantity="other">%d
\n貼文</item>
</plurals>
<plurals name="nb_followers">
<item quantity="other">%d
\n追蹤者</item>
</plurals>
<string name="edit">編輯</string>
<string name="save_image_failed">無法儲存相片</string>
<string name="save_image_success">相片成功存儲</string>
<string name="follow_status_failed">無法獲取追蹤狀態</string>
<string name="edit_link_failed">無法打開編輯頁面</string>
<string name="empty_feed">本來無一物,何處惹塵埃</string>
<string name="follow_button_failed">無法顯示追蹤按鈕</string>
<string name="follow_error">無法追蹤</string>
<string name="action_not_allowed">不允許此操作</string>
<string name="unfollow_error">無法取消追蹤</string>
<string name="access_token_invalid">這個access token無效</string>
<string name="default_nposts">-
\n貼文</string>
<string name="default_nfollowers">-
\n追蹤者</string>
<string name="default_nfollowing">-
\n追蹤中</string>
<string name="no_username">無使用者名稱</string>
<string name="follow">追蹤</string>
<string name="follow_requested">請求已送出</string>
<string name="dialog_message_cancel_follow_request">取消追蹤申請嗎?</string>
<string name="edit_profile">編輯個人資料</string>
<string name="search">搜尋</string>
<string name="posts">貼文</string>
<string name="accounts">使用者</string>
<string name="hashtags">推標</string>
<string name="media_upload_completed">媒體上載成功</string>
<string name="media_upload_failed">媒體上載失敗,重新試試,或者檢查下網路</string>
<string name="posting_image_accessibility_hint">準備要貼出的相片</string>
<string name="retry">重試</string>
<string name="nothing_to_see_here">空無一物!</string>
<string name="about_pixeldroid">關於PixelDroid</string>
<string name="dependencies_licenses">依賴和許可</string>
<string name="about">關於</string>
<string name="post_title">%1$s的貼文</string>
<string name="collection_title">%1$s的合集</string>
<string name="followers_title">%1$s的追蹤者</string>
<string name="hashtag_title">#%1$s</string>
<string name="follows_title">%1$s的追蹤</string>
<string name="search_empty_error">搜尋的關鍵詞不能為空</string>
<string name="status_more_options">更多</string>
<string name="report">回報</string>
<string name="bookmark">書簽</string>
<string name="unbookmark">從書簽中移除</string>
<string name="share_link">分享連結</string>
<string name="reported">已報告貼文</string>
<string name="profile_picture">個人資料相片</string>
<string name="open_drawer_menu">打開抽屜菜單</string>
<string name="discover">發現</string>
<string name="something_went_wrong">發生錯誤……</string>
<string name="panda_pull_to_refresh_to_try_again">這隻熊貓不開心。下拉重載以重試。</string>
<string name="redraft">重擬</string>
<string name="redraft_dialog_cancel">如果你取消這次重擬,原貼文將會被從你的賬戶中移除。繼續嗎?</string>
<string name="delete">刪除</string>
<string name="delete_dialog">刪除這則貼文嗎?</string>
<string name="language">語言</string>
<string name="help_translate">幫助將PixelDroid翻譯成你的語言吧</string>
<string name="issues_contribute">報告問題或是給這個軟體貢獻:</string>
<string name="redraft_post_failed_error">無法重擬這則貼文,錯誤%1$d</string>
<string name="redraft_post_failed_io_except">無法重擬貼文,檢查你的網路?</string>
<string name="delete_post_failed_error">無法刪除這則貼文,錯誤%1$d</string>
<string name="delete_post_failed_io_except">無法刪除這則貼文,檢查你的網路?</string>
<string name="bookmark_post_failed_error">無法對此貼文進行書簽操作,錯誤%1$d</string>
<string name="file_not_found">沒找到檔案%1$s</string>
<string name="notifications_settings">通知設定</string>
<string name="notifications_settings_summary">管理你想接收到的通知</string>
<string name="login_notifications">無法獲取最新通知</string>
<string name="no_storage_permission">存儲權限未獲取。如果想查看縮圖的話請在設定中允許該權限</string>
<string name="play_video">播放影片</string>
<string name="encode_error">編碼錯誤</string>
<string name="encode_success">編碼成功!</string>
<string name="encode_progress">編碼%1$d%%</string>
<string name="analyzing_stabilization">穩定性分析%1$d%%</string>
<string name="still_encoding">有影片還在編碼。請在上載前等待編碼完成</string>
<string name="new_post_shortcut_long">建立新貼文</string>
<string name="new_post_shortcut_short">新貼文</string>
<string name="follow_request">%1$s請求追蹤</string>
<string name="home_feed">主頁面</string>
<string name="search_discover_feed">搜尋</string>
<string name="create_feed">建立</string>
<string name="notifications_feed">更新</string>
<string name="public_feed">公共</string>
<string name="accentColorTitle">色調</string>
<string name="color_choice_button">選擇這個色調</string>
<string name="color_chosen">色調已選擇</string>
<string name="profile_error">無法載入資料</string>
<string name="from_other_domain">來自%1$s</string>
<string name="add_images_error">加入相片時發生錯誤</string>
<string name="post_preview">貼文預覽</string>
<string name="description_template_summary">在新貼文的描述中預填入</string>
<string name="description_template">描述模板</string>
<string name="explore_accounts">探索這個實例上熱門的使用者</string>
<string name="popular_accounts">熱門使用者</string>
<string name="explore_hashtags">探索此實例中急上升的推標</string>
<string name="trending_hashtags">急上升推標</string>
<string name="daily_trending">瀏覽每日熱門貼文</string>
<string name="trending_posts">熱門貼文</string>
<string name="grid_view">網格視圖</string>
<string name="feed_view">饋送視圖</string>
<string name="bookmarks">書簽</string>
<string name="collections">合集</string>
<string name="delete_collection">刪除合集</string>
<string name="collection_add_post">加入貼文</string>
<string name="collection_remove_post">移除貼文</string>
<string name="add_to_collection">選取貼文以新增</string>
<string name="delete_from_collection">選取貼文已移除</string>
<string name="added_post_to_collection">已新增貼文到合集中</string>
<string name="error_add_post_to_collection">無法將貼文新增至合集中</string>
<string name="error_remove_post_from_collection">無法將貼文從合集中移除</string>
<string name="removed_post_from_collection">已將貼文從合集中移除</string>
<plurals name="replies_count">
<item quantity="other">%d則回覆</item>
</plurals>
<string name="save">保存</string>
<string name="more_profile_settings">更多資料設定</string>
<string name="private_account">私密使用者</string>
<string name="your_bio">你的自述</string>
<string name="your_name">你的名字</string>
<string name="profile_save_changes">不保存而退出嗎?</string>
<string name="fetching_profile">獲取你的資料……</string>
<string name="saving_profile">存儲你的資料中</string>
<string name="profile_saved">更改已保存!</string>
<string name="error_profile">發生錯誤。點按重試</string>
<string name="change_profile_picture">修改你的資料相片</string>
<string name="switch_accounts">切換使用者</string>
<string name="summary_always_show_nsfw">敏感媒體將不會被模糊,默認展示。</string>
<string name="contains_nsfw">包含敏感媒體</string>
<string name="story_image">故事相片</string>
<string name="replyToStory">回覆%1$s</string>
<string name="error_fetch_story">獲取旋轉視圖的時候出了點問題</string>
<string name="sent_reply_story">傳送了回覆</string>
<string name="add_story">新增故事</string>
<string name="story_could_not_see">錯誤:不能將故事標注為已看過</string>
<string name="story_pause">開始或暫停故事</string>
<string name="my_story">我的故事</string>
<string name="type_story">故事</string>
<string name="type_post">貼文</string>
<string name="continue_post_creation">繼續</string>
<string name="extraneous_pictures_stories">第一張相片后的相片已刪除,不過可以透過切換回創建貼文來恢復</string>
<string name="story_duration">故事時長</string>
<string name="write_permission_download_pic">你需要允許存儲空間權限才能保存相片!</string>
<string name="unfollow">取消追蹤</string>
<string name="cw_nsfw_hidden_media_n_click_to_show">敏感媒體
\n (點按閲覽)</string>
<string name="project_website">項目網站https://pixeldroid.org</string>
<plurals name="nb_following">
<item quantity="other">%d
\n追蹤中</item>
</plurals>
<string name="optional_report_comment">給管理員的附加資訊</string>
<string name="new_collection_link_failed">無法打開合集創建頁面</string>
<string name="license_info">PixelDroid是一個免費且開源的軟體由GNU General Public License (version 3或更新版)授權</string>
<string name="report_target">報告@%1$s的貼文</string>
<string name="report_error">無法傳送報告</string>
<string name="redraft_dialog_launch">重擬這則貼文將允許你編輯它的相片和描述,但會刪除現在所有的回覆和按讚。繼續?</string>
<string name="notification_thumbnail">在這則貼文通知中的縮圖</string>
<string name="private_account_explanation">當你的使用者為私密時只有你認可的使用者才能看到你在Pixelfed上的相片和影片。現存的追蹤者不受影響。</string>
<string name="mascot_description">一個展示了一隻紅熊貓(Pixelfed的吉祥物)用手機的相片</string>
<string name="use_dynamic_color">用系統的動態顔色</string>
<string name="story_reply_error">發表回覆的時候出了點問題</string>
<string name="bookmark_post_failed_io_except">無法對此貼文進行書簽操作,檢查你的網路?</string>
<string name="status_notification">%1$s建立了一個貼文</string>
<string name="no_camera_permission">相機權限未獲取。如果想用攝影功能的話請在設定中允許該權限</string>
<string name="accentColorSummary">選擇一個色調</string>
<string name="explore_posts">瀏覽隨機貼文</string>
<string name="delete_collection_warning">你確定要刪除此合集嗎?</string>
</resources>

View File

@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.2.2'
classpath 'com.android.tools.build:gradle:8.3.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong

View File

@ -0,0 +1 @@
Fix bug that was breaking the image editing feature in release mode

View File

@ -0,0 +1,3 @@
* Fix crash when sharing an image from gallery etc to the app
* Fix permission issue causing images to throw a permission denied error

View File

@ -0,0 +1 @@
Split APKs per CPU architecture, makes the APKs a lot smaller (100MB to 25MB)

View File

@ -0,0 +1,3 @@
Try again to split the apks
Update dependencies

View File

@ -0,0 +1,3 @@
* Montage vidéo ! Supprimez le son, découper les vidéos
* Ouvrez les images en plein écran et zoomez dessus :)
* Mises à jour des traductions

View File

@ -0,0 +1 @@
Correctif pour les plantages dans l'activité d'édition qui ne se produisaient qu'en mode release

View File

@ -0,0 +1 @@
Ajout de la traduction en hongrois (Magyar) à l'application. Merci à Balázs :)

View File

@ -0,0 +1,4 @@
* Ajout de règles gson proguard pour corriger les crashs sur les instances Mastodon
* Ajout de thèmes de couleur avec 4 thèmes différents
* Passage à Material 3
* Améliorer la cohérence de l'interface utilisateur

View File

@ -0,0 +1,7 @@
* Commentaires : leur ouverture permet de voir les réponses et l'avatar de l'auteur, l'aimer, etc
* MAJ des traductions. Merci aux traducteurs :) Aidez à la traduction sur weblate.pixeldroid.org
* Sécurité : altération des dépendances vérifiée, refus des connexions HTTP
* Utilisation du User Agent "PixelDroid"
* Suppression des chaînes codées en dur, tout est maintenant traduisible
* Quelques améliorations du code
* Correction de la sauvegarde des images et d'un crash sur des instances Mastodon

View File

@ -0,0 +1,11 @@
* Ajout d'un graphique d'erreur personnalisé panda rouge
* Autoriser le recadrage libre dans l'édition d'image
* Amélioration des métadonnées pour F-Droid
* Mises à jour des traductions
* Mise à jour des dépendances
* Correction de bugs

View File

@ -0,0 +1,9 @@
* Métadonnées des photos supprimées avant de les envoyer
* Favoris !
* Voir un profil comme un flux ou une grille
* Définir un modèle pour vos descriptions
* Badge sur l'icône de notification pour indiquer les nouvelles notifications
* Fonctionnalités d'édition vidéo : recadrer, changer la vitesse, stabilisation
* Implémentation de couleurs dynamiques : PixelDroid peut suive la couleur de votre arrière-plan (Android 12 et plus)
* Correction de bugs
* Mise à jour des traductions

View File

@ -0,0 +1,7 @@
* Mises à jour des traductions : Merci aux traducteurs ❤️ ! Allez sur notre weblate pour nous aider à la traduction.
#️⃣ Prise en charge des hashtags. Possibilité de parcourir les hashtags, au lieu d'afficher un "toast" message 😜
* Cliquez sur l'onglet pour revenir au début. Une fois dans la page, il suffit de cliquer sur l'onglet dans lequel vous vous trouvez pour revenir en haut :)
* Essai de correction d'un bug qui faisait planter l'application. Merci pour vos rapports de crash ! ❤️

View File

@ -0,0 +1,4 @@
- Suppression et reformulation des messages existants
- Les collections d'articles peuvent désormais être visualisées et modifiées.
- La création d'un message se fait désormais en deux étapes, avec une nouvelle prise en charge des éléments suivants : sensibilité NSFW, changement de compte, etc
- Beaucoup d'autres changements et améliorations :)

View File

@ -0,0 +1,4 @@
* Messages d'avertissement moins agressifs si vous désactivez la caméra ou les permissions de fichiers
* Mise à jour des traductions
* Correction de l'interruption de l'envoi de vidéos
* Amélioration de la gestion des erreurs

View File

@ -0,0 +1,4 @@
* Prise en charge des Stories !
* Mises à jour des dépendances
* Accélération matériel pour l'encodage vidéo
* Beaucoup de travail en coulisse :)

View File

@ -0,0 +1 @@
Corrections de bugs et améliorations ;)

View File

@ -0,0 +1,7 @@
Correction d'un bug lors de l'ouverture d'un album en plein écran.
Utiliser l'accélération matérielle (OpenGL ! Shaders !) pour l'édition d'images. Pour l'instant, nous essayons juste d'imiter l'implémentation précédente, mais cela fournira des blocs de construction pour des choses bien plus cool par la suite :)
Dites-nous si quelque chose ne fonctionne pas correctement ! (email, Mastodon)
Il y a aussi des mises à jour de traduction dans cette version :)

View File

@ -0,0 +1,7 @@
* Ajout d'une langue (Malayalam)
* Correction de quelques mauvaises réponses de l'API
* Mise à jour des dépendances
* Mise à jour des traductions

View File

@ -0,0 +1 @@
Correction d'un bug qui cassait la fonction d'édition d'images en mode release

View File

@ -0,0 +1,3 @@
* Correction d'un crash lors du partage d'une image (de la galerie, etc.) vers l'application
* Correction d'un problème de permission qui causait de la part des images une erreur "permission refusée"

View File

@ -0,0 +1 @@
Séparation des APKs par architecture CPU, rendant les APKs beaucoup plus petits (passage de 100Mo à 25Mo)

View File

@ -0,0 +1,3 @@
Nouvelle tentative de séparation des apks
Mise à jour des dépendances

View File

@ -0,0 +1,7 @@
- Support des notifications ! Encore un peu rudimentaire :)
- Correction : rotation EXIF ignorée, photos tournées dans le mauvais sens
- Correction #300
- Correction : navigateurs webview affichant une erreur à la connexion quand l'URL contenait des espaces
- Correction : vidage des caches, flux vides aux lancements, performance, photos de profil et appareil photo en erreur après changement d'onglet
- Traduction : ajout du Tchèque et mise à jour des autres langues
- Dépendances mises à jour

View File

@ -0,0 +1,5 @@
* Mises à jour des traductions
* Amélioration de l'affichage des informations sur les licences
* Correction des problèmes de permission dans l'onglet caméra
* Correction de l'analyseur de liens
* Correction de la vue découverte (peut nécessiter des mises à jour de l'instance)

View File

@ -0,0 +1,2 @@
* Mises à jour des traductions
* Autoriser l'envoi d'images distantes (ex. Nextcloud)

View File

@ -0,0 +1,4 @@
* Ajout d'un support pour la lecture et l'envoi de vidéos
* Amélioration des notifications
* Mise à jour des traductions
* Mise à jour des dépendances

View File

@ -0,0 +1,3 @@
* Correction d'un crash lors de l'affichage de la liste des licences
* Amélioration considérable des performances dans l'activité affichant le profil
* Mise à jour des dépendances

View File

@ -0,0 +1,11 @@
PixelDroid est un client Android gratuit, libre et open source pour Pixelfed, la plateforme fédérée de partage d'images.
Parcourez les flux et les profils, envoyez de nouveaux messages, découvrez des messages, interagissez avec d'autres personnes sur le fediverse.
- Support multi-compte
- Thèmes sombres et clairs
- Appliquez des filtres, recadrez, modifiez la luminosité/contraste/saturation
- Prend en compte la configuration de votre serveur Pixelfed
- Logiciel 100% libre et open source. Aucune dépendances propriétaires.
Visitez https://pixelfed.org pour en savoir plus sur Pixelfed.

View File

@ -0,0 +1 @@
Client pour Pixelfed, la plateforme fédérée de partage d'images

View File

@ -0,0 +1 @@
PixelDroid

View File

@ -0,0 +1,3 @@
* Редагування відео! Вимкнення звуку, обрізка відео
* Відкривайте зображення на весь екран, масштабуйте та переміщуйте їх :)
* Оновлення перекладів

View File

@ -0,0 +1 @@
Виправлення збоїв під час редагування, які траплялися лише у режимі релізу

View File

@ -0,0 +1 @@
Додано переклад угорською (мадярською) мовою до додатку. Дякуємо Balazs :)

View File

@ -0,0 +1,4 @@
* Додано правила gson proguard для виправлення збоїв на екземплярах Mastodon
* Додано кольорове оформлення з 4 різними темами
* Перейшли до Material 3
* Покращено узгодженість інтерфейсу користувача

View File

@ -0,0 +1,8 @@
* покращено роботу з коментарями: Тепер ви можете відкрити коментар, щоб побачити відповіді, поставити вподобайку, у коментарях відображається аватар його автора тощо.
* Оновлення перекладів. Дякуємо перекладачам :). Допоможіть перекласти PixelDroid на вашу мову на weblate.pixeldroid.org
* Безпека: перевірка залежностей гарантує, що залежності, включені в додаток, не були підроблені, PixelDroid тепер відмовлятиметься від будь-яких не-HTTPS з'єднань
* PixelDroid тепер використовує власний агент користувача "PixelDroid" замість бібліотечного OkHttp.
* Видалено всі жорстко закодовані рядки з програми, тепер все нормально перекладається.
* Деякі покращення коду
* Виправлено збереження зображень, що надходять до програми з бібліотеки або надаються у спільний доступ
* Виправлено ще один збій при використанні екземплярів Mastodon

View File

@ -0,0 +1 @@
Виправлено помилку, яка порушувала роботу функції редагування зображень у режимі релізу

View File

@ -0,0 +1,3 @@
* Виправлено збій під час надання доступу до зображення з галереї тощо у додатку
* Виправлено проблему з дозволами, через яку зображення видавали помилку відмови в доступі

View File

@ -0,0 +1 @@
Розділення APK-файлів по архітектурах процесорів, що робить APK-файли значно меншими (від 100 МБ до 25 МБ)

View File

@ -0,0 +1,3 @@
Спробуйте ще раз розділити apk файли
Оновити залежності

@ -1 +1 @@
Subproject commit 956bd5f88d6189009f2ba0a8cb2860a1bfee0ee6
Subproject commit 702d14fe701343958337efa1b4eb31f0250849f6

@ -1 +1 @@
Subproject commit 7c67b911930b4344a2917f2944493e08fdd04b57
Subproject commit 23d4d94b45a848f0c64a042985eb03d0acc2f18b