Fix some compose theme issues

pull/3145/head
Alex Baker 1 year ago
parent f48224e555
commit 82ceda7108

@ -129,7 +129,7 @@ class MainActivity : AppCompatActivity() {
binding.composeView.setContent {
if (viewModel.drawerOpen.collectAsStateWithLifecycle().value) {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
val sheetState = rememberModalBottomSheetState(
skipPartiallyExpanded = true,
confirmValueChange = { true },

@ -143,6 +143,7 @@ import org.tasks.tasklist.TasksResults
import org.tasks.tasklist.ViewHolderFactory
import org.tasks.themes.ColorProvider
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import org.tasks.themes.ThemeColor
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.ui.TaskEditEvent
@ -185,6 +186,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
@Inject lateinit var taskEditEventBus: TaskEditEventBus
@Inject lateinit var database: Database
@Inject lateinit var markdown: MarkdownProvider
@Inject lateinit var theme: Theme
private val listViewModel: TaskListViewModel by viewModels()
private val mainViewModel: MainActivityViewModel by activityViewModels()
@ -363,7 +365,7 @@ class TaskListFragment : Fragment(), OnRefreshListener, Toolbar.OnMenuItemClickL
binding.banner.setContent {
val context = LocalContext.current
val state = listViewModel.state.collectAsStateWithLifecycle().value
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
val hasRemindersPermission by rememberReminderPermissionState()
val notificationPermissions = if (AndroidUtilities.atLeastTiramisu()) {
rememberPermissionState(

@ -63,7 +63,7 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), To
setOnClickListener { showThemePicker() }
}
findViewById<ComposeView>(R.id.icon).setContent {
TasksTheme {
TasksTheme(theme = tasksTheme.themeBase.index) {
Row(
verticalAlignment = Alignment.CenterVertically,
) {

@ -30,7 +30,14 @@ import androidx.lifecycle.lifecycleScope
import at.bitfire.dav4jvm.exception.HttpException
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import net.openid.appauth.*
import net.openid.appauth.AuthState
import net.openid.appauth.AuthorizationException
import net.openid.appauth.AuthorizationRequest
import net.openid.appauth.AuthorizationServiceConfiguration
import net.openid.appauth.ClientSecretBasic
import net.openid.appauth.RegistrationRequest
import net.openid.appauth.RegistrationResponse
import net.openid.appauth.ResponseTypeValues
import org.tasks.R
import org.tasks.Tasks.Companion.IS_GENERIC
import org.tasks.analytics.Firebase
@ -42,7 +49,7 @@ import org.tasks.compose.SignInDialog
import org.tasks.dialogs.DialogBuilder
import org.tasks.extensions.Context.openUri
import org.tasks.themes.TasksTheme
import org.tasks.themes.ThemeColor
import org.tasks.themes.Theme
import timber.log.Timber
import java.util.concurrent.CountDownLatch
import java.util.concurrent.ExecutorService
@ -61,7 +68,7 @@ import javax.inject.Inject
*/
@AndroidEntryPoint
class SignInActivity : ComponentActivity() {
@Inject lateinit var themeColor: ThemeColor
@Inject lateinit var theme: Theme
@Inject lateinit var inventory: Inventory
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var firebase: Firebase
@ -98,7 +105,7 @@ class SignInActivity : ComponentActivity() {
var selectedPlatform by rememberSaveable {
mutableStateOf(autoSelect)
}
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
selectedPlatform
?.let {
Dialog(onDismissRequest = { finish() }) {
@ -349,7 +356,7 @@ class SignInActivity : ComponentActivity() {
Timber.i("Warming up browser instance for auth request")
mAuthIntent.set(authService.createCustomTabsIntent(
mAuthRequest.get().toUri(),
themeColor.primaryColor
theme.themeColor.primaryColor
))
mAuthIntentLatch.countDown()
}

@ -56,7 +56,7 @@ class PurchaseActivity : AppCompatActivity(), OnPurchasesUpdated {
}
setContent {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
BackHandler {
finish()
}

@ -24,7 +24,6 @@ import at.bitfire.dav4jvm.exception.HttpException
import com.franmontiel.persistentcookiejar.persistence.CookiePersistor
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import org.tasks.data.entity.Task
import com.todoroo.astrid.service.TaskDeleter
import kotlinx.coroutines.launch
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
@ -34,9 +33,10 @@ import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity
import org.tasks.compose.ServerSelector
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.SERVER_UNKNOWN
import org.tasks.data.dao.CaldavDao
import org.tasks.data.entity.Task
import org.tasks.databinding.ActivityCaldavAccountSettingsBinding
import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.Linkify
@ -138,7 +138,7 @@ abstract class BaseCaldavAccountSettingsActivity : ThemedInjectingAppCompatActiv
)
binding.password.setOnFocusChangeListener { _, hasFocus -> onPasswordFocused(hasFocus) }
binding.serverSelector.setContent {
TasksTheme {
TasksTheme(theme = tasksTheme.themeBase.index) {
var selected by rememberSaveable { serverType }
ServerSelector(selected) {
serverType.value = it

@ -53,7 +53,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
caldavCalendar?.takeIf { it.id > 0 }?.let {
findViewById<ComposeView>(R.id.people).setContent {
TasksTheme {
TasksTheme(theme = tasksTheme.themeBase.index) {
val principals = principalDao.getPrincipals(it.id).collectAsStateWithLifecycle(initialValue = emptyList()).value
PrincipalList(
principals = principals,
@ -66,7 +66,7 @@ class CaldavCalendarSettingsActivity : BaseCaldavCalendarSettingsActivity() {
findViewById<ComposeView>(R.id.fab)
.apply { isVisible = true }
.setContent {
TasksTheme {
TasksTheme(theme = tasksTheme.themeBase.index) {
val openDialog = rememberSaveable { mutableStateOf(false) }
ShareInviteDialog(
openDialog,

@ -9,27 +9,32 @@ import androidx.fragment.app.Fragment
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.compose.pickers.CalendarPicker
import org.tasks.dialogs.DialogBuilder
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import javax.inject.Inject
@AndroidEntryPoint
class CalendarPicker : DialogFragment() {
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var theme: Theme
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return dialogBuilder
.newDialog()
.setContent {
CalendarPicker(
selected = arguments?.getString(EXTRA_SELECTED),
onSelected = {
targetFragment!!.onActivityResult(
targetRequestCode,
Activity.RESULT_OK,
Intent().putExtra(EXTRA_CALENDAR_ID, it?.id)
)
dismiss()
},
)
TasksTheme(theme = theme.themeBase.index) {
CalendarPicker(
selected = arguments?.getString(EXTRA_SELECTED),
onSelected = {
targetFragment!!.onActivityResult(
targetRequestCode,
Activity.RESULT_OK,
Intent().putExtra(EXTRA_CALENDAR_ID, it?.id)
)
dismiss()
},
)
}
}
.show()
}

@ -28,17 +28,19 @@ import org.tasks.billing.PurchaseActivity.Companion.EXTRA_NAME_YOUR_PRICE
import org.tasks.compose.pickers.IconPicker
import org.tasks.compose.pickers.IconPickerViewModel
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import javax.inject.Inject
@AndroidEntryPoint
class IconPickerActivity : AppCompatActivity() {
@Inject lateinit var inventory: Inventory
@Inject lateinit var theme: Theme
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
var hasPro by remember { mutableStateOf(false) }
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
hasPro = inventory.hasPro

@ -23,37 +23,35 @@ fun DatePickerDialog(
selected: (Long) -> Unit,
dismiss: () -> Unit,
) {
TasksTheme {
val initialDateUTC by remember(initialDate) {
derivedStateOf {
DateTime(initialDate).toUTC().millis
}
val initialDateUTC by remember(initialDate) {
derivedStateOf {
DateTime(initialDate).toUTC().millis
}
val datePickerState = rememberDatePickerState(
initialSelectedDateMillis = initialDateUTC,
)
androidx.compose.material3.DatePickerDialog(
onDismissRequest = { dismiss() },
dismissButton = {
TextButton(onClick = dismiss) {
Text(text = stringResource(id = R.string.cancel))
}
},
confirmButton = {
TextButton(
onClick = {
datePickerState
.selectedDateMillis
?.let { selected(it - DateTime(it).offset) }
dismiss()
}
) {
Text(text = stringResource(id = R.string.ok))
}
val datePickerState = rememberDatePickerState(
initialSelectedDateMillis = initialDateUTC,
)
androidx.compose.material3.DatePickerDialog(
onDismissRequest = { dismiss() },
dismissButton = {
TextButton(onClick = dismiss) {
Text(text = stringResource(id = R.string.cancel))
}
},
confirmButton = {
TextButton(
onClick = {
datePickerState
.selectedDateMillis
?.let { selected(it - DateTime(it).offset) }
dismiss()
}
) {
Text(text = stringResource(id = R.string.ok))
}
) {
DatePicker(state = datePickerState)
}
) {
DatePicker(state = datePickerState)
}
}

@ -8,7 +8,6 @@ import androidx.appcompat.app.AlertDialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.ComposeView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.tasks.themes.TasksTheme
class AlertDialogBuilder internal constructor(private val context: Context) {
private val builder: AlertDialog.Builder
@ -72,9 +71,7 @@ class AlertDialogBuilder internal constructor(private val context: Context) {
builder.setView(ComposeView(context)
.apply {
setContent {
TasksTheme {
content()
}
content()
}
}
)

@ -62,10 +62,14 @@ import kotlinx.coroutines.launch
import org.tasks.R
import org.tasks.compose.SystemBars
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import javax.inject.Inject
@AndroidEntryPoint
class SortSettingsActivity : ComponentActivity() {
@Inject lateinit var theme: Theme
private val viewModel: SortSettingsViewModel by viewModels()
@OptIn(ExperimentalMaterial3Api::class)
@ -74,7 +78,7 @@ class SortSettingsActivity : ComponentActivity() {
WindowCompat.setDecorFitsSystemWindows(window, false)
window.statusBarColor = ContextCompat.getColor(this, android.R.color.transparent)
setContent {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
val scrimColor = if (isSystemInDarkTheme())
Color(0x52454545)
else

@ -10,15 +10,19 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint
import org.tasks.compose.pickers.CustomRecurrence
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import javax.inject.Inject
@AndroidEntryPoint
class CustomRecurrenceActivity : FragmentActivity() {
@Inject lateinit var theme: Theme
val viewModel: CustomRecurrenceViewModel by viewModels()
override fun onPostCreate(savedInstanceState: Bundle?) {
super.onPostCreate(savedInstanceState)
setContent {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
CustomRecurrence(
state = viewModel.state.collectAsStateWithLifecycle().value,
save = {

@ -9,12 +9,15 @@ import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R
import org.tasks.dialogs.DialogBuilder
import org.tasks.extensions.Context.openUri
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import javax.inject.Inject
@AndroidEntryPoint
class AddAccountDialog : DialogFragment() {
@Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var theme: Theme
private val hasTasksAccount: Boolean
get() = arguments?.getBoolean(EXTRA_HAS_TASKS_ACCOUNT) ?: false
@ -34,10 +37,12 @@ class AddAccountDialog : DialogFragment() {
.newDialog()
.setTitle(R.string.choose_synchronization_service)
.setContent {
org.tasks.compose.AddAccountDialog(
hasTasksAccount = hasTasksAccount,
selected = this::selected
)
TasksTheme(theme = theme.themeBase.index) {
org.tasks.compose.AddAccountDialog(
hasTasksAccount = hasTasksAccount,
selected = this::selected
)
}
}
.setNeutralButton(R.string.help) { _, _ -> activity?.openUri(R.string.help_url_sync) }
.setNegativeButton(R.string.cancel, null)

@ -83,7 +83,7 @@ class TagPickerActivity : ThemedInjectingAppCompatActivity() {
viewModel.search("")
setContent {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
TagPicker(
viewModel,
onBackClicked = { handleBackPressed() },

@ -41,6 +41,7 @@ import org.tasks.markdown.Markdown
import org.tasks.preferences.Preferences
import org.tasks.themes.TasksIcons
import org.tasks.themes.TasksTheme
import org.tasks.themes.Theme
import org.tasks.time.DateTimeUtils2.currentTimeMillis
import org.tasks.time.startOfDay
import org.tasks.ui.CheckBoxProvider
@ -64,7 +65,8 @@ class TaskViewHolder internal constructor(
private val rowPaddingDp: Int,
private val rowPaddingPx: Int,
private val linkify: Linkify,
private val markdown: Markdown
private val markdown: Markdown,
private val theme: Theme,
) : RecyclerView.ViewHolder(binding.root) {
private val row: ViewGroup = binding.row
private val dueDate: TextView = binding.dueDate.apply {
@ -255,7 +257,7 @@ class TaskViewHolder internal constructor(
val toggleSubtasks = { task: Long, collapsed: Boolean -> callback.toggleSubtasks(task, collapsed) }
val onClick = { it: Filter -> callback.onClick(it) }
chipGroup.setContent {
TasksTheme {
TasksTheme(theme = theme.themeBase.index) {
ChipGroup(
modifier = Modifier.padding(
end = 16.dp,

@ -14,17 +14,19 @@ import org.tasks.markdown.MarkdownProvider
import org.tasks.preferences.Preferences
import org.tasks.preferences.ResourceResolver
import org.tasks.tasklist.TaskViewHolder.ViewHolderCallbacks
import org.tasks.themes.Theme
import org.tasks.ui.CheckBoxProvider
import org.tasks.ui.ChipProvider
import javax.inject.Inject
class ViewHolderFactory @Inject constructor(
@param:ActivityContext private val context: Context,
private val preferences: Preferences,
private val chipProvider: ChipProvider,
private val checkBoxProvider: CheckBoxProvider,
private val linkify: Linkify,
private val headerFormatter: HeaderFormatter,
@param:ActivityContext private val context: Context,
private val preferences: Preferences,
private val chipProvider: ChipProvider,
private val checkBoxProvider: CheckBoxProvider,
private val linkify: Linkify,
private val headerFormatter: HeaderFormatter,
private val theme: Theme,
) {
private val textColorSecondary: Int = ResourceResolver.getData(context, android.R.attr.textColorSecondary)
private val textColorOverdue: Int = context.getColor(R.color.overdue)
@ -47,21 +49,22 @@ class ViewHolderFactory @Inject constructor(
fun newViewHolder(parent: ViewGroup?, callbacks: ViewHolderCallbacks) =
TaskViewHolder(
context as Activity,
TaskAdapterRowBinding.inflate(LayoutInflater.from(context), parent, false),
preferences,
fontSize,
chipProvider,
checkBoxProvider,
textColorOverdue,
textColorSecondary,
callbacks,
metrics,
background,
selectedColor,
rowPaddingDp,
rowPaddingPx,
linkify,
markdown
context as Activity,
TaskAdapterRowBinding.inflate(LayoutInflater.from(context), parent, false),
preferences,
fontSize,
chipProvider,
checkBoxProvider,
textColorOverdue,
textColorSecondary,
callbacks,
metrics,
background,
selectedColor,
rowPaddingDp,
rowPaddingPx,
linkify,
markdown,
theme = theme,
)
}

@ -13,10 +13,29 @@ import androidx.compose.ui.graphics.luminance
const val BLUE = -14575885
const val WHITE = -1
@Composable
fun ColorScheme.isDark() = this.background.luminance() <= 0.5
private val lightColorScheme = lightColorScheme(
surface = Color.White,
background = Color.White,
)
private val darkColorScheme = darkColorScheme(
surface = Color(0xFF202124),
background = Color(0xFF202124),
)
private val blackColorScheme = darkColorScheme.copy(
background = Color.Black,
surface = Color.Black,
)
private val wallpaperScheme = darkColorScheme.copy(
background = Color.Transparent,
surface = Color(0x99000000),
)
@Composable
fun TasksTheme(
theme: Int = 5,
@ -24,14 +43,11 @@ fun TasksTheme(
content: @Composable () -> Unit,
) {
val colorScheme = when (theme) {
0 -> lightColorScheme()
1 -> darkColorScheme(
surface = Color.Black,
background = Color.Black,
)
2, 3 -> darkColorScheme()
else -> if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
0 -> lightColorScheme
1 -> blackColorScheme
2 -> darkColorScheme
3 -> wallpaperScheme
else -> if (isSystemInDarkTheme()) darkColorScheme else lightColorScheme
}
val colorOnPrimary = remember(primary) {
if (calculateContrast(WHITE, primary) < 3) {
@ -48,4 +64,4 @@ fun TasksTheme(
) {
content()
}
}
}

Loading…
Cancel
Save