Add searchable filter picker

pull/2905/head
Alex Baker 2 weeks ago
parent f739cac8b4
commit 97c3852f2f

@ -211,7 +211,7 @@
<activity
android:exported="true"
android:excludeFromRecents="true"
android:name=".widget.WidgetFilterSelectionActivity"
android:name=".compose.FilterSelectionActivity"
android:taskAffinity=""
android:theme="@style/TranslucentDialog"/>

@ -61,6 +61,8 @@ import org.tasks.Strings.isNullOrEmpty
import org.tasks.analytics.Firebase
import org.tasks.calendars.CalendarPicker
import org.tasks.compose.BeastModeBanner
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.CommentsRow
import org.tasks.compose.edit.DescriptionRow
@ -86,8 +88,6 @@ import org.tasks.databinding.TaskEditTimerBinding
import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.dialogs.DateTimePicker
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.dialogs.Linkify
import org.tasks.extensions.hideKeyboard
import org.tasks.files.FileHelper
@ -140,6 +140,9 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
activity?.recreate()
}
private val listPickerLauncher = registerForListPickerResult { filter ->
editViewModel.selectedList.update { filter }
}
val task: Task?
get() = BundleCompat.getParcelable(requireArguments(), EXTRA_TASK, Task::class.java)
@ -307,9 +310,6 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
}
}
}
childFragmentManager.setFilterPickerResultListener(this) { filter ->
editViewModel.selectedList.update { filter }
}
return view
}
@ -493,11 +493,11 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
list = list,
colorProvider = { chipProvider.getColor(it) },
onClick = {
newFilterPicker(list, true)
.show(
childFragmentManager,
FRAG_TAG_GOOGLE_TASK_LIST_SELECTION
)
listPickerLauncher.launch(
context = context,
selectedFilter = list,
listsOnly = true
)
}
)
}
@ -535,8 +535,6 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
const val EXTRA_TAGS = "extra_tags"
const val EXTRA_ALARMS = "extra_alarms"
private const val FRAG_TAG_GOOGLE_TASK_LIST_SELECTION =
"frag_tag_google_task_list_selection"
const val FRAG_TAG_CALENDAR_PICKER = "frag_tag_calendar_picker"
private const val FRAG_TAG_DATE_PICKER = "frag_tag_date_picker"
const val REQUEST_CODE_PICK_CALENDAR = 70

@ -53,7 +53,6 @@ import com.todoroo.astrid.adapter.TaskAdapter
import com.todoroo.astrid.adapter.TaskAdapterProvider
import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_OLD_DUE_DATE
import com.todoroo.astrid.api.AstridApiConstants.EXTRAS_TASK_ID
import org.tasks.filters.CaldavFilter
import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.api.TagFilter
@ -84,6 +83,8 @@ import org.tasks.activities.TagSettingsActivity
import org.tasks.analytics.Firebase
import org.tasks.billing.PurchaseActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.compose.SubscriptionNagBanner
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.data.TaskContainer
@ -100,8 +101,6 @@ import org.tasks.data.withTransaction
import org.tasks.databinding.FragmentTaskListBinding
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.PriorityPicker.Companion.newPriorityPicker
import org.tasks.dialogs.SortSettingsActivity
import org.tasks.extensions.Context.openUri
@ -110,6 +109,7 @@ import org.tasks.extensions.Fragment.safeStartActivityForResult
import org.tasks.extensions.hideKeyboard
import org.tasks.extensions.setOnQueryTextListener
import org.tasks.filters.AstridOrderingFilter
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.FilterImpl
import org.tasks.filters.PlaceFilter
@ -178,6 +178,13 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private var mode: ActionMode? = null
lateinit var themeColor: ThemeColor
private lateinit var binding: FragmentTaskListBinding
private val listPickerLauncher = registerForListPickerResult {
val selected = taskAdapter.getSelected()
lifecycleScope.launch {
taskMover.move(selected, it)
}
finishActionMode()
}
private val sortRequest =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
@ -334,13 +341,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
mainViewModel.setDrawerOpen(true)
}
setupMenu(toolbar)
childFragmentManager.setFilterPickerResultListener(this) {
val selected = taskAdapter.getSelected()
lifecycleScope.launch {
taskMover.move(selected, it)
}
finishActionMode()
}
binding.banner.setContent {
val context = LocalContext.current
val showBanner = listViewModel.state.collectAsStateLifecycleAware().value.begForSubscription
@ -756,8 +756,11 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
R.id.move_tasks -> {
lifecycleScope.launch {
val singleFilter = taskMover.getSingleFilter(selected)
newFilterPicker(singleFilter, true)
.show(childFragmentManager, FRAG_TAG_REMOTE_LIST_PICKER)
listPickerLauncher.launch(
context = requireActivity(),
selectedFilter = singleFilter,
listsOnly = true,
)
}
true
}
@ -1019,7 +1022,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private const val EXTRA_SELECTED_TASK_IDS = "extra_selected_task_ids"
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_DATE_TIME_PICKER = "frag_tag_date_time_picker"
private const val FRAG_TAG_PRIORITY_PICKER = "frag_tag_priority_picker"
private const val REQUEST_TAG_TASKS = 10106

@ -0,0 +1,140 @@
package org.tasks.compose
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.BasicAlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import androidx.core.content.IntentCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.viewmodel.compose.viewModel
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.LocalBroadcastManager
import org.tasks.compose.pickers.SearchableFilterPicker
import org.tasks.dialogs.FilterPickerViewModel
import org.tasks.filters.Filter
import org.tasks.filters.NavigationDrawerSubheader
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
import org.tasks.widget.WidgetPreferences
import javax.inject.Inject
@AndroidEntryPoint
class FilterSelectionActivity : AppCompatActivity() {
@Inject lateinit var preferences: Preferences
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
val selected = IntentCompat.getParcelableExtra(intent, EXTRA_FILTER, Filter::class.java)
setContent {
MaterialTheme(
colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
) {
val viewModel: FilterPickerViewModel = viewModel()
val state = viewModel.viewState.collectAsStateLifecycleAware().value
BasicAlertDialog(
onDismissRequest = { finish() },
modifier = Modifier.padding(vertical = 32.dp)
) {
val searching by remember(state.query) {
derivedStateOf {
state.query.isNotBlank()
}
}
SearchableFilterPicker(
filters = if (searching) state.searchResults else state.filters,
query = state.query,
onQueryChange = { viewModel.onQueryChange(it) },
active = true,
dismiss = { finish() },
getIcon = { ImageVector.vectorResource(id = viewModel.getIcon(it)) },
getColor = { viewModel.getColor(it) },
selected = selected,
onClick = { filter ->
when (filter) {
is NavigationDrawerSubheader -> {
viewModel.onClick(filter)
}
is Filter -> {
val data = Bundle()
data.putParcelable(EXTRA_FILTER, filter)
if (widgetId != -1) {
WidgetPreferences(this, preferences, widgetId)
.setFilter(
defaultFilterProvider.getFilterPreferenceValue(
filter
)
)
localBroadcastManager.reconfigureWidget(widgetId)
}
setResult(RESULT_OK, Intent().putExtras(data))
finish()
}
}
}
)
}
}
}
}
companion object {
const val EXTRA_FILTER = "extra_filter"
const val EXTRA_LISTS_ONLY = "extra_lists_only"
fun Fragment.registerForListPickerResult(callback: (Filter) -> Unit): ActivityResultLauncher<Intent> {
return registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
it.data?.let { intent ->
IntentCompat
.getParcelableExtra(intent, EXTRA_FILTER, Filter::class.java)
?.let(callback)
}
}
}
fun ComponentActivity.registerForListPickerResult(callback: (Filter) -> Unit): ActivityResultLauncher<Intent> {
return registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
it.data?.let { intent ->
IntentCompat
.getParcelableExtra(intent, EXTRA_FILTER, Filter::class.java)
?.let(callback)
}
}
}
fun ActivityResultLauncher<Intent>.launch(
context: Context,
selectedFilter: Filter? = null,
listsOnly: Boolean = false,
) {
launch(
Intent(context, FilterSelectionActivity::class.java)
.putExtra(EXTRA_FILTER, selectedFilter)
.putExtra(EXTRA_LISTS_ONLY, listsOnly)
)
}
}
}

