From b8dc84bdac1a6a6429e6111077cca7af43920d22 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 22 May 2019 14:20:41 +0200 Subject: [PATCH] Reload video devices after camera permission granted to ensure to be able to capture & send video right after --- .../org/linphone/activities/MainActivity.java | 3 ++ .../RemoteConfigurationAssistantActivity.java | 2 + .../java/org/linphone/call/CallActivity.java | 2 + .../linphone/call/CallIncomingActivity.java | 4 ++ .../linphone/call/CallOutgoingActivity.java | 4 ++ .../org/linphone/utils/LinphoneUtils.java | 53 ++++++++++--------- 6 files changed, 42 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/MainActivity.java b/app/src/main/java/org/linphone/activities/MainActivity.java index bdcebae3e..b490dc3bb 100644 --- a/app/src/main/java/org/linphone/activities/MainActivity.java +++ b/app/src/main/java/org/linphone/activities/MainActivity.java @@ -549,6 +549,9 @@ public abstract class MainActivity extends LinphoneGenericActivity boolean enableRingtone = grantResults[i] == PackageManager.PERMISSION_GRANTED; LinphonePreferences.instance().enableDeviceRingtone(enableRingtone); LinphoneManager.getInstance().enableDeviceRingtone(enableRingtone); + } else if (permissions[i].equals(Manifest.permission.CAMERA) + && grantResults[i] == PackageManager.PERMISSION_GRANTED) { + LinphoneUtils.reloadVideoDevices(); } } } diff --git a/app/src/main/java/org/linphone/assistant/RemoteConfigurationAssistantActivity.java b/app/src/main/java/org/linphone/assistant/RemoteConfigurationAssistantActivity.java index 9a93749b9..bb8c47ead 100644 --- a/app/src/main/java/org/linphone/assistant/RemoteConfigurationAssistantActivity.java +++ b/app/src/main/java/org/linphone/assistant/RemoteConfigurationAssistantActivity.java @@ -41,6 +41,7 @@ import org.linphone.core.Core; import org.linphone.core.CoreListenerStub; import org.linphone.core.tools.Log; import org.linphone.settings.LinphonePreferences; +import org.linphone.utils.LinphoneUtils; public class RemoteConfigurationAssistantActivity extends AssistantActivity { private static final int QR_CODE_ACTIVITY_RESULT = 1; @@ -191,6 +192,7 @@ public class RemoteConfigurationAssistantActivity extends AssistantActivity { if (requestCode == CAMERA_PERMISSION_RESULT) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + LinphoneUtils.reloadVideoDevices(); startActivityForResult( new Intent( RemoteConfigurationAssistantActivity.this, diff --git a/app/src/main/java/org/linphone/call/CallActivity.java b/app/src/main/java/org/linphone/call/CallActivity.java index 080546ed0..016d75514 100644 --- a/app/src/main/java/org/linphone/call/CallActivity.java +++ b/app/src/main/java/org/linphone/call/CallActivity.java @@ -522,6 +522,7 @@ public class CallActivity extends LinphoneGenericActivity switch (requestCode) { case CAMERA_TO_TOGGLE_VIDEO: + LinphoneUtils.reloadVideoDevices(); toggleVideo(); break; case MIC_TO_DISABLE_MUTE: @@ -531,6 +532,7 @@ public class CallActivity extends LinphoneGenericActivity toggleRecording(); break; case CAMERA_TO_ACCEPT_UPDATE: + LinphoneUtils.reloadVideoDevices(); acceptCallUpdate(true); break; } diff --git a/app/src/main/java/org/linphone/call/CallIncomingActivity.java b/app/src/main/java/org/linphone/call/CallIncomingActivity.java index 86410f885..6bd21e0fd 100644 --- a/app/src/main/java/org/linphone/call/CallIncomingActivity.java +++ b/app/src/main/java/org/linphone/call/CallIncomingActivity.java @@ -291,6 +291,10 @@ public class CallIncomingActivity extends LinphoneGenericActivity { + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + if (permissions[i].equals(Manifest.permission.CAMERA) + && grantResults[i] == PackageManager.PERMISSION_GRANTED) { + LinphoneUtils.reloadVideoDevices(); + } } } } diff --git a/app/src/main/java/org/linphone/call/CallOutgoingActivity.java b/app/src/main/java/org/linphone/call/CallOutgoingActivity.java index 29b84e3d1..aff6b9ebc 100644 --- a/app/src/main/java/org/linphone/call/CallOutgoingActivity.java +++ b/app/src/main/java/org/linphone/call/CallOutgoingActivity.java @@ -299,6 +299,10 @@ public class CallOutgoingActivity extends LinphoneGenericActivity implements OnC + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + if (permissions[i].equals(Manifest.permission.CAMERA) + && grantResults[i] == PackageManager.PERMISSION_GRANTED) { + LinphoneUtils.reloadVideoDevices(); + } } } } diff --git a/app/src/main/java/org/linphone/utils/LinphoneUtils.java b/app/src/main/java/org/linphone/utils/LinphoneUtils.java index 4607148b3..f0c33fce1 100644 --- a/app/src/main/java/org/linphone/utils/LinphoneUtils.java +++ b/app/src/main/java/org/linphone/utils/LinphoneUtils.java @@ -19,11 +19,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; -import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.ConnectivityManager; @@ -33,7 +31,6 @@ import android.os.Looper; import android.telephony.TelephonyManager; import android.text.Html; import android.text.Spanned; -import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -44,8 +41,6 @@ import androidx.core.content.ContextCompat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; -import java.util.Collection; -import java.util.List; import java.util.Locale; import java.util.regex.Pattern; import org.linphone.LinphoneManager; @@ -53,7 +48,6 @@ import org.linphone.LinphoneService; import org.linphone.R; import org.linphone.core.Address; import org.linphone.core.Call; -import org.linphone.core.Call.State; import org.linphone.core.CallLog; import org.linphone.core.ChatRoom; import org.linphone.core.ChatRoomCapabilities; @@ -61,6 +55,8 @@ import org.linphone.core.Core; import org.linphone.core.Factory; import org.linphone.core.LogCollectionState; import org.linphone.core.ProxyConfig; +import org.linphone.core.tools.Log; +import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.settings.LinphonePreferences; /** Helpers. */ @@ -134,16 +130,6 @@ public final class LinphoneUtils { return displayName; } - public static boolean onKeyBackGoHome(Activity activity, int keyCode, KeyEvent event) { - if (!(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)) { - return false; // continue - } - - activity.startActivity( - new Intent().setAction(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)); - return true; - } - public static String timestampToHumanDate(Context context, long timestamp, int format) { return timestampToHumanDate(context, timestamp, context.getString(format)); } @@ -183,16 +169,6 @@ public final class LinphoneUtils { && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)); } - public static List getCallsInState(Core core, Collection states) { - List foundCalls = new ArrayList<>(); - for (Call call : core.getCalls()) { - if (states.contains(call.getState())) { - foundCalls.add(call); - } - } - return foundCalls; - } - private static boolean isCallRunning(Call call) { if (call == null) { return false; @@ -242,6 +218,31 @@ public final class LinphoneUtils { return true; } + public static void reloadVideoDevices() { + Core core = LinphoneManager.getCore(); + if (core == null) return; + + Log.i("[Utils] Reloading camera"); + core.reloadVideoDevices(); + + boolean useFrontCam = LinphonePreferences.instance().useFrontCam(); + int camId = 0; + AndroidCameraConfiguration.AndroidCamera[] cameras = + AndroidCameraConfiguration.retrieveCameras(); + for (AndroidCameraConfiguration.AndroidCamera androidCamera : cameras) { + if (androidCamera.frontFacing == useFrontCam) { + camId = androidCamera.id; + break; + } + } + String[] devices = core.getVideoDevicesList(); + if (camId >= devices.length) { + camId = 0; + } + String newDevice = devices[camId]; + core.setVideoDevice(newDevice); + } + public static String getDisplayableUsernameFromAddress(String sipAddress) { String username = sipAddress; Core core = LinphoneManager.getCore();