Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

User now knows if no offline messages are saved when entering a conversation #4389

Merged
merged 2 commits into from
Dec 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
Expand Down Expand Up @@ -444,7 +445,7 @@ class ChatActivity :

this.lifecycleScope.launch {
delay(DELAY_TO_SHOW_PROGRESS_BAR)
if (adapter?.isEmpty == true) {
if (adapter?.isEmpty == true && networkMonitor.isOnline.first()) {
binding.progressBar.visibility = View.VISIBLE
}
}
Expand Down Expand Up @@ -939,6 +940,20 @@ class ChatActivity :
.collect()
}

this.lifecycleScope.launch {
chatViewModel.getGeneralUIFlow.onEach { key ->
when (key) {
NO_OFFLINE_MESSAGES_FOUND -> {
if (networkMonitor.isOnline.first().not()) {
binding.offline.root.visibility = View.VISIBLE
}
}

else -> {}
}
}.collect()
}

chatViewModel.reactionDeletedViewState.observe(this) { state ->
when (state) {
is ChatViewModel.ReactionDeletedSuccessState -> {
Expand Down Expand Up @@ -2810,14 +2825,10 @@ class ChatActivity :
message1.timestamp
)
val isLessThan5Min = timeDifference > FIVE_MINUTES_IN_SECONDS
if (isSameDayMessages(message2, message1) &&
return isSameDayMessages(message2, message1) &&
(message2.actorId == message1.actorId) &&
(!isLessThan5Min) &&
(message2.lastEditTimestamp == 0L || message1.lastEditTimestamp == 0L)
) {
return true
}
return false
}

private fun determinePreviousMessageIds(chatMessageList: List<ChatMessage>) {
Expand Down Expand Up @@ -3848,5 +3859,6 @@ class ChatActivity :
private const val DELAY_TO_SHOW_PROGRESS_BAR = 1000L
private const val FIVE_MINUTES_IN_SECONDS: Long = 300
const val CONVERSATION_INTERNAL_ID = "CONVERSATION_INTERNAL_ID"
const val NO_OFFLINE_MESSAGES_FOUND = "NO_OFFLINE_MESSAGES_FOUND"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,12 @@ interface ChatMessageRepository : LifecycleAwareManager {

val lastReadMessageFlow: Flow<Int>

/**
* Used for informing the user of the underlying processing behind offline support, [String] is the key
* which is handled in a switch statement in ChatActivity.
*/
val generalUIFlow: Flow<String>

fun setData(conversationModel: ConversationModel, credentials: String, urlForChatting: String)

fun loadInitialMessages(withNetworkParams: Bundle): Job
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ package com.nextcloud.talk.chat.data.network

import android.os.Bundle
import android.util.Log
import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.data.ChatMessageRepository
import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.data.database.dao.ChatBlocksDao
Expand Down Expand Up @@ -91,6 +92,11 @@ class OfflineFirstChatRepository @Inject constructor(
private val _lastReadMessageFlow:
MutableSharedFlow<Int> = MutableSharedFlow()

override val generalUIFlow: Flow<String>
get() = _generalUIFlow

private val _generalUIFlow: MutableSharedFlow<String> = MutableSharedFlow()

private var newXChatLastCommonRead: Int? = null
private var itIsPaused = false
private val scope = CoroutineScope(Dispatchers.IO)
Expand Down Expand Up @@ -133,6 +139,7 @@ class OfflineFirstChatRepository @Inject constructor(
} else {
if (!weAlreadyHaveSomeOfflineMessages) {
Log.d(TAG, "An online request for newest 100 messages is made because offline chat is empty")
_generalUIFlow.emit(ChatActivity.NO_OFFLINE_MESSAGES_FOUND)
} else {
Log.d(
TAG,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ class ChatViewModel @Inject constructor(
_getRoomViewState.value = GetRoomErrorState
}

val getGeneralUIFlow = chatRepository.generalUIFlow

sealed interface ViewState

object GetReminderStartState : ViewState
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/layout/activity_chat.xml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,12 @@
android:layout_height="0dp"
android:layout_weight="1">

<include
android:id="@+id/offline"
layout="@layout/no_saved_messages_view"
android:visibility="gone"
tools:visibility="visible" />

<include
android:id="@+id/lobby"
layout="@layout/lobby_view"
Expand Down
37 changes: 37 additions & 0 deletions app/src/main/res/layout/no_saved_messages_view.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Nextcloud Talk - Android Client
~
~ SPDX-FileCopyrightText: 2024 Julius Linus <[email protected]>
~ SPDX-License-Identifier: GPL-3.0-or-later
-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/offline_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/offline_image_view"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_above="@id/offline_text_view"
android:layout_centerHorizontal="true"
android:layout_margin="@dimen/margin_between_elements"
android:contentDescription="@string/nc_lobby"
android:src="@drawable/ic_signal_wifi_off_white_24dp"
app:tint="@color/grey_600" />

<TextView
android:id="@+id/offline_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="@dimen/standard_margin"
android:text="@string/no_offline_messages_saved"
android:textAlignment="center"
android:textColor="@color/grey_600"
android:textSize="16sp"
android:autoLink="web" />

</RelativeLayout>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -834,6 +834,7 @@ How to translate with transifex:
<string name="archived">Archived</string>
<string name="archive_hint">Once a conversation is archived, it will be hidden by default. Select the filter \"Archived\" to view archived conversations. Direct mentions will still be received.</string>
<string name="unarchive_hint">Once a conversation is unarchived, it will be shown by default again.</string>
<string name="no_offline_messages_saved">No offline messages saved</string>
<string name="previously_set">Previously set</string>
<string name="conversation_read_only_failed">Failed to set conversation Read-only</string>
<string name="status_reverted">Status Reverted</string>
Expand Down
Loading