From ba66deaddc25dd6801f2476ff2f294f4773df498 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sun, 23 Feb 2025 12:33:28 -0600 Subject: [PATCH] Material 3 - WIP --- app/src/main/AndroidManifest.xml | 4 +- .../todoroo/astrid/activity/MainActivity.kt | 501 ++++++++++-------- .../astrid/activity/MainActivityViewModel.kt | 1 - .../astrid/activity/TaskEditFragment.kt | 15 +- .../astrid/activity/TaskListFragment.kt | 89 ++-- .../todoroo/astrid/timers/TimerControlSet.kt | 6 +- .../astrid/ui/TimeDurationControlSet.kt | 9 +- .../activities/DateAndTimePickerActivity.kt | 3 - .../org/tasks/billing/PurchaseActivity.kt | 2 - .../caldav/CaldavCalendarSettingsActivity.kt | 7 +- .../java/org/tasks/compose/TaskEditRow.kt | 2 +- .../java/org/tasks/compose/edit/DueDateRow.kt | 2 +- .../org/tasks/compose/edit/TaskEditScreen.kt | 13 +- .../org/tasks/dialogs/BaseDateTimePicker.kt | 19 +- .../org/tasks/dialogs/ColorPalettePicker.kt | 1 - .../org/tasks/dialogs/ColorPickerAdapter.kt | 1 - .../org/tasks/dialogs/ThemePickerDialog.kt | 2 - .../org/tasks/injection/ActivityModule.kt | 7 - .../tasks/location/LocationPickerActivity.kt | 12 +- .../preferences/fragments/LookAndFeel.kt | 18 - .../tasks/reminders/NotificationActivity.kt | 3 - .../org/tasks/reminders/SnoozeActivity.kt | 3 - .../java/org/tasks/themes/ColorProvider.kt | 9 - app/src/main/java/org/tasks/themes/Theme.kt | 18 +- .../java/org/tasks/themes/ThemeAccent.java | 119 ----- .../java/org/tasks/themes/ThemeColor.java | 12 - .../mtrl_choice_chip_background_color.xml | 26 - .../res/color/mtrl_choice_chip_text_color.xml | 27 - .../res/color/mtrl_filled_stroke_color.xml | 23 - .../mtrl_text_btn_text_color_selector.xml | 23 - .../res/layout/activity_location_picker.xml | 13 +- .../res/layout/date_time_picker_shortcuts.xml | 2 +- .../main/res/layout/dialog_app_password.xml | 6 +- .../dialog_date_time_picker_buttons.xml | 4 +- app/src/main/res/layout/dialog_whats_new.xml | 2 +- .../main/res/layout/fragment_task_list.xml | 15 +- app/src/main/res/layout/row_place.xml | 4 +- .../layout/simple_list_item_single_choice.xml | 2 +- .../main/res/layout/task_adapter_header.xml | 2 +- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-bg-rBG/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-et/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-id/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lt/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-night/colors.xml | 6 +- app/src/main/res/values-night/styles.xml | 23 +- app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-si/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-ta/strings.xml | 1 - app/src/main/res/values-th/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-ur/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 1 - app/src/main/res/values-zh-rTW/strings.xml | 1 - app/src/main/res/values/accents.xml | 140 ----- app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/keys.xml | 1 - app/src/main/res/values/strings.xml | 1 - app/src/main/res/values/styles.xml | 109 +--- app/src/main/res/values/theme.xml | 16 +- .../res/xml/preferences_look_and_feel.xml | 4 - .../kotlin/org/tasks/compose/Ime.kt | 26 + .../org/tasks/compose/TouchSlopMultiplier.kt | 22 + .../org/tasks/compose/components/SearchBar.kt | 4 +- .../tasks/compose/drawer/TaskListDrawer.kt | 42 +- .../kotlin/org/tasks/themes/TasksTheme.kt | 11 +- 92 files changed, 523 insertions(+), 950 deletions(-) delete mode 100644 app/src/main/java/org/tasks/themes/ThemeAccent.java delete mode 100644 app/src/main/res/color/mtrl_choice_chip_background_color.xml delete mode 100644 app/src/main/res/color/mtrl_choice_chip_text_color.xml delete mode 100644 app/src/main/res/color/mtrl_filled_stroke_color.xml delete mode 100644 app/src/main/res/color/mtrl_text_btn_text_color_selector.xml delete mode 100644 app/src/main/res/values/accents.xml create mode 100644 kmp/src/commonMain/kotlin/org/tasks/compose/Ime.kt create mode 100644 kmp/src/commonMain/kotlin/org/tasks/compose/TouchSlopMultiplier.kt 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(