Update Play account and foreground service compliance

This commit is contained in:
tapframe 2026-07-26 18:19:22 +05:30
parent b60995324b
commit 8937dc7b6b
10 changed files with 49 additions and 2 deletions

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE"
tools:node="remove" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"
tools:node="remove" />
<application>
<service
android:name="com.nuvio.app.features.player.PlayerNowPlayingService"
tools:node="remove" />
</application>
</manifest>

View file

@ -10,4 +10,5 @@ actual object AppFeaturePolicy {
actual val heroTrailerPlaybackSupported: Boolean = true
actual val inAppUpdaterEnabled: Boolean = true
actual val imdbRatingLogoEnabled: Boolean = true
actual val mediaPlaybackForegroundServiceEnabled: Boolean = true
}

View file

@ -20,6 +20,7 @@ import android.os.Looper
import android.os.SystemClock
import android.util.Log
import com.nuvio.app.R
import com.nuvio.app.core.build.AppFeaturePolicy
import java.io.ByteArrayOutputStream
import java.lang.ref.WeakReference
import java.net.HttpURLConnection
@ -106,7 +107,9 @@ internal class AndroidPlayerNowPlayingController(
get() = !released && metadata != null
init {
createNotificationChannel(appContext)
if (AppFeaturePolicy.mediaPlaybackForegroundServiceEnabled) {
createNotificationChannel(appContext)
}
AndroidNowPlayingActionDispatcher.register(this)
}
@ -288,6 +291,7 @@ internal class AndroidPlayerNowPlayingController(
}
private fun publishNotification() {
if (!AppFeaturePolicy.mediaPlaybackForegroundServiceEnabled) return
val currentMetadata = metadata ?: return
val notification = buildNotification(
context = appContext,
@ -377,6 +381,7 @@ class PlayerNowPlayingService : Service() {
companion object {
internal fun publish(context: Context, notification: Notification) {
if (!AppFeaturePolicy.mediaPlaybackForegroundServiceEnabled) return
PlayerNowPlayingServiceState.notification = notification
val intent = Intent(context, PlayerNowPlayingService::class.java)
.setAction(ACTION_START_FOREGROUND)
@ -394,6 +399,7 @@ class PlayerNowPlayingService : Service() {
}
internal fun hide(context: Context) {
if (!AppFeaturePolicy.mediaPlaybackForegroundServiceEnabled) return
PlayerNowPlayingServiceState.notification = null
runCatching { context.stopService(Intent(context, PlayerNowPlayingService::class.java)) }
context.getSystemService(NotificationManager::class.java)

View file

@ -3,11 +3,12 @@ package com.nuvio.app.core.build
actual object AppFeaturePolicy {
actual val pluginsEnabled: Boolean = false
actual val supportersContributorsPageEnabled: Boolean = true
actual val accountDeletionEnabled: Boolean = false
actual val accountDeletionEnabled: Boolean = true
actual val personalMediaAddonCopyEnabled: Boolean = false
actual val p2pEnabled: Boolean = true
actual val trailerPlaybackMode: TrailerPlaybackMode = TrailerPlaybackMode.EXTERNAL
actual val heroTrailerPlaybackSupported: Boolean = false
actual val inAppUpdaterEnabled: Boolean = false
actual val imdbRatingLogoEnabled: Boolean = false
actual val mediaPlaybackForegroundServiceEnabled: Boolean = false
}

View file

@ -432,6 +432,7 @@
<string name="compose_settings_page_playback">Playback</string>
<string name="compose_settings_page_plugins">Plugins</string>
<string name="compose_settings_page_poster_customization">Poster Card Style</string>
<string name="compose_settings_page_privacy_policy">Privacy Policy</string>
<string name="compose_settings_page_root">Settings</string>
<string name="compose_settings_page_streams">Streams</string>
<string name="settings_appearance_section_streams">STREAMS</string>
@ -454,6 +455,7 @@
<string name="compose_settings_root_general_section">GENERAL</string>
<string name="compose_settings_root_integrations_description">Manage available integrations</string>
<string name="compose_settings_root_notifications_description">Manage episode release alerts and send a test notification.</string>
<string name="compose_settings_root_privacy_policy_description">Learn how Nuvio handles your data</string>
<string name="compose_settings_root_streams_description">Stream result display and badge URL rules.</string>
<string name="compose_settings_root_switch_profile_description">Change to a different profile.</string>
<string name="compose_settings_root_switch_profile_title">Switch Profile</string>

View file

@ -15,4 +15,5 @@ expect object AppFeaturePolicy {
val heroTrailerPlaybackSupported: Boolean
val inAppUpdaterEnabled: Boolean
val imdbRatingLogoEnabled: Boolean
val mediaPlaybackForegroundServiceEnabled: Boolean
}

View file

@ -15,10 +15,12 @@ import androidx.compose.material.icons.rounded.Notifications
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material.icons.rounded.People
import androidx.compose.material.icons.rounded.PlayArrow
import androidx.compose.material.icons.rounded.Policy
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.nuvio.app.core.build.AppVersionConfig
@ -32,6 +34,7 @@ import nuvio.composeapp.generated.resources.compose_settings_page_integrations
import nuvio.composeapp.generated.resources.compose_settings_page_licenses_attributions
import nuvio.composeapp.generated.resources.compose_settings_page_notifications
import nuvio.composeapp.generated.resources.compose_settings_page_playback
import nuvio.composeapp.generated.resources.compose_settings_page_privacy_policy
import nuvio.composeapp.generated.resources.compose_settings_page_supporters_contributors
import nuvio.composeapp.generated.resources.compose_settings_root_account_description
import nuvio.composeapp.generated.resources.compose_settings_root_appearance_description
@ -43,6 +46,7 @@ import nuvio.composeapp.generated.resources.compose_settings_root_downloads_titl
import nuvio.composeapp.generated.resources.compose_settings_root_general_section
import nuvio.composeapp.generated.resources.compose_settings_root_integrations_description
import nuvio.composeapp.generated.resources.compose_settings_root_notifications_description
import nuvio.composeapp.generated.resources.compose_settings_root_privacy_policy_description
import nuvio.composeapp.generated.resources.compose_settings_root_switch_profile_description
import nuvio.composeapp.generated.resources.compose_settings_root_switch_profile_title
import nuvio.composeapp.generated.resources.compose_settings_root_trakt_description
@ -59,6 +63,8 @@ import nuvio.composeapp.generated.resources.about_supporters_contributors_subtit
import nuvio.composeapp.generated.resources.about_licenses_attributions_subtitle
import org.jetbrains.compose.resources.stringResource
private const val PRIVACY_POLICY_URL = "https://nuvio.tv/privacy-policy"
internal fun LazyListScope.settingsRootContent(
isTablet: Boolean,
onPlaybackClick: () -> Unit,
@ -177,6 +183,7 @@ internal fun LazyListScope.settingsRootContent(
}
if (showAboutSection) {
item {
val uriHandler = LocalUriHandler.current
SettingsSection(
title = stringResource(Res.string.compose_settings_root_about_section),
isTablet = isTablet,
@ -192,6 +199,14 @@ internal fun LazyListScope.settingsRootContent(
)
SettingsGroupDivider(isTablet = isTablet)
}
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_privacy_policy),
description = stringResource(Res.string.compose_settings_root_privacy_policy_description),
icon = Icons.Rounded.Policy,
isTablet = isTablet,
onClick = { uriHandler.openUri(PRIVACY_POLICY_URL) },
)
SettingsGroupDivider(isTablet = isTablet)
SettingsNavigationRow(
title = stringResource(Res.string.compose_settings_page_licenses_attributions),
description = stringResource(Res.string.about_licenses_attributions_subtitle),

View file

@ -10,4 +10,5 @@ actual object AppFeaturePolicy {
actual val heroTrailerPlaybackSupported: Boolean = false
actual val inAppUpdaterEnabled: Boolean = false
actual val imdbRatingLogoEnabled: Boolean = true
actual val mediaPlaybackForegroundServiceEnabled: Boolean = false
}

View file

@ -10,4 +10,5 @@ actual object AppFeaturePolicy {
actual val heroTrailerPlaybackSupported: Boolean = false
actual val inAppUpdaterEnabled: Boolean = false
actual val imdbRatingLogoEnabled: Boolean = false
actual val mediaPlaybackForegroundServiceEnabled: Boolean = false
}

View file

@ -10,4 +10,5 @@ actual object AppFeaturePolicy {
actual val heroTrailerPlaybackSupported: Boolean = false
actual val inAppUpdaterEnabled: Boolean = false
actual val imdbRatingLogoEnabled: Boolean = true
actual val mediaPlaybackForegroundServiceEnabled: Boolean = false
}