From 42cea9d27d9404c06dbb505c9acbc26624489704 Mon Sep 17 00:00:00 2001 From: Viktor Mykhailiv Date: Thu, 11 Jun 2026 20:51:20 +0100 Subject: [PATCH 1/3] Show full-screen hints for Repo screens --- .../main/kotlin/org/fdroid/ui/repositories/Repositories.kt | 5 ++++- .../kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt | 4 +++- gradle/libs.versions.toml | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt index 6d8c4dfc1..e75bd659e 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.viktormykhailiv.compose.hints.HintHost import com.viktormykhailiv.compose.hints.HintProperties +import com.viktormykhailiv.compose.hints.hintAnchor import com.viktormykhailiv.compose.hints.rememberHint import com.viktormykhailiv.compose.hints.rememberHintAnchorState import com.viktormykhailiv.compose.hints.rememberHintController @@ -118,7 +119,9 @@ fun Repositories(info: RepositoryInfo, isBigScreen: Boolean, onBackClicked: () - } } }, - modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), + modifier = Modifier + .hintAnchor(hintAnchor, fullScreen = true) + .nestedScroll(scrollBehavior.nestedScrollConnection), ) { paddingValues -> if (info.model.repositories == null) BigLoadingIndicator() else diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt index dba3c963b..560c1d6ef 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.viktormykhailiv.compose.hints.HintHost import com.viktormykhailiv.compose.hints.HintProperties +import com.viktormykhailiv.compose.hints.hintAnchor import com.viktormykhailiv.compose.hints.rememberHint import com.viktormykhailiv.compose.hints.rememberHintAnchorState import com.viktormykhailiv.compose.hints.rememberHintController @@ -147,7 +148,8 @@ fun RepoDetails( } }, ) - } + }, + modifier = Modifier.hintAnchor(hintAnchor, fullScreen = true), ) { paddingValues -> if (repo == null) BigLoadingIndicator() else diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b530ec483..13fc59d2b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ glide = "5.0.7" glideCompose = "1.0.0-beta09" coilCompose = "3.4.0" molecule = "2.2.0" -hints = "3.0.1" +hints = "3.1.0" composePreference = "2.2.0" androidxCoreKtx = "1.19.0" From adcb542362e6822362cb68b3575c4e1b691b5e35 Mon Sep 17 00:00:00 2001 From: Viktor Mykhailiv Date: Thu, 11 Jun 2026 21:16:22 +0100 Subject: [PATCH 2/3] Set global hint overlay color --- app/src/main/kotlin/org/fdroid/ui/MainContent.kt | 4 ++-- .../main/kotlin/org/fdroid/ui/details/AppDetails.kt | 7 +++---- app/src/main/kotlin/org/fdroid/ui/lists/AppList.kt | 11 +++++------ .../kotlin/org/fdroid/ui/repositories/Repositories.kt | 11 +++++------ .../org/fdroid/ui/repositories/details/RepoDetails.kt | 9 ++++----- .../ui/repositories/details/RepoDetailsContent.kt | 4 ++-- app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt | 10 +++++++++- 7 files changed, 30 insertions(+), 26 deletions(-) diff --git a/app/src/main/kotlin/org/fdroid/ui/MainContent.kt b/app/src/main/kotlin/org/fdroid/ui/MainContent.kt index b56b3ed31..599edb9ae 100644 --- a/app/src/main/kotlin/org/fdroid/ui/MainContent.kt +++ b/app/src/main/kotlin/org/fdroid/ui/MainContent.kt @@ -9,11 +9,11 @@ import androidx.compose.ui.Modifier import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.ui.NavDisplay -import com.viktormykhailiv.compose.hints.HintHost import org.fdroid.ui.navigation.BottomBar import org.fdroid.ui.navigation.MainNavKey import org.fdroid.ui.navigation.NavigationRail import org.fdroid.ui.navigation.rememberResponsiveNavigationSceneDecoratorStrategy +import org.fdroid.ui.utils.HintOverlayContainer @Composable @OptIn(ExperimentalMaterial3AdaptiveApi::class) @@ -30,7 +30,7 @@ fun MainContent( FDroidContent(dynamicColors = model.dynamicColors) { val listDetailStrategy = rememberListDetailSceneStrategy(directive = directive) SharedTransitionLayout { - HintHost { + HintOverlayContainer { val responsiveNavigationSceneDecoratorStrategy = rememberResponsiveNavigationSceneDecoratorStrategy( isBigScreen = isBigScreen, diff --git a/app/src/main/kotlin/org/fdroid/ui/details/AppDetails.kt b/app/src/main/kotlin/org/fdroid/ui/details/AppDetails.kt index 0c2d3916a..69b8bb44f 100644 --- a/app/src/main/kotlin/org/fdroid/ui/details/AppDetails.kt +++ b/app/src/main/kotlin/org/fdroid/ui/details/AppDetails.kt @@ -70,7 +70,6 @@ import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.os.LocaleListCompat -import com.viktormykhailiv.compose.hints.HintHost import com.viktormykhailiv.compose.hints.HintProperties import com.viktormykhailiv.compose.hints.rememberHint import com.viktormykhailiv.compose.hints.rememberHintAnchorState @@ -86,8 +85,8 @@ import org.fdroid.ui.lists.AppListType import org.fdroid.ui.navigation.NavigationKey import org.fdroid.ui.utils.BigLoadingIndicator import org.fdroid.ui.utils.ExpandableSection +import org.fdroid.ui.utils.HintOverlayContainer import org.fdroid.ui.utils.OnboardingPopupCard -import org.fdroid.ui.utils.getHintOverlayColor import org.fdroid.ui.utils.testApp @Composable @@ -128,7 +127,7 @@ fun AppDetails( } } // onboarding hint plumbing - val hintController = rememberHintController(overlay = getHintOverlayColor()) + val hintController = rememberHintController() val hint = rememberHint(HintProperties(dismissOnClickOutside = false)) { OnboardingPopupCard( @@ -471,5 +470,5 @@ fun AppDetailsNotFoundPreview() { @Preview @Composable fun AppDetailsPreview() { - HintHost { FDroidContent { AppDetails(testApp, {}, {}) } } + HintOverlayContainer { FDroidContent { AppDetails(testApp, {}, {}) } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/lists/AppList.kt b/app/src/main/kotlin/org/fdroid/ui/lists/AppList.kt index aed48dc13..ea7d71556 100644 --- a/app/src/main/kotlin/org/fdroid/ui/lists/AppList.kt +++ b/app/src/main/kotlin/org/fdroid/ui/lists/AppList.kt @@ -50,7 +50,6 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.viktormykhailiv.compose.hints.HintHost import com.viktormykhailiv.compose.hints.HintProperties import com.viktormykhailiv.compose.hints.hintAnchor import com.viktormykhailiv.compose.hints.rememberHint @@ -62,11 +61,11 @@ import org.fdroid.ui.FDroidContent import org.fdroid.ui.search.TopSearchBar import org.fdroid.ui.utils.BackButton import org.fdroid.ui.utils.BigLoadingIndicator +import org.fdroid.ui.utils.HintOverlayContainer import org.fdroid.ui.utils.OnboardingPopupCard import org.fdroid.ui.utils.TopAppBarButton import org.fdroid.ui.utils.appListItems import org.fdroid.ui.utils.getAppListInfo -import org.fdroid.ui.utils.getHintOverlayColor @Composable @OptIn(ExperimentalMaterial3Api::class) @@ -80,7 +79,7 @@ fun AppList( var searchActive by rememberSaveable { mutableStateOf(false) } val scrollBehavior = enterAlwaysScrollBehavior(rememberTopAppBarState()) - val hintController = rememberHintController(overlay = getHintOverlayColor()) + val hintController = rememberHintController() val hint = rememberHint(HintProperties(dismissOnClickOutside = false)) { OnboardingPopupCard( @@ -229,7 +228,7 @@ private fun FilterButton( @Preview @Composable private fun Preview() { - HintHost { + HintOverlayContainer { FDroidContent { val model = AppListModel( @@ -253,7 +252,7 @@ private fun Preview() { @Preview @Composable private fun PreviewLoading() { - HintHost { + HintOverlayContainer { FDroidContent { val model = AppListModel( @@ -277,7 +276,7 @@ private fun PreviewLoading() { @Preview @Composable private fun PreviewEmpty() { - HintHost { + HintOverlayContainer { FDroidContent { val model = AppListModel( diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt index e75bd659e..c603cb9c6 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/Repositories.kt @@ -36,7 +36,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp -import com.viktormykhailiv.compose.hints.HintHost import com.viktormykhailiv.compose.hints.HintProperties import com.viktormykhailiv.compose.hints.hintAnchor import com.viktormykhailiv.compose.hints.rememberHint @@ -46,15 +45,15 @@ import org.fdroid.R import org.fdroid.download.NetworkState import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.BigLoadingIndicator +import org.fdroid.ui.utils.HintOverlayContainer import org.fdroid.ui.utils.OnboardingPopupCard -import org.fdroid.ui.utils.getHintOverlayColor import org.fdroid.ui.utils.getRepositoriesInfo import org.fdroid.ui.utils.repoItems @Composable @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) fun Repositories(info: RepositoryInfo, isBigScreen: Boolean, onBackClicked: () -> Unit) { - val hintController = rememberHintController(overlay = getHintOverlayColor()) + val hintController = rememberHintController() val hint = rememberHint(HintProperties(dismissOnClickOutside = false)) { Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { @@ -142,8 +141,8 @@ fun Repositories(info: RepositoryInfo, isBigScreen: Boolean, onBackClicked: () - @Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES or UI_MODE_TYPE_NORMAL) @Composable -fun RepositoriesScaffoldLoadingPreview() { - HintHost { +private fun RepositoriesScaffoldLoadingPreview() { + HintOverlayContainer { FDroidContent { val model = RepositoryModel( @@ -161,7 +160,7 @@ fun RepositoriesScaffoldLoadingPreview() { @Composable @PreviewLightDark private fun RepositoriesScaffoldPreview() { - HintHost { + HintOverlayContainer { FDroidContent { val model = RepositoryModel( diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt index 560c1d6ef..88c8b5735 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetails.kt @@ -29,7 +29,6 @@ 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 com.viktormykhailiv.compose.hints.HintHost import com.viktormykhailiv.compose.hints.HintProperties import com.viktormykhailiv.compose.hints.hintAnchor import com.viktormykhailiv.compose.hints.rememberHint @@ -40,11 +39,11 @@ import org.fdroid.repo.RepoUpdateWorker import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.BackButton import org.fdroid.ui.utils.BigLoadingIndicator +import org.fdroid.ui.utils.HintOverlayContainer import org.fdroid.ui.utils.MeteredConnectionDialog import org.fdroid.ui.utils.OnboardingPopupCard import org.fdroid.ui.utils.TopAppBarButton import org.fdroid.ui.utils.TopAppBarOverflowButton -import org.fdroid.ui.utils.getHintOverlayColor import org.fdroid.ui.utils.getRepoDetailsInfo @Composable @@ -57,7 +56,7 @@ fun RepoDetails( val context = LocalContext.current val repo = info.model.repo - val hintController = rememberHintController(overlay = getHintOverlayColor()) + val hintController = rememberHintController() val hint = rememberHint(HintProperties(dismissOnClickOutside = false)) { Box(contentAlignment = Alignment.Center, modifier = Modifier.fillMaxSize()) { @@ -163,6 +162,6 @@ fun RepoDetails( @Preview @Composable -fun RepoDetailsScreenPreview() { - HintHost { FDroidContent { RepoDetails(getRepoDetailsInfo(), { _, _ -> }, {}) } } +private fun RepoDetailsScreenPreview() { + HintOverlayContainer { FDroidContent { RepoDetails(getRepoDetailsInfo(), { _, _ -> }, {}) } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetailsContent.kt b/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetailsContent.kt index 7ce72d67c..a5e884699 100644 --- a/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetailsContent.kt +++ b/app/src/main/kotlin/org/fdroid/ui/repositories/details/RepoDetailsContent.kt @@ -23,12 +23,12 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.viktormykhailiv.compose.hints.HintHost import org.fdroid.R import org.fdroid.database.Repository import org.fdroid.repo.RepoUpdateProgress import org.fdroid.ui.FDroidContent import org.fdroid.ui.utils.ExpandableSection +import org.fdroid.ui.utils.HintOverlayContainer import org.fdroid.ui.utils.getRepoDetailsInfo @Composable @@ -105,5 +105,5 @@ private fun FingerprintExpandable(fingerprint: String) { @Composable @Preview private fun Preview() { - HintHost { FDroidContent { RepoDetails(getRepoDetailsInfo(), { _, _ -> }, {}) } } + HintOverlayContainer { FDroidContent { RepoDetails(getRepoDetailsInfo(), { _, _ -> }, {}) } } } diff --git a/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt b/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt index cdad68279..4bbdd3608 100644 --- a/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt +++ b/app/src/main/kotlin/org/fdroid/ui/utils/UiUtils.kt @@ -18,12 +18,20 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.createBitmap import com.google.zxing.BarcodeFormat import com.google.zxing.qrcode.QRCodeWriter +import com.viktormykhailiv.compose.hints.HintHost import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.fdroid.database.Repository @Composable -fun getHintOverlayColor() = MaterialTheme.colorScheme.primary.copy(alpha = 0.8f) +fun HintOverlayContainer( + content: @Composable () -> Unit, +) { + HintHost( + overlay = MaterialTheme.colorScheme.primary.copy(alpha = 0.8f), + content = content, + ) +} fun Context.startActivitySafe(i: Intent?) { if (i == null) return From 85b6ab3daf7a1fa0273cc673899a4414e93b6aea Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 15 Jun 2026 13:57:40 -0300 Subject: [PATCH 3/3] Update compose-hints to 3.1.1 this fixes an issue with the onboarding dialog scrolling, if a scroll was in progress --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 13fc59d2b..3845d37a7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,7 @@ glide = "5.0.7" glideCompose = "1.0.0-beta09" coilCompose = "3.4.0" molecule = "2.2.0" -hints = "3.1.0" +hints = "3.1.1" composePreference = "2.2.0" androidxCoreKtx = "1.19.0" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 0ba685cc8..e66d10a74 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -4508,6 +4508,11 @@ + + + + +