Separate group and sort configurations

pull/2332/head
Alex Baker 2 years ago
parent 79e1a73c2a
commit 7945160536

@ -204,6 +204,7 @@ dependencies {
implementation(libs.persistent.cookiejar)
implementation(libs.gson)
implementation(libs.material)
implementation(libs.material3)
implementation(libs.androidx.constraintlayout)
implementation(libs.androidx.swiperefreshlayout)
implementation(libs.androidx.preference)
@ -242,6 +243,7 @@ dependencies {
implementation(libs.accompanist.flowlayout)
implementation(libs.accompanist.permissions)
implementation(libs.accompanist.systemuicontroller)
googleplayImplementation(platform(libs.firebase))
googleplayImplementation("com.google.firebase:firebase-crashlytics")

@ -659,7 +659,11 @@
android:theme="@style/Tasks" />
<activity android:name="org.tasks.sync.microsoft.MicrosoftListSettingsActivity" />
<!-- launcher icons -->
<activity
android:name="org.tasks.dialogs.SortSettingsActivity"
android:theme="@style/TranslucentWindow" />
<!-- launcher icons -->
<activity-alias
android:enabled="true"

@ -3,7 +3,7 @@ package com.todoroo.andlib.sql
import com.todoroo.andlib.sql.OrderType.ASC
import com.todoroo.andlib.sql.OrderType.DESC
class Order private constructor(private val expression: Any, private val orderType: OrderType = ASC) {
class Order private constructor(private val expression: Any, val orderType: OrderType = ASC) {
private val secondaryExpressions = ArrayList<Order>()
fun addSecondaryExpression(secondary: Order): Order {

@ -22,9 +22,13 @@ import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskCreator
import com.todoroo.astrid.timers.TimerControlSet.TimerControlSetCallback
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.R
@ -36,7 +40,7 @@ import org.tasks.data.LocationDao
import org.tasks.data.Place
import org.tasks.data.TagDataDao
import org.tasks.databinding.TaskListActivityBinding
import org.tasks.dialogs.SortDialog.SortDialogCallback
import org.tasks.dialogs.SortSettingsActivity
import org.tasks.dialogs.WhatsNewDialog
import org.tasks.filters.PlaceFilter
import org.tasks.injection.InjectingAppCompatActivity
@ -48,14 +52,18 @@ import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
import org.tasks.themes.Theme
import org.tasks.themes.ThemeColor
import org.tasks.ui.*
import org.tasks.ui.EmptyTaskEditFragment.Companion.newEmptyTaskEditFragment
import org.tasks.ui.MainActivityEvent
import org.tasks.ui.MainActivityEventBus
import org.tasks.ui.NavigationDrawerFragment
import org.tasks.ui.NavigationDrawerFragment.Companion.newNavigationDrawer
import org.tasks.ui.TaskListEvent
import org.tasks.ui.TaskListEventBus
import timber.log.Timber
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandler, TimerControlSetCallback, SortDialogCallback {
class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandler, TimerControlSetCallback {
@Inject lateinit var preferences: Preferences
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var theme: Theme
@ -122,6 +130,10 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
?.getParcelableExtra<Place>(LocationPickerActivity.EXTRA_PLACE)
?.let { startActivity(getTaskListIntent(this, PlaceFilter(it))) }
}
TaskListFragment.REQUEST_SORT ->
if (resultCode == RESULT_OK) {
sortChanged(data?.getBooleanExtra(SortSettingsActivity.EXTRA_FORCE_RELOAD, false) ?: false)
}
else ->
super.onActivityResult(requestCode, resultCode, data)
}
@ -437,7 +449,7 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
}
}
override fun sortChanged(reload: Boolean) {
private fun sortChanged(reload: Boolean) {
taskListFragment?.clearCollapsed()
localBroadcastManager.broadcastRefresh()
if (reload) {

@ -80,7 +80,7 @@ import org.tasks.dialogs.DateTimePicker.Companion.newDateTimePicker
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.dialogs.SortDialog
import org.tasks.dialogs.SortSettingsActivity
import org.tasks.extensions.Context.openUri
import org.tasks.extensions.Context.toast
import org.tasks.extensions.Fragment.safeStartActivityForResult
@ -416,8 +416,14 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
true
}
R.id.menu_sort -> {
SortDialog.newSortDialog(filter)
.show(childFragmentManager, FRAG_TAG_SORT_DIALOG)
requireActivity().startActivityForResult(
SortSettingsActivity.getIntent(
requireActivity(),
filter.supportsManualSort(),
filter.supportsAstridSorting() && preferences.isAstridSortEnabled,
),
REQUEST_SORT
)
true
}
R.id.menu_show_unstarted -> {
@ -979,10 +985,10 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private const val VOICE_RECOGNITION_REQUEST_CODE = 1234
private const val EXTRA_FILTER = "extra_filter"
private const val FRAG_TAG_REMOTE_LIST_PICKER = "frag_tag_remote_list_picker"
private const val FRAG_TAG_SORT_DIALOG = "frag_tag_sort_dialog"
private const val FRAG_TAG_DATE_TIME_PICKER = "frag_tag_date_time_picker"
private const val REQUEST_LIST_SETTINGS = 10101
private const val REQUEST_TAG_TASKS = 10106
const val REQUEST_SORT = 10107
private const val SEARCH_DEBOUNCE_TIMEOUT = 300L
fun newTaskListFragment(context: Context, filter: Filter?): TaskListFragment {
val fragment = TaskListFragment()

@ -15,6 +15,7 @@ import androidx.annotation.Nullable;
import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.OrderType;
import com.todoroo.astrid.data.Task;
import org.tasks.data.CaldavCalendar;
@ -29,6 +30,7 @@ import java.util.Locale;
*/
public class SortHelper {
public static final int GROUP_NONE = -1;
public static final int SORT_AUTO = 0;
public static final int SORT_ALPHA = 1;
public static final int SORT_DUE = 2;
@ -49,6 +51,21 @@ public class SortHelper {
"(CASE WHEN (dueDate / 1000) % 60 > 0 THEN dueDate ELSE (dueDate + 43140000) END)";
private static final String ADJUSTED_START_DATE =
"(CASE WHEN (hideUntil / 1000) % 60 > 0 THEN hideUntil ELSE (hideUntil + 86399000) END)";
private static final String GROUP_DUE_DATE = "((CASE WHEN (tasks.dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE "
+ "tasks.dueDate END)+tasks.importance * 1000)";
private static final String SORT_DUE_DATE = "((CASE WHEN (tasks.dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE "
+ ADJUSTED_DUE_DATE.replace("dueDate", "tasks.dueDate")
+ " END)+tasks.importance * 1000)";
private static final String GROUP_START_DATE = "((CASE WHEN (tasks.hideUntil=0) THEN (strftime('%s','now')*1000)*2 ELSE "
+ "tasks.hideUntil END)+tasks.importance * 1000)";
private static final String SORT_START_DATE = "((CASE WHEN (tasks.hideUntil=0) THEN (strftime('%s','now')*1000)*2 ELSE "
+ ADJUSTED_START_DATE.replace("hideUntil", "tasks.hideUntil")
+ " END)+tasks.importance * 1000)";
private static final Order ORDER_TITLE = Order.asc(Functions.upper(Task.TITLE));
private static final Order ORDER_LIST =
Order.asc(Functions.upper(CaldavCalendar.ORDER))
@ -64,7 +81,7 @@ public class SortHelper {
if (!originalSql.toUpperCase().contains("ORDER BY")) {
Order order = orderForSortType(sort);
if (preferences.isReverseSort()) {
if (order.getOrderType() == OrderType.ASC != preferences.getSortAscending()) {
order = order.reverse();
}
originalSql += " ORDER BY " + order;
@ -108,9 +125,7 @@ public class SortHelper {
+ " END)+importance");
break;
case SORT_IMPORTANCE:
order =
Order.asc(
"importance*(strftime('%s','now')*1000)+(CASE WHEN (dueDate=0) THEN (strftime('%s','now')*1000) ELSE dueDate END)");
order = Order.asc("importance");
break;
case SORT_MODIFIED:
order = Order.desc(Task.MODIFICATION_DATE);
@ -161,21 +176,19 @@ public class SortHelper {
}
}
public static String orderSelectForSortTypeRecursive(int sortType) {
private static String sortGroup(String column) {
return "datetime(" + column + " / 1000, 'unixepoch', 'localtime', 'start of day')";
}
public static String orderSelectForSortTypeRecursive(int sortType, boolean grouping) {
return switch (sortType) {
case SORT_ALPHA ->
// Return an empty string, providing a value to fill the WITH clause template
"UPPER(tasks.title)";
case SORT_DUE -> "(CASE WHEN (tasks.dueDate=0) THEN (strftime('%s','now')*1000)*2 ELSE "
+ ADJUSTED_DUE_DATE.replace("dueDate", "tasks.dueDate")
+ " END)+tasks.importance";
case SORT_START -> "(CASE WHEN (tasks.hideUntil=0) THEN (strftime('%s','now')*1000)*2 ELSE "
+ ADJUSTED_START_DATE.replace("hideUntil", "tasks.hideUntil")
+ " END)+tasks.importance";
case SORT_IMPORTANCE ->
"tasks.importance*(strftime('%s','now')*1000)+(CASE WHEN (tasks.dueDate=0) THEN (strftime('%s','now')*1000) ELSE tasks.dueDate END)";
case SORT_MODIFIED -> "tasks.modified";
case SORT_CREATED -> "tasks.created";
case GROUP_NONE -> "1";
case SORT_ALPHA -> "UPPER(tasks.title)";
case SORT_DUE -> grouping ? sortGroup(GROUP_DUE_DATE) : SORT_DUE_DATE;
case SORT_START -> grouping ? sortGroup(GROUP_START_DATE) : SORT_START_DATE;
case SORT_IMPORTANCE -> "tasks.importance";
case SORT_MODIFIED -> grouping ? sortGroup("tasks.modified") : "tasks.modified";
case SORT_CREATED -> grouping ? sortGroup("tasks.created") : "tasks.created";
case SORT_GTASKS -> "tasks.`order`";
case SORT_CALDAV -> CALDAV_ORDER_COLUMN;
case SORT_LIST -> "CASE WHEN cdl_order = -1 THEN cdl_name ELSE cdl_order END";
@ -192,18 +205,19 @@ public class SortHelper {
};
}
public static Order orderForSortTypeRecursive(int sortMode, boolean reverse) {
Order order = switch (sortMode) {
case SORT_MODIFIED, SORT_CREATED -> Order.desc("primary_sort").addSecondaryExpression(Order.desc("secondary_sort"));
default -> Order.asc("primary_sort").addSecondaryExpression(Order.asc("secondary_sort"));
};
public static Order orderForGroupTypeRecursive(int groupMode, boolean ascending) {
return ascending
? Order.asc("primary_group")
: Order.desc("primary_group");
}
public static Order orderForSortTypeRecursive(int sortMode, boolean ascending) {
Order order = ascending || sortMode == SORT_GTASKS || sortMode == SORT_CALDAV
? Order.asc("primary_sort").addSecondaryExpression(Order.asc("secondary_sort"))
: Order.desc("primary_sort").addSecondaryExpression(Order.desc("secondary_sort"));
if (sortMode != SORT_ALPHA) {
order.addSecondaryExpression(Order.asc("sort_title"));
}
if (reverse) {
order = order.reverse();
}
return order;
}
}

@ -0,0 +1,30 @@
package org.tasks.compose
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import com.google.accompanist.systemuicontroller.rememberSystemUiController
@Composable
fun SystemBars(
statusBarColor: Color,
navigationBarColor: Color,
) {
val systemUiController = rememberSystemUiController()
val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifecycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_START) {
systemUiController.setStatusBarColor(color = statusBarColor)
systemUiController.setNavigationBarColor(color = navigationBarColor)
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
}
}
}

@ -29,7 +29,8 @@ internal object TaskListQueryNonRecursive {
fun getNonRecursiveQuery(filter: Filter, preferences: QueryPreferences): MutableList<String> {
val joinedQuery = JOINS + filter.getSqlQuery()
val sortMode = preferences.sortMode
val sortGroup = field(SortHelper.getSortGroup(sortMode) ?: "NULL").`as`("sortGroup")
val groupMode = preferences.groupMode
val sortGroup = field(SortHelper.getSortGroup(groupMode) ?: "NULL").`as`("sortGroup")
val query = SortHelper.adjustQueryForFlagsAndSort(preferences, joinedQuery, sortMode)
val completeAtBottom = if (preferences.completedTasksAtBottom) "parentComplete ASC," else ""
val completionSort =

@ -48,17 +48,24 @@ internal object TaskListQueryRecursive {
else -> PermaSql.replacePlaceholdersForQuery(filter.getSqlQuery())
}
val manualSort = preferences.isManualSort
val groupPreference = preferences.groupMode
val groupMode = when {
(filter is GtasksFilter || filter is CaldavFilter) &&
(manualSort || groupPreference == SortHelper.SORT_LIST) -> SortHelper.GROUP_NONE
else -> groupPreference
}
val sortPreference = preferences.sortMode
val sortMode = when {
manualSort && filter is GtasksFilter -> SortHelper.SORT_GTASKS
manualSort && filter is CaldavFilter -> SortHelper.SORT_CALDAV
sortPreference == SortHelper.SORT_LIST && (filter is GtasksFilter || filter is CaldavFilter) ->
SortHelper.SORT_AUTO
else -> sortPreference
}
val reverseSort =
preferences.isReverseSort && sortMode != SortHelper.SORT_GTASKS && sortMode != SortHelper.SORT_CALDAV
val primarySortSelect = SortHelper.orderSelectForSortTypeRecursive(sortMode)
val groupAscending =
preferences.groupAscending && groupMode != SortHelper.GROUP_NONE
val sortAscending =
preferences.sortAscending && sortMode != SortHelper.SORT_GTASKS && sortMode != SortHelper.SORT_CALDAV
val primaryGroupSelector = SortHelper.orderSelectForSortTypeRecursive(groupMode, true)
val primarySortSelect = SortHelper.orderSelectForSortTypeRecursive(sortMode, false)
val secondarySortSelect = if (sortMode == SortHelper.SORT_LIST) {
"NULL"
} else {
@ -73,11 +80,11 @@ internal object TaskListQueryRecursive {
}
val withClause = """
CREATE TEMPORARY TABLE `recursive_tasks` AS
WITH RECURSIVE recursive_tasks (task, parent_complete, subtask_complete, completion_sort, parent, collapsed, hidden, indent, title, primary_sort, secondary_sort, sort_group) AS (
SELECT tasks._id, $parentCompleted as parent_complete, 0 as subtask_complete, $completionSort as completion_sort, 0 as parent, tasks.collapsed as collapsed, 0 as hidden, 0 AS sort_indent, UPPER(tasks.title) AS sort_title, $primarySortSelect as primary_sort, NULL as secondarySort, ${SortHelper.getSortGroup(sortMode)}
WITH RECURSIVE recursive_tasks (task, parent_complete, subtask_complete, completion_sort, parent, collapsed, hidden, indent, title, primary_group, primary_sort, secondary_sort, sort_group) AS (
SELECT tasks._id, $parentCompleted as parent_complete, 0 as subtask_complete, $completionSort as completion_sort, 0 as parent, tasks.collapsed as collapsed, 0 as hidden, 0 AS sort_indent, UPPER(tasks.title) AS sort_title, $primaryGroupSelector as primary_group, $primarySortSelect as primary_sort, NULL as secondarySort, ${SortHelper.getSortGroup(groupMode)}
FROM tasks
${
if (sortMode == SortHelper.SORT_LIST) {
if (groupMode == SortHelper.SORT_LIST) {
"""
INNER JOIN caldav_tasks on cd_task = tasks._id AND cd_deleted = 0
INNER JOIN caldav_lists on cd_calendar = cdl_uuid
@ -87,9 +94,9 @@ internal object TaskListQueryRecursive {
}
}
$parentQuery
UNION ALL SELECT tasks._id, recursive_tasks.parent_complete, $parentCompleted as subtask_complete, $completionSort as completion_sort, recursive_tasks.task as parent, tasks.collapsed as collapsed, CASE WHEN recursive_tasks.collapsed > 0 OR recursive_tasks.hidden > 0 THEN 1 ELSE 0 END as hidden, recursive_tasks.indent+1 AS sort_indent, UPPER(tasks.title) AS sort_title, recursive_tasks.primary_sort as primary_sort, $secondarySortSelect as secondary_sort, recursive_tasks.sort_group FROM tasks
UNION ALL SELECT tasks._id, recursive_tasks.parent_complete, $parentCompleted as subtask_complete, $completionSort as completion_sort, recursive_tasks.task as parent, tasks.collapsed as collapsed, CASE WHEN recursive_tasks.collapsed > 0 OR recursive_tasks.hidden > 0 THEN 1 ELSE 0 END as hidden, recursive_tasks.indent+1 AS sort_indent, UPPER(tasks.title) AS sort_title, recursive_tasks.primary_group as primary_group, recursive_tasks.primary_sort as primary_sort, $secondarySortSelect as secondary_sort, recursive_tasks.sort_group FROM tasks
$SUBTASK_QUERY
ORDER BY parent_complete ASC, sort_indent DESC, subtask_complete ASC, completion_sort DESC, ${SortHelper.orderForSortTypeRecursive(sortMode, reverseSort)}
ORDER BY parent_complete ASC, sort_indent DESC, subtask_complete ASC, completion_sort DESC, ${SortHelper.orderForGroupTypeRecursive(groupMode, groupAscending)}, ${SortHelper.orderForSortTypeRecursive(sortMode, sortAscending)}
) SELECT * FROM recursive_tasks
WHERE indent = (SELECT MAX(indent) FROM recursive_tasks as r WHERE r.task = recursive_tasks.task)
""".trimIndent()

@ -1,231 +0,0 @@
package org.tasks.dialogs;
import static android.app.Activity.RESULT_OK;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.SortHelper;
import org.tasks.R;
import org.tasks.preferences.Preferences;
import org.tasks.preferences.QueryPreferences;
import org.tasks.widget.WidgetPreferences;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import timber.log.Timber;
@AndroidEntryPoint
public class SortDialog extends DialogFragment {
private static final String EXTRA_MANUAL_ENABLED = "extra_manual_enabled";
private static final String EXTRA_ASTRID_ENABLED = "extra_astrid_enabled";
private static final String EXTRA_SELECTED_INDEX = "extra_selected_index";
private static final String EXTRA_WIDGET_ID = "extra_widget_id";
@Inject Preferences appPreferences;
@Inject DialogBuilder dialogBuilder;
private QueryPreferences preferences;
private boolean manualEnabled;
private boolean astridEnabled;
private int selectedIndex;
private AlertDialog alertDialog;
private SortDialogCallback callback;
public static SortDialog newSortDialog(Filter filter) {
SortDialog sortDialog = new SortDialog();
Bundle args = new Bundle();
args.putBoolean(EXTRA_MANUAL_ENABLED, filter.supportsManualSort());
args.putBoolean(EXTRA_ASTRID_ENABLED, filter.supportsAstridSorting());
sortDialog.setArguments(args);
return sortDialog;
}
public static SortDialog newSortDialog(Fragment target, int rc, Filter filter, int widgetId) {
SortDialog dialog = newSortDialog(filter);
dialog.setTargetFragment(target, rc);
dialog.getArguments().putInt(EXTRA_WIDGET_ID, widgetId);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
onCreate(savedInstanceState);
Bundle arguments = getArguments();
int widgetId = arguments.getInt(EXTRA_WIDGET_ID, -1);
preferences = widgetId < 0
? appPreferences
: new WidgetPreferences(getContext(), appPreferences, widgetId);
manualEnabled = arguments.getBoolean(EXTRA_MANUAL_ENABLED);
astridEnabled = arguments.getBoolean(EXTRA_ASTRID_ENABLED)
&& appPreferences.getBoolean(R.string.p_astrid_sort_enabled, false);
if (savedInstanceState != null) {
selectedIndex = savedInstanceState.getInt(EXTRA_SELECTED_INDEX);
} else {
selectedIndex = getIndex(preferences.getSortMode());
}
List<String> items = new ArrayList<>();
if (manualEnabled) {
items.add(getString(R.string.SSD_sort_my_order));
} else if (astridEnabled) {
items.add(getString(R.string.astrid_sort_order));
}
items.add(getString(R.string.SSD_sort_auto));
items.add(getString(R.string.SSD_sort_start));
items.add(getString(R.string.SSD_sort_due));
items.add(getString(R.string.SSD_sort_importance));
items.add(getString(R.string.SSD_sort_alpha));
items.add(getString(R.string.SSD_sort_modified));
items.add(getString(R.string.sort_created));
items.add(getString(R.string.sort_list));
if (manualEnabled) {
if (preferences.isManualSort()) {
selectedIndex = 0;
}
} else if (astridEnabled) {
if (preferences.isAstridSort()) {
selectedIndex = 0;
}
} else {
selectedIndex -= 1;
}
alertDialog =
dialogBuilder
.newDialog()
.setSingleChoiceItems(
items,
selectedIndex,
(dialog, which) -> {
selectedIndex = which;
enableReverse();
})
.setPositiveButton(R.string.TLA_menu_sort, (dialog, which) -> setSelection(false))
.setNeutralButton(R.string.reverse, (dialog, which) -> setSelection(true))
.setNegativeButton(R.string.cancel, null)
.show();
enableReverse();
return alertDialog;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (getTargetFragment() == null) {
callback = (SortDialogCallback) activity;
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_SELECTED_INDEX, selectedIndex);
}
private void enableReverse() {
if (manualEnabled) {
Button reverse = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
reverse.setEnabled(selectedIndex != 0);
}
}
private void setSelection(boolean reverse) {
preferences.setReverseSort(reverse);
boolean wasManual = preferences.isManualSort();
boolean wasAstrid = preferences.isAstridSort();
boolean isManual = manualEnabled && selectedIndex == 0;
boolean isAstrid = astridEnabled && selectedIndex == 0;
preferences.setManualSort(isManual);
preferences.setAstridSort(isAstrid);
if (!isManual && !isAstrid) {
preferences.setSortMode(getSortMode(manualEnabled || astridEnabled ? selectedIndex : selectedIndex + 1));
}
Fragment targetFragment = getTargetFragment();
if (targetFragment == null) {
callback.sortChanged(wasManual != isManual || wasAstrid != isAstrid);
} else {
targetFragment.onActivityResult(getTargetRequestCode(), RESULT_OK, null);
}
}
private int getIndex(int sortMode) {
switch (sortMode) {
case SortHelper.SORT_AUTO:
return 1;
case SortHelper.SORT_START:
return 2;
case SortHelper.SORT_DUE:
return 3;
case SortHelper.SORT_IMPORTANCE:
return 4;
case SortHelper.SORT_ALPHA:
return 5;
case SortHelper.SORT_MODIFIED:
return 6;
case SortHelper.SORT_CREATED:
return 7;
case SortHelper.SORT_LIST:
return 8;
}
Timber.e("Invalid sort mode: %s", sortMode);
return 1;
}
private int getSortMode(int index) {
switch (index) {
case 1:
return SortHelper.SORT_AUTO;
case 2:
return SortHelper.SORT_START;
case 3:
return SortHelper.SORT_DUE;
case 4:
return SortHelper.SORT_IMPORTANCE;
case 5:
return SortHelper.SORT_ALPHA;
case 6:
return SortHelper.SORT_MODIFIED;
case 7:
return SortHelper.SORT_CREATED;
case 8:
return SortHelper.SORT_LIST;
}
Timber.e("Invalid sort mode: %s", index);
return SortHelper.SORT_ALPHA;
}
public interface SortDialogCallback {
void sortChanged(boolean reload);
}
}

@ -0,0 +1,478 @@
package org.tasks.dialogs
import android.content.Context
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION
import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.foundation.clickable
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Chip
import androidx.compose.material.ChipDefaults
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.ArrowDownward
import androidx.compose.material.icons.outlined.ArrowUpward
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import com.google.android.material.composethemeadapter.MdcTheme
import com.todoroo.astrid.core.SortHelper
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.compose.SystemBars
import org.tasks.compose.collectAsStateLifecycleAware
@AndroidEntryPoint
class SortSettingsActivity : ComponentActivity() {
private val viewModel: SortSettingsViewModel by viewModels()
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent)
setContent {
MdcTheme {
val scrimColor = if (isSystemInDarkTheme())
Color(0x52454545)
else
MaterialTheme.colors.onSurface.copy(.5f)
// edge-to-edge potentially fixed in material3 v1.2.0
SystemBars(
statusBarColor = scrimColor,
navigationBarColor = MaterialTheme.colors.surface,
)
val state = viewModel.state.collectAsStateLifecycleAware().value
val mainSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val scope = rememberCoroutineScope()
var showGroupPicker by remember { mutableStateOf(false) }
var showSortPicker by remember { mutableStateOf(false) }
ModalBottomSheet(
onDismissRequest = {
val forceReload = viewModel.forceReload
setResult(
RESULT_OK,
Intent().putExtra(EXTRA_FORCE_RELOAD, forceReload)
)
finish()
overridePendingTransition(0, 0)
},
sheetState = mainSheetState,
containerColor = MaterialTheme.colors.surface,
scrimColor = scrimColor,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = {
BottomSheetContent(
groupMode = state.groupMode,
sortMode = state.sortMode,
sortAscending = state.sortAscending,
groupAscending = state.groupAscending,
manualSort = state.manualSort && manualEnabled,
astridSort = state.astridSort && astridEnabled,
setSortAscending = { viewModel.setSortAscending(it) },
setGroupAscending = { viewModel.setGroupAscending(it) },
clickGroupMode = { showGroupPicker = true },
clickSortMode = { showSortPicker = true },
)
}
)
if (showGroupPicker) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val closePicker: () -> Unit = {
scope.launch {
sheetState.hide()
showGroupPicker = false
}
}
ModalBottomSheet(
onDismissRequest = closePicker,
sheetState = sheetState,
containerColor = MaterialTheme.colors.surface,
scrimColor = Color.Transparent,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = {
GroupSheetContent(
selected = state.groupMode,
onSelected = {
viewModel.setGroupMode(it)
closePicker()
}
)
}
)
LaunchedEffect(Unit) {
sheetState.show()
}
}
if (showSortPicker) {
val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val closePicker: () -> Unit = {
scope.launch {
sheetState.hide()
showSortPicker = false
}
}
ModalBottomSheet(
onDismissRequest = closePicker,
sheetState = sheetState,
containerColor = MaterialTheme.colors.surface,
scrimColor = Color.Transparent,
shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp),
content = {
SortSheetContent(
manualSortEnabled = manualEnabled,
astridSortEnabled = astridEnabled,
setManualSort = {
viewModel.setManual(true)
closePicker()
},
setAstridSort = {
viewModel.setAstrid(true)
closePicker()
},
manualSortSelected = (manualEnabled && state.manualSort) || (astridEnabled && state.astridSort),
selected = state.sortMode,
onSelected = {
viewModel.setSortMode(it)
closePicker()
}
)
}
)
LaunchedEffect(Unit) {
sheetState.show()
}
}
LaunchedEffect(Unit) {
mainSheetState.show()
}
}
}
}
private val manualEnabled: Boolean by lazy {
intent.getBooleanExtra(EXTRA_MANUAL_ORDER, false)
}
private val astridEnabled: Boolean by lazy {
intent.getBooleanExtra(EXTRA_ASTRID_ORDER, false)
}
companion object {
const val EXTRA_MANUAL_ORDER = "extra_manual_order"
const val EXTRA_ASTRID_ORDER = "extra_astrid_order"
const val EXTRA_WIDGET_ID = "extra_widget_id"
const val EXTRA_FORCE_RELOAD = "extra_force_reload"
const val WIDGET_NONE = -1
fun getIntent(
context: Context,
manualOrderEnabled: Boolean,
astridOrderEnabled: Boolean,
widgetId: Int? = null,
) = Intent(context, SortSettingsActivity::class.java)
.addFlags(FLAG_ACTIVITY_NO_ANIMATION)
.putExtra(EXTRA_MANUAL_ORDER, manualOrderEnabled)
.putExtra(EXTRA_ASTRID_ORDER, astridOrderEnabled)
.apply {
widgetId?.let {
putExtra(EXTRA_WIDGET_ID, it)
}
}
}
}
@Composable
fun SortSheetContent(
manualSortSelected: Boolean,
manualSortEnabled: Boolean,
astridSortEnabled: Boolean,
selected: Int,
setManualSort: (Boolean) -> Unit,
setAstridSort: (Boolean) -> Unit,
onSelected: (Int) -> Unit,
) {
if (manualSortEnabled) {
SortOption(resId = R.string.SSD_sort_my_order, selected = manualSortSelected) {
setManualSort(true)
}
}
if (astridSortEnabled) {
SortOption(resId = R.string.astrid_sort_order, selected = manualSortSelected) {
setAstridSort(true)
}
}
SortOption(
resId = R.string.SSD_sort_auto,
selected = !manualSortSelected && selected == SortHelper.SORT_AUTO,
onClick = { onSelected(SortHelper.SORT_AUTO) }
)
SortOption(
resId = R.string.SSD_sort_start,
selected = !manualSortSelected && selected == SortHelper.SORT_START,
onClick = { onSelected(SortHelper.SORT_START) }
)
SortOption(
resId = R.string.SSD_sort_due,
selected = !manualSortSelected && selected == SortHelper.SORT_DUE,
onClick = { onSelected(SortHelper.SORT_DUE) }
)
SortOption(
resId = R.string.SSD_sort_importance,
selected = !manualSortSelected && selected == SortHelper.SORT_IMPORTANCE,
onClick = { onSelected(SortHelper.SORT_IMPORTANCE) }
)
SortOption(
resId = R.string.SSD_sort_alpha,
selected = !manualSortSelected && selected == SortHelper.SORT_ALPHA,
onClick = { onSelected(SortHelper.SORT_ALPHA) }
)
SortOption(
resId = R.string.SSD_sort_modified,
selected = !manualSortSelected && selected == SortHelper.SORT_MODIFIED,
onClick = { onSelected(SortHelper.SORT_MODIFIED) }
)
SortOption(
resId = R.string.sort_created,
selected = !manualSortSelected && selected == SortHelper.SORT_CREATED,
onClick = { onSelected(SortHelper.SORT_CREATED) }
)
}
@Composable
fun GroupSheetContent(
selected: Int,
onSelected: (Int) -> Unit,
) {
SortOption(
resId = R.string.none,
selected = selected == SortHelper.GROUP_NONE,
onClick = { onSelected(SortHelper.GROUP_NONE) }
)
SortOption(
resId = R.string.SSD_sort_due,
selected = selected == SortHelper.SORT_DUE,
onClick = { onSelected(SortHelper.SORT_DUE) }
)
SortOption(
resId = R.string.SSD_sort_start,
selected = selected == SortHelper.SORT_START,
onClick = { onSelected(SortHelper.SORT_START) }
)
SortOption(
resId = R.string.SSD_sort_importance,
selected = selected == SortHelper.SORT_IMPORTANCE,
onClick = { onSelected(SortHelper.SORT_IMPORTANCE) }
)
SortOption(
resId = R.string.SSD_sort_modified,
selected = selected == SortHelper.SORT_MODIFIED,
onClick = { onSelected(SortHelper.SORT_MODIFIED) }
)
SortOption(
resId = R.string.sort_created,
selected = selected == SortHelper.SORT_CREATED,
onClick = { onSelected(SortHelper.SORT_CREATED) }
)
SortOption(
resId = R.string.sort_list,
selected = selected == SortHelper.SORT_LIST,
onClick = { onSelected(SortHelper.SORT_LIST) }
)
}
@Composable
fun SortOption(
resId: Int,
selected: Boolean,
onClick: () -> Unit
) {
Text(
modifier = Modifier
.fillMaxWidth()
.clickable { onClick() }
.padding(horizontal = 16.dp, vertical = 8.dp),
text = stringResource(id = resId),
style = MaterialTheme.typography.h6.copy(
color = if (selected) MaterialTheme.colors.primary else MaterialTheme.colors.onSurface,
),
)
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun BottomSheetContent(
groupMode: Int,
sortMode: Int,
sortAscending: Boolean,
groupAscending: Boolean,
manualSort: Boolean,
astridSort: Boolean,
setSortAscending: (Boolean) -> Unit,
setGroupAscending: (Boolean) -> Unit,
clickGroupMode: () -> Unit,
clickSortMode: () -> Unit,
) {
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Column(
modifier = Modifier
.weight(1f)
.clickable { clickGroupMode() }
) {
Text(
text = stringResource(id = R.string.sort_grouping),
style = MaterialTheme.typography.h6,
)
Text(
text = stringResource(id = groupMode.modeString),
style = MaterialTheme.typography.body1,
)
}
if (groupMode != SortHelper.GROUP_NONE) {
Spacer(modifier = Modifier.width(16.dp))
val displayAscending = when (groupMode) {
SortHelper.SORT_IMPORTANCE -> !groupAscending
else -> groupAscending
}
Chip(
onClick = { setGroupAscending(!groupAscending) },
shape = RoundedCornerShape(4.dp),
border = ChipDefaults.outlinedBorder,
colors = ChipDefaults.outlinedChipColors(),
leadingIcon = {
Icon(
imageVector = if (displayAscending) Icons.Outlined.ArrowUpward else Icons.Outlined.ArrowDownward,
modifier = Modifier.size(16.dp),
contentDescription = null,
)
},
content = {
Text(
text = stringResource(id = if (displayAscending) R.string.sort_ascending else R.string.sort_descending),
style = MaterialTheme.typography.body1,
)
},
)
}
}
Row(
modifier = Modifier.padding(16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Column(
modifier = Modifier
.weight(1f)
.clickable { clickSortMode() }
) {
Text(
text = stringResource(id = R.string.sort_sorting),
style = MaterialTheme.typography.h6,
)
Text(
text = stringResource(
id = when {
manualSort -> R.string.SSD_sort_my_order
astridSort -> R.string.astrid_sort_order
else -> sortMode.modeString
}
),
style = MaterialTheme.typography.body1,
)
}
if (!(manualSort || astridSort)) {
Spacer(modifier = Modifier.width(16.dp))
val displayAscending = when (sortMode) {
SortHelper.SORT_AUTO,
SortHelper.SORT_IMPORTANCE -> !sortAscending
else -> sortAscending
}
Chip(
onClick = { setSortAscending(!sortAscending) },
shape = RoundedCornerShape(4.dp),
border = ChipDefaults.outlinedBorder,
colors = ChipDefaults.outlinedChipColors(),
leadingIcon = {
Icon(
imageVector = if (displayAscending) Icons.Outlined.ArrowUpward else Icons.Outlined.ArrowDownward,
modifier = Modifier.size(16.dp),
contentDescription = null,
)
},
content = {
Text(
text = stringResource(id = if (displayAscending) R.string.sort_ascending else R.string.sort_descending),
style = MaterialTheme.typography.body1,
)
},
)
}
}
}
private val Int.modeString: Int
get() = when (this) {
SortHelper.GROUP_NONE -> R.string.none
SortHelper.SORT_ALPHA -> R.string.SSD_sort_alpha
SortHelper.SORT_DUE -> R.string.SSD_sort_due
SortHelper.SORT_IMPORTANCE -> R.string.SSD_sort_importance
SortHelper.SORT_MODIFIED -> R.string.SSD_sort_modified
SortHelper.SORT_CREATED -> R.string.sort_created
SortHelper.SORT_START -> R.string.SSD_sort_start
SortHelper.SORT_LIST -> R.string.sort_list
else -> R.string.SSD_sort_auto
}
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES)
@Composable
fun PreviewSortBottomSheet() {
MdcTheme {
BottomSheetContent(
groupMode = SortHelper.GROUP_NONE,
sortMode = SortHelper.SORT_AUTO,
sortAscending = false,
groupAscending = false,
manualSort = false,
astridSort = false,
clickGroupMode = {},
clickSortMode = {},
setSortAscending = {},
setGroupAscending = {},
)
}
}

@ -0,0 +1,130 @@
package org.tasks.dialogs
import android.content.Context
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import com.todoroo.astrid.core.SortHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import org.tasks.dialogs.SortSettingsActivity.Companion.WIDGET_NONE
import org.tasks.preferences.Preferences
import org.tasks.widget.WidgetPreferences
import javax.inject.Inject
@HiltViewModel
class SortSettingsViewModel @Inject constructor(
@ApplicationContext context: Context,
savedStateHandle: SavedStateHandle,
private val appPreferences: Preferences,
): ViewModel() {
data class ViewState(
val manualSort: Boolean,
val astridSort: Boolean,
val groupMode: Int,
val groupAscending: Boolean,
val sortMode: Int,
val sortAscending: Boolean,
)
private val widgetId = savedStateHandle[SortSettingsActivity.EXTRA_WIDGET_ID] ?: WIDGET_NONE
private val preferences =
widgetId
.takeIf { it != WIDGET_NONE }
?.let { WidgetPreferences(context, appPreferences, it) }
?: appPreferences
private val initialState = ViewState(
manualSort = preferences.isManualSort,
astridSort = preferences.isAstridSort,
groupMode = preferences.groupMode,
groupAscending = preferences.groupAscending,
sortMode = preferences.sortMode,
sortAscending = preferences.sortAscending,
)
private val _viewState = MutableStateFlow(initialState)
val state = _viewState.asStateFlow()
fun setSortAscending(ascending: Boolean) {
preferences.sortAscending = ascending
_viewState.update { it.copy(sortAscending = ascending) }
}
fun setGroupAscending(ascending: Boolean) {
preferences.groupAscending = ascending
_viewState.update { it.copy(groupAscending = ascending) }
}
fun setGroupMode(groupMode: Int) {
if (groupMode != SortHelper.GROUP_NONE) {
preferences.isManualSort = false
preferences.isAstridSort = false
}
preferences.groupMode = groupMode
val ascending = when (groupMode) {
SortHelper.SORT_MODIFIED,
SortHelper.SORT_CREATED -> false
else -> true
}
preferences.groupAscending = ascending
_viewState.update {
it.copy(
manualSort = preferences.isManualSort,
astridSort = preferences.isAstridSort,
groupMode = groupMode,
groupAscending = ascending,
)
}
}
fun setSortMode(sortMode: Int) {
preferences.isManualSort = false
preferences.isAstridSort = false
preferences.sortMode = sortMode
val ascending = when (sortMode) {
SortHelper.SORT_MODIFIED,
SortHelper.SORT_CREATED -> false
else -> true
}
preferences.sortAscending = ascending
_viewState.update {
it.copy(
manualSort = false,
astridSort = false,
sortMode = sortMode,
sortAscending = ascending,
)
}
}
fun setManual(value: Boolean) {
preferences.isManualSort = value
if (value) {
preferences.groupMode = SortHelper.GROUP_NONE
}
_viewState.update {
it.copy(
groupMode = if (value) SortHelper.GROUP_NONE else it.groupMode,
manualSort = value,
)
}
}
fun setAstrid(value: Boolean) {
preferences.isAstridSort = value
if (value) {
preferences.groupMode = SortHelper.GROUP_NONE
}
_viewState.update {
it.copy(
groupMode = if (value) SortHelper.GROUP_NONE else it.groupMode,
astridSort = value,
)
}
}
val forceReload: Boolean
get() = initialState.manualSort != _viewState.value.manualSort
|| initialState.astridSort != _viewState.value.astridSort
}

@ -17,7 +17,6 @@ import com.todoroo.andlib.utility.AndroidUtilities
import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.andlib.utility.DateUtilities.now
import com.todoroo.astrid.activity.BeastModePreferences
import com.todoroo.astrid.api.AstridApiConstants
import com.todoroo.astrid.core.SortHelper
import com.todoroo.astrid.data.Task
import com.todoroo.astrid.data.Task.Companion.NOTIFY_AFTER_DEADLINE
@ -41,7 +40,6 @@ class Preferences @JvmOverloads constructor(
name: String? = getSharedPreferencesName(context)
) : QueryPreferences {
private val prefs: SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE)
private val publicPrefs: SharedPreferences = context.getSharedPreferences(AstridApiConstants.PUBLIC_PREFS, Context.MODE_PRIVATE)
fun androidBackupServiceEnabled() = getBoolean(R.string.p_backups_android_backup_enabled, true)
@ -180,7 +178,6 @@ class Preferences @JvmOverloads constructor(
@SuppressLint("ApplySharedPref")
fun clear() {
publicPrefs.edit().clear().commit()
prefs.edit().clear().commit()
}
@ -353,10 +350,12 @@ class Preferences @JvmOverloads constructor(
set(value) = setLong(R.string.p_install_date, value)
override var sortMode: Int
get() = publicPrefs.getInt(PREF_SORT_SORT, SortHelper.SORT_AUTO)
set(value) {
setPublicPref(PREF_SORT_SORT, value)
}
get() = getInt(R.string.p_sort_mode, SortHelper.SORT_AUTO)
set(value) { setInt(R.string.p_sort_mode, value) }
override var groupMode: Int
get() = getInt(R.string.p_group_mode, SortHelper.GROUP_NONE)
set(value) { setInt(R.string.p_group_mode, value) }
override var showHidden: Boolean
get() = getBoolean(R.string.p_show_hidden_tasks, true)
@ -376,11 +375,6 @@ class Preferences @JvmOverloads constructor(
override val sortCompletedByCompletionDate: Boolean
get() = getBoolean(R.string.p_completed_tasks_sort, true)
private fun setPublicPref(key: String, value: Int) {
val edit = publicPrefs.edit()
edit?.putInt(key, value)?.apply()
}
val backupDirectory: Uri?
get() = getDirectory(R.string.p_backup_dir, "backups")
@ -493,13 +487,22 @@ class Preferences @JvmOverloads constructor(
get() = getBoolean(R.string.p_manual_sort, false)
set(value) { setBoolean(R.string.p_manual_sort, value) }
val isAstridSortEnabled: Boolean
get() = getBoolean(R.string.p_astrid_sort_enabled, false)
override var isAstridSort: Boolean
get() = getBoolean(R.string.p_astrid_sort_enabled, false) && getBoolean(R.string.p_astrid_sort, false)
set(value) { setBoolean(R.string.p_astrid_sort, value) }
get() = isAstridSortEnabled && getBoolean(R.string.p_astrid_sort, false)
set(value) {
setBoolean(R.string.p_astrid_sort, value)
}
override var sortAscending: Boolean
get() = getBoolean(R.string.p_sort_ascending, false)
set(value) { setBoolean(R.string.p_sort_ascending, value) }
override var isReverseSort: Boolean
get() = getBoolean(R.string.p_reverse_sort, false)
set(value) { setBoolean(R.string.p_reverse_sort, value) }
override var groupAscending: Boolean
get() = getBoolean(R.string.p_group_ascending, false)
set(value) { setBoolean(R.string.p_group_ascending, value) }
val defaultPriority: Int
get() = getIntegerFromString(R.string.p_default_importance_key, Task.Priority.LOW)
@ -532,8 +535,6 @@ class Preferences @JvmOverloads constructor(
val defaultThemeColor: Int
get() = getInt(R.string.p_theme_color, ColorProvider.BLUE_500)
fun showGroupHeaders(): Boolean = !getBoolean(R.string.p_disable_sort_groups, false)
val markdown: Boolean
get() = getBoolean(R.string.p_markdown, false)
@ -559,8 +560,6 @@ class Preferences @JvmOverloads constructor(
get() = getBoolean(R.string.p_linkify_task_edit, false)
companion object {
private const val PREF_SORT_SORT = "sort_sort" // $NON-NLS-1$
private fun getSharedPreferencesName(context: Context): String =
context.packageName + "_preferences"

@ -3,11 +3,15 @@ package org.tasks.preferences
interface QueryPreferences {
var sortMode: Int
var groupMode: Int
var isManualSort: Boolean
var isAstridSort: Boolean
var isReverseSort: Boolean
var sortAscending: Boolean
var groupAscending: Boolean
val showHidden: Boolean

@ -28,7 +28,7 @@ import org.tasks.dialogs.ColorPickerAdapter.Palette
import org.tasks.dialogs.ColorWheelPicker
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.dialogs.SortDialog.newSortDialog
import org.tasks.dialogs.SortSettingsActivity
import org.tasks.dialogs.ThemePickerDialog.Companion.newThemePickerDialog
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.preferences.DefaultFilterProvider
@ -47,7 +47,6 @@ class ScrollableWidget : InjectingPreferenceFragment() {
const val EXTRA_WIDGET_ID = "extra_widget_id"
private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
private const val FRAG_TAG_SORT_DIALOG = "frag_tag_sort_dialog"
private const val FRAG_TAG_FILTER_PICKER = "frag_tag_filter_picker"
fun newScrollableWidget(appWidgetId: Int): ScrollableWidget {
@ -76,6 +75,12 @@ class ScrollableWidget : InjectingPreferenceFragment() {
}
}
override fun onResume() {
super.onResume()
updateSort()
}
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
appWidgetId = requireArguments().getInt(EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
widgetPreferences = WidgetPreferences(context, preferences, appWidgetId)
@ -105,7 +110,6 @@ class ScrollableWidget : InjectingPreferenceFragment() {
setupCheckbox(R.string.p_widget_show_lists)
setupCheckbox(R.string.p_widget_show_tags)
setupCheckbox(R.string.p_widget_show_full_task_title, false)
setupCheckbox(R.string.p_widget_disable_groups, false)
setupCheckbox(R.string.p_widget_show_hidden, false)
setupCheckbox(R.string.p_widget_show_completed, false)
val showDescription = setupCheckbox(R.string.p_widget_show_description, true)
@ -126,8 +130,16 @@ class ScrollableWidget : InjectingPreferenceFragment() {
findPreference(R.string.p_widget_sort).setOnPreferenceClickListener {
lifecycleScope.launch {
newSortDialog(this@ScrollableWidget, REQUEST_SORT, getFilter(), appWidgetId)
.show(parentFragmentManager, FRAG_TAG_SORT_DIALOG)
val filter = getFilter()
requireActivity().startActivityForResult(
SortSettingsActivity.getIntent(
requireActivity(),
filter.supportsManualSort(),
filter.supportsAstridSorting(),
appWidgetId,
),
REQUEST_SORT
)
}
false
}

@ -12,8 +12,8 @@ data class AdapterSection(
var sectionedPosition: Int = 0,
var collapsed: Boolean = false
) {
fun headerColor(context: Context, sortMode: Int, textColor: Int = R.color.text_secondary) =
ContextCompat.getColor(context, if (sortMode == SORT_START
fun headerColor(context: Context, groupMode: Int, textColor: Int = R.color.text_secondary) =
ContextCompat.getColor(context, if (groupMode == SORT_START
&& value > 0
&& value.toDateTime().plusDays(1).startOfDay().isBeforeNow) {
R.color.overdue

@ -11,9 +11,9 @@ internal class DiffCallback(
@Deprecated("") private val adapter: TaskAdapter
) : DiffUtil.Callback() {
private val refreshDates = when (old.sortMode) {
SORT_DUE -> new.sortMode == SORT_START
SORT_START -> new.sortMode == SORT_DUE
private val refreshDates = when (old.groupMode) {
SORT_DUE -> new.groupMode == SORT_START
SORT_START -> new.groupMode == SORT_DUE
else -> false
}
@ -28,7 +28,7 @@ internal class DiffCallback(
return false
}
return if (isHeader) {
old.sortMode == new.sortMode && old.getHeaderValue(oldPosition) == new.getHeaderValue(newPosition)
old.groupMode == new.groupMode && old.getHeaderValue(oldPosition) == new.getHeaderValue(newPosition)
} else {
old.getItem(oldPosition)!!.id == new.getItem(newPosition)!!.id
}

@ -38,7 +38,6 @@ class DragAndDropRecyclerAdapter(
preferences: Preferences) : TaskListRecyclerAdapter(adapter, viewHolderFactory, taskList, preferences), DragAndDropDiffer<TaskContainer, SectionedDataSource> {
private val disableHeaders = taskList.getFilter().let {
!it.supportsSorting()
|| !preferences.showGroupHeaders()
|| (it.supportsManualSort() && preferences.isManualSort)
|| (it.supportsAstridSorting() && preferences.isAstridSort)
}
@ -56,14 +55,14 @@ class DragAndDropRecyclerAdapter(
val viewType = getItemViewType(position)
if (viewType == 1) {
val headerSection = items.getSection(position)
(holder as HeaderViewHolder).bind(taskList.getFilter(), preferences.sortMode, headerSection)
(holder as HeaderViewHolder).bind(taskList.getFilter(), preferences.groupMode, headerSection)
} else {
super.onBindViewHolder(holder, position)
}
}
override val sortMode: Int
get() = items.sortMode
get() = items.groupMode
override fun getItemViewType(position: Int) = if (items.isHeader(position)) 1 else 0
@ -94,7 +93,7 @@ class DragAndDropRecyclerAdapter(
SectionedDataSource(
list,
disableHeaders,
preferences.sortMode,
preferences.groupMode,
adapter.getCollapsed(),
preferences.completedTasksAtBottom,
)

@ -23,28 +23,28 @@ class HeaderFormatter @Inject constructor(
fun headerStringBlocking(
value: Long,
sortMode: Int = preferences.sortMode,
groupMode: Int = preferences.groupMode,
alwaysDisplayFullDate: Boolean = preferences.alwaysDisplayFullDate,
style: FormatStyle = FormatStyle.FULL,
compact: Boolean = false,
) = runBlocking {
headerString(value, sortMode, alwaysDisplayFullDate, style, compact)
headerString(value, groupMode, alwaysDisplayFullDate, style, compact)
}
suspend fun headerString(
value: Long,
sortMode: Int = preferences.sortMode,
groupMode: Int = preferences.groupMode,
alwaysDisplayFullDate: Boolean = preferences.alwaysDisplayFullDate,
style: FormatStyle = FormatStyle.FULL,
compact: Boolean = false
): String =
when {
value == SectionedDataSource.HEADER_COMPLETED -> context.getString(R.string.completed)
sortMode == SortHelper.SORT_IMPORTANCE -> context.getString(priorityToString(value))
sortMode == SortHelper.SORT_LIST ->
groupMode == SortHelper.SORT_IMPORTANCE -> context.getString(priorityToString(value))
groupMode == SortHelper.SORT_LIST ->
listCache.getOrPut(value) { caldavDao.getCalendarById(value)?.name }?: "list: $value"
value == SectionedDataSource.HEADER_OVERDUE -> context.getString(R.string.filter_overdue)
value == 0L -> context.getString(when (sortMode) {
value == 0L -> context.getString(when (groupMode) {
SortHelper.SORT_DUE -> R.string.no_due_date
SortHelper.SORT_START -> R.string.no_start_date
else -> R.string.no_date
@ -55,13 +55,13 @@ class HeaderFormatter @Inject constructor(
)
when {
compact -> dateString
sortMode == SortHelper.SORT_DUE ->
groupMode == SortHelper.SORT_DUE ->
context.getString(R.string.sort_due_group, dateString)
sortMode == SortHelper.SORT_START ->
groupMode == SortHelper.SORT_START ->
context.getString(R.string.sort_start_group, dateString)
sortMode == SortHelper.SORT_CREATED ->
groupMode == SortHelper.SORT_CREATED ->
context.getString(R.string.sort_created_group, dateString)
sortMode == SortHelper.SORT_MODIFIED ->
groupMode == SortHelper.SORT_MODIFIED ->
context.getString(R.string.sort_modified_group, dateString)
else -> throw IllegalArgumentException()
}

@ -20,7 +20,7 @@ class HeaderViewHolder(
private var sortGroup = -1L
private var rotation = 0f
fun bind(filter: Filter, sortMode: Int, section: AdapterSection) {
fun bind(filter: Filter, groupMode: Int, section: AdapterSection) {
sortGroup = section.value
val header = if (filter.supportsSorting()) {
headerFormatter.headerStringBlocking(section.value)
@ -33,7 +33,7 @@ class HeaderViewHolder(
} else {
row.visibility = View.VISIBLE
this.title.text = header
this.title.setTextColor(section.headerColor(context, sortMode))
this.title.setTextColor(section.headerColor(context, groupMode))
rotation = if (section.collapsed) -180f else 0f
chevron.rotation = rotation
}

@ -10,13 +10,13 @@ import org.tasks.time.DateTimeUtils.startOfDay
class SectionedDataSource constructor(
tasks: List<TaskContainer>,
disableHeaders: Boolean,
val sortMode: Int,
val groupMode: Int,
private val collapsed: Set<Long>,
private val completedAtBottom: Boolean,
) {
private val tasks = tasks.toMutableList()
private val sections = if (disableHeaders) {
private val sections = if (disableHeaders || groupMode == SortHelper.GROUP_NONE) {
SparseArray()
} else {
getSections()
@ -67,12 +67,12 @@ class SectionedDataSource constructor(
} else if (sortGroup == null) {
continue
} else if (
sortMode == SortHelper.SORT_LIST ||
sortMode == SortHelper.SORT_IMPORTANCE ||
groupMode == SortHelper.SORT_LIST ||
groupMode == SortHelper.SORT_IMPORTANCE ||
sortGroup == 0L
) {
sortGroup
} else if (sortMode == SortHelper.SORT_DUE) {
} else if (groupMode == SortHelper.SORT_DUE) {
when {
sortGroup == 0L -> 0
sortGroup < startOfToday -> HEADER_OVERDUE
@ -93,12 +93,12 @@ class SectionedDataSource constructor(
sections.add(AdapterSection(i, header, 0, isCollapsed))
}
}
sortMode == SortHelper.SORT_LIST ||
sortMode == SortHelper.SORT_IMPORTANCE ->
groupMode == SortHelper.SORT_LIST ||
groupMode == SortHelper.SORT_IMPORTANCE ->
if (header != previous) {
sections.add(AdapterSection(i, header, 0, isCollapsed))
}
sortMode == SortHelper.SORT_DUE -> {
groupMode == SortHelper.SORT_DUE -> {
val previousOverdue = previous < startOfToday
val currentOverdue = header == HEADER_OVERDUE
if (previous > 0 &&

@ -6,6 +6,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.todoroo.astrid.activity.TaskListFragment
import com.todoroo.astrid.adapter.TaskAdapter
import com.todoroo.astrid.adapter.TaskAdapterDataSource
import com.todoroo.astrid.core.SortHelper
import org.tasks.data.TaskContainer
import org.tasks.preferences.Preferences
@ -27,7 +28,7 @@ abstract class TaskListRecyclerAdapter internal constructor(
val task = getItem(position)
if (task != null) {
(holder as TaskViewHolder)
.bindView(task, filter, if (groupsEnabled) preferences.sortMode else -1)
.bindView(task, filter, if (groupsEnabled) preferences.groupMode else SortHelper.GROUP_NONE)
holder.moving = false
val indent = adapter.getIndent(task)
task.indent = indent

@ -32,7 +32,7 @@ import org.tasks.time.DateTimeUtils.startOfDay
import org.tasks.ui.CheckBoxProvider
import org.tasks.ui.ChipProvider
import java.time.format.FormatStyle
import java.util.*
import java.util.Locale
import kotlin.math.max
import kotlin.math.roundToInt
@ -70,7 +70,6 @@ class TaskViewHolder internal constructor(
}
private val chipGroup: ComposeView = binding.chipGroup
private val alwaysDisplayFullDate: Boolean = preferences.alwaysDisplayFullDate
private val showGroupHeaders = preferences.showGroupHeaders()
lateinit var task: TaskContainer
@ -145,8 +144,8 @@ class TaskViewHolder internal constructor(
setupDueDate(sortMode == SORT_DUE)
setupChips(
filter = filter,
sortByStartDate = sortMode == SORT_START && showGroupHeaders,
sortByList = sortMode == SORT_LIST && showGroupHeaders
sortByStartDate = sortMode == SORT_START,
sortByList = sortMode == SORT_LIST
)
if (preferences.getBoolean(R.string.p_show_description, true)) {
markdown.setMarkdown(description, task.notes)
@ -207,7 +206,6 @@ class TaskViewHolder internal constructor(
}
val dateValue: String? = if (sortByDueDate
&& (task.sortGroup ?: 0) >= now().startOfDay()
&& showGroupHeaders
) {
task.takeIf { it.hasDueTime() }?.let {
DateUtilities.getTimeString(context, newDateTime(task.dueDate))

@ -54,8 +54,7 @@ class ChipProvider @Inject constructor(
derivedStateOf {
if (
timeOnly &&
sortGroup?.startOfDay() == startDate.startOfDay() &&
preferences.showGroupHeaders()
sortGroup?.startOfDay() == startDate.startOfDay()
) {
startDate
.takeIf { Task.hasDueTime(it) }

@ -73,11 +73,11 @@ internal class ScrollableViewsFactory(
private var showLists = false
private var showTags = false
private var collapsed = mutableSetOf(HEADER_COMPLETED)
private var sortMode = -1
private var groupMode = -1
private var tasks = SectionedDataSource(
emptyList(),
disableHeaders = false,
sortMode = 0,
groupMode = 0,
collapsed,
preferences.completedTasksAtBottom,
)
@ -101,7 +101,7 @@ internal class ScrollableViewsFactory(
tasks = SectionedDataSource(
taskDao.fetchTasks { getQuery(filter, it) },
disableGroups,
sortMode,
groupMode,
collapsed,
widgetPreferences.completedTasksAtBottom,
)
@ -149,7 +149,7 @@ internal class ScrollableViewsFactory(
val header: String? = if (filter?.supportsSorting() == true) {
headerFormatter.headerStringBlocking(
value = section.value,
sortMode = sortMode,
groupMode = groupMode,
alwaysDisplayFullDate = showFullDate,
style = FormatStyle.MEDIUM,
compact = compact,
@ -167,7 +167,7 @@ internal class ScrollableViewsFactory(
R.id.header,
section.headerColor(
context,
sortMode,
groupMode,
if (isDark) R.color.white_60 else R.color.black_60
)
)
@ -264,7 +264,7 @@ internal class ScrollableViewsFactory(
)
}
if (taskContainer.isHidden && showStartDates) {
val sortByDate = sortMode == SortHelper.SORT_START && !disableGroups
val sortByDate = groupMode == SortHelper.SORT_START && !disableGroups
chipProvider
.getStartDateChip(taskContainer, showFullDate, sortByDate)
?.let { row.addView(R.id.chips, it) }
@ -314,9 +314,10 @@ internal class ScrollableViewsFactory(
row.setViewPadding(R.id.widget_due_end, hPad, vPad, hPad, vPad)
}
row.setViewVisibility(dueDateRes, View.VISIBLE)
val text = if (sortMode == SortHelper.SORT_DUE
&& (task.sortGroup ?: 0L) >= now().startOfDay()
&& !disableGroups
val text = if (
groupMode == SortHelper.SORT_DUE &&
(task.sortGroup ?: 0L) >= now().startOfDay() &&
!disableGroups
) {
task.takeIf { it.hasDueTime() }?.let {
DateUtilities.getTimeString(context, DateTimeUtils.newDateTime(task.dueDate))
@ -361,7 +362,7 @@ internal class ScrollableViewsFactory(
dueDateTextSize = max(10f, textSize - 2)
filter = defaultFilterProvider.getFilterFromPreference(widgetPreferences.filterId)
showDividers = widgetPreferences.showDividers()
disableGroups = widgetPreferences.disableGroups() || filter?.let {
disableGroups = filter?.let {
!it.supportsSorting()
|| (it.supportsManualSort() && widgetPreferences.isManualSort)
|| (it.supportsAstridSorting() && widgetPreferences.isAstridSort)
@ -372,13 +373,13 @@ internal class ScrollableViewsFactory(
showLists = widgetPreferences.showLists()
showTags = widgetPreferences.showTags()
showFullDate = widgetPreferences.alwaysDisplayFullDate
widgetPreferences.sortMode.takeIf { it != sortMode }
?.let {
if (sortMode >= 0) {
widgetPreferences.setCollapsed(mutableSetOf(HEADER_COMPLETED))
}
sortMode = it
widgetPreferences.groupMode.takeIf { it != groupMode }
?.let {
if (groupMode != SortHelper.GROUP_NONE) {
widgetPreferences.setCollapsed(mutableSetOf(HEADER_COMPLETED))
}
groupMode = it
}
collapsed = widgetPreferences.collapsed
compact = widgetPreferences.compact
}

@ -72,10 +72,6 @@ public class WidgetPreferences implements QueryPreferences {
return getBoolean(R.string.p_widget_show_start_dates, true);
}
boolean disableGroups() {
return getBoolean(R.string.p_widget_disable_groups, false);
}
boolean showPlaces() {
return getBoolean(R.string.p_widget_show_places, true);
}
@ -256,6 +252,11 @@ public class WidgetPreferences implements QueryPreferences {
return getInt(R.string.p_widget_sort, SortHelper.SORT_AUTO);
}
@Override
public int getGroupMode() {
return getInt(R.string.p_widget_group, SortHelper.GROUP_NONE);
}
@Override
public boolean isManualSort() {
return getBoolean(R.string.p_widget_sort_manual, false);
@ -267,8 +268,13 @@ public class WidgetPreferences implements QueryPreferences {
}
@Override
public boolean isReverseSort() {
return getBoolean(R.string.p_widget_sort_reverse, false);
public boolean getSortAscending() {
return getBoolean(R.string.p_widget_sort_ascending, false);
}
@Override
public boolean getGroupAscending() {
return getBoolean(R.string.p_widget_group_ascending, false);
}
@Override
@ -299,6 +305,11 @@ public class WidgetPreferences implements QueryPreferences {
setInt(R.string.p_widget_sort, sortMode);
}
@Override
public void setGroupMode(int groupMode) {
setInt(R.string.p_widget_group, groupMode);
}
@Override
public void setManualSort(boolean isManualSort) {
setBoolean(R.string.p_widget_sort_manual, isManualSort);
@ -310,8 +321,13 @@ public class WidgetPreferences implements QueryPreferences {
}
@Override
public void setReverseSort(boolean isReverseSort) {
setBoolean(R.string.p_widget_sort_reverse, isReverseSort);
public void setSortAscending(boolean ascending) {
setBoolean(R.string.p_widget_sort_ascending, ascending);
}
@Override
public void setGroupAscending(boolean ascending) {
setBoolean(R.string.p_widget_group_ascending, ascending);
}
@Override

@ -159,7 +159,6 @@
<string name="on_launch">عند فتح التطبيق</string>
<string name="desaturate_colors_summary_off">ستكون الألوان مشبعة في المظهر الداكن</string>
<string name="desaturate_colors_summary_on">ستكون الألوان غير مشبعة في المظهر الداكن</string>
<string name="disable_sort_groups">تعطيل مجموعات الترتيب</string>
<string name="default_list">القائمة الافتراضية</string>
<string name="google_tasks_add_to_top">اضف المهام الجديدة لاعلى القائمة</string>
<string name="add_account">أضف حساب</string>
@ -420,7 +419,6 @@
<string name="url">رابط</string>
<string name="widget_due_date_hidden">مخفي</string>
<string name="widget_footer">تذييل</string>
<string name="reverse">عكس</string>
<string name="show_unstarted">إظهار الغير مبدوء</string>
<string name="discard">رمي</string>
<string name="menu_discard_changes">رمي التغييرات</string>

@ -299,7 +299,6 @@
<string name="move">Преместване</string>
<string name="filter_settings">Настройки на филтър</string>
<string name="show_completed">Завършени</string>
<string name="reverse">Обратно</string>
<string name="add_attachment">Добавяне на прикачен файл</string>
<string name="take_a_picture">Заснемане</string>
<string name="pick_from_gallery">Изберете от галерия</string>
@ -597,7 +596,6 @@
</plurals>
<string name="randomly_every">Произволно на всеки %s</string>
<string name="multi_select_reschedule">Пренасрочване</string>
<string name="disable_sort_groups">Изключване на сортиране на групи</string>
<string name="auto_dismiss_datetime">Автоматично затваряне след избор на дата и час</string>
<string name="picker_mode_time">Режим на избор на час</string>
<string name="more_options">Допълнителни настройки</string>

@ -89,7 +89,6 @@
<string name="filters">Filtres</string>
<string name="filter_settings">Configuració dels filtres</string>
<string name="show_completed">Mostra completades</string>
<string name="reverse">Ordenació inversa</string>
<string name="language">Idioma</string>
<string name="settings_localization">Localització</string>
<string name="led_notification">Led de notificació</string>

@ -175,7 +175,6 @@
<string name="delete">Smazat</string>
<string name="filter_settings">Nastavení filtru</string>
<string name="show_completed">Zobrazit dokončené</string>
<string name="reverse">Seřadit pozpátku</string>
<string name="add_attachment">Přidat přílohu</string>
<string name="privacy_policy">Zásady ochrany osobních údajů</string>
<string name="send_anonymous_statistics">Vylepšit Tasks</string>
@ -521,7 +520,6 @@
<string name="color_wheel">Více barev</string>
<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="building_notifications">Vytvářejí se oznámení</string>
<string name="got_it">Rozumím!</string>
<string name="support_development_subscribe">Odemkněte si další funkce a podpořte software s otevřeným zdrojovým kódem</string>

@ -74,7 +74,6 @@
<string name="repeats_single_on">Gentages %1$s hver %2$s</string>
<string name="opacity_header">Topbjælkens ugennemsigtighed</string>
<string name="back_button_saves_task">Tilbage-knappen gemmer opgaven</string>
<string name="reverse">Omvendt</string>
<string name="date_shortcut_tomorrow_night">I morgen aften</string>
<string name="date_shortcut_tomorrow_evening">I morgen eftermiddag</string>
<string name="date_shortcut_tomorrow_afternoon">I morgen middag</string>
@ -172,7 +171,6 @@
<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="disable_sort_groups">Slå sorteringsgrupper fra</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>
<string name="expand_subtasks">Udvid underopgaver</string>

@ -290,7 +290,6 @@
<string name="move">Bewegen</string>
<string name="filter_settings">Filtereinstellungen</string>
<string name="show_completed">Erledigte anzeigen</string>
<string name="reverse">Rückwärts</string>
<string name="add_attachment">Anhang hinzufügen</string>
<string name="take_a_picture">Bild aufnehmen</string>
<string name="pick_from_gallery">Aus Galerie wählen</string>
@ -540,7 +539,6 @@
<string name="open_last_viewed_list">Zuletzt betrachtete Liste öffnen</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="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>

@ -307,7 +307,6 @@
<string name="move">Mover</string>
<string name="filter_settings">Configuración del filtro</string>
<string name="show_completed">Mostrar completadas</string>
<string name="reverse">Invertir</string>
<string name="add_attachment">Adjuntar archivo</string>
<string name="take_a_picture">Tomar fotografía</string>
<string name="pick_from_gallery">Elegir desde la galería</string>
@ -558,7 +557,6 @@
<string name="lists">Listas</string>
<string name="astrid_sort_order_summary">Active el modo de ordenación manual de Astrid para «Mis tareas», «Hoy» y las etiquetas. Este modo de ordenación se reemplazará por «Mi orden» en una futura actualización</string>
<string name="astrid_sort_order">Clasificación manual de Astrid</string>
<string name="disable_sort_groups">Deshabilitar grupos de ordenación</string>
<string name="CFC_list_name">En la lista…</string>
<string name="date_shortcut_tomorrow_night">Mañana por la noche</string>
<string name="date_shortcut_tomorrow_evening">Mañana por la tarde</string>

@ -179,7 +179,6 @@
<string name="move">Liiguta</string>
<string name="filter_settings">Filtri seaded</string>
<string name="show_completed">Nõita lõpetatuid</string>
<string name="reverse">Pööra ümber</string>
<string name="add_attachment">Lisa fail</string>
<string name="take_a_picture">Tee pilt</string>
<string name="pick_from_gallery">Vali galeriist</string>

@ -295,7 +295,6 @@
<string name="move">Lekuz aldatu</string>
<string name="filter_settings">Iragazki-ezarpenak</string>
<string name="show_completed">Erakutsi burututakoak</string>
<string name="reverse">Alderantziz</string>
<string name="add_attachment">Gehitu eranskina</string>
<string name="take_a_picture">Atera argazkia</string>
<string name="pick_from_gallery">Hautatu galeriatik</string>
@ -541,7 +540,6 @@
<string name="open_last_viewed_list">Ireki ikusitako azkenen zerrenda</string>
<string name="on_launch">Abioan</string>
<string name="astrid_sort_order">Eskuzko Astrid ordenatzea</string>
<string name="disable_sort_groups">Desgaitu taldeak ordenatzea</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>

@ -188,7 +188,6 @@
<string name="delete">حذف</string>
<string name="filter_settings">تنظیمات فیلتر</string>
<string name="show_completed">نمایش انجام شده ها</string>
<string name="reverse">برعکس</string>
<string name="add_attachment">الصاق پیوست</string>
<string name="take_a_picture">گرفتن عکس</string>
<string name="send_anonymous_statistics">بهبود وظیفه</string>

@ -280,7 +280,6 @@
<string name="copy">Kopio</string>
<string name="filter_settings">Suodatusasetukset</string>
<string name="show_completed">Näytä valmiit</string>
<string name="reverse">Käänteinen</string>
<string name="add_attachment">Lisää liite</string>
<string name="take_a_picture">Ota kuva</string>
<string name="pick_from_gallery">Valitse galleriasta</string>
@ -629,7 +628,6 @@
<string name="davx5_selection_description">Tehtävien synkronointi DAVx⁵sovelluksen kanssa</string>
<string name="decsync_selection_description">Tiedostopohjainen synkronointi</string>
<string name="tasks_org_description">Synkronoi tehtävät Tasks.orgin kanssa</string>
<string name="disable_sort_groups">Lajitteluryhmien poistaminen käytöstä</string>
<string name="subscription">Tilaus</string>
<string name="caldav_home_set_not_found">Kotijoukkoa ei löytynyt</string>
<string name="repeat_monthly_fifth_week">viides</string>

@ -287,7 +287,6 @@
<string name="move">Déplacer</string>
<string name="filter_settings">Paramètres du filtre</string>
<string name="show_completed">Afficher les tâches terminées</string>
<string name="reverse">Inverser</string>
<string name="add_attachment">Ajouter une pièce jointe</string>
<string name="take_a_picture">Prendre une photo</string>
<string name="pick_from_gallery">Choisir depuis la galerie</string>
@ -553,7 +552,6 @@
<string name="lists">Listes</string>
<string name="astrid_sort_order_summary">Activez le mode de tri manuel dAstrid pour « Mes tâches », « Aujourd\'hui », et les étiquettes. Ce mode de tri sera remplacé par « Mon ordre » dans une future mise à jour</string>
<string name="astrid_sort_order">Tri manuel Astrid</string>
<string name="disable_sort_groups">Désactiver les groupes de tri</string>
<string name="CFC_list_name">Dans la liste…</string>
<string name="date_shortcut_tomorrow_evening">Demain soir</string>
<string name="date_shortcut_tomorrow_night">Nuit prochaine</string>

@ -211,7 +211,6 @@
<string name="copy">Copiar</string>
<string name="filter_settings">Configuración de filtros</string>
<string name="show_completed">Amosar finalizadas</string>
<string name="reverse">Invertir</string>
<string name="add_attachment">Anexar ficheiro</string>
<string name="take_a_picture">Tomar fotografía</string>
<string name="pick_from_gallery">Elixir desde a galería</string>
@ -430,7 +429,6 @@
<string name="license_summary">Tasks é software de código aberto, con licenza baixo a GNU General Public License v3.0</string>
<string name="requires_pro_subscription">Precísase dunha suscrición pro</string>
<string name="this_feature_requires_a_subscription">Esta característica necesita dunha suscrición</string>
<string name="disable_sort_groups">Desactivar ordenación de grupos</string>
<string name="enter_tag_name">Introduce nome de etiqueta</string>
<string name="create_new_tag">Crear \"%s\"</string>
<string name="show_advanced_settings">Amosar configuración avanzada</string>

@ -71,7 +71,6 @@
<string name="EPr_delete_task_data">Izbriši podatke zadatka</string>
<string name="EPr_reset_preferences_warning">Postavke će se vratiti na zadane vrijednosti</string>
<string name="EPr_reset_preferences">Obnovi postavke</string>
<string name="reverse">Obrnuto</string>
<string name="EPr_manage_delete_gcal_status">Izbrisano %d kalendarskih događaja!</string>
<string name="actfm_picture_clear">Ukloni sliku</string>
<string name="delete_multiple_tasks_confirmation">%s izbrisano</string>
@ -274,7 +273,6 @@
<string name="google_tasks_selection_description">Osnovna usluga koja sinkronizira s tvojim Google računom</string>
<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="subtasks_multilevel_google_task">Google Tasks ne podržava višerazinske podzadatke</string>
<string name="collapse_subtasks">Sklopi podzadatke</string>
<string name="expand_subtasks">Rasklopi podzadatke</string>

@ -291,7 +291,6 @@
<string name="move">Mozgatás</string>
<string name="filter_settings">Szűrő beállítások</string>
<string name="show_completed">Elvégzettek megjelenítése</string>
<string name="reverse">Visszafelé</string>
<string name="add_attachment">Csatolmány hozzáadása</string>
<string name="take_a_picture">Kép készítése</string>
<string name="pick_from_gallery">Kiválasztás a galériából</string>
@ -540,7 +539,6 @@
<string name="on_launch">Indításkor</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>
<string name="CFC_list_name">Ebben a listában…</string>
<string name="date_shortcut_tomorrow_night">Holnap éjszaka</string>
<string name="date_shortcut_tomorrow_evening">Holnap este</string>

@ -390,7 +390,6 @@
<string name="back">Kembali</string>
<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="whats_new">Apa yang Baru</string>
<string name="missing_permissions">Perizinan hilang</string>
<string name="building_notifications">Menghasilkan notifikasi</string>
@ -578,7 +577,6 @@
<string name="opacity_footer">Opasitas tajuk bawah</string>
<string name="opacity_row">Opasitas baris</string>
<string name="opacity_header">Opasitas tajuk</string>
<string name="reverse">Balikkan</string>
<string name="filter_criteria_unstarted">Belum dimulai</string>
<string name="show_unstarted">Tampilkan yang belum dimulai</string>
<string name="date_shortcut_must_come_after">%1$s harus datang setelah %2$s</string>

@ -308,7 +308,6 @@
<string name="move">Sposta</string>
<string name="filter_settings">Impostazioni filtro</string>
<string name="show_completed">Mostra completate</string>
<string name="reverse">Inverso</string>
<string name="add_attachment">Aggiungi allegato</string>
<string name="take_a_picture">Scatta una foto</string>
<string name="pick_from_gallery">Scegli dalla galleria</string>
@ -518,7 +517,6 @@
<string name="auto_dismiss_datetime_edit">Modifica attività</string>
<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="whats_new">Novità</string>
<string name="widget_due_date_hidden">Nascosto</string>
<string name="widget_due_date_below_title">Sotto il titolo</string>

@ -325,7 +325,6 @@
<string name="move">הזז</string>
<string name="filter_settings">הגדרות סינון</string>
<string name="show_completed">הצגת משימות שבוצעו</string>
<string name="reverse">אחורה</string>
<string name="add_attachment">הוספ/י קובץ</string>
<string name="take_a_picture">צלם תמונה</string>
<string name="pick_from_gallery">בחירה מהגלריה</string>
@ -517,7 +516,6 @@
<string name="google_tasks_selection_description">שירות בסיסי שמסתנכרן מול חשבון ה־Google שלך</string>
<string name="choose_synchronization_service">בחירת פלטפורמה</string>
<string name="enter_tag_name">נא למלא שם תגית</string>
<string name="disable_sort_groups">השבתת מיון קבוצות</string>
<string name="subtasks_multilevel_google_task">תת־משימות מקוננות אינן נתמכות על ידי Google Tasks</string>
<string name="widget_due_date_reschedule">לתזמן משימה מחדש</string>
<string name="widget_open_list">לפתוח רשימה</string>

@ -295,7 +295,6 @@
<string name="move">移動</string>
<string name="filter_settings">フィルター設定</string>
<string name="show_completed">完了したタスクを表示</string>
<string name="reverse">逆順</string>
<string name="add_attachment">添付ファイルを追加</string>
<string name="take_a_picture">写真を撮影</string>
<string name="pick_from_gallery">ギャラリーから選択</string>
@ -684,7 +683,6 @@
<string name="chip_appearance_icon_only">アイコンのみ</string>
<string name="more_settings">詳細設定</string>
<string name="disable_battery_optimizations">バッテリー最適化を無効にする</string>
<string name="disable_sort_groups">グループの並び替えを無効</string>
<string name="background_location">バックグラウンド時の位置情報</string>
<string name="above_average">平均以上</string>
<string name="widget_on_click">クリック時</string>

@ -292,7 +292,6 @@
<string name="move">이동</string>
<string name="filter_settings">필터 설정</string>
<string name="show_completed">완료한 할일 표시</string>
<string name="reverse">역순</string>
<string name="add_attachment">첨부파일 추가</string>
<string name="take_a_picture">사진 촬영</string>
<string name="pick_from_gallery">갤러리에서 선택</string>
@ -552,7 +551,6 @@
<string name="lists">목록</string>
<string name="open_last_viewed_list">마지막으로 보던 목록 열기</string>
<string name="davx5_selection_description">DAVx⁵ 앱과 내 할일 동기화</string>
<string name="disable_sort_groups">정렬그룹 비활성화</string>
<string name="default_tags">기본 태그</string>
<string name="no_app_found">이 요청을 처리할 앱이 없습니다</string>
<string name="date_shortcut_tomorrow_night">내일 밤</string>

@ -313,7 +313,6 @@
<string name="move">Perkelti</string>
<string name="filter_settings">Filtrų nustatymai</string>
<string name="show_completed">Rodyti užbaigtas</string>
<string name="reverse">Atvirkščiai</string>
<string name="add_attachment">Pridėti priedą</string>
<string name="take_a_picture">Nufotografuoti</string>
<string name="pick_from_gallery">Pasirinkti iš galerijos</string>
@ -693,7 +692,6 @@
<string name="choose_synchronization_service">Pasirinkti platformą</string>
<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="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>

@ -321,7 +321,6 @@
<string name="delete">Slett</string>
<string name="copy">Kopier</string>
<string name="move">Flytt</string>
<string name="reverse">Omvend</string>
<string name="add_attachment">Legg til vedlegg</string>
<string name="take_a_picture">Ta et bilde</string>
<string name="pick_from_gallery">Velg fra galleri</string>
@ -540,7 +539,6 @@
<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="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>

@ -290,7 +290,6 @@
<string name="move">Verplaatsen</string>
<string name="filter_settings">Filter instellen</string>
<string name="show_completed">Voltooide tonen</string>
<string name="reverse">Omkeren</string>
<string name="add_attachment">Bijlage toevoegen</string>
<string name="take_a_picture">Foto maken</string>
<string name="pick_from_gallery">Uit galerij kiezen</string>
@ -542,7 +541,6 @@
<string name="on_launch">Bij het starten</string>
<string name="lists">Lijsten</string>
<string name="open_last_viewed_list">Laatst bekeken lijst openen</string>
<string name="disable_sort_groups">Groepen sorteren uitzetten</string>
<string name="CFC_list_name">In de lijst…</string>
<string name="date_shortcut_tomorrow_night">Morgennacht</string>
<string name="date_shortcut_tomorrow_evening">Morgenavond</string>

@ -303,7 +303,6 @@
<string name="move">Przenieś</string>
<string name="filter_settings">Ustawienia filtrów</string>
<string name="show_completed">Pokaż ukończone</string>
<string name="reverse">Odwrotnie</string>
<string name="add_attachment">Dodaj załącznik</string>
<string name="take_a_picture">Wybierz obrazek</string>
<string name="pick_from_gallery">Wybierz z galerii</string>
@ -553,7 +552,6 @@
<string name="lists">Listy</string>
<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="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>

@ -289,7 +289,6 @@
<string name="move">Mover</string>
<string name="filter_settings">Configurações de filtro</string>
<string name="show_completed">Mostrar concluídas</string>
<string name="reverse">Reverso</string>
<string name="add_attachment">Adicionar anexo</string>
<string name="take_a_picture">Tirar uma foto</string>
<string name="pick_from_gallery">Selecionar da galeria</string>
@ -460,7 +459,6 @@
<string name="choose_synchronization_service">Selecione uma plataforma</string>
<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="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>
<string name="expand_subtasks">Expandir sub-tarefas</string>

@ -279,7 +279,6 @@
<string name="copy">Copiar</string>
<string name="filter_settings">Definições dos filtros</string>
<string name="show_completed">Mostrar terminadas</string>
<string name="reverse">Reverter</string>
<string name="add_attachment">Adicionar anexo</string>
<string name="take_a_picture">Tirar uma fotografia</string>
<string name="pick_from_gallery">Escolher da galeria de imagens</string>
@ -428,7 +427,6 @@
<string name="date_shortcut_tomorrow_night">Amanhã à noite</string>
<string name="date_shortcut_tomorrow_evening">Amanhã ao fim do dia</string>
<string name="CFC_list_name">Na lista…</string>
<string name="disable_sort_groups">Ordenar grupos desativado</string>
<string name="lists">Listas</string>
<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>

@ -212,7 +212,6 @@
<string name="take_a_picture">Faceți o fotografie</string>
<string name="add_attachment">Adăugați atașament</string>
<string name="no_app_found">Nici o aplicație nu a putut gestiona această cerere</string>
<string name="reverse">Inversați</string>
<string name="filter_criteria_unstarted">Nu a început</string>
<string name="show_completed">Afișaj finalizat</string>
<string name="show_unstarted">Afișați datele nepornite</string>
@ -617,7 +616,6 @@
<string name="choose_synchronization_service">Selectați o platformă</string>
<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="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>
<string name="expand_subtasks">Extindeți subactivitățile</string>

@ -309,7 +309,6 @@
<string name="move">Перенести</string>
<string name="filter_settings">Настройки фильтра</string>
<string name="show_completed">Показать выполненные</string>
<string name="reverse">Наоборот</string>
<string name="add_attachment">Прикрепить файл</string>
<string name="take_a_picture">Сделать снимок</string>
<string name="pick_from_gallery">Выбрать из галереи</string>
@ -558,7 +557,6 @@
<string name="lists">Списки</string>
<string name="open_last_viewed_list">Открыть последний просмотренный список</string>
<string name="on_launch">При запуске</string>
<string name="disable_sort_groups">Отключить группы сортировки</string>
<string name="date_shortcut_tomorrow_night">Завтра ночью</string>
<string name="date_shortcut_tomorrow_evening">Завтра вечером</string>
<string name="CFC_list_name">В списке…</string>

@ -431,7 +431,6 @@
<string name="repeats_from">පුනරාවර්තනය වනුයේ</string>
<string name="bundle_notifications">බහු දැනුම්දීම්</string>
<string name="accent">දෙවන වර්ණය</string>
<string name="reverse">ආපසු</string>
<string name="date_shortcut_must_come_after">%1$s, %2$s ට පසුව පැමිණිය යුතුය</string>
<string name="date_shortcut_must_come_before">%2$s පෙර %1$s පැමිණිය යුතුය</string>
<string name="rmd_EPr_quiet_hours_end_title">නිහඬ කාලය අවසානය</string>
@ -523,7 +522,6 @@
<string name="choose_synchronization_service">සේවාවක් තෝරන්න</string>
<string name="create_new_tag">\"%s\" සාදන්න</string>
<string name="enter_tag_name">ටැගයේ නම ඇතුළත් කරන්න</string>
<string name="disable_sort_groups">වර්ග කිරීමේ කණ්ඩායම් අක්‍රීය කරන්න</string>
<string name="subtasks_multilevel_google_task">Google Tasks විසින් බහු මට්ටමේ උප කාර්යයන් සඳහා සහාය නොදක්වයි</string>
<string name="collapse_subtasks">උප කාර්යයන් හකුළුවන්න</string>
<string name="expand_subtasks">උප කාර්යයන් පුළුල් කරන්න</string>

@ -294,7 +294,6 @@
<string name="move">Presunúť</string>
<string name="filter_settings">Nastavenie filtra</string>
<string name="show_completed">Zobraziť dokončené</string>
<string name="reverse">Opačné</string>
<string name="add_attachment">Pridať prílohu </string>
<string name="take_a_picture">Spraviť obrázok</string>
<string name="pick_from_gallery">Vybrať z galérie</string>

@ -203,7 +203,6 @@
<string name="delete">Ta bort</string>
<string name="filter_settings">Filterinställningar</string>
<string name="show_completed">Visa slutförda</string>
<string name="reverse">Omvänt</string>
<string name="add_attachment">Bifoga filer</string>
<string name="take_a_picture">Ta en bild</string>
<string name="pick_from_gallery">Välj från album</string>
@ -634,7 +633,6 @@
<string name="tasks_org_account">Tasks.org-konto</string>
<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="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>

@ -218,7 +218,6 @@
<string name="choose_synchronization_service">ஒரு தளத்தைத் தேர்ந்தெடுக்கவும்</string>
<string name="create_new_tag">\"%s\" ஐ உருவாக்கவும்</string>
<string name="enter_tag_name">குறிச்சொல் பெயரை உள்ளிடவும்</string>
<string name="disable_sort_groups">வரிசை குழுக்களை முடக்கு</string>
<string name="subtasks_multilevel_google_task">கூகிள் பணிகளால் பல நிலை துணை பணிகள் ஆதரிக்கப்படவில்லை</string>
<string name="collapse_subtasks">துணை பணிகளைச் சுருக்கவும்</string>
<string name="expand_subtasks">துணை பணிகளை விரிவாக்குங்கள்</string>
@ -355,7 +354,6 @@
<string name="pick_from_gallery">கேலரியில் இருந்து எடுக்கவும்</string>
<string name="take_a_picture">படம் எடுக்கவும்</string>
<string name="add_attachment">இணைப்பை சேர்க்கவும்</string>
<string name="reverse">தலைகீழ்</string>
<string name="show_completed">நிகழ்ச்சி முடிந்தது</string>
<string name="filter_settings">அமைப்புகளை வடிகட்டவும்</string>
<string name="move">நகர்வு</string>

@ -177,7 +177,6 @@
<string name="choose_synchronization_service">เลือกแพลตฟอร์ม</string>
<string name="create_new_tag">สร้าง \"%s\"</string>
<string name="enter_tag_name">ป้อนชื่อแท็ก</string>
<string name="disable_sort_groups">ปิดใช้งานกลุ่มการเรียงลําดับ</string>
<string name="subtasks_multilevel_google_task">งานย่อยหลายระดับไม่ได้รับการสนับสนุนโดย Google Tasks</string>
<string name="collapse_subtasks">ยุบงานย่อย</string>
<string name="expand_subtasks">ขยายงานย่อย</string>
@ -334,7 +333,6 @@
<string name="take_a_picture">ถ่ายรูป</string>
<string name="add_attachment">เพิ่มสิ่งที่แนบมา</string>
<string name="no_app_found">ไม่มีแอปใดที่สามารถจัดการคําขอนี้</string>
<string name="reverse">พลิกกลับ</string>
<string name="filter_criteria_unstarted">ยังไม่เริ่มต้น</string>
<string name="show_completed">การแสดงเสร็จสมบูรณ์</string>
<string name="show_unstarted">แสดงสิ่งที่ไม่ได้เริ่มต้น</string>

@ -294,7 +294,6 @@
<string name="move">Taşı</string>
<string name="filter_settings">Süzgeç ayarları</string>
<string name="show_completed">Tamamlananları göster</string>
<string name="reverse">Ters</string>
<string name="add_attachment">Ek ekle</string>
<string name="take_a_picture">Bir fotoğraf çek</string>
<string name="pick_from_gallery">Galeriden seç</string>
@ -540,7 +539,6 @@
<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>
<string name="disable_sort_groups">Sıra kümelerini devre dışı bırak</string>
<string name="CFC_list_name">Listede…</string>
<string name="astrid_sort_order_summary">\'Görevlerim\', \'Bugün\' ve etiketler için elle sıralama kipini etkinleştirir. Bu sıralama kipi, gelecek güncellemede \'Düzenim\' ile değiştirilecek</string>
<string name="astrid_sort_order">Astrid elle sıralama</string>

@ -310,7 +310,6 @@
<string name="move">Перемістити</string>
<string name="filter_settings">Налаштування фільтрів</string>
<string name="show_completed">Показати завершені</string>
<string name="reverse">Реверс</string>
<string name="add_attachment">Додати вкладення</string>
<string name="take_a_picture">Зробити знімок</string>
<string name="pick_from_gallery">Обрати з галереї</string>
@ -593,7 +592,6 @@
<string name="auto_dismiss_datetime_list">Список завдань</string>
<string name="davx5_selection_description">Синхронізувати ваші завдання з застосунком DAVx⁵</string>
<string name="decsync_selection_description">Синхронізація на основі файлів</string>
<string name="disable_sort_groups">Вимкнути групи сортування</string>
<string name="whats_new">Що нового</string>
<string name="background_location_permission_required">Tasks збирає дані геолокації, щоб активувати нагадування на основі розташування навіть коли застосунок закритий або не використовується.</string>
<string name="action_new_task">Нове завдання</string>

@ -334,7 +334,6 @@
<string name="take_a_picture">تصویر لیں</string>
<string name="add_attachment">اٹیچ منٹ لگائیں</string>
<string name="no_app_found">کوئی ایپ اس درخواست پر عمل نہیں کر سکتی</string>
<string name="reverse">الٹا کریں</string>
<string name="filter_criteria_unstarted">شروع نہ کیے گئے</string>
<string name="show_completed">مکمل ہو چکے دکھائیں</string>
<string name="show_unstarted">غیر شروع دکھائیں</string>
@ -512,6 +511,5 @@
<string name="choose_synchronization_service">پلیٹ فارم منتخب کریں</string>
<string name="create_new_tag">\"%s\" بنائیں</string>
<string name="enter_tag_name">ٹیگ کا نام درج کریں</string>
<string name="disable_sort_groups">گروپس کی ترتیب ختم کریں</string>
<string name="missing_permissions">حذف شدہ اجازتیں</string>
</resources>

@ -238,7 +238,6 @@
<string name="choose_synchronization_service">Chọn nền tảng</string>
<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="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>
<string name="expand_subtasks">Mở rộng các công việc con</string>
@ -394,7 +393,6 @@
<string name="take_a_picture">Chụp ảnh</string>
<string name="add_attachment">Thêm tệp đính kèm</string>
<string name="no_app_found">Không có ứng dụng nào có thể xử lý yêu cầu này</string>
<string name="reverse">Đảo ngược</string>
<string name="filter_criteria_unstarted">Chưa bắt đầu</string>
<string name="show_completed">Hiện mục đã hoàn thành</string>
<string name="show_unstarted">Hiện mục chưa bắt đầu</string>

@ -275,7 +275,6 @@
<string name="move">移动</string>
<string name="filter_settings">过滤器设置</string>
<string name="show_completed">显示已完成任务</string>
<string name="reverse">反向</string>
<string name="add_attachment">添加附件</string>
<string name="take_a_picture">拍张照片</string>
<string name="pick_from_gallery">从相册选一张</string>
@ -532,7 +531,6 @@
<string name="on_launch">启动时</string>
<string name="astrid_sort_order_summary">为“我的任务”,“今天”和标签启用 Astrid 的手动排序模式。在以后的更新中,此排序模式将被“我的顺序”代替</string>
<string name="astrid_sort_order">Astrid 手动排序</string>
<string name="disable_sort_groups">禁用组别排序</string>
<string name="CFC_list_name">在某列表中…</string>
<string name="date_shortcut_tomorrow_night">明天晚上</string>
<string name="date_shortcut_tomorrow_evening">明天傍晚</string>

@ -220,7 +220,6 @@
<string name="take_a_picture">拍一張照</string>
<string name="add_attachment">新增附件</string>
<string name="no_app_found">沒有程式能夠回應這項操作</string>
<string name="reverse">還原</string>
<string name="move">移動</string>
<string name="copy">複製</string>
<string name="delete">刪除</string>

@ -271,10 +271,13 @@
<string name="TEA_ctrl_creation_date">TEA_ctrl_creation_date</string>
<string name="p_show_hidden_tasks">show_hidden_tasks</string>
<string name="p_show_completed_tasks">show_completed_tasks</string>
<string name="p_reverse_sort">reverse_sort</string>
<string name="p_sort_ascending">sort_ascending</string>
<string name="p_group_ascending">group_ascending</string>
<string name="p_manual_sort">manual_sort</string>
<string name="p_astrid_sort">astrid_sort</string>
<string name="p_astrid_sort_enabled">astrid_sort_enabled</string>
<string name="p_sort_mode">sort_mode</string>
<string name="p_group_mode">group_mode</string>
<string-array name="TEA_control_sets_prefs">
<item>@string/TEA_ctrl_hide_until_pref</item>
@ -328,8 +331,10 @@
<string name="p_widget_filter">widget-id-</string>
<string name="p_widget_theme">widget-theme-v2-</string>
<string name="p_widget_sort">widget-sort-</string>
<string name="p_widget_sort_reverse">widget-sort-reverse-</string>
<string name="p_widget_sort">widget-sort-v2-</string>
<string name="p_widget_group">widget-group-</string>
<string name="p_widget_sort_ascending">widget-sort-ascending-</string>
<string name="p_widget_group_ascending">widget-group-ascending-</string>
<string name="p_widget_sort_manual">widget-sort-manual-</string>
<string name="p_widget_sort_astrid">widget-sort-astrid-</string>
<string name="p_widget_show_hidden">widget-hidden-</string>
@ -344,7 +349,6 @@
<string name="p_widget_show_dividers">widget-show-dividers-</string>
<string name="p_widget_show_subtasks">widget-show-subtasks-</string>
<string name="p_widget_show_start_dates">widget-show-start-dates-</string>
<string name="p_widget_disable_groups">widget-disable_groups-</string>
<string name="p_widget_show_places">widget-show-places-</string>
<string name="p_widget_show_lists">widget-show-lists-</string>
<string name="p_widget_show_tags">widget-show-tags-</string>
@ -389,7 +393,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_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>
<string name="p_chip_appearance">chip_appearance</string>

@ -368,7 +368,6 @@ File %1$s contained %2$s.\n\n
<string name="show_unstarted">Show unstarted</string>
<string name="show_completed">Show completed</string>
<string name="filter_criteria_unstarted">Not started</string>
<string name="reverse">Reverse</string>
<string name="no_app_found">No app could handle this request</string>
<string name="add_attachment">Add attachment</string>
<string name="take_a_picture">Take a picture</string>
@ -526,7 +525,6 @@ File %1$s contained %2$s.\n\n
<string name="expand_subtasks">Expand subtasks</string>
<string name="collapse_subtasks">Collapse subtasks</string>
<string name="subtasks_multilevel_google_task">Multi-level subtasks not supported by Google Tasks</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>
<string name="choose_synchronization_service">Select a platform</string>
@ -735,4 +733,8 @@ File %1$s contained %2$s.\n\n
<string name="sign_in">Sign in</string>
<string name="consent_agree">Agree</string>
<string name="consent_deny">Not now</string>
<string name="sort_sorting">Sorting</string>
<string name="sort_grouping">Grouping</string>
<string name="sort_ascending">Ascending</string>
<string name="sort_descending">Descending</string>
</resources>

@ -25,6 +25,14 @@
<item name="textInputStyle">@style/OutlinedBox</item>
</style>
<style name="TranslucentWindow" parent="TasksBase">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowAnimationStyle">@null</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowIsFloating">false</item>
</style>
<style name="ToolbarTheme" parent="ThemeOverlay.MaterialComponents.Light">
<item name="toolbarNavigationButtonStyle">@style/BlackNavigation</item>
<item name="iconTint">@color/text_primary</item>

@ -67,11 +67,6 @@
android:key="@string/p_completed_tasks_sort"
android:title="@string/completed_tasks_sort" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/p_disable_sort_groups"
android:title="@string/disable_sort_groups" />
<PreferenceCategory android:title="@string/chips">
<ListPreference

@ -147,12 +147,6 @@
android:key="@string/p_widget_show_dividers"
android:title="@string/widget_show_dividers" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="@string/p_widget_disable_groups"
android:title="@string/disable_sort_groups"
app:singleLineTitle="false" />
</PreferenceCategory>
<PreferenceCategory

@ -562,6 +562,200 @@
+| \--- com.squareup.okhttp3:okhttp:3.1.2 -> 4.11.0 (*)
++--- com.google.code.gson:gson:2.10.1
++--- com.google.android.material:material:1.9.0 (*)
++--- androidx.compose.material3:material3:1.1.0
+| +--- androidx.activity:activity-compose:1.5.0 -> 1.7.2
+| | +--- androidx.activity:activity-ktx:1.7.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| | | +--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| | | \--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| | | \--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.4.3
+| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 -> 1.6.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | +--- androidx.core:core:1.9.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | \--- androidx.compose.foundation:foundation:1.4.3 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.activity:activity:1.7.2 (c)
+| | \--- androidx.activity:activity-ktx:1.7.2 (c)
+| +--- androidx.compose.animation:animation-core:1.4.1 -> 1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | \--- androidx.compose.animation:animation:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation:1.4.1 -> 1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.4.3 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | | \--- androidx.compose.foundation:foundation:1.4.3 (c)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | \--- androidx.compose.animation:animation-core:1.4.3 (c)
+| | +--- androidx.compose.foundation:foundation-layout:1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.4.3 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-text:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | \--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.material:material-icons-core:1.4.1 -> 1.4.3
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| | \--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.1 -> 1.4.3
+| | +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| | \--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-graphics:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-text:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-util:1.4.1 -> 1.4.3 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.8.21
++--- androidx.constraintlayout:constraintlayout:2.1.4 (*)
++--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
@ -649,188 +843,35 @@
+| \--- com.squareup.okio:okio:1.16.0 -> 3.3.0 (*)
++--- androidx.recyclerview:recyclerview:1.3.0 (*)
++--- androidx.compose:compose-bom:2023.05.01
+| +--- androidx.compose.animation:animation-core:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.material:material:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.material3:material3:1.1.0 (c)
+| +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| +--- androidx.compose.ui:ui:1.4.3 (c)
+| +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| +--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| +--- androidx.compose.animation:animation:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| +--- androidx.compose.animation:animation-core:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| \--- androidx.compose.ui:ui-unit:1.4.3 (c)
++--- androidx.compose.ui:ui -> 1.4.3
+| +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*)
+| +--- androidx.annotation:annotation:1.5.0 -> 1.6.0 (*)
+| +--- androidx.autofill:autofill:1.0.0
+| | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| +--- androidx.compose.runtime:runtime:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| | +--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| | \--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| | \--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| +--- androidx.compose.ui:ui-geometry:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.4.3
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.ui:ui-graphics:1.4.3
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-unit:1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.ui:ui-text:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.4.3 (*)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| +--- androidx.core:core:1.9.0 (*)
+| +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| +--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| \--- androidx.compose.foundation:foundation:1.4.3 (c)
++--- androidx.compose.foundation:foundation -> 1.4.3
+| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.animation:animation-core:1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | | \--- androidx.compose.animation:animation:1.4.3 (c)
+| | +--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | \--- androidx.compose.foundation:foundation:1.4.3 (c)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | \--- androidx.compose.animation:animation-core:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.3 (*)
+| +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.4.3 (*)
+| +--- androidx.compose.ui:ui-graphics:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-text:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| +--- androidx.emoji2:emoji2:1.3.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| \--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| +--- androidx.compose.animation:animation:1.4.3 (c)
+| \--- androidx.compose.ui:ui-geometry:1.4.3 (c)
++--- androidx.compose.ui:ui -> 1.4.3 (*)
++--- androidx.compose.foundation:foundation -> 1.4.3 (*)
++--- androidx.compose.material:material -> 1.4.3
+| +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.animation:animation-core:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.foundation:foundation:1.4.3 (*)
+| +--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.material:material-icons-core:1.4.3
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| | \--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.3
+| | +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| | \--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-core:1.4.3 (*)
+| +--- androidx.compose.material:material-ripple:1.4.3 (*)
+| +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-text:1.2.1 -> 1.4.3 (*)
@ -860,15 +901,7 @@
+| | +--- androidx.compose.runtime:runtime:1.3.1 -> 1.4.3 (*)
+| | \--- androidx.compose.foundation:foundation:1.3.1 -> 1.4.3 (*)
+| \--- androidx.compose.material:material:1.3.1 -> 1.4.3 (*)
++--- androidx.activity:activity-compose:1.7.2
+| +--- androidx.activity:activity-ktx:1.7.2 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.4.3 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.4.3 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| +--- androidx.activity:activity:1.7.2 (c)
+| \--- androidx.activity:activity-ktx:1.7.2 (c)
++--- androidx.activity:activity-compose:1.7.2 (*)
++--- androidx.compose.material:material-icons-extended -> 1.4.3
+| +--- androidx.compose.material:material-icons-core:1.4.3 (*)
+| +--- androidx.compose.runtime:runtime:1.4.3 (*)
@ -880,22 +913,7 @@
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.4.3 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
@ -981,12 +999,17 @@
+| +--- androidx.compose.ui:ui-util:1.4.0 -> 1.4.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.8.21 (*)
+\--- com.google.accompanist:accompanist-permissions:0.30.1
+ +--- androidx.activity:activity-compose:1.5.1 -> 1.7.2 (*)
+ +--- androidx.compose.foundation:foundation:1.4.0 -> 1.4.3 (*)
++--- com.google.accompanist:accompanist-permissions:0.30.1
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.7.2 (*)
+| +--- androidx.compose.foundation:foundation:1.4.0 -> 1.4.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| +--- io.github.aakira:napier:1.4.1
+| | \--- io.github.aakira:napier-android:1.4.1
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.8.21 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.8.21
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.8.21 (*)
+\--- com.google.accompanist:accompanist-systemuicontroller:0.30.1
+ +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+ +--- androidx.compose.ui:ui:1.4.0 -> 1.4.3 (*)
+ +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+ +--- io.github.aakira:napier:1.4.1
+ | \--- io.github.aakira:napier-android:1.4.1
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.8.21 (*)
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.8.21
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.8.21 (*)

@ -717,6 +717,200 @@
+| \--- com.squareup.okhttp3:okhttp:3.1.2 -> 4.11.0 (*)
++--- com.google.code.gson:gson:2.10.1
++--- com.google.android.material:material:1.9.0 (*)
++--- androidx.compose.material3:material3:1.1.0
+| +--- androidx.activity:activity-compose:1.5.0 -> 1.7.2
+| | +--- androidx.activity:activity-ktx:1.7.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| | | +--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| | | \--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| | | \--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.4.3
+| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 -> 1.6.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | +--- androidx.core:core:1.9.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | | \--- androidx.compose.foundation:foundation:1.4.3 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.activity:activity:1.7.2 (c)
+| | \--- androidx.activity:activity-ktx:1.7.2 (c)
+| +--- androidx.compose.animation:animation-core:1.4.1 -> 1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | \--- androidx.compose.animation:animation:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation:1.4.1 -> 1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.4.3 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | | \--- androidx.compose.foundation:foundation:1.4.3 (c)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | \--- androidx.compose.animation:animation-core:1.4.3 (c)
+| | +--- androidx.compose.foundation:foundation-layout:1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.4.3 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-text:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | \--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.material:material-icons-core:1.4.1 -> 1.4.3
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| | \--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.1 -> 1.4.3
+| | +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| | \--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-graphics:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-text:1.4.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-util:1.4.1 -> 1.4.3 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.20 -> 1.8.21
++--- androidx.constraintlayout:constraintlayout:2.1.4 (*)
++--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
@ -804,188 +998,35 @@
+| \--- com.squareup.okio:okio:1.16.0 -> 3.3.0 (*)
++--- androidx.recyclerview:recyclerview:1.3.0 (*)
++--- androidx.compose:compose-bom:2023.05.01
+| +--- androidx.compose.animation:animation-core:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.material:material:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.material3:material3:1.1.0 (c)
+| +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| +--- androidx.compose.ui:ui:1.4.3 (c)
+| +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| +--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| +--- androidx.compose.animation:animation:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| +--- androidx.compose.animation:animation-core:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| \--- androidx.compose.ui:ui-unit:1.4.3 (c)
++--- androidx.compose.ui:ui -> 1.4.3
+| +--- androidx.activity:activity-ktx:1.7.0 -> 1.7.2 (*)
+| +--- androidx.annotation:annotation:1.5.0 -> 1.6.0 (*)
+| +--- androidx.autofill:autofill:1.0.0
+| | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| +--- androidx.compose.runtime:runtime:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| | +--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| | \--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.runtime:runtime:1.4.3 (c)
+| | \--- androidx.compose.runtime:runtime-livedata:1.4.3 (c)
+| +--- androidx.compose.ui:ui-geometry:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.4.3
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.ui:ui-graphics:1.4.3
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.6.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-unit:1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.ui:ui-text:1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.4.3 (*)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | +--- androidx.compose.ui:ui:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| | +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| +--- androidx.compose.ui:ui-unit:1.4.3 (*)
+| +--- androidx.compose.ui:ui-util:1.4.3 (*)
+| +--- androidx.core:core:1.9.0 (*)
+| +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| +--- androidx.compose.ui:ui-geometry:1.4.3 (c)
+| +--- androidx.compose.ui:ui-graphics:1.4.3 (c)
+| +--- androidx.compose.ui:ui-text:1.4.3 (c)
+| +--- androidx.compose.ui:ui-tooling-preview:1.4.3 (c)
+| +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| +--- androidx.compose.ui:ui-util:1.4.3 (c)
+| +--- androidx.compose.ui:ui-viewbinding:1.4.3 (c)
+| \--- androidx.compose.foundation:foundation:1.4.3 (c)
++--- androidx.compose.foundation:foundation -> 1.4.3
+| +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.compose.animation:animation-core:1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 -> 1.7.1 (*)
+| | | \--- androidx.compose.animation:animation:1.4.3 (c)
+| | +--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | | \--- androidx.compose.foundation:foundation:1.4.3 (c)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | \--- androidx.compose.animation:animation-core:1.4.3 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.4.3 (*)
+| +--- androidx.compose.runtime:runtime:1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.4.3 (*)
+| +--- androidx.compose.ui:ui-graphics:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-text:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| +--- androidx.emoji2:emoji2:1.3.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| \--- androidx.compose.foundation:foundation-layout:1.4.3 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.4.3 (c)
+| +--- androidx.compose.ui:ui-unit:1.4.3 (c)
+| +--- androidx.compose.animation:animation:1.4.3 (c)
+| \--- androidx.compose.ui:ui-geometry:1.4.3 (c)
++--- androidx.compose.ui:ui -> 1.4.3 (*)
++--- androidx.compose.foundation:foundation -> 1.4.3 (*)
++--- androidx.compose.material:material -> 1.4.3
+| +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.animation:animation-core:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.foundation:foundation:1.4.3 (*)
+| +--- androidx.compose.foundation:foundation-layout:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.material:material-icons-core:1.4.3
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| | \--- androidx.compose.material:material-ripple:1.4.3 (c)
+| +--- androidx.compose.material:material-ripple:1.4.3
+| | +--- androidx.compose.animation:animation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| | +--- androidx.compose.ui:ui-util:1.2.1 -> 1.4.3 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.10 -> 1.8.21
+| | +--- androidx.compose.material:material:1.4.3 (c)
+| | +--- androidx.compose.material:material-icons-core:1.4.3 (c)
+| | \--- androidx.compose.material:material-icons-extended:1.4.3 (c)
+| +--- androidx.compose.material:material-icons-core:1.4.3 (*)
+| +--- androidx.compose.material:material-ripple:1.4.3 (*)
+| +--- androidx.compose.runtime:runtime:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.2.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui-text:1.2.1 -> 1.4.3 (*)
@ -1015,15 +1056,7 @@
+| | +--- androidx.compose.runtime:runtime:1.3.1 -> 1.4.3 (*)
+| | \--- androidx.compose.foundation:foundation:1.3.1 -> 1.4.3 (*)
+| \--- androidx.compose.material:material:1.3.1 -> 1.4.3 (*)
++--- androidx.activity:activity-compose:1.7.2
+| +--- androidx.activity:activity-ktx:1.7.2 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.4.3 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.4.3 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
+| +--- androidx.activity:activity:1.7.2 (c)
+| \--- androidx.activity:activity-ktx:1.7.2 (c)
++--- androidx.activity:activity-compose:1.7.2 (*)
++--- androidx.compose.material:material-icons-extended -> 1.4.3
+| +--- androidx.compose.material:material-icons-core:1.4.3 (*)
+| +--- androidx.compose.runtime:runtime:1.4.3 (*)
@ -1035,22 +1068,7 @@
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.4.3 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.4.3 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.6.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (c)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (c)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.8.21 (*)
@ -1136,12 +1154,17 @@
+| +--- androidx.compose.ui:ui-util:1.4.0 -> 1.4.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.8.21 (*)
+\--- com.google.accompanist:accompanist-permissions:0.30.1
+ +--- androidx.activity:activity-compose:1.5.1 -> 1.7.2 (*)
+ +--- androidx.compose.foundation:foundation:1.4.0 -> 1.4.3 (*)
++--- com.google.accompanist:accompanist-permissions:0.30.1
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.7.2 (*)
+| +--- androidx.compose.foundation:foundation:1.4.0 -> 1.4.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+| +--- io.github.aakira:napier:1.4.1
+| | \--- io.github.aakira:napier-android:1.4.1
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.8.21 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.8.21
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.8.21 (*)
+\--- com.google.accompanist:accompanist-systemuicontroller:0.30.1
+ +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+ +--- androidx.compose.ui:ui:1.4.0 -> 1.4.3 (*)
+ +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.1 (*)
+ +--- io.github.aakira:napier:1.4.1
+ | \--- io.github.aakira:napier-android:1.4.1
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.32 -> 1.8.21 (*)
+ | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.32 -> 1.8.21
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.8.21 (*)

@ -40,6 +40,7 @@ locale = "1.0.2"
make-it-easy = "4.0.1"
markwon = "4.6.2"
material = "1.9.0"
material3 = "1.1.0"
mockito = "5.3.1"
okhttp = "4.11.0"
opentasks = "562fec5"
@ -69,6 +70,7 @@ xpp3 = "1.1.6"
[libraries]
accompanist-flowlayout = { module = "com.google.accompanist:accompanist-flowlayout", version.ref = "accompanist" }
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
accompanist-systemuicontroller = { module = "com.google.accompanist:accompanist-systemuicontroller", version.ref = "accompanist" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity-compose" }
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
androidx-compose = { module = "androidx.compose:compose-bom", version.ref = "compose" }
@ -138,6 +140,7 @@ markwon-strikethrough = { module = "io.noties.markwon:ext-strikethrough", versio
markwon-tables = { module = "io.noties.markwon:ext-tables", version.ref = "markwon" }
markwon-tasklist = { module = "io.noties.markwon:ext-tasklist", version.ref = "markwon" }
material = { module = "com.google.android.material:material", version.ref = "material" }
material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" }
mockito-android = { module = "org.mockito:mockito-android", version.ref = "mockito" }
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }

Loading…
Cancel
Save