Skip to content

Commit

Permalink
Merge pull request #4389 from nextcloud/issue-4377-show-no-msg-saved
Browse files Browse the repository at this point in the history
User now knows if no offline messages are saved when entering a conversation
  • Loading branch information
mahibi authored Dec 3, 2024
2 parents 3bca62d + a0d6442 commit ff74202
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 6 deletions.
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 <juliuslinus1@gmail.com>
~ 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

0 comments on commit ff74202

Please sign in to comment.