@ -6,6 +6,9 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Block
import androidx.compose.material.icons.outlined.Event
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -66,7 +69,7 @@ fun CalendarPickerList(
.padding(vertical = 12.dp)
) {
CheckableIconRow(
icon = painterResource(id = R.drawable.ic_outline_block_24),
icon = Icons.Outlined.Block,
tint = MaterialTheme.colorScheme.onSurface,
text = stringResource(id = R.string.dont_add_to_calendar),
selected = selectedCalendar == null,
@ -74,7 +77,7 @@ fun CalendarPickerList(
)
calendars.forEach {
CheckableIconRow(
icon = painterResource(id = R.drawable.ic_outline_event_24px),
icon = Icons.Outlined.Event,
tint = Color(it.color),
text = it.name,
selected = selectedCalendar == it,

@ -1,84 +0,0 @@
package org.tasks.compose.pickers
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ContentAlpha
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment.Companion.CenterVertically
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import org.tasks.filters.CaldavFilter
import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.dialogs.FilterPickerViewModel
import org.tasks.filters.Filter
import org.tasks.filters.NavigationDrawerSubheader
@Composable
fun FilterPicker(
viewModel: FilterPickerViewModel = viewModel(),
selected: Filter?,
onSelected: (Filter) -> Unit,
) {
Column(
modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(vertical = 12.dp)
) {
val filters = viewModel.viewState.collectAsStateLifecycleAware().value.filters
filters.forEach { filter ->
when (filter) {
is NavigationDrawerSubheader -> {
CollapsibleRow(
text = filter.title!!,
collapsed = filter.isCollapsed,
onClick = { viewModel.onClick(filter) },
)
}
is Filter -> {
CheckableIconRow(
icon = painterResource(id = viewModel.getIcon(filter)),
tint = Color(viewModel.getColor(filter)),
selected = filter == selected,
onClick = { onSelected(filter) },
) {
Row(verticalAlignment = CenterVertically) {
Text(
text = filter.title!!,
style = MaterialTheme.typography.bodyMedium.copy(
fontWeight = FontWeight.Medium
),
modifier = Modifier.weight(1f),
color = MaterialTheme.colorScheme.onSurface,
)
if (filter is CaldavFilter && filter.principals > 0) {
Icon(
painter = painterResource(
id = when (filter.principals) {
1 -> R.drawable.ic_outline_perm_identity_24px
in 2..Int.MAX_VALUE -> R.drawable.ic_outline_people_outline_24
else -> 0
}
),
modifier = Modifier.alpha(ContentAlpha.medium),
contentDescription = null,
)
}
}
}
}
}
}
}
}

@ -1,71 +0,0 @@
package org.tasks.dialogs
import android.app.Dialog
import android.content.DialogInterface
import android.os.Bundle
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.setFragmentResult
import androidx.lifecycle.LifecycleOwner
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.compose.pickers.FilterPicker
import org.tasks.filters.Filter
import javax.inject.Inject
@AndroidEntryPoint
class FilterPicker : DialogFragment() {
@Inject lateinit var dialogBuilder: DialogBuilder
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return dialogBuilder
.newDialog()
.setNegativeButton(R.string.cancel) { dialog, _ -> dialog.cancel() }
.setContent {
FilterPicker(
selected = arguments?.getParcelable(EXTRA_FILTER),
onSelected = { filter ->
val data = Bundle()
data.putParcelable(EXTRA_FILTER, filter)
filter.valuesForNewTasks?.let { data.putString(EXTRA_FILTER_VALUES, it) }
setFragmentResult(SELECT_FILTER, data)
dismiss()
}
)
}
.show()
}
override fun onCancel(dialog: DialogInterface) {
super.onCancel(dialog)
setFragmentResult(SELECT_FILTER, Bundle())
}
companion object {
const val SELECT_FILTER = "select_filter"
const val EXTRA_FILTER = "extra_filter"
const val EXTRA_FILTER_VALUES = "extra_filter_values"
const val EXTRA_LISTS_ONLY = "extra_lists_only"
fun newFilterPicker(
selected: Filter?,
listsOnly: Boolean = false,
): FilterPicker {
val dialog = FilterPicker()
val arguments = Bundle()
arguments.putParcelable(EXTRA_FILTER, selected)
arguments.putBoolean(EXTRA_LISTS_ONLY, listsOnly)
dialog.arguments = arguments
return dialog
}
fun FragmentManager.setFilterPickerResultListener(
lifecycleOwner: LifecycleOwner,
callback: (Filter) -> Unit
) {
setFragmentResultListener(SELECT_FILTER, lifecycleOwner) { _, data ->
data.getParcelable<Filter>(EXTRA_FILTER)?.let(callback)
}
}
}
}

@ -16,8 +16,8 @@ import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.billing.Inventory
import org.tasks.compose.FilterSelectionActivity
import org.tasks.data.dao.CaldavDao
import org.tasks.dialogs.FilterPicker.Companion.EXTRA_LISTS_ONLY
import org.tasks.filters.Filter
import org.tasks.filters.FilterListItem
import org.tasks.filters.FilterProvider
@ -38,10 +38,13 @@ class FilterPickerViewModel @Inject constructor(
private val preferences: Preferences,
private val caldavDao: CaldavDao,
) : ViewModel() {
private val listsOnly = savedStateHandle[EXTRA_LISTS_ONLY] ?: false
private val listsOnly = savedStateHandle[FilterSelectionActivity.EXTRA_LISTS_ONLY] ?: false
data class ViewState(
val filters: List<FilterListItem> = emptyList(),
val allFilters: List<Filter> = emptyList(),
val searchResults: List<Filter> = emptyList(),
val query: String = "",
)
private val _viewState = MutableStateFlow(ViewState())
@ -55,12 +58,20 @@ class FilterPickerViewModel @Inject constructor(
}
private fun refresh() = viewModelScope.launch {
val items = if (listsOnly) {
filterProvider.listPickerItems().filterNot { it is Filter && it.isReadOnly }
} else {
filterProvider.filterPickerItems()
_viewState.update { state ->
state.copy(
filters = if (listsOnly) {
filterProvider.listPickerItems().filterNot { it is Filter && it.isReadOnly }
} else {
filterProvider.filterPickerItems()
},
allFilters = if (listsOnly) {
filterProvider.allLists().filterNot { it.isReadOnly }
} else {
filterProvider.allFilters()
},
)
}
_viewState.update { it.copy(filters = items) }
}
fun onClick(subheader: NavigationDrawerSubheader) = viewModelScope.launch {
@ -103,6 +114,17 @@ class FilterPickerViewModel @Inject constructor(
localBroadcastManager.unregisterReceiver(refreshReceiver)
}
fun onQueryChange(query: String) {
_viewState.update { state ->
state.copy(
query = query,
searchResults = state.allFilters
.filter { it.title!!.contains(query, ignoreCase = true) }
.sortedBy { it.title },
)
}
}
init {
localBroadcastManager.registerRefreshListReceiver(refreshReceiver)
refresh()

@ -1,36 +1,30 @@
package org.tasks.filters
import android.content.Context
import android.content.Intent
import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.api.CustomFilter
import com.todoroo.astrid.core.BuiltInFilterExposer
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig
import org.tasks.R
import org.tasks.activities.GoogleTaskListSettingsActivity
import org.tasks.activities.TagSettingsActivity
import org.tasks.caldav.BaseCaldavCalendarSettingsActivity
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_ETESYNC
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_LOCAL
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.GoogleTaskFilters
import org.tasks.data.LocationFilters
import org.tasks.data.NO_ORDER
import org.tasks.data.TagFilters
import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.FilterDao
import org.tasks.data.GoogleTaskFilters
import org.tasks.data.dao.GoogleTaskListDao
import org.tasks.data.dao.LocationDao
import org.tasks.data.LocationFilters
import org.tasks.data.NO_ORDER
import org.tasks.data.dao.TagDataDao
import org.tasks.data.TagFilters
import org.tasks.data.listSettingsClass
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_ETESYNC
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_LOCAL
import org.tasks.data.entity.CaldavAccount.Companion.TYPE_OPENTASKS
import org.tasks.data.setupLocalAccount
import org.tasks.data.toGtasksFilter
import org.tasks.data.toLocationFilter
import org.tasks.data.toTagFilter
import org.tasks.filters.NavigationDrawerSubheader.SubheaderType
import org.tasks.location.LocationPickerActivity
import org.tasks.preferences.Preferences
import javax.inject.Inject
@ -45,11 +39,20 @@ class FilterProvider @Inject constructor(
private val locationDao: LocationDao
) {
suspend fun listPickerItems(): List<FilterListItem> =
caldavFilters(false)
caldavFilters(showCreate = false, forceExpand = false)
suspend fun drawerItems(): List<FilterListItem> =
getAllFilters(showCreate = true, hideUnused = true)
suspend fun allLists(): List<Filter> =
caldavFilters(showCreate = false, forceExpand = true)
.filterIsInstance<Filter>()
suspend fun allFilters(): List<Filter> =
getAllFilters(showCreate = false, hideUnused = false, forceExpand = true)
.filterIsInstance<Filter>()
suspend fun filterPickerItems(): List<FilterListItem> =
getAllFilters(showCreate = false)
@ -83,11 +86,15 @@ class FilterProvider @Inject constructor(
emptyList()
}
private suspend fun addFilters(showCreate: Boolean, showBuiltIn: Boolean): List<FilterListItem> =
private suspend fun addFilters(
showCreate: Boolean,
showBuiltIn: Boolean,
forceExpand: Boolean,
): List<FilterListItem> =
if (!preferences.getBoolean(R.string.p_filters_enabled, true)) {
emptyList()
} else {
val collapsed = preferences.getBoolean(R.string.p_collapse_filters, false)
val collapsed = !forceExpand && preferences.getBoolean(R.string.p_collapse_filters, false)
listOf(
NavigationDrawerSubheader(
context.getString(R.string.filters),
@ -105,11 +112,15 @@ class FilterProvider @Inject constructor(
.plus(filterDao.getFilters().map(::CustomFilter).sort())
}
private suspend fun addTags(showCreate: Boolean, hideUnused: Boolean): List<FilterListItem> =
private suspend fun addTags(
showCreate: Boolean,
hideUnused: Boolean,
forceExpand: Boolean,
): List<FilterListItem> =
if (!preferences.getBoolean(R.string.p_tags_enabled, true)) {
emptyList()
} else {
val collapsed = preferences.getBoolean(R.string.p_collapse_tags, false)
val collapsed = !forceExpand && preferences.getBoolean(R.string.p_collapse_tags, false)
listOf(
NavigationDrawerSubheader(
context.getString(R.string.tags),
@ -129,11 +140,15 @@ class FilterProvider @Inject constructor(
.sort())
}
private suspend fun addPlaces(showCreate: Boolean, hideUnused: Boolean): List<FilterListItem> =
private suspend fun addPlaces(
showCreate: Boolean,
hideUnused: Boolean,
forceExpand: Boolean,
): List<FilterListItem> =
if (!preferences.getBoolean(R.string.p_places_enabled, true)) {
emptyList()
} else {
val collapsed = preferences.getBoolean(R.string.p_collapse_locations, false)
val collapsed = !forceExpand && preferences.getBoolean(R.string.p_collapse_locations, false)
listOf(
NavigationDrawerSubheader(
context.getString(R.string.places),
@ -157,6 +172,7 @@ class FilterProvider @Inject constructor(
showCreate: Boolean = true,
showBuiltIn: Boolean = true,
hideUnused: Boolean = false,
forceExpand: Boolean = false,
): List<FilterListItem> =
if (showBuiltIn) {
arrayListOf(builtInFilterExposer.myTasksFilter)
@ -164,18 +180,19 @@ class FilterProvider @Inject constructor(
ArrayList<FilterListItem>()
}
.asSequence()
.plus(addFilters(showCreate, showBuiltIn))
.plus(addTags(showCreate, hideUnused))
.plus(addPlaces(showCreate, hideUnused))
.plus(caldavFilters(showCreate))
.plus(addFilters(showCreate, showBuiltIn, forceExpand))
.plus(addTags(showCreate, hideUnused, forceExpand))
.plus(addPlaces(showCreate, hideUnused, forceExpand))
.plus(caldavFilters(showCreate, forceExpand))
.toList()
.plusAllIf(BuildConfig.DEBUG) { getDebugFilters() }
private suspend fun googleTaskFilter(
account: CaldavAccount,
showCreate: Boolean,
forceExpand: Boolean,
): List<FilterListItem> {
val collapsed = account.isCollapsed
val collapsed = !forceExpand && account.isCollapsed
return listOf(
NavigationDrawerSubheader(
account.username,
@ -195,17 +212,21 @@ class FilterProvider @Inject constructor(
)
}
private suspend fun caldavFilters(showCreate: Boolean = true): List<FilterListItem> =
private suspend fun caldavFilters(
showCreate: Boolean,
forceExpand: Boolean,
): List<FilterListItem> =
caldavDao.getAccounts()
.ifEmpty { listOf(caldavDao.setupLocalAccount(context)) }
.filter { it.accountType != TYPE_LOCAL || preferences.getBoolean(R.string.p_lists_enabled, true) }
.flatMap {
if (it.isGoogleTasks) {
googleTaskFilter(it, showCreate)
googleTaskFilter(it, showCreate, forceExpand)
} else {
caldavFilter(
it,
showCreate && it.accountType != TYPE_OPENTASKS && it.accountType != TYPE_ETESYNC
showCreate && it.accountType != TYPE_OPENTASKS && it.accountType != TYPE_ETESYNC,
forceExpand,
)
}
}
@ -213,8 +234,9 @@ class FilterProvider @Inject constructor(
private suspend fun caldavFilter(
account: CaldavAccount,
showCreate: Boolean,
forceExpand: Boolean,
): List<FilterListItem> {
val collapsed = account.isCollapsed
val collapsed = !forceExpand && account.isCollapsed
return listOf(
NavigationDrawerSubheader(
if (account.accountType == TYPE_LOCAL) {

@ -6,8 +6,8 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.preferences.DefaultFilterProvider
import javax.inject.Inject
@ -18,24 +18,23 @@ class DashClock : InjectingPreferenceFragment() {
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
override fun getPreferenceXml() = R.xml.preferences_dashclock
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.setFilterPickerResultListener(this) {
defaultFilterProvider.dashclockFilter = it
lifecycleScope.launch {
refreshPreferences()
}
localBroadcastManager.broadcastRefresh()
private val listPickerLauncher = registerForListPickerResult {
defaultFilterProvider.dashclockFilter = it
lifecycleScope.launch {
refreshPreferences()
}
localBroadcastManager.broadcastRefresh()
}
override fun getPreferenceXml() = R.xml.preferences_dashclock
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
findPreference(R.string.p_dashclock_filter)
.setOnPreferenceClickListener {
newFilterPicker(defaultFilterProvider.dashclockFilter)
.show(childFragmentManager, FRAG_TAG_SELECT_PICKER)
listPickerLauncher.launch(
context = requireContext(),
selectedFilter = defaultFilterProvider.dashclockFilter,
)
false
}
@ -46,8 +45,4 @@ class DashClock : InjectingPreferenceFragment() {
val filter = defaultFilterProvider.getFilterFromPreference(R.string.p_dashclock_filter)
findPreference(R.string.p_dashclock_filter).summary = filter.title
}
companion object {
private const val FRAG_TAG_SELECT_PICKER = "frag_tag_select_picker"
}
}

@ -17,12 +17,12 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
import org.tasks.dialogs.ColorPickerAdapter
import org.tasks.dialogs.ColorWheelPicker
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.dialogs.ThemePickerDialog
import org.tasks.dialogs.ThemePickerDialog.Companion.newThemePickerDialog
import org.tasks.extensions.Context.isNightMode
@ -51,17 +51,14 @@ class LookAndFeel : InjectingPreferenceFragment() {
@Inject lateinit var inventory: Inventory
@Inject lateinit var locale: Locale
override fun getPreferenceXml() = R.xml.preferences_look_and_feel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.setFilterPickerResultListener(this) {
defaultFilterProvider.setDefaultOpenFilter(it)
findPreference(R.string.p_default_open_filter).summary = it.title
localBroadcastManager.broadcastRefresh()
}
private val listPickerLauncher = registerForListPickerResult {
defaultFilterProvider.setDefaultOpenFilter(it)
findPreference(R.string.p_default_open_filter).summary = it.title
localBroadcastManager.broadcastRefresh()
}
override fun getPreferenceXml() = R.xml.preferences_look_and_feel
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
val themePref = findPreference(R.string.p_theme)
val themeNames = resources.getStringArray(R.array.base_theme_names)
@ -84,8 +81,10 @@ class LookAndFeel : InjectingPreferenceFragment() {
defaultList.summary = filter.title
defaultList.onPreferenceClickListener = Preference.OnPreferenceClickListener {
lifecycleScope.launch {
newFilterPicker(defaultFilterProvider.getDefaultOpenFilter())
.show(childFragmentManager, FRAG_TAG_FILTER_PICKER)
listPickerLauncher.launch(
context = requireContext(),
selectedFilter = defaultFilterProvider.getDefaultOpenFilter(),
)
}
true
}
@ -249,6 +248,5 @@ class LookAndFeel : InjectingPreferenceFragment() {
private const val FRAG_TAG_LOCALE_PICKER = "frag_tag_locale_picker"
private const val FRAG_TAG_THEME_PICKER = "frag_tag_theme_picker"
private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
private const val FRAG_TAG_FILTER_PICKER = "frag_tag_filter_picker"
}
}

@ -20,8 +20,8 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.dialogs.MyTimePickerDialog.Companion.newTimePicker
import org.tasks.extensions.Context.getResourceUri
import org.tasks.injection.InjectingPreferenceFragment
@ -43,17 +43,14 @@ class Notifications : InjectingPreferenceFragment() {
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var voiceOutputAssistant: VoiceOutputAssistant
override fun getPreferenceXml() = R.xml.preferences_notifications
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.setFilterPickerResultListener(this) {
defaultFilterProvider.setBadgeFilter(it)
findPreference(R.string.p_badge_list).summary = it.title
localBroadcastManager.broadcastRefresh()
}
private val listPickerLauncher = registerForListPickerResult {
defaultFilterProvider.setBadgeFilter(it)
findPreference(R.string.p_badge_list).summary = it.title
localBroadcastManager.broadcastRefresh()
}
override fun getPreferenceXml() = R.xml.preferences_notifications
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
rescheduleNotificationsOnChange(
false,
@ -90,8 +87,10 @@ class Notifications : InjectingPreferenceFragment() {
badgePreference.summary = filter.title
badgePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
lifecycleScope.launch {
newFilterPicker(defaultFilterProvider.getBadgeFilter())
.show(childFragmentManager, FRAG_TAG_FILTER_PICKER)
listPickerLauncher.launch(
context = requireContext(),
selectedFilter = defaultFilterProvider.getBadgeFilter(),
)
}
true
}
@ -354,6 +353,5 @@ class Notifications : InjectingPreferenceFragment() {
private const val REQUEST_CODE_ALERT_RINGTONE = 10005
private const val REQUEST_CODE_TTS_CHECK = 10006
private const val REQUEST_CODE_COMPLETION_SOUND = 10007
private const val FRAG_TAG_FILTER_PICKER = "frag_tag_filter_picker"
}
}

@ -6,23 +6,23 @@ import android.os.Bundle
import android.view.View
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import org.tasks.data.entity.Task.Companion.NOTIFY_AFTER_DEADLINE
import org.tasks.data.entity.Task.Companion.NOTIFY_AT_DEADLINE
import org.tasks.data.entity.Task.Companion.NOTIFY_AT_START
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.calendars.CalendarPicker
import org.tasks.calendars.CalendarPicker.Companion.newCalendarPicker
import org.tasks.calendars.CalendarProvider
import org.tasks.data.entity.CaldavAccount
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.data.dao.LocationDao
import org.tasks.data.entity.Place
import org.tasks.data.entity.TagData
import org.tasks.data.dao.TagDataDao
import org.tasks.data.displayName
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.Place
import org.tasks.data.entity.TagData
import org.tasks.data.entity.Task.Companion.NOTIFY_AFTER_DEADLINE
import org.tasks.data.entity.Task.Companion.NOTIFY_AT_DEADLINE
import org.tasks.data.entity.Task.Companion.NOTIFY_AT_START
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.location.LocationPickerActivity
import org.tasks.location.LocationPickerActivity.Companion.EXTRA_PLACE
@ -36,7 +36,6 @@ import org.tasks.tags.TagPickerActivity
import org.tasks.tags.TagPickerActivity.Companion.EXTRA_SELECTED
import javax.inject.Inject
private const val FRAG_TAG_DEFAULT_LIST_SELECTION = "frag_tag_default_list_selection"
private const val FRAG_TAG_CALENDAR_PICKER = "frag_tag_calendar_picker"
private const val REQUEST_CALENDAR_SELECTION = 10011
@ -51,13 +50,9 @@ class TaskDefaults : InjectingPreferenceFragment() {
@Inject lateinit var tagDataDao: TagDataDao
private lateinit var defaultCalendarPref: Preference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.setFilterPickerResultListener(this) {
defaultFilterProvider.defaultList = it
updateRemoteListSummary()
}
private val listPickerLauncher = registerForListPickerResult {
defaultFilterProvider.defaultList = it
updateRemoteListSummary()
}
override fun getPreferenceXml() = R.xml.preferences_task_defaults
@ -74,8 +69,11 @@ class TaskDefaults : InjectingPreferenceFragment() {
findPreference(R.string.p_default_list)
.setOnPreferenceClickListener {
lifecycleScope.launch {
newFilterPicker(defaultFilterProvider.getDefaultList(), true)
.show(childFragmentManager, FRAG_TAG_DEFAULT_LIST_SELECTION)
listPickerLauncher.launch(
context = requireContext(),
selectedFilter = defaultFilterProvider.getDefaultList(),
listsOnly = true,
)
}
false
}

@ -6,8 +6,8 @@ import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.filters.Filter
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.locale.bundle.ListNotificationBundle
@ -20,7 +20,6 @@ class TaskerListNotification : InjectingPreferenceFragment() {
companion object {
const val EXTRA_FILTER = "extra_filter"
private const val REQUEST_SUBSCRIPTION = 10125
private const val FRAG_TAG_FILTER_PICKER = "frag_tag_filter_picker"
fun newTaskerListNotification(filter: String?): TaskerListNotification {
val fragment = TaskerListNotification()
@ -36,17 +35,13 @@ class TaskerListNotification : InjectingPreferenceFragment() {
lateinit var filter: Filter
var cancelled: Boolean = false
private val listPickerLauncher = registerForListPickerResult {
filter = it
refreshPreferences()
}
override fun getPreferenceXml() = R.xml.preferences_tasker
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.setFilterPickerResultListener(this) {
filter = it
refreshPreferences()
}
}
override suspend fun setupPreferences(savedInstanceState: Bundle?) {
filter = if (savedInstanceState == null) {
defaultFilterProvider.getFilterFromPreferenceBlocking(arguments?.getString(EXTRA_FILTER))
@ -57,8 +52,10 @@ class TaskerListNotification : InjectingPreferenceFragment() {
refreshPreferences()
findPreference(R.string.filter).setOnPreferenceClickListener {
newFilterPicker(filter)
.show(childFragmentManager, FRAG_TAG_FILTER_PICKER)
listPickerLauncher.launch(
context = requireContext(),
selectedFilter = filter,
)
false
}

@ -21,12 +21,12 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager
import org.tasks.R
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
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.SortSettingsActivity
import org.tasks.dialogs.ThemePickerDialog.Companion.newThemePickerDialog
import org.tasks.filters.AstridOrderingFilter
@ -48,7 +48,6 @@ class WidgetSettings : 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_FILTER_PICKER = "frag_tag_filter_picker"
fun newWidgetSettings(appWidgetId: Int): WidgetSettings {
val widget = WidgetSettings()
@ -65,17 +64,13 @@ class WidgetSettings : InjectingPreferenceFragment() {
private lateinit var widgetPreferences: WidgetPreferences
private var appWidgetId = 0
private val listPickerLauncher = registerForListPickerResult {
widgetPreferences.setFilter(defaultFilterProvider.getFilterPreferenceValue(it))
updateFilter()
}
override fun getPreferenceXml() = R.xml.preferences_widget
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
childFragmentManager.setFilterPickerResultListener(this) {
widgetPreferences.setFilter(defaultFilterProvider.getFilterPreferenceValue(it))
updateFilter()
}
}
override fun onResume() {
super.onResume()
@ -145,8 +140,7 @@ class WidgetSettings : InjectingPreferenceFragment() {
findPreference(R.string.p_widget_filter)
.setOnPreferenceClickListener {
lifecycleScope.launch {
newFilterPicker(getFilter())
.show(childFragmentManager, FRAG_TAG_FILTER_PICKER)
listPickerLauncher.launch(requireContext(), selectedFilter = getFilter())
}
false
}

@ -3,7 +3,9 @@ package org.tasks.widget
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.Toolbar
import androidx.core.content.IntentCompat
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
@ -11,13 +13,13 @@ import com.google.android.material.textfield.TextInputEditText
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.Strings.isNullOrEmpty
import org.tasks.compose.FilterSelectionActivity.Companion.launch
import org.tasks.compose.FilterSelectionActivity.Companion.registerForListPickerResult
import org.tasks.data.UUIDHelper
import org.tasks.databinding.ActivityWidgetShortcutLayoutBinding
import org.tasks.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
import org.tasks.dialogs.ColorPickerAdapter.Palette
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.filters.Filter
import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.intents.TaskIntents
@ -38,6 +40,13 @@ class ShortcutConfigActivity : ThemedInjectingAppCompatActivity(), ColorPaletteP
private var selectedFilter: Filter? = null
private var selectedTheme = 0
private val listPickerResult = registerForListPickerResult {
if (selectedFilter != null && selectedFilter!!.title == getShortcutName()) {
shortcutName.text = null
}
selectedFilter = it
updateFilterAndTheme()
}
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -66,14 +75,6 @@ class ShortcutConfigActivity : ThemedInjectingAppCompatActivity(), ColorPaletteP
selectedTheme = savedInstanceState.getInt(EXTRA_THEME)
}
updateFilterAndTheme()
supportFragmentManager.setFilterPickerResultListener(this) {
if (selectedFilter != null && selectedFilter!!.title == getShortcutName()) {
shortcutName.text = null
}
selectedFilter = it
updateFilterAndTheme()
}
}
override fun onSaveInstanceState(outState: Bundle) {
@ -90,8 +91,7 @@ class ShortcutConfigActivity : ThemedInjectingAppCompatActivity(), ColorPaletteP
}
private fun showListPicker() {
newFilterPicker(selectedFilter)
.show(supportFragmentManager, FRAG_TAG_FILTER_PICKER)
listPickerResult.launch(context = this, selectedFilter = selectedFilter)
}
private fun showThemePicker() {
@ -145,6 +145,5 @@ class ShortcutConfigActivity : ThemedInjectingAppCompatActivity(), ColorPaletteP
private const val EXTRA_FILTER = "extra_filter"
private const val EXTRA_THEME = "extra_theme"
private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
private const val FRAG_TAG_FILTER_PICKER = "frag_tag_filter_picker"
}
}

@ -14,7 +14,7 @@ import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.runBlocking
import org.tasks.R
import org.tasks.dialogs.FilterPicker
import org.tasks.compose.FilterSelectionActivity
import org.tasks.extensions.setBackgroundColor
import org.tasks.extensions.setColorFilter
import org.tasks.extensions.setRipple
@ -213,9 +213,9 @@ class TasksWidget : AppWidgetProvider() {
}
private fun getChooseListIntent(context: Context, filter: Filter, widgetId: Int): PendingIntent {
val intent = Intent(context, WidgetFilterSelectionActivity::class.java)
val intent = Intent(context, FilterSelectionActivity::class.java)
intent.flags = FLAGS
intent.putExtra(FilterPicker.EXTRA_FILTER, filter)
intent.putExtra(FilterSelectionActivity.EXTRA_FILTER, filter)
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
intent.action = "choose_list"
return PendingIntent.getActivity(

@ -1,51 +0,0 @@
package org.tasks.widget
import android.appwidget.AppWidgetManager
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.LocalBroadcastManager
import org.tasks.dialogs.FilterPicker.Companion.EXTRA_FILTER
import org.tasks.dialogs.FilterPicker.Companion.SELECT_FILTER
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.filters.Filter
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
import timber.log.Timber
import javax.inject.Inject
@AndroidEntryPoint
class WidgetFilterSelectionActivity : AppCompatActivity() {
@Inject lateinit var preferences: Preferences
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1)
if (widgetId == -1) {
Timber.e("Missing ${AppWidgetManager.EXTRA_APPWIDGET_ID}")
finish()
}
supportFragmentManager
.setFragmentResultListener(SELECT_FILTER, this) { _, result ->
val filter: Filter? = result.getParcelable(EXTRA_FILTER)
if (filter == null) {
finish()
return@setFragmentResultListener
}
WidgetPreferences(this, preferences, widgetId)
.setFilter(defaultFilterProvider.getFilterPreferenceValue(filter))
localBroadcastManager.reconfigureWidget(widgetId)
setResult(RESULT_OK, Intent().putExtras(result))
finish()
}
newFilterPicker(intent.getParcelableExtra(EXTRA_FILTER))
.show(supportFragmentManager, FRAG_TAG_FILTER_PICKER)
}
companion object {
private const val FRAG_TAG_FILTER_PICKER = "frag_tag_filter_picker"
}
}

@ -28,17 +28,14 @@
+| | \--- androidx.lifecycle:lifecycle-common-jvm:2.8.1
+| | +--- androidx.annotation:annotation:1.8.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0
+| | | +--- org.jetbrains:annotations:23.0.0
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 (c)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (c)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 2.0.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 (c)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (c)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -63,10 +60,10 @@
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.0 (*)
+| +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -85,14 +82,17 @@
+| \--- androidx.databinding:databinding-common:8.4.1
++--- androidx.databinding:databinding-ktx:8.4.1
+| +--- androidx.databinding:databinding-runtime:8.4.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 -> 2.0.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1 -> 1.8.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.1
+| | \--- androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.1
+| | +--- androidx.annotation:annotation:1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
@ -144,7 +144,7 @@
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
@ -196,8 +196,8 @@
+| \--- androidx.lifecycle:lifecycle-viewmodel-android:2.8.1
+| +--- androidx.annotation:annotation:1.8.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -245,8 +245,8 @@
+| | +--- org.jetbrains.kotlinx:atomicfu:0.17.0
+| | | \--- org.jetbrains.kotlinx:atomicfu-jvm:0.17.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| | \--- androidx.room:room-common:2.7.0-alpha03 (c)
+| +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3
+| | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.3
@ -270,17 +270,334 @@
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.0 (*)
++--- project :kmp
+| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.7
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7
+| | | \--- androidx.compose.runtime:runtime-android:1.6.7
+| | | +--- androidx.collection:collection:1.4.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.8.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | +--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | | \--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
+| | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| +--- project :data (*)
+| +--- org.jetbrains.compose.runtime:runtime:1.6.10
+| | \--- androidx.compose.runtime:runtime:1.6.7
+| | \--- androidx.compose.runtime:runtime-android:1.6.7
+| +--- org.jetbrains.compose.components:components-resources:1.6.10
+| | \--- org.jetbrains.compose.components:components-resources-android:1.6.10
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.0.0 (*)
+| | +--- org.jetbrains.compose.runtime:runtime:1.6.10
+| | | \--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- org.jetbrains.compose.foundation:foundation:1.6.10
+| | | \--- androidx.compose.foundation:foundation:1.6.7
+| | | \--- androidx.compose.foundation:foundation-android:1.6.7
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.collection:collection:1.4.0 (*)
+| | | +--- androidx.compose.animation:animation:1.6.7
+| | | | \--- androidx.compose.animation:animation-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.compose.animation:animation-core:1.6.7
+| | | | | \--- androidx.compose.animation:animation-core-android:1.6.7
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7
+| | | | | | \--- androidx.compose.ui:ui-android:1.6.7
+| | | | | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.0
+| | | | | | | +--- androidx.activity:activity:1.9.0
+| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | | | +--- androidx.core:core:1.13.0
+| | | | | | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | | | | | | | | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+| | | | | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | | | | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*)
+| | | | | | | | | +--- androidx.interpolator:interpolator:1.0.0
+| | | | | | | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.2 -> 2.8.1 (*)
+| | | | | | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | | | | \--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | | \--- androidx.core:core-ktx:1.13.0 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.1
+| | | | | | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*)
+| | | | | | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.0
+| | | | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | | | | +--- androidx.core:core:1.13.0 (*)
+| | | | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | | | \--- androidx.core:core:1.13.0 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (*)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (*)
+| | | | | | | | | +--- androidx.savedstate:savedstate:1.2.1
+| | | | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*)
+| | | | | | | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 -> 2.8.1 (*)
+| | | | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | | | | | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c)
+| | | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | | | | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | | | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*)
+| | | | | | | | +--- androidx.savedstate:savedstate:1.2.1 (*)
+| | | | | | | | +--- androidx.tracing:tracing:1.0.0 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- androidx.activity:activity-compose:1.9.0 (c)
+| | | | | | | | \--- androidx.activity:activity-ktx:1.9.0 (c)
+| | | | | | | +--- androidx.core:core-ktx:1.13.0 (*)
+| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.1 (*)
+| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.1
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | | | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1
+| | | | | | | | +--- androidx.savedstate:savedstate:1.2.1 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | | | | | | \--- androidx.savedstate:savedstate:1.2.1 (c)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- androidx.activity:activity:1.9.0 (c)
+| | | | | | | \--- androidx.activity:activity-compose:1.9.0 (c)
+| | | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | | | | | +--- androidx.autofill:autofill:1.0.0
+| | | | | | | \--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | +--- androidx.compose.runtime:runtime-saveable:1.6.7
+| | | | | | | \--- androidx.compose.runtime:runtime-saveable-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| | | | | | | \--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7
+| | | | | | | \--- androidx.compose.ui:ui-geometry-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7
+| | | | | | | | \--- androidx.compose.ui:ui-util-android:1.6.7
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7
+| | | | | | | \--- androidx.compose.ui:ui-graphics-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7
+| | | | | | | | \--- androidx.compose.ui:ui-unit-android:1.6.7
+| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.0
+| | | | | | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | | | | | \--- androidx.collection:collection:1.4.0 (c)
+| | | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-text:1.6.7
+| | | | | | | \--- androidx.compose.ui:ui-text-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime-saveable:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0
+| | | | | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | | | | | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | | | | | | | +--- androidx.core:core:1.3.0 -> 1.13.0 (*)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.8.1 (*)
+| | | | | | | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*)
+| | | | | | | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | | | | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | | | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.0 (*)
+| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.0 (*)
+| | | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.8.0 (*)
+| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | | \--- androidx.compose.animation:animation:1.6.7 (c)
+| | | | +--- androidx.compose.foundation:foundation-layout:1.6.7
+| | | | | \--- androidx.compose.foundation:foundation-layout-android:1.6.7
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.7 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | | \--- androidx.compose.foundation:foundation:1.6.7 (c)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | \--- androidx.compose.animation:animation-core:1.6.7 (c)
+| | | +--- androidx.compose.foundation:foundation-layout:1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-text:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | | \--- androidx.compose.foundation:foundation-layout:1.6.7 (c)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*)
+| +--- org.jetbrains.compose.foundation:foundation:1.6.10 (*)
+| +--- org.jetbrains.compose.material3:material3:1.6.10
+| | \--- androidx.compose.material3:material3:1.2.1
+| | \--- androidx.compose.material3:material3-android:1.2.1
+| | +--- androidx.activity:activity-compose:1.5.0 -> 1.9.0
+| | | +--- androidx.activity:activity-ktx:1.9.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.7 (*)
+| | | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.7 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.activity:activity:1.9.0 (c)
+| | | \--- androidx.activity:activity-ktx:1.9.0 (c)
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | +--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | \--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
+| | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.6.7
+| | | \--- androidx.compose.material:material-icons-core-android:1.6.7
+| | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.compose.material:material:1.6.7 (c)
+| | | +--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| | | \--- androidx.compose.material:material-ripple:1.6.7 (c)
+| | +--- androidx.compose.material:material-ripple:1.6.0 -> 1.6.7
+| | | \--- androidx.compose.material:material-ripple-android:1.6.7
+| | | +--- androidx.compose.animation:animation:1.6.7 (*)
+| | | +--- androidx.compose.foundation:foundation:1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- androidx.compose.material:material:1.6.7 (c)
+| | | +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| | | \--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | \--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| +--- org.jetbrains.compose.material:material-icons-extended:1.6.10
+| | \--- androidx.compose.material:material-icons-extended:1.6.7
+| | \--- androidx.compose.material:material-icons-extended-android:1.6.7
+| | +--- androidx.compose.material:material-icons-core:1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.material:material:1.6.7 (c)
+| | +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| | \--- androidx.compose.material:material-ripple:1.6.7 (c)
+| +--- org.jetbrains.compose.runtime:runtime:1.6.10 (*)
+| +--- co.touchlab:kermit:2.0.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.0 (*)
++--- com.github.bitfireAT:dav4jvm:2.2.1
@ -316,23 +633,7 @@
+| +--- commons-io:commons-io:2.6
+| +--- org.slf4j:slf4j-jdk14:2.0.3
+| | \--- org.slf4j:slf4j-api:2.0.3
+| \--- androidx.core:core-ktx:1.9.0 -> 1.13.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| +--- androidx.core:core:1.13.0
+| | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | +--- androidx.concurrent:concurrent-futures:1.0.0 -> 1.1.0 (*)
+| | +--- androidx.interpolator:interpolator:1.0.0
+| | | \--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.2 -> 2.8.1 (*)
+| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | \--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | \--- androidx.core:core-ktx:1.13.0 (c)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| \--- androidx.core:core:1.13.0 (c)
+| \--- androidx.core:core-ktx:1.9.0 -> 1.13.0 (*)
++--- com.github.bitfireAT:cert4android:7814052
+| +--- androidx.databinding:databinding-common:7.2.0 -> 8.4.1
+| +--- androidx.databinding:databinding-runtime:7.2.0 -> 8.4.1 (*)
@ -340,44 +641,7 @@
+| +--- androidx.databinding:databinding-ktx:7.2.0 -> 8.4.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21 -> 2.0.0 (*)
+| +--- androidx.appcompat:appcompat:1.4.1 -> 1.7.0
+| | +--- androidx.activity:activity:1.7.0 -> 1.9.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | +--- androidx.core:core:1.13.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1 -> 2.8.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.8.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.13.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.1
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.arch.core:core-common:2.1.0 -> 2.2.0 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-common:2.6.1 -> 2.8.1 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.1 (*)
+| | | +--- androidx.tracing:tracing:1.0.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.activity:activity-compose:1.9.0 (c)
+| | | \--- androidx.activity:activity-ktx:1.9.0 (c)
+| | +--- androidx.activity:activity:1.7.0 -> 1.9.0 (*)
+| | +--- androidx.annotation:annotation:1.3.0 -> 1.8.0 (*)
+| | +--- androidx.appcompat:appcompat-resources:1.7.0
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
@ -404,13 +668,7 @@
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.core:core:1.3.0 -> 1.13.0 (*)
+| | | \--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | +--- androidx.emoji2:emoji2:1.3.0
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | | +--- androidx.core:core:1.3.0 -> 1.13.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-process:2.4.1 -> 2.8.1 (*)
+| | | +--- androidx.startup:startup-runtime:1.0.0 -> 1.1.1 (*)
+| | | \--- androidx.emoji2:emoji2-views-helper:1.3.0 (c)
+| | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | +--- androidx.emoji2:emoji2-views-helper:1.2.0 -> 1.3.0
+| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | | +--- androidx.core:core:1.3.0 -> 1.13.0 (*)
@ -463,7 +721,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -477,23 +735,7 @@
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1 -> 2.8.1
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1 -> 2.8.1 (*)
+| +--- com.google.android.material:material:1.6.0 -> 1.12.0
+| | +--- org.jetbrains.kotlin:kotlin-bom:1.8.22
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (c)
@ -536,9 +778,7 @@
+| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| | | \--- androidx.viewpager2:viewpager2:1.1.0-beta02 (c)
+| | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 (*)
+| | +--- androidx.transition:transition:1.5.0
@ -594,21 +834,8 @@
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.21 -> 2.0.0 (*)
+| \--- com.google.dagger:hilt-android:2.49 -> 2.50 (*)
++--- androidx.fragment:fragment-ktx:1.7.1
+| +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.0
+| | +--- androidx.activity:activity:1.9.0 (*)
+| | +--- androidx.core:core-ktx:1.13.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.1
+| | | +--- androidx.savedstate:savedstate:1.2.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | \--- androidx.savedstate:savedstate:1.2.1 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.activity:activity:1.9.0 (c)
+| | \--- androidx.activity:activity-compose:1.9.0 (c)
+| +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.0
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | \--- androidx.collection:collection:1.4.0 (c)
+| +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.0 (*)
+| +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.0 (*)
+| +--- androidx.core:core-ktx:1.2.0 -> 1.13.0 (*)
+| +--- androidx.fragment:fragment:1.7.1 (*)
+| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 -> 2.8.1 (*)
@ -652,219 +879,7 @@
++--- com.github.franmontiel:PersistentCookieJar:1.0.1
+| \--- com.squareup.okhttp3:okhttp:3.1.2 -> 4.12.0 (*)
++--- com.google.android.material:material:1.12.0 (*)
++--- androidx.compose.material3:material3 -> 1.2.1
+| \--- androidx.compose.material3:material3-android:1.2.1
+| +--- androidx.activity:activity-compose:1.5.0 -> 1.9.0
+| | +--- androidx.activity:activity-ktx:1.9.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.7
+| | | \--- androidx.compose.runtime:runtime-saveable-android:1.6.7
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| | | \--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.7
+| | | \--- androidx.compose.ui:ui-android:1.6.7
+| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.0 (*)
+| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | +--- androidx.collection:collection:1.4.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.6.7
+| | | | \--- androidx.compose.ui:ui-geometry-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7
+| | | | | \--- androidx.compose.ui:ui-util-android:1.6.7
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.6.7
+| | | | \--- androidx.compose.ui:ui-graphics-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*)
+| | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7
+| | | | | \--- androidx.compose.ui:ui-unit-android:1.6.7
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-text:1.6.7
+| | | | \--- androidx.compose.ui:ui-text-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.7 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.activity:activity:1.9.0 (c)
+| | \--- androidx.activity:activity-ktx:1.9.0 (c)
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+| +--- androidx.collection:collection:1.4.0 (*)
+| +--- androidx.compose.animation:animation-core:1.6.0 -> 1.6.7
+| | \--- androidx.compose.animation:animation-core-android:1.6.7
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | \--- androidx.compose.animation:animation:1.6.7 (c)
+| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7
+| | \--- androidx.compose.foundation:foundation-android:1.6.7
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | +--- androidx.compose.animation:animation:1.6.7
+| | | \--- androidx.compose.animation:animation-android:1.6.7
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.6.7 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.6.7
+| | | | \--- androidx.compose.foundation:foundation-layout-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.7 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | \--- androidx.compose.foundation:foundation:1.6.7 (c)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | \--- androidx.compose.animation:animation-core:1.6.7 (c)
+| | +--- androidx.compose.foundation:foundation-layout:1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-text:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | \--- androidx.compose.foundation:foundation-layout:1.6.7 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.6.7
+| | \--- androidx.compose.material:material-icons-core-android:1.6.7
+| | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.compose.material:material:1.6.7 (c)
+| | +--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| | \--- androidx.compose.material:material-ripple:1.6.7 (c)
+| +--- androidx.compose.material:material-ripple:1.6.0 -> 1.6.7
+| | \--- androidx.compose.material:material-ripple-android:1.6.7
+| | +--- androidx.compose.animation:animation:1.6.7 (*)
+| | +--- androidx.compose.foundation:foundation:1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.compose.material:material:1.6.7 (c)
+| | +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| | \--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-text:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-util:1.6.0 -> 1.6.7 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
++--- androidx.compose.material3:material3 -> 1.2.1 (*)
++--- androidx.constraintlayout:constraintlayout:2.1.4 (*)
++--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
@ -883,7 +898,7 @@
+| | +--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| | +--- androidx.window:window:1.0.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.8.0 (*)
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | | \--- androidx.core:core:1.3.2 -> 1.13.0 (*)
@ -931,7 +946,7 @@
++--- androidx.work:work-runtime-ktx:2.8.1
+| +--- androidx.work:work-runtime:2.8.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.21 -> 2.0.0 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
++--- com.etebase:client:2.3.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| \--- com.squareup.okhttp3:logging-interceptor:3.12.1
@ -964,6 +979,7 @@
+| +--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| +--- androidx.compose.ui:ui:1.6.7 (c)
+| +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.7 (c)
+| +--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
@ -973,7 +989,6 @@
+| +--- androidx.compose.material:material-icons-extended-android:1.6.7 (c)
+| +--- androidx.compose.material3:material3-android:1.2.1 (c)
+| +--- androidx.compose.ui:ui-android:1.6.7 (c)
+| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime-android:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime-saveable-android:1.6.7 (c)
+| +--- androidx.compose.ui:ui-util-android:1.6.7 (c)
@ -1013,7 +1028,6 @@
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| +--- androidx.savedstate:savedstate:1.2.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| +--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| \--- androidx.compose.material:material-ripple:1.6.7 (c)
@ -1026,14 +1040,7 @@
+| +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| \--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
++--- androidx.activity:activity-compose:1.9.0 (*)
++--- androidx.compose.material:material-icons-extended -> 1.6.7
+| \--- androidx.compose.material:material-icons-extended-android:1.6.7
+| +--- androidx.compose.material:material-icons-core:1.6.7 (*)
+| +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| +--- androidx.compose.material:material:1.6.7 (c)
+| +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| \--- androidx.compose.material:material-ripple:1.6.7 (c)
++--- androidx.compose.material:material-icons-extended -> 1.6.7 (*)
++--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1
+| \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.1
+| +--- androidx.annotation:annotation:1.8.0 (*)
@ -1070,23 +1077,13 @@
+| +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| \--- androidx.compose.ui:ui-unit:1.6.7 (c)
++--- androidx.compose.ui:ui-tooling-preview -> 1.6.7
+| \--- androidx.compose.ui:ui-tooling-preview-android:1.6.7
+| +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| +--- androidx.compose.ui:ui:1.6.7 (c)
+| +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| \--- androidx.compose.ui:ui-tooling-preview-android:1.6.7 (*)
++--- io.coil-kt:coil-compose:2.6.0
+| +--- io.coil-kt:coil-compose-base:2.6.0
+| | +--- androidx.core:core-ktx:1.12.0 -> 1.13.0 (*)
+| | +--- com.google.accompanist:accompanist-drawablepainter:0.32.0
+| | | +--- androidx.compose.ui:ui:1.5.0 -> 1.6.7 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 -> 2.0.0 (*)
+| | +--- io.coil-kt:coil-base:2.6.0
+| | | +--- androidx.annotation:annotation:1.7.1 -> 1.8.0 (*)
@ -1097,7 +1094,7 @@
+| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.7.0 -> 2.8.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.12.0 (*)
+| | | \--- com.squareup.okio:okio:3.8.0 (*)
@ -1124,15 +1121,15 @@
++--- com.google.accompanist:accompanist-flowlayout:0.34.0
+| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-util:1.6.0 -> 1.6.7 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
++--- com.google.accompanist:accompanist-permissions:0.34.0
+| +--- androidx.activity:activity-compose:1.7.2 -> 1.9.0 (*)
+| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
+\--- com.google.accompanist:accompanist-systemuicontroller:0.34.0
+ +--- androidx.core:core-ktx:1.8.0 -> 1.13.0 (*)
+ +--- androidx.compose.ui:ui:1.6.0 -> 1.6.7 (*)
+ +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+ +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)

@ -28,18 +28,15 @@
+| | \--- androidx.lifecycle:lifecycle-common-jvm:2.8.1
+| | +--- androidx.annotation:annotation:1.8.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0
+| | | +--- org.jetbrains:annotations:23.0.0
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.3 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (c)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3 (c)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 2.0.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (c)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.0 (c)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -64,10 +61,10 @@
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | \--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.0 (*)
+| +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -86,14 +83,17 @@
+| \--- androidx.databinding:databinding-common:8.4.1
++--- androidx.databinding:databinding-ktx:8.4.1
+| +--- androidx.databinding:databinding-runtime:8.4.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20 -> 2.0.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1 -> 1.8.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.1
+| | \--- androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.1
+| | +--- androidx.annotation:annotation:1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
@ -145,7 +145,7 @@
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
@ -197,8 +197,8 @@
+| \--- androidx.lifecycle:lifecycle-viewmodel-android:2.8.1
+| +--- androidx.annotation:annotation:1.8.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -224,9 +224,9 @@
++--- com.google.firebase:firebase-crashlytics -> 19.0.0
+| +--- com.google.firebase:firebase-sessions:2.0.0
+| | +--- com.google.firebase:firebase-common:21.0.0
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4 -> 1.7.3
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4 -> 1.8.0
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0 (*)
+| | | | +--- com.google.android.gms:play-services-tasks:16.0.1 -> 18.2.0
+| | | | | \--- com.google.android.gms:play-services-basement:18.4.0
+| | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
@ -267,7 +267,7 @@
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | | | | | | \--- androidx.savedstate:savedstate-ktx:1.2.1 (c)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | | | | | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -311,7 +311,7 @@
+| | | | | | \--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | \--- androidx.fragment:fragment-ktx:1.7.1 (c)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20 -> 2.0.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.21 -> 2.0.0 (*)
+| | | +--- com.google.firebase:firebase-components:18.0.0
+| | | | +--- com.google.firebase:firebase-annotations:16.2.0
+| | | | | \--- javax.inject:javax.inject:1
@ -369,11 +369,11 @@
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.0 (*)
+| | | +--- androidx.datastore:datastore:1.0.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.8.0 (*)
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | | \--- androidx.datastore:datastore-core:1.0.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.7.3 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0 -> 1.8.0 (*)
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | \--- androidx.datastore:datastore-preferences-core:1.0.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.10 -> 2.0.0 (*)
@ -423,7 +423,7 @@
+| | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | | | +--- androidx.core:core-ktx:1.8.0 -> 1.13.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | \--- androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05 (c)
+| | | +--- androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
@ -435,7 +435,7 @@
+| | | | | \--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
+| | | | +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.21 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | \--- androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05 (c)
+| | | +--- com.google.android.gms:play-services-basement:18.3.0 -> 18.4.0 (*)
+| | | +--- com.google.android.gms:play-services-measurement-base:22.0.0 (*)
@ -497,8 +497,8 @@
+| +--- com.google.android.gms:play-services-basement:18.4.0 (*)
+| +--- com.google.android.gms:play-services-tasks:18.2.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.0 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
++--- com.google.android.gms:play-services-maps:18.2.0
+| +--- androidx.fragment:fragment:1.0.0 -> 1.7.1 (*)
+| +--- com.google.android.gms:play-services-base:18.0.1 -> 18.5.0 (*)
@ -516,12 +516,12 @@
+| | +--- com.google.android.gms:play-services-tasks:18.0.1 -> 18.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.22 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0 -> 2.0.0 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0 -> 1.7.3 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0 -> 1.8.0 (*)
++--- com.google.android.play:core:1.10.3
++--- com.google.android.play:core-ktx:1.8.1
+| +--- com.google.android.play:core:1.8.0 -> 1.10.3
+| +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72 -> 2.0.0 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6 -> 1.8.0 (*)
+| +--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| \--- androidx.fragment:fragment:1.1.0 -> 1.7.1 (*)
++--- com.google.android.gms:play-services-oss-licenses:17.1.0
@ -608,8 +608,8 @@
+| | +--- org.jetbrains.kotlinx:atomicfu:0.17.0
+| | | \--- org.jetbrains.kotlinx:atomicfu-jvm:0.17.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| | \--- androidx.room:room-common:2.7.0-alpha03 (c)
+| +--- org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3
+| | \--- org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.3
@ -633,17 +633,275 @@
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.0 (*)
++--- project :kmp
+| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.7
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7
+| | | \--- androidx.compose.runtime:runtime-android:1.6.7
+| | | +--- androidx.collection:collection:1.4.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.8.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | +--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | | \--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
+| | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:2.0.0 (*)
+| +--- project :data (*)
+| +--- org.jetbrains.compose.runtime:runtime:1.6.10
+| | \--- androidx.compose.runtime:runtime:1.6.7
+| | \--- androidx.compose.runtime:runtime-android:1.6.7
+| +--- org.jetbrains.compose.components:components-resources:1.6.10
+| | \--- org.jetbrains.compose.components:components-resources-android:1.6.10
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.23 -> 2.0.0 (*)
+| | +--- org.jetbrains.compose.runtime:runtime:1.6.10
+| | | \--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- org.jetbrains.compose.foundation:foundation:1.6.10
+| | | \--- androidx.compose.foundation:foundation:1.6.7
+| | | \--- androidx.compose.foundation:foundation-android:1.6.7
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.collection:collection:1.4.0 (*)
+| | | +--- androidx.compose.animation:animation:1.6.7
+| | | | \--- androidx.compose.animation:animation-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.compose.animation:animation-core:1.6.7
+| | | | | \--- androidx.compose.animation:animation-core-android:1.6.7
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7
+| | | | | | \--- androidx.compose.ui:ui-android:1.6.7
+| | | | | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.0
+| | | | | | | +--- androidx.activity:activity:1.9.0 (*)
+| | | | | | | +--- androidx.core:core-ktx:1.13.0 (*)
+| | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.1 (*)
+| | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.1
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | | | | | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | | | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| | | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1
+| | | | | | | | +--- androidx.savedstate:savedstate:1.2.1 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | | | | | | \--- androidx.savedstate:savedstate:1.2.1 (c)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- androidx.activity:activity:1.9.0 (c)
+| | | | | | | \--- androidx.activity:activity-compose:1.9.0 (c)
+| | | | | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | | | | | +--- androidx.autofill:autofill:1.0.0
+| | | | | | | \--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | +--- androidx.compose.runtime:runtime-saveable:1.6.7
+| | | | | | | \--- androidx.compose.runtime:runtime-saveable-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| | | | | | | \--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7
+| | | | | | | \--- androidx.compose.ui:ui-geometry-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7
+| | | | | | | | \--- androidx.compose.ui:ui-util-android:1.6.7
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7
+| | | | | | | \--- androidx.compose.ui:ui-graphics-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7
+| | | | | | | | \--- androidx.compose.ui:ui-unit-android:1.6.7
+| | | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.0
+| | | | | | | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | | | | | | \--- androidx.collection:collection:1.4.0 (c)
+| | | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-text:1.6.7
+| | | | | | | \--- androidx.compose.ui:ui-text-android:1.6.7
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | | | +--- androidx.compose.runtime:runtime-saveable:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | | | | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | | | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.0 (*)
+| | | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.0 (*)
+| | | | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | | | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| | | | | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.8.0 (*)
+| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | | +--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.8.0 (*)
+| | | | | \--- androidx.compose.animation:animation:1.6.7 (c)
+| | | | +--- androidx.compose.foundation:foundation-layout:1.6.7
+| | | | | \--- androidx.compose.foundation:foundation-layout-android:1.6.7
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.7 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | | \--- androidx.compose.foundation:foundation:1.6.7 (c)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | \--- androidx.compose.animation:animation-core:1.6.7 (c)
+| | | +--- androidx.compose.foundation:foundation-layout:1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-text:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | | \--- androidx.compose.foundation:foundation-layout:1.6.7 (c)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0 (*)
+| +--- org.jetbrains.compose.foundation:foundation:1.6.10 (*)
+| +--- org.jetbrains.compose.material3:material3:1.6.10
+| | \--- androidx.compose.material3:material3:1.2.1
+| | \--- androidx.compose.material3:material3-android:1.2.1
+| | +--- androidx.activity:activity-compose:1.5.0 -> 1.9.0
+| | | +--- androidx.activity:activity-ktx:1.9.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.7 (*)
+| | | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.7 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.activity:activity:1.9.0 (c)
+| | | \--- androidx.activity:activity-ktx:1.9.0 (c)
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | +--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | \--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
+| | +--- androidx.compose.animation:animation-core:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.6.7
+| | | \--- androidx.compose.material:material-icons-core-android:1.6.7
+| | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.compose.material:material:1.6.7 (c)
+| | | +--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| | | \--- androidx.compose.material:material-ripple:1.6.7 (c)
+| | +--- androidx.compose.material:material-ripple:1.6.0 -> 1.6.7
+| | | \--- androidx.compose.material:material-ripple-android:1.6.7
+| | | +--- androidx.compose.animation:animation:1.6.7 (*)
+| | | +--- androidx.compose.foundation:foundation:1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- androidx.compose.material:material:1.6.7 (c)
+| | | +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| | | \--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| | +--- androidx.compose.runtime:runtime:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.ui:ui-text:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.0 -> 1.6.7 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | \--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| +--- org.jetbrains.compose.material:material-icons-extended:1.6.10
+| | \--- androidx.compose.material:material-icons-extended:1.6.7
+| | \--- androidx.compose.material:material-icons-extended-android:1.6.7
+| | +--- androidx.compose.material:material-icons-core:1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.material:material:1.6.7 (c)
+| | +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| | \--- androidx.compose.material:material-ripple:1.6.7 (c)
+| +--- org.jetbrains.compose.runtime:runtime:1.6.10 (*)
+| +--- co.touchlab:kermit:2.0.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-parcelize-runtime:2.0.0 (*)
++--- com.github.bitfireAT:dav4jvm:2.2.1
@ -703,7 +961,7 @@
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
@ -717,23 +975,7 @@
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1 -> 2.8.1
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| | \--- androidx.lifecycle:lifecycle-common-java8:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1 -> 2.8.1 (*)
+| +--- com.google.android.material:material:1.6.0 -> 1.12.0
+| | +--- org.jetbrains.kotlin:kotlin-bom:1.8.22
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (c)
@ -767,9 +1009,7 @@
+| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | +--- androidx.customview:customview:1.0.0 -> 1.1.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.13.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 2.0.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| | | \--- androidx.viewpager2:viewpager2:1.1.0-beta02 (c)
+| | +--- androidx.resourceinspection:resourceinspection-annotation:1.0.1 (*)
+| | +--- androidx.transition:transition:1.5.0
@ -825,21 +1065,8 @@
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.21 -> 2.0.0 (*)
+| \--- com.google.dagger:hilt-android:2.49 -> 2.50 (*)
++--- androidx.fragment:fragment-ktx:1.7.1
+| +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.0
+| | +--- androidx.activity:activity:1.9.0 (*)
+| | +--- androidx.core:core-ktx:1.13.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.6.1 -> 2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1 -> 2.8.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.1
+| | | +--- androidx.savedstate:savedstate:1.2.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 2.0.0 (*)
+| | | \--- androidx.savedstate:savedstate:1.2.1 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.activity:activity:1.9.0 (c)
+| | \--- androidx.activity:activity-compose:1.9.0 (c)
+| +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.0
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | \--- androidx.collection:collection:1.4.0 (c)
+| +--- androidx.activity:activity-ktx:1.8.1 -> 1.9.0 (*)
+| +--- androidx.collection:collection-ktx:1.1.0 -> 1.4.0 (*)
+| +--- androidx.core:core-ktx:1.2.0 -> 1.13.0 (*)
+| +--- androidx.fragment:fragment:1.7.1 (*)
+| +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.1 -> 2.8.1 (*)
@ -883,219 +1110,7 @@
++--- com.github.franmontiel:PersistentCookieJar:1.0.1
+| \--- com.squareup.okhttp3:okhttp:3.1.2 -> 4.12.0 (*)
++--- com.google.android.material:material:1.12.0 (*)
++--- androidx.compose.material3:material3 -> 1.2.1
+| \--- androidx.compose.material3:material3-android:1.2.1
+| +--- androidx.activity:activity-compose:1.5.0 -> 1.9.0
+| | +--- androidx.activity:activity-ktx:1.9.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.6.7
+| | | \--- androidx.compose.runtime:runtime-saveable-android:1.6.7
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| | | \--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.6.7
+| | | \--- androidx.compose.ui:ui-android:1.6.7
+| | | +--- androidx.activity:activity-ktx:1.7.0 -> 1.9.0 (*)
+| | | +--- androidx.annotation:annotation:1.6.0 -> 1.8.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | +--- androidx.collection:collection:1.4.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.6.7
+| | | | \--- androidx.compose.ui:ui-geometry-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7
+| | | | | \--- androidx.compose.ui:ui-util-android:1.6.7
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.6.7
+| | | | \--- androidx.compose.ui:ui-graphics-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.7.0 -> 1.8.0 (*)
+| | | | +--- androidx.collection:collection:1.4.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7
+| | | | | \--- androidx.compose.ui:ui-unit-android:1.6.7
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | | +--- androidx.collection:collection-ktx:1.2.0 -> 1.4.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-text:1.6.7
+| | | | \--- androidx.compose.ui:ui-text-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.4.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | | \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0 (*)
+| | | +--- androidx.emoji2:emoji2:1.2.0 -> 1.3.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.0 -> 1.3.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1 -> 1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| | | +--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| | | \--- androidx.compose.foundation:foundation:1.4.0 -> 1.6.7 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.activity:activity:1.9.0 (c)
+| | \--- androidx.activity:activity-ktx:1.9.0 (c)
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| +--- androidx.annotation:annotation-experimental:1.4.0 -> 1.4.1 (*)
+| +--- androidx.collection:collection:1.4.0 (*)
+| +--- androidx.compose.animation:animation-core:1.6.0 -> 1.6.7
+| | \--- androidx.compose.animation:animation-core-android:1.6.7
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-unit:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1 -> 1.7.3 (*)
+| | \--- androidx.compose.animation:animation:1.6.7 (c)
+| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7
+| | \--- androidx.compose.foundation:foundation-android:1.6.7
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.collection:collection:1.4.0 (*)
+| | +--- androidx.compose.animation:animation:1.6.7
+| | | \--- androidx.compose.animation:animation-android:1.6.7
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.6.7 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.6.7
+| | | | \--- androidx.compose.foundation:foundation-layout-android:1.6.7
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | | | +--- androidx.compose.animation:animation-core:1.2.1 -> 1.6.7 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.13.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | | \--- androidx.compose.foundation:foundation:1.6.7 (c)
+| | | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.6.7 (*)
+| | | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | | \--- androidx.compose.animation:animation-core:1.6.7 (c)
+| | +--- androidx.compose.foundation:foundation-layout:1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-text:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | +--- androidx.core:core:1.12.0 -> 1.13.0 (*)
+| | +--- androidx.emoji2:emoji2:1.3.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | \--- androidx.compose.foundation:foundation-layout:1.6.7 (c)
+| +--- androidx.compose.foundation:foundation-layout:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.material:material-icons-core:1.6.0 -> 1.6.7
+| | \--- androidx.compose.material:material-icons-core-android:1.6.7
+| | +--- androidx.compose.ui:ui:1.6.7 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.8.22 -> 2.0.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.compose.material:material:1.6.7 (c)
+| | +--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| | \--- androidx.compose.material:material-ripple:1.6.7 (c)
+| +--- androidx.compose.material:material-ripple:1.6.0 -> 1.6.7
+| | \--- androidx.compose.material:material-ripple-android:1.6.7
+| | +--- androidx.compose.animation:animation:1.6.7 (*)
+| | +--- androidx.compose.foundation:foundation:1.6.7 (*)
+| | +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| | +--- androidx.compose.ui:ui-util:1.6.7 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| | +--- androidx.compose.material:material:1.6.7 (c)
+| | +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| | \--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-graphics:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-text:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-util:1.6.0 -> 1.6.7 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.6.1 -> 2.8.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-livedata-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-process:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-service:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.1 (c)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.1 (c)
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
++--- androidx.compose.material3:material3 -> 1.2.1 (*)
++--- androidx.constraintlayout:constraintlayout:2.1.4 (*)
++--- androidx.swiperefreshlayout:swiperefreshlayout:1.1.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
@ -1114,7 +1129,7 @@
+| | +--- androidx.core:core:1.1.0 -> 1.13.0 (*)
+| | +--- androidx.window:window:1.0.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.0 -> 2.0.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2 -> 1.8.0 (*)
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | +--- androidx.collection:collection:1.1.0 -> 1.4.0 (*)
+| | | \--- androidx.core:core:1.3.2 -> 1.13.0 (*)
@ -1160,7 +1175,7 @@
++--- androidx.work:work-runtime-ktx:2.8.1
+| +--- androidx.work:work-runtime:2.8.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.21 -> 2.0.0 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
++--- com.etebase:client:2.3.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.8.0 (*)
+| \--- com.squareup.okhttp3:logging-interceptor:3.12.1
@ -1193,6 +1208,7 @@
+| +--- androidx.compose.runtime:runtime-livedata:1.6.7 (c)
+| +--- androidx.compose.ui:ui:1.6.7 (c)
+| +--- androidx.compose.ui:ui-tooling-preview:1.6.7 (c)
+| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.7 (c)
+| +--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
@ -1202,7 +1218,6 @@
+| +--- androidx.compose.material:material-icons-extended-android:1.6.7 (c)
+| +--- androidx.compose.material3:material3-android:1.2.1 (c)
+| +--- androidx.compose.ui:ui-android:1.6.7 (c)
+| +--- androidx.compose.ui:ui-tooling-preview-android:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime-android:1.6.7 (c)
+| +--- androidx.compose.runtime:runtime-saveable-android:1.6.7 (c)
+| +--- androidx.compose.ui:ui-util-android:1.6.7 (c)
@ -1242,7 +1257,6 @@
+| +--- androidx.lifecycle:lifecycle-runtime:2.6.1 -> 2.8.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.6.1 -> 2.8.1 (*)
+| +--- androidx.savedstate:savedstate:1.2.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| +--- androidx.compose.material:material-icons-extended:1.6.7 (c)
+| \--- androidx.compose.material:material-ripple:1.6.7 (c)
@ -1255,14 +1269,7 @@
+| +--- androidx.compose.runtime:runtime:1.6.7 (c)
+| \--- androidx.compose.runtime:runtime-saveable:1.6.7 (c)
++--- androidx.activity:activity-compose:1.9.0 (*)
++--- androidx.compose.material:material-icons-extended -> 1.6.7
+| \--- androidx.compose.material:material-icons-extended-android:1.6.7
+| +--- androidx.compose.material:material-icons-core:1.6.7 (*)
+| +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| +--- androidx.compose.material:material:1.6.7 (c)
+| +--- androidx.compose.material:material-icons-core:1.6.7 (c)
+| \--- androidx.compose.material:material-ripple:1.6.7 (c)
++--- androidx.compose.material:material-icons-extended -> 1.6.7 (*)
++--- androidx.lifecycle:lifecycle-viewmodel-compose:2.8.1
+| \--- androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.1
+| +--- androidx.annotation:annotation:1.8.0 (*)
@ -1299,23 +1306,13 @@
+| +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| \--- androidx.compose.ui:ui-unit:1.6.7 (c)
++--- androidx.compose.ui:ui-tooling-preview -> 1.6.7
+| \--- androidx.compose.ui:ui-tooling-preview-android:1.6.7
+| +--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| +--- androidx.compose.runtime:runtime:1.6.7 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.8.22 -> 2.0.0 (*)
+| +--- androidx.compose.ui:ui:1.6.7 (c)
+| +--- androidx.compose.ui:ui-geometry:1.6.7 (c)
+| +--- androidx.compose.ui:ui-graphics:1.6.7 (c)
+| +--- androidx.compose.ui:ui-text:1.6.7 (c)
+| +--- androidx.compose.ui:ui-unit:1.6.7 (c)
+| +--- androidx.compose.ui:ui-util:1.6.7 (c)
+| \--- androidx.compose.ui:ui-viewbinding:1.6.7 (c)
+| \--- androidx.compose.ui:ui-tooling-preview-android:1.6.7 (*)
++--- io.coil-kt:coil-compose:2.6.0
+| +--- io.coil-kt:coil-compose-base:2.6.0
+| | +--- androidx.core:core-ktx:1.12.0 -> 1.13.0 (*)
+| | +--- com.google.accompanist:accompanist-drawablepainter:0.32.0
+| | | +--- androidx.compose.ui:ui:1.5.0 -> 1.6.7 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0 -> 2.0.0 (*)
+| | +--- io.coil-kt:coil-base:2.6.0
+| | | +--- androidx.annotation:annotation:1.7.1 -> 1.8.0 (*)
@ -1326,7 +1323,7 @@
+| | | | \--- androidx.annotation:annotation:1.2.0 -> 1.8.0 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.3.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.7.0 -> 2.8.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3 -> 1.8.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.12.0 (*)
+| | | \--- com.squareup.okio:okio:3.8.0 (*)
@ -1353,15 +1350,15 @@
++--- com.google.accompanist:accompanist-flowlayout:0.34.0
+| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7 (*)
+| +--- androidx.compose.ui:ui-util:1.6.0 -> 1.6.7 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
++--- com.google.accompanist:accompanist-permissions:0.34.0
+| +--- androidx.activity:activity-compose:1.7.2 -> 1.9.0 (*)
+| +--- androidx.compose.foundation:foundation:1.6.0 -> 1.6.7 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)
+\--- com.google.accompanist:accompanist-systemuicontroller:0.34.0
+ +--- androidx.core:core-ktx:1.8.0 -> 1.13.0 (*)
+ +--- androidx.compose.ui:ui:1.6.0 -> 1.6.7 (*)
+ +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.7.3 (*)
+ +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 -> 1.8.0 (*)
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22 -> 2.0.0 (*)

@ -158,6 +158,7 @@ retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.re
shortcut-badger = { module = "me.leolin:ShortcutBadger", version.ref = "shortcut-badger" }
timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
xpp3 = { module = "org.ogce:xpp3", version.ref = "xpp3" }
androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version = "1.6.7" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }

@ -21,8 +21,15 @@ kotlin {
}
jvm()
sourceSets {
androidMain.dependencies {
implementation(libs.androidx.ui.tooling.preview.android)
}
commonMain.dependencies {
implementation(projects.data)
implementation(compose.components.resources)
implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.materialIconsExtended)
implementation(compose.runtime)
implementation(libs.kermit)
}
@ -44,6 +51,10 @@ android {
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures {
compose = true
}
dependencies {
debugImplementation(compose.uiTooling)
}

@ -0,0 +1,51 @@
package org.tasks.previews
import android.content.res.Configuration
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.AllInbox
import androidx.compose.material.icons.outlined.QuestionMark
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import org.tasks.compose.pickers.SearchableFilterPicker
import org.tasks.filters.FilterImpl
import org.tasks.filters.NavigationDrawerSubheader
// this doesn't actually work yet b/c of multiplatform resources
// https://github.com/JetBrains/compose-multiplatform/issues/4932
@Preview(widthDp = 320)
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES, widthDp = 320)
@Composable
fun FilterPickerPreview() {
MaterialTheme(
colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
) {
SearchableFilterPicker(
filters = listOf(
FilterImpl("My Tasks", icon = 4),
NavigationDrawerSubheader(
"Filters",
false,
false,
NavigationDrawerSubheader.SubheaderType.PREFERENCE,
0L,
),
),
query = "",
onQueryChange = {},
active = true,
selected = null,
onClick = {},
getIcon = { when (it.icon) {
4 -> Icons.Outlined.AllInbox
else -> Icons.Outlined.QuestionMark
} },
getColor = { 0 },
dismiss = {},
)
}
}

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="search">Search</string>
</resources>

@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material.ContentAlpha
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Check
import androidx.compose.material3.Icon
@ -17,12 +16,12 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
@Composable
fun CheckableIconRow(
icon: Painter,
icon: ImageVector,
tint: Color,
text: String,
selected: Boolean,
@ -45,7 +44,7 @@ fun CheckableIconRow(
@Composable
fun CheckableIconRow(
icon: Painter,
icon: ImageVector,
tint: Color,
selected: Boolean,
onClick: () -> Unit,
@ -58,9 +57,9 @@ fun CheckableIconRow(
.clickable { onClick() }
) {
Icon(
painter = icon,
imageVector = icon,
contentDescription = null,
tint = tint.copy(alpha = ContentAlpha.medium),
tint = tint,
modifier = Modifier.padding(start = 16.dp, end = 32.dp, top = 12.dp, bottom = 12.dp),
)
Box(modifier = Modifier.weight(1f)) {
@ -70,7 +69,7 @@ fun CheckableIconRow(
Icon(
imageVector = Icons.Outlined.Check,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface.copy(alpha = ContentAlpha.medium),
tint = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp),
)
} else {

@ -7,7 +7,6 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.ContentAlpha
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.KeyboardArrowUp
import androidx.compose.material3.Icon
@ -49,7 +48,7 @@ fun CollapsibleRow(
Icon(
imageVector = Icons.Outlined.KeyboardArrowUp,
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface.copy(alpha = ContentAlpha.medium),
tint = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.rotate(rotationAngle)
)
}

@ -0,0 +1,157 @@
package org.tasks.compose.pickers
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Clear
import androidx.compose.material.icons.outlined.PeopleOutline
import androidx.compose.material.icons.outlined.PermIdentity
import androidx.compose.material.icons.outlined.Search
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SearchBar
import androidx.compose.material3.SearchBarDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment.Companion.CenterVertically
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.font.FontWeight
import org.jetbrains.compose.resources.stringResource
import org.tasks.filters.CaldavFilter
import org.tasks.filters.Filter
import org.tasks.filters.FilterListItem
import org.tasks.filters.NavigationDrawerSubheader
import tasks.kmp.generated.resources.Res
import tasks.kmp.generated.resources.search
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchableFilterPicker(
filters: List<FilterListItem>,
query: String,
onQueryChange: (String) -> Unit,
active: Boolean,
selected: Filter?,
onClick: (FilterListItem) -> Unit,
getIcon: @Composable (Filter) -> ImageVector,
getColor: (Filter) -> Int,
dismiss: () -> Unit,
) {
val searching by remember(query) {
derivedStateOf {
query.isNotBlank()
}
}
val filtered by remember (filters, query) {
derivedStateOf {
filters.filter {
when (it) {
is NavigationDrawerSubheader -> true
is Filter -> {
it.title!!.contains(query, ignoreCase = true)
}
else -> throw IllegalArgumentException()
}
}
}
}
SearchBar(
colors = SearchBarDefaults.colors(
containerColor = MaterialTheme.colorScheme.surface,
inputFieldColors = TextFieldDefaults.colors(
focusedContainerColor = MaterialTheme.colorScheme.surface,
unfocusedContainerColor = MaterialTheme.colorScheme.surface,
)
),
query = query,
onQueryChange = onQueryChange,
onSearch = {
// TODO: close keyboard?
},
leadingIcon = {
Icon(
imageVector = Icons.Outlined.Search,
contentDescription = null,
)
},
placeholder = {
Text(
text = stringResource(Res.string.search),
color = MaterialTheme.colorScheme.onSurface,
)
},
trailingIcon = {
if (searching) {
IconButton(onClick = { onQueryChange("") }) {
Icon(
imageVector = Icons.Outlined.Clear,
contentDescription = "Clear query",
)
}
}
},
active = active,
onActiveChange = {
when {
it -> {}
query.isNotBlank() -> onQueryChange("")
else -> dismiss()
}
},
content = {
Column(
modifier = Modifier.verticalScroll(rememberScrollState())
) {
filtered.forEach { filter ->
when (filter) {
is NavigationDrawerSubheader -> {
CollapsibleRow(
text = filter.title!!,
collapsed = filter.isCollapsed,
onClick = { onClick(filter) },
)
}
is Filter -> {
CheckableIconRow(
icon = getIcon(filter),
tint = remember(filter) { Color(getColor(filter)) },
selected = filter == selected,
onClick = { onClick(filter) },
) {
Row(verticalAlignment = CenterVertically) {
Text(
text = filter.title!!,
style = MaterialTheme.typography.bodyMedium.copy(
fontWeight = FontWeight.Medium
),
modifier = Modifier.weight(1f),
)
if (filter is CaldavFilter && filter.principals > 0) {
Icon(
imageVector = when (filter.principals) {
in 2..Int.MAX_VALUE -> Icons.Outlined.PeopleOutline
else -> Icons.Outlined.PermIdentity
},
contentDescription = null,
)
}
}
}
}
}
}
}
},
)
}
Loading…
Cancel
Save