diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/LauncherScaffold.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/LauncherScaffold.kt index aa621095d..10d3e3d52 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/LauncherScaffold.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/LauncherScaffold.kt @@ -114,9 +114,11 @@ import dev.chrisbanes.haze.hazeEffect import dev.chrisbanes.haze.hazeSource import dev.chrisbanes.haze.rememberHazeState import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlin.math.absoluteValue import kotlin.math.pow import kotlin.math.roundToInt @@ -808,16 +810,16 @@ internal class LauncherScaffoldState( targetPage: ScaffoldPage, component: ScaffoldComponent, animate: suspend () -> Unit, - ) { + ) = withContext(NonCancellable) { when (targetPage) { ScaffoldPage.Secondary -> { - config.homeComponent.onPreDismiss(this) - component.onPreActivate(this) + config.homeComponent.onPreDismiss(this@LauncherScaffoldState) + component.onPreActivate(this@LauncherScaffoldState) } ScaffoldPage.Home -> { - component.onPreDismiss(this) - config.homeComponent.onPreActivate(this) + component.onPreDismiss(this@LauncherScaffoldState) + config.homeComponent.onPreActivate(this@LauncherScaffoldState) } } @@ -825,24 +827,14 @@ internal class LauncherScaffoldState( when (targetPage) { ScaffoldPage.Secondary -> { - component.onActivate(this) - if (!component.permanent) { - delay(component.resetDelay.milliseconds) - isSettledOnSecondaryPage = false - currentOffset3D = Offset3D.Zero - component.onPreDismiss(this) - component.onDismiss(this) - currentGesture = null - unlock() - } else { - config.homeComponent.onDismiss(this) - homePageSearchBarOffset = 0f - } + component.onActivate(this@LauncherScaffoldState) + config.homeComponent.onDismiss(this@LauncherScaffoldState) + homePageSearchBarOffset = 0f } ScaffoldPage.Home -> { - config.homeComponent.onActivate(this) - component.onDismiss(this) + config.homeComponent.onActivate(this@LauncherScaffoldState) + component.onDismiss(this@LauncherScaffoldState) currentGesture = null secondaryPageSearchBarOffset = 0f } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/FeedComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/FeedComponent.kt index 4128f2135..1443eef4d 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/FeedComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/FeedComponent.kt @@ -42,8 +42,6 @@ internal object FeedComponent : ScaffoldComponent(), KoinComponent { private val feedSettings: FeedSettings by inject() private val feedService: FeedService by inject() - override val permanent: Boolean = true - override val survivesPause: Boolean = true private var state = mutableIntStateOf(0) @@ -186,7 +184,7 @@ internal object FeedComponent : ScaffoldComponent(), KoinComponent { .alpha(1f - state.currentProgress) } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) this.state.intValue = 2 } @@ -201,7 +199,7 @@ internal object FeedComponent : ScaffoldComponent(), KoinComponent { this.state.intValue = 0 } - override suspend fun onPreDismiss(state: LauncherScaffoldState) { + override fun onPreDismiss(state: LauncherScaffoldState) { super.onPreDismiss(state) this.state.intValue = 1 } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/LaunchComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/LaunchComponent.kt index bc53dd99c..90031cee5 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/LaunchComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/LaunchComponent.kt @@ -15,13 +15,13 @@ import de.mm20.launcher2.search.SavableSearchable import de.mm20.launcher2.ui.component.FakeSplashScreen import de.mm20.launcher2.ui.ktx.toIntOffset import de.mm20.launcher2.ui.launcher.scaffold.LauncherScaffoldState +import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.milliseconds internal class LaunchComponent( private val activity: Activity, private val searchable: SavableSearchable, ): ScaffoldComponent() { - override val permanent: Boolean = false - override val resetDelay: Long = 500L override val showSearchBar = false override val isAtTop: State = mutableStateOf(true) @@ -51,6 +51,9 @@ internal class LaunchComponent( ) searchable.launch(activity, options.toBundle()) + + delay(500.milliseconds) + state.reset() } override fun homePageModifier( diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/NotificationsComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/NotificationsComponent.kt index 1212dbc3d..d9f71102a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/NotificationsComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/NotificationsComponent.kt @@ -36,8 +36,6 @@ internal object NotificationsComponent : ScaffoldComponent(), KoinComponent { private val globalActionService: GlobalActionsService by inject() - override val permanent: Boolean = false - override val showSearchBar: Boolean = false override val drawBackground: Boolean = false @@ -84,14 +82,14 @@ internal object NotificationsComponent : ScaffoldComponent(), KoinComponent { } } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) globalActionService.openNotificationDrawer() } override suspend fun onActivate(state: LauncherScaffoldState) { super.onActivate(state) - state.navigateBack(false) + state.navigateBack() } @SuppressLint("ModifierFactoryExtensionFunction") diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/PowerMenuComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/PowerMenuComponent.kt index 53850b90d..916fb9b2a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/PowerMenuComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/PowerMenuComponent.kt @@ -48,9 +48,6 @@ internal object PowerMenuComponent : ScaffoldComponent(), KoinComponent { private val permissionsManager: PermissionsManager by inject() private val globalActionService: GlobalActionsService by inject() - override val permanent: Boolean - get() = !permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility) - override val showSearchBar: Boolean = false override val drawBackground: Boolean = false @@ -166,7 +163,7 @@ internal object PowerMenuComponent : ScaffoldComponent(), KoinComponent { } } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) if (permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility)) { globalActionService.openPowerDialog() @@ -175,9 +172,7 @@ internal object PowerMenuComponent : ScaffoldComponent(), KoinComponent { override suspend fun onActivate(state: LauncherScaffoldState) { super.onActivate(state) - if (!permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility)) { - state.navigateBack(true) - } + state.navigateBack(true) } @SuppressLint("ModifierFactoryExtensionFunction") diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/QuickSettingsComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/QuickSettingsComponent.kt index eb13c251b..9840eabf2 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/QuickSettingsComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/QuickSettingsComponent.kt @@ -36,8 +36,6 @@ internal object QuickSettingsComponent : ScaffoldComponent(), KoinComponent { private val globalActionService: GlobalActionsService by inject() - override val permanent: Boolean = false - override val showSearchBar: Boolean = false override val drawBackground: Boolean = false @@ -84,16 +82,15 @@ internal object QuickSettingsComponent : ScaffoldComponent(), KoinComponent { } } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) - globalActionService.openQuickSettings() } override suspend fun onActivate(state: LauncherScaffoldState) { super.onActivate(state) - state.navigateBack(false) + state.navigateBack() } @SuppressLint("ModifierFactoryExtensionFunction") diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/RecentsComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/RecentsComponent.kt index c56d8db92..16949cf7a 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/RecentsComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/RecentsComponent.kt @@ -39,9 +39,6 @@ internal object RecentsComponent : ScaffoldComponent(), KoinComponent { private val permissionsManager: PermissionsManager by inject() private val globalActionService: GlobalActionsService by inject() - override val permanent: Boolean - get() = !permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility) - override val showSearchBar: Boolean = false override val drawBackground: Boolean = false @@ -69,7 +66,7 @@ internal object RecentsComponent : ScaffoldComponent(), KoinComponent { } } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) if (permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility)) { globalActionService.openRecents() @@ -78,7 +75,7 @@ internal object RecentsComponent : ScaffoldComponent(), KoinComponent { override suspend fun onActivate(state: LauncherScaffoldState) { super.onActivate(state) - state.navigateBack(true) + state.navigateBack() } @SuppressLint("ModifierFactoryExtensionFunction") diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScaffoldComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScaffoldComponent.kt index 829bae3cb..f97abe94b 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScaffoldComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScaffoldComponent.kt @@ -12,17 +12,6 @@ import de.mm20.launcher2.ui.launcher.scaffold.LauncherScaffoldState internal abstract class ScaffoldComponent { - /** - * If true, the component stays open. I.e. widgets, search. - * If false, the component is immediately dismissed after running its onMount function, - * returning to the home screen. I.e. turn off screen, launch app. - */ - open val permanent: Boolean = true - - /** - * For non-permanent components, this is the delay before the component is dismissed. - */ - open val resetDelay: Long = 0L /** * If true, a semi-transparent background is drawn behind the page. @@ -87,7 +76,7 @@ internal abstract class ScaffoldComponent { /** * Called when the component is about to be activated, but before the animation is completed. */ - open suspend fun onPreActivate(state: LauncherScaffoldState) { + open fun onPreActivate(state: LauncherScaffoldState) { } @@ -102,7 +91,7 @@ internal abstract class ScaffoldComponent { /** * Called when the component is about to be dismissed, but before the animation is completed. */ - open suspend fun onPreDismiss(state: LauncherScaffoldState) { + open fun onPreDismiss(state: LauncherScaffoldState) { } diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScreenOffComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScreenOffComponent.kt index 5734474f8..9926514e7 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScreenOffComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/ScreenOffComponent.kt @@ -23,21 +23,18 @@ import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.GestureAction import de.mm20.launcher2.ui.launcher.scaffold.LauncherScaffoldState import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager +import kotlinx.coroutines.delay import org.koin.core.component.KoinComponent import org.koin.core.component.inject +import kotlin.time.Duration.Companion.milliseconds internal object ScreenOffComponent : ScaffoldComponent(), KoinComponent { private val permissionsManager: PermissionsManager by inject() private val globalActionService: GlobalActionsService by inject() - override val permanent: Boolean - get() = !permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility) - override val showSearchBar: Boolean = false - override val resetDelay: Long = 1000L - override val drawBackground: Boolean = false override val isAtTop: State = mutableStateOf(true) @@ -96,7 +93,7 @@ internal object ScreenOffComponent : ScaffoldComponent(), KoinComponent { .alpha(1f - (state.currentProgress * 0.1f)) then defaultModifier } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) if (permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility)) { globalActionService.lockScreen() @@ -107,6 +104,9 @@ internal object ScreenOffComponent : ScaffoldComponent(), KoinComponent { super.onActivate(state) if (!permissionsManager.checkPermissionOnce(PermissionGroup.Accessibility)) { state.navigateBack(true) + } else { + delay(500.milliseconds) + state.reset() } } } \ No newline at end of file diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/SearchComponent.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/SearchComponent.kt index f9bb0faca..175020259 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/SearchComponent.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/scaffold/components/SearchComponent.kt @@ -103,14 +103,14 @@ internal class SearchComponent( super.onDismiss(state) } - override suspend fun onPreActivate(state: LauncherScaffoldState) { + override fun onPreActivate(state: LauncherScaffoldState) { super.onPreActivate(state) if (openKeyboard) { state.isSearchBarFocused = true } } - override suspend fun onPreDismiss(state: LauncherScaffoldState) { + override fun onPreDismiss(state: LauncherScaffoldState) { super.onPreDismiss(state) state.isSearchBarFocused = false }