show help button on certain error conditions in RTP session. fixes #3770

Daniel Gultsch created

Change summary

src/conversations/res/menu/activity_rtp_session.xml             | 11 
src/main/java/eu/siacs/conversations/Config.java                |  2 
src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java | 54 ++
src/main/res/drawable-hdpi/ic_help_white_24dp.png               |  0 
src/main/res/drawable-mdpi/ic_help_white_24dp.png               |  0 
src/main/res/drawable-xhdpi/ic_help_white_24dp.png              |  0 
src/main/res/drawable-xxhdpi/ic_help_white_24dp.png             |  0 
src/main/res/drawable-xxxhdpi/ic_help_white_24dp.png            |  0 
src/main/res/values/attrs.xml                                   |  1 
src/main/res/values/strings.xml                                 |  1 
src/main/res/values/themes.xml                                  |  2 
11 files changed, 70 insertions(+), 1 deletion(-)

Detailed changes

src/conversations/res/menu/activity_rtp_session.xml 🔗

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/action_help"
+        android:icon="?attr/icon_help"
+        android:title="@string/help"
+        app:showAsAction="always"/>
+</menu>

src/main/java/eu/siacs/conversations/Config.java 🔗

@@ -1,6 +1,7 @@
 package eu.siacs.conversations;
 
 import android.graphics.Bitmap;
+import android.net.Uri;
 
 import java.util.Collections;
 import java.util.List;
@@ -35,6 +36,7 @@ public final class Config {
     public static final String LOGTAG = BuildConfig.LOGTAG;
 
     public static final Jid BUG_REPORTS = Jid.of("bugs@conversations.im");
+    public static final Uri HELP = Uri.parse("https://help.conversations.im");
 
 
     public static final String DOMAIN_LOCK = null; //only allow account creation for this domain

src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java 🔗

@@ -3,6 +3,7 @@ package eu.siacs.conversations.ui;
 import android.Manifest;
 import android.annotation.SuppressLint;
 import android.app.PictureInPictureParams;
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -17,6 +18,8 @@ import android.support.annotation.RequiresApi;
 import android.support.annotation.StringRes;
 import android.util.Log;
 import android.util.Rational;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
 import android.view.WindowManager;
 import android.widget.Toast;
@@ -81,6 +84,10 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
             RtpEndUserState.CONNECTIVITY_LOST_ERROR,
             RtpEndUserState.RETRACTED
     );
+    private static final List<RtpEndUserState> STATES_SHOWING_HELP_BUTTON = Arrays.asList(
+            RtpEndUserState.APPLICATION_ERROR,
+            RtpEndUserState.CONNECTIVITY_ERROR
+    );
     private static final String PROXIMITY_WAKE_LOCK_TAG = "conversations:in-rtp-session";
     private static final int REQUEST_ACCEPT_CALL = 0x1111;
     private WeakReference<JingleRtpConnection> rtpConnectionReference;
@@ -124,6 +131,45 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
         setSupportActionBar(binding.toolbar);
     }
 
+    @Override
+    public boolean onCreateOptionsMenu(final Menu menu) {
+        getMenuInflater().inflate(R.menu.activity_rtp_session, menu);
+        final MenuItem help = menu.findItem(R.id.action_help);
+        help.setVisible(isHelpButtonVisible());
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    private boolean isHelpButtonVisible() {
+        try {
+            return STATES_SHOWING_HELP_BUTTON.contains(requireRtpConnection().getEndUserState());
+        } catch (IllegalStateException e) {
+            final Intent intent = getIntent();
+            final String state = intent != null ? intent.getStringExtra(EXTRA_LAST_REPORTED_STATE) : null;
+            if (state != null) {
+                return STATES_SHOWING_HELP_BUTTON.contains(RtpEndUserState.valueOf(state));
+            } else {
+                return false;
+            }
+        }
+    }
+
+    public boolean onOptionsItemSelected(final MenuItem item) {
+        if (item.getItemId() == R.id.action_help) {
+            launchHelpInBrowser();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    private void launchHelpInBrowser() {
+        final Intent intent = new Intent(Intent.ACTION_VIEW, Config.HELP);
+        try {
+            startActivity(intent);
+        } catch (final ActivityNotFoundException e) {
+            Toast.makeText(this, R.string.no_application_found_to_open_link, Toast.LENGTH_LONG).show();
+        }
+    }
+
     private void endCall(View view) {
         endCall();
     }
@@ -302,6 +348,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
                 updateButtonConfiguration(state);
                 updateStateDisplay(state);
                 updateProfilePicture(state);
+                invalidateOptionsMenu();
             }
             binding.with.setText(account.getRoster().getContact(with).getDisplayName());
         }
@@ -456,11 +503,12 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
         updateStateDisplay(currentState, media);
         updateButtonConfiguration(currentState, media);
         updateProfilePicture(currentState);
+        invalidateOptionsMenu();
         return false;
     }
 
     private void initializeWithTerminatedSessionState(final Account account, final Jid with, final JingleConnectionManager.TerminatedRtpSession terminatedRtpSession) {
-        Log.d(Config.LOGTAG,"initializeWithTerminatedSessionState()");
+        Log.d(Config.LOGTAG, "initializeWithTerminatedSessionState()");
         if (terminatedRtpSession.state == RtpEndUserState.ENDED) {
             finish();
             return;
@@ -470,6 +518,8 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
         updateButtonConfiguration(state);
         updateStateDisplay(state);
         updateProfilePicture(state);
+        updateCallDuration();
+        invalidateOptionsMenu();
         binding.with.setText(account.getRoster().getContact(with).getDisplayName());
     }
 
@@ -956,6 +1006,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
                 updateButtonConfiguration(state, media);
                 updateVideoViews(state);
                 updateProfilePicture(state, contact);
+                invalidateOptionsMenu();
             });
             if (END_CARD.contains(state)) {
                 final JingleRtpConnection rtpConnection = requireRtpConnection();
@@ -1004,6 +1055,7 @@ public class RtpSessionActivity extends XmppActivity implements XmppConnectionSe
                 updateStateDisplay(state);
                 updateButtonConfiguration(state);
                 updateProfilePicture(state);
+                invalidateOptionsMenu();
             });
             resetIntent(account, with, state, actionToMedia(currentIntent.getAction()));
         }

src/main/res/values/attrs.xml 🔗

@@ -96,6 +96,7 @@
     <attr name="icon_refresh" format="reference" />
     <attr name="icon_remove" format="reference" />
     <attr name="icon_search" format="reference" />
+    <attr name="icon_help" format="reference" />
     <attr name="icon_secure" format="reference" />
     <attr name="icon_settings" format="reference" />
     <attr name="icon_share" format="reference" />

src/main/res/values/strings.xml 🔗

@@ -917,6 +917,7 @@
     <string name="missed_call">Missed call</string>
     <string name="audio_call">Audio call</string>
     <string name="video_call">Video call</string>
+    <string name="help">Help</string>
     <string name="microphone_unavailable">Your microphone is unavailable</string>
     <string name="only_one_call_at_a_time">You can only have one call at a time.</string>
     <string name="return_to_ongoing_call">Return to ongoing call</string>

src/main/res/values/themes.xml 🔗

@@ -114,6 +114,7 @@
         </item>
         <item name="icon_remove" type="reference">@drawable/ic_delete_black_24dp</item>
         <item name="icon_search" type="reference">@drawable/ic_search_white_24dp</item>
+        <item name="icon_help" type="reference">@drawable/ic_help_white_24dp</item>
         <item name="icon_secure" type="reference">@drawable/ic_lock_open_white_24dp</item>
         <item name="icon_settings" type="reference">@drawable/ic_settings_black_24dp</item>
         <item name="icon_share" type="reference">@drawable/ic_share_white_24dp</item>
@@ -267,6 +268,7 @@
         </item>
         <item name="icon_remove" type="reference">@drawable/ic_delete_white_24dp</item>
         <item name="icon_search" type="reference">@drawable/ic_search_white_24dp</item>
+        <item name="icon_help" type="reference">@drawable/ic_help_white_24dp</item>
         <item name="icon_secure" type="reference">@drawable/ic_lock_open_white_24dp</item>
         <item name="icon_settings" type="reference">@drawable/ic_settings_white_24dp</item>
         <item name="icon_share" type="reference">@drawable/ic_share_white_24dp</item>