Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 0 additions & 175 deletions LOCALIZATION_README.md

This file was deleted.

1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ dependencies {
implementation libs.androidx.core.ktx
implementation libs.bundles.lifecycle
implementation libs.androidx.activity.compose
implementation libs.androidx.startup

// Compose BOM and UI
implementation platform(libs.androidx.compose.bom)
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@
<action android:name="androidx.media3.session.MediaSessionService" />
</intent-filter>
</service>

<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.mobyle.abbay.infra.startup.PlayerInitializer"
android:value="androidx.startup" />
</provider>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.mobyle.abbay.infra.startup

import android.content.ComponentName
import android.content.Context
import androidx.media3.session.MediaController
import androidx.media3.session.SessionToken
import androidx.startup.Initializer
import com.mobyle.abbay.presentation.common.service.PlayerService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn

class PlayerInitializer : Initializer<Flow<MediaController>> {
override fun create(context: Context): Flow<MediaController> {
return flow {
val controller = MediaController.Builder(
context,
SessionToken(context, ComponentName(context, PlayerService::class.java))
).buildAsync()

val player = controller.get()

emit(player)
}.flowOn(Dispatchers.IO)
}

override fun dependencies(): List<Class<out Initializer<*>>> {
return emptyList()
}
}
44 changes: 13 additions & 31 deletions app/src/main/java/com/mobyle/abbay/presentation/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.mobyle.abbay.presentation

import android.content.ComponentName
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
Expand All @@ -9,18 +8,15 @@ import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.media3.session.MediaController
import androidx.media3.session.SessionToken
import androidx.navigation.compose.rememberNavController
import androidx.startup.AppInitializer
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.common.util.concurrent.ListenableFuture
import com.google.common.util.concurrent.MoreExecutors
import com.mobyle.abbay.infra.navigation.AbbayNavHost
import com.mobyle.abbay.presentation.common.service.PlayerService
import com.mobyle.abbay.infra.startup.PlayerInitializer
import com.mobyle.abbay.presentation.common.theme.MyApplicationTheme
import com.usecase.IsPlayWhenAppIsClosedEnabled
import com.usecase.UpdateAppLifeStatus
Expand All @@ -37,7 +33,7 @@ class MainActivity : ComponentActivity() {
@Inject
lateinit var updateAppLifeStatus: UpdateAppLifeStatus

private lateinit var controller: ListenableFuture<MediaController>
private var player: MediaController? = null
private var isPlayerReady = false

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -52,36 +48,22 @@ class MainActivity : ComponentActivity() {

updateAppLifeStatus(true)

controller = MediaController.Builder(
this,
SessionToken(this, ComponentName(this, PlayerService::class.java))
).buildAsync()

setContent {
val navController = rememberNavController()
val currentPlayer = remember {
mutableStateOf<MediaController?>(null)
}
val playerState = AppInitializer.getInstance(this@MainActivity)
.initializeComponent(PlayerInitializer::class.java).collectAsState(null)

LaunchedEffect(Unit) {
controller.addListener({
try {
currentPlayer.value = controller.get()
isPlayerReady = true // This will dismiss the splash screen
} catch (e: Exception) {
// Handle error but still dismiss splash screen
isPlayerReady = true
}
}, MoreExecutors.directExecutor())
LaunchedEffect(playerState.value) {
player = playerState.value
isPlayerReady = playerState.value != null
}

MyApplicationTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.primary
) {
currentPlayer.value?.let { player ->
playerState.value?.let { player ->
AbbayNavHost(
player = player,
navController = navController
Expand All @@ -98,9 +80,9 @@ class MainActivity : ComponentActivity() {
updateAppLifeStatus(false)

if (!isPlayWhenAppIsClosedEnabled()) {
if (::controller.isInitialized) {
controller.get().stop()
controller.get().release()
if (player != null) {
player?.stop()
player?.release()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -462,23 +462,6 @@ fun BooksListScreen(
progress = book.progress,
currentPosition = book.getBookPosition()
)

if (!player.isPlaying) {
if (book is MultipleBooks) {
player.prepareMultipleBooks(
currentPosition = book.currentBookPosition,
idList = book.bookFileList.map { it.id },
progress = book.progress,
isPlaying = viewModel.isPlaying
)
} else {
player.prepareBook(
id = id,
progress = book.progress,
isPlaying = viewModel.isPlaying
)
}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ class BooksListViewModel @Inject constructor(
data object NoPermissionsGranted : BooksListUiState()
}

companion object {
private companion object {
val API_32_OR_LESS_PERMISSIONS_LIST = listOf(Manifest.permission.READ_EXTERNAL_STORAGE)
val PERMISSIONS_LIST = listOf(Manifest.permission.READ_MEDIA_AUDIO)
}
Expand Down
Loading