From ebca161b7edd10a0b9cd60898d2fa2a478ede441 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 10 Jul 2012 16:10:54 +0200 Subject: [PATCH] Fix some issues + multiple audio calls started --- res/drawable/sel_call.png | Bin 0 -> 5349 bytes res/drawable/sel_call_first.png | Bin 0 -> 4868 bytes res/layout/active_call.xml | 28 +++++++ res/layout/audio.xml | 45 +++-------- res/layout/chat.xml | 4 +- res/layout/contact.xml | 4 +- res/layout/history_detail.xml | 4 +- res/values/non_localizable_custom.xml | 2 +- src/org/linphone/AudioCallFragment.java | 81 +++++++++++++++----- src/org/linphone/ContactFragment.java | 2 +- src/org/linphone/DialerFragment.java | 1 + src/org/linphone/HistoryDetailFragment.java | 2 +- src/org/linphone/InCallActivity.java | 34 ++++++++ src/org/linphone/LinphoneActivity.java | 11 ++- src/org/linphone/StatusFragment.java | 4 +- src/org/linphone/VideoCallFragment.java | 24 +++--- src/org/linphone/ui/CallButton.java | 2 +- 17 files changed, 170 insertions(+), 78 deletions(-) create mode 100644 res/drawable/sel_call.png create mode 100644 res/drawable/sel_call_first.png create mode 100644 res/layout/active_call.xml diff --git a/res/drawable/sel_call.png b/res/drawable/sel_call.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fd83b8f10921cebee4d63c7a6cda28d44e6481 GIT binary patch literal 5349 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 GkNgiNa9W@M literal 0 HcmV?d00001 diff --git a/res/layout/active_call.xml b/res/layout/active_call.xml new file mode 100644 index 000000000..51e83b8f6 --- /dev/null +++ b/res/layout/active_call.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/audio.xml b/res/layout/audio.xml index c4c65f0e1..1c96d3823 100644 --- a/res/layout/audio.xml +++ b/res/layout/audio.xml @@ -1,46 +1,23 @@ - + - + android:orientation="vertical"> - - - - - - - + @@ -58,4 +35,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/chat.xml b/res/layout/chat.xml index f66feb2ee..ca126b373 100644 --- a/res/layout/chat.xml +++ b/res/layout/chat.xml @@ -18,8 +18,8 @@ false false false - true + false false true true diff --git a/src/org/linphone/AudioCallFragment.java b/src/org/linphone/AudioCallFragment.java index b45e8c983..65486dbc0 100644 --- a/src/org/linphone/AudioCallFragment.java +++ b/src/org/linphone/AudioCallFragment.java @@ -22,13 +22,13 @@ import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCoreFactory; import android.app.Activity; -import android.net.Uri; +import android.content.res.Resources; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; /** @@ -36,47 +36,86 @@ import android.widget.TextView; */ public class AudioCallFragment extends Fragment { private static AudioCallFragment instance; -// private Chronometer timer; + private LinearLayout callsList; + private LayoutInflater inflater; + private ViewGroup container; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { instance = this; + this.inflater = inflater; + this.container = container; + View view = inflater.inflate(R.layout.audio, container, false); -// timer = (Chronometer) view.findViewById(R.id.callTimer); + callsList = (LinearLayout) view.findViewById(R.id.calls); - LinphoneCall currentCall; - do { - currentCall = LinphoneManager.getLc().getCurrentCall(); - } while (currentCall == null); - - String sipUri = currentCall.getRemoteAddress().asStringUriOnly(); - LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); - Uri pictureUri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, view.getContext().getContentResolver()); - - TextView contact = (TextView) view.findViewById(R.id.contactNameOrNumber); - contact.setText(lAddress.getDisplayName() == null ? sipUri : lAddress.getDisplayName()); - - ImageView contactPicture = (ImageView) view.findViewById(R.id.contactPicture); - if (pictureUri != null) { - LinphoneUtils.setImagePictureFromUri(view.getContext(), contactPicture, Uri.parse(pictureUri.toString()), R.drawable.unknown_small); - } - return view; } + + private void displayCall(Resources resources, LinearLayout callView, LinphoneCall call) { + String sipUri = call.getRemoteAddress().asStringUriOnly(); + LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); +// Uri pictureUri = LinphoneUtils.findUriPictureOfContactAndSetDisplayName(lAddress, callView.getContext().getContentResolver()); + + TextView contact = (TextView) callView.findViewById(R.id.contactNameOrNumber); + if (lAddress.getDisplayName() == null) { + if (resources.getBoolean(R.bool.only_display_username_if_unknown) && LinphoneUtils.isSipAddress(sipUri)) { + contact.setText(LinphoneUtils.getUsernameFromAddress(sipUri)); + } else { + contact.setText(sipUri); + } + } else { + contact.setText(lAddress.getDisplayName()); + } + +// ImageView contactPicture = (ImageView) callView.findViewById(R.id.contactPicture); +// if (pictureUri != null) { +// LinphoneUtils.setImagePictureFromUri(callView.getContext(), contactPicture, Uri.parse(pictureUri.toString()), R.drawable.unknown_small); +// } + } @Override public void onAttach(Activity activity) { super.onAttach(activity); + InCallActivity.instance().bindAudioFragment(this); // Just to be sure we have incall controls InCallActivity.instance().setCallControlsVisibleAndRemoveCallbacks(); } + @Override + public void onResume() { + super.onResume(); + + // Add calls + refreshCallList(getResources()); + } + /** * @return null if not ready yet */ public static AudioCallFragment instance() { return instance; } + + public void refreshCallList(Resources resources) { + callsList.removeAllViews(); + + boolean first = true; + for (LinphoneCall call : LinphoneManager.getLc().getCalls()) { + LinearLayout callView = (LinearLayout) inflater.inflate(R.layout.active_call, container, false); + displayCall(resources, callView, call); + + if (first) { + callView.setBackgroundResource(R.drawable.sel_call_first); + first = false; + } else { + callView.setBackgroundResource(R.drawable.sel_call); + } + + callsList.addView(callView); + } + callsList.invalidate(); + } } diff --git a/src/org/linphone/ContactFragment.java b/src/org/linphone/ContactFragment.java index 14df5fe6e..90af9eccc 100644 --- a/src/org/linphone/ContactFragment.java +++ b/src/org/linphone/ContactFragment.java @@ -85,7 +85,7 @@ public class ContactFragment extends Fragment { return new OnClickListener() { @Override public void onClick(View v) { - LinphoneActivity.instance().setAddressAndGoToDialer(v.getTag().toString(), contact.getName(), contact.getPhotoUri()); + LinphoneActivity.instance().setAddresGoToDialerAndCall(v.getTag().toString(), contact.getName(), contact.getPhotoUri()); } }; } diff --git a/src/org/linphone/DialerFragment.java b/src/org/linphone/DialerFragment.java index 452c35bc1..89c6abcc1 100644 --- a/src/org/linphone/DialerFragment.java +++ b/src/org/linphone/DialerFragment.java @@ -119,6 +119,7 @@ public class DialerFragment extends Fragment { public void resetLayout() { if (LinphoneActivity.instance().isInCallLayout()) { mCall.setImageResource(R.drawable.plus); + mAddress.setText(""); mAddContact.setImageResource(R.drawable.cancel); mAddContact.setOnClickListener(cancelListener); } else { diff --git a/src/org/linphone/HistoryDetailFragment.java b/src/org/linphone/HistoryDetailFragment.java index 20e9d3e60..87b221a14 100644 --- a/src/org/linphone/HistoryDetailFragment.java +++ b/src/org/linphone/HistoryDetailFragment.java @@ -98,7 +98,7 @@ public class HistoryDetailFragment extends Fragment implements OnClickListener { int id = v.getId(); if (id == R.id.dialBack) { - LinphoneActivity.instance().setAddressAndGoToDialer(sipUri, displayName, pictureUri == null ? null : Uri.parse(pictureUri)); + LinphoneActivity.instance().setAddresGoToDialerAndCall(sipUri, displayName, pictureUri == null ? null : Uri.parse(pictureUri)); } else if (id == R.id.chat) { LinphoneActivity.instance().displayChat(sipUri); } else if (id == R.id.addToContacts) { diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index 95adf7068..69e82f461 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -83,6 +83,15 @@ public class InCallActivity extends FragmentActivity implements } initUI(); + if (LinphoneManager.getLc().getCallsNb() > 0) { + LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; + + if (isCallEstablished(call)) { + enableAndRefreshInCallActions(); + isVideoEnabled = call.getCurrentParamsCopy().getVideoEnabled(); + } + } + Fragment callFragment; if (isVideoEnabled) { callFragment = new VideoCallFragment(); @@ -400,12 +409,22 @@ public class InCallActivity extends FragmentActivity implements state == LinphoneCall.State.StreamsRunning || state == LinphoneCall.State.Resuming; } + + private boolean isCallEstablished(LinphoneCall call) { + LinphoneCall.State state = call.getState(); + + return isCallRunning(call) || + state == LinphoneCall.State.Paused || + state == LinphoneCall.State.PausedByRemote || + state == LinphoneCall.State.Pausing; + } @Override public void onCallStateChanged(LinphoneCall call, State state, String message) { if (LinphoneManager.getLc().getCallsNb() == 0) { finish(); + return; } if (state == State.StreamsRunning) { @@ -418,6 +437,17 @@ public class InCallActivity extends FragmentActivity implements isMicMuted = LinphoneManager.getLc().isMicMuted(); enableAndRefreshInCallActions(); } + + if (state == State.CallEnd || state == State.CallReleased || state == State.Error) { + if (audioCallFragment != null) { + mHandler.post(new Runnable() { + @Override + public void run() { + audioCallFragment.refreshCallList(getResources()); + } + }); + } + } } @Override @@ -452,4 +482,8 @@ public class InCallActivity extends FragmentActivity implements if (LinphoneUtils.onKeyBackGoHome(this, keyCode, event)) return true; return super.onKeyDown(keyCode, event); } + + public void bindAudioFragment(AudioCallFragment fragment) { + audioCallFragment = fragment; + } } diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 1811d6dae..423480d2d 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import org.linphone.LinphoneManager.AddressType; import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener; import org.linphone.LinphoneSimpleListener.LinphoneOnMessageReceived; import org.linphone.LinphoneSimpleListener.LinphoneOnRegistrationStateChangedListener; @@ -38,6 +39,7 @@ import org.linphone.core.LinphoneCore.RegistrationState; import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.Log; import org.linphone.setup.SetupActivity; +import org.linphone.ui.AddressText; import android.app.Activity; import android.content.Intent; @@ -466,12 +468,17 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } @Override - public void setAddressAndGoToDialer(String number, String name, Uri photo) { + public void setAddresGoToDialerAndCall(String number, String name, Uri photo) { Bundle extras = new Bundle(); extras.putString("SipUri", number); extras.putString("DisplayName", name); extras.putString("Photo", photo == null ? null : photo.toString()); changeCurrentFragment(FragmentsAvailable.DIALER, extras); + + AddressType address = new AddressText(this, null); + address.setDisplayedName(name); + address.setText(number); + LinphoneManager.getInstance().newOutgoingCall(address); } public void setAddressAndGoToDialer(String number) { @@ -603,6 +610,6 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene } interface ContactPicked { - void setAddressAndGoToDialer(String number, String name, Uri photo); + void setAddresGoToDialerAndCall(String number, String name, Uri photo); void goToDialer(); } \ No newline at end of file diff --git a/src/org/linphone/StatusFragment.java b/src/org/linphone/StatusFragment.java index f7da537a6..2df066da7 100644 --- a/src/org/linphone/StatusFragment.java +++ b/src/org/linphone/StatusFragment.java @@ -181,8 +181,8 @@ public class StatusFragment extends Fragment { } public void refreshEncryptionIcon() { - if (encryption != null) { - LinphoneCall call = LinphoneManager.getLc().getCurrentCall(); + LinphoneCall call = LinphoneManager.getLc().getCurrentCall(); + if (call != null && encryption != null) { MediaEncryption mediaEncryption = call.getCurrentParamsCopy().getMediaEncryption(); encryption.setVisibility(View.VISIBLE); diff --git a/src/org/linphone/VideoCallFragment.java b/src/org/linphone/VideoCallFragment.java index cbbd71814..816eda5a3 100644 --- a/src/org/linphone/VideoCallFragment.java +++ b/src/org/linphone/VideoCallFragment.java @@ -22,6 +22,7 @@ import org.linphone.core.Log; import org.linphone.mediastream.video.AndroidVideoWindowImpl; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; +import android.annotation.TargetApi; import android.content.Context; import android.opengl.GLSurfaceView; import android.os.Bundle; @@ -39,6 +40,7 @@ import android.view.ViewGroup; /** * @author Sylvain Berfini */ +@TargetApi(5) public class VideoCallFragment extends Fragment { private static VideoCallFragment instance; private WakeLock mWakeLock; @@ -113,15 +115,19 @@ public class VideoCallFragment extends Fragment { } public void switchCamera() { - int videoDeviceId = LinphoneManager.getLc().getVideoDevice(); - videoDeviceId = (videoDeviceId + 1) % AndroidCameraConfiguration.retrieveCameras().length; - LinphoneManager.getLc().setVideoDevice(videoDeviceId); - CallManager.getInstance().updateCall(); - - // previous call will cause graph reconstruction -> regive preview - // window - if (mCaptureView != null) { - LinphoneManager.getLc().setPreviewWindow(mCaptureView); + try { + int videoDeviceId = LinphoneManager.getLc().getVideoDevice(); + videoDeviceId = (videoDeviceId + 1) % AndroidCameraConfiguration.retrieveCameras().length; + LinphoneManager.getLc().setVideoDevice(videoDeviceId); + CallManager.getInstance().updateCall(); + + // previous call will cause graph reconstruction -> regive preview + // window + if (mCaptureView != null) { + LinphoneManager.getLc().setPreviewWindow(mCaptureView); + } + } catch (ArithmeticException ae) { + Log.e("Cannot swtich camera : no camera"); } } diff --git a/src/org/linphone/ui/CallButton.java b/src/org/linphone/ui/CallButton.java index 5da1bb8bb..9acbb74eb 100644 --- a/src/org/linphone/ui/CallButton.java +++ b/src/org/linphone/ui/CallButton.java @@ -48,7 +48,7 @@ public class CallButton extends ImageView implements OnClickListener, AddressAwa public void onClick(View v) { try { if (!LinphoneManager.getInstance().acceptCallIfIncomingPending()) { - if (mAddress.getText().length() >0) { + if (mAddress.getText().length() > 0) { LinphoneManager.getInstance().newOutgoingCall(mAddress); } }