diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatFragment.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatFragment.kt index eac057ab4..01c061631 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatFragment.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatFragment.kt @@ -63,6 +63,7 @@ class ChatFragment : BaseNetworkFragment(), LifecycleListener, MessageClickedDia if (!requireContext().prefs().getBoolean(C.CHAT_DISABLE, false)) { val args = requireArguments() val channelId = args.getString(KEY_CHANNEL_ID) + val channelLogin = args.getString(KEY_CHANNEL_LOGIN) val isLive = args.getBoolean(KEY_IS_LIVE) val accountLogin = requireContext().tokenPrefs().getString(C.USERNAME, null) val isLoggedIn = !accountLogin.isNullOrBlank() && @@ -81,7 +82,6 @@ class ChatFragment : BaseNetworkFragment(), LifecycleListener, MessageClickedDia personalEmoteSets = viewModel.personalEmoteSets, personalEmoteSetUsers = viewModel.personalEmoteSetUsers ) - val channelLogin = args.getString(KEY_CHANNEL_LOGIN) val helixHeaders = TwitchApiHelper.getHelixHeaders(requireContext()) val gqlHeaders = TwitchApiHelper.getGQLHeaders(requireContext(), true) val accountId = requireContext().tokenPrefs().getString(C.USER_ID, null) @@ -302,7 +302,7 @@ class ChatFragment : BaseNetworkFragment(), LifecycleListener, MessageClickedDia viewModel.playbackMessage.collectLatest { if (it != null) { if (it.live != null) { - (parentFragment as? StreamPlayerFragment)?.updateLiveStatus(it.live, it.serverTime, args.getString(KEY_CHANNEL_LOGIN)) + (parentFragment as? StreamPlayerFragment)?.updateLiveStatus(it.live, it.serverTime, channelLogin) } (parentFragment as? StreamPlayerFragment)?.updateViewerCount(it.viewers) } @@ -379,7 +379,13 @@ class ChatFragment : BaseNetworkFragment(), LifecycleListener, MessageClickedDia } } if (chatUrl != null) { - initialize() + viewModel.startReplay( + channelId = channelId, + channelLogin = channelLogin, + chatUrl = chatUrl, + getCurrentPosition = (parentFragment as BasePlayerFragment)::getCurrentPosition, + getCurrentSpeed = (parentFragment as BasePlayerFragment)::getCurrentSpeed + ) } } } @@ -394,13 +400,11 @@ class ChatFragment : BaseNetworkFragment(), LifecycleListener, MessageClickedDia if (args.getBoolean(KEY_IS_LIVE)) { viewModel.startLive(channelId, channelLogin, args.getString(KEY_CHANNEL_NAME), args.getString(KEY_STREAM_ID)) } else { - val chatUrl = args.getString(KEY_CHAT_URL) val videoId = args.getString(KEY_VIDEO_ID) - if (chatUrl != null || (videoId != null && !args.getBoolean(KEY_START_TIME_EMPTY))) { + if (videoId != null && !args.getBoolean(KEY_START_TIME_EMPTY)) { viewModel.startReplay( channelId = channelId, channelLogin = channelLogin, - chatUrl = chatUrl, videoId = videoId, startTime = args.getInt(KEY_START_TIME), getCurrentPosition = (parentFragment as BasePlayerFragment)::getCurrentPosition, diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatReplayManagerLocal.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatReplayManagerLocal.kt index 8f9580d46..fc1fb189d 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatReplayManagerLocal.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatReplayManagerLocal.kt @@ -12,8 +12,6 @@ import javax.inject.Inject import kotlin.math.max class ChatReplayManagerLocal @Inject constructor( - private val messages: List, - private val startTime: Long, private val getCurrentPosition: () -> Long?, private val getCurrentSpeed: () -> Float?, private val onMessage: (ChatMessage) -> Unit, @@ -21,6 +19,8 @@ class ChatReplayManagerLocal @Inject constructor( private val coroutineScope: CoroutineScope, ) { + private var messages: List = emptyList() + private var startTime = 0L private val list = mutableListOf() private var isLoading = false private var loadJob: Job? = null @@ -28,7 +28,9 @@ class ChatReplayManagerLocal @Inject constructor( private var lastCheckedPosition = 0L private var playbackSpeed: Float? = null - fun start() { + fun start(newMessages: List, newStartTime: Long) { + messages = newMessages + startTime = newStartTime val currentPosition = getCurrentPosition() ?: 0 lastCheckedPosition = currentPosition playbackSpeed = getCurrentSpeed() diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatViewModel.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatViewModel.kt index 07bef77aa..a8140f5ac 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/ChatViewModel.kt @@ -166,7 +166,7 @@ class ChatViewModel @Inject constructor( } } - fun startReplay(channelId: String?, channelLogin: String?, chatUrl: String?, videoId: String?, startTime: Int, getCurrentPosition: () -> Long?, getCurrentSpeed: () -> Float?) { + fun startReplay(channelId: String?, channelLogin: String?, chatUrl: String? = null, videoId: String? = null, startTime: Int = 0, getCurrentPosition: () -> Long?, getCurrentSpeed: () -> Float?) { if (chatReplayManager == null && chatReplayManagerLocal == null) { messageLimit = applicationContext.prefs().getInt(C.CHAT_LIMIT, 600) startReplayChat(videoId, startTime, chatUrl, getCurrentPosition, getCurrentSpeed, channelId, channelLogin) @@ -1518,7 +1518,14 @@ class ChatViewModel @Inject constructor( fun startReplayChat(videoId: String?, startTime: Int, chatUrl: String?, getCurrentPosition: () -> Long?, getCurrentSpeed: () -> Float?, channelId: String?, channelLogin: String?) { stopReplayChat() if (!chatUrl.isNullOrBlank()) { - readChatFile(chatUrl, getCurrentPosition, getCurrentSpeed, channelId, channelLogin) + chatReplayManagerLocal = ChatReplayManagerLocal( + getCurrentPosition = getCurrentPosition, + getCurrentSpeed = getCurrentSpeed, + onMessage = { onMessage(it) }, + clearMessages = { _chatMessages.value = ArrayList() }, + coroutineScope = viewModelScope + ) + readChatFile(chatUrl, channelId, channelLogin) } else { if (!videoId.isNullOrBlank()) { chatReplayManager = ChatReplayManager( @@ -1549,7 +1556,7 @@ class ChatViewModel @Inject constructor( chatReplayManager?.updateSpeed(speed) ?: chatReplayManagerLocal?.updateSpeed(speed) } - private fun readChatFile(url: String, getCurrentPosition: () -> Long?, getCurrentSpeed: () -> Float?, channelId: String?, channelLogin: String?) { + private fun readChatFile(url: String, channelId: String?, channelLogin: String?) { viewModelScope.launch(Dispatchers.IO) { try { val nameDisplay = applicationContext.prefs().getString(C.UI_NAME_DISPLAY, "0") @@ -1930,15 +1937,7 @@ class ChatViewModel @Inject constructor( } if (messages.isNotEmpty()) { viewModelScope.launch { - chatReplayManagerLocal = ChatReplayManagerLocal( - messages = messages, - startTime = startTimeMs, - getCurrentPosition = getCurrentPosition, - getCurrentSpeed = getCurrentSpeed, - onMessage = { onMessage(it) }, - clearMessages = { _chatMessages.value = ArrayList() }, - coroutineScope = viewModelScope - ).apply { start() } + chatReplayManagerLocal?.start(messages, startTimeMs) } } } catch (e: Exception) { diff --git a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/MessageClickedDialog.kt b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/MessageClickedDialog.kt index fd9203df6..a0ace8d68 100644 --- a/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/MessageClickedDialog.kt +++ b/app/src/main/java/com/github/andreyasadchy/xtra/ui/chat/MessageClickedDialog.kt @@ -207,6 +207,10 @@ class MessageClickedDialog : BottomSheetDialogFragment(), IntegrityDialog.Callba } } } + viewProfile.setOnClickListener { + listener.onViewProfileClicked(selectedMessage.userId, selectedMessage.userLogin, selectedMessage.userName, null) + dismiss() + } } } }