Selaa lähdekoodia

Merge pull request #1993 from nextcloud/feature/1883/disableCalls

disable call buttons if calls are disabled by capability
Marcel Hibbe 3 vuotta sitten
vanhempi
commit
8376f1fab2

+ 55 - 35
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -411,7 +411,7 @@ class ChatController(args: Bundle) :
     }
     }
 
 
     private fun loadAvatarForStatusBar() {
     private fun loadAvatarForStatusBar() {
-        if (inOneToOneCall() && activity != null && conversationVoiceCallMenuItem != null) {
+        if (inOneToOneCall() && activity != null) {
 
 
             val imageRequest = DisplayUtils.getImageRequestForUrl(
             val imageRequest = DisplayUtils.getImageRequestForUrl(
                 ApiUtils.getUrlForAvatar(
                 ApiUtils.getUrlForAvatar(
@@ -1159,35 +1159,56 @@ class ChatController(args: Bundle) :
     }
     }
 
 
     private fun checkReadOnlyState() {
     private fun checkReadOnlyState() {
-        if (currentConversation != null && isAlive()) {
-            if (currentConversation?.shouldShowLobby(conversationUser) ?: false ||
-                currentConversation?.conversationReadOnlyState != null &&
-                currentConversation?.conversationReadOnlyState ==
-                Conversation.ConversationReadOnlyState.CONVERSATION_READ_ONLY
-            ) {
+        if (isAlive()) {
+            if (isReadOnlyConversation() || shouldShowLobby()) {
+                disableCallButtons()
+                binding.messageInputView.visibility = View.GONE
+            } else {
+                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
                 conversationVoiceCallMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT
                 conversationVideoMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT
                 conversationVideoMenuItem?.icon?.alpha = SEMI_TRANSPARENT_INT
-                binding.messageInputView.visibility = View.GONE
+                conversationVoiceCallMenuItem?.isEnabled = false
+                conversationVideoMenuItem?.isEnabled = false
             } else {
             } else {
-                if (conversationVoiceCallMenuItem != null) {
-                    conversationVoiceCallMenuItem?.icon?.alpha = FULLY_OPAQUE_INT
-                }
-
-                if (conversationVideoMenuItem != null) {
-                    conversationVideoMenuItem?.icon?.alpha = FULLY_OPAQUE_INT
-                }
+                Log.e(TAG, "call buttons were null when trying to disable them")
+            }
+        }
+    }
 
 
-                if (currentConversation != null && currentConversation!!.shouldShowLobby(conversationUser)
-                ) {
-                    binding.messageInputView.visibility = View.GONE
-                } else {
-                    binding.messageInputView.visibility = View.VISIBLE
-                }
+    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() {
     private fun checkLobbyState() {
         if (currentConversation != null &&
         if (currentConversation != null &&
             currentConversation?.isLobbyViewApplicable(conversationUser) ?: false &&
             currentConversation?.isLobbyViewApplicable(conversationUser) ?: false &&
@@ -2300,14 +2321,11 @@ class ChatController(args: Bundle) :
     override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
     override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
         super.onCreateOptionsMenu(menu, inflater)
         super.onCreateOptionsMenu(menu, inflater)
         inflater.inflate(R.menu.menu_conversation, menu)
         inflater.inflate(R.menu.menu_conversation, menu)
+
         if (conversationUser?.userId == "?") {
         if (conversationUser?.userId == "?") {
             menu.removeItem(R.id.conversation_info)
             menu.removeItem(R.id.conversation_info)
-            conversationVoiceCallMenuItem = menu.findItem(R.id.conversation_voice_call)
-            conversationVideoMenuItem = menu.findItem(R.id.conversation_video_call)
         } else {
         } else {
             conversationInfoMenuItem = menu.findItem(R.id.conversation_info)
             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")) {
             if (CapabilitiesUtil.hasSpreedFeatureCapability(conversationUser, "rich-object-list-media")) {
                 conversationSharedItemsItem = menu.findItem(R.id.shared_items)
                 conversationSharedItemsItem = menu.findItem(R.id.shared_items)
@@ -2317,6 +2335,14 @@ class ChatController(args: Bundle) :
 
 
             loadAvatarForStatusBar()
             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) {
     override fun onPrepareOptionsMenu(menu: Menu) {
@@ -2335,18 +2361,12 @@ class ChatController(args: Bundle) :
                 return true
                 return true
             }
             }
             R.id.conversation_video_call -> {
             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 -> {
             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 -> {
             R.id.conversation_info -> {
                 showConversationInfoScreen()
                 showConversationInfoScreen()

+ 50 - 27
app/src/main/java/com/nextcloud/talk/models/database/CapabilitiesUtil.java

@@ -40,7 +40,7 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities.getNotificationsCapability() != null &&
                 if (capabilities.getNotificationsCapability() != null &&
-                        capabilities.getNotificationsCapability().getFeatures() != null) {
+                    capabilities.getNotificationsCapability().getFeatures() != null) {
                     return capabilities.getSpreedCapability().getFeatures().contains(capabilityName);
                     return capabilities.getSpreedCapability().getFeatures().contains(capabilityName);
                 }
                 }
             } catch (IOException e) {
             } catch (IOException e) {
@@ -55,7 +55,7 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities.getExternalCapability() != null &&
                 if (capabilities.getExternalCapability() != null &&
-                        capabilities.getExternalCapability().containsKey("v1")) {
+                    capabilities.getExternalCapability().containsKey("v1")) {
                     return capabilities.getExternalCapability().get("v1").contains(capabilityName);
                     return capabilities.getExternalCapability().get("v1").contains(capabilityName);
                 }
                 }
             } catch (IOException e) {
             } catch (IOException e) {
@@ -84,7 +84,7 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities != null && capabilities.getSpreedCapability() != null &&
                 if (capabilities != null && capabilities.getSpreedCapability() != null &&
-                        capabilities.getSpreedCapability().getFeatures() != null) {
+                    capabilities.getSpreedCapability().getFeatures() != null) {
                     return capabilities.getSpreedCapability().getFeatures().contains(capabilityName);
                     return capabilities.getSpreedCapability().getFeatures().contains(capabilityName);
                 }
                 }
             } catch (IOException e) {
             } catch (IOException e) {
@@ -99,13 +99,13 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities != null &&
                 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<String, String> chatConfigHashMap = capabilities
                     HashMap<String, String> chatConfigHashMap = capabilities
-                            .getSpreedCapability()
-                            .getConfig()
-                            .get("chat");
+                        .getSpreedCapability()
+                        .getConfig()
+                        .get("chat");
                     if (chatConfigHashMap != null && chatConfigHashMap.containsKey("max-length")) {
                     if (chatConfigHashMap != null && chatConfigHashMap.containsKey("max-length")) {
                         int chatSize = Integer.parseInt(chatConfigHashMap.get("max-length"));
                         int chatSize = Integer.parseInt(chatConfigHashMap.get("max-length"));
                         if (chatSize > 0) {
                         if (chatSize > 0) {
@@ -127,9 +127,9 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 return capabilities != null &&
                 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) {
             } catch (IOException e) {
                 Log.e(TAG, "Failed to get capabilities for the user");
                 Log.e(TAG, "Failed to get capabilities for the user");
             }
             }
@@ -142,9 +142,9 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities != null &&
                 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<String, String> map = capabilities.getSpreedCapability().getConfig().get("chat");
                     Map<String, String> map = capabilities.getSpreedCapability().getConfig().get("chat");
                     return map != null && map.containsKey("read-privacy");
                     return map != null && map.containsKey("read-privacy");
                 }
                 }
@@ -160,9 +160,9 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities != null &&
                 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<String, String> map = capabilities.getSpreedCapability().getConfig().get("chat");
                     HashMap<String, String> map = capabilities.getSpreedCapability().getConfig().get("chat");
                     if (map != null && map.containsKey("read-privacy")) {
                     if (map != null && map.containsKey("read-privacy")) {
                         return Integer.parseInt(map.get("read-privacy")) == 1;
                         return Integer.parseInt(map.get("read-privacy")) == 1;
@@ -196,9 +196,9 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 Capabilities capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 if (capabilities != null &&
                 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<String, String> map = capabilities.getSpreedCapability().getConfig().get("attachments");
                     HashMap<String, String> map = capabilities.getSpreedCapability().getConfig().get("attachments");
                     if (map != null && map.containsKey("folder")) {
                     if (map != null && map.containsKey("folder")) {
                         return map.get("folder");
                         return map.get("folder");
@@ -233,9 +233,9 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 return (capabilities != null &&
                 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) {
             } catch (IOException e) {
                 Log.e("User.java", "Failed to get server name", e);
                 Log.e("User.java", "Failed to get server name", e);
             }
             }
@@ -249,13 +249,36 @@ public abstract class CapabilitiesUtil {
             try {
             try {
                 capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 capabilities = LoganSquare.parse(user.getCapabilities(), Capabilities.class);
                 return (capabilities != null &&
                 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) {
             } catch (IOException e) {
                 Log.e("User.java", "Failed to get server name", e);
                 Log.e("User.java", "Failed to get server name", e);
             }
             }
         }
         }
         return false;
         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;
+    }
 }
 }