Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,13 @@
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize">
</activity>

<activity android:name=".videochat.VideochatActivity"
android:label=""
android:theme="@style/TextSecure.LightTheme"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
android:exported="true">
</activity>

<activity android:name=".WebxdcActivity"
android:label=""
android:theme="@style/TextSecure.LightTheme"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,6 @@ public AttachmentTypeSelector(@NonNull Context context, @NonNull LoaderManager l
ViewUtil.findById(layout, R.id.location_linear_layout).setVisibility(View.GONE);
}

if (!DcHelper.isWebrtcConfigOk(DcHelper.getContext(context))) {
ViewUtil.findById(layout, R.id.invite_video_chat_linear_layout).setVisibility(View.GONE);
}

setLocationButtonImage(context);

setContentView(layout);
Expand Down
10 changes: 8 additions & 2 deletions src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ public class DcHelper {
public static final String CONFIG_WEBXDC_REALTIME_ENABLED = "webxdc_realtime_enabled";
public static final String CONFIG_PRIVATE_TAG = "private_tag";

public static final String DEFAULT_VIDEOCHAT_URL_PREFIX = "https://meet.systemli.org/";
public static final String DEFAULT_VIDEOCHAT_URL = DEFAULT_VIDEOCHAT_URL_PREFIX + "$ROOM#config.prejoinConfig.enabled=false&config.notifications=[]&config.toolbarButtons=[%22microphone%22,%22camera%22,%22hangup%22]";

public static DcContext getContext(@NonNull Context context) {
return ApplicationContext.getInstance(context).dcContext;
}
Expand Down Expand Up @@ -403,9 +406,12 @@ public static String getBlobdirFile(DcContext dcContext, String path) {

}

public static boolean isWebrtcConfigOk(DcContext dcContext) {
public static String getVideochatURL(DcContext dcContext) {
String instance = dcContext.getConfig(DcHelper.CONFIG_WEBRTC_INSTANCE);
return (instance != null && !instance.isEmpty());
if (instance != null && !instance.isEmpty()) {
return instance;
}
return DEFAULT_VIDEOCHAT_URL;
}

@NonNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ public boolean onPreferenceClick(@NonNull Preference preference) {
View gl = View.inflate(requireActivity(), R.layout.single_line_input, null);
EditText inputField = gl.findViewById(R.id.input_field);
inputField.setHint(R.string.videochat_instance_placeholder);
inputField.setText(dcContext.getConfig(DcHelper.CONFIG_WEBRTC_INSTANCE));
inputField.setText(DcHelper.getVideochatURL(dcContext));
inputField.setSelection(inputField.getText().length());
inputField.setInputType(TYPE_TEXT_VARIATION_URI);
new AlertDialog.Builder(requireActivity())
Expand Down Expand Up @@ -381,8 +381,7 @@ public boolean onPreferenceClick(@NonNull Preference preference) {
private void updateWebrtcSummary() {
Preference webrtcInstance = this.findPreference("pref_webrtc_instance");
if (webrtcInstance != null) {
webrtcInstance.setSummary(DcHelper.isWebrtcConfigOk(dcContext)?
dcContext.getConfig(DcHelper.CONFIG_WEBRTC_INSTANCE) : getString(R.string.none));
webrtcInstance.setSummary(DcHelper.getVideochatURL(dcContext));
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.thoughtcrime.securesms.videochat;

import android.os.Bundle;
import android.view.Menu;
import android.webkit.PermissionRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;

import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContext;

import org.thoughtcrime.securesms.WebViewActivity;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.Util;

public class VideochatActivity extends WebViewActivity {
private static final String TAG = VideochatActivity.class.getSimpleName();

public static final String EXTRA_CHAT_ID = "chat_id";
public static final String EXTRA_URL = "url";

private DcContext dcContext;
private String url = "";

@Override
protected void onCreate(Bundle state, boolean ready) {
super.onCreate(state, ready);
this.dcContext = DcHelper.getContext(getApplicationContext());

Bundle b = getIntent().getExtras();
url = b.getString(EXTRA_URL, "");
int chatId = b.getInt(EXTRA_CHAT_ID, 0);

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setUserAgentString("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36");

webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(PermissionRequest request) {
Util.runOnMain(() -> {
request.grant(request.getResources());
});
}
});

Util.runOnAnyBackgroundThread(() -> {
final DcChat chat = dcContext.getChat(chatId);
Util.runOnMain(() -> {
getSupportActionBar().setTitle(chat.getName());
});
});

webView.loadUrl(url);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// do not call super.onPrepareOptionsMenu() as the default "Search" menu is not needed
return true;
}

@Override
protected boolean openOnlineUrl(String url) {
finish();
return true;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.thoughtcrime.securesms.videochat;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;

import androidx.appcompat.app.AlertDialog;

Expand All @@ -10,7 +12,11 @@

import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.util.IntentUtils;
import org.thoughtcrime.securesms.permissions.Permissions;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class VideochatUtil {

Expand All @@ -23,7 +29,18 @@ public void invite(Activity activity, int chatId) {
.setMessage(R.string.videochat_invite_user_hint)
.setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok, (dialog, which) -> {
String instance = dcContext.getConfig(DcHelper.CONFIG_WEBRTC_INSTANCE);
boolean unset = instance == null || instance.isEmpty();
if (unset) {
dcContext.setConfig(DcHelper.CONFIG_WEBRTC_INSTANCE, DcHelper.DEFAULT_VIDEOCHAT_URL);
}

int msgId = dcContext.sendVideochatInvitation(dcChat.getId());

if (unset) {
dcContext.setConfig(DcHelper.CONFIG_WEBRTC_INSTANCE, null);
}

if (msgId != 0) {
join(activity, msgId);
}
Expand All @@ -32,10 +49,29 @@ public void invite(Activity activity, int chatId) {
}

public void join(Activity activity, int msgId) {
DcContext dcContext = DcHelper.getContext(activity);
DcMsg dcMsg = dcContext.getMsg(msgId);
String videochatUrl = dcMsg.getVideochatUrl();
IntentUtils.showInBrowser(activity, videochatUrl);
Permissions.with(activity)
.request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
.ifNecessary()
.withPermanentDenialDialog(activity.getString(R.string.perm_explain_access_to_camera_denied))
.onAllGranted(() -> {
DcContext dcContext = DcHelper.getContext(activity);
DcMsg dcMsg = dcContext.getMsg(msgId);
String url = dcMsg.getVideochatUrl();
if (url.startsWith(DcHelper.DEFAULT_VIDEOCHAT_URL_PREFIX) && url.contains("#")) {
String name = dcContext.getName();
try {
name = URLEncoder.encode(dcContext.getName(), StandardCharsets.UTF_8.toString());
} catch (UnsupportedEncodingException ignored) {}
url += "&userInfo.displayName=%22" + name +"%22";
}

Intent intent = new Intent(activity, VideochatActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(VideochatActivity.EXTRA_CHAT_ID, dcMsg.getChatId());
intent.putExtra(VideochatActivity.EXTRA_URL, url);
activity.startActivity(intent);
})
.execute();
}

}
Loading