Remove paging

pull/2282/head
Alex Baker 1 year ago
parent 1d6d8e87d1
commit cfa46c7e24

@ -191,7 +191,6 @@ dependencies {
implementation(libs.androidx.room)
kapt(libs.androidx.room.compiler)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.paging)
implementation(libs.bundles.markwon)
debugImplementation(libs.bundles.flipper)

@ -31,7 +31,6 @@ import androidx.core.view.setMargins
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.paging.PagedList
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
@ -143,7 +142,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private val listViewModel: TaskListViewModel by viewModels()
private lateinit var taskAdapter: TaskAdapter
private var recyclerAdapter: TaskListRecyclerAdapter? = null
private var recyclerAdapter: DragAndDropRecyclerAdapter? = null
private lateinit var filter: Filter
private var searchJob: Job? = null
private lateinit var search: MenuItem
@ -317,23 +316,16 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
}
private fun submitList(tasks: List<TaskContainer>) {
if (tasks is PagedList<TaskContainer>) {
if (recyclerAdapter !is PagedListRecyclerAdapter) {
setAdapter(
PagedListRecyclerAdapter(
taskAdapter, recyclerView, viewHolderFactory, this, tasks, preferences))
return
}
} else if (recyclerAdapter !is DragAndDropRecyclerAdapter) {
if (recyclerAdapter !is DragAndDropRecyclerAdapter) {
setAdapter(
DragAndDropRecyclerAdapter(
taskAdapter, recyclerView, viewHolderFactory, this, tasks, preferences))
return
} else {
recyclerAdapter?.submitList(tasks)
}
recyclerAdapter?.submitList(tasks)
}
private fun setAdapter(adapter: TaskListRecyclerAdapter) {
private fun setAdapter(adapter: DragAndDropRecyclerAdapter) {
recyclerAdapter = adapter
recyclerView.adapter = adapter
taskAdapter.setDataSource(adapter)
@ -368,9 +360,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
sortMenu.isEnabled = false
sortMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
}
if (preferences.usePagedQueries()
|| !filter.supportsSubtasks()
|| taskAdapter.supportsAstridSorting()) {
if (!filter.supportsSubtasks() || taskAdapter.supportsAstridSorting()) {
menu.findItem(R.id.menu_collapse_subtasks).isVisible = false
menu.findItem(R.id.menu_expand_subtasks).isVisible = false
}

@ -1,6 +1,5 @@
package org.tasks.data
import androidx.paging.DataSource
import androidx.room.*
import androidx.sqlite.db.SimpleSQLiteQuery
import com.todoroo.andlib.sql.Criterion
@ -130,9 +129,6 @@ abstract class TaskDao(private val database: Database) {
@Query("SELECT EXISTS(SELECT 1 FROM tasks WHERE parent > 0 AND deleted = 0) AS hasSubtasks")
abstract suspend fun getSubtaskInfo(): SubtaskInfo
@RawQuery(observedEntities = [Place::class])
abstract fun getTaskFactory(query: SimpleSQLiteQuery): DataSource.Factory<Int, TaskContainer>
suspend fun touch(ids: List<Long>, now: Long = currentTimeMillis()) =
ids.eachChunk { internalTouch(it, now) }

@ -39,7 +39,7 @@ object TaskListQuery {
getRecursiveQuery(filter, preferences)
filter.supportsAstridSorting() && preferences.isAstridSort ->
getNonRecursiveQuery(filter, preferences)
filter.supportsSubtasks() && subtasks.usesSubtasks() && !preferences.usePagedQueries() ->
filter.supportsSubtasks() && subtasks.usesSubtasks() ->
getRecursiveQuery(filter, preferences)
else -> getNonRecursiveQuery(filter, preferences)
}

@ -530,10 +530,7 @@ class Preferences @JvmOverloads constructor(
val defaultThemeColor: Int
get() = getInt(R.string.p_theme_color, ColorProvider.BLUE_500)
override fun usePagedQueries(): Boolean = getBoolean(R.string.p_use_paged_queries, false)
fun showGroupHeaders(): Boolean =
!usePagedQueries() && !getBoolean(R.string.p_disable_sort_groups, false)
fun showGroupHeaders(): Boolean = !getBoolean(R.string.p_disable_sort_groups, false)
val markdown: Boolean
get() = getBoolean(R.string.p_markdown, false)

@ -18,6 +18,4 @@ interface QueryPreferences {
val completedTasksAtBottom: Boolean
val sortCompletedByCompletionDate: Boolean
fun usePagedQueries(): Boolean
}

@ -9,7 +9,6 @@ import androidx.preference.SwitchPreferenceCompat
import com.todoroo.astrid.dao.Database
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.PermissionUtil
import org.tasks.R
import org.tasks.caldav.VtodoCache
@ -37,7 +36,6 @@ class Advanced : InjectingPreferenceFragment() {
@Inject lateinit var calendarEventProvider: CalendarEventProvider
@Inject lateinit var permissionRequester: FragmentPermissionRequestor
@Inject lateinit var permissionChecker: PermissionChecker
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var vtodoCache: VtodoCache
private lateinit var calendarReminderPreference: SwitchPreferenceCompat
@ -45,12 +43,6 @@ class Advanced : InjectingPreferenceFragment() {
override fun getPreferenceXml() = R.xml.preferences_advanced
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.p_use_paged_queries)
.setOnPreferenceChangeListener { _: Preference?, _: Any? ->
localBroadcastManager.broadcastRefresh()
true
}
findPreference(R.string.EPr_manage_delete_completed_gcal)
.setOnPreferenceClickListener {
deleteCompletedEvents()

@ -1,7 +1,6 @@
package org.tasks.preferences.fragments
import android.os.Bundle
import androidx.preference.SwitchPreferenceCompat
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.injection.InjectingPreferenceFragment
@ -15,12 +14,5 @@ class TaskListPreferences : InjectingPreferenceFragment() {
override fun getPreferenceXml() = R.xml.preferences_task_list
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
val sortGroups = findPreference(R.string.p_disable_sort_groups) as SwitchPreferenceCompat
sortGroups.isChecked = sortGroups.isChecked || preferences.usePagedQueries()
findPreference(R.string.p_use_paged_queries).setOnPreferenceChangeListener { _, value ->
sortGroups.isChecked = value as Boolean
true
}
}
override suspend fun setupPreferences(savedInstanceState: Bundle?) {}
}

@ -1,44 +0,0 @@
package org.tasks.tasklist
import androidx.paging.AsyncPagedListDiffer
import androidx.paging.PagedList
import androidx.recyclerview.widget.AsyncDifferConfig
import androidx.recyclerview.widget.RecyclerView
import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.adapter.TaskAdapter
import org.tasks.data.TaskContainer
import org.tasks.preferences.Preferences
class PagedListRecyclerAdapter(
adapter: TaskAdapter,
private val recyclerView: RecyclerView,
viewHolderFactory: ViewHolderFactory,
taskList: TaskListFragment,
list: PagedList<TaskContainer>,
preferences: Preferences
) : TaskListRecyclerAdapter(adapter, viewHolderFactory, taskList, preferences) {
private val differ: AsyncPagedListDiffer<TaskContainer> =
AsyncPagedListDiffer(this, AsyncDifferConfig.Builder(ItemCallback()).build())
override fun getItem(position: Int) = differ.getItem(position)
override fun submitList(list: List<TaskContainer>) =
differ.submitList(list as PagedList<TaskContainer>)
override fun onMoved(fromPosition: Int, toPosition: Int) {
val recyclerViewState = recyclerView.layoutManager!!.onSaveInstanceState()
super.onMoved(fromPosition, toPosition)
recyclerView.layoutManager!!.onRestoreInstanceState(recyclerViewState)
}
override fun dragAndDropEnabled() = false
override fun getItemCount() = differ.itemCount
override fun getTaskCount() = itemCount
init {
differ.submitList(list as PagedList<TaskContainer>?)
}
}

@ -69,7 +69,6 @@ class TaskViewHolder internal constructor(
setOnClickListener { onCompleteBoxClick() }
}
private val chipGroup: ComposeView = binding.chipGroup
private val pagedQueries: Boolean = preferences.usePagedQueries()
private val alwaysDisplayFullDate: Boolean = preferences.alwaysDisplayFullDate
private val showGroupHeaders = preferences.showGroupHeaders()
@ -243,7 +242,7 @@ class TaskViewHolder internal constructor(
place = task.location?.place,
list = task.caldav,
tagsString = task.tagsString,
isSubtask = task.hasParent() && !pagedQueries,
isSubtask = task.hasParent(),
isGoogleTask = task.isGoogleTask,
sortByStartDate = sortByStartDate,
sortByList = sortByList,

@ -3,19 +3,12 @@ package org.tasks.ui
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.LivePagedListBuilder
import androidx.paging.PagedList
import androidx.sqlite.db.SimpleSQLiteQuery
import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.Filter
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.tasks.BuildConfig
import org.tasks.data.SubtaskInfo
import org.tasks.data.TaskContainer
import org.tasks.data.TaskDao
@ -27,14 +20,13 @@ import javax.inject.Inject
@HiltViewModel
class TaskListViewModel @Inject constructor(
private val preferences: Preferences,
private val taskDao: TaskDao) : ViewModel(), Observer<PagedList<TaskContainer>> {
private val taskDao: TaskDao) : ViewModel() {
private var _tasks = MutableLiveData<List<TaskContainer>>()
val tasks: LiveData<List<TaskContainer>>
get() = _tasks
private var filter: Filter? = null
private var manualSortFilter = false
private var internal: LiveData<PagedList<TaskContainer>>? = null
fun setFilter(filter: Filter) {
manualSortFilter = (filter.supportsManualSort() && preferences.isManualSort
@ -54,22 +46,15 @@ class TaskListViewModel @Inject constructor(
invalidate()
}
private fun removeObserver() = internal?.removeObserver(this)
fun invalidate() {
AndroidUtilities.assertMainThread()
removeObserver()
if (filter == null) {
return
}
try {
if (manualSortFilter || !preferences.usePagedQueries()) {
viewModelScope.launch {
val subtasks = taskDao.getSubtaskInfo()
performNonPagedQuery(subtasks)
}
} else {
performPagedListQuery()
viewModelScope.launch {
val subtasks = taskDao.getSubtaskInfo()
performNonPagedQuery(subtasks)
}
} catch (e: Exception) {
Timber.e(e)
@ -80,47 +65,6 @@ class TaskListViewModel @Inject constructor(
_tasks.value = taskDao.fetchTasks(subtasks) { getQuery(preferences, filter!!, it) }
}
private fun performPagedListQuery() {
val queries = getQuery(preferences, filter!!, SubtaskInfo())
if (BuildConfig.DEBUG && queries.size != 1) {
throw RuntimeException("Invalid queries")
}
val query = SimpleSQLiteQuery(queries[0])
Timber.d("paged query: %s", query.sql)
val factory = taskDao.getTaskFactory(query)
val builder = LivePagedListBuilder(factory, PAGED_LIST_CONFIG)
val current = _tasks.value
if (current is PagedList<*>) {
val lastKey = (current as PagedList<TaskContainer>).lastKey
if (lastKey is Int) {
builder.setInitialLoadKey(lastKey as Int?)
}
}
if (BuildConfig.DEBUG) {
builder.setFetchExecutor { command: Runnable ->
viewModelScope.launch(Dispatchers.IO) {
val start = DateUtilities.now()
command.run()
Timber.d("*** paged list execution took %sms", DateUtilities.now() - start)
}
}
}
internal = builder.build()
internal!!.observeForever(this)
}
override fun onCleared() {
removeObserver()
}
val value: List<TaskContainer>
get() = _tasks.value ?: emptyList()
override fun onChanged(taskContainers: PagedList<TaskContainer>) {
_tasks.value = taskContainers
}
companion object {
private val PAGED_LIST_CONFIG = PagedList.Config.Builder().setPageSize(20).build()
}
}

@ -294,11 +294,6 @@ public class WidgetPreferences implements QueryPreferences {
return preferences.getSortCompletedByCompletionDate();
}
@Override
public boolean usePagedQueries() {
return preferences.usePagedQueries();
}
@Override
public void setSortMode(int sortMode) {
setInt(R.string.p_widget_sort, sortMode);

@ -161,8 +161,6 @@
<string name="desaturate_colors_summary_off">ستكون الألوان مشبعة في المظهر الداكن</string>
<string name="desaturate_colors_summary_on">ستكون الألوان غير مشبعة في المظهر الداكن</string>
<string name="disable_sort_groups">تعطيل مجموعات الترتيب</string>
<string name="improve_performance_summary">سيتم تعطيل مجموعات الترتيب والمهام الفرعية القابلة للطي لتحسين أداء التطبيق</string>
<string name="improve_performance">تحسين الأداء</string>
<string name="default_list">القائمة الافتراضية</string>
<string name="google_tasks_add_to_top">اضف المهام الجديدة لاعلى القائمة</string>
<string name="add_account">أضف حساب</string>

@ -437,7 +437,6 @@
<string name="filter_today_only">Само днес</string>
<string name="more_settings">Повече настройки</string>
<string name="help_and_feedback">Помощ и обратна връзка</string>
<string name="improve_performance">Подобряване на производителността</string>
<string name="theme_system_default">Спрямо системата</string>
<string name="today_lowercase">днес</string>
<string name="yesterday_lowercase">вчера</string>
@ -606,7 +605,6 @@
<string name="auto_dismiss_datetime">Автоматично затваряне след избор на дата и час</string>
<string name="picker_mode_time">Режим на избор на час</string>
<string name="more_options">Допълнителни настройки</string>
<string name="improve_performance_summary">За по-добра производителност сортирането на групи се изключва, а задачите се свиват</string>
<string name="auto_dismiss_datetime_list_summary">Затваряне след избор от списъка със задачи</string>
<string name="shortcut_pick_time">Час по избор</string>
<string name="wearable_notifications">Известия на носими устройства</string>

@ -502,7 +502,6 @@
<string name="widget_do_nothing">Nic nedělat</string>
<string name="widget_footer">Zápatí</string>
<string name="widget_show_dividers">Zobrazit oddělovače</string>
<string name="improve_performance">Zlepšit výkon</string>
<string name="whats_new">Co je nového</string>
<string name="pick_this_location">Vybrat toto místo</string>
<string name="choose_a_location">Vybrat místo</string>
@ -525,7 +524,6 @@
<string name="invalid_username_or_password">Neplatné uživatelské jméno nebo heslo</string>
<string name="davx5_selection_description">Synchronizujte své úkoly pomocí aplikace DAVx⁵</string>
<string name="disable_sort_groups">Zakázat třídící skupiny</string>
<string name="improve_performance_summary">Zakáže třídicí skupiny a rozbalitelné podúkoly a tím zlepší výkon aplikace</string>
<string name="building_notifications">Vytvářejí se oznámení</string>
<string name="got_it">Rozumím!</string>
<string name="no_thanks">Ne, děkuji</string>

@ -175,9 +175,7 @@
<string name="choose_synchronization_service">Vælg tjeneste</string>
<string name="create_new_tag">Opret “%s”</string>
<string name="enter_tag_name">Indtast tag</string>
<string name="improve_performance_summary">Slå sorteringsgrupper og sammenklappelige underopgaver fra for at forbedre appens ydeevne</string>
<string name="disable_sort_groups">Slå sorteringsgrupper fra</string>
<string name="improve_performance">Forbedr ydeevne</string>
<string name="enter_title_hint">Indtast titel</string>
<string name="subtasks_multilevel_google_task">Flere niveauer af underopgaver understøttes ikke af Google Tasks</string>
<string name="collapse_subtasks">Skjul underopgaver</string>

@ -541,11 +541,9 @@
<string name="today_lowercase">heute</string>
<string name="astrid_sort_order_summary">Astrids manuelle Sortiermethode für „Meine Aufgaben“, „Heute“ und Schlagwörter aktivieren. Diese Sortiermethode wird in einer zukünftigen Version „Meine Sortierung“ ersetzen</string>
<string name="open_last_viewed_list">Zuletzt betrachtete Liste öffnen</string>
<string name="improve_performance_summary">Gruppensortierung und einklappbare Teilaufgaben deaktivieren, um die Anwendungsleistung zu verbessern</string>
<string name="lists">Listen</string>
<string name="on_launch">Beim Start</string>
<string name="disable_sort_groups">Sortierung nach Gruppen deaktivieren</string>
<string name="improve_performance">Performance verbessern</string>
<string name="CFC_list_name">In der Liste…</string>
<string name="astrid_sort_order">Manuelle Sortierung nach Astrid</string>
<string name="sort_modified_group">%s bearbeitet</string>

@ -557,8 +557,6 @@
<string name="today_lowercase">hoy</string>
<string name="sort_modified_group">Modificado %s</string>
<string name="sort_created_group">Creado %s</string>
<string name="improve_performance_summary">Deshabilitar grupos de clasificación y subtareas colapsables para mejorar el rendimiento de la aplicación</string>
<string name="improve_performance">Mejorar el rendimiento</string>
<string name="open_last_viewed_list">Última lista vista abierta</string>
<string name="on_launch">En lanzador</string>
<string name="lists">Listas</string>

@ -544,10 +544,8 @@
<string name="lists">Zerrendak</string>
<string name="open_last_viewed_list">Ireki ikusitako azkenen zerrenda</string>
<string name="on_launch">Abioan</string>
<string name="improve_performance">Hobetu errendimendua</string>
<string name="astrid_sort_order">Eskuzko Astrid ordenatzea</string>
<string name="disable_sort_groups">Desgaitu taldeak ordenatzea</string>
<string name="improve_performance_summary">Desgaitu taldeak ordenatzea eta azpi-zeregin tolesgarriak aplikazioaren errendimendua hobetzeko</string>
<string name="astrid_sort_order_summary">Gaitu Astrid-eko eskuzko ordenatze modua \'Nire zereginak\', \'Gaur\', eta etiketentzako. Ordenatze modu honek \'Nire ordena\'-rekin ordezkatuko da etorkizuneko bertsio batean</string>
<string name="reset_sort_order">Berrezarri ordenatze irizpidea</string>
<string name="date_shortcut_tomorrow_night">Bihar gauez</string>

@ -544,7 +544,6 @@
<string name="email">Sähköposti</string>
<string name="date_shortcut_tomorrow_night">Huomenna illalla</string>
<string name="backups_ignore_warnings_summary">Jätä varmuuskopiointivaroitukset huomiotta, jos et tarvitse varmuuskopioita tai sinulla on oma varmuuskopiointiratkaisu</string>
<string name="improve_performance_summary">Poista lajitteluryhmät ja kokoontaitettavat osatehtävät käytöstä sovelluksen suorituskyvyn parantamiseksi</string>
<plurals name="list_count">
<item quantity="one">%d list</item>
<item quantity="other">%d lista</item>
@ -669,7 +668,6 @@
<string name="social">Sosiaalinen</string>
<string name="permission_read_tasks">Täysi pääsy Tehtävät-tietokantaan</string>
<string name="reset_sort_order">Palauta järjestys</string>
<string name="improve_performance">Paranna suorituskykyä</string>
<string name="background_location_permission_required">Tasks kerää sijaintitietoja, jotta se voi lähettää sijaintiin perustuvia muistutuksia, vaikka sovellus olisi suljettu tai sitä ei käytettäisi.</string>
<string name="next_friday">Seuraava pe</string>
<string name="next_tuesday">Seuraava ti</string>

@ -552,8 +552,6 @@
<string name="today_lowercase">aujourd\'hui</string>
<string name="sort_modified_group">Modifié %s</string>
<string name="sort_created_group">Créé %s</string>
<string name="improve_performance_summary">Désactiver les groupes de tri et les sous-tâches repliables pour améliorer les performances de l\'application</string>
<string name="improve_performance">Améliorer les performances</string>
<string name="open_last_viewed_list">Ouvrir la dernière liste consultée</string>
<string name="on_launch">Au lancement</string>
<string name="lists">Listes</string>

@ -368,7 +368,6 @@
<string name="or_choose_a_location">Ou escolle unha posición</string>
<string name="missing_permissions">Sen permisos</string>
<string name="subtasks_multilevel_google_task">Gootle Tasks non acepta as subtarefas a múltiples niveis</string>
<string name="improve_performance_summary">Desactivar a ordenación dos grupos e as subtarefas encollibles para mellorar o rendemento do aplicativo</string>
<string name="caldav_selection_description">Sincronización basada en estándares abertos de internet</string>
<string name="tasks_org_description">Sincroniza as tarefas con Tasks.org</string>
<string name="google_tasks_selection_description">Servizo básico que sincroniza coa túa conta de Google</string>
@ -542,7 +541,6 @@
<string name="google_tasks_add_to_top">Novas tarefas na cima</string>
<string name="expand_subtasks">Desencoller as subtarefas</string>
<string name="collapse_subtasks">Encoller as subtarefas</string>
<string name="improve_performance">Mellorar o rendemento</string>
<string name="choose_synchronization_service">Escolle unha plataforma</string>
<string name="etesync_selection_description">Sincronización con cifrado par a par</string>
<string name="decsync_selection_description">Sincronización baseada en ficheiros</string>

@ -277,8 +277,6 @@
<string name="tasks_org_description">Sinkroniziraj tvoje zadatke s Tasks.org</string>
<string name="enter_tag_name">Upiši ime oznake</string>
<string name="disable_sort_groups">Onemogući razvrstavanje po grupama</string>
<string name="improve_performance_summary">Onemogući razvrstavanje po grupama i sklapajuće podzadatke za poboljšavanje performance programa</string>
<string name="improve_performance">Poboljšaj performancu</string>
<string name="enter_title_hint">Upiši naslov</string>
<string name="subtasks_multilevel_google_task">Google Tasks ne podržava višerazinske podzadatke</string>
<string name="collapse_subtasks">Sklopi podzadatke</string>

@ -539,11 +539,9 @@
<string name="yesterday_lowercase">tegnap</string>
<string name="tomorrow_lowercase">holnap</string>
<string name="today_lowercase">ma</string>
<string name="improve_performance">Teljesítmény növelése</string>
<string name="lists">Listák</string>
<string name="open_last_viewed_list">Utoljára használt lista megnyitása</string>
<string name="on_launch">Indításkor</string>
<string name="improve_performance_summary">Sorbarendezési csoportok és összecsukható alfeladatok letiltása az app teljesítményének növelése érdekében</string>
<string name="astrid_sort_order_summary">Astrid egyéni sorbarendezés engedélyezése a \"Saját Feladatok\" és a \"Ma\" listákra illetve a címkékre. Ezt a sorbarendezési módot egy jövőbeni frissítésben fel fogja váltani a \"Saját sorrend\"</string>
<string name="astrid_sort_order">Astrid egyéni sorbarendezés</string>
<string name="disable_sort_groups">Sorbarendezési csoportok letiltása</string>

@ -392,8 +392,6 @@
<string name="invalid_username_or_password">Nama pengguna dan kata sandi salah</string>
<string name="davx5_selection_description">Sinkronkan tugas Anda dengan aplikasi DAVx⁵</string>
<string name="disable_sort_groups">Nonaktifkan grup sortir</string>
<string name="improve_performance_summary">Nonaktifkan grup sortir dan subtugas yang bisa diciutkan untuk meningkatkan kinerja aplikasi</string>
<string name="improve_performance">Tingkatkan kinerja</string>
<string name="whats_new">Apa yang Baru</string>
<string name="missing_permissions">Perizinan hilang</string>
<string name="building_notifications">Menghasilkan notifikasi</string>

@ -508,7 +508,6 @@
<string name="widget_show_menu">Mostra il menù</string>
<string name="action_new_task">Nuova attività</string>
<string name="add_tags">Aggiungi etichetta</string>
<string name="improve_performance_summary">Disabilita i gruppi di ordinamento e le attività secondarie per migliorare le prestazioni dell\'app</string>
<string name="filter_eisenhower_box_4">Non importanti e non urgenti</string>
<string name="filter_eisenhower_box_3">Non importanti e urgenti</string>
<string name="filter_eisenhower_box_2">Importanti e non urgenti</string>
@ -521,7 +520,6 @@
<string name="auto_dismiss_datetime_list_summary">Chiudi automaticamente quando aperto dall\'elenco attività</string>
<string name="auto_dismiss_datetime_list">Elenco attività</string>
<string name="disable_sort_groups">Disabilita i gruppi di ordinamento</string>
<string name="improve_performance">Migliora le prestazioni</string>
<string name="whats_new">Novità</string>
<string name="widget_due_date_hidden">Nascosto</string>
<string name="widget_due_date_below_title">Sotto il titolo</string>

@ -521,8 +521,6 @@
<string name="choose_synchronization_service">בחירת פלטפורמה</string>
<string name="enter_tag_name">נא למלא שם תגית</string>
<string name="disable_sort_groups">השבתת מיון קבוצות</string>
<string name="improve_performance_summary">השבתת מיון קבוצות ותת־משימות מצטמצמות כדי לשפר את ביצועי היישומון</string>
<string name="improve_performance">שיפור הביצועים</string>
<string name="subtasks_multilevel_google_task">תת־משימות מקוננות אינן נתמכות על ידי Google Tasks</string>
<string name="widget_due_date_reschedule">לתזמן משימה מחדש</string>
<string name="widget_open_list">לפתוח רשימה</string>

@ -597,7 +597,6 @@
<string name="now"></string>
<string name="choose_synchronization_service">プラットフォームを選択</string>
<string name="enter_title_hint">タイトルを入力</string>
<string name="improve_performance_summary">グループの並び替えと展開式のサブタスクを無効にしてアプリのパフォーマンスを向上させます</string>
<string name="upgrade_blurb_1">こんにちは!私は Alex です。Tasks のインディーディベロッパーです</string>
<string name="no_google_play_subscription">対象の Google Play の定期購入がありません</string>
<string name="price_per_year">$%s/年</string>
@ -691,7 +690,6 @@
<string name="more_settings">詳細設定</string>
<string name="disable_battery_optimizations">バッテリー最適化を無効にする</string>
<string name="disable_sort_groups">グループの並び替えを無効</string>
<string name="improve_performance">パフォーマンスを改善</string>
<string name="background_location">バックグラウンド時の位置情報</string>
<string name="above_average">平均以上</string>
<string name="widget_on_click">クリック時</string>

@ -556,8 +556,6 @@
<string name="open_last_viewed_list">마지막으로 보던 목록 열기</string>
<string name="davx5_selection_description">DAVx⁵ 앱과 내 할일 동기화</string>
<string name="disable_sort_groups">정렬그룹 비활성화</string>
<string name="improve_performance_summary">앱 성능을 개선하기 위해 정렬그룹과 하위할일 보기를 비활성화합니다</string>
<string name="improve_performance">성능 개선</string>
<string name="default_tags">기본 태그</string>
<string name="no_app_found">이 요청을 처리할 앱이 없습니다</string>
<string name="date_shortcut_tomorrow_night">내일 밤</string>

@ -699,8 +699,6 @@
<string name="create_new_tag">Sukurti „%s“</string>
<string name="enter_tag_name">Įvesti etiketės pavadinimą</string>
<string name="disable_sort_groups">Išjungti rūšiavimo grupes</string>
<string name="improve_performance_summary">Išjungti rūšiavimo grupes ir sutraukiamas antrines užduotis, kad būtų pagerintas programėlės našumas</string>
<string name="improve_performance">Pagerinti našumą</string>
<string name="subtasks_multilevel_google_task">„Google Tasks“ nepalaiko kelių lygių antrinių užduočių</string>
<string name="collapse_subtasks">Sutraukti antrines užduotis</string>
<string name="expand_subtasks">Išplėsti antrines užduotis</string>

@ -541,12 +541,10 @@
<string name="lists">Lister</string>
<string name="on_launch">Ved oppstart</string>
<string name="enjoying_tasks">Liker du Tasks\?</string>
<string name="improve_performance">Forbedret ytelse</string>
<string name="whats_new">Hva er nytt</string>
<string name="CFC_list_name">På listen…</string>
<string name="date_shortcut_tomorrow_evening">I morgen på kvelden</string>
<string name="disable_sort_groups">Skru av sorteringsgrupper</string>
<string name="improve_performance_summary">Skru av sorteringsgrupper og sammenfoldbare gjøremålssteg for å forbedre programmets ytelse</string>
<string name="action_new_task">Nytt gjøremål</string>
<string name="permission_read_tasks">Full tilgang til Tasks-database</string>
<string name="open_last_viewed_list">Åpne sist viste liste</string>

@ -541,8 +541,6 @@
<string name="yesterday_lowercase">gisteren</string>
<string name="tomorrow_lowercase">morgen</string>
<string name="today_lowercase">vandaag</string>
<string name="improve_performance_summary">Schakel sorteergroepen en inklapbare subtaken uit om de prestaties van de app te verbeteren</string>
<string name="improve_performance">Prestaties verbeteren</string>
<string name="astrid_sort_order_summary">Pas Astrid\'s handmatige sorteermodus toe op \'Mijn taken\', \'Vandaag\', en Labels. Deze modus wordt in een komende versie vervangen door \'Mijn volgorde\'</string>
<string name="astrid_sort_order">Astrid\'s handmatig sorteren</string>
<string name="on_launch">Bij het starten</string>

@ -558,8 +558,6 @@
<string name="open_last_viewed_list">Otwórz ostatnio przeglądaną listę</string>
<string name="on_launch">Przy uruchomieniu</string>
<string name="disable_sort_groups">Wyłącz grupy sortowania</string>
<string name="improve_performance_summary">Wyłącz grupy sortowania oraz możliwość zwijania podzadań, aby zwiększyć wydajność aplikacji</string>
<string name="improve_performance">Popraw wydajność</string>
<string name="date_shortcut_tomorrow_night">Jutro w nocy</string>
<string name="date_shortcut_tomorrow_evening">Jutro wieczorem</string>
<string name="CFC_list_name">Na liście…</string>

@ -461,8 +461,6 @@
<string name="create_new_tag">Criar \"%s\"</string>
<string name="enter_tag_name">Adicione nome da etiqueta</string>
<string name="disable_sort_groups">Desabilitar ordenação em grupos</string>
<string name="improve_performance_summary">Desabilita ordenação em grupos e expansibilidade de sub-tarefas para melhorar a performance do aplicativo</string>
<string name="improve_performance">Melhore a performance</string>
<string name="enter_title_hint">Adicione um título</string>
<string name="subtasks_multilevel_google_task">Sub-tarefas em múltiplos níveis não suportado pelo Google Tasks</string>
<string name="collapse_subtasks">Recolher sub-tarefas</string>

@ -433,8 +433,6 @@
<string name="astrid_sort_order_summary">Ativar ordenação manual do Astrid para \'Minhas tarefas\', \'Hoje\' e etiquetas. Este modo de ordenação eventualmente será substituído por \'Minha ordenação\' numa futura atualização</string>
<string name="astrid_sort_order">Ordenação manual do Astrid</string>
<string name="on_launch">Ao abrir a aplicação</string>
<string name="improve_performance_summary">Desativa a ordenação de grupos e subtarefas colapsáveis para melhorar o desempenho da aplicação</string>
<string name="improve_performance">Aumentar o desempenho</string>
<string name="sort_modified_group">Alterado %s</string>
<string name="sort_created_group">Criado %s</string>
<string name="action_new_task">Nova tarefa</string>

@ -622,8 +622,6 @@
<string name="create_new_tag">Creați \"%s\"</string>
<string name="enter_tag_name">Introduceți numele etichetei</string>
<string name="disable_sort_groups">Dezactivați grupurile de sortare</string>
<string name="improve_performance_summary">Dezactivați grupurile de sortare și subactivitățile pliabile pentru a îmbunătăți performanța aplicației</string>
<string name="improve_performance">Îmbunătățirea performanței</string>
<string name="enter_title_hint">Introduceți titlul</string>
<string name="subtasks_multilevel_google_task">Subactivitățile pe mai multe niveluri nu sunt acceptate de Google Tasks</string>
<string name="collapse_subtasks">Colapsarea subactivităților</string>

@ -563,8 +563,6 @@
<string name="open_last_viewed_list">Открыть последний просмотренный список</string>
<string name="on_launch">При запуске</string>
<string name="disable_sort_groups">Отключить группы сортировки</string>
<string name="improve_performance_summary">Отключить группы сортировки и сворачиваемые подзадачи для улучшения производительности</string>
<string name="improve_performance">Улучшить производительность</string>
<string name="date_shortcut_tomorrow_night">Завтра ночью</string>
<string name="date_shortcut_tomorrow_evening">Завтра вечером</string>
<string name="CFC_list_name">В списке…</string>

@ -528,8 +528,6 @@
<string name="create_new_tag">\"%s\" සාදන්න</string>
<string name="enter_tag_name">ටැගයේ නම ඇතුළත් කරන්න</string>
<string name="disable_sort_groups">වර්ග කිරීමේ කණ්ඩායම් අක්‍රීය කරන්න</string>
<string name="improve_performance_summary">යෙදුම් ක්‍රියාකාරිත්වය වැඩි දියුණු කිරීම සඳහා වර්ග කිරීමේ කණ්ඩායම් සහ හැකිලිය හැකි උප කාර්යයන් අක්‍රීය කරන්න</string>
<string name="improve_performance">කාර්ය සාධනය වැඩි දියුණු කරන්න</string>
<string name="enter_title_hint">මාතෘකාව ඇතුළත් කරන්න</string>
<string name="subtasks_multilevel_google_task">Google Tasks විසින් බහු මට්ටමේ උප කාර්යයන් සඳහා සහාය නොදක්වයි</string>
<string name="collapse_subtasks">උප කාර්යයන් හකුළුවන්න</string>

@ -613,7 +613,6 @@
<string name="tasks_org_description">Synkronisera dina uppgifter med Tasks.org</string>
<string name="choose_synchronization_service">Välj en plattform</string>
<string name="enter_tag_name">Ange taggnamn</string>
<string name="improve_performance">Förbättra prestanda</string>
<string name="subtasks_multilevel_google_task">Deluppgifter på flera nivåer stöds inte av Google Tasks</string>
<string name="collapse_subtasks">Fäll in deluppgifter</string>
<string name="expand_subtasks">Fäll ut deluppgifter</string>
@ -641,7 +640,6 @@
<string name="copied_to_clipboard">%s kopierat till urklipp</string>
<string name="app_password_save">Använd dessa uppgifter för att konfigurera en tredjepartsapp. De ger fullständig åtkomst till ditt Tasks.org-konto, skriv inte ner dem eller dela dem med någon!</string>
<string name="disable_sort_groups">Inaktivera sorteringsgrupper</string>
<string name="improve_performance_summary">Inaktivera sorteringsgrupper och hopfällbara deluppgifter för att förbättra appens prestanda</string>
<string name="background_location_permission_required">Tasks samlar in platsdata för att möjliggöra platsbaserade påminnelser, även när appen är stängd eller inte används.</string>
<string name="repeat_monthly_fifth_week">femte</string>
<string name="widget_show_dividers">Visa avdelare</string>

@ -222,8 +222,6 @@
<string name="create_new_tag">\"%s\" ஐ உருவாக்கவும்</string>
<string name="enter_tag_name">குறிச்சொல் பெயரை உள்ளிடவும்</string>
<string name="disable_sort_groups">வரிசை குழுக்களை முடக்கு</string>
<string name="improve_performance_summary">பயன்பாட்டு செயல்திறனை மேம்படுத்த வரிசை குழுக்கள் மற்றும் மடக்கக்கூடிய துணை பணிகளை முடக்கு</string>
<string name="improve_performance">செயல்திறனை மேம்படுத்தவும்</string>
<string name="enter_title_hint">தலைப்பை உள்ளிடவும்</string>
<string name="subtasks_multilevel_google_task">கூகிள் பணிகளால் பல நிலை துணை பணிகள் ஆதரிக்கப்படவில்லை</string>
<string name="collapse_subtasks">துணை பணிகளைச் சுருக்கவும்</string>

@ -182,8 +182,6 @@
<string name="create_new_tag">สร้าง \"%s\"</string>
<string name="enter_tag_name">ป้อนชื่อแท็ก</string>
<string name="disable_sort_groups">ปิดใช้งานกลุ่มการเรียงลําดับ</string>
<string name="improve_performance_summary">ปิดใช้งานกลุ่มเรียงลําดับและงานย่อยแบบยุบได้เพื่อปรับปรุงประสิทธิภาพของแอป</string>
<string name="improve_performance">ปรับปรุงประสิทธิภาพ</string>
<string name="enter_title_hint">ใส่ชื่อเรื่อง</string>
<string name="subtasks_multilevel_google_task">งานย่อยหลายระดับไม่ได้รับการสนับสนุนโดย Google Tasks</string>
<string name="collapse_subtasks">ยุบงานย่อย</string>

@ -541,8 +541,6 @@
<string name="yesterday_lowercase">dün</string>
<string name="tomorrow_lowercase">yarın</string>
<string name="today_lowercase">bugün</string>
<string name="improve_performance_summary">Sıra kümelerini ve açılır kapanır alt görevleri devre dışı bırakarak uygulama performansını iyileştir</string>
<string name="improve_performance">Performansı iyileştir</string>
<string name="lists">Listeler</string>
<string name="open_last_viewed_list">Son görülen listeyi aç</string>
<string name="on_launch">Başlangıçta</string>

@ -599,8 +599,6 @@
<string name="davx5_selection_description">Синхронізувати ваші завдання з застосунком DAVx⁵</string>
<string name="decsync_selection_description">Синхронізація на основі файлів</string>
<string name="disable_sort_groups">Вимкнути групи сортування</string>
<string name="improve_performance_summary">Вимкнути групи сортування та згортання підзавдань для пришвидшення роботи застосунку</string>
<string name="improve_performance">Пришвидшити роботу</string>
<string name="whats_new">Що нового</string>
<string name="background_location_permission_required">Tasks збирає дані геолокації, щоб активувати нагадування на основі розташування навіть коли застосунок закритий або не використовується.</string>
<string name="action_new_task">Нове завдання</string>

@ -490,7 +490,6 @@
<string name="about">متعلق</string>
<string name="button_unsubscribe">سبسکرپسن کینسل کریں</string>
<string name="manage_drawer">ڈریئر مینیج کریں</string>
<string name="improve_performance">کارکردگی کوبہتر بنائیں</string>
<string name="enter_title_hint">عنوان لکھیں</string>
<string name="subtasks_multilevel_google_task">کثیر الدرجی ذیلی ٹاسکس کو گوگل ٹاسکس سپورٹ نہیں کرتا</string>
<string name="collapse_subtasks">ذیلی ٹاسکس کو بند کریں</string>
@ -515,6 +514,5 @@
<string name="create_new_tag">\"%s\" بنائیں</string>
<string name="enter_tag_name">ٹیگ کا نام درج کریں</string>
<string name="disable_sort_groups">گروپس کی ترتیب ختم کریں</string>
<string name="improve_performance_summary">گروپس کی ترتیب اور سب ٹاسکس کو ختم کر کے ایپ کی کارکردگی کو بہتر بنائیں</string>
<string name="missing_permissions">حذف شدہ اجازتیں</string>
</resources>

@ -243,8 +243,6 @@
<string name="create_new_tag">Tạo \"%s\"</string>
<string name="enter_tag_name">Nhập tên thẻ</string>
<string name="disable_sort_groups">Tắt các nhóm sắp xếp</string>
<string name="improve_performance_summary">Tắt các nhóm sắp xếp và công việc con có thể thu gọn để cải thiện hiệu năng ứng dụng</string>
<string name="improve_performance">Cải thiện hiệu năng</string>
<string name="enter_title_hint">Nhập tiêu đề</string>
<string name="subtasks_multilevel_google_task">Các công việc con có nhiều cấp không được Google Tasks hỗ trợ</string>
<string name="collapse_subtasks">Thu gọn các công việc con</string>

@ -531,8 +531,6 @@
<string name="yesterday_lowercase">昨天</string>
<string name="tomorrow_lowercase">明天</string>
<string name="today_lowercase">今日</string>
<string name="improve_performance_summary">禁用排序组和可折叠子任务以改善应用程序性能</string>
<string name="improve_performance">改善性能</string>
<string name="lists">列表</string>
<string name="open_last_viewed_list">打开上次查看的列表</string>
<string name="on_launch">启动时</string>

@ -385,7 +385,6 @@
<string name="choose_synchronization_service">選擇一個平臺</string>
<string name="create_new_tag">建立 \"%s\"</string>
<string name="enter_tag_name">輸入標籤名稱</string>
<string name="improve_performance">提升效能</string>
<string name="enter_title_hint">輸入標題</string>
<string name="collapse_subtasks">收起次工作</string>
<string name="expand_subtasks">展開副工作</string>

@ -390,7 +390,6 @@
<string name="preference_screen">preference_screen</string>
<string name="p_add_to_top">google_tasks_add_to_top</string>
<string name="p_google_tasks_position_hack">google_tasks_position_hack</string>
<string name="p_use_paged_queries">disable_subtasks</string>
<string name="p_disable_sort_groups">disable_sort_groups</string>
<string name="p_wearable_notifications">wearable_notifications</string>
<string name="p_notified_oauth_error">notified_oauth_error_%1$s_%2$s</string>

@ -527,8 +527,6 @@ File %1$s contained %2$s.\n\n
<string name="collapse_subtasks">Collapse subtasks</string>
<string name="subtasks_multilevel_google_task">Multi-level subtasks not supported by Google Tasks</string>
<string name="enter_title_hint">Enter title</string>
<string name="improve_performance">Improve performance</string>
<string name="improve_performance_summary">Disable sort groups and collapsible subtasks to improve app performance</string>
<string name="disable_sort_groups">Disable sort groups</string>
<string name="enter_tag_name">Enter tag name</string>
<string name="create_new_tag">Create \"%s\"</string>

@ -2,12 +2,6 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/p_use_paged_queries"
android:summary="@string/improve_performance_summary"
android:title="@string/improve_performance" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/p_astrid_sort_enabled"

@ -69,15 +69,6 @@
<SwitchPreferenceCompat
android:defaultValue="false"
android:disableDependentsState="true"
android:key="@string/p_use_paged_queries"
android:summary="@string/improve_performance_summary"
android:title="@string/improve_performance"
app:allowDividerAbove="true" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:dependency="@string/p_use_paged_queries"
android:key="@string/p_disable_sort_groups"
android:title="@string/disable_sort_groups" />

@ -539,21 +539,6 @@
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 -> 1.8.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
++--- androidx.appcompat:appcompat:1.6.1 (*)
++--- androidx.paging:paging-runtime:3.1.1
+| +--- androidx.paging:paging-common:3.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 -> 1.8.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.paging:paging-common-ktx:3.1.1
+| | \--- androidx.paging:paging-common:3.1.1 (*)
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.2.0 -> 2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.2.0 -> 2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.6.1 (*)
+| +--- androidx.recyclerview:recyclerview:1.2.0 -> 1.3.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 -> 1.8.20 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 (*)
+| \--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
++--- io.noties.markwon:core:4.6.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| \--- com.atlassian.commonmark:commonmark:0.13.0

@ -696,21 +696,6 @@
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 -> 1.8.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
++--- androidx.appcompat:appcompat:1.6.1 (*)
++--- androidx.paging:paging-runtime:3.1.1
+| +--- androidx.paging:paging-common:3.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 -> 1.8.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.paging:paging-common-ktx:3.1.1
+| | \--- androidx.paging:paging-common:3.1.1 (*)
+| +--- androidx.lifecycle:lifecycle-livedata-ktx:2.2.0 -> 2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.2.0 -> 2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.6.1 (*)
+| +--- androidx.recyclerview:recyclerview:1.2.0 -> 1.3.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.31 -> 1.8.20 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.6.4 (*)
+| \--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
++--- io.noties.markwon:core:4.6.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| \--- com.atlassian.commonmark:commonmark:0.13.0

@ -44,7 +44,6 @@ okhttp = "4.10.0"
opentasks = "562fec5"
osmdroid = "6.1.16"
oss-licenses-plugin = "0.10.6"
paging = "3.1.1"
persistent-cookiejar = "1.0.1"
play-billing-ktx = "4.1.0"
play-core-ktx = "1.8.1"
@ -81,7 +80,6 @@ androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit" }
androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" }
androidx-paging = { module = "androidx.paging:paging-runtime", version.ref = "paging" }
androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" }
androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" }
androidx-room = { module = "androidx.room:room-ktx", version.ref = "room" }

Loading…
Cancel
Save