diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index e697fb218..7d934430a 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -657,9 +657,7 @@ class ChatActivity : } } - is ChatViewModel.JoinRoomErrorState -> { - Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show() - } + is ChatViewModel.JoinRoomErrorState -> {} else -> {} } @@ -812,7 +810,6 @@ class ChatActivity : ) { adapter?.clear() adapter?.notifyDataSetChanged() - // TODO: remove messages from DB, Should be handled beforehand (in viewModel?) } if (lookIntoFuture) { diff --git a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt index 90fbc915d..a70b9bef6 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/MessageInputFragment.kt @@ -175,6 +175,8 @@ class MessageInputFragment : Fragment() { wasOnline = !binding.fragmentMessageInputView.isShown Log.d(TAG, "isOnline: $isOnline\nwasOnline: $wasOnline\nconnectionGained: $connectionGained") + // FIXME I think this might be called when remote server is null, because I joined when no internet + // thus room not joined. I would need to make sure that the room is joined before I send messages handleMessageQueue(isOnline) handleUI(isOnline, connectionGained) }.collect() diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt b/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt index 6cc87dc19..4790645da 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/network/OfflineFirstChatRepository.kt @@ -322,6 +322,7 @@ class OfflineFirstChatRepository @Inject constructor( val result = network.pullChatMessages(credentials, urlForChatting, fieldMap) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) + // .timeout(3, TimeUnit.SECONDS) .map { when (it.code()) { HTTP_CODE_OK -> { diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 8d9be6505..70d18f179 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt @@ -81,6 +81,7 @@ import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager import com.nextcloud.talk.chat.ChatActivity import com.nextcloud.talk.contacts.ContactsActivityCompose import com.nextcloud.talk.conversationlist.viewmodels.ConversationsListViewModel +import com.nextcloud.talk.data.network.NetworkMonitor import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ActivityConversationsBinding import com.nextcloud.talk.events.ConversationsListFetchDataEvent @@ -106,7 +107,6 @@ import com.nextcloud.talk.utils.BrandingUtils import com.nextcloud.talk.utils.CapabilitiesUtil.hasSpreedFeatureCapability import com.nextcloud.talk.utils.CapabilitiesUtil.isServerEOL import com.nextcloud.talk.utils.CapabilitiesUtil.isUnifiedSearchAvailable -import com.nextcloud.talk.utils.CapabilitiesUtil.isUserStatusAvailable import com.nextcloud.talk.utils.ClosedInterfaceImpl import com.nextcloud.talk.utils.ConversationUtils import com.nextcloud.talk.utils.FileUtils @@ -173,6 +173,9 @@ class ConversationsListActivity : @Inject lateinit var viewModelFactory: ViewModelProvider.Factory + @Inject + lateinit var networkMonitor: NetworkMonitor + lateinit var conversationsListViewModel: ConversationsListViewModel override val appBarLayoutType: AppBarLayoutType @@ -300,6 +303,12 @@ class ConversationsListActivity : } private fun initObservers() { + this.lifecycleScope.launch { + networkMonitor.isOnline.onEach { isOnline -> + showNetworkErrorDialog(!isOnline) + }.collect() + } + conversationsListViewModel.getFederationInvitationsViewState.observe(this) { state -> when (state) { is ConversationsListViewModel.GetFederationInvitationsStartState -> { @@ -315,7 +324,9 @@ class ConversationsListActivity : } is ConversationsListViewModel.GetFederationInvitationsErrorState -> { - Snackbar.make(binding.root, R.string.get_invitations_error, Snackbar.LENGTH_LONG).show() + if (isNetworkAvailable(context)) { + Snackbar.make(binding.root, R.string.get_invitations_error, Snackbar.LENGTH_LONG).show() + } } else -> {} @@ -731,72 +742,7 @@ class ConversationsListActivity : } fun fetchRooms() { - val includeStatus = isUserStatusAvailable(currentUser!!) conversationsListViewModel.getRooms() - - // checks internet connection before fetching rooms - if (isNetworkAvailable(context)) { - // Log.d(TAG, "Internet connection available") - // dispose(null) - // isRefreshing = true - // conversationItems = ArrayList() - // conversationItemsWithHeader = ArrayList() - // val apiVersion = ApiUtils.getConversationApiVersion( - // currentUser!!, - // intArrayOf(ApiUtils.API_V4, ApiUtils.API_V3, 1) - // ) - // val startNanoTime = System.nanoTime() - // Log.d(TAG, "fetchData - getRooms - calling: $startNanoTime") - // roomsQueryDisposable = ncApi.getRooms( - // credentials, - // ApiUtils.getUrlForRooms( - // apiVersion, - // currentUser!!.baseUrl - // ), - // includeStatus - // ) - // .subscribeOn(Schedulers.io()) - // .observeOn(AndroidSchedulers.mainThread()) - // .subscribe({ (ocs): RoomsOverall -> - // Log.d(TAG, "fetchData - getRooms - got response: $startNanoTime") - // - // // This is invoked asynchronously, when server returns a response the view might have been - // // unbound in the meantime. Check if the view is still there. - // // FIXME - does it make sense to update internal data structures even when view has been unbound? - // // if (view == null) { - // // Log.d(TAG, "fetchData - getRooms - view is not bound: $startNanoTime") - // // return@subscribe - // // } - // - // if (adapterWasNull) { - // adapterWasNull = false - // binding?.loadingContent?.visibility = View.GONE - // } - // initOverallLayout(ocs!!.data!!.isNotEmpty()) - // for (conversation in ocs.data!!) { - // addToConversationItems(conversation) - // } - // sortConversations(conversationItems) - // sortConversations(conversationItemsWithHeader) - // if (!filterState.containsValue(true)) filterableConversationItems = conversationItems - // filterConversation() - // adapter!!.updateDataSet(filterableConversationItems, false) - // Handler().postDelayed({ checkToShowUnreadBubble() }, UNREAD_BUBBLE_DELAY.toLong()) - // fetchOpenConversations(apiVersion) - // binding?.swipeRefreshLayoutView?.isRefreshing = false - // }, { throwable: Throwable -> - // handleHttpExceptions(throwable) - // binding?.swipeRefreshLayoutView?.isRefreshing = false - // dispose(roomsQueryDisposable) - // }) { - // dispose(roomsQueryDisposable) - // binding?.swipeRefreshLayoutView?.isRefreshing = false - // isRefreshing = false - // } - } else { - Log.d(TAG, "No internet connection detected") - showNetworkErrorDialog() - } } private fun fetchPendingInvitations() { @@ -902,31 +848,8 @@ class ConversationsListActivity : } } - private fun showNetworkErrorDialog() { - binding.floatingActionButton.let { - val dialogBuilder = MaterialAlertDialogBuilder(it.context) - .setIcon( - viewThemeUtils.dialog.colorMaterialAlertDialogIcon( - context, - R.drawable.ic_baseline_error_outline_24dp - ) - ) - .setTitle(R.string.nc_check_your_internet) - .setCancelable(false) - .setNegativeButton(R.string.close, null) - .setNeutralButton(R.string.nc_refresh) { _, _ -> - fetchRooms() - fetchPendingInvitations() - } - - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(it.context, dialogBuilder) - val dialog = dialogBuilder.show() - viewThemeUtils.platform.colorTextButtons( - dialog.getButton(AlertDialog.BUTTON_POSITIVE), - dialog.getButton(AlertDialog.BUTTON_NEGATIVE), - dialog.getButton(AlertDialog.BUTTON_NEUTRAL) - ) - } + private fun showNetworkErrorDialog(show: Boolean) { + binding.chatListConnectionLost.visibility = if (show) View.VISIBLE else View.GONE } @Suppress("ReturnCount") diff --git a/app/src/main/res/layout/activity_conversations.xml b/app/src/main/res/layout/activity_conversations.xml index 5ca990a91..bdf5880e1 100644 --- a/app/src/main/res/layout/activity_conversations.xml +++ b/app/src/main/res/layout/activity_conversations.xml @@ -26,6 +26,17 @@ app:liftOnScrollTargetViewId="@id/recycler_view" app:liftOnScrollColor="@color/bg_default"> + + Ban Show ban reason Error occurred when unbanning participant + Connection Lost