diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0a74c0d19..73ea5973a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
* Better incoming call system integration
* Calls are not experimental anymore and don't need to be manually enabled
* Calls can be answered by tapping messages
+* Notify the user when they try to make a call while the device is offline
* Channels are no longer experimental and are available by default
* Display a permanent notification when doing location streaming and get rid of dangerous "Access Location in Background" permission
* Autoplay all voice messages in a chat
diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java
index 384add495..5746bcb06 100644
--- a/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java
+++ b/src/main/java/org/thoughtcrime/securesms/ConversationActivity.java
@@ -633,12 +633,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
return true;
} else if (itemId == R.id.menu_start_audio_call) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- CallUtil.startAudioCall(context, chatId);
+ CallUtil.startAudioCall(this, chatId);
}
return true;
} else if (itemId == R.id.menu_start_video_call) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- CallUtil.startVideoCall(context, chatId);
+ CallUtil.startVideoCall(this, chatId);
}
return true;
} else if (itemId == R.id.menu_all_media) {
diff --git a/src/main/java/org/thoughtcrime/securesms/calls/CallUtil.java b/src/main/java/org/thoughtcrime/securesms/calls/CallUtil.java
index 91d3018e5..fe5a57c72 100644
--- a/src/main/java/org/thoughtcrime/securesms/calls/CallUtil.java
+++ b/src/main/java/org/thoughtcrime/securesms/calls/CallUtil.java
@@ -5,13 +5,18 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AlertDialog;
import androidx.core.telecom.CallEndpointCompat;
import com.b44t.messenger.DcChat;
+import com.b44t.messenger.DcContext;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.DcHelper;
@@ -52,8 +57,22 @@ public class CallUtil {
return;
}
- int accId = DcHelper.getContext(context).getAccountId();
- coordinator.initiateOutgoingCall(accId, chatId, startsWithVideo);
+ Runnable proceedWithCall =
+ () -> {
+ int accId = DcHelper.getContext(context).getAccountId();
+ coordinator.initiateOutgoingCall(accId, chatId, startsWithVideo);
+ };
+
+ if (!isNetworkAvailable(context)) {
+ new AlertDialog.Builder(context)
+ .setMessage(context.getString(R.string.call_requires_connection))
+ .setPositiveButton(R.string.perm_continue, (dialog, which) -> proceedWithCall.run())
+ .setNegativeButton(android.R.string.cancel, null)
+ .show();
+ return;
+ }
+
+ proceedWithCall.run();
}
@Nullable
@@ -138,4 +157,24 @@ public class CallUtil {
}
return iconRes;
}
+
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ private static boolean isNetworkAvailable(Context context) {
+ ConnectivityManager manager =
+ (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (manager == null) return true;
+
+ boolean networkAvailable = false;
+ Network network = manager.getActiveNetwork();
+ if (network != null) {
+ NetworkCapabilities caps = manager.getNetworkCapabilities(network);
+ networkAvailable =
+ caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ }
+
+ boolean serverConnected =
+ DcHelper.getContext(context).getConnectivity() >= DcContext.DC_CONNECTIVITY_WORKING;
+
+ return networkAvailable || serverConnected;
+ }
}
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index e349fb327..e0fc8978d 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -438,6 +438,7 @@
Call answered on another device
Camera permission is required for video calls
Microphone permission is required for calls
+ Cannot start call. Make sure your device has an internet connection and try again.
Call with %1$s