diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 9d9ebf81912f481b91a477da1be0d9f0acf48508..11f8274eb199cc36d4bac1eb8a87cf156cdaeb0a 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -116,6 +116,7 @@ import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.chatstate.ChatState; import eu.siacs.conversations.xmpp.jingle.JingleFileTransferConnection; +import eu.siacs.conversations.xmpp.jingle.RtpCapability; import rocks.xmpp.addr.Jid; import static eu.siacs.conversations.ui.XmppActivity.EXTRA_ACCOUNT; @@ -950,6 +951,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke final MenuItem menuInviteContact = menu.findItem(R.id.action_invite); final MenuItem menuMute = menu.findItem(R.id.action_mute); final MenuItem menuUnmute = menu.findItem(R.id.action_unmute); + final MenuItem menuCall = menu.findItem(R.id.action_call); if (conversation != null) { @@ -957,7 +959,9 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke menuContactDetails.setVisible(false); menuInviteContact.setVisible(conversation.getMucOptions().canInvite()); menuMucDetails.setTitle(conversation.getMucOptions().isPrivateAndNonAnonymous() ? R.string.action_muc_details : R.string.channel_details); + menuCall.setVisible(false); } else { + menuCall.setVisible(RtpCapability.check(conversation.getContact()) != RtpCapability.Capability.NONE); menuContactDetails.setVisible(!this.conversation.withSelf()); menuMucDetails.setVisible(false); final XmppConnectionService service = activity.xmppConnectionService; diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java new file mode 100644 index 0000000000000000000000000000000000000000..646137495bca5dd2e39516d1499c30a6e8da3b4d --- /dev/null +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/RtpCapability.java @@ -0,0 +1,58 @@ +package eu.siacs.conversations.xmpp.jingle; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import eu.siacs.conversations.entities.Contact; +import eu.siacs.conversations.entities.Presence; +import eu.siacs.conversations.entities.Presences; +import eu.siacs.conversations.entities.ServiceDiscoveryResult; +import eu.siacs.conversations.xml.Namespace; + +public class RtpCapability { + + private static List BASIC_RTP_REQUIREMENTS = Arrays.asList( + Namespace.JINGLE, + Namespace.JINGLE_TRANSPORT_ICE_UDP, + Namespace.JINGLE_APPS_RTP, + Namespace.JINGLE_APPS_DTLS + ); + private static List VIDEO_REQUIREMENTS = Arrays.asList( + Namespace.JINGLE_FEATURE_AUDIO, + Namespace.JINGLE_FEATURE_VIDEO + ); + + public static Capability check(final Presence presence) { + final ServiceDiscoveryResult disco = presence.getServiceDiscoveryResult(); + final List features = disco == null ? Collections.emptyList() : disco.getFeatures(); + if (features.containsAll(BASIC_RTP_REQUIREMENTS)) { + if (features.containsAll(VIDEO_REQUIREMENTS)) { + return Capability.VIDEO; + } + if (features.contains(Namespace.JINGLE_FEATURE_AUDIO)) { + return Capability.AUDIO; + } + } + return Capability.NONE; + } + + public static Capability check(final Contact contact) { + final Presences presences = contact.getPresences(); + Capability result = Capability.NONE; + for(Presence presence : presences.getPresences().values()) { + Capability capability = check(presence); + if (capability == Capability.VIDEO) { + result = capability; + } else if (capability == Capability.AUDIO && result == Capability.NONE) { + result = capability; + } + } + return result; + } + + public enum Capability { + NONE, AUDIO, VIDEO + } + +} diff --git a/src/main/res/drawable-hdpi/ic_call_white_24dp.png b/src/main/res/drawable-hdpi/ic_call_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc5065155baeba719d76845d4398431c289cde0 Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_call_white_24dp.png differ diff --git a/src/main/res/drawable-mdpi/ic_call_white_24dp.png b/src/main/res/drawable-mdpi/ic_call_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..77f9de5e3ccb30fb6e580454412c98e2f6c553c1 Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_call_white_24dp.png differ diff --git a/src/main/res/drawable-xhdpi/ic_call_white_24dp.png b/src/main/res/drawable-xhdpi/ic_call_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ef45e933a99b720cc5f6127e6da22bc2fa679244 Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_call_white_24dp.png differ diff --git a/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png b/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..90ead2e4551b165530bd2430b3d69c34263c5c4e Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_call_white_24dp.png differ diff --git a/src/main/res/drawable-xxxhdpi/ic_call_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_call_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e020573d37e8b4acac23fcd3e01cc39531b5e4 Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_call_white_24dp.png differ diff --git a/src/main/res/menu/fragment_conversation.xml b/src/main/res/menu/fragment_conversation.xml index 0725a2fd293d88aab82fb5f49a3ff9d097299b0c..c5a5742793901b591ca284a491ff342cedc63a98 100644 --- a/src/main/res/menu/fragment_conversation.xml +++ b/src/main/res/menu/fragment_conversation.xml @@ -1,23 +1,23 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:title="@string/action_secure" + app:showAsAction="always"> - + + android:title="@string/encryption_choice_unencrypted" /> + android:title="@string/encryption_choice_omemo" /> + android:title="@string/encryption_choice_pgp" /> @@ -25,76 +25,82 @@ android:id="@+id/action_attach_file" android:icon="?attr/icon_new_attachment" android:orderInCategory="30" - app:showAsAction="always" - android:title="@string/attach_file"> + android:title="@string/attach_file" + app:showAsAction="always"> + android:icon="?attr/ic_attach_document" + android:title="@string/choose_file" /> + android:icon="?attr/ic_attach_photo" + android:title="@string/attach_choose_picture" /> + android:icon="?attr/ic_attach_camera" + android:title="@string/attach_take_picture" /> + android:icon="?attr/ic_attach_videocam" + android:title="@string/attach_record_video" /> + android:icon="?attr/ic_attach_record" + android:title="@string/attach_record_voice" /> + android:icon="?attr/ic_attach_location" + android:title="@string/send_location" /> + + android:title="@string/action_contact_details" + app:showAsAction="never" /> + android:title="@string/action_muc_details" + app:showAsAction="never" /> + android:title="@string/invite_contact" + app:showAsAction="never" /> + android:title="@string/action_clear_history" + app:showAsAction="never" /> + android:title="@string/action_end_conversation" + app:showAsAction="never" /> + android:title="@string/disable_notifications" + app:showAsAction="never" /> + android:title="@string/enable_notifications" + app:showAsAction="never" /> \ No newline at end of file diff --git a/src/main/res/values/attrs.xml b/src/main/res/values/attrs.xml index ce15d00134b3a46739cd6458efbbf4cff22e38da..3eab0fecf772ed098ee73c45021aded039f3c097 100644 --- a/src/main/res/values/attrs.xml +++ b/src/main/res/values/attrs.xml @@ -85,6 +85,7 @@ + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index ef5dbbf0d2b04ba40affc6ed0bc8f43c9c6cd221..d91374ade1ec73bc6a6e9b10348d5a8a2cd070f3 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -884,6 +884,7 @@ Backup About Please enable an account + Make call View %1$d Participant View %1$d Participants diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml index 219fb6702e47437df529340dc7767b2070224e4c..454f0ca6cf79c1919632ae0b0914e00265a6f0a6 100644 --- a/src/main/res/values/themes.xml +++ b/src/main/res/values/themes.xml @@ -93,6 +93,7 @@ @drawable/ic_refresh_black_24dp @drawable/ic_attach_file_white_24dp @drawable/ic_lock_open_white_24dp + @drawable/ic_call_white_24dp @drawable/ic_delete_black_24dp @drawable/ic_search_white_24dp @drawable/ic_lock_open_white_24dp @@ -207,6 +208,7 @@ @drawable/ic_refresh_white_24dp @drawable/ic_attach_file_white_24dp @drawable/ic_lock_open_white_24dp + @drawable/ic_call_white_24dp @drawable/ic_delete_white_24dp @drawable/ic_search_white_24dp @drawable/ic_lock_open_white_24dp