From 95e8740e388961b02167b64dfd8d32cec07e2c3a Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 18 Oct 2011 12:04:55 +0200 Subject: [PATCH] Enhance concomitant video + conferencing. --- res/values/non_localizable_custom.xml | 1 + res/values/strings.xml | 6 ++-- src/org/linphone/ConferenceActivity.java | 25 ++++++++++++---- src/org/linphone/DialerActivity.java | 18 +++--------- src/org/linphone/LinphoneManager.java | 25 ++++++++++++---- src/org/linphone/LinphoneService.java | 1 + src/org/linphone/LinphoneSimpleListener.java | 8 ++++-- src/org/linphone/VideoCallActivity.java | 30 ++++++++++++++------ submodules/externals/osip | 2 +- submodules/linphone | 2 +- 10 files changed, 76 insertions(+), 42 deletions(-) diff --git a/res/values/non_localizable_custom.xml b/res/values/non_localizable_custom.xml index 68d828161..6b6bd7947 100644 --- a/res/values/non_localizable_custom.xml +++ b/res/values/non_localizable_custom.xml @@ -12,6 +12,7 @@ false true true + false false true true diff --git a/res/values/strings.xml b/res/values/strings.xml index c0a6e2af2..b533b1158 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -108,9 +108,9 @@ Terminate call Video settings Share my camera - Automatically send my camera on incoming calls - Initiate video calls - Always send my camera on outgoing calls + Send my camera on video capable calls + Initiate video capable calls + Disable to remove negotiation of video codecs for outgoing calls Enable Video Replace + by 00 iLBC might be unavailable depending on ARM processor and Android OS version. diff --git a/src/org/linphone/ConferenceActivity.java b/src/org/linphone/ConferenceActivity.java index 14e9c18a0..8cc015a29 100644 --- a/src/org/linphone/ConferenceActivity.java +++ b/src/org/linphone/ConferenceActivity.java @@ -27,8 +27,9 @@ import java.util.Comparator; import java.util.List; import org.linphone.LinphoneManagerWaitHelper.LinphoneManagerReadyListener; -import org.linphone.LinphoneSimpleListener.LinphoneAudioChangedListener; +import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; +import org.linphone.LinphoneSimpleListener.LinphoneOnVideoCallReadyListener; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCore; @@ -65,8 +66,10 @@ import android.widget.ToggleButton; */ public class ConferenceActivity extends ListActivity implements LinphoneManagerReadyListener, - LinphoneAudioChangedListener, - LinphoneOnCallStateChangedListener, Comparator, + LinphoneOnAudioChangedListener, + LinphoneOnVideoCallReadyListener, + LinphoneOnCallStateChangedListener, + Comparator, OnClickListener { private View confHeaderView; @@ -112,6 +115,9 @@ public class ConferenceActivity extends ListActivity implements private LinphoneManagerWaitHelper waitHelper; private ToggleButton mMuteMicButton; private ToggleButton mSpeakerButton; + private boolean useVideoActivity; + + @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.conferencing); @@ -133,6 +139,7 @@ public class ConferenceActivity extends ListActivity implements waitHelper = new LinphoneManagerWaitHelper(this, this); waitHelper.doManagerDependentOnCreate(); + useVideoActivity = getResources().getBoolean(R.bool.use_video_activity); // workaroundStatusBarBug(); super.onCreate(savedInstanceState); } @@ -429,8 +436,7 @@ public class ConferenceActivity extends ListActivity implements lc().removeFromConference(call); break; case R.id.addVideo: - VideoCallActivity.call = call; - LinphoneActivity.instance().startVideoActivity(); + LinphoneManager.getInstance().addVideo(); break; default: throw new RuntimeException("unknown id " + v.getId()); @@ -570,7 +576,9 @@ public class ConferenceActivity extends ListActivity implements final int numberOfCalls = linphoneCalls.size(); boolean showAddVideo = State.StreamsRunning == state && !isInConference - && Version.isVideoCapable() && LinphoneManager.getInstance().isVideoEnabled(); + && useVideoActivity + && Version.isVideoCapable() + && LinphoneManager.getInstance().isVideoEnabled(); View addVideoButton = v.findViewById(R.id.addVideo); setVisibility(addVideoButton, showAddVideo); @@ -780,6 +788,11 @@ public class ConferenceActivity extends ListActivity implements }); } + @Override + public void onRequestedVideoCallReady(LinphoneCall call) { + LinphoneActivity.instance().startVideoActivity(); + } + /* * public int compare(LinphoneCall c1, LinphoneCall c2) { if (c1 == c2) * return 0; diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index 6bbd2a99d..6ab995e95 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -87,7 +87,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin private PowerManager.WakeLock mWakeLock; private SharedPreferences mPref; private boolean useIncallActivity; - private boolean useVideoActivity; private boolean useConferenceActivity; private static final String CURRENT_ADDRESS = "org.linphone.current-address"; @@ -109,7 +108,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin useIncallActivity = getResources().getBoolean(R.bool.use_incall_activity); useConferenceActivity = getResources().getBoolean(R.bool.use_conference_activity); - useVideoActivity = getResources().getBoolean(R.bool.use_video_activity); // Don't use Linphone Manager in the onCreate as it takes time in LinphoneService to initialize it. mPref = PreferenceManager.getDefaultSharedPreferences(this); @@ -288,7 +286,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin } - private void exitCallMode(LinphoneCall call) { + private void exitCallMode() { if (getResources().getBoolean(R.bool.use_incoming_call_activity)) { finishActivity(INCOMING_CALL_ACTIVITY); } else if (getResources().getBoolean(R.bool.use_incoming_call_dialog)) { @@ -315,14 +313,6 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin mHangup.setEnabled(false); - - if (useVideoActivity && LinphoneManager.getLc().isVideoEnabled() - && VideoCallActivity.call == call) { - LinphoneActivity.instance().finishVideoActivity(); - BandwidthManager.getInstance().setUserRestriction(false); - LinphoneManager.getInstance().resetCameraFromPreferences(); - } - if (mWakeLock.isHeld()) mWakeLock.release(); LinphoneManager.stopProximitySensorForActivity(LinphoneActivity.instance()); @@ -377,7 +367,7 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin boolean prefAutoShareMyCamera = mPref.getBoolean(getString(key), false); boolean videoMuted = !(prefVideoEnable && prefAutoShareMyCamera); - LinphoneManager.getLc().getCurrentCall().enableCamera(prefAutoShareMyCamera); + LinphoneManager.getLc().getCurrentCall().enableCamera(!(videoMuted || useConferenceActivity)); } } }); @@ -465,12 +455,12 @@ public class DialerActivity extends Activity implements LinphoneGuiListener, Lin showToast(R.string.call_error, message); if (lc.getCallsNb() == 0){ if (mWakeLock.isHeld()) mWakeLock.release(); - exitCallMode(call); + exitCallMode(); LinphoneActivity.instance().stopOrientationSensor(); } }else if (state==LinphoneCall.State.CallEnd){ if (lc.getCallsNb() == 0){ - exitCallMode(call); + exitCallMode(); LinphoneActivity.instance().stopOrientationSensor(); } } diff --git a/src/org/linphone/LinphoneManager.java b/src/org/linphone/LinphoneManager.java index 067cb43f7..75542502b 100644 --- a/src/org/linphone/LinphoneManager.java +++ b/src/org/linphone/LinphoneManager.java @@ -46,9 +46,9 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import org.linphone.LinphoneSimpleListener.LinphoneAudioChangedListener; +import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneServiceListener; -import org.linphone.LinphoneSimpleListener.LinphoneAudioChangedListener.AudioState; +import org.linphone.LinphoneSimpleListener.LinphoneOnAudioChangedListener.AudioState; import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAuthInfo; import org.linphone.core.LinphoneCall; @@ -199,7 +199,7 @@ public final class LinphoneManager implements LinphoneCoreListener { } else { mAudioManager.setSpeakerphoneOn(speakerOn); } - for (LinphoneAudioChangedListener listener : getSimpleListeners(LinphoneAudioChangedListener.class)) { + for (LinphoneOnAudioChangedListener listener : getSimpleListeners(LinphoneOnAudioChangedListener.class)) { listener.onAudioStateChanged(speakerOn ? AudioState.SPEAKER : AudioState.EARPIECE); } } @@ -917,7 +917,7 @@ public final class LinphoneManager implements LinphoneCoreListener { } public boolean shareMyCamera() { - return mPref.getBoolean(getString(R.string.pref_video_automatically_share_my_video_key), false); + return isVideoEnabled() && mPref.getBoolean(getString(R.string.pref_video_automatically_share_my_video_key), false); } public void setAudioModeIncallForGalaxyS() { @@ -953,11 +953,15 @@ public final class LinphoneManager implements LinphoneCoreListener { e.commit(); } - public void addVideo() { - if (!LinphoneManager.getLc().isIncall()) return; + private LinphoneCall requestedVideoCall; + public boolean addVideo() { + requestedVideoCall = mLc.getCurrentCall(); + if (requestedVideoCall == null) return false; + if (!reinviteWithVideo()) { listenerDispatcher.onAlreadyInVideoCall(); } + return true; } public boolean acceptCallIfIncomingPending() throws LinphoneCoreException { @@ -1129,9 +1133,18 @@ public final class LinphoneManager implements LinphoneCoreListener { public void onCallStateChanged(LinphoneCall call, State state, String message) { + if (state == State.CallEnd && call == requestedVideoCall) { + requestedVideoCall = null; // drop reference + } if (state == State.CallEnd && mLc.getCallsNb() == 0) { routeAudioToReceiver(true); } + if (state == State.StreamsRunning && call == requestedVideoCall && call.getCurrentParamsCopy().getVideoEnabled()) { + for (LinphoneOnVideoCallReadyListener l : getSimpleListeners(LinphoneOnVideoCallReadyListener.class)) { + l.onRequestedVideoCallReady(call); + } + requestedVideoCall = null; + } if (serviceListener != null) serviceListener.onCallStateChanged(call, state, message); for (LinphoneOnCallStateChangedListener l : getSimpleListeners(LinphoneOnCallStateChangedListener.class)) { l.onCallStateChanged(call, state, message); diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index d6fb3bc74..ad98417aa 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -342,6 +342,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } else if (state == LinphoneCall.State.StreamsRunning) { if (Version.isVideoCapable() + && getResources().getBoolean(R.bool.autostart_video_activity) && getResources().getBoolean(R.bool.use_video_activity) && !VideoCallActivity.launched && LinphoneActivity.isInstanciated() && call.getCurrentParamsCopy().getVideoEnabled()) { diff --git a/src/org/linphone/LinphoneSimpleListener.java b/src/org/linphone/LinphoneSimpleListener.java index 5da9645f4..20439db92 100644 --- a/src/org/linphone/LinphoneSimpleListener.java +++ b/src/org/linphone/LinphoneSimpleListener.java @@ -35,8 +35,8 @@ public interface LinphoneSimpleListener { void onRegistrationStateChanged(RegistrationState state, String message); void onRingerPlayerCreated(MediaPlayer mRingerPlayer); void onDisplayStatus(String message); - void onAlreadyInVideoCall(); void onCallEncryptionChanged(LinphoneCall call, boolean encrypted, String authenticationToken); + void onAlreadyInVideoCall(); } @@ -48,8 +48,12 @@ public interface LinphoneSimpleListener { void onCallStateChanged(LinphoneCall call, State state, String message); } - public static interface LinphoneAudioChangedListener extends LinphoneSimpleListener { + public static interface LinphoneOnAudioChangedListener extends LinphoneSimpleListener { public enum AudioState {EARPIECE, SPEAKER} void onAudioStateChanged(AudioState state); } + + public static interface LinphoneOnVideoCallReadyListener extends LinphoneSimpleListener { + void onRequestedVideoCallReady(LinphoneCall call); + } } diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java index dc1e32c45..96cd6882b 100755 --- a/src/org/linphone/VideoCallActivity.java +++ b/src/org/linphone/VideoCallActivity.java @@ -20,8 +20,10 @@ package org.linphone; +import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; import org.linphone.core.LinphoneCall; import org.linphone.core.Log; +import org.linphone.core.LinphoneCall.State; import org.linphone.mediastream.video.AndroidVideoWindowImpl; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; @@ -46,11 +48,11 @@ import android.widget.ImageView; * @author Guillaume Beraudo * */ -public class VideoCallActivity extends Activity { +public class VideoCallActivity extends Activity implements LinphoneOnCallStateChangedListener { private SurfaceView mVideoViewReady; private SurfaceView mVideoCaptureViewReady; public static boolean launched = false; - public static LinphoneCall call; + private LinphoneCall videoCall; private WakeLock mWakeLock; private Handler refreshHandler = new Handler(); @@ -106,13 +108,11 @@ public class VideoCallActivity extends Activity { // 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.getLc().isIncall()) { - LinphoneCall call = LinphoneManager.getLc().getCurrentCall(); - if (call != null) { - updatePreview(call.cameraEnabled()); - } + videoCall = LinphoneManager.getLc().getCurrentCall(); + if (videoCall != null) { + updatePreview(videoCall.cameraEnabled()); } - + PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE,Log.TAG); @@ -169,6 +169,7 @@ public class VideoCallActivity extends Activity { if (mVideoViewReady != null) ((GLSurfaceView)mVideoViewReady).onResume(); launched=true; + LinphoneManager.getInstance().addListener(this); refreshHandler.postDelayed(mCallQualityUpdater=new Runnable(){ LinphoneCall mCurrentCall=LinphoneManager.getLc().getCurrentCall(); public void run() { @@ -281,8 +282,9 @@ public class VideoCallActivity extends Activity { @Override protected void onPause() { Log.d("onPause VideoCallActivity (isFinishing:", isFinishing(), ", inCall:", LinphoneManager.getLc().isIncall(), ", changingConf:", getChangingConfigurations()); + LinphoneManager.getInstance().removeListener(this); if (isFinishing()) { - call = null; // release reference + videoCall = null; // release reference } LinphoneManager.getInstance().restoreUserRequestedSpeaker(); launched=false; @@ -314,4 +316,14 @@ public class VideoCallActivity extends Activity { if (mVideoViewReady != null) ((GLSurfaceView)mVideoViewReady).onPause(); } + + @Override + public void onCallStateChanged(LinphoneCall call, State state, + String message) { + if (call == videoCall && state == State.CallEnd) { + BandwidthManager.getInstance().setUserRestriction(false); + LinphoneManager.getInstance().resetCameraFromPreferences(); + finish(); + } + } } diff --git a/submodules/externals/osip b/submodules/externals/osip index 9e8c64cff..c27b9b670 160000 --- a/submodules/externals/osip +++ b/submodules/externals/osip @@ -1 +1 @@ -Subproject commit 9e8c64cff496d2794fe352a6a3907e0e36988931 +Subproject commit c27b9b6702f62cdbd2143c1ccc85b8980b83adac diff --git a/submodules/linphone b/submodules/linphone index e740628ab..67daaaa14 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit e740628ab7cb69acae8751572506dfc840028607 +Subproject commit 67daaaa14d1d6ec4322f54c43a372fa51ee312de