Disabling features when not connected to internet

Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
This commit is contained in:
rapterjet2004 2024-11-04 09:16:41 -06:00 committed by Marcel Hibbe
parent 73228bdad9
commit 8e7515238a
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
5 changed files with 124 additions and 66 deletions

View File

@ -114,6 +114,7 @@ import com.nextcloud.talk.chat.viewmodels.ChatViewModel
import com.nextcloud.talk.chat.viewmodels.MessageInputViewModel import com.nextcloud.talk.chat.viewmodels.MessageInputViewModel
import com.nextcloud.talk.conversationinfo.ConversationInfoActivity import com.nextcloud.talk.conversationinfo.ConversationInfoActivity
import com.nextcloud.talk.conversationlist.ConversationsListActivity import com.nextcloud.talk.conversationlist.ConversationsListActivity
import com.nextcloud.talk.data.network.NetworkMonitor
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ActivityChatBinding import com.nextcloud.talk.databinding.ActivityChatBinding
import com.nextcloud.talk.events.UserMentionClickEvent import com.nextcloud.talk.events.UserMentionClickEvent
@ -238,6 +239,9 @@ class ChatActivity :
@Inject @Inject
lateinit var viewModelFactory: ViewModelProvider.Factory lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject
lateinit var networkMonitor: NetworkMonitor
lateinit var chatViewModel: ChatViewModel lateinit var chatViewModel: ChatViewModel
lateinit var messageInputViewModel: MessageInputViewModel lateinit var messageInputViewModel: MessageInputViewModel
@ -2929,6 +2933,14 @@ class ChatActivity :
conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call) conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call)
conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call) conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call)
this.lifecycleScope.launch {
networkMonitor.isOnline.onEach { isOnline ->
conversationVoiceCallMenuItem?.isVisible = isOnline
searchItem?.isVisible = isOnline
conversationVideoMenuItem?.isVisible = isOnline
}.collect()
}
if (CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SILENT_CALL)) { if (CapabilitiesUtil.hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.SILENT_CALL)) {
Handler().post { Handler().post {
findViewById<View?>(R.id.conversation_voice_call)?.setOnLongClickListener { findViewById<View?>(R.id.conversation_voice_call)?.setOnLongClickListener {

View File

@ -230,17 +230,15 @@ class MessageInputFragment : Fragment() {
}) })
} }
binding.fragmentMessageInputView.attachmentButton.isEnabled = true binding.fragmentMessageInputView.attachmentButton.visibility = View.VISIBLE
binding.fragmentMessageInputView.recordAudioButton.isEnabled = true binding.fragmentMessageInputView.recordAudioButton.visibility = View.VISIBLE
binding.fragmentMessageInputView.messageInput.isEnabled = true
} else { } else {
binding.fragmentMessageInputView.attachmentButton.visibility = View.INVISIBLE
binding.fragmentMessageInputView.recordAudioButton.visibility = View.INVISIBLE
binding.fragmentConnectionLost.clearAnimation() binding.fragmentConnectionLost.clearAnimation()
binding.fragmentConnectionLost.visibility = View.GONE binding.fragmentConnectionLost.visibility = View.GONE
binding.fragmentConnectionLost.setBackgroundColor(resources.getColor(R.color.hwSecurityRed)) binding.fragmentConnectionLost.setBackgroundColor(resources.getColor(R.color.hwSecurityRed))
// binding.fragmentConnectionLost.text = getString(R.string.connection_lost_sent_messages_are_queued)
binding.fragmentConnectionLost.visibility = View.VISIBLE binding.fragmentConnectionLost.visibility = View.VISIBLE
binding.fragmentMessageInputView.attachmentButton.isEnabled = false
binding.fragmentMessageInputView.recordAudioButton.isEnabled = false
} }
} }

View File

