Initial commit
This commit is contained in:
145
app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt
Normal file
145
app/src/main/kotlin/it/vfsfitvnm/vimusic/MainActivity.kt
Normal file
@@ -0,0 +1,145 @@
|
||||
package it.vfsfitvnm.vimusic
|
||||
|
||||
import android.content.ComponentName
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.compose.animation.ExperimentalAnimationApi
|
||||
import androidx.compose.animation.core.LinearEasing
|
||||
import androidx.compose.animation.core.RepeatMode
|
||||
import androidx.compose.animation.core.infiniteRepeatable
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.LocalIndication
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.gestures.LocalOverScrollConfiguration
|
||||
import androidx.compose.foundation.isSystemInDarkTheme
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.material.ripple.LocalRippleTheme
|
||||
import androidx.compose.material.ripple.RippleAlpha
|
||||
import androidx.compose.material.ripple.RippleTheme
|
||||
import androidx.compose.material.ripple.rememberRipple
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.SideEffect
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.text.ExperimentalTextApi
|
||||
import androidx.media3.session.MediaController
|
||||
import androidx.media3.session.SessionToken
|
||||
import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
||||
import com.google.common.util.concurrent.ListenableFuture
|
||||
import com.valentinilk.shimmer.LocalShimmerTheme
|
||||
import com.valentinilk.shimmer.defaultShimmerTheme
|
||||
import it.vfsfitvnm.vimusic.services.PlayerService
|
||||
import it.vfsfitvnm.vimusic.ui.components.BottomSheetMenu
|
||||
import it.vfsfitvnm.vimusic.ui.components.LocalMenuState
|
||||
import it.vfsfitvnm.vimusic.ui.components.rememberMenuState
|
||||
import it.vfsfitvnm.vimusic.ui.screens.HomeScreen
|
||||
import it.vfsfitvnm.vimusic.ui.styling.LocalColorPalette
|
||||
import it.vfsfitvnm.vimusic.ui.styling.LocalTypography
|
||||
import it.vfsfitvnm.vimusic.ui.styling.rememberColorPalette
|
||||
import it.vfsfitvnm.vimusic.ui.styling.rememberTypography
|
||||
import it.vfsfitvnm.vimusic.utils.*
|
||||
|
||||
|
||||
@ExperimentalAnimationApi
|
||||
@ExperimentalFoundationApi
|
||||
@ExperimentalTextApi
|
||||
class MainActivity : ComponentActivity() {
|
||||
private lateinit var mediaControllerFuture: ListenableFuture<MediaController>
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
val sessionToken = SessionToken(this, ComponentName(this, PlayerService::class.java))
|
||||
mediaControllerFuture = MediaController.Builder(this, sessionToken).buildAsync()
|
||||
|
||||
val intentVideoId = intent?.data?.getQueryParameter("v")
|
||||
|
||||
setContent {
|
||||
val preferences = rememberPreferences()
|
||||
val systemUiController = rememberSystemUiController()
|
||||
val isDarkTheme = isSystemInDarkTheme()
|
||||
|
||||
val colorPalette = rememberColorPalette(isDarkTheme)
|
||||
|
||||
val rippleTheme = remember(colorPalette.text, isDarkTheme) {
|
||||
object : RippleTheme {
|
||||
@Composable
|
||||
override fun defaultColor(): Color = RippleTheme.defaultRippleColor(
|
||||
contentColor = colorPalette.text,
|
||||
lightTheme = !isDarkTheme
|
||||
)
|
||||
|
||||
@Composable
|
||||
override fun rippleAlpha(): RippleAlpha = RippleTheme.defaultRippleAlpha(
|
||||
contentColor = colorPalette.text,
|
||||
lightTheme = !isDarkTheme
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val shimmerTheme = remember {
|
||||
defaultShimmerTheme.copy(
|
||||
animationSpec = infiniteRepeatable(
|
||||
animation = tween(
|
||||
durationMillis = 800,
|
||||
easing = LinearEasing,
|
||||
delayMillis = 250,
|
||||
),
|
||||
repeatMode = RepeatMode.Restart
|
||||
),
|
||||
shaderColors = listOf(
|
||||
Color.Unspecified.copy(alpha = 0.25f),
|
||||
Color.White.copy(alpha = 0.50f),
|
||||
Color.Unspecified.copy(alpha = 0.25f),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
SideEffect {
|
||||
systemUiController.setSystemBarsColor(colorPalette.background, !isDarkTheme)
|
||||
}
|
||||
|
||||
CompositionLocalProvider(
|
||||
LocalOverScrollConfiguration provides null,
|
||||
LocalIndication provides rememberRipple(bounded = false),
|
||||
LocalRippleTheme provides rippleTheme,
|
||||
LocalPreferences provides preferences,
|
||||
LocalColorPalette provides colorPalette,
|
||||
LocalShimmerTheme provides shimmerTheme,
|
||||
LocalTypography provides rememberTypography(colorPalette.text),
|
||||
LocalYoutubePlayer provides rememberYoutubePlayer(
|
||||
mediaControllerFuture,
|
||||
preferences.repeatMode
|
||||
),
|
||||
LocalMenuState provides rememberMenuState(),
|
||||
LocalHapticFeedback provides rememberHapticFeedback()
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.background(LocalColorPalette.current.background)
|
||||
) {
|
||||
HomeScreen(intentVideoId = intentVideoId)
|
||||
|
||||
BottomSheetMenu(
|
||||
state = LocalMenuState.current,
|
||||
modifier = Modifier
|
||||
.align(Alignment.BottomCenter)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
MediaController.releaseFuture(mediaControllerFuture)
|
||||
super.onDestroy()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user