Compare commits

...

9 Commits

Author SHA1 Message Date
Fred 9fbba685be Merge branch 'arrange_tabs' into 'master'
Draft: Rearrange tabs

See merge request pixeldroid/PixelDroid!570
2024-04-15 06:52:34 +00:00
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
Fred bbcaa46b36 Remove useless imports in settings 2024-03-07 08:35:31 +00:00
Fred b4330d7ac3 Organize settings more consistently 2024-03-07 08:35:31 +00:00
Fred 073a6a4489 Create fragments according to tab settings 2024-03-07 08:35:31 +00:00
Fred 1cfb9aecb3 Load bottom menu programmatically 2024-03-07 08:35:31 +00:00
Fred a46c37766f Create settings entry for arranging tabs 2024-03-07 08:35:31 +00:00
47 changed files with 761 additions and 81 deletions

View File

@ -9,6 +9,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.ImageView
@ -16,6 +17,8 @@ import androidx.activity.addCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.PopupMenu
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
@ -25,6 +28,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.paging.ExperimentalPagingApi
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
@ -48,6 +52,8 @@ import com.mikepenz.materialdrawer.util.AbstractDrawerImageLoader
import com.mikepenz.materialdrawer.util.DrawerImageLoader
import com.mikepenz.materialdrawer.widget.AccountHeaderView
import kotlinx.coroutines.launch
import org.json.JSONArray
import org.json.JSONObject
import org.ligi.tracedroid.sending.sendTraceDroidStackTracesIfExist
import org.pixeldroid.app.databinding.ActivityMainBinding
import org.pixeldroid.app.postCreation.camera.CameraFragment
@ -65,11 +71,14 @@ import org.pixeldroid.app.utils.db.entities.PublicFeedStatusDatabaseEntity
import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity
import org.pixeldroid.app.utils.db.updateUserInfoDb
import org.pixeldroid.app.utils.hasInternet
import org.pixeldroid.app.utils.loadDefaultMenuTabs
import org.pixeldroid.app.utils.loadJsonMenuTabs
import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker.Companion.INSTANCE_NOTIFICATION_TAG
import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker.Companion.SHOW_NOTIFICATION_TAG
import org.pixeldroid.app.utils.notificationsWorker.NotificationsWorker.Companion.USER_NOTIFICATION_TAG
import org.pixeldroid.app.utils.notificationsWorker.enablePullNotifications
import org.pixeldroid.app.utils.notificationsWorker.removeNotificationChannelsFromAccount
import org.pixeldroid.app.utils.toList
import java.time.Instant
@ -86,7 +95,6 @@ class MainActivity : BaseActivity() {
private lateinit var binding: ActivityMainBinding
@OptIn(ExperimentalPagingApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen().setOnExitAnimationListener {
it.remove()
@ -112,24 +120,8 @@ class MainActivity : BaseActivity() {
sendTraceDroidStackTracesIfExist("contact@pixeldroid.org", this)
setupDrawer()
val tabs: List<() -> Fragment> = listOf(
{
PostFeedFragment<HomeStatusDatabaseEntity>()
.apply {
arguments = Bundle().apply { putBoolean("home", true) }
}
},
{ SearchDiscoverFragment() },
{ CameraFragment() },
{ NotificationsFragment() },
{
PostFeedFragment<PublicFeedStatusDatabaseEntity>()
.apply {
arguments = Bundle().apply { putBoolean("home", false) }
}
}
)
setupTabs(tabs)
setupTabs()
val showNotification: Boolean = intent.getBooleanExtra(SHOW_NOTIFICATION_TAG, false)
@ -396,29 +388,103 @@ class MainActivity : BaseActivity() {
touchSlopField.set(recyclerView, touchSlop*NestedScrollableHost.touchSlopModifier)
}
private fun setupTabs(tab_array: List<() -> Fragment>){
@OptIn(ExperimentalPagingApi::class)
private fun setupTabs() {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(applicationContext)
val tabsCheckedString = sharedPreferences.getString("tabsChecked", null)
val pageIds = listOf(R.id.page_1, R.id.page_2, R.id.page_3, R.id.page_4, R.id.page_5)
fun getDrawable(title: String): Drawable? {
val resId = when (title) {
getString(R.string.home_feed) -> R.drawable.selector_home_feed
getString(R.string.search_discover_feed) -> R.drawable.ic_search_white_24dp
getString(R.string.create_feed) -> R.drawable.selector_camera
getString(R.string.notifications_feed) -> R.drawable.selector_notifications
getString(R.string.public_feed) -> R.drawable.ic_filter_black_24dp
else -> 0
}
if (resId == 0) {
return null
} else {
return AppCompatResources.getDrawable(applicationContext, resId)
}
}
fun getFragment(title: String): (() -> Fragment)? {
return when (title) {
getString(R.string.home_feed) -> { {
PostFeedFragment<HomeStatusDatabaseEntity>()
.apply {
arguments = Bundle().apply { putBoolean("home", true) }
}
} }
getString(R.string.search_discover_feed) -> { { SearchDiscoverFragment() } }
getString(R.string.create_feed) -> { { CameraFragment() } }
getString(R.string.notifications_feed) -> { { NotificationsFragment() } }
getString(R.string.public_feed) -> { {
PostFeedFragment<PublicFeedStatusDatabaseEntity>()
.apply {
arguments = Bundle().apply { putBoolean("home", false) }
}
} }
else -> null
}
}
val tabs = if (tabsCheckedString == null) {
// Load default menu
loadDefaultMenuTabs(applicationContext, binding.root)
} else {
// Get current menu visibility and order from settings
val tabsChecked = loadJsonMenuTabs(tabsCheckedString).filter { it.second }.map { it.first }
val bottomNavigationMenu: Menu = binding.tabs.menu
bottomNavigationMenu.clear()
tabsChecked.zip(pageIds).forEach { (tabTitle, pageId) ->
with(bottomNavigationMenu.add(0, pageId, Menu.NONE, tabTitle)) {
val tabIcon = getDrawable(tabTitle)
if (tabIcon != null) {
icon = tabIcon
}
}
}
tabsChecked
}
val tabArray: List<() -> Fragment> = tabs.map { getFragment(it)!! }
binding.viewPager.reduceDragSensitivity()
binding.viewPager.adapter = object : FragmentStateAdapter(this) {
override fun createFragment(position: Int): Fragment {
return tab_array[position]()
return tabArray[position]()
}
override fun getItemCount(): Int {
return tab_array.size
return tabArray.size
}
}
val notificationId = tabs.zip(pageIds).find {
it.first == getString(R.string.notifications_feed)
}?.second
fun doAtPageId(pageId: Int): Int {
if (notificationId != null && pageId == notificationId) {
setNotificationBadge(false)
}
return pageId
}
binding.viewPager.registerOnPageChangeCallback(object : OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
val selected = when(position){
0 -> R.id.page_1
1 -> R.id.page_2
2 -> R.id.page_3
3 -> {
setNotificationBadge(false)
R.id.page_4
}
4 -> R.id.page_5
0 -> doAtPageId(R.id.page_1)
1 -> doAtPageId(R.id.page_2)
2 -> doAtPageId(R.id.page_3)
3 -> doAtPageId(R.id.page_4)
4 -> doAtPageId(R.id.page_5)
else -> null
}
if (selected != null) {

View File

@ -1,11 +1,18 @@
package org.pixeldroid.app.settings
import android.annotation.SuppressLint
import androidx.appcompat.app.AlertDialog
import android.app.Dialog
import android.content.Intent
import android.content.SharedPreferences
import android.content.res.XmlResourceParser
import android.os.Build
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.activity.addCallback
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.os.LocaleListCompat
@ -14,12 +21,22 @@ import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.button.MaterialButton
import com.google.android.material.checkbox.MaterialCheckBox
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.json.JSONArray
import org.json.JSONObject
import org.pixeldroid.app.MainActivity
import org.pixeldroid.app.R
import org.pixeldroid.app.databinding.SettingsBinding
import org.pixeldroid.common.ThemedActivity
import org.pixeldroid.app.utils.loadDefaultMenuTabs
import org.pixeldroid.app.utils.loadJsonMenuTabs
import org.pixeldroid.app.utils.setThemeFromPreferences
import org.pixeldroid.common.ThemedActivity
class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceChangeListener {
@ -103,6 +120,8 @@ class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceC
dialogFragment = ColorPreferenceDialog((preference as ColorPreference?)!!)
} else if(preference.key == "language"){
dialogFragment = LanguageSettingFragment()
} else if (preference.key == "arrange_tabs") {
dialogFragment = ArrangeTabsFragment()
}
if (dialogFragment != null) {
dialogFragment.setTargetFragment(this, 0)
@ -132,6 +151,7 @@ class SettingsActivity : ThemedActivity(), SharedPreferences.OnSharedPreferenceC
}
class LanguageSettingFragment : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val list: MutableList<String> = mutableListOf()
// IDE doesn't find it, but compiling works apparently?
@ -175,3 +195,131 @@ class LanguageSettingFragment : DialogFragment() {
}.create()
}
}
class ArrangeTabsFragment: DialogFragment() {
@SuppressLint("ClickableViewAccessibility")
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val inflater: LayoutInflater = requireActivity().layoutInflater
val dialogView: View = inflater.inflate(R.layout.layout_tabs_arrange, null)
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
val tabsCheckedString = sharedPreferences.getString("tabsChecked", null)
val map = if (tabsCheckedString == null) {
// Load default menu
val list = loadDefaultMenuTabs(requireContext(), dialogView)
list.zip(List(list.size){true}.toTypedArray()).toMutableList()
} else {
// Get current menu visibility and order from settings
loadJsonMenuTabs(tabsCheckedString).toMutableList()
}
val listFeed: RecyclerView = dialogView.findViewById(R.id.tabs)
val listAdapter = ListViewAdapter(map)
listFeed.adapter = listAdapter
listFeed.layoutManager = LinearLayoutManager(requireActivity())
val callback = object: ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) {
override fun onMove(
recyclerView: RecyclerView,
source: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
listAdapter.onItemMove(source.bindingAdapterPosition, target.bindingAdapterPosition)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
// Do nothing, all items should remain in the list
}
}
val itemTouchHelper = ItemTouchHelper(callback)
itemTouchHelper.attachToRecyclerView(listFeed)
val dialog = MaterialAlertDialogBuilder(requireContext()).apply {
setIcon(R.drawable.outline_bottom_navigation)
setTitle(R.string.arrange_tabs_summary)
setView(dialogView)
setNegativeButton(android.R.string.cancel) { _, _ -> }
setPositiveButton(android.R.string.ok) { _, _ ->
// Save values into preferences
val tabsChecked = listAdapter.tabsChecked.toList()
val tabsJson = JSONArray()
val checkedJson = JSONArray()
tabsChecked.forEach { (k, v) ->
tabsJson.put(k)
checkedJson.put(v.toString())
}
val tabsCheckedJson = JSONObject().apply {
put("tabs", tabsJson)
put("checked", checkedJson)
}.toString()
sharedPreferences.edit().putString("tabsChecked", tabsCheckedJson).apply()
}
}.create()
return dialog
}
inner class ListViewAdapter(val tabsChecked: MutableList<Pair<String, Boolean>>):
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view = FrameLayout.inflate(context, R.layout.layout_tab, null)
// Make sure the layout occupies full width
view.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT
)
return object: RecyclerView.ViewHolder(view) {}
}
@SuppressLint("ClickableViewAccessibility")
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val textView: MaterialButton = holder.itemView.findViewById(R.id.textView)
val checkBox: MaterialCheckBox = holder.itemView.findViewById(R.id.checkBox)
val dragHandle: ImageView = holder.itemView.findViewById(R.id.dragHandle)
// Set content of each entry
textView.text = tabsChecked[position].first
checkBox.isChecked = tabsChecked[position].second
// Also interact with checkbox when button is clicked
textView.setOnClickListener {
val isCheckedNew = !tabsChecked[position].second
tabsChecked[position] = Pair(tabsChecked[position].first, isCheckedNew)
checkBox.isChecked = isCheckedNew
// Disable OK button when no tab is selected or when strictly more than 5 tabs are selected
val maxItemCount = BottomNavigationView(requireContext()).maxItemCount // = 5
(requireDialog() as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE)?.isEnabled =
with (tabsChecked.count { (_, v) -> v }) { this in 1..maxItemCount}
}
// Also highlight button when checkbox is clicked
checkBox.setOnTouchListener { _, motionEvent ->
textView.dispatchTouchEvent(motionEvent)
}
// Do not highlight the button when the drag handle is touched
dragHandle.setOnTouchListener { _, _ -> true }
}
override fun getItemCount(): Int {
return tabsChecked.size
}
fun onItemMove(from: Int, to: Int) {
val previous = tabsChecked.removeAt(from)
tabsChecked.add(to, previous)
notifyItemMoved(from, to)
notifyItemChanged(to) // necessary to avoid checkBox issues
}
}
}

