Support dynamic colors, but keep brand colors as default

This commit is contained in:
Torsten Grote
2025-12-15 11:06:36 -03:00
parent 61fb334a34
commit b5cc123dff
57 changed files with 282 additions and 61 deletions

View File

@@ -9,8 +9,12 @@ import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import dagger.hilt.android.AndroidEntryPoint
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_DYNAMIC_COLORS
import org.fdroid.settings.SettingsManager
import org.fdroid.ui.Main
import javax.inject.Inject
// Using [AppCompatActivity] and not [ComponentActivity] seems to be needed
// for automatic theme changes when calling AppCompatDelegate.setDefaultNightMode()
@@ -20,11 +24,17 @@ class MainActivity : AppCompatActivity() {
val requestPermissionLauncher = registerForActivityResult(RequestPermission()) { isGranted ->
}
@Inject
lateinit var settingsManager: SettingsManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
Main {
val dynamicColors = settingsManager.dynamicColorFlow.collectAsStateWithLifecycle(
PREF_DEFAULT_DYNAMIC_COLORS
).value
Main(dynamicColors) {
// inform OnNewIntentListeners about the initial intent (otherwise would be missed)
if (savedInstanceState == null && intent != null) {
onNewIntent(intent)

View File

@@ -1 +0,0 @@
../../../../../../../../../app/src/main/java/org/fdroid/fdroid/ui/theme/Theme.kt

View File

@@ -10,6 +10,9 @@ object SettingsConstants {
const val PREF_KEY_THEME = "theme"
const val PREF_DEFAULT_THEME = "followSystem"
const val PREF_KEY_DYNAMIC_COLORS = "dynamicColors"
const val PREF_DEFAULT_DYNAMIC_COLORS = false
const val PREF_KEY_REPO_UPDATES = "repoUpdates"
const val PREF_DEFAULT_REPO_UPDATES = true

View File

@@ -6,6 +6,7 @@ import androidx.core.content.edit
import dagger.hilt.android.qualifiers.ApplicationContext
import io.ktor.client.engine.ProxyBuilder
import io.ktor.client.engine.ProxyConfig
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -16,6 +17,7 @@ import mu.KotlinLogging
import org.fdroid.database.AppListSortOrder
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_APP_LIST_SORT_ORDER
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_AUTO_UPDATES
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_DYNAMIC_COLORS
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_LAST_UPDATE_CHECK
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PROXY
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_REPO_UPDATES
@@ -23,6 +25,7 @@ import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_SHOW_INCOMPATIBLE
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_THEME
import org.fdroid.settings.SettingsConstants.PREF_KEY_APP_LIST_SORT_ORDER
import org.fdroid.settings.SettingsConstants.PREF_KEY_AUTO_UPDATES
import org.fdroid.settings.SettingsConstants.PREF_KEY_DYNAMIC_COLORS
import org.fdroid.settings.SettingsConstants.PREF_KEY_IGNORED_APP_ISSUES
import org.fdroid.settings.SettingsConstants.PREF_KEY_LAST_UPDATE_CHECK
import org.fdroid.settings.SettingsConstants.PREF_KEY_PROXY
@@ -51,6 +54,9 @@ class SettingsManager @Inject constructor(
val prefsFlow by lazy { createPreferenceFlow(prefs) }
val theme get() = prefs.getString(PREF_KEY_THEME, PREF_DEFAULT_THEME)!!
val themeFlow = prefsFlow.map { it.get<String>(PREF_KEY_THEME) }.distinctUntilChanged()
val dynamicColorFlow: Flow<Boolean> = prefsFlow.map {
it.get<Boolean>(PREF_KEY_DYNAMIC_COLORS) ?: PREF_DEFAULT_DYNAMIC_COLORS
}.distinctUntilChanged()
val repoUpdates get() = prefs.getBoolean(PREF_KEY_REPO_UPDATES, PREF_DEFAULT_REPO_UPDATES)
val repoUpdatesFlow
get() = prefsFlow.map { it.get<Boolean>(PREF_KEY_REPO_UPDATES) }.distinctUntilChanged()

View File

@@ -36,7 +36,6 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.BuildConfig.VERSION_NAME
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.utils.openUriSafe
@Composable

View File

@@ -29,7 +29,6 @@ import androidx.window.core.layout.WindowSizeClass.Companion.WIDTH_DP_MEDIUM_LOW
import com.viktormykhailiv.compose.hints.HintHost
import org.fdroid.R
import org.fdroid.database.AppListSortOrder
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.install.InstallConfirmationState
import org.fdroid.ui.apps.AppWithIssueItem
import org.fdroid.ui.apps.MyApps
@@ -59,7 +58,7 @@ import org.fdroid.ui.settings.SettingsViewModel
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
@Composable
fun Main(onListeningForIntent: () -> Unit = {}) {
fun Main(dynamicColors: Boolean, onListeningForIntent: () -> Unit = {}) {
val backStack = rememberNavBackStack(NavigationKey.Discover)
// set up intent routing by listening to new intents from activity
val activity = (LocalActivity.current as ComponentActivity)
@@ -194,7 +193,6 @@ fun Main(onListeningForIntent: () -> Unit = {}) {
(backStack.last() as? NavigationKey.AppDetails)?.packageName
} else null,
onBackClicked = { backStack.removeLastOrNull() },
modifier = Modifier,
) { packageName ->
backStack.add(NavigationKey.AppDetails(packageName))
}
@@ -300,7 +298,7 @@ fun Main(onListeningForIntent: () -> Unit = {}) {
About { backStack.removeLastOrNull() }
}
}
FDroidContent {
FDroidContent(dynamicColors = dynamicColors) {
HintHost {
NavDisplay(
backStack = backStack,

View File

@@ -0,0 +1,184 @@
package org.fdroid.ui
import android.os.Build.VERSION.SDK_INT
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import org.fdroid.fdroid.ui.theme.backgroundLight
import org.fdroid.fdroid.ui.theme.errorContainerDark
import org.fdroid.fdroid.ui.theme.errorContainerLight
import org.fdroid.fdroid.ui.theme.errorDark
import org.fdroid.fdroid.ui.theme.errorLight
import org.fdroid.fdroid.ui.theme.inverseOnSurfaceDark
import org.fdroid.fdroid.ui.theme.inverseOnSurfaceLight
import org.fdroid.fdroid.ui.theme.inversePrimaryDark
import org.fdroid.fdroid.ui.theme.inversePrimaryLight
import org.fdroid.fdroid.ui.theme.inverseSurfaceDark
import org.fdroid.fdroid.ui.theme.inverseSurfaceLight
import org.fdroid.fdroid.ui.theme.onBackgroundDark
import org.fdroid.fdroid.ui.theme.onBackgroundLight
import org.fdroid.fdroid.ui.theme.onErrorContainerDark
import org.fdroid.fdroid.ui.theme.onErrorContainerLight
import org.fdroid.fdroid.ui.theme.onErrorDark
import org.fdroid.fdroid.ui.theme.onErrorLight
import org.fdroid.fdroid.ui.theme.onPrimaryContainerDark
import org.fdroid.fdroid.ui.theme.onPrimaryContainerLight
import org.fdroid.fdroid.ui.theme.onPrimaryDark
import org.fdroid.fdroid.ui.theme.onPrimaryLight
import org.fdroid.fdroid.ui.theme.onSecondaryContainerDark
import org.fdroid.fdroid.ui.theme.onSecondaryContainerLight
import org.fdroid.fdroid.ui.theme.onSecondaryDark
import org.fdroid.fdroid.ui.theme.onSecondaryLight
import org.fdroid.fdroid.ui.theme.onSurfaceDark
import org.fdroid.fdroid.ui.theme.onSurfaceLight
import org.fdroid.fdroid.ui.theme.onSurfaceVariantDark
import org.fdroid.fdroid.ui.theme.onSurfaceVariantLight
import org.fdroid.fdroid.ui.theme.onTertiaryContainerDark
import org.fdroid.fdroid.ui.theme.onTertiaryContainerLight
import org.fdroid.fdroid.ui.theme.onTertiaryDark
import org.fdroid.fdroid.ui.theme.onTertiaryLight
import org.fdroid.fdroid.ui.theme.outlineDark
import org.fdroid.fdroid.ui.theme.outlineLight
import org.fdroid.fdroid.ui.theme.outlineVariantDark
import org.fdroid.fdroid.ui.theme.outlineVariantLight
import org.fdroid.fdroid.ui.theme.primaryContainerDark
import org.fdroid.fdroid.ui.theme.primaryContainerLight
import org.fdroid.fdroid.ui.theme.primaryDark
import org.fdroid.fdroid.ui.theme.primaryLight
import org.fdroid.fdroid.ui.theme.scrimDark
import org.fdroid.fdroid.ui.theme.scrimLight
import org.fdroid.fdroid.ui.theme.secondaryContainerDark
import org.fdroid.fdroid.ui.theme.secondaryContainerLight
import org.fdroid.fdroid.ui.theme.secondaryDark
import org.fdroid.fdroid.ui.theme.secondaryLight
import org.fdroid.fdroid.ui.theme.surfaceBrightDark
import org.fdroid.fdroid.ui.theme.surfaceBrightLight
import org.fdroid.fdroid.ui.theme.surfaceContainerDark
import org.fdroid.fdroid.ui.theme.surfaceContainerHighDark
import org.fdroid.fdroid.ui.theme.surfaceContainerHighLight
import org.fdroid.fdroid.ui.theme.surfaceContainerHighestDark
import org.fdroid.fdroid.ui.theme.surfaceContainerHighestLight
import org.fdroid.fdroid.ui.theme.surfaceContainerLight
import org.fdroid.fdroid.ui.theme.surfaceContainerLowDark
import org.fdroid.fdroid.ui.theme.surfaceContainerLowLight
import org.fdroid.fdroid.ui.theme.surfaceContainerLowestDark
import org.fdroid.fdroid.ui.theme.surfaceContainerLowestLight
import org.fdroid.fdroid.ui.theme.surfaceDimDark
import org.fdroid.fdroid.ui.theme.surfaceDimLight
import org.fdroid.fdroid.ui.theme.surfaceLight
import org.fdroid.fdroid.ui.theme.surfaceVariantDark
import org.fdroid.fdroid.ui.theme.surfaceVariantLight
import org.fdroid.fdroid.ui.theme.tertiaryContainerDark
import org.fdroid.fdroid.ui.theme.tertiaryContainerLight
import org.fdroid.fdroid.ui.theme.tertiaryDark
import org.fdroid.fdroid.ui.theme.tertiaryLight
// The followings are generated by the Material Theme Builder with modifications
// https://www.figma.com/community/plugin/1034969338659738588
// Unused code are and themes with contrast are removed
private val lightScheme = lightColorScheme(
primary = primaryLight,
onPrimary = onPrimaryLight,
primaryContainer = primaryContainerLight,
onPrimaryContainer = onPrimaryContainerLight,
secondary = secondaryLight,
onSecondary = onSecondaryLight,
secondaryContainer = secondaryContainerLight,
onSecondaryContainer = onSecondaryContainerLight,
tertiary = tertiaryLight,
onTertiary = onTertiaryLight,
tertiaryContainer = tertiaryContainerLight,
onTertiaryContainer = onTertiaryContainerLight,
error = errorLight,
onError = onErrorLight,
errorContainer = errorContainerLight,
onErrorContainer = onErrorContainerLight,
background = backgroundLight,
onBackground = onBackgroundLight,
surface = surfaceLight,
onSurface = onSurfaceLight,
surfaceVariant = surfaceVariantLight,
onSurfaceVariant = onSurfaceVariantLight,
outline = outlineLight,
outlineVariant = outlineVariantLight,
scrim = scrimLight,
inverseSurface = inverseSurfaceLight,
inverseOnSurface = inverseOnSurfaceLight,
inversePrimary = inversePrimaryLight,
surfaceDim = surfaceDimLight,
surfaceBright = surfaceBrightLight,
surfaceContainerLowest = surfaceContainerLowestLight,
surfaceContainerLow = surfaceContainerLowLight,
surfaceContainer = surfaceContainerLight,
surfaceContainerHigh = surfaceContainerHighLight,
surfaceContainerHighest = surfaceContainerHighestLight,
)
private val darkScheme = darkColorScheme(
primary = primaryDark,
onPrimary = onPrimaryDark,
primaryContainer = primaryContainerDark,
onPrimaryContainer = onPrimaryContainerDark,
secondary = secondaryDark,
onSecondary = onSecondaryDark,
secondaryContainer = secondaryContainerDark,
onSecondaryContainer = onSecondaryContainerDark,
tertiary = tertiaryDark,
onTertiary = onTertiaryDark,
tertiaryContainer = tertiaryContainerDark,
onTertiaryContainer = onTertiaryContainerDark,
error = errorDark,
onError = onErrorDark,
errorContainer = errorContainerDark,
onErrorContainer = onErrorContainerDark,
background = Color.Black, // TODO
onBackground = onBackgroundDark,
surface = Color(0xff1e1e1e), // TODO
onSurface = onSurfaceDark,
surfaceVariant = surfaceVariantDark,
onSurfaceVariant = onSurfaceVariantDark,
outline = outlineDark,
outlineVariant = outlineVariantDark,
scrim = scrimDark,
inverseSurface = inverseSurfaceDark,
inverseOnSurface = inverseOnSurfaceDark,
inversePrimary = inversePrimaryDark,
surfaceDim = surfaceDimDark,
surfaceBright = surfaceBrightDark,
surfaceContainerLowest = surfaceContainerLowestDark,
surfaceContainerLow = surfaceContainerLowDark,
surfaceContainer = surfaceContainerDark,
surfaceContainerHigh = surfaceContainerHighDark,
surfaceContainerHighest = surfaceContainerHighestDark,
)
@Composable
fun FDroidContent(
darkTheme: Boolean = isSystemInDarkTheme(),
dynamicColors: Boolean = false,
content: @Composable () -> Unit
) {
val colorScheme = when {
SDK_INT >= 31 && dynamicColors && darkTheme -> {
dynamicDarkColorScheme(LocalContext.current)
}
SDK_INT >= 31 && dynamicColors && !darkTheme -> {
dynamicLightColorScheme(LocalContext.current)
}
darkTheme -> darkScheme
else -> lightScheme
}
MaterialTheme(
colorScheme = colorScheme,
) {
Surface(content = content)
}
}

View File

@@ -19,7 +19,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.BadgeIcon
import org.fdroid.ui.utils.Names

View File

@@ -20,8 +20,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.install.InstallState
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
@Composable

View File

@@ -43,9 +43,9 @@ import androidx.navigation3.runtime.NavKey
import org.fdroid.R
import org.fdroid.database.AppListSortOrder
import org.fdroid.database.AppListSortOrder.LAST_UPDATED
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.install.InstallConfirmationState
import org.fdroid.ui.BottomBar
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.NavigationKey
import org.fdroid.ui.lists.TopSearchBar
import org.fdroid.ui.utils.BigLoadingIndicator

View File

@@ -25,7 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.database.NotAvailable
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.getMyAppsInfo
import org.fdroid.ui.utils.myAppsModel

View File

@@ -19,7 +19,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.startActivitySafe
@Composable

View File

@@ -32,7 +32,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.BadgeIcon
import org.fdroid.ui.utils.ExpandIconArrow

View File

@@ -18,7 +18,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
fun CategoryChip(

View File

@@ -15,7 +15,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation3.runtime.NavKey
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.NavigationKey
import org.fdroid.ui.lists.AppListType

View File

@@ -24,7 +24,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import kotlinx.coroutines.launch
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.utils.getLogName
@Composable

View File

@@ -8,7 +8,7 @@ import androidx.activity.enableEdgeToEdge
import mu.KotlinLogging
import org.acra.ReportField
import org.acra.dialog.CrashReportDialogHelper
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import java.io.IOException
class CrashActivity : ComponentActivity() {

View File

@@ -29,7 +29,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
fun CrashContent(

View File

@@ -23,7 +23,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.ExpandableSection
import org.fdroid.ui.utils.testApp

View File

@@ -62,8 +62,8 @@ import androidx.compose.ui.unit.dp
import androidx.core.os.LocaleListCompat
import org.fdroid.LocaleChooser.getBestLocale
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.install.InstallState
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.NavigationKey
import org.fdroid.ui.categories.CategoryChip
import org.fdroid.ui.icons.License

View File

@@ -57,8 +57,8 @@ import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import coil3.compose.AsyncImage
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.install.InstallState
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.InstalledBadge
import org.fdroid.ui.utils.asRelativeTimeString

View File

@@ -20,7 +20,7 @@ import androidx.compose.ui.platform.LocalResources
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.startActivitySafe
import org.fdroid.ui.utils.testApp

View File

@@ -25,8 +25,8 @@ import org.fdroid.database.KnownVulnerability
import org.fdroid.database.NoCompatibleSigner
import org.fdroid.database.NotAvailable
import org.fdroid.database.UpdateInOtherRepo
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.index.v2.ANTI_FEATURE_KNOWN_VULNERABILITY
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.testApp
@Composable

View File

@@ -34,8 +34,8 @@ import androidx.core.os.LocaleListCompat
import io.ktor.client.engine.ProxyConfig
import org.fdroid.R
import org.fdroid.database.Repository
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.index.IndexFormatVersion.TWO
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.repositories.RepoIcon
import org.fdroid.ui.utils.FDroidOutlineButton
@@ -175,7 +175,7 @@ private fun getRepoString(repo: Repository, isPreferred: Boolean) = buildAnnotat
@Preview(uiMode = Configuration.UI_MODE_NIGHT_NO)
fun RepoChooserSingleRepoPreview() {
val repo1 = Repository(1L, "1", 1L, TWO, "null", 1L, 1, 1L)
FDroidContent(pureBlack = true) {
FDroidContent {
RepoChooser(listOf(repo1), 1L, 1L, null, {}, {})
}
}
@@ -186,7 +186,7 @@ fun RepoChooserPreview() {
val repo1 = Repository(1L, "1", 1L, TWO, "null", 1L, 1, 1L)
val repo2 = Repository(2L, "2", 2L, TWO, "null", 2L, 2, 2L)
val repo3 = Repository(3L, "2", 3L, TWO, "null", 3L, 3, 3L)
FDroidContent(pureBlack = true) {
FDroidContent {
RepoChooser(listOf(repo1, repo2, repo3), 1L, 1L, null, {}, {})
}
}
@@ -197,7 +197,7 @@ fun RepoChooserNightPreview() {
val repo1 = Repository(1L, "1", 1L, TWO, "null", 1L, 1, 1L)
val repo2 = Repository(2L, "2", 2L, TWO, "null", 2L, 2, 2L)
val repo3 = Repository(3L, "2", 3L, TWO, "null", 3L, 3, 3L)
FDroidContent(pureBlack = true) {
FDroidContent {
RepoChooser(listOf(repo1, repo2, repo3), 1L, 2L, null, {}, {})
}
}

View File

@@ -29,7 +29,7 @@ import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.testApp

View File

@@ -13,7 +13,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.testApp
@Composable

View File

@@ -34,7 +34,7 @@ import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch
import org.fdroid.R
import org.fdroid.database.AppVersion
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.ExpandIconChevron
import org.fdroid.ui.utils.ExpandableSection
import org.fdroid.ui.utils.FDroidOutlineButton

View File

@@ -27,7 +27,7 @@ import androidx.compose.ui.semantics.hideFromAccessibility
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.InstalledBadge
import org.fdroid.ui.utils.Names

View File

@@ -35,7 +35,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.NavigationKey
import org.fdroid.ui.categories.CategoryChip
import org.fdroid.ui.categories.CategoryItem

View File

@@ -43,8 +43,8 @@ import androidx.compose.ui.unit.dp
import androidx.navigation3.runtime.NavKey
import kotlinx.coroutines.launch
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.BottomBar
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.MainOverFlowMenu
import org.fdroid.ui.NavigationKey
import org.fdroid.ui.categories.CategoryList

View File

@@ -14,7 +14,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
val License: ImageVector
get() {

View File

@@ -15,7 +15,7 @@ import androidx.compose.ui.graphics.vector.ImageVector.Builder
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
val PackageVariant: ImageVector
get() {

View File

@@ -54,7 +54,7 @@ import com.viktormykhailiv.compose.hints.rememberHintAnchorState
import com.viktormykhailiv.compose.hints.rememberHintController
import org.fdroid.R
import org.fdroid.database.AppListSortOrder
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.BigLoadingIndicator
import org.fdroid.ui.utils.OnboardingCard
import org.fdroid.ui.utils.getAppListInfo

View File

@@ -17,7 +17,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.InstalledBadge

View File

@@ -38,7 +38,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.database.AppListSortOrder
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.categories.CategoryChip
import org.fdroid.ui.categories.CategoryItem
import org.fdroid.ui.icons.PackageVariant

View File

@@ -36,7 +36,7 @@ import com.viktormykhailiv.compose.hints.rememberHint
import com.viktormykhailiv.compose.hints.rememberHintAnchorState
import com.viktormykhailiv.compose.hints.rememberHintController
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.BigLoadingIndicator
import org.fdroid.ui.utils.OnboardingCard
import org.fdroid.ui.utils.getHintOverlayColor

View File

@@ -16,7 +16,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.AsyncShimmerImage
import org.fdroid.ui.utils.BadgeIcon
import org.fdroid.ui.utils.asRelativeTimeString

View File

@@ -26,13 +26,13 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.repo.AddRepoError
import org.fdroid.repo.AddRepoError.ErrorType.INVALID_FINGERPRINT
import org.fdroid.repo.AddRepoError.ErrorType.INVALID_INDEX
import org.fdroid.repo.AddRepoError.ErrorType.IO_ERROR
import org.fdroid.repo.AddRepoError.ErrorType.IS_ARCHIVE_REPO
import org.fdroid.repo.AddRepoError.ErrorType.UNKNOWN_SOURCES_DISALLOWED
import org.fdroid.ui.FDroidContent
import java.io.IOException
@Composable

View File

@@ -67,8 +67,8 @@ import com.journeyapps.barcodescanner.ScanOptions
import com.journeyapps.barcodescanner.ScanOptions.QR_CODE
import kotlinx.coroutines.launch
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.repo.None
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.ExpandIconArrow
import org.fdroid.ui.utils.FDroidButton
import org.fdroid.ui.utils.FDroidOutlineButton

View File

@@ -22,11 +22,11 @@ import io.ktor.client.engine.ProxyConfig
import org.fdroid.R
import org.fdroid.database.MinimalApp
import org.fdroid.download.getImageModel
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.index.v2.FileV2
import org.fdroid.repo.FetchResult.IsNewRepoAndNewMirror
import org.fdroid.repo.FetchResult.IsNewRepository
import org.fdroid.repo.Fetching
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.lists.AppListItem
import org.fdroid.ui.lists.AppListRow
import org.fdroid.ui.utils.getRepository
@@ -139,7 +139,7 @@ private fun Preview() {
override fun getIcon(localeList: LocaleListCompat): FileV2? = null
}
FDroidContent(pureBlack = true) {
FDroidContent {
AddRepoPreviewScreen(
Fetching(address, repo, listOf(app1, app2, app3), IsNewRepository),
proxyConfig = null,

View File

@@ -17,7 +17,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@@ -40,7 +40,7 @@ fun AddRepoProgressScreen(text: String, modifier: Modifier = Modifier) {
@Preview
@Composable
private fun Preview() {
FDroidContent(pureBlack = true) {
FDroidContent {
AddRepoProgressScreen(stringResource(R.string.repo_state_fetching))
}
}

View File

@@ -26,13 +26,13 @@ import androidx.compose.ui.unit.dp
import androidx.core.os.LocaleListCompat
import io.ktor.client.engine.ProxyConfig
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.repo.FetchResult.IsExistingMirror
import org.fdroid.repo.FetchResult.IsExistingRepository
import org.fdroid.repo.FetchResult.IsNewMirror
import org.fdroid.repo.FetchResult.IsNewRepoAndNewMirror
import org.fdroid.repo.FetchResult.IsNewRepository
import org.fdroid.repo.Fetching
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.repositories.RepoIcon
import org.fdroid.ui.utils.FDroidButton
import org.fdroid.ui.utils.asRelativeTimeString

View File

@@ -26,7 +26,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.FDroidOutlineButton
@Composable

View File

@@ -20,7 +20,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.download.Mirror
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.ExpandableSection
@Composable

View File

@@ -38,8 +38,8 @@ import com.viktormykhailiv.compose.hints.rememberHint
import com.viktormykhailiv.compose.hints.rememberHintAnchorState
import com.viktormykhailiv.compose.hints.rememberHintController
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.repo.RepoUpdateWorker
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.BigLoadingIndicator
import org.fdroid.ui.utils.OnboardingCard
import org.fdroid.ui.utils.getHintOverlayColor

View File

@@ -20,7 +20,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.database.Repository
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.ExpandableSection
import org.fdroid.ui.utils.getRepoDetailsInfo

View File

@@ -29,7 +29,7 @@ import androidx.core.os.LocaleListCompat
import io.ktor.client.engine.ProxyConfig
import org.fdroid.R
import org.fdroid.database.Repository
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.repositories.RepoIcon
import org.fdroid.ui.utils.FDroidOutlineButton
import org.fdroid.ui.utils.asRelativeTimeString

View File

@@ -17,7 +17,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.database.Repository
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.ExpandableSection
import org.fdroid.ui.utils.FDroidOutlineButton
import org.fdroid.ui.utils.FDroidSwitchRow

View File

@@ -29,7 +29,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.download.Mirror
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.ExpandableSection
import org.fdroid.ui.utils.FDroidOutlineButton

View File

@@ -24,9 +24,9 @@ import androidx.compose.ui.tooling.preview.Preview
import me.zhanghai.compose.preference.ProvidePreferenceLocals
import me.zhanghai.compose.preference.textFieldPreference
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PROXY
import org.fdroid.settings.SettingsConstants.PREF_KEY_PROXY
import org.fdroid.ui.FDroidContent
import java.net.InetSocketAddress
fun LazyListScope.preferenceProxy(

View File

@@ -16,6 +16,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.BrightnessMedium
import androidx.compose.material.icons.filled.ColorLens
import androidx.compose.material.icons.filled.Notifications
import androidx.compose.material.icons.filled.Save
import androidx.compose.material.icons.filled.SystemSecurityUpdate
@@ -54,15 +55,17 @@ import me.zhanghai.compose.preference.preferenceCategory
import me.zhanghai.compose.preference.rememberPreferenceState
import me.zhanghai.compose.preference.switchPreference
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_AUTO_UPDATES
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_DYNAMIC_COLORS
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_PROXY
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_REPO_UPDATES
import org.fdroid.settings.SettingsConstants.PREF_DEFAULT_THEME
import org.fdroid.settings.SettingsConstants.PREF_KEY_AUTO_UPDATES
import org.fdroid.settings.SettingsConstants.PREF_KEY_DYNAMIC_COLORS
import org.fdroid.settings.SettingsConstants.PREF_KEY_PROXY
import org.fdroid.settings.SettingsConstants.PREF_KEY_REPO_UPDATES
import org.fdroid.settings.SettingsConstants.PREF_KEY_THEME
import org.fdroid.ui.FDroidContent
import org.fdroid.ui.utils.asRelativeTimeString
import org.fdroid.ui.utils.startActivitySafe
import org.fdroid.utils.getLogName
@@ -139,6 +142,23 @@ fun Settings(
},
summary = { Text(text = "${themeToString(it)}") },
)
if (SDK_INT >= 31) switchPreference(
key = PREF_KEY_DYNAMIC_COLORS,
defaultValue = PREF_DEFAULT_DYNAMIC_COLORS,
title = {
Text(stringResource(R.string.pref_dyn_colors_title))
},
icon = {
Icon(
imageVector = Icons.Default.ColorLens,
contentDescription = null,
modifier = Modifier.semantics { hideFromAccessibility() },
)
},
summary = {
Text(text = stringResource(R.string.pref_dyn_colors_summary))
},
)
if (SDK_INT >= 33) preference(
key = "languages",
icon = {

View File

@@ -25,7 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import coil3.compose.SubcomposeAsyncImage
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
fun AsyncShimmerImage(

View File

@@ -22,7 +22,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
fun BadgeIcon(

View File

@@ -10,7 +10,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
@OptIn(ExperimentalMaterial3ExpressiveApi::class)

View File

@@ -15,7 +15,7 @@ import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
fun FDroidSwitchRow(

View File

@@ -14,7 +14,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.fdroid.R
import org.fdroid.fdroid.ui.theme.FDroidContent
import org.fdroid.ui.FDroidContent
@Composable
@OptIn(ExperimentalMaterial3Api::class)

View File

@@ -126,6 +126,8 @@
<string name="repo_force_update">Check for updates</string>
<string name="pref_dyn_colors_title">Use system colors</string>
<string name="pref_dyn_colors_summary">Apply dynamic colors from your system settings</string>
<string name="pref_language_summary">Opens system language settings</string>
<string name="pref_auto_updates_summary_enabled">Download and update apps daily when the device isn\'t being used</string>
<string name="pref_auto_updates_summary_disabled">Auto-updates disabled • Apps will need to be updated manually</string>