diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d0eef34b4..ba94900a7 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -207,7 +207,9 @@
android:taskAffinity=""
android:theme="@style/TranslucentDialog"/>
-
+
Arrangement.Top
- bottomSearchBar -> Arrangement.Bottom
- else -> Arrangement.Top
- },
- bottomSearchBar = bottomSearchBar,
- filters = if (state.menuQuery.isNotEmpty()) state.searchItems else state.drawerItems,
- onClick = {
- when (it) {
- is DrawerItem.Filter -> {
- viewModel.setFilter(it.filter)
- scope.launch(Dispatchers.Default) {
- withContext(Dispatchers.Main) {
- context.findActivity()?.hideKeyboard()
+ val context = LocalContext.current
+ val settingsRequest = rememberLauncherForActivityResult(
+ ActivityResultContracts.StartActivityForResult()
+ ) {
+ // Activity.recreate caused window inset problems
+ restartActivity()
+ }
+ val scope = rememberCoroutineScope()
+ val bottomSearchBar = atLeastR()
+ TaskListDrawer(
+ arrangement = when {
+ state.menuQuery.isBlank() -> Arrangement.Top
+ bottomSearchBar -> Arrangement.Bottom
+ else -> Arrangement.Top
+ },
+ bottomSearchBar = bottomSearchBar,
+ filters = if (state.menuQuery.isNotEmpty()) state.searchItems else state.drawerItems,
+ onClick = {
+ when (it) {
+ is DrawerItem.Filter -> {
+ viewModel.setFilter(it.filter)
+ scope.launch {
+ drawerState.close()
+ keyboard?.hide()
}
- drawerState.close()
}
- }
- is DrawerItem.Header -> {
- viewModel.toggleCollapsed(it.header)
+ is DrawerItem.Header -> {
+ viewModel.toggleCollapsed(it.header)
+ }
}
- }
- },
- onAddClick = {
- scope.launch(Dispatchers.Default) {
- drawerState.close()
- when (it.header.addIntentRc) {
- FilterProvider.REQUEST_NEW_FILTER ->
- NewFilterDialog.newFilterDialog().show(
- supportFragmentManager,
- SubheaderClickHandler.FRAG_TAG_NEW_FILTER
- )
-
- REQUEST_NEW_PLACE ->
- startActivityForResult(
- Intent(
- this@MainActivity,
- LocationPickerActivity::class.java
- ),
- REQUEST_NEW_PLACE
- )
-
- REQUEST_NEW_TAGS ->
- startActivityForResult(
- Intent(
- this@MainActivity,
- TagSettingsActivity::class.java
- ),
- REQUEST_NEW_LIST
- )
-
- REQUEST_NEW_LIST -> {
- val account =
- caldavDao.getAccount(it.header.id.toLong())
- ?: return@launch
- when (it.header.subheaderType) {
- NavigationDrawerSubheader.SubheaderType.CALDAV,
- NavigationDrawerSubheader.SubheaderType.TASKS,
- ->
- startActivityForResult(
- Intent(
- this@MainActivity,
- account.listSettingsClass()
+ },
+ onAddClick = {
+ scope.launch {
+ drawerState.close()
+ when (it.header.addIntentRc) {
+ FilterProvider.REQUEST_NEW_FILTER ->
+ NewFilterDialog.newFilterDialog().show(
+ supportFragmentManager,
+ SubheaderClickHandler.FRAG_TAG_NEW_FILTER
+ )
+
+ REQUEST_NEW_PLACE ->
+ startActivityForResult(
+ Intent(
+ this@MainActivity,
+ LocationPickerActivity::class.java
+ ),
+ REQUEST_NEW_PLACE
+ )
+
+ REQUEST_NEW_TAGS ->
+ startActivityForResult(
+ Intent(
+ this@MainActivity,
+ TagSettingsActivity::class.java
+ ),
+ REQUEST_NEW_LIST
+ )
+
+ REQUEST_NEW_LIST -> {
+ val account =
+ caldavDao.getAccount(it.header.id.toLong())
+ ?: return@launch
+ when (it.header.subheaderType) {
+ NavigationDrawerSubheader.SubheaderType.CALDAV,
+ NavigationDrawerSubheader.SubheaderType.TASKS,
+ ->
+ startActivityForResult(
+ Intent(
+ this@MainActivity,
+ account.listSettingsClass()
+ )
+ .putExtra(
+ EXTRA_CALDAV_ACCOUNT,
+ account
+ ),
+ REQUEST_NEW_LIST
)
- .putExtra(
- EXTRA_CALDAV_ACCOUNT,
- account
- ),
- REQUEST_NEW_LIST
- )
-
- else -> {}
+
+ else -> {}
+ }
}
- }
- else -> Timber.e("Unhandled request code: $it")
+ else -> Timber.e("Unhandled request code: $it")
+ }
}
- }
- },
- onErrorClick = {
- context.startActivity(Intent(context, MainPreferences::class.java))
- },
- searchBar = {
- MenuSearchBar(
- begForMoney = state.begForMoney,
- onDrawerAction = {
- scope.launch {
- drawerState.close()
- when (it) {
- DrawerAction.PURCHASE ->
- if (TasksApplication.IS_GENERIC)
- context.openUri(R.string.url_donate)
- else
- context.startActivity(
+ },
+ onErrorClick = {
+ context.startActivity(Intent(context, MainPreferences::class.java))
+ },
+ searchBar = {
+ MenuSearchBar(
+ begForMoney = state.begForMoney,
+ onDrawerAction = {
+ scope.launch {
+ drawerState.close()
+ when (it) {
+ DrawerAction.PURCHASE ->
+ if (TasksApplication.IS_GENERIC)
+ context.openUri(R.string.url_donate)
+ else
+ context.startActivity(
+ Intent(
+ context,
+ PurchaseActivity::class.java
+ )
+ )
+
+ DrawerAction.SETTINGS ->
+ settingsRequest.launch(
Intent(
context,
- PurchaseActivity::class.java
+ MainPreferences::class.java
)
)
- DrawerAction.SETTINGS ->
- settingsRequest.launch(
- Intent(
- context,
- MainPreferences::class.java
- )
- )
-
- DrawerAction.HELP_AND_FEEDBACK ->
- context.startActivity(
- Intent(
- context,
- HelpAndFeedback::class.java
+ DrawerAction.HELP_AND_FEEDBACK ->
+ context.startActivity(
+ Intent(
+ context,
+ HelpAndFeedback::class.java
+ )
)
- )
+ }
}
- }
- },
- query = state.menuQuery,
- onQueryChange = { viewModel.queryMenu(it) },
- )
- },
- )
+ },
+ query = state.menuQuery,
+ onQueryChange = { viewModel.queryMenu(it) },
+ )
+ },
+ )
+ }
}
- }
- ) {
- val navigator = rememberListDetailPaneScaffoldNavigator(
- calculatePaneScaffoldDirective(
- windowAdaptiveInfo = currentWindowAdaptiveInfo(),
- verticalHingePolicy = HingePolicy.AlwaysAvoid,
- ).copy(
- horizontalPartitionSpacerSize = 0.dp,
- verticalPartitionSpacerSize = 0.dp,
- ),
+ ) {
+ val scope = rememberCoroutineScope()
- )
- val isListVisible =
- navigator.scaffoldValue[ListDetailPaneScaffoldRole.List] == PaneAdaptedValue.Expanded
- val isDetailVisible =
- navigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail] == PaneAdaptedValue.Expanded
- val scope = rememberCoroutineScope()
-
- LaunchedEffect(state.task) {
- if (state.task == null) {
+ LaunchedEffect(state.task) {
+ if (state.task == null) {
+ if (intent.finishAffinity) {
+ finishAffinity()
+ } else {
+ if (intent.removeTask && intent.broughtToFront) {
+ moveTaskToBack(true)
+ }
+ keyboard?.hide()
+ navigator.navigateTo(pane = ThreePaneScaffoldRole.Secondary)
+ }
+ } else {
+ navigator.navigateTo(pane = ThreePaneScaffoldRole.Primary)
+ }
+ }
+
+ BackHandler(enabled = state.task == null) {
+ Timber.d("onBackPressed")
if (intent.finishAffinity) {
finishAffinity()
+ } else if (isDetailVisible && navigator.canNavigateBack()) {
+ scope.launch {
+ navigator.navigateBack()
+ }
} else {
- if (intent.removeTask && intent.broughtToFront) {
- moveTaskToBack(true)
+ finish()
+ if (!preferences.getBoolean(R.string.p_open_last_viewed_list, true)) {
+ runBlocking {
+ viewModel.resetFilter()
+ }
}
- hideKeyboard()
- navigator.navigateTo(pane = ThreePaneScaffoldRole.Secondary)
}
- } else {
- navigator.navigateTo(pane = ThreePaneScaffoldRole.Primary)
}
- }
-
- BackHandler(enabled = state.task == null) {
- Timber.d("onBackPressed")
- if (intent.finishAffinity) {
- finishAffinity()
- } else if (isDetailVisible && navigator.canNavigateBack()) {
- scope.launch {
- navigator.navigateBack()
- }
- } else {
- finish()
- if (!preferences.getBoolean(R.string.p_open_last_viewed_list, true)) {
- runBlocking {
- viewModel.resetFilter()
- }
+ LaunchedEffect(state.filter, state.task) {
+ actionMode?.finish()
+ actionMode = null
+ if (state.task == null) {
+ keyboard?.hide()
}
+ drawerState.close()
}
- }
- LaunchedEffect(state.filter, state.task) {
- actionMode?.finish()
- actionMode = null
- drawerState.close()
- }
- ListDetailPaneScaffold(
- directive = navigator.scaffoldDirective,
- value = navigator.scaffoldValue,
- listPane = {
- key (state.filter) {
- val fragment = remember { mutableStateOf(null) }
- AndroidFragment(
- fragmentState = rememberFragmentState(),
- arguments = remember(state.filter) {
- Bundle()
- .apply { putParcelable(EXTRA_FILTER, state.filter) }
- },
- modifier = Modifier.fillMaxSize(),
- ) { tlf ->
- fragment.value = tlf
- tlf.setNavigationClickListener {
- scope.launch { drawerState.open() }
+ ListDetailPaneScaffold(
+ directive = navigator.scaffoldDirective,
+ value = navigator.scaffoldValue,
+ listPane = {
+ key (state.filter) {
+ val fragment = remember { mutableStateOf(null) }
+ AndroidFragment(
+ fragmentState = rememberFragmentState(),
+ arguments = remember(state.filter) {
+ Bundle()
+ .apply { putParcelable(EXTRA_FILTER, state.filter) }
+ },
+ modifier = Modifier.fillMaxSize(),
+ ) { tlf ->
+ fragment.value = tlf
+ tlf.applyInsets(windowInsets.value)
+ tlf.setNavigationClickListener {
+ scope.launch { drawerState.open() }
+ }
}
- }
- LaunchedEffect(fragment, windowInsets) {
- fragment.value?.applyInsets(windowInsets)
- }
- }
- },
- detailPane = {
- Box(
- modifier = Modifier
- .fillMaxSize()
- .padding(windowInsets),
- contentAlignment = Alignment.Center,
- ) {
- if (state.task == null) {
- if (isListVisible && isDetailVisible) {
- Icon(
- painter = painterResource(org.tasks.kmp.R.drawable.ic_launcher_no_shadow_foreground),
- contentDescription = null,
- modifier = Modifier.size(192.dp),
- tint = MaterialTheme.colorScheme.onSurfaceVariant,
- )
+ LaunchedEffect(fragment, windowInsets) {
+ fragment.value?.applyInsets(windowInsets.value)
}
- } else {
- key(state.task) {
- AndroidFragment(
- fragmentState = rememberFragmentState(),
- arguments = remember(state.task) {
- Bundle()
- .apply { putParcelable(EXTRA_TASK, state.task) }
- },
- modifier = Modifier.fillMaxSize(),
- )
+ }
+ },
+ detailPane = {
+ val direction = LocalLayoutDirection.current
+ Box(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(
+ top = windowInsets.value.calculateTopPadding(),
+ start = windowInsets.value.calculateStartPadding(direction),
+ end = windowInsets.value.calculateEndPadding(direction),
+ bottom = if (rememberImeState().value)
+ WindowInsets.ime.asPaddingValues().calculateBottomPadding()
+ else
+ windowInsets.value.calculateBottomPadding()
+ ),
+ contentAlignment = Alignment.Center,
+ ) {
+ if (state.task == null) {
+ if (isListVisible && isDetailVisible) {
+ Icon(
+ painter = painterResource(org.tasks.kmp.R.drawable.ic_launcher_no_shadow_foreground),
+ contentDescription = null,
+ modifier = Modifier.size(192.dp),
+ tint = MaterialTheme.colorScheme.onSurfaceVariant,
+ )
+ }
+ } else {
+ key(state.task) {
+ AndroidFragment(
+ fragmentState = rememberFragmentState(),
+ arguments = remember(state.task) {
+ Bundle()
+ .apply { putParcelable(EXTRA_TASK, state.task) }
+ },
+ modifier = Modifier.fillMaxSize(),
+ )
+ }
}
}
- }
- },
- )
+ },
+ )
+ }
}
}
}
@@ -501,7 +525,7 @@ class MainActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
if (currentNightMode != nightMode || currentPro != inventory.hasPro) {
- recreate()
+ restartActivity()
return
}
if (preferences.getBoolean(R.string.p_just_updated, false)) {
@@ -520,6 +544,17 @@ class MainActivity : AppCompatActivity() {
actionMode = mode
}
+ private fun restartActivity() {
+ finish()
+ startActivity(
+ Intent(this, MainActivity::class.java),
+ ActivityOptions.makeCustomAnimation(
+ this@MainActivity,
+ android.R.anim.fade_in, android.R.anim.fade_out
+ ).toBundle()
+ )
+ }
+
companion object {
/** For indicating the new list screen should be launched at fragment setup time */
const val OPEN_FILTER = "open_filter" // $NON-NLS-1$
diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt b/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt
index c93b245eb..735f48ed5 100644
--- a/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt
+++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivityViewModel.kt
@@ -69,7 +69,6 @@ class MainActivityViewModel @Inject constructor(
)
private val _drawerOpen = MutableStateFlow(false)
- val drawerOpen = _drawerOpen.asStateFlow()
private val _updateFilters = MutableStateFlow(0L)
private val _state = MutableStateFlow(
diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt
index 315a10f63..c9b3e305e 100755
--- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt
+++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt
@@ -7,7 +7,9 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
@@ -23,7 +25,6 @@ import org.tasks.data.dao.UserActivityDao
import org.tasks.dialogs.DateTimePicker
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.Linkify
-import org.tasks.extensions.hideKeyboard
import org.tasks.markdown.MarkdownProvider
import org.tasks.notifications.NotificationManager
import org.tasks.play.PlayServices
@@ -63,6 +64,9 @@ class TaskEditFragment : Fragment() {
}
}
val context = LocalContext.current
+ val keyboard = LocalSoftwareKeyboardController.current
+ val scope = rememberCoroutineScope()
+
TaskEditScreen(
editViewModel = editViewModel,
viewState = viewState,
@@ -70,9 +74,12 @@ class TaskEditFragment : Fragment() {
.watchComments(viewState.task.uuid)
.collectAsStateWithLifecycle(emptyList())
.value,
- save = { lifecycleScope.launch { save() } },
+ save = {
+ keyboard?.hide()
+ lifecycleScope.launch { save() }
+ },
discard = {
- activity?.hideKeyboard()
+ keyboard?.hide()
if (editViewModel.hasChanges()) {
dialogBuilder
.newDialog(R.string.discard_confirmation)
@@ -84,7 +91,7 @@ class TaskEditFragment : Fragment() {
}
},
delete = {
- activity?.hideKeyboard()
+ keyboard?.hide()
dialogBuilder
.newDialog(R.string.DLG_delete_this_task_question)
.setPositiveButton(R.string.ok) { _, _ ->
diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt
index 1bf37c0e4..d4987372a 100644
--- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt
+++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.kt
@@ -6,10 +6,12 @@
package com.todoroo.astrid.activity
import android.Manifest
+import android.annotation.SuppressLint
import android.app.Activity.RESULT_OK
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
+import android.content.res.ColorStateList
import android.os.Bundle
import android.os.Parcelable
import android.speech.RecognizerIntent
@@ -19,6 +21,7 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
+import android.view.ViewGroup.MarginLayoutParams
import androidx.activity.compose.BackHandler
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.StringRes
@@ -35,7 +38,6 @@ import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.app.ShareCompat
import androidx.core.content.IntentCompat
import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
@@ -273,26 +275,29 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
onClickMenu = onClick
}
+ @SuppressLint("PrivateResource")
fun applyInsets(windowInsets: PaddingValues) {
val density = resources.displayMetrics.density
- val actionBarHeight = TypedValue.complexToDimensionPixelSize(
- getData(requireContext(), android.R.attr.actionBarSize),
- resources.displayMetrics
- )
+ val topInset = (windowInsets.calculateTopPadding().value * density).toInt()
+ val bottomInset = (windowInsets.calculateBottomPadding().value * density).toInt()
+ if (topInset == 0 && bottomInset == 0) {
+ Timber.d("$this: Ignoring insets")
+ return
+ } else {
+ Timber.d("$this: applying insets")
+ }
with(binding.toolbar) {
- val topInset = (windowInsets.calculateTopPadding().value * density).toInt()
+ val actionBarHeight = TypedValue.complexToDimensionPixelSize(
+ getData(requireContext(), android.R.attr.actionBarSize),
+ resources.displayMetrics
+ )
val params = layoutParams
params.height = actionBarHeight + topInset
layoutParams = params
updatePadding(top = topInset)
}
- with(binding.bottomAppBar) {
- val bottomInset = (windowInsets.calculateBottomPadding().value * density).toInt()
- val params = layoutParams
- params.height = actionBarHeight + bottomInset
- layoutParams = params
- updatePadding(bottom = bottomInset)
- }
+ binding.bottomAppBar.updatePadding(bottom = bottomInset)
+ (binding.fab.layoutParams as MarginLayoutParams).bottomMargin = bottomInset / 2
}
@OptIn(ExperimentalPermissionsApi::class)
@@ -300,19 +305,6 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = FragmentTaskListBinding.inflate(inflater, container, false)
- ViewCompat.setOnApplyWindowInsetsListener(binding.toolbar) { view, windowInsets ->
- val actionBarHeight = TypedValue.complexToDimensionPixelSize(
- getData(requireContext(), android.R.attr.actionBarSize),
- resources.displayMetrics
- )
- val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
- val params = view.layoutParams
- params.height = actionBarHeight + insets.top
- view.layoutParams = params
- view.updatePadding(top = insets.top)
- windowInsets
- }
-
filter = getFilter()
val swipeRefreshLayout: SwipeRefreshLayout
val emptyRefreshLayout: SwipeRefreshLayout
@@ -354,21 +346,25 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
setupRefresh(swipeRefreshLayout)
setupRefresh(emptyRefreshLayout)
binding.toolbar.title = filter.title
+ binding.toolbar.setTitleTextAppearance(requireContext(), com.google.android.material.R.style.TextAppearance_Material3_HeadlineSmall)
+ binding.toolbar.setTitleTextColor(themeColor.primaryColor)
binding.appbarlayout.addOnOffsetChangedListener { _, verticalOffset ->
if (verticalOffset == 0 && binding.bottomAppBar.isScrolledDown) {
binding.bottomAppBar.performShow()
}
}
- val toolbar = run {
- themeColor.apply(binding.bottomAppBar)
- binding.bottomAppBar
+ with (binding.fab) {
+ backgroundTintList = ColorStateList.valueOf(themeColor.primaryColor)
+ imageTintList = ColorStateList.valueOf(themeColor.colorOnPrimary)
}
- toolbar.setOnMenuItemClickListener(this)
- toolbar.setNavigationOnClickListener {
- activity?.hideKeyboard()
- onClickMenu()
+ with (binding.bottomAppBar) {
+ setOnMenuItemClickListener(this@TaskListFragment)
+ setNavigationOnClickListener {
+ activity?.hideKeyboard()
+ onClickMenu()
+ }
+ setupMenu(this)
}
- setupMenu(toolbar)
binding.banner.setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
binding.banner.setContent {
val context = LocalContext.current
@@ -475,6 +471,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
}
}
}
+ ViewCompat.requestApplyInsets(binding.toolbar)
return binding.root
}
@@ -705,11 +702,17 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
private fun makeSnackbar(text: String): Snackbar? = activity?.let {
Snackbar.make(binding.taskListCoordinator, text, 4000)
.setAnchorView(R.id.fab)
- .setTextColor(it.getColor(R.color.snackbar_text_color))
- .setActionTextColor(it.getColor(R.color.snackbar_action_color))
- .apply {
- view.setBackgroundColor(it.getColor(R.color.snackbar_background))
- }
+ .setBackgroundTint(it.getColor(R.color.dialog_background))
+ .setTextColor(it.getColor(R.color.text_primary))
+ .setActionTextColor(themeColor.primaryColor)
+ .apply {
+ val offset = TypedValue.applyDimension(
+ TypedValue.COMPLEX_UNIT_DIP,
+ 16f,
+ context.resources.displayMetrics
+ )
+ view.translationY = -offset
+ }
}
override fun onPause() {
@@ -1123,13 +1126,5 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
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
-
- fun newTaskListFragment(filter: Filter): TaskListFragment {
- val fragment = TaskListFragment()
- val bundle = Bundle()
- bundle.putParcelable(EXTRA_FILTER, filter)
- fragment.arguments = bundle
- return fragment
- }
}
}
diff --git a/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt b/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt
index f70141951..dc308811c 100644
--- a/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt
+++ b/app/src/main/java/com/todoroo/astrid/timers/TimerControlSet.kt
@@ -22,7 +22,6 @@ import org.tasks.data.entity.Task
import org.tasks.dialogs.DialogBuilder
import org.tasks.extensions.Context.is24HourFormat
import org.tasks.kmp.org.tasks.time.getTimeString
-import org.tasks.themes.Theme
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.ui.TaskEditControlFragment
import javax.inject.Inject
@@ -36,7 +35,6 @@ import javax.inject.Inject
class TimerControlSet : TaskEditControlFragment() {
@Inject lateinit var activity: Activity
@Inject lateinit var dialogBuilder: DialogBuilder
- @Inject lateinit var theme: Theme
@Inject lateinit var timerPlugin: TimerPlugin
private lateinit var estimated: TimeDurationControlSet
@@ -81,8 +79,8 @@ class TimerControlSet : TaskEditControlFragment() {
override fun Content() {
LaunchedEffect(Unit) {
dialogView = activity.layoutInflater.inflate(R.layout.control_set_timers_dialog, null)
- estimated = TimeDurationControlSet(activity, dialogView, R.id.estimatedDuration, theme)
- elapsed = TimeDurationControlSet(activity, dialogView, R.id.elapsedDuration, theme)
+ estimated = TimeDurationControlSet(activity, dialogView, R.id.estimatedDuration)
+ elapsed = TimeDurationControlSet(activity, dialogView, R.id.elapsedDuration)
estimated.setTimeDuration(viewModel.estimatedSeconds.value)
elapsed.setTimeDuration(viewModel.elapsedSeconds.value)
}
diff --git a/app/src/main/java/com/todoroo/astrid/ui/TimeDurationControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/TimeDurationControlSet.kt
index 76ab7b3ed..f784151ff 100644
--- a/app/src/main/java/com/todoroo/astrid/ui/TimeDurationControlSet.kt
+++ b/app/src/main/java/com/todoroo/astrid/ui/TimeDurationControlSet.kt
@@ -11,9 +11,13 @@ import android.view.View
import android.widget.TextView
import com.todoroo.astrid.ui.NNumberPickerDialog.OnNNumberPickedListener
import org.tasks.R
-import org.tasks.themes.Theme
-class TimeDurationControlSet(private val context: Context, view: View, timeButtonId: Int, private val theme: Theme) : OnNNumberPickedListener, View.OnClickListener {
+class TimeDurationControlSet(
+ private val context: Context,
+ view: View,
+ timeButtonId: Int,
+) : OnNNumberPickedListener,
+ View.OnClickListener {
private val timeButton: TextView = view.findViewById(timeButtonId)
var timeDurationInSeconds = 0
private set
@@ -64,7 +68,6 @@ class TimeDurationControlSet(private val context: Context, view: View, timeButto
if (initialValues != null) {
dialog!!.setInitialValues(initialValues)
}
- theme.applyToContext(dialog!!.context)
dialog!!.show()
}
diff --git a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt
index 4a1f766b4..b6d0f6046 100644
--- a/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt
+++ b/app/src/main/java/org/tasks/activities/DateAndTimePickerActivity.kt
@@ -12,14 +12,12 @@ import org.tasks.dialogs.MyTimePickerDialog
import org.tasks.dialogs.MyTimePickerDialog.Companion.newTimePicker
import org.tasks.dialogs.MyTimePickerDialog.Companion.timeInputMode
import org.tasks.preferences.Preferences
-import org.tasks.themes.ThemeAccent
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import javax.inject.Inject
@AndroidEntryPoint
class DateAndTimePickerActivity : AppCompatActivity() {
- @Inject lateinit var themeAccent: ThemeAccent
@Inject lateinit var preferences: Preferences
private var initial: DateTime? = null
@@ -33,7 +31,6 @@ class DateAndTimePickerActivity : AppCompatActivity() {
?.getLong(EXTRA_DATE_SELECTED)
?.takeIf { it > 0 }
?.let { DateTime(it, DateTime.UTC) }
- themeAccent.applyStyle(theme)
if (dateSelected != null) {
showTimePicker()
} else {
diff --git a/app/src/main/java/org/tasks/billing/PurchaseActivity.kt b/app/src/main/java/org/tasks/billing/PurchaseActivity.kt
index ddb8e1ab3..d86b1616a 100644
--- a/app/src/main/java/org/tasks/billing/PurchaseActivity.kt
+++ b/app/src/main/java/org/tasks/billing/PurchaseActivity.kt
@@ -26,8 +26,6 @@ class PurchaseActivity : AppCompatActivity(), OnPurchasesUpdated {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- theme.applyToContext(this)
-
setContent {
TasksTheme(theme = theme.themeBase.index) {
BackHandler {
diff --git a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt
index d515ba476..a056343e4 100644
--- a/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt
+++ b/app/src/main/java/org/tasks/caldav/CaldavCalendarSettingsActivity.kt
@@ -35,7 +35,6 @@ import org.tasks.data.entity.CaldavAccount.Companion.SERVER_TASKS
import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_OWNER
import org.tasks.themes.TasksTheme
-import org.tasks.themes.ThemeAccent
import org.tasks.themes.colorOn
import javax.inject.Inject
@@ -43,7 +42,6 @@ import javax.inject.Inject
class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
@Inject lateinit var principalDao: PrincipalDao
- @Inject lateinit var accent: ThemeAccent
private val viewModel: CaldavCalendarViewModel by viewModels()
@@ -81,16 +79,15 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
openDialog.value = false
}
}
- val accentColor = Color(accent.accentColor)
FloatingActionButton(
onClick = { openDialog.value = true },
modifier = Modifier.padding(Constants.KEYLINE_FIRST),
- containerColor = accentColor
+ containerColor = MaterialTheme.colorScheme.primary,
+ contentColor = MaterialTheme.colorScheme.onPrimary,
) {
Icon(
imageVector = Icons.Outlined.PersonAdd,
contentDescription = null,
- tint = colorOn(accentColor),
)
}
}
diff --git a/app/src/main/java/org/tasks/compose/TaskEditRow.kt b/app/src/main/java/org/tasks/compose/TaskEditRow.kt
index a0816a805..75d487ad6 100644
--- a/app/src/main/java/org/tasks/compose/TaskEditRow.kt
+++ b/app/src/main/java/org/tasks/compose/TaskEditRow.kt
@@ -37,7 +37,7 @@ fun TaskEditRow(
enabled = onClick != null,
onClick = { onClick?.invoke() }
)
- .background(MaterialTheme.colorScheme.surface),
+ .background(MaterialTheme.colorScheme.background),
) {
icon()
content()
diff --git a/app/src/main/java/org/tasks/compose/edit/DueDateRow.kt b/app/src/main/java/org/tasks/compose/edit/DueDateRow.kt
index e13686e79..e99bb66fc 100644
--- a/app/src/main/java/org/tasks/compose/edit/DueDateRow.kt
+++ b/app/src/main/java/org/tasks/compose/edit/DueDateRow.kt
@@ -46,7 +46,7 @@ fun DueDateRow(
} else {
newDateTime(dueDate).endOfDay().isBeforeNow
},
- onClick = onClick,
+ onClick = { onClick() },
)
}
diff --git a/app/src/main/java/org/tasks/compose/edit/TaskEditScreen.kt b/app/src/main/java/org/tasks/compose/edit/TaskEditScreen.kt
index d6ab47770..86669cb1c 100644
--- a/app/src/main/java/org/tasks/compose/edit/TaskEditScreen.kt
+++ b/app/src/main/java/org/tasks/compose/edit/TaskEditScreen.kt
@@ -6,10 +6,11 @@ import androidx.activity.compose.BackHandler
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.imePadding
-import androidx.compose.foundation.layout.navigationBarsPadding
+import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
@@ -22,8 +23,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
+import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.TopAppBar
+import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.rememberCoroutineScope
@@ -116,6 +119,9 @@ fun TaskEditScreen(
Scaffold(
topBar = {
TopAppBar(
+ colors = TopAppBarDefaults.topAppBarColors().copy(
+ containerColor = MaterialTheme.colorScheme.background,
+ ),
navigationIcon = {
if (viewState.isReadOnly) {
IconButton(onClick = { onBackPressed() }) {
@@ -162,11 +168,10 @@ fun TaskEditScreen(
AndroidFragment(
modifier = Modifier
.fillMaxWidth()
- .navigationBarsPadding()
+ .padding(WindowInsets.navigationBars.asPaddingValues())
)
}
},
- modifier = Modifier.imePadding(),
) { paddingValues ->
Column(
modifier = Modifier
diff --git a/app/src/main/java/org/tasks/dialogs/BaseDateTimePicker.kt b/app/src/main/java/org/tasks/dialogs/BaseDateTimePicker.kt
index 1f27303de..df87dfbbd 100644
--- a/app/src/main/java/org/tasks/dialogs/BaseDateTimePicker.kt
+++ b/app/src/main/java/org/tasks/dialogs/BaseDateTimePicker.kt
@@ -10,10 +10,15 @@ import android.view.ViewGroup
import android.widget.CalendarView
import android.widget.FrameLayout
import androidx.coordinatorlayout.widget.CoordinatorLayout
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.lifecycle.lifecycleScope
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.google.android.material.button.MaterialButton
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.extensions.Context.is24HourFormat
import org.tasks.kmp.org.tasks.time.getTimeString
@@ -66,9 +71,17 @@ abstract class BaseDateTimePicker : BottomSheetDialogFragment() {
dialog
.findViewById(com.google.android.material.R.id.design_bottom_sheet)
?.let { bottomSheet ->
- with (BottomSheetBehavior.from(bottomSheet)) {
- state = BottomSheetBehavior.STATE_EXPANDED
- skipCollapsed = true
+ val behavior = BottomSheetBehavior.from(bottomSheet)
+ behavior.skipCollapsed = true
+
+ val insets = ViewCompat.getRootWindowInsets(requireActivity().window.decorView)
+ if (insets?.isVisible(WindowInsetsCompat.Type.ime()) == true) {
+ lifecycleScope.launch {
+ delay(100)
+ behavior.state = BottomSheetBehavior.STATE_EXPANDED
+ }
+ } else {
+ behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
}
diff --git a/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt b/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt
index 6fe73bf5b..b0b2a3a5f 100644
--- a/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt
+++ b/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt
@@ -75,7 +75,6 @@ class ColorPalettePicker : DialogFragment() {
palette = requireArguments().getSerializable(EXTRA_PALETTE) as Palette
colors = when (palette) {
Palette.COLORS -> colorProvider.getThemeColors()
- Palette.ACCENTS -> colorProvider.getAccentColors()
Palette.LAUNCHERS -> ThemeColor.LAUNCHER_COLORS.map { color ->
ThemeColor(context, requireContext().getColor(color))
}
diff --git a/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt b/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt
index d016ee900..3ab0319a6 100644
--- a/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt
+++ b/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt
@@ -17,7 +17,6 @@ class ColorPickerAdapter(
enum class Palette {
COLORS,
- ACCENTS,
LAUNCHERS,
WIDGET
}
diff --git a/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt
index d67edf2b3..6e49564d3 100644
--- a/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt
+++ b/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt
@@ -18,7 +18,6 @@ import com.todoroo.andlib.utility.AndroidUtilities.preS
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.billing.Inventory
-import org.tasks.themes.ThemeAccent
import org.tasks.themes.ThemeBase
import org.tasks.themes.ThemeBase.EXTRA_THEME_OVERRIDE
import javax.inject.Inject
@@ -48,7 +47,6 @@ class ThemePickerDialog : DialogFragment() {
@Inject lateinit var inventory: Inventory
@Inject lateinit var dialogBuilder: DialogBuilder
- @Inject lateinit var accent: ThemeAccent
@Inject lateinit var themeBase: ThemeBase
var adapter: ArrayAdapter? = null
diff --git a/app/src/main/java/org/tasks/injection/ActivityModule.kt b/app/src/main/java/org/tasks/injection/ActivityModule.kt
index c092f11ab..d48ba9f40 100644
--- a/app/src/main/java/org/tasks/injection/ActivityModule.kt
+++ b/app/src/main/java/org/tasks/injection/ActivityModule.kt
@@ -6,11 +6,9 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.scopes.ActivityScoped
-import org.tasks.R
import org.tasks.billing.Inventory
import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
-import org.tasks.themes.ThemeAccent
import org.tasks.themes.ThemeBase
import org.tasks.themes.ThemeColor
@@ -27,9 +25,4 @@ class ActivityModule {
@ActivityScoped
fun getThemeColor(colorProvider: ColorProvider, preferences: Preferences): ThemeColor
= colorProvider.getThemeColor(preferences.defaultThemeColor, true)
-
- @Provides
- @ActivityScoped
- fun getThemeAccent(colorProvider: ColorProvider, preferences: Preferences): ThemeAccent
- = colorProvider.getThemeAccent(preferences.getInt(R.string.p_theme_accent, 1))
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt
index 4cd5f8b33..5a75b76b2 100644
--- a/app/src/main/java/org/tasks/location/LocationPickerActivity.kt
+++ b/app/src/main/java/org/tasks/location/LocationPickerActivity.kt
@@ -2,11 +2,13 @@ package org.tasks.location
import android.app.Activity
import android.content.Intent
+import android.content.res.ColorStateList
import android.content.res.Configuration
import android.os.Bundle
import android.os.Parcelable
import android.view.MenuItem
import android.view.View
+import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
@@ -89,7 +91,7 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- theme.applyTheme(this)
+ enableEdgeToEdge()
window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent)
val binding = ActivityLocationPickerBinding.inflate(layoutInflater)
setContentView(binding.root)
@@ -123,8 +125,6 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe
search = menu.findItem(R.id.menu_search)
search.setOnActionExpandListener(this)
toolbar.setOnMenuItemClickListener(this)
- val themeColor = theme.themeColor
- themeColor.applyToNavigationBar(this)
val dark = theme.themeBase.isDarkTheme(this)
map.init(this, this, dark)
val params = appBarLayout.layoutParams as CoordinatorLayout.LayoutParams
@@ -164,7 +164,11 @@ class LocationPickerActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListe
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = if (search.isActionViewExpanded) searchAdapter else recentsAdapter
- binding.currentLocation.setOnClickListener { currentLocation() }
+ with (binding.currentLocation) {
+ setOnClickListener { currentLocation() }
+ backgroundTintList = ColorStateList.valueOf(theme.themeColor.primaryColor)
+ imageTintList = ColorStateList.valueOf(theme.themeColor.colorOnPrimary)
+ }
binding.selectThisLocation.setOnClickListener { selectLocation() }
}
diff --git a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt
index 813ce1ffa..15cbc8413 100644
--- a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt
+++ b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt
@@ -29,7 +29,6 @@ import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.locale.LocalePickerDialog
import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences
-import org.tasks.themes.ThemeAccent
import org.tasks.themes.ThemeBase
import org.tasks.themes.ThemeBase.DEFAULT_BASE_THEME
import org.tasks.themes.ThemeBase.EXTRA_THEME_OVERRIDE
@@ -43,7 +42,6 @@ class LookAndFeel : InjectingPreferenceFragment() {
@Inject lateinit var themeBase: ThemeBase
@Inject lateinit var themeColor: ThemeColor
- @Inject lateinit var themeAccent: ThemeAccent
@Inject lateinit var preferences: Preferences
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@@ -102,12 +100,6 @@ class LookAndFeel : InjectingPreferenceFragment() {
ColorPickerAdapter.Palette.COLORS,
REQUEST_COLOR_PICKER
)
- setupColorPreference(
- R.string.p_theme_accent,
- themeAccent.pickerColor,
- ColorPickerAdapter.Palette.ACCENTS,
- REQUEST_ACCENT_PICKER
- )
updateLauncherPreference()
}
@@ -170,15 +162,6 @@ class LookAndFeel : InjectingPreferenceFragment() {
}
}
}
- REQUEST_ACCENT_PICKER -> {
- if (resultCode == RESULT_OK) {
- val index = data!!.getIntExtra(ColorPalettePicker.EXTRA_SELECTED, 0)
- if (preferences.getInt(R.string.p_theme_accent, -1) != index) {
- preferences.setInt(R.string.p_theme_accent, index)
- recreate()
- }
- }
- }
REQUEST_LAUNCHER_PICKER -> {
if (resultCode == RESULT_OK) {
val index = data!!.getIntExtra(ColorPalettePicker.EXTRA_SELECTED, 0)
@@ -233,7 +216,6 @@ class LookAndFeel : InjectingPreferenceFragment() {
companion object {
private const val REQUEST_THEME_PICKER = 10001
private const val REQUEST_COLOR_PICKER = 10002
- private const val REQUEST_ACCENT_PICKER = 10003
private const val REQUEST_LAUNCHER_PICKER = 10004
private const val REQUEST_LOCALE = 10006
private const val REQUEST_PURCHASE = 10007
diff --git a/app/src/main/java/org/tasks/reminders/NotificationActivity.kt b/app/src/main/java/org/tasks/reminders/NotificationActivity.kt
index 3d5b1b3c8..7a4f524e5 100644
--- a/app/src/main/java/org/tasks/reminders/NotificationActivity.kt
+++ b/app/src/main/java/org/tasks/reminders/NotificationActivity.kt
@@ -11,7 +11,6 @@ import org.tasks.data.dao.TaskDao
import org.tasks.intents.TaskIntents
import org.tasks.notifications.NotificationManager
import org.tasks.receivers.CompleteTaskReceiver
-import org.tasks.themes.ThemeAccent
import timber.log.Timber
import javax.inject.Inject
@@ -19,13 +18,11 @@ import javax.inject.Inject
class NotificationActivity : AppCompatActivity(), NotificationDialog.NotificationHandler {
@Inject lateinit var notificationManager: NotificationManager
@Inject lateinit var taskDao: TaskDao
- @Inject lateinit var themeAccent: ThemeAccent
private var taskId: Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- themeAccent.applyStyle(theme)
val intent = intent
taskId = intent.getLongExtra(EXTRA_TASK_ID, 0L)
val fragmentManager = supportFragmentManager
diff --git a/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt b/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt
index 2a307e272..0a2f63e44 100644
--- a/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt
+++ b/app/src/main/java/org/tasks/reminders/SnoozeActivity.kt
@@ -14,7 +14,6 @@ import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import org.tasks.activities.DateAndTimePickerActivity
import org.tasks.dialogs.MyTimePickerDialog
-import org.tasks.themes.ThemeAccent
import org.tasks.time.DateTime
import javax.inject.Inject
@@ -22,14 +21,12 @@ import javax.inject.Inject
class SnoozeActivity : AppCompatActivity(), SnoozeCallback, DialogInterface.OnCancelListener {
@Inject lateinit var taskDao: TaskDao
@Inject lateinit var alarmService: AlarmService
- @Inject lateinit var themeAccent: ThemeAccent
private val taskIds: MutableList = ArrayList()
private var pickingDateTime = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- themeAccent.applyStyle(theme)
val intent = intent
if (intent.hasExtra(EXTRA_TASK_ID)) {
taskIds.add(intent.getLongExtra(EXTRA_TASK_ID, -1L))
diff --git a/app/src/main/java/org/tasks/themes/ColorProvider.kt b/app/src/main/java/org/tasks/themes/ColorProvider.kt
index cff2c7eba..f096647ac 100644
--- a/app/src/main/java/org/tasks/themes/ColorProvider.kt
+++ b/app/src/main/java/org/tasks/themes/ColorProvider.kt
@@ -6,7 +6,6 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R
import org.tasks.kmp.org.tasks.themes.ColorProvider.priorityColor
import org.tasks.kmp.org.tasks.themes.ColorProvider.saturated
-import org.tasks.preferences.Preferences
import javax.inject.Inject
class ColorProvider @Inject constructor(
@@ -30,17 +29,9 @@ class ColorProvider @Inject constructor(
isDarkMode = isDark,
)
- fun getThemeAccent(index: Int) = ThemeAccent(context, if (isDark) {
- ThemeAccent.ACCENTS_DESATURATED[index]
- } else {
- ThemeAccent.ACCENTS[index]
- })
-
fun getThemeColors(adjust: Boolean = true) = ThemeColor.COLORS.map { c ->
getThemeColor(context.getColor(c), adjust)
}
fun getWidgetColors() = getThemeColors(false)
-
- fun getAccentColors() = ThemeAccent.ACCENTS.indices.map(this@ColorProvider::getThemeAccent)
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/themes/Theme.kt b/app/src/main/java/org/tasks/themes/Theme.kt
index 169e8139b..f2985255c 100644
--- a/app/src/main/java/org/tasks/themes/Theme.kt
+++ b/app/src/main/java/org/tasks/themes/Theme.kt
@@ -2,17 +2,15 @@ package org.tasks.themes
import android.app.Activity
import android.content.Context
-import android.graphics.PixelFormat
import android.view.LayoutInflater
import javax.inject.Inject
class Theme @Inject constructor(
val themeBase: ThemeBase,
val themeColor: ThemeColor,
- private val themeAccent: ThemeAccent
) {
fun getLayoutInflater(context: Context) =
- wrap(context).getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
+ context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
fun applyThemeAndStatusBarColor(activity: Activity) {
applyTheme(activity)
@@ -21,19 +19,5 @@ class Theme @Inject constructor(
fun applyTheme(activity: Activity) {
themeBase.set(activity)
- applyToContext(activity)
- activity.window.setFormat(PixelFormat.RGBA_8888)
- }
-
- fun applyToContext(context: Context) {
- val theme = context.theme
- themeColor.applyStyle(theme)
- themeAccent.applyStyle(theme)
- }
-
- private fun wrap(context: Context): Context {
- val wrapper = themeBase.wrap(context)
- applyToContext(wrapper)
- return wrapper
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/themes/ThemeAccent.java b/app/src/main/java/org/tasks/themes/ThemeAccent.java
deleted file mode 100644
index 1aa333b93..000000000
--- a/app/src/main/java/org/tasks/themes/ThemeAccent.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.tasks.themes;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.TypedValue;
-import android.view.ContextThemeWrapper;
-import org.tasks.R;
-import org.tasks.dialogs.ColorPalettePicker.Pickable;
-
-public class ThemeAccent implements Pickable {
-
- public static final int[] ACCENTS =
- new int[] {
- R.style.BlueGreyAccent,
- R.style.RedAccent,
- R.style.PinkAccent,
- R.style.PurpleAccent,
- R.style.DeepPurpleAccent,
- R.style.IndigoAccent,
- R.style.BlueAccent,
- R.style.LightBlueAccent,
- R.style.CyanAccent,
- R.style.TealAccent,
- R.style.GreenAccent,
- R.style.LightGreenAccent,
- R.style.LimeAccent,
- R.style.YellowAccent,
- R.style.AmberAccent,
- R.style.OrangeAccent,
- R.style.DeepOrangeAccent
- };
- public static final int[] ACCENTS_DESATURATED =
- new int[] {
- R.style.BlueGreyAccentDesaturated,
- R.style.RedAccentDesaturated,
- R.style.PinkAccentDesaturated,
- R.style.PurpleAccentDesaturated,
- R.style.DeepPurpleAccentDesaturated,
- R.style.IndigoAccentDesaturated,
- R.style.BlueAccentDesaturated,
- R.style.LightBlueAccentDesaturated,
- R.style.CyanAccentDesaturated,
- R.style.TealAccentDesaturated,
- R.style.GreenAccentDesaturated,
- R.style.LightGreenAccentDesaturated,
- R.style.LimeAccentDesaturated,
- R.style.YellowAccentDesaturated,
- R.style.AmberAccentDesaturated,
- R.style.OrangeAccentDesaturated,
- R.style.DeepOrangeAccentDesaturated
- };
-
- public static final Parcelable.Creator CREATOR =
- new Parcelable.Creator<>() {
- @Override
- public ThemeAccent createFromParcel(Parcel source) {
- return new ThemeAccent(source);
- }
-
- @Override
- public ThemeAccent[] newArray(int size) {
- return new ThemeAccent[size];
- }
- };
- private final int style;
- @Deprecated private final int accentColor;
-
- public ThemeAccent(Context context, int style) {
- this.style = style;
- Resources.Theme theme = new ContextThemeWrapper(context, style).getTheme();
- this.accentColor = resolveAttribute(theme, com.google.android.material.R.attr.colorSecondary);
- }
-
- private ThemeAccent(Parcel source) {
- style = source.readInt();
- accentColor = source.readInt();
- }
-
- private static int resolveAttribute(Resources.Theme theme, int attribute) {
- TypedValue typedValue = new TypedValue();
- theme.resolveAttribute(attribute, typedValue, true);
- return typedValue.data;
- }
-
- public void applyStyle(Resources.Theme theme) {
- theme.applyStyle(style, true);
- }
-
- @Override
- public int getPickerColor() {
- return accentColor;
- }
-
- @Override
- public boolean isFree() {
- return style == R.style.BlueGreyAccent ||
- style == R.style.RedAccent ||
- style == R.style.BlueGreyAccentDesaturated ||
- style == R.style.RedAccentDesaturated;
- }
-
- @Deprecated
- public int getAccentColor() {
- return accentColor;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(style);
- dest.writeInt(accentColor);
- }
-}
diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java
index 119687cff..f4dd43943 100644
--- a/app/src/main/java/org/tasks/themes/ThemeColor.java
+++ b/app/src/main/java/org/tasks/themes/ThemeColor.java
@@ -5,8 +5,6 @@ import static org.tasks.themes.ColorUtilsKt.calculateContrast;
import android.app.Activity;
import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
import android.os.Build.VERSION_CODES;
import android.os.Parcel;
import android.os.Parcelable;
@@ -16,8 +14,6 @@ import androidx.annotation.ColorInt;
import androidx.annotation.RequiresApi;
import androidx.core.os.ParcelCompat;
-import com.google.android.material.bottomappbar.BottomAppBar;
-
import org.tasks.R;
import org.tasks.dialogs.ColorPalettePicker.Pickable;
@@ -209,10 +205,6 @@ public class ThemeColor implements Pickable {
: flag & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
}
- void applyStyle(Resources.Theme theme) {
- theme.applyStyle(isDark ? R.style.BlackToolbarTheme : R.style.WhiteToolbarTheme, true);
- }
-
@Override
public int getPickerColor() {
return colorPrimary;
@@ -248,10 +240,6 @@ public class ThemeColor implements Pickable {
return isDark;
}
- public void apply(BottomAppBar bottomAppBar) {
- bottomAppBar.setBackgroundTint(ColorStateList.valueOf(getPrimaryColor()));
- }
-
@Override
public int describeContents() {
return 0;
diff --git a/app/src/main/res/color/mtrl_choice_chip_background_color.xml b/app/src/main/res/color/mtrl_choice_chip_background_color.xml
deleted file mode 100644
index f6de8f232..000000000
--- a/app/src/main/res/color/mtrl_choice_chip_background_color.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/color/mtrl_choice_chip_text_color.xml b/app/src/main/res/color/mtrl_choice_chip_text_color.xml
deleted file mode 100644
index 22815ae80..000000000
--- a/app/src/main/res/color/mtrl_choice_chip_text_color.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/color/mtrl_filled_stroke_color.xml b/app/src/main/res/color/mtrl_filled_stroke_color.xml
deleted file mode 100644
index eb178ec72..000000000
--- a/app/src/main/res/color/mtrl_filled_stroke_color.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/color/mtrl_text_btn_text_color_selector.xml b/app/src/main/res/color/mtrl_text_btn_text_color_selector.xml
deleted file mode 100644
index 8fd80ff08..000000000
--- a/app/src/main/res/color/mtrl_text_btn_text_color_selector.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_location_picker.xml b/app/src/main/res/layout/activity_location_picker.xml
index 5234acfcb..f09bc484d 100644
--- a/app/src/main/res/layout/activity_location_picker.xml
+++ b/app/src/main/res/layout/activity_location_picker.xml
@@ -19,7 +19,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
- android:theme="@style/ToolbarTheme"
+ android:theme="@style/LegacyToolbarTheme"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
app:contentScrim="@color/content_background"
app:statusBarScrim="@color/content_background"
@@ -62,7 +62,6 @@
android:layout_gravity="end|bottom"
android:padding="0dp"
android:src="@drawable/ic_outline_gps_fixed_24px"
- app:backgroundTint="?attr/colorAccent"
app:borderWidth="0dp"
app:layout_constraintBottom_toBottomOf="@id/map"
app:layout_constraintEnd_toEndOf="@id/map"/>
@@ -114,7 +113,7 @@
android:gravity="start|center_vertical"
android:text="@string/pick_this_location"
android:textAlignment="viewStart"
- android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+ android:textAppearance="@style/TextAppearance.Material3.BodyMedium"
android:textColor="@color/text_primary"/>
@@ -139,7 +138,7 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
- android:theme="@style/ToolbarTheme"
+ android:theme="@style/LegacyToolbarTheme"
app:layout_collapseMode="pin"
app:popupTheme="@style/popup_overlay"
app:title="@string/choose_a_location"/>
@@ -174,7 +173,7 @@
android:gravity="start"
android:text="@string/TLA_menu_search"
android:textAlignment="viewStart"
- android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+ android:textAppearance="@style/TextAppearance.Material3.BodyMedium"
android:textColor="@color/text_primary"/>
@@ -188,7 +187,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/window_background"
- app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
tools:listitem="@layout/row_place"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/date_time_picker_shortcuts.xml b/app/src/main/res/layout/date_time_picker_shortcuts.xml
index d6361d9cf..d1eb2f9bf 100644
--- a/app/src/main/res/layout/date_time_picker_shortcuts.xml
+++ b/app/src/main/res/layout/date_time_picker_shortcuts.xml
@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="match_parent">
+ android:layout_height="wrap_content">
+ app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
+ app:navigationIcon="@drawable/ic_outline_menu_24px"/>
+ app:layout_anchorGravity="top|end"
+ app:srcCompat="@drawable/ic_outline_add_24px"/>
diff --git a/app/src/main/res/layout/row_place.xml b/app/src/main/res/layout/row_place.xml
index 8a7648ba7..ae9bc0c76 100644
--- a/app/src/main/res/layout/row_place.xml
+++ b/app/src/main/res/layout/row_place.xml
@@ -42,7 +42,7 @@
android:gravity="start|top"
android:maxLines="2"
android:textAlignment="viewStart"
- android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"/>
+ android:textAppearance="@style/TextAppearance.Material3.BodyMedium"/>
+ android:textAppearance="@style/TextAppearance.Material3.BodyMedium"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/simple_list_item_single_choice.xml b/app/src/main/res/layout/simple_list_item_single_choice.xml
index 3fadaff94..40804e239 100644
--- a/app/src/main/res/layout/simple_list_item_single_choice.xml
+++ b/app/src/main/res/layout/simple_list_item_single_choice.xml
@@ -26,4 +26,4 @@
android:drawablePadding="@dimen/keyline_second"
android:gravity="center_vertical"
android:textSize="18sp"
- android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"/>
+ android:textAppearance="@style/TextAppearance.Material3.BodyMedium"/>
diff --git a/app/src/main/res/layout/task_adapter_header.xml b/app/src/main/res/layout/task_adapter_header.xml
index 63a4017ec..47a78f8e8 100644
--- a/app/src/main/res/layout/task_adapter_header.xml
+++ b/app/src/main/res/layout/task_adapter_header.xml
@@ -4,7 +4,7 @@
android:id="@+id/header_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="?attr/selectableItemBackground">
+ android:foreground="?attr/selectableItemBackground">
التعتيم
تخصيص اللغة و الجهة
نسخ احتياطي الآن
- اللون الثانوي
افتراضيات النظام
صباحي/مسائي
خلفية
diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml
index 5101889a3..a38f3223c 100644
--- a/app/src/main/res/values-bg-rBG/strings.xml
+++ b/app/src/main/res/values-bg-rBG/strings.xml
@@ -287,7 +287,6 @@
Непрозрачност
Тема
Цвят
- Акцент
Икона за стартиране
Черна
Светла
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 6753cf7b6..760da1aa3 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -502,5 +502,4 @@
Després
Les hores tranquil·les són efectives
Opacitat del peu
- Accent
\ No newline at end of file
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index a1e59640d..cf9aefaa6 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -313,7 +313,6 @@
Zadejte URL
Zadejte adresu serveru
Musí začínat na http(s)://
- Doplňková barva
Ikona na domovské obrazovce
LED upozornění
Je vyžadována hardwarová podpora
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 96f5ef892..8c28efc4e 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -259,7 +259,6 @@
Lys
App-ikon
Sort
- Fremhævelse
Ikon
Farve
Tema
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 4ad4c5dd9..9fcd6379c 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -277,7 +277,6 @@
Standardliste
Deckkraft
Farbe
- Akzent
Launcher-Symbol
Schwarz
Hell
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index 01bf188db..75fe0d5f6 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -596,7 +596,6 @@
%s antaŭ limdato
Neniu programeto povis pritrakti ĉi tiun peton
Lanĉila piktogramo
- Akcento
Ne trovis hejman aron
Reŝargi aĉetojn
Tasks kolektas lokan datumon por ebligi lok-bazitajn memorigilojn, eĉ kiam la programeto estas fermita aŭ ne uzata.
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 0d643e66a..79f493902 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -299,7 +299,6 @@
Filtro
Opacidad
Tema
- Acentuado
Icono del iniciador
Negro
Claro
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 8a59bd824..7308fff92 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -425,7 +425,6 @@
Järgmine P
Järgmine L
Kohalikustamine
- Rõhuvärv
Meeldetuletusega
Privaatsus
Lisa alamülesanne
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index c6bd64491..89b8f0ad6 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -288,7 +288,6 @@
Opakutasuna
Azala
Kolorea
- Azentua
Abiarazlearen ikonoa
Beltza
Argia
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 23f76cc17..da8ac4b1f 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -265,7 +265,6 @@
Läpinäkyvyys
Teema
Väri
- Sävy
Musta
Vaalea
Tumma
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 2b7e9556f..d53850329 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -401,7 +401,6 @@
Vibrations
%s m
Étiquettes
- Couleur d\'accentuation
Badges
", "
Version %s
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index b661d0d4f..103dfa86a 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -208,7 +208,6 @@
Opacidade
Tema
Cor
- Resaltado
Negro
Claro
Escuro
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index bf4498e49..1249600c5 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -345,7 +345,6 @@
Svjetla
Crna
Ikona pokretača
- Isticanje
Ikona
Boja
Tema
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 0abc28c65..302af3d5d 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -281,7 +281,6 @@
Átlátszóság
Téma
Szín
- Kiemelés
Launcher ikon
Fekete
Világos
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 8b80f733a..ccab01114 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -219,7 +219,6 @@
Tema
Warna
Ikon
- Aksen
Ikon peluncur
Hitam
Cerah
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 774292bb5..24043bf4f 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -296,7 +296,6 @@
Opacità
Tema
Colore
- Colore secondario
Icona del launcher
Nero
Chiaro
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 1ef2424fd..dad185e6e 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -318,7 +318,6 @@
אטימות
ערכת נושא
צבע
- צבע משני
צלמית משגר
שחור
בהיר
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 7b7e85592..1923fe14c 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -283,7 +283,6 @@
透明度
テーマ
色
- アクセント
ランチャーアイコン
黒
ライト
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index a69ff0db9..e4c7fac6b 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -280,7 +280,6 @@
불투명도
테마
색상
- 강조
런처 아이콘
검정
밝게
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 095e1bad3..91dfbba20 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -306,7 +306,6 @@
Permatomumas
Tema
Spalva
- Akcentas
Paleidimo piktograma
Juoda
Šviesi
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 30954d589..8e02cf71c 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -312,7 +312,6 @@
Filter
Drakt
Farge
- Aksentfarge
Oppstarterfarge
Svart
Lys
diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml
index 1dd81a289..067957034 100644
--- a/app/src/main/res/values-night/colors.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -1,8 +1,8 @@
- @color/md_background_dark
- @color/md_background_dark
- @color/md_background_dark
+ #FF0F1416
+ #FF0F1416
+ #FF1B2023
@color/md_background_dark
@color/icon_tint_dark
@color/icon_tint_dark_alpha
diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml
index 960cb957e..868d2b65c 100644
--- a/app/src/main/res/values-night/styles.xml
+++ b/app/src/main/res/values-night/styles.xml
@@ -1,18 +1,29 @@
-
+
-
+
-
+
-
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index f59d48a0c..0373f120e 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -380,7 +380,6 @@
%s m
Filters
Filter
- Accent
Abonnement opzeggen
Bepaal je eigen prijs
Later
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 616eff22f..6486e0f33 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -296,7 +296,6 @@
Nieprzezroczystość
Motyw
Kolor
- Akcent
Ikona programu startowego
Czarny
Jasny
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index c22ba6793..973a9adaa 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -294,7 +294,6 @@
Opacidade
Tema
Cor
- Cor de destaque
Ícone do lançador
Preto
Claro
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 2b46c44a1..8899f4ff8 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -267,7 +267,6 @@
Opacidade
Tema
Cor
- Destaque
Preto
Claro
Escuro
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 66a78f1cc..8bf2a5e3d 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -9,7 +9,6 @@
E-mail
Calendar
Compact
- Accent
Estim. %s
Calendar
Salvat %1$s în %2$s.
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index b1a3003fb..b80232e28 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -298,7 +298,6 @@
Непрозрачность
Цветовая тема
Цвет
- Акцент
Иконка запуска
Чёрная
Светлая
diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml
index 90fae4760..01881860e 100644
--- a/app/src/main/res/values-si/strings.xml
+++ b/app/src/main/res/values-si/strings.xml
@@ -394,7 +394,6 @@
පුනරාවර්තනය %s
පුනරාවර්තනය වනුයේ
බහු දැනුම්දීම්
- දෙවන වර්ණය
%1$s, %2$s ට පසුව පැමිණිය යුතුය
%2$s පෙර %1$s පැමිණිය යුතුය
නිහඬ කාලය අවසානය
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 66165859d..00c62e764 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -301,7 +301,6 @@
Priehľadnosť
Téma
Farba
- Zvýraznenie
Ikona
Čierna
Svetlá
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 56f579a82..ada926213 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -300,7 +300,6 @@
Värddatornamn krävs
Måste börja med http(s)://
Filter
- Accent
Hemskärmsikon
Överskriftsinställningar
Radinställningar
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 4cb303281..704faa6b1 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -303,7 +303,6 @@
இருள்
ஒளி
கருப்பு
- உச்சரிப்பு
உருவம்
நிறம்
பேசும்
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index e09a7b760..287b3f97a 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -287,7 +287,6 @@
แสง
ดำ
ไอคอนตัวเปิดใช้
- สำเนียง
ไอคอน
สี
หัวข้อ
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 399bdb09d..f73ef5e5d 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -287,7 +287,6 @@
Şeffaflık
Gövde
Renk
- Ara renk
Başlatıcı simgesi
Siyah
Açık
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 3d6267a73..7fb3c216f 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -298,7 +298,6 @@
Прозорість
Тема
Колір
- Акцент
Піктограма запуску
Чорна
Світла
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index db3f39d4f..41e5fa383 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -332,7 +332,6 @@
سفید
سیاہ
لانچر آئیکن
- ایکسنٹ
آئیکن
رنگ
تھیم
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 40a51bb95..c617bd4f9 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -338,7 +338,6 @@
Sáng
Đen
Biểu tượng trên launcher
- Màu nổi bật
Biểu tượng
Màu
Chủ đề
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 4dcd6bba1..3bca143cc 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -268,7 +268,6 @@
不透明度
主题
颜色
- 强调色
启动器图标
黑色
亮色
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index e875a678f..310434fb7 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -143,7 +143,6 @@
透明度
主題
色彩
- 強調色
語言
重新啟動 Tasks以使變更生效
馬上重新啟動
diff --git a/app/src/main/res/values/accents.xml b/app/src/main/res/values/accents.xml
deleted file mode 100644
index fde2decda..000000000
--- a/app/src/main/res/values/accents.xml
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8906786d2..7cb05640a 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -37,7 +37,7 @@
@color/md_background_light
@color/md_background_light
- @color/md_background_light
+ #FFEAEFF1
@color/md_background_light
@color/icon_tint_light
@color/icon_tint_light_alpha
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 6119e90d0..f91718259 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -317,7 +317,6 @@
Tasker/Locale
theme_style
theme_color
- theme_accent
theme_launcher
language
led_notificatiWCAon
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 97e407b60..4679673c5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -385,7 +385,6 @@ File %1$s contained %2$s.\n\n
Theme
Color
Icon
- Accent
Launcher icon
Black
Light
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 2df34b3e4..30e0ed8a7 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,7 +1,5 @@
-
-
@@ -33,7 +29,7 @@
- false
-
-
-
-
-
-
-
-
-
@@ -103,18 +75,6 @@
- @color/black_100
-
-
-
-
-
-
@@ -199,60 +159,23 @@
- fitCenter
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
+
diff --git a/app/src/main/res/values/theme.xml b/app/src/main/res/values/theme.xml
index 4b2df5e85..d0f598cab 100644
--- a/app/src/main/res/values/theme.xml
+++ b/app/src/main/res/values/theme.xml
@@ -1,15 +1,17 @@
-
+
-
+
-
+
@@ -48,12 +48,16 @@
diff --git a/app/src/main/res/xml/preferences_look_and_feel.xml b/app/src/main/res/xml/preferences_look_and_feel.xml
index f3d0875f5..4d68cd6be 100644
--- a/app/src/main/res/xml/preferences_look_and_feel.xml
+++ b/app/src/main/res/xml/preferences_look_and_feel.xml
@@ -11,10 +11,6 @@
android:key="@string/p_theme_color"
android:title="@string/color" />
-
-
diff --git a/kmp/src/commonMain/kotlin/org/tasks/compose/Ime.kt b/kmp/src/commonMain/kotlin/org/tasks/compose/Ime.kt
new file mode 100644
index 000000000..43dc84e6e
--- /dev/null
+++ b/kmp/src/commonMain/kotlin/org/tasks/compose/Ime.kt
@@ -0,0 +1,26 @@
+package org.tasks.kmp.org.tasks.compose
+
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.ime
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.State
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalDensity
+import co.touchlab.kermit.Logger
+
+@Composable
+fun rememberImeState(): State {
+ val density = LocalDensity.current
+ val ime = WindowInsets.ime
+ val imeState = remember {
+ derivedStateOf {
+ ime.getBottom(density) > 0
+ }
+ }
+ LaunchedEffect(imeState.value) {
+ Logger.d("imeState") { "keyboardOpen=${imeState.value}" }
+ }
+ return imeState
+}
diff --git a/kmp/src/commonMain/kotlin/org/tasks/compose/TouchSlopMultiplier.kt b/kmp/src/commonMain/kotlin/org/tasks/compose/TouchSlopMultiplier.kt
new file mode 100644
index 000000000..cbbb98317
--- /dev/null
+++ b/kmp/src/commonMain/kotlin/org/tasks/compose/TouchSlopMultiplier.kt
@@ -0,0 +1,22 @@
+package org.tasks.kmp.org.tasks.compose
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.platform.LocalViewConfiguration
+import androidx.compose.ui.platform.ViewConfiguration
+
+@Composable
+fun TouchSlopMultiplier(
+ multiplier: Float = 3f,
+ content: @Composable () -> Unit,
+) {
+ val current = LocalViewConfiguration.current
+
+ val viewConfiguration = object : ViewConfiguration by current {
+ override val touchSlop: Float
+ get() = current.touchSlop * multiplier
+ }
+ CompositionLocalProvider(LocalViewConfiguration provides viewConfiguration) {
+ content()
+ }
+}
diff --git a/kmp/src/commonMain/kotlin/org/tasks/compose/components/SearchBar.kt b/kmp/src/commonMain/kotlin/org/tasks/compose/components/SearchBar.kt
index 288fadc4d..03918e7ce 100644
--- a/kmp/src/commonMain/kotlin/org/tasks/compose/components/SearchBar.kt
+++ b/kmp/src/commonMain/kotlin/org/tasks/compose/components/SearchBar.kt
@@ -24,6 +24,8 @@ import androidx.compose.ui.focus.focusProperties
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp
+val SEARCH_BAR_HEIGHT = 56.dp
+
@Composable
fun SearchBar(
modifier: Modifier = Modifier,
@@ -37,7 +39,7 @@ fun SearchBar(
OutlinedTextField(
shape = MaterialTheme.shapes.medium,
modifier = modifier
- .height(56.dp)
+ .height(SEARCH_BAR_HEIGHT)
.focusProperties {
this.canFocus = canFocus
},
diff --git a/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/TaskListDrawer.kt b/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/TaskListDrawer.kt
index 2bd20f202..9062a9095 100644
--- a/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/TaskListDrawer.kt
+++ b/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/TaskListDrawer.kt
@@ -12,11 +12,14 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.WindowInsets
+import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.systemBars
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
@@ -50,6 +53,7 @@ import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.layout.layout
+import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import kotlinx.collections.immutable.ImmutableList
@@ -58,6 +62,7 @@ import org.tasks.compose.components.Chevron
import org.tasks.compose.components.SearchBar
import org.tasks.compose.components.TasksIcon
import org.tasks.kmp.formatNumber
+import org.tasks.kmp.org.tasks.compose.rememberImeState
import tasks.kmp.generated.resources.Res
import tasks.kmp.generated.resources.help_and_feedback
import tasks.kmp.generated.resources.search
@@ -65,6 +70,9 @@ import tasks.kmp.generated.resources.settings
import tasks.kmp.generated.resources.subscribe
import kotlin.math.roundToInt
+@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
+private val SEARCH_BAR_BOTTOM_PADDING = androidx.compose.material3.OutlinedTextFieldTopPadding
+
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TaskListDrawer(
@@ -90,16 +98,17 @@ fun TaskListDrawer(
bottomBar = {
if (bottomSearchBar) {
BottomAppBar(
- modifier = Modifier.layout { measurable, constraints ->
- val placeable = measurable.measure(constraints)
- bottomAppBarScrollBehavior.state.heightOffsetLimit =
- -placeable.height.toFloat()
- val height =
- placeable.height + bottomAppBarScrollBehavior.state.heightOffset
- layout(placeable.width, height.roundToInt().coerceAtLeast(0)) {
- placeable.place(0, 0)
- }
- },
+ modifier = Modifier
+ .layout { measurable, constraints ->
+ val placeable = measurable.measure(constraints)
+ bottomAppBarScrollBehavior.state.heightOffsetLimit =
+ -placeable.height.toFloat()
+ val height =
+ placeable.height + bottomAppBarScrollBehavior.state.heightOffset
+ layout(placeable.width, height.roundToInt().coerceAtLeast(0)) {
+ placeable.place(0, 0)
+ }
+ },
containerColor = MaterialTheme.colorScheme.surface,
scrollBehavior = bottomAppBarScrollBehavior
) {
@@ -122,10 +131,14 @@ fun TaskListDrawer(
)
}
}
- ) { paddingValues ->
+ ) { contentPadding ->
+ val keyboardOpen = rememberImeState().value
LazyColumn(
- modifier = Modifier.fillMaxSize().imePadding(),
- contentPadding = paddingValues,
+ modifier = Modifier.fillMaxSize(),
+ contentPadding = if (keyboardOpen)
+ contentPadding
+ else
+ WindowInsets.systemBars.asPaddingValues(),
verticalArrangement = arrangement,
) {
items(items = filters, key = { it.key() }) {
@@ -275,6 +288,7 @@ fun RowScope.MenuSearchBar(
query: String,
onQueryChange: (String) -> Unit,
) {
+ val density = LocalDensity.current
var hasFocus by remember { mutableStateOf(false) }
SearchBar(
modifier = Modifier
@@ -282,7 +296,7 @@ fun RowScope.MenuSearchBar(
.padding(
start = 8.dp,
end = if (hasFocus) 8.dp else 0.dp,
- bottom = 4.dp
+ bottom = with(density) { SEARCH_BAR_BOTTOM_PADDING.toDp() }
)
.weight(1f)
.animateContentSize(
diff --git a/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt b/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt
index 8bfcfc474..952ff4c70 100644
--- a/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt
+++ b/kmp/src/commonMain/kotlin/org/tasks/themes/TasksTheme.kt
@@ -1,31 +1,26 @@
package org.tasks.themes
import androidx.compose.foundation.isSystemInDarkTheme
-import androidx.compose.material3.ColorScheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.luminance
import androidx.compose.ui.graphics.toArgb
import org.tasks.kmp.org.tasks.themes.ColorProvider.saturated
const val BLUE = -14575885
const val WHITE = -1
-@Composable
-fun ColorScheme.isDark() = this.background.luminance() <= 0.5
-
private val lightColorScheme = lightColorScheme(
- surface = Color.White,
+ surface = Color(0xFFEAEFF1),
background = Color.White,
)
private val darkColorScheme = darkColorScheme(
- surface = Color(0xFF202124),
- background = Color(0xFF202124),
+ surface = Color(0xFF1B2023),
+ background = Color(0xFF0F1416),
)
private val blackColorScheme = darkColorScheme.copy(