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