diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 132123324..9b7b457ff 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -411,7 +411,7 @@ class ChatController(args: Bundle) : } private fun loadAvatarForStatusBar() { - if (inOneToOneCall() && activity != null && conversationVoiceCallMenuItem != null) { + if (inOneToOneCall() && activity != null) { val imageRequest = DisplayUtils.getImageRequestForUrl( ApiUtils.getUrlForAvatar( @@ -1159,35 +1159,56 @@ class ChatController(args: Bundle) : } private fun checkReadOnlyState() { - if (currentConversation != null && isAlive()) { - if (currentConversation?.shouldShowLobby(conversationUser) ?: false || - currentConversation?.conversationReadOnlyState != null && - currentConversation?.conversationReadOnlyState == - Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY - ) { - - conversationVoiceCallMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT - conversationVideoMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT + if (isAlive()) { + if (isReadOnlyConversation() || shouldShowLobby()) { + disableCallButtons() binding.messageInputView.visibility = View.GONE } else { - if (conversationVoiceCallMenuItem != null) { - conversationVoiceCallMenuItem?.icon?.alpha = FULLY_OPAQUE_INT - } - - if (conversationVideoMenuItem != null) { - conversationVideoMenuItem?.icon?.alpha = FULLY_OPAQUE_INT - } - - if (currentConversation != null && currentConversation!!.shouldShowLobby(conversationUser) - ) { - binding.messageInputView.visibility = View.GONE - } else { - binding.messageInputView.visibility = View.VISIBLE - } + enableCallButtons() + binding.messageInputView.visibility = View.VISIBLE } } } + private fun shouldShowLobby(): Boolean { + if (currentConversation != null) { + return currentConversation?.shouldShowLobby(conversationUser) == true + } + return false + } + + private fun disableCallButtons() { + if (CapabilitiesUtil.isAbleToCall(conversationUser)) { + if (conversationVoiceCallMenuItem != null && conversationVideoMenuItem != null) { + conversationVoiceCallMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT + conversationVideoMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT + conversationVoiceCallMenuItem?.isEnabled = false + conversationVideoMenuItem?.isEnabled = false + } else { + Log.e(TAG, "call buttons were null when trying to disable them") + } + } + } + + private fun enableCallButtons() { + if (CapabilitiesUtil.isAbleToCall(conversationUser)) { + if (conversationVoiceCallMenuItem != null && conversationVideoMenuItem != null) { + conversationVoiceCallMenuItem?.icon?.alpha = FULLY_OPAQUE_INT + conversationVideoMenuItem?.icon?.alpha = FULLY_OPAQUE_INT + conversationVoiceCallMenuItem?.isEnabled = true + conversationVideoMenuItem?.isEnabled = true + } else { + Log.e(TAG, "call buttons were null when trying to enable them") + } + } + } + + private fun isReadOnlyConversation(): Boolean { + return currentConversation?.conversationReadOnlyState != null && + currentConversation?.conversationReadOnlyState == + Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY + } + private fun checkLobbyState() { if (currentConversation != null && currentConversation?.isLobbyViewApplicable(conversationUser) ?: false && @@ -2300,14 +2321,11 @@ class ChatController(args: Bundle) : override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.menu_conversation, menu) + if (conversationUser?.userId == "?") { menu.removeItem(R.id.conversation_info) - conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call) - conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call) } else { conversationInfoMenuItem = menu.findItem(R.id.conversation_info) - conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call) - conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call) if (CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "rich-object-list-media")) { conversationSharedItemsItem = menu.findItem(R.id.shared_items) @@ -2317,6 +2335,14 @@ class ChatController(args: Bundle) : loadAvatarForStatusBar() } + + if (CapabilitiesUtil.isAbleToCall(conversationUser)) { + conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call) + conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call) + } else { + menu.removeItem(R.id.conversation_video_call) + menu.removeItem(R.id.conversation_voice_call) + } } override fun onPrepareOptionsMenu(menu: Menu) { @@ -2335,18 +2361,12 @@ class ChatController(args: Bundle) : return true } R.id.conversation_video_call -> { - if (conversationVideoMenuItem?.icon?.alpha == FULLY_OPAQUE_INT) { - startACall(false) - return true - } - return false + startACall(false) + return true } R.id.conversation_voice_call -> { - if (conversationVoiceCallMenuItem?.icon?.alpha == FULLY_OPAQUE_INT) { - startACall(true) - return true - } - return false + startACall(true) + return true } R.id.conversation_info -> { showConversationInfoScreen() diff --git a/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java b/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java index 1babff115..2e8703b4f 100644 --- a/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java +++ b/app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java @@ -40,7 +40,7 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities.getNotificationsCapability() != null && - capabilities.getNotificationsCapability().getFeatures() != null) { + capabilities.getNotificationsCapability().getFeatures() != null) { return capabilities.getSpreedCapability().getFeatures().contains(capabilityName); } } catch (IOException e) { @@ -55,7 +55,7 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities.getExternalCapability() != null && - capabilities.getExternalCapability().containsKey("v1")) { + capabilities.getExternalCapability().containsKey("v1")) { return capabilities.getExternalCapability().get("v1").contains(capabilityName); } } catch (IOException e) { @@ -84,7 +84,7 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities != null && capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getFeatures() != null) { + capabilities.getSpreedCapability().getFeatures() != null) { return capabilities.getSpreedCapability().getFeatures().contains(capabilityName); } } catch (IOException e) { @@ -99,13 +99,13 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities != null && - capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getConfig() != null && - capabilities.getSpreedCapability().getConfig().containsKey("chat")) { + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getConfig() != null && + capabilities.getSpreedCapability().getConfig().containsKey("chat")) { HashMap chatConfigHashMap = capabilities - .getSpreedCapability() - .getConfig() - .get("chat"); + .getSpreedCapability() + .getConfig() + .get("chat"); if (chatConfigHashMap != null && chatConfigHashMap.containsKey("max-length")) { int chatSize = Integer.parseInt(chatConfigHashMap.get("max-length")); if (chatSize > 0) { @@ -127,9 +127,9 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); return capabilities != null && - capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getFeatures() != null && - capabilities.getSpreedCapability().getFeatures().contains("phonebook-search"); + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getFeatures() != null && + capabilities.getSpreedCapability().getFeatures().contains("phonebook-search"); } catch (IOException e) { Log.e(TAG, "Failed to get capabilities for the user"); } @@ -142,9 +142,9 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities != null && - capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getConfig() != null && - capabilities.getSpreedCapability().getConfig().containsKey("chat")) { + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getConfig() != null && + capabilities.getSpreedCapability().getConfig().containsKey("chat")) { Map map = capabilities.getSpreedCapability().getConfig().get("chat"); return map != null && map.containsKey("read-privacy"); } @@ -160,9 +160,9 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities != null && - capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getConfig() != null && - capabilities.getSpreedCapability().getConfig().containsKey("chat")) { + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getConfig() != null && + capabilities.getSpreedCapability().getConfig().containsKey("chat")) { HashMap map = capabilities.getSpreedCapability().getConfig().get("chat"); if (map != null && map.containsKey("read-privacy")) { return Integer.parseInt(map.get("read-privacy")) == 1; @@ -196,9 +196,9 @@ public abstract class CapabilitiesUtil { try { Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); if (capabilities != null && - capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getConfig() != null && - capabilities.getSpreedCapability().getConfig().containsKey("attachments")) { + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getConfig() != null && + capabilities.getSpreedCapability().getConfig().containsKey("attachments")) { HashMap map = capabilities.getSpreedCapability().getConfig().get("attachments"); if (map != null && map.containsKey("folder")) { return map.get("folder"); @@ -233,9 +233,9 @@ public abstract class CapabilitiesUtil { try { capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); return (capabilities != null && - capabilities.getSpreedCapability() != null && - capabilities.getSpreedCapability().getFeatures() != null && - capabilities.getSpreedCapability().getFeatures().contains("temp-user-avatar-api")); + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getFeatures() != null && + capabilities.getSpreedCapability().getFeatures().contains("temp-user-avatar-api")); } catch (IOException e) { Log.e("User.java", "Failed to get server name", e); } @@ -249,13 +249,36 @@ public abstract class CapabilitiesUtil { try { capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); return (capabilities != null && - capabilities.getProvisioningCapability() != null && - capabilities.getProvisioningCapability().getAccountPropertyScopesVersion() != null && - capabilities.getProvisioningCapability().getAccountPropertyScopesVersion() > 1); + capabilities.getProvisioningCapability() != null && + capabilities.getProvisioningCapability().getAccountPropertyScopesVersion() != null && + capabilities.getProvisioningCapability().getAccountPropertyScopesVersion() > 1); } catch (IOException e) { Log.e("User.java", "Failed to get server name", e); } } return false; } + + public static boolean isAbleToCall(@Nullable UserEntity user) { + if (user != null && user.getCapabilities() != null) { + try { + Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class); + if (capabilities != null && + capabilities.getSpreedCapability() != null && + capabilities.getSpreedCapability().getConfig() != null && + capabilities.getSpreedCapability().getConfig().containsKey("call") && + capabilities.getSpreedCapability().getConfig().get("call") != null && + capabilities.getSpreedCapability().getConfig().get("call").containsKey("enabled")) { + return Boolean.parseBoolean( + capabilities.getSpreedCapability().getConfig().get("call").get("enabled")); + } else { + // older nextcloud versions without the capability can't disable the calls + return true; + } + } catch (IOException e) { + Log.e(TAG, "Failed to get capabilities for the user", e); + } + } + return false; + } }