View File

@ -11,11 +11,13 @@ import android.net.ConnectivityManager
import android.net.Uri
import android.os.Build
import android.util.DisplayMetrics
import android.view.View
import android.view.WindowManager
import android.webkit.MimeTypeMap
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.PopupMenu
import androidx.browser.customtabs.CustomTabsIntent
import androidx.fragment.app.Fragment
import androidx.lifecycle.DefaultLifecycleObserver
@ -28,6 +30,8 @@ import com.google.gson.JsonElement
import com.google.gson.JsonPrimitive
import com.google.gson.JsonSerializer
import okhttp3.HttpUrl
import org.json.JSONArray
import org.json.JSONObject
import org.pixeldroid.app.R
import java.time.Instant
import java.time.format.DateTimeFormatter
@ -192,4 +196,24 @@ fun <T> Fragment.bindingLifecycleAware(): ReadWriteProperty<Fragment, T> =
binding = value
this@bindingLifecycleAware.viewLifecycleOwner.lifecycle.addObserver(this)
}
}
}
fun JSONArray.toList(): List<String> {
return (0 until this.length()).map { this.get(it).toString() }
}
fun loadDefaultMenuTabs(context: Context, anchor: View): List<String> {
return with(PopupMenu(context, anchor)) {
val menu = this.menu
menuInflater.inflate(R.menu.bottom_navigation_main, menu)
(0 until menu.size()).map { menu.getItem(it).title.toString() }
}
}
fun loadJsonMenuTabs(jsonString: String): List<Pair<String, Boolean>> {
val tabsCheckedJson = JSONObject(jsonString)
val tabs = tabsCheckedJson.getJSONArray("tabs").toList()
val checked = tabsCheckedJson.getJSONArray("checked").toList().map { v -> v.toBoolean() }
return tabs.zip(checked)
}

