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 EntryHighlightnull37internal 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