Skip to content

Commit

Permalink
opti: rename leanback to tv.
Browse files Browse the repository at this point in the history
  • Loading branch information
oxyroid committed Aug 11, 2024
1 parent 25a2568 commit 4910f2f
Show file tree
Hide file tree
Showing 76 changed files with 395 additions and 354 deletions.
14 changes: 7 additions & 7 deletions androidApp/src/main/baseline-prof.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2665,13 +2665,13 @@ HSPLcom/m3u/data/database/M3UDatabase_Impl;->s()Ldd/y;
PLcom/m3u/data/database/M3UDatabase_Impl;->s()Ldd/y;
HSPLcom/m3u/data/database/M3UDatabase_Impl;->t()Ldd/b0;
PLcom/m3u/data/database/M3UDatabase_Impl;->t()Ldd/b0;
Lcom/m3u/data/leanback/model/Leanback;
HSPLcom/m3u/data/leanback/model/Leanback;-><clinit>()V
PLcom/m3u/data/leanback/model/Leanback;-><clinit>()V
HSPLcom/m3u/data/leanback/model/Leanback;-><init>(Ljava/lang/String;IZLjava/lang/String;Z)V
PLcom/m3u/data/leanback/model/Leanback;-><init>(Ljava/lang/String;IZLjava/lang/String;Z)V
HSPLcom/m3u/data/leanback/model/Leanback;-><init>(Ljava/lang/String;IZLjava/lang/String;ZLkotlin/jvm/internal/f;)V
PLcom/m3u/data/leanback/model/Leanback;-><init>(Ljava/lang/String;IZLjava/lang/String;ZLkotlin/jvm/internal/f;)V
Lcom/m3u/data/tv/model/Tv;
HSPLcom/m3u/data/tv/model/Tv;-><clinit>()V
PLcom/m3u/data/tv/model/Tv;-><clinit>()V
HSPLcom/m3u/data/tv/model/Tv;-><init>(Ljava/lang/String;IZLjava/lang/String;Z)V
PLcom/m3u/data/tv/model/Tv;-><init>(Ljava/lang/String;IZLjava/lang/String;Z)V
HSPLcom/m3u/data/tv/model/Tv;-><init>(Ljava/lang/String;IZLjava/lang/String;ZLkotlin/jvm/internal/f;)V
PLcom/m3u/data/tv/model/Tv;-><init>(Ljava/lang/String;IZLjava/lang/String;ZLkotlin/jvm/internal/f;)V
Lcom/m3u/feature/playlist/TvPlaylistActivity;
Ld/a;
HSPLd/a;-><init>()V
Expand Down
6 changes: 3 additions & 3 deletions androidApp/src/main/java/com/m3u/androidApp/AppPublisher.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.app.Application
import android.os.Build
import com.m3u.core.architecture.Abi
import com.m3u.core.architecture.Publisher
import com.m3u.core.util.context.leanback
import com.m3u.core.util.context.tv
import javax.inject.Inject

class AppPublisher @Inject constructor(private val application: Application) : Publisher {
Expand All @@ -16,6 +16,6 @@ class AppPublisher @Inject constructor(private val application: Application) : P
override val lite: Boolean = BuildConfig.FLAVOR.contains("liteCodec", true)
override val model: String = Build.MODEL
override val abi: Abi = Abi.of(Build.SUPPORTED_ABIS[0])
override val leanback: Boolean
get() = application.resources.configuration.leanback
override val tv: Boolean
get() = application.resources.configuration.tv
}
32 changes: 16 additions & 16 deletions androidApp/src/main/java/com/m3u/androidApp/ui/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ import androidx.navigation.navOptions
import com.m3u.androidApp.ui.sheet.RemoteControlSheet
import com.m3u.androidApp.ui.sheet.RemoteControlSheetValue
import com.m3u.core.architecture.preferences.hiltPreferences
import com.m3u.data.leanback.model.RemoteDirection
import com.m3u.data.tv.model.RemoteDirection
import com.m3u.material.components.Icon
import com.m3u.material.ktx.leanback
import com.m3u.material.ktx.tv
import com.m3u.material.model.LocalSpacing
import com.m3u.ui.Destination
import com.m3u.ui.FontFamilies
Expand Down Expand Up @@ -65,18 +65,18 @@ fun App(
onBackPressedDispatcher.onBackPressed()
}

// for leanbacks
val broadcastCodeOnLeanback by viewModel.broadcastCodeOnLeanback.collectAsStateWithLifecycle()
// for tvs
val broadcastCodeOnTv by viewModel.broadcastCodeOnTv.collectAsStateWithLifecycle()

// for smartphones
val remoteControlSheetValue by viewModel.remoteControlSheetValue.collectAsStateWithLifecycle()

