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