show warning if contact doesnt support calls

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java | 27 +
src/main/res/drawable/ic_warning_48dp.xml                       |  5 
src/main/res/layout/activity_rtp_session.xml                    | 35 +++
src/main/res/values-land/bools.xml                              |  2 
src/main/res/values/bools.xml                                   |  2 
src/main/res/values/strings.xml                                 |  1 
6 files changed, 65 insertions(+), 7 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java πŸ”—

@@ -533,15 +533,17 @@ public class RtpSessionActivity extends XmppActivity
             final String extraLastState = intent.getStringExtra(EXTRA_LAST_REPORTED_STATE);
             final RtpEndUserState state =
                     extraLastState == null ? null : RtpEndUserState.valueOf(extraLastState);
+            final var contact = account.getRoster().getContact(with);
             if (state != null) {
                 Log.d(Config.LOGTAG, "restored last state from intent extra");
                 updateButtonConfiguration(state);
                 updateVerifiedShield(false);
                 updateStateDisplay(state);
                 updateIncomingCallScreen(state);
+                updateSupportWarning(state, contact);
                 invalidateOptionsMenu();
             }
-            setWith(account.getRoster().getContact(with), state);
+            setWith(state, contact);
             if (xmppConnectionService
                     .getJingleConnectionManager()
                     .fireJingleRtpConnectionStateUpdates()) {
@@ -564,10 +566,10 @@ public class RtpSessionActivity extends XmppActivity
     }
 
     private void setWidth(final RtpEndUserState state) {
-        setWith(getWith(), state);
+        setWith(state, getWith());
     }
 
-    private void setWith(final Contact contact, final RtpEndUserState state) {
+    private void setWith(final RtpEndUserState state, final Contact contact) {
         binding.with.setText(contact.getDisplayName());
         if (Arrays.asList(RtpEndUserState.INCOMING_CALL, RtpEndUserState.ACCEPTING_CALL)
                 .contains(state)) {
@@ -822,7 +824,9 @@ public class RtpSessionActivity extends XmppActivity
         updateCallDuration();
         updateVerifiedShield(false);
         invalidateOptionsMenu();
-        setWith(account.getRoster().getContact(with), state);
+        final var contact = account.getRoster().getContact(with);
+        setWith(state, contact);
+        updateSupportWarning(state, contact);
     }
 
     private void reInitializeActivityWithRunningRtpSession(
@@ -912,7 +916,7 @@ public class RtpSessionActivity extends XmppActivity
 
     private void updateIncomingCallScreen(final RtpEndUserState state, final Contact contact) {
         if (state == RtpEndUserState.INCOMING_CALL || state == RtpEndUserState.ACCEPTING_CALL) {
-            final boolean show = getResources().getBoolean(R.bool.show_avatar_incoming_call);
+            final boolean show = getResources().getBoolean(R.bool.is_portrait_mode);
             if (show) {
                 binding.contactPhoto.setVisibility(View.VISIBLE);
                 if (contact == null) {
@@ -937,6 +941,18 @@ public class RtpSessionActivity extends XmppActivity
         }
     }
 
+    private void updateSupportWarning(final RtpEndUserState state, final Contact contact) {
+        if (state == RtpEndUserState.CONNECTIVITY_ERROR
+                && getResources().getBoolean(R.bool.is_portrait_mode)) {
+            binding.supportWarning.setVisibility(
+                    RtpCapability.check(contact) == RtpCapability.Capability.NONE
+                            ? View.VISIBLE
+                            : View.GONE);
+        } else {
+            binding.supportWarning.setVisibility(View.GONE);
+        }
+    }
+
     private Set<Media> getMedia() {
         return requireRtpConnection().getMedia();
     }
@@ -1530,6 +1546,7 @@ public class RtpSessionActivity extends XmppActivity
                         updateButtonConfiguration(state, media, contentAddition);
                         updateVideoViews(state);
                         updateIncomingCallScreen(state, contact);
+                        updateSupportWarning(state, contact);
                         invalidateOptionsMenu();
                     });
             if (END_CARD.contains(state)) {

src/main/res/drawable/ic_warning_48dp.xml πŸ”—

@@ -0,0 +1,5 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="48dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="48dp">
+      
+    <path android:fillColor="@android:color/white" android:pathData="M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z"/>
+    
+</vector>

src/main/res/layout/activity_rtp_session.xml πŸ”—

@@ -78,6 +78,41 @@
             android:layout_above="@+id/button_row"
             android:layout_below="@id/app_bar_layout">
 
+            <com.google.android.material.card.MaterialCardView
+                android:id="@+id/support_warning"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:layout_marginHorizontal="24dp"
+                android:layout_marginTop="@dimen/rtp_session_duration_top_margin"
+                android:visibility="gone"
+                app:cardBackgroundColor="?colorErrorContainer">
+
+                <RelativeLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:padding="12dp">
+
+                    <ImageView
+                        android:id="@+id/no_support_av_icon"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:src="@drawable/ic_warning_48dp"
+                        app:tint="?colorOnErrorContainer" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginStart="16dp"
+                        android:layout_toEndOf="@+id/no_support_av_icon"
+                        android:text="@string/clients_may_not_support_av"
+                        android:textAppearance="?textAppearanceBodyLarge"
+                        android:textColor="?colorOnErrorContainer" />
+                </RelativeLayout>
+            </com.google.android.material.card.MaterialCardView>
+
             <TextView
                 android:id="@+id/duration"
                 android:layout_width="wrap_content"

src/main/res/values-land/bools.xml πŸ”—

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <bool name="show_avatar_incoming_call">false</bool>
+    <bool name="is_portrait_mode">false</bool>
 </resources>

src/main/res/values/bools.xml πŸ”—

@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <bool name="show_avatar_incoming_call">true</bool>
+    <bool name="is_portrait_mode">true</bool>
 </resources>

src/main/res/values/strings.xml πŸ”—

@@ -1087,4 +1087,5 @@
     <string name="add_reaction_title">Add reaction</string>
     <string name="more_reactions">More reactions</string>
     <string name="could_not_modify_call">Could not modify call</string>
+    <string name="clients_may_not_support_av">Your contact’s XMPP client might not support audio/video calls.</string>
 </resources>