diff --git a/app/src/main/java/com/malopieds/innertune/MainActivity.kt b/app/src/main/java/com/malopieds/innertune/MainActivity.kt index ba17c3456..b8a381b74 100644 --- a/app/src/main/java/com/malopieds/innertune/MainActivity.kt +++ b/app/src/main/java/com/malopieds/innertune/MainActivity.kt @@ -210,8 +210,10 @@ class MainActivity : ComponentActivity() { setContent { LaunchedEffect(Unit) { - if (System.currentTimeMillis() - Updater.lastCheckTime > 1.days.inWholeMilliseconds) { - Updater.getLatestVersionName().onSuccess { + val checkForUpdates = dataStore.get(CheckForUpdatesKey, false) + if (checkForUpdates && System.currentTimeMillis() - Updater.lastCheckTime > 1.days.inWholeMilliseconds) { + val checkForPrereleases = dataStore.get(CheckForPrereleasesKey, false) + Updater.getLatestVersionName(checkForPrereleases).onSuccess { latestVersionName = it } } @@ -689,7 +691,7 @@ class MainActivity : ComponentActivity() { ) { BadgedBox( badge = { - if (latestVersionName != "v${BuildConfig.VERSION_NAME}") { + if (latestVersionName != "v${BuildConfig.VERSION_NAME}" && latestVersionName != "${BuildConfig.VERSION_NAME}") { Badge() } }, diff --git a/app/src/main/java/com/malopieds/innertune/constants/PreferenceKeys.kt b/app/src/main/java/com/malopieds/innertune/constants/PreferenceKeys.kt index 7aed8dbf9..b185b81cf 100644 --- a/app/src/main/java/com/malopieds/innertune/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/malopieds/innertune/constants/PreferenceKeys.kt @@ -88,6 +88,9 @@ val QuickPicksKey = stringPreferencesKey("discover") val PreferredLyricsProviderKey = stringPreferencesKey("lyricsProvider") val QueueEditLockKey = booleanPreferencesKey("queueEditLock") +val CheckForUpdatesKey = booleanPreferencesKey("checkForUpdates") +val CheckForPrereleasesKey = booleanPreferencesKey("checkForPrereleases") + enum class LibraryViewType { LIST, GRID, diff --git a/app/src/main/java/com/malopieds/innertune/ui/screens/settings/AboutScreen.kt b/app/src/main/java/com/malopieds/innertune/ui/screens/settings/AboutScreen.kt index c815a2eb0..c00cc7291 100644 --- a/app/src/main/java/com/malopieds/innertune/ui/screens/settings/AboutScreen.kt +++ b/app/src/main/java/com/malopieds/innertune/ui/screens/settings/AboutScreen.kt @@ -41,6 +41,11 @@ import com.malopieds.innertune.LocalPlayerAwareWindowInsets import com.malopieds.innertune.R import com.malopieds.innertune.ui.component.IconButton import com.malopieds.innertune.ui.utils.backToMain +import com.malopieds.innertune.constants.CheckForUpdatesKey +import com.malopieds.innertune.constants.CheckForPrereleasesKey +import com.malopieds.innertune.ui.component.SwitchPreference +import com.malopieds.innertune.utils.rememberPreference +import androidx.compose.animation.AnimatedVisibility @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -48,6 +53,10 @@ fun AboutScreen( navController: NavController, scrollBehavior: TopAppBarScrollBehavior, ) { + + val (checkForUpdates, onCheckForUpdatesChange) = rememberPreference(key = CheckForUpdatesKey, defaultValue = true) + val (checkForPrereleases, onCheckForPrereleasesChange) = rememberPreference(key = CheckForPrereleasesKey, defaultValue = false) + val uriHandler = LocalUriHandler.current Column( @@ -150,6 +159,22 @@ fun AboutScreen( ) } } + + SwitchPreference( + title = { Text(stringResource(R.string.check_for_updates)) }, + icon = { Icon(painterResource(R.drawable.update), null) }, + checked = checkForUpdates, + onCheckedChange = onCheckForUpdatesChange, + ) + + AnimatedVisibility(checkForUpdates) { + SwitchPreference( + title = { Text(stringResource(R.string.check_for_prereleases)) }, + icon = { Icon(painterResource(R.drawable.fast_forward), null) }, + checked = checkForPrereleases, + onCheckedChange = onCheckForPrereleasesChange, + ) + } } TopAppBar( diff --git a/app/src/main/java/com/malopieds/innertune/ui/screens/settings/ContentSettings.kt b/app/src/main/java/com/malopieds/innertune/ui/screens/settings/ContentSettings.kt index 361e86b9b..9e23ca432 100644 --- a/app/src/main/java/com/malopieds/innertune/ui/screens/settings/ContentSettings.kt +++ b/app/src/main/java/com/malopieds/innertune/ui/screens/settings/ContentSettings.kt @@ -47,6 +47,7 @@ import com.malopieds.innertune.constants.ProxyTypeKey import com.malopieds.innertune.constants.ProxyUrlKey import com.malopieds.innertune.constants.QuickPicks import com.malopieds.innertune.constants.QuickPicksKey +import com.malopieds.innertune.constants.StopMusicOnTaskClearKey import com.malopieds.innertune.constants.SYSTEM_DEFAULT import com.malopieds.innertune.constants.SimilarContent import com.malopieds.innertune.constants.TopSize @@ -88,6 +89,7 @@ fun ContentSettings( val (defaultChip, onDefaultChipChange) = rememberEnumPreference(key = ChipSortTypeKey, defaultValue = LibraryFilter.LIBRARY) val (quickPicks, onQuickPicksChange) = rememberEnumPreference(key = QuickPicksKey, defaultValue = QuickPicks.QUICK_PICKS) val (similarContentEnabled, similarContentEnabledChange) = rememberPreference(key = SimilarContent, defaultValue = true) + val (stopMusicOnTaskClear, onStopMusicOnTaskClearChange) = rememberPreference(key = StopMusicOnTaskClearKey, defaultValue = false) Column( Modifier diff --git a/app/src/main/java/com/malopieds/innertune/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/malopieds/innertune/ui/screens/settings/SettingsScreen.kt index ed4af032c..02b73b43b 100644 --- a/app/src/main/java/com/malopieds/innertune/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/java/com/malopieds/innertune/ui/screens/settings/SettingsScreen.kt @@ -83,7 +83,7 @@ fun SettingsScreen( icon = { Icon(painterResource(R.drawable.info), null) }, onClick = { navController.navigate("settings/about") }, ) - if (latestVersionName != "v${BuildConfig.VERSION_NAME}") { + if (latestVersionName != "v${BuildConfig.VERSION_NAME}" && latestVersionName != "${BuildConfig.VERSION_NAME}") { PreferenceEntry( title = { Text( @@ -99,7 +99,7 @@ fun SettingsScreen( } }, onClick = { - uriHandler.openUri("https://github.com/Malopieds/InnerTune/releases/latest") + uriHandler.openUri("https://github.com/Malopieds/InnerTune/releases/tag/$latestVersionName") }, ) } diff --git a/app/src/main/java/com/malopieds/innertune/utils/Updater.kt b/app/src/main/java/com/malopieds/innertune/utils/Updater.kt index 21c9c6bd9..fee5f0ef5 100644 --- a/app/src/main/java/com/malopieds/innertune/utils/Updater.kt +++ b/app/src/main/java/com/malopieds/innertune/utils/Updater.kt @@ -4,17 +4,42 @@ import io.ktor.client.HttpClient import io.ktor.client.request.get import io.ktor.client.statement.bodyAsText import org.json.JSONObject +import org.json.JSONArray object Updater { private val client = HttpClient() var lastCheckTime = -1L private set - suspend fun getLatestVersionName(): Result = + suspend fun getLatestVersionName(checkForPrereleases: Boolean): Result = runCatching { - val response = client.get("https://api.github.com/repos/Malopieds/InnerTune/releases/latest").bodyAsText() - val json = JSONObject(response) - val versionName = json.getString("name") + val latestResponse = client.get("https://api.github.com/repos/Malopieds/InnerTune/releases/latest").bodyAsText() + val latestJson = JSONObject(latestResponse) + + if (checkForPrereleases) { + val latestPublishedTime = latestJson.getString("published_at") + + val releasesResponse = client.get("https://api.github.com/repos/Malopieds/InnerTune/releases").bodyAsText() + val releasesJson = JSONArray(releasesResponse) + + repeat(releasesJson.length()) { index -> + val currentReleaseJson = releasesJson.getJSONObject(index) + val publishedTime = currentReleaseJson.getString("published_at") + if (publishedTime.compareTo(latestPublishedTime) > 0) { + val isPrerelease = currentReleaseJson.getBoolean("prerelease") + if (isPrerelease) { + val versionName = currentReleaseJson.getString("name") + lastCheckTime = System.currentTimeMillis() + return Result.success(versionName) + } + } else { + return@repeat + } + } + } + + val versionName = latestJson.getString("name") + lastCheckTime = System.currentTimeMillis() versionName } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a3118370..b3a660b5e 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -345,6 +345,8 @@ About App version + Check for updates + Check for pre-releases New version available Translation Models