AppImpl(
navController = navController,
onBackPressed = onBackPressed.takeUnless { shouldDispatchBackStack },
checkLeanbackCodeOnSmartphone = viewModel::checkLeanbackCodeOnSmartphone,
forgetLeanbackCodeOnSmartphone = viewModel::forgetLeanbackCodeOnSmartphone,
broadcastCodeOnLeanback = broadcastCodeOnLeanback,
checkTvCodeOnSmartphone = viewModel::checkTvCodeOnSmartphone,
forgetTvCodeOnSmartphone = viewModel::forgetTvCodeOnSmartphone,
broadcastCodeOnTv = broadcastCodeOnTv,
isRemoteControlSheetVisible = viewModel.isConnectSheetVisible,
remoteControlSheetValue = remoteControlSheetValue,
onRemoteDirection = viewModel::onRemoteDirection,
Expand All @@ -95,20 +95,20 @@ private fun AppImpl(
navController: NavHostController,
isRemoteControlSheetVisible: Boolean,
remoteControlSheetValue: RemoteControlSheetValue,
broadcastCodeOnLeanback: String?,
broadcastCodeOnTv: String?,
onBackPressed: (() -> Unit)?,
openRemoteControlSheet: () -> Unit,
onCode: (String) -> Unit,
checkLeanbackCodeOnSmartphone: () -> Unit,
forgetLeanbackCodeOnSmartphone: () -> Unit,
checkTvCodeOnSmartphone: () -> Unit,
forgetTvCodeOnSmartphone: () -> Unit,
onRemoteDirection: (RemoteDirection) -> Unit,
onDismissRequest: () -> Unit,
modifier: Modifier = Modifier
) {
val spacing = LocalSpacing.current
val preferences = hiltPreferences()

val leanback = leanback()
val tv = tv()

val entry by navController.currentBackStackEntryAsState()

Expand Down Expand Up @@ -147,7 +147,7 @@ private fun AppImpl(
) {
SnackHost(Modifier.weight(1f))
AnimatedVisibility(
visible = !leanback && preferences.remoteControl,
visible = !tv && preferences.remoteControl,
enter = scaleIn(initialScale = 0.65f) + fadeIn(),
exit = scaleOut(targetScale = 0.65f) + fadeOut(),
) {
Expand All @@ -172,15 +172,15 @@ private fun AppImpl(
value = remoteControlSheetValue,
visible = isRemoteControlSheetVisible,
onCode = onCode,
checkLeanbackCodeOnSmartphone = checkLeanbackCodeOnSmartphone,
forgetLeanbackCodeOnSmartphone = forgetLeanbackCodeOnSmartphone,
checkTvCodeOnSmartphone = checkTvCodeOnSmartphone,
forgetTvCodeOnSmartphone = forgetTvCodeOnSmartphone,
onRemoteDirection = onRemoteDirection,
onDismissRequest = onDismissRequest
)

Crossfade(
targetState = broadcastCodeOnLeanback,
label = "broadcast-code-on-leanback",
targetState = broadcastCodeOnTv,
label = "broadcast-code-on-tv",
modifier = Modifier
.padding(spacing.medium)
.align(Alignment.BottomEnd)
Expand Down
6 changes: 3 additions & 3 deletions androidApp/src/main/java/com/m3u/androidApp/ui/AppNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.m3u.feature.playlist.navigation.navigateToPlaylist
import com.m3u.feature.playlist.navigation.playlistScreen
import com.m3u.feature.playlist.navigation.playlistTvScreen
import com.m3u.feature.channel.PlayerActivity
import com.m3u.material.ktx.leanback
import com.m3u.material.ktx.tv
import com.m3u.ui.Destination
import com.m3u.ui.Events
import com.m3u.ui.SettingDestination
Expand All @@ -36,7 +36,7 @@ fun AppNavHost(
val context = LocalContext.current
val preferences = hiltPreferences()

val leanback = leanback()
val tv = tv()

NavHost(
navController = navController,
Expand All @@ -48,7 +48,7 @@ fun AppNavHost(
rootGraph(
contentPadding = contentPadding,
navigateToPlaylist = { playlist ->
navController.navigateToPlaylist(playlist.url, leanback)
navController.navigateToPlaylist(playlist.url, tv)
},
navigateToChannel = {
if (preferences.zappingMode && PlayerActivity.isInPipMode) return@rootGraph
Expand Down
72 changes: 36 additions & 36 deletions androidApp/src/main/java/com/m3u/androidApp/ui/AppViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ import com.m3u.core.architecture.Publisher
import com.m3u.core.architecture.dispatcher.Dispatcher
import com.m3u.core.architecture.dispatcher.M3uDispatchers.IO
import com.m3u.core.architecture.preferences.Preferences
import com.m3u.data.api.LeanbackApiDelegate
import com.m3u.data.leanback.model.RemoteDirection
import com.m3u.data.repository.leanback.ConnectionToLeanbackValue
import com.m3u.data.repository.leanback.LeanbackRepository
import com.m3u.data.api.TvApiDelegate
import com.m3u.data.tv.model.RemoteDirection
import com.m3u.data.repository.tv.ConnectionToTvValue
import com.m3u.data.repository.tv.TvRepository
import com.m3u.data.repository.playlist.PlaylistRepository
import com.m3u.data.repository.programme.ProgrammeRepository
import com.m3u.data.service.Messager
Expand All @@ -42,8 +42,8 @@ class AppViewModel @Inject constructor(
messager: Messager,
private val playlistRepository: PlaylistRepository,
private val programmeRepository: ProgrammeRepository,
private val leanbackRepository: LeanbackRepository,
private val leanbackApi: LeanbackApiDelegate,
private val tvRepository: TvRepository,
private val tvApi: TvApiDelegate,
private val workManager: WorkManager,
private val preferences: Preferences,
private val publisher: Publisher,
Expand All @@ -53,69 +53,69 @@ class AppViewModel @Inject constructor(
refreshProgrammes()
}

val broadcastCodeOnLeanback: StateFlow<String?> = leanbackRepository
.broadcastCodeOnLeanback
val broadcastCodeOnTv: StateFlow<String?> = tvRepository
.broadcastCodeOnTv
.map { code -> code?.let { convertToPaddedString(it) } }
.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = null
)

private val leanbackCodeOnSmartphone = MutableSharedFlow<String>()
private val tvCodeOnSmartphone = MutableSharedFlow<String>()

private val connectionToLeanbackValue: StateFlow<ConnectionToLeanbackValue> =
leanbackCodeOnSmartphone.flatMapLatest { code ->
if (code.isNotEmpty()) leanbackRepository.connectToLeanback(code.toInt())
private val connectionToTvValue: StateFlow<ConnectionToTvValue> =
tvCodeOnSmartphone.flatMapLatest { code ->
if (code.isNotEmpty()) tvRepository.connectToTv(code.toInt())
else {
leanbackRepository.disconnectToLeanback()
flowOf(ConnectionToLeanbackValue.Idle())
tvRepository.disconnectToTv()
flowOf(ConnectionToTvValue.Idle())
}
}
.flowOn(ioDispatcher)
.stateIn(
scope = viewModelScope,
initialValue = ConnectionToLeanbackValue.Idle(),
initialValue = ConnectionToTvValue.Idle(),
started = SharingStarted.WhileSubscribed(5_000)
)

internal val remoteControlSheetValue: StateFlow<RemoteControlSheetValue> = combine(
leanbackRepository.connected,
tvRepository.connected,
snapshotFlow { code },
connectionToLeanbackValue
) { leanback, code, connection ->
connectionToTvValue
) { tvInfo, code, connection ->
when {
leanback == null -> {
tvInfo == null -> {
RemoteControlSheetValue.Prepare(
code = code,
searchingOrConnecting = with(connection) {
this is ConnectionToLeanbackValue.Searching ||
this is ConnectionToLeanbackValue.Connecting
this is ConnectionToTvValue.Searching ||
this is ConnectionToTvValue.Connecting
}
)
}

leanback.version != publisher.versionCode -> {
tvInfo.version != publisher.versionCode -> {
this.code = ""
// val query = UpdateKey(leanback.version, leanback.abi)
// val query = UpdateKey(tvInfo.version, tvInfo.abi)
// val state = states[query] ?: UpdateState.Idle
// RemoteControlSheetValue.Update(
// leanback = leanback,
// tvInfo = tvInfo,
// state = state
// )
RemoteControlSheetValue.Prepare(
code = code,
searchingOrConnecting = with(connection) {
this is ConnectionToLeanbackValue.Searching ||
this is ConnectionToLeanbackValue.Connecting
this is ConnectionToTvValue.Searching ||
this is ConnectionToTvValue.Connecting
}
)
}

else -> {
this.code = ""
RemoteControlSheetValue.DPad(
leanback = leanback,
tvInfo = tvInfo,
)
}
}
Expand All @@ -126,31 +126,31 @@ class AppViewModel @Inject constructor(
started = SharingStarted.WhileSubscribed(5_000L)
)

private var checkLeanbackCodeOnSmartphoneJob: Job? = null
private var checkTvCodeOnSmartphoneJob: Job? = null

internal fun checkLeanbackCodeOnSmartphone() {
internal fun checkTvCodeOnSmartphone() {
viewModelScope.launch {
leanbackCodeOnSmartphone.emit(code)
tvCodeOnSmartphone.emit(code)
}
checkLeanbackCodeOnSmartphoneJob?.cancel()
checkLeanbackCodeOnSmartphoneJob = snapshotFlow { preferences.remoteControl }
checkTvCodeOnSmartphoneJob?.cancel()
checkTvCodeOnSmartphoneJob = snapshotFlow { preferences.remoteControl }
.onEach { remoteControl ->
if (!remoteControl) {
forgetLeanbackCodeOnSmartphone()
forgetTvCodeOnSmartphone()
}
}
.launchIn(viewModelScope)
}

internal fun forgetLeanbackCodeOnSmartphone() {
internal fun forgetTvCodeOnSmartphone() {
viewModelScope.launch {
leanbackCodeOnSmartphone.emit("")
tvCodeOnSmartphone.emit("")
}
}

internal fun onRemoteDirection(remoteDirection: RemoteDirection) {
viewModelScope.launch {
leanbackApi.remoteDirection(remoteDirection.value)
tvApi.remoteDirection(remoteDirection.value)
}
}

Expand Down
Loading

0 comments on commit 4910f2f

Please sign in to comment.