• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settingslib.spa.framework.util
18 
19 import androidx.compose.animation.animateColorAsState
20 import androidx.compose.animation.core.RepeatMode
21 import androidx.compose.animation.core.repeatable
22 import androidx.compose.animation.core.tween
23 import androidx.compose.foundation.background
24 import androidx.compose.foundation.layout.Box
25 import androidx.compose.material3.MaterialTheme
26 import androidx.compose.runtime.Composable
27 import androidx.compose.runtime.SideEffect
28 import androidx.compose.runtime.getValue
29 import androidx.compose.runtime.mutableStateOf
30 import androidx.compose.runtime.saveable.rememberSaveable
31 import androidx.compose.runtime.setValue
32 import androidx.compose.ui.Modifier
33 import androidx.compose.ui.graphics.Color
34 import com.android.settingslib.spa.framework.common.LocalEntryDataProvider
35 
36 @Composable
EntryHighlightnull37 internal fun EntryHighlight(content: @Composable () -> Unit) {
38     val entryData = LocalEntryDataProvider.current
39     val entryIsHighlighted = rememberSaveable { entryData.isHighlighted }
40     var localHighlighted by rememberSaveable { mutableStateOf(false) }
41     SideEffect {
42         localHighlighted = entryIsHighlighted
43     }
44 
45     val backgroundColor by animateColorAsState(
46         targetValue = when {
47             localHighlighted -> MaterialTheme.colorScheme.surfaceVariant
48             else -> Color.Transparent
49         },
50         animationSpec = repeatable(
51             iterations = 3,
52             animation = tween(durationMillis = 500),
53             repeatMode = RepeatMode.Restart
54         ),
55         label = "BackgroundColorAnimation",
56     )
57     Box(modifier = Modifier.background(color = backgroundColor)) {
58         content()
59     }
60 }
61