View File

@ -0,0 +1,5 @@
<vector android:height="24dp"
android:viewportHeight="960" android:viewportWidth="960"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?attr/colorOnBackground" android:pathData="M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM200,600L760,600L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,600ZM200,680L200,760Q200,760 200,760Q200,760 200,760L760,760Q760,760 760,760Q760,760 760,760L760,680L200,680ZM200,680L200,680L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,680Z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp"
android:viewportHeight="960" android:viewportWidth="960"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?attr/colorOnBackground" android:pathData="M346,820L100,574Q90,564 85,552Q80,540 80,527Q80,514 85,502Q90,490 100,480L330,251L255,176Q242,163 241.5,145Q241,127 254,113Q267,99 286,99Q305,99 319,113L686,480Q696,490 700.5,502Q705,514 705,527Q705,540 700.5,552Q696,564 686,574L440,820Q430,830 418,835Q406,840 393,840Q380,840 368,835Q356,830 346,820ZM393,314L179,528Q179,528 179,528Q179,528 179,528L607,528Q607,528 607,528Q607,528 607,528L393,314ZM792,840Q756,840 731,814.5Q706,789 706,752Q706,725 719.5,701Q733,677 750,654L769,630Q778,619 792.5,618.5Q807,618 816,629L836,654Q852,677 866,701Q880,725 880,752Q880,789 854,814.5Q828,840 792,840Z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp"
android:viewportHeight="960" android:viewportWidth="960"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="?attr/colorOnBackground" android:pathData="M200,600Q183,600 171.5,588.5Q160,577 160,560Q160,543 171.5,531.5Q183,520 200,520L760,520Q777,520 788.5,531.5Q800,543 800,560Q800,577 788.5,588.5Q777,600 760,600L200,600ZM200,440Q183,440 171.5,428.5Q160,417 160,400Q160,383 171.5,371.5Q183,360 200,360L760,360Q777,360 788.5,371.5Q800,383 800,400Q800,417 788.5,428.5Q777,440 760,440L200,440Z"/>
</vector>

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cornerRadius="0dp"
android:gravity="start|center_vertical"
android:textColor="?attr/colorOnBackground"
android:textAllCaps="false"
android:textAppearance="?attr/textAppearanceBody1"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:paddingStart="75dp"
android:paddingEnd="75dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.5" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="40dp"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
app:layout_constraintVertical_bias="0.5"
tools:ignore="RtlSymmetry" />
<ImageView
android:id="@+id/dragHandle"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:src="@drawable/rounded_drag_handle"
android:paddingEnd="15dp"
android:paddingStart="15dp"
android:layout_marginEnd="15dp"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
app:layout_constraintVertical_bias="0.5"
tools:ignore="RtlSymmetry" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.widget.Space
android:id="@+id/titleDividerNoCustom"
android:layout_width="match_parent"
android:layout_height="@dimen/m3_alert_dialog_title_bottom_margin"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

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

