diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 9d9ebf819..11f8274eb 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 000000000..646137495 --- /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 000000000..4dc506515 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 000000000..77f9de5e3 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 000000000..ef45e933a 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 000000000..90ead2e45 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 000000000..b0e020573 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 0725a2fd2..c5a574279 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 ce15d0013..3eab0fecf 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 ef5dbbf0d..d91374ade 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 219fb6702..454f0ca6c 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