diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 03cb2b8e6..a5da3688a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,7 +30,7 @@ android { minSdk = 21 targetSdk = 35 versionCode = 121 - versionName = "2.40.5" + versionName = "2.41.0" } buildTypes { diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerFragment.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerFragment.kt index febf77108..b9a7f7be9 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerFragment.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerFragment.kt @@ -472,9 +472,8 @@ class ChannelPagerFragment : BaseNetworkFragment(), Scrollable, FragmentHost, In viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), requireContext().prefs().getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), args.channelId, args.channelLogin ) @@ -687,9 +686,8 @@ class ChannelPagerFragment : BaseNetworkFragment(), Scrollable, FragmentHost, In viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), requireContext().prefs().getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), args.channelId, args.channelLogin ) diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerViewModel.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerViewModel.kt index 16c544d2a..f6fa31356 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerViewModel.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/channel/ChannelPagerViewModel.kt @@ -164,22 +164,21 @@ class ChannelPagerViewModel @Inject constructor( } } - fun isFollowingChannel(helixHeaders: Map, gqlHeaders: Map, accountId: String?, accountLogin: String?, setting: Int, channelId: String?, channelLogin: String?) { + fun isFollowingChannel(helixHeaders: Map, gqlHeaders: Map, setting: Int, userId: String?, channelId: String?, channelLogin: String?) { if (_isFollowing.value == null) { viewModelScope.launch { try { - if (setting == 0 && !gqlHeaders[C.HEADER_TOKEN].isNullOrBlank() && (!accountLogin.isNullOrBlank() && !channelLogin.isNullOrBlank() && accountLogin != channelLogin) || - (!helixHeaders[C.HEADER_CLIENT_ID].isNullOrBlank() && !helixHeaders[C.HEADER_TOKEN].isNullOrBlank() && !accountId.isNullOrBlank() && !channelId.isNullOrBlank() && accountId != channelId)) { - val response = repository.loadUserFollowing(helixHeaders, channelId, accountId, gqlHeaders, channelLogin) - _isFollowing.value = response.first - _notificationsEnabled.value = if (response.first && response.second != null) { - response.second + if (!channelId.isNullOrBlank()) { + if (setting == 0 && !gqlHeaders[C.HEADER_TOKEN].isNullOrBlank() && userId != channelId) { + val response = repository.loadUserFollowing(helixHeaders, channelId, userId, gqlHeaders, channelLogin) + _isFollowing.value = response.first + _notificationsEnabled.value = if (response.first && response.second != null) { + response.second + } else { + notificationUsersRepository.getByUserId(channelId) != null + } } else { - channelId?.let { notificationUsersRepository.getByUserId(it) != null } - } - } else { - channelId?.let { - _isFollowing.value = localFollowsChannel.getFollowByUserId(it) != null + _isFollowing.value = localFollowsChannel.getFollowByUserId(channelId) != null _notificationsEnabled.value = notificationUsersRepository.getByUserId(channelId) != null } } diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/PlayerViewModel.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/PlayerViewModel.kt index 0901a1645..426c3f654 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/PlayerViewModel.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/PlayerViewModel.kt @@ -41,17 +41,16 @@ abstract class PlayerViewModel( val isFollowing: StateFlow = _isFollowing val follow = MutableStateFlow?>(null) - fun isFollowingChannel(helixHeaders: Map, gqlHeaders: Map, accountId: String?, accountLogin: String?, setting: Int, channelId: String?, channelLogin: String?) { + fun isFollowingChannel(helixHeaders: Map, gqlHeaders: Map, setting: Int, userId: String?, channelId: String?, channelLogin: String?) { if (_isFollowing.value == null) { viewModelScope.launch { try { - if (setting == 0 && !gqlHeaders[C.HEADER_TOKEN].isNullOrBlank() && (!accountLogin.isNullOrBlank() && !channelLogin.isNullOrBlank() && accountLogin != channelLogin) || - (!helixHeaders[C.HEADER_CLIENT_ID].isNullOrBlank() && !helixHeaders[C.HEADER_TOKEN].isNullOrBlank() && !accountId.isNullOrBlank() && !channelId.isNullOrBlank() && accountId != channelId)) { - val response = repository.loadUserFollowing(helixHeaders, channelId, accountId, gqlHeaders, channelLogin) - _isFollowing.value = response.first - } else { - channelId?.let { - _isFollowing.value = localFollowsChannel.getFollowByUserId(it) != null + if (!channelId.isNullOrBlank()) { + if (setting == 0 && !gqlHeaders[C.HEADER_TOKEN].isNullOrBlank() && userId != channelId) { + val response = repository.loadUserFollowing(helixHeaders, channelId, userId, gqlHeaders, channelLogin) + _isFollowing.value = response.first + } else { + _isFollowing.value = localFollowsChannel.getFollowByUserId(channelId) != null } } } catch (e: Exception) { diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/clip/ClipPlayerFragment.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/clip/ClipPlayerFragment.kt index 54b3d62d7..3005d28f2 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/clip/ClipPlayerFragment.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/clip/ClipPlayerFragment.kt @@ -295,9 +295,8 @@ class ClipPlayerFragment : BasePlayerFragment(), HasDownloadDialog { viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), prefs.getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), item.channelId, item.channelLogin ) @@ -394,9 +393,8 @@ class ClipPlayerFragment : BasePlayerFragment(), HasDownloadDialog { viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), prefs.getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), item.channelId, item.channelLogin ) diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/stream/StreamPlayerFragment.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/stream/StreamPlayerFragment.kt index c7a0b3f6e..5c1cbbb6f 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/stream/StreamPlayerFragment.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/stream/StreamPlayerFragment.kt @@ -314,9 +314,8 @@ class StreamPlayerFragment : BasePlayerFragment(), HasDownloadDialog { viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), prefs.getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), item.channelId, item.channelLogin ) @@ -729,9 +728,8 @@ class StreamPlayerFragment : BasePlayerFragment(), HasDownloadDialog { viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), prefs.getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), item.channelId, item.channelLogin ) diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/video/VideoPlayerFragment.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/video/VideoPlayerFragment.kt index 249696ac9..d3ed0a7e0 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/video/VideoPlayerFragment.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/player/video/VideoPlayerFragment.kt @@ -308,9 +308,8 @@ class VideoPlayerFragment : BasePlayerFragment(), HasDownloadDialog, PlayerGames viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), prefs.getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), item.channelId, item.channelLogin ) @@ -488,9 +487,8 @@ class VideoPlayerFragment : BasePlayerFragment(), HasDownloadDialog, PlayerGames viewModel.isFollowingChannel( TwitchApiHelper.getHelixHeaders(requireContext()), TwitchApiHelper.getGQLHeaders(requireContext(), true), - requireContext().tokenPrefs().getString(C.USER_ID, null), - requireContext().tokenPrefs().getString(C.USERNAME, null), prefs.getString(C.UI_FOLLOW_BUTTON, "0")?.toIntOrNull() ?: 0, + requireContext().tokenPrefs().getString(C.USER_ID, null), item.channelId, item.channelLogin ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6e2f01d28..9445d509e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -activity = "1.9.3" -android-gradle-plugin = "8.7.3" +activity = "1.10.0" +android-gradle-plugin = "8.8.0" apollo = "4.1.0" appcompat = "1.7.0" coil = "3.0.4" @@ -14,7 +14,7 @@ draglistview = "1.7.3" fragment = "1.8.5" glide = "4.16.0" glide-webpdecoder = "2.6.4.16.0" -hilt = "2.54" +hilt = "2.55" hilt-extension-compiler = "1.2.0" hilt-work = "1.2.0" kotlin = "2.1.0" @@ -24,13 +24,13 @@ material = "1.12.0" media3 = "1.5.1" navigation = "2.8.5" okhttp = "5.0.0-alpha.14" -okio = "3.9.1" +okio = "3.10.2" paging = "3.3.5" preference = "1.2.1" -recyclerview = "1.3.2" +recyclerview = "1.4.0" retrofit = "2.11.0" room = "2.6.1" -serialization = "1.7.3" +serialization = "1.8.0" swiperefreshlayout = "1.1.0" viewpager2 = "1.1.0" webkit = "1.12.1" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e2847c820..cea7a793a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d6..f3b75f3b0 100644 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum