@@ -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>
@@ -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
@@ -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()));
}
@@ -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" />
@@ -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>
@@ -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>