Compare commits
9 Commits
71f1281e2b
...
9fbba685be
Author | SHA1 | Date |
---|---|---|
Fred | 9fbba685be | |
Matthieu | 187c29a751 | |
Balaraz | f9a07a5dd0 | |
Alexandre NICOLADIE | fb9296187a | |
Fred | bbcaa46b36 | |
Fred | b4330d7ac3 | |
Fred | 073a6a4489 | |
Fred | 1cfb9aecb3 | |
Fred | a46c37766f |
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
Correctif pour les plantages dans l'activité d'édition qui ne se produisaient qu'en mode release
|
|
@ -0,0 +1 @@
|
|||
Ajout de la traduction en hongrois (Magyar) à l'application. Merci à Balázs :)
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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 ! ❤️
|
|
@ -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 :)
|
|
@ -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
|
|
@ -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 :)
|
|
@ -0,0 +1 @@
|
|||
Corrections de bugs et améliorations ;)
|
|
@ -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 :)
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
Correction d'un bug qui cassait la fonction d'édition d'images en mode release
|
|
@ -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"
|
|
@ -0,0 +1 @@
|
|||
Séparation des APKs par architecture CPU, rendant les APKs beaucoup plus petits (passage de 100Mo à 25Mo)
|
|
@ -0,0 +1,3 @@
|
|||
Nouvelle tentative de séparation des apks
|
||||
|
||||
Mise à jour des dépendances
|
|
@ -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
|
|
@ -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)
|
|
@ -0,0 +1,2 @@
|
|||
* Mises à jour des traductions
|
||||
* Autoriser l'envoi d'images distantes (ex. Nextcloud)
|
|
@ -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
|
|
@ -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
|
|
@ -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.
|
|
@ -0,0 +1 @@
|
|||
Client pour Pixelfed, la plateforme fédérée de partage d'images
|
|
@ -0,0 +1 @@
|
|||
PixelDroid
|
|
@ -0,0 +1,3 @@
|
|||
* Редагування відео! Вимкнення звуку, обрізка відео
|
||||
* Відкривайте зображення на весь екран, масштабуйте та переміщуйте їх :)
|
||||
* Оновлення перекладів
|
|
@ -0,0 +1 @@
|
|||
Виправлення збоїв під час редагування, які траплялися лише у режимі релізу
|
|
@ -0,0 +1 @@
|
|||
Додано переклад угорською (мадярською) мовою до додатку. Дякуємо Balazs :)
|
|
@ -0,0 +1,4 @@
|
|||
* Додано правила gson proguard для виправлення збоїв на екземплярах Mastodon
|
||||
* Додано кольорове оформлення з 4 різними темами
|
||||
* Перейшли до Material 3
|
||||
* Покращено узгодженість інтерфейсу користувача
|
|
@ -0,0 +1,8 @@
|
|||
* покращено роботу з коментарями: Тепер ви можете відкрити коментар, щоб побачити відповіді, поставити вподобайку, у коментарях відображається аватар його автора тощо.
|
||||
* Оновлення перекладів. Дякуємо перекладачам :). Допоможіть перекласти PixelDroid на вашу мову на weblate.pixeldroid.org
|
||||
* Безпека: перевірка залежностей гарантує, що залежності, включені в додаток, не були підроблені, PixelDroid тепер відмовлятиметься від будь-яких не-HTTPS з'єднань
|
||||
* PixelDroid тепер використовує власний агент користувача "PixelDroid" замість бібліотечного OkHttp.
|
||||
* Видалено всі жорстко закодовані рядки з програми, тепер все нормально перекладається.
|
||||
* Деякі покращення коду
|
||||
* Виправлено збереження зображень, що надходять до програми з бібліотеки або надаються у спільний доступ
|
||||
* Виправлено ще один збій при використанні екземплярів Mastodon
|
|
@ -0,0 +1 @@
|
|||
Виправлено помилку, яка порушувала роботу функції редагування зображень у режимі релізу
|
|
@ -0,0 +1,3 @@
|
|||
* Виправлено збій під час надання доступу до зображення з галереї тощо у додатку
|
||||
|
||||
* Виправлено проблему з дозволами, через яку зображення видавали помилку відмови в доступі
|
|
@ -0,0 +1 @@
|
|||
Розділення APK-файлів по архітектурах процесорів, що робить APK-файли значно меншими (від 100 МБ до 25 МБ)
|
|
@ -0,0 +1,3 @@
|
|||
Спробуйте ще раз розділити apk файли
|
||||
|
||||
Оновити залежності
|
Loading…
Reference in New Issue