Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e612957 authored by Alejandro Nijamkin's avatar Alejandro Nijamkin
Browse files

[flexiglass] Removes LockscreenScene.UseLockscreenContent

Since the migration from using KeyguardRootView to a compose-based
blueprint/section is almost complete, the value of keeping this constant
around is becoming less of a value and more of a burden.

Removing it is also safe because LockscreenScene is part of Flexiglass
and thus properly gated by a flag.

Bug: 316211368
Test: manually verified that System UI runs without crashing with
flexiglass on and off
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT

Change-Id: I32623f624109aae927cf85c4d9f88e452858f79d
parent 5414c5cb
Loading
Loading
Loading
Loading
+6 −20
Original line number Diff line number Diff line
@@ -37,9 +37,6 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn

/** Set this to `true` to use the LockscreenContent replacement of KeyguardRootView. */
private val UseLockscreenContent = false

/** The lock screen scene shows when the device is locked. */
@SysUISingleton
class LockscreenScene
@@ -48,7 +45,6 @@ constructor(
    @Application private val applicationScope: CoroutineScope,
    private val viewModel: LockscreenSceneViewModel,
    private val lockscreenContent: Lazy<LockscreenContent>,
    private val viewBasedLockscreenContent: Lazy<ViewBasedLockscreenContent>,
) : ComposableScene {
    override val key = SceneKey.Lockscreen

@@ -73,7 +69,6 @@ constructor(
    ) {
        LockscreenScene(
            lockscreenContent = lockscreenContent,
            viewBasedLockscreenContent = viewBasedLockscreenContent,
            modifier = modifier,
        )
    }
@@ -93,22 +88,13 @@ constructor(
}

@Composable
private fun SceneScope.LockscreenScene(
private fun LockscreenScene(
    lockscreenContent: Lazy<LockscreenContent>,
    viewBasedLockscreenContent: Lazy<ViewBasedLockscreenContent>,
    modifier: Modifier = Modifier,
) {
    if (UseLockscreenContent) {
    lockscreenContent
        .get()
        .Content(
            modifier = modifier.fillMaxSize(),
        )
    } else {
        with(viewBasedLockscreenContent.get()) {
            Content(
                modifier = modifier.fillMaxSize(),
            )
        }
    }
}
+0 −113
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.keyguard.ui.composable

import android.graphics.Rect
import android.view.View
import android.view.ViewGroup
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toComposeRect
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.viewinterop.AndroidView
import androidx.core.view.isVisible
import com.android.compose.animation.scene.SceneScope
import com.android.systemui.keyguard.qualifiers.KeyguardRootView
import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel
import com.android.systemui.notifications.ui.composable.NotificationStack
import com.android.systemui.res.R
import javax.inject.Inject

/**
 * Renders the content of the lockscreen.
 *
 * This is different from [LockscreenContent] (which is pure compose) and uses a view-based
 * implementation of the lockscreen scene content that relies on [KeyguardRootView].
 *
 * TODO(b/316211368): remove this once [LockscreenContent] is feature complete.
 */
class ViewBasedLockscreenContent
@Inject
constructor(
    private val lockscreenSceneViewModel: LockscreenSceneViewModel,
    @KeyguardRootView private val viewProvider: () -> @JvmSuppressWildcards View,
    private val keyguardRootViewModel: KeyguardRootViewModel,
) {
    @Composable
    fun SceneScope.Content(
        modifier: Modifier = Modifier,
    ) {
        fun findSettingsMenu(): View {
            return viewProvider().requireViewById(R.id.keyguard_settings_button)
        }

        LockscreenLongPress(
            viewModel = lockscreenSceneViewModel.longPress,
            modifier = modifier,
        ) { onSettingsMenuPlaced ->
            AndroidView(
                factory = { _ ->
                    val keyguardRootView = viewProvider()
                    // Remove the KeyguardRootView from any parent it might already have in legacy
                    // code just in case (a view can't have two parents).
                    (keyguardRootView.parent as? ViewGroup)?.removeView(keyguardRootView)
                    keyguardRootView
                },
                modifier = Modifier.fillMaxSize(),
            )

            val notificationStackPosition by
                keyguardRootViewModel.notificationBounds.collectAsState()

            Layout(
                modifier =
                    Modifier.fillMaxSize().onPlaced {
                        val settingsMenuView = findSettingsMenu()
                        onSettingsMenuPlaced(
                            if (settingsMenuView.isVisible) {
                                val bounds = Rect()
                                settingsMenuView.getHitRect(bounds)
                                bounds.toComposeRect()
                            } else {
                                null
                            }
                        )
                    },
                content = {
                    NotificationStack(
                        viewModel = lockscreenSceneViewModel.notifications,
                        isScrimVisible = false,
                    )
                }
            ) { measurables, constraints ->
                check(measurables.size == 1)
                val height = notificationStackPosition.height.toInt()
                val childConstraints = constraints.copy(minHeight = height, maxHeight = height)
                val placeable = measurables[0].measure(childConstraints)
                layout(constraints.maxWidth, constraints.maxHeight) {
                    val start = (constraints.maxWidth - placeable.measuredWidth) / 2
                    placeable.placeRelative(x = start, y = notificationStackPosition.top.toInt())
                }
            }
        }
    }
}