diff --git a/custom_rules.xml b/custom_rules.xml index a2c77ff6a..ae628ecd4 100644 --- a/custom_rules.xml +++ b/custom_rules.xml @@ -36,6 +36,7 @@ + diff --git a/src/org/linphone/CallManager.java b/src/org/linphone/CallManager.java index 319b238fa..189c25297 100644 --- a/src/org/linphone/CallManager.java +++ b/src/org/linphone/CallManager.java @@ -52,7 +52,7 @@ public class CallManager { public void inviteAddress(LinphoneAddress lAddress, boolean videoEnabled, boolean lowBandwidth) throws LinphoneCoreException { LinphoneCore lc = LinphoneManager.getLc(); - LinphoneCallParams params = lc.createDefaultCallParameters(); + LinphoneCallParams params = lc.createCallParams(null); bm().updateWithProfileSettings(lc, params); if (videoEnabled && params.getVideoEnabled()) { diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java new file mode 100644 index 000000000..9eb0868b4 --- /dev/null +++ b/src/org/linphone/IncomingCallActivity.java @@ -0,0 +1,206 @@ +/* +IncomingCallActivity.java +Copyright (C) 2011 Belledonne Communications, Grenoble, France + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ +package org.linphone; + +import java.util.List; + +import org.linphone.core.LinphoneAddress; +import org.linphone.core.LinphoneCall; +import org.linphone.core.LinphoneCall.State; +import org.linphone.core.LinphoneCallParams; +import org.linphone.core.LinphoneCore; +import org.linphone.core.LinphoneCoreListenerBase; +import org.linphone.mediastream.Log; +import org.linphone.ui.AvatarWithShadow; +import org.linphone.ui.LinphoneSliders; +import org.linphone.ui.LinphoneSliders.LinphoneSliderTriggered; + +import android.app.Activity; +import android.net.Uri; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.WindowManager; +import android.widget.TextView; +import android.widget.Toast; + +/** + * Activity displayed when a call comes in. + * It should bypass the screen lock mechanism. + * + * @author Guillaume Beraudo + */ +public class IncomingCallActivity extends Activity implements LinphoneSliderTriggered { + + private static IncomingCallActivity instance; + + private TextView mNameView; + private TextView mNumberView; + private AvatarWithShadow mPictureView; + private LinphoneCall mCall; + private LinphoneSliders mIncomingCallWidget; + private LinphoneCoreListenerBase mListener; + + public static IncomingCallActivity instance() { + return instance; + } + + public static boolean isInstanciated() { + return instance != null; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + setContentView(R.layout.incoming); + + mNameView = (TextView) findViewById(R.id.incoming_caller_name); + mNumberView = (TextView) findViewById(R.id.incoming_caller_number); + mPictureView = (AvatarWithShadow) findViewById(R.id.incoming_picture); + + // set this flag so this activity will stay in front of the keyguard + int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; + getWindow().addFlags(flags); + + // "Dial-to-answer" widget for incoming calls. + mIncomingCallWidget = (LinphoneSliders) findViewById(R.id.sliding_widget); + mIncomingCallWidget.setOnTriggerListener(this); + + mListener = new LinphoneCoreListenerBase(){ + @Override + public void callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State state, String message) { + if (call == mCall && State.CallEnd == state) { + finish(); + } + if (state == State.StreamsRunning) { + // The following should not be needed except some devices need it (e.g. Galaxy S). + LinphoneManager.getLc().enableSpeaker(LinphoneManager.getLc().isSpeakerEnabled()); + } + } + }; + + super.onCreate(savedInstanceState); + instance = this; + } + + @Override + protected void onResume() { + super.onResume(); + instance = this; + LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + if (lc != null) { + lc.addListener(mListener); + } + + // Only one call ringing at a time is allowed + if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) { + List calls = LinphoneUtils.getLinphoneCalls(LinphoneManager.getLc()); + for (LinphoneCall call : calls) { + if (State.IncomingReceived == call.getState()) { + mCall = call; + break; + } + } + } + if (mCall == null) { + Log.e("Couldn't find incoming call"); + finish(); + return; + } + LinphoneAddress address = mCall.getRemoteAddress(); + // May be greatly sped up using a drawable cache + Contact contact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(), address); + LinphoneUtils.setImagePictureFromUri(this, mPictureView.getView(), contact != null ? contact.getPhotoUri() : null, + contact != null ? contact.getThumbnailUri() : null, R.drawable.unknown_small); + + // To be done after findUriPictureOfContactAndSetDisplayName called + mNameView.setText(contact != null ? contact.getName() : ""); + if (getResources().getBoolean(R.bool.only_display_username_if_unknown)) { + mNumberView.setText(address.getUserName()); + } else { + mNumberView.setText(address.asStringUriOnly()); + } + } + + @Override + protected void onPause() { + LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + if (lc != null) { + lc.removeListener(mListener); + } + super.onPause(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + instance = null; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (LinphoneManager.isInstanciated() && (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME)) { + LinphoneManager.getLc().terminateCall(mCall); + finish(); + } + return super.onKeyDown(keyCode, event); + } + + + + private void decline() { + LinphoneManager.getLc().terminateCall(mCall); + } + + private void answer() { + LinphoneCallParams params = LinphoneManager.getLc().createCallParams(mCall); + + boolean isLowBandwidthConnection = !LinphoneUtils.isHighBandwidthConnection(this); + if (isLowBandwidthConnection) { + params.enableLowBandwidth(true); + Log.d("Low bandwidth enabled in call params"); + } + + if (!LinphoneManager.getInstance().acceptCallWithParams(mCall, params)) { + // the above method takes care of Samsung Galaxy S + Toast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG).show(); + } else { + if (!LinphoneActivity.isInstanciated()) { + return; + } + final LinphoneCallParams remoteParams = mCall.getRemoteParams(); + if (remoteParams != null && remoteParams.getVideoEnabled() && LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { + LinphoneActivity.instance().startVideoActivity(mCall); + } else { + LinphoneActivity.instance().startIncallActivity(mCall); + } + } + } + + @Override + public void onLeftHandleTriggered() { + answer(); + finish(); + } + + @Override + public void onRightHandleTriggered() { + decline(); + finish(); + } +} diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index 171b34f0f..ee73d6ee0 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -1087,8 +1087,7 @@ public class LinphonePreferences { if(servers.length > 0) { tunnelConfig = servers[0]; } else { - tunnelConfig = new TunnelConfig(); - tunnelConfig.setDelay(500); + tunnelConfig = LinphoneCoreFactory.instance().createTunnelConfig(); } } return tunnelConfig; diff --git a/submodules/belle-sip b/submodules/belle-sip index 611b6c3b1..91ea725eb 160000 --- a/submodules/belle-sip +++ b/submodules/belle-sip @@ -1 +1 @@ -Subproject commit 611b6c3b1d237dc9fa4113c39c2f5f070235b783 +Subproject commit 91ea725ebd9ce931de6356235bf1b500aeaa86fa diff --git a/submodules/linphone b/submodules/linphone index 847f56bb4..c4cf58931 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit 847f56bb4c91032c44335df53fb10bdb1001f8d6 +Subproject commit c4cf58931e7db458c5f2f9775f2bdb7a6d1b9f67