@ -21,8 +21,6 @@ import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
@ -43,6 +41,7 @@ import androidx.annotation.OptIn
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat import androidx.core.view.MenuItemCompat
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@ -136,6 +135,7 @@ import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import io.reactivex.subjects.BehaviorSubject import io.reactivex.subjects.BehaviorSubject
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.apache.commons.lang3.builder.CompareToBuilder import org.apache.commons.lang3.builder.CompareToBuilder
@ -307,6 +307,7 @@ class ConversationsListActivity :
this.lifecycleScope.launch { this.lifecycleScope.launch {
networkMonitor.isOnline.onEach { isOnline -> networkMonitor.isOnline.onEach { isOnline ->
showNetworkErrorDialog(!isOnline) showNetworkErrorDialog(!isOnline)
handleUI(isOnline)
}.collect() }.collect()
} }
@ -891,15 +892,10 @@ class ConversationsListActivity :
binding.chatListConnectionLost.visibility = if (show) View.VISIBLE else View.GONE binding.chatListConnectionLost.visibility = if (show) View.VISIBLE else View.GONE
} }
@Suppress("ReturnCount") private fun handleUI(show: Boolean) {
private fun isNetworkAvailable(context: Context): Boolean { binding.floatingActionButton.isEnabled = show
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager binding.searchText.isEnabled = show
val network = connectivityManager.activeNetwork ?: return false binding.searchText.isVisible = show
val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
} }
private fun sortConversations(conversationItems: MutableList<AbstractFlexibleItem<*>>) { private fun sortConversations(conversationItems: MutableList<AbstractFlexibleItem<*>>) {
@ -1345,14 +1341,15 @@ class ConversationsListActivity :
} }
override fun onItemLongClick(position: Int) { override fun onItemLongClick(position: Int) {
if (showShareToScreen) { this.lifecycleScope.launch {
if (showShareToScreen || !networkMonitor.isOnline.first()) {
Log.d(TAG, "sharing to multiple rooms not yet implemented. onItemLongClick is ignored.") Log.d(TAG, "sharing to multiple rooms not yet implemented. onItemLongClick is ignored.")
} else { } else {
val clickedItem: Any? = adapter!!.getItem(position) val clickedItem: Any? = adapter!!.getItem(position)
if (clickedItem != null && clickedItem is ConversationItem) { if (clickedItem != null && clickedItem is ConversationItem) {
val conversation = clickedItem.model val conversation = clickedItem.model
conversationsListBottomDialog = ConversationsListBottomDialog( conversationsListBottomDialog = ConversationsListBottomDialog(
this, this@ConversationsListActivity,
userManager.currentUser.blockingGet(), userManager.currentUser.blockingGet(),
conversation conversation
) )
@ -1360,6 +1357,7 @@ class ConversationsListActivity :
} }
} }
} }
}
@Suppress("Detekt.TooGenericExceptionCaught") @Suppress("Detekt.TooGenericExceptionCaught")
private fun collectDataFromIntent() { private fun collectDataFromIntent() {

View File

@ -10,7 +10,11 @@ package com.nextcloud.talk.ui.dialog;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
@ -261,6 +265,29 @@ public class ChooseAccountDialogFragment extends DialogFragment {
viewThemeUtils.dialog.colorDialogMenuText(binding.manageSettings); viewThemeUtils.dialog.colorDialogMenuText(binding.manageSettings);
} }
// Would have preferred to use NetworkMonitor but java with kotlin flows is ugly
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
}
Network network = connectivityManager.getActiveNetwork();
if (network == null) {
return false;
}
NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
if (capabilities == null) {
return false;
}
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) ||
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
}
private void loadCurrentStatus(User user) { private void loadCurrentStatus(User user) {
String credentials = ApiUtils.getCredentials(user.getUsername(), user.getToken()); String credentials = ApiUtils.getCredentials(user.getUsername(), user.getToken());
@ -316,6 +343,10 @@ public class ChooseAccountDialogFragment extends DialogFragment {
} }
binding.accountsList.setHasFixedSize(true); binding.accountsList.setHasFixedSize(true);
binding.accountsList.setAdapter(adapter); binding.accountsList.setAdapter(adapter);
if (!isNetworkAvailable(getContext())) {
binding.addAccount.setVisibility(View.GONE);
}
} }
public static ChooseAccountDialogFragment newInstance() { public static ChooseAccountDialogFragment newInstance() {

View File

@ -17,6 +17,7 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.lifecycle.lifecycleScope
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialog
@ -25,6 +26,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.chat.ChatActivity
import com.nextcloud.talk.chat.data.model.ChatMessage import com.nextcloud.talk.chat.data.model.ChatMessage
import com.nextcloud.talk.chat.viewmodels.ChatViewModel import com.nextcloud.talk.chat.viewmodels.ChatViewModel
import com.nextcloud.talk.data.network.NetworkMonitor
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.DialogMessageActionsBinding import com.nextcloud.talk.databinding.DialogMessageActionsBinding
import com.nextcloud.talk.models.domain.ConversationModel import com.nextcloud.talk.models.domain.ConversationModel
@ -49,6 +51,8 @@ import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import java.util.Date import java.util.Date
import javax.inject.Inject import javax.inject.Inject
@ -72,6 +76,9 @@ class MessageActionsDialog(
@Inject @Inject
lateinit var dateUtils: DateUtils lateinit var dateUtils: DateUtils
@Inject
lateinit var networkMonitor: NetworkMonitor
private lateinit var dialogMessageActionsBinding: DialogMessageActionsBinding private lateinit var dialogMessageActionsBinding: DialogMessageActionsBinding
private lateinit var popup: EmojiPopup private lateinit var popup: EmojiPopup
@ -122,12 +129,16 @@ class MessageActionsDialog(
) )
chatActivity.chatViewModel.getNoteToSelfAvailability.observe(this) { state -> chatActivity.chatViewModel.getNoteToSelfAvailability.observe(this) { state ->
when (state) { when (state) {
is ChatViewModel.NoteToSelfAvailableState -> { is ChatViewModel.NoteToSelfAvaliableState -> {
this.lifecycleScope.launch {
initMenuAddToNote( initMenuAddToNote(
!message.isDeleted && !ConversationUtils.isNoteToSelfConversation(currentConversation), !message.isDeleted &&
!ConversationUtils.isNoteToSelfConversation(currentConversation) &&
networkMonitor.isOnline.first(),
state.roomToken state.roomToken
) )
} }
}
else -> { else -> {
initMenuAddToNote( initMenuAddToNote(
false false
@ -136,10 +147,12 @@ class MessageActionsDialog(
} }
} }
this.lifecycleScope.launch {
initMenuItemTranslate( initMenuItemTranslate(
!message.isDeleted && !message.isDeleted &&
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() && ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
CapabilitiesUtil.isTranslationsSupported(spreedCapabilities) CapabilitiesUtil.isTranslationsSupported(spreedCapabilities) &&
networkMonitor.isOnline.first()
) )
initMenuEditorDetails(message.lastEditTimestamp!! != 0L && !message.isDeleted) initMenuEditorDetails(message.lastEditTimestamp!! != 0L && !message.isDeleted)
initMenuReplyToMessage(message.replyable && hasChatPermission) initMenuReplyToMessage(message.replyable && hasChatPermission)
@ -147,29 +160,35 @@ class MessageActionsDialog(
message.replyable && message.replyable &&
hasUserId(user) && hasUserId(user) &&
hasUserActorId(message) && hasUserActorId(message) &&
currentConversation?.type != ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL currentConversation?.type != ConversationEnums.ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL &&
networkMonitor.isOnline.first()
) )
initMenuEditMessage(isMessageEditable) initMenuEditMessage(isMessageEditable)
initMenuDeleteMessage(showMessageDeletionButton) initMenuDeleteMessage(showMessageDeletionButton && networkMonitor.isOnline.first())
initMenuForwardMessage( initMenuForwardMessage(
ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() && ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
!(message.isDeletedCommentMessage || message.isDeleted) !(message.isDeletedCommentMessage || message.isDeleted) &&
networkMonitor.isOnline.first()
) )
initMenuRemindMessage( initMenuRemindMessage(
!message.isDeleted && !message.isDeleted &&
hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.REMIND_ME_LATER) && hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures.REMIND_ME_LATER) &&
currentConversation!!.remoteServer.isNullOrEmpty() currentConversation!!.remoteServer.isNullOrEmpty() &&
networkMonitor.isOnline.first()
) )
initMenuMarkAsUnread( initMenuMarkAsUnread(
message.previousMessageId > NO_PREVIOUS_MESSAGE_ID && message.previousMessageId > NO_PREVIOUS_MESSAGE_ID &&
ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType() ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType() &&
networkMonitor.isOnline.first()
) )
initMenuShare(messageHasFileAttachment || messageHasRegularText) initMenuShare(messageHasFileAttachment || messageHasRegularText && networkMonitor.isOnline.first())
initMenuItemOpenNcApp( initMenuItemOpenNcApp(
ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == message.getCalculateMessageType() ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE == message.getCalculateMessageType() &&
networkMonitor.isOnline.first()
) )
initMenuItemSave(message.getCalculateMessageType() == ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE) initMenuItemSave(message.getCalculateMessageType() == ChatMessage.MessageType.SINGLE_NC_ATTACHMENT_MESSAGE)
} }
}
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()