diff --git a/res/layout-land/videocall.xml b/res/layout-land/videocall.xml index 038b827be..7d9b1ca7d 100644 --- a/res/layout-land/videocall.xml +++ b/res/layout-land/videocall.xml @@ -1,11 +1,29 @@ - - - + + + + + + diff --git a/res/layout/videocall.xml b/res/layout/videocall.xml index fd47b054a..ebfe79a3e 100644 --- a/res/layout/videocall.xml +++ b/res/layout/videocall.xml @@ -1,10 +1,30 @@ - - - - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 64c8fa6f6..bc405ab7b 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -304,14 +304,20 @@ public class DialerActivity extends SoftVolumeActivity implements LinphoneGuiLis showDialog(INCOMING_CALL_DIALOG_ID); } + @Override + protected void onPrepareDialog(int id, Dialog dialog) { + String from = LinphoneManager.getInstance().extractIncomingRemoteName(); + String msg = String.format(getString(R.string.incoming_call_dialog_title), from); + ((AlertDialog) dialog).setMessage(msg); + super.onPrepareDialog(id, dialog); + } @Override protected Dialog onCreateDialog(int id) { - String from = LinphoneManager.getInstance().extractIncomingRemoteName(); View incomingCallView = getLayoutInflater().inflate(R.layout.incoming_call, null); final Dialog dialog = new AlertDialog.Builder(this) - .setMessage(String.format(getString(R.string.incoming_call_dialog_title), from)) + .setMessage("") .setCancelable(false) .setView(incomingCallView).create(); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 515e0bb50..c7e63a0ef 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -246,7 +246,9 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener if (rot != previousRotation) { Log.d("New device rotation: ", rot); // Returning rotation FROM ITS NATURAL ORIENTATION - LinphoneManager.getLc().setDeviceRotation(rot); + LinphoneCore lc=LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + if (lc!=null) lc.setDeviceRotation(rot); + //else ignore, we are probably exiting. previousRotation = rot; } } diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index a58a59350..7dd9f738b 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -301,10 +301,13 @@ public final class LinphoneManager implements LinphoneCoreListener { public void onAlreadyInCall(); } - public void toggleEnableCamera() { + public boolean toggleEnableCamera() { if (mLc.isIncall()) { - mLc.getCurrentCall().enableCamera(!mLc.getCurrentCall().cameraEnabled()); + boolean enabled = !mLc.getCurrentCall().cameraEnabled(); + mLc.getCurrentCall().enableCamera(enabled); + return enabled; } + return false; } public void sendStaticImage(boolean send) { diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index c2cc060ff..408c82bf6 100644 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -20,8 +20,7 @@ package org.linphone; -import junit.runner.Version; - +import org.linphone.core.LinphoneCall; import org.linphone.core.Log; import org.linphone.mediastream.video.AndroidVideoWindowImpl; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; @@ -36,6 +35,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.view.View; /** * For Android SDK >= 5 @@ -43,8 +43,8 @@ import android.view.SurfaceView; * */ public class VideoCallActivity extends SoftVolumeActivity { - private SurfaceView mVideoView; - private SurfaceView mVideoCaptureView; + private SurfaceView mVideoViewReady; + private SurfaceView mVideoCaptureViewReady; public static boolean launched = false; private WakeLock mWakeLock; @@ -56,21 +56,24 @@ public class VideoCallActivity extends SoftVolumeActivity { super.onCreate(savedInstanceState); setContentView(R.layout.videocall); - mVideoView = (SurfaceView) findViewById(R.id.video_surface); + SurfaceView videoView = (SurfaceView) findViewById(R.id.video_surface); - mVideoCaptureView = (SurfaceView) findViewById(R.id.video_capture_surface); - mVideoCaptureView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + //((FrameLayout) findViewById(R.id.video_frame)).bringChildToFront(findViewById(R.id.imageView1)); + + SurfaceView captureView = (SurfaceView) findViewById(R.id.video_capture_surface); + captureView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); /* force surfaces Z ordering */ if (org.linphone.mediastream.Version.sdkAboveOrEqual(5)) { - fixZOrder(); + fixZOrder(videoView, captureView); } - androidVideoWindowImpl = new AndroidVideoWindowImpl(mVideoView, mVideoCaptureView); + androidVideoWindowImpl = new AndroidVideoWindowImpl(videoView, captureView); androidVideoWindowImpl.setListener(new AndroidVideoWindowImpl.VideoWindowListener() { - public void onVideoRenderingSurfaceReady(AndroidVideoWindowImpl vw) { + public void onVideoRenderingSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) { LinphoneManager.getLc().setVideoWindow(vw); + mVideoViewReady = surface; } public void onVideoRenderingSurfaceDestroyed(AndroidVideoWindowImpl vw) { @@ -78,8 +81,9 @@ public class VideoCallActivity extends SoftVolumeActivity { LinphoneManager.getLc().setVideoWindow(null); } - public void onVideoPreviewSurfaceReady(AndroidVideoWindowImpl vw) { - LinphoneManager.getLc().setPreviewWindow(mVideoCaptureView); + public void onVideoPreviewSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) { + mVideoCaptureViewReady = surface; + LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady); } public void onVideoPreviewSurfaceDestroyed(AndroidVideoWindowImpl vw) { @@ -96,23 +100,45 @@ public class VideoCallActivity extends SoftVolumeActivity { // Before creating the graph, the orientation must be known to LC => this is done here LinphoneManager.getLc().setDeviceRotation(AndroidVideoWindowImpl.rotationToAngle(getWindowManager().getDefaultDisplay().getOrientation())); - if (!LinphoneManager.getInstance().shareMyCamera()) - LinphoneManager.getInstance().sendStaticImage(false); + if (LinphoneManager.getLc().isIncall()) { + LinphoneCall call = LinphoneManager.getLc().getCurrentCall(); + if (call != null) { + boolean camEnabled = call.cameraEnabled(); + + LinphoneManager.getInstance().sendStaticImage(!camEnabled); + updatePreview(camEnabled); + } + } + + PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE,Log.TAG); mWakeLock.acquire(); } - void fixZOrder() { - mVideoView.setZOrderOnTop(false); - mVideoCaptureView.setZOrderOnTop(true); + void updatePreview(boolean cameraCaptureEnabled) { + mVideoCaptureViewReady = null; + if (cameraCaptureEnabled) { + findViewById(R.id.imageView1).setVisibility(View.INVISIBLE); + findViewById(R.id.video_capture_surface).setVisibility(View.VISIBLE); + } else { + findViewById(R.id.video_capture_surface).setVisibility(View.INVISIBLE); + findViewById(R.id.imageView1).setVisibility(View.VISIBLE); + } + findViewById(R.id.video_frame).requestLayout(); + } + + void fixZOrder(SurfaceView video, SurfaceView preview) { + video.setZOrderOnTop(false); + preview.setZOrderOnTop(true); } @Override protected void onResume() { super.onResume(); - ((GLSurfaceView)mVideoView).onResume(); + if (mVideoViewReady != null) + ((GLSurfaceView)mVideoViewReady).onResume(); } @@ -158,16 +184,24 @@ public class VideoCallActivity extends SoftVolumeActivity { case R.id.videocall_menu_change_resolution: LinphoneManager.getInstance().changeResolution(); // previous call will cause graph reconstruction -> regive preview window + if (mVideoCaptureViewReady != null) + LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady); rewriteChangeResolutionItem(item); break; case R.id.videocall_menu_terminate_call: LinphoneManager.getInstance().terminateCall(); break; case R.id.videocall_menu_toggle_camera: - LinphoneManager.getInstance().toggleEnableCamera(); + boolean camEnabled = LinphoneManager.getInstance().toggleEnableCamera(); + updatePreview(camEnabled); + Log.e("winwow camera enabled: " + camEnabled); rewriteToggleCameraItem(item); // previous call will cause graph reconstruction -> regive preview window - LinphoneManager.getLc().setPreviewWindow(mVideoCaptureView); + if (camEnabled) { + if (mVideoCaptureViewReady != null) + LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady); + } else + LinphoneManager.getLc().setPreviewWindow(null); break; case R.id.videocall_menu_switch_camera: int id = LinphoneManager.getLc().getVideoDevice(); @@ -175,12 +209,13 @@ public class VideoCallActivity extends SoftVolumeActivity { LinphoneManager.getLc().setVideoDevice(id); CallManager.getInstance().updateCall(); // previous call will cause graph reconstruction -> regive preview window - LinphoneManager.getLc().setPreviewWindow(mVideoCaptureView); + if (mVideoCaptureViewReady != null) + LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady); break; default: Log.e("Unknown menu item [",item,"]"); break; - } + } return true; } @@ -195,11 +230,21 @@ public class VideoCallActivity extends SoftVolumeActivity { @Override protected void onPause() { Log.d("onPause VideoCallActivity"); + if (!isFinishing() && LinphoneManager.getLc().isIncall()) { + // we're getting paused for real + if (getChangingConfigurations() == 0) { + LinphoneManager.getInstance().sendStaticImage(true); + } else { + LinphoneManager.getLc().setDeviceRotation(AndroidVideoWindowImpl.rotationToAngle(getWindowManager().getDefaultDisplay().getOrientation())); + LinphoneManager.getLc().updateCall(LinphoneManager.getLc().getCurrentCall(), null); + } + } LinphoneManager.getLc().setVideoWindow(null); LinphoneManager.getLc().setPreviewWindow(null); - LinphoneManager.getInstance().sendStaticImage(true); + if (mWakeLock.isHeld()) mWakeLock.release(); super.onPause(); - ((GLSurfaceView)mVideoView).onPause(); + if (mVideoViewReady != null) + ((GLSurfaceView)mVideoViewReady).onPause(); } } diff --git a/src/org/linphone/core/LinphoneCallImpl.java b/src/org/linphone/core/LinphoneCallImpl.java index ceb541ed0..70968e79d 100644 --- a/src/org/linphone/core/LinphoneCallImpl.java +++ b/src/org/linphone/core/LinphoneCallImpl.java @@ -35,14 +35,17 @@ class LinphoneCallImpl implements LinphoneCall { private native boolean isEchoCancellationEnabled(long nativePtr) ; private native void enableEchoLimiter(long nativePtr,boolean enable); private native boolean isEchoLimiterEnabled(long nativePtr); - private native long getReplacedCall(long nativePtr); + private native Object getReplacedCall(long nativePtr); private native int getDuration(long nativePtr); private native float getCurrentQuality(long nativePtr); private native float getAverageQuality(long nativePtr); private native String getAuthenticationToken(long nativePtr); private native boolean isAuthenticationTokenVerified(long nativePtr); private native boolean areStreamsEncrypted(long nativePtr); - + + /* + * This method must always be called from JNI, nothing else. + */ protected LinphoneCallImpl(long aNativePtr) { nativePtr = aNativePtr; } @@ -98,11 +101,7 @@ class LinphoneCallImpl implements LinphoneCall { return isEchoLimiterEnabled(nativePtr); } public LinphoneCall getReplacedCall(){ - long callptr=getReplacedCall(nativePtr); - if (callptr!=0){ - return new LinphoneCallImpl(callptr); - } - return null; + return (LinphoneCall)getReplacedCall(nativePtr); } public int getDuration() { diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index 52019f96b..a45bad1c7 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -42,7 +42,7 @@ class LinphoneCoreImpl implements LinphoneCore { private native void clearProxyConfigs(long nativePtr); private native void addAuthInfo(long nativePtr,long authInfoNativePtr); - private native long invite(long nativePtr,String uri); + private native Object invite(long nativePtr,String uri); private native void terminateCall(long nativePtr, long call); private native long getRemoteAddress(long nativePtr); private native boolean isInCall(long nativePtr); @@ -56,8 +56,8 @@ class LinphoneCoreImpl implements LinphoneCore { private native float getPlaybackGain(long nativeptr); private native void muteMic(long nativePtr,boolean isMuted); private native long interpretUrl(long nativePtr,String destination); - private native long inviteAddress(long nativePtr,long to); - private native long inviteAddressWithParams(long nativePtrLc,long to, long nativePtrParam); + private native Object inviteAddress(long nativePtr,long to); + private native Object inviteAddressWithParams(long nativePtrLc,long to, long nativePtrParam); private native void sendDtmf(long nativePtr,char dtmf); private native void clearCallLogs(long nativePtr); private native boolean isMicMuted(long nativePtr); @@ -140,12 +140,7 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized LinphoneCall invite(String uri) { isValid(); - long lNativePtr = invite(nativePtr,uri); - if (lNativePtr!=0) { - return new LinphoneCallImpl(lNativePtr); - } else { - return null; - } + return (LinphoneCall)invite(nativePtr,uri); } public synchronized void iterate() { @@ -239,9 +234,9 @@ class LinphoneCoreImpl implements LinphoneCore { } } public synchronized LinphoneCall invite(LinphoneAddress to) throws LinphoneCoreException { - long lNativePtr = inviteAddress(nativePtr,((LinphoneAddressImpl)to).nativePtr); - if (lNativePtr!=0) { - return new LinphoneCallImpl(lNativePtr); + LinphoneCall call = (LinphoneCall)inviteAddress(nativePtr,((LinphoneAddressImpl)to).nativePtr); + if (call!=null) { + return call; } else { throw new LinphoneCoreException("Unable to invite address " + to.asString()); } @@ -361,9 +356,9 @@ class LinphoneCoreImpl implements LinphoneCore { long ptrDestination = ((LinphoneAddressImpl)to).nativePtr; long ptrParams =((LinphoneCallParamsImpl)params).nativePtr; - long lcNativePtr = inviteAddressWithParams(nativePtr, ptrDestination, ptrParams); - if (lcNativePtr!=0) { - return new LinphoneCallImpl(lcNativePtr); + LinphoneCall call = (LinphoneCall)inviteAddressWithParams(nativePtr, ptrDestination, ptrParams); + if (call!=null) { + return call; } else { throw new LinphoneCoreException("Unable to invite with params " + to.asString()); } diff --git a/submodules/linphone b/submodules/linphone index 73acd2508..33c884f49 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 73acd25082b213ba0ce6cd77cecd736b34b4bdc2 +Subproject commit 33c884f493d473a1373a7d219ecfd07db60e50cc