@ -348,4 +348,7 @@ For more info about Pixelfed, you can check here: https://pixelfed.org"</string>
<string name="continue_post_creation">Continue</string>
<string name="extraneous_pictures_stories">Pictures after the first were removed but can be restored by switching back to creating a Post</string>
<string name="story_duration">Story Duration</string>
<string name="arrange_tabs_summary">Arrange tabs</string>
<string name="arrange_tabs_description">Change visibility and order of tabs</string>
<string name="content_header">Content</string>
</resources>

View File

@ -17,54 +17,64 @@
android:title="@string/accentColorTitle"
android:key="themeColor"
android:defaultValue="0"
android:summary="@string/accentColorSummary" />
android:summary="@string/accentColorSummary"
app:icon="@drawable/rounded_colors"/>
<ListPreference
app:key="language"
app:title="@string/language"
app:icon="@drawable/translate_black_24dp" />
</PreferenceCategory>
<ListPreference
app:key="language"
app:title="@string/language"
app:icon="@drawable/translate_black_24dp" />
<PreferenceCategory app:title="@string/content_header">
<ListPreference
android:key="arrange_tabs"
android:title="@string/arrange_tabs_summary"
android:summary="@string/arrange_tabs_description"
android:icon="@drawable/outline_bottom_navigation" />
<CheckBoxPreference app:key="always_show_nsfw" app:title="@string/always_show_nsfw"
app:icon="@drawable/eye_black_24dp" android:defaultValue="false"
android:summary="@string/summary_always_show_nsfw"/>
<CheckBoxPreference app:key="always_show_nsfw" app:title="@string/always_show_nsfw"
app:icon="@drawable/eye_black_24dp" android:defaultValue="false"
android:summary="@string/summary_always_show_nsfw"/>
<Preference android:title="@string/notifications_settings"
android:key="notification"
android:summary="@string/notifications_settings_summary"
app:icon="@drawable/ic_baseline_notifications_active_24">
<intent android:action="android.settings.APP_NOTIFICATION_SETTINGS">
<extra android:name="android.provider.extra.APP_PACKAGE"
android:value="@string/application_id" />
</intent>
</Preference>
<EditTextPreference android:title="@string/description_template"
android:key="prefill_description"
android:summary="@string/description_template_summary"
app:icon="@drawable/note" />
<EditTextPreference android:title="@string/description_template"
android:key="prefill_description"
android:summary="@string/description_template_summary"
app:icon="@drawable/note" />
<Preference android:title="@string/notifications_settings"
android:key="notification"
android:summary="@string/notifications_settings_summary"
app:icon="@drawable/ic_baseline_notifications_active_24">
<intent android:action="android.settings.APP_NOTIFICATION_SETTINGS">
<extra android:name="android.provider.extra.APP_PACKAGE"
android:value="@string/application_id" />
</intent>
</Preference>
</PreferenceCategory>
<Preference android:title="@string/about"
android:key="about"
android:summary="@string/about_pixeldroid"
app:icon="@drawable/info_black_24dp">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="@string/application_id"
android:targetClass="org.pixeldroid.common.AboutActivity">
<extra android:name="buildVersion" android:value="@string/versionName" />
<extra android:name="appImage" android:value="mascot" />
<extra android:name="appImageWidth" android:value="508" />
<extra android:name="appImageTopMargin" android:value="-130" />
<extra android:name="appImageBottomMargin" android:value="-130" />
<extra android:name="appImageLeftMargin" android:value="0" />
<extra android:name="appImageRightMargin" android:value="0" />
<extra android:name="appName" android:value="@string/app_name" />
<extra android:name="aboutAppDescription" android:value="@string/license_info" />
<extra android:name="website" android:value="@string/project_website" />
<extra android:name="translatePlatformUrl" android:value="https://weblate.pixeldroid.org" />
<extra android:name="contributeForgeUrl" android:value="https://gitlab.shinice.net/pixeldroid/PixelDroid" />
</intent>
</Preference>
<PreferenceCategory app:title="@string/about">
<Preference android:title="@string/about"
android:key="about"
android:summary="@string/about_pixeldroid"
app:icon="@drawable/info_black_24dp">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="@string/application_id"
android:targetClass="org.pixeldroid.common.AboutActivity">
<extra android:name="buildVersion" android:value="@string/versionName" />
<extra android:name="appImage" android:value="mascot" />
<extra android:name="appImageWidth" android:value="508" />
<extra android:name="appImageTopMargin" android:value="-130" />
<extra android:name="appImageBottomMargin" android:value="-130" />
<extra android:name="appImageLeftMargin" android:value="0" />
<extra android:name="appImageRightMargin" android:value="0" />
<extra android:name="appName" android:value="@string/app_name" />
<extra android:name="aboutAppDescription" android:value="@string/license_info" />
<extra android:name="website" android:value="@string/project_website" />
<extra android:name="translatePlatformUrl" android:value="https://weblate.pixeldroid.org" />
<extra android:name="contributeForgeUrl" android:value="https://gitlab.shinice.net/pixeldroid/PixelDroid" />
</intent>
</Preference>
</PreferenceCategory>
</PreferenceScreen>

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 файли
Оновити залежності