From 7388723f4038a04cd0ab215464442257d66e4acd Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Fri, 18 Sep 2015 18:47:57 +0200 Subject: [PATCH] Incall actiivty --- res/layout/active_call_control_row.xml | 10 +- res/layout/incall.xml | 92 +++++--- src/org/linphone/InCallActivity.java | 277 +++++++++++++++---------- 3 files changed, 226 insertions(+), 153 deletions(-) diff --git a/res/layout/active_call_control_row.xml b/res/layout/active_call_control_row.xml index 0ad739dbe..8a0eeac3b 100644 --- a/res/layout/active_call_control_row.xml +++ b/res/layout/active_call_control_row.xml @@ -1,8 +1,7 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/incall.xml b/res/layout/incall.xml index ff7717980..69383729c 100644 --- a/res/layout/incall.xml +++ b/res/layout/incall.xml @@ -24,6 +24,16 @@ android:layout_height="match_parent" android:orientation="horizontal" /> + + + @@ -70,23 +80,49 @@ + - + + + + + + + android:background="@color/colorH" + android:layout_gravity="bottom" + android:orientation="vertical"> + @@ -144,8 +179,7 @@ android:id="@+id/micro" android:src="@drawable/micro_default" android:background="@drawable/button_background" - android:adjustViewBounds="true" - android:scaleType="center" + android:padding="15dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" /> @@ -154,8 +188,7 @@ android:id="@+id/speaker" android:src="@drawable/speaker_default" android:background="@drawable/button_background" - android:adjustViewBounds="true" - android:scaleType="center" + android:padding="20dp" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> @@ -171,8 +204,7 @@ android:id="@+id/options" android:src="@drawable/options_default" android:background="@drawable/button_background" - android:adjustViewBounds="true" - android:scaleType="center" + android:padding="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" /> @@ -191,19 +223,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:adjustViewBounds="true" - android:scaleType="center" + android:padding="20dp" android:background="@color/colorC" android:contentDescription="@string/content_description_contacts" android:src="@drawable/footer_dialer" /> @@ -253,15 +282,14 @@ android:layout_weight="0.5" /> + android:layout_weight="0.5" /> @@ -296,8 +324,7 @@ android:id="@+id/transfer" android:src="@drawable/options_transfer_call" android:background="@drawable/button_background" - android:adjustViewBounds="true" - android:scaleType="center" + android:padding="20dp" android:visibility="invisible" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -333,15 +360,14 @@ android:layout_weight="0.5" /> + android:layout_weight="0.5"/> diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index 5c37aea06..ecf0c7b0c 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -30,7 +30,6 @@ import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.core.LinphonePlayer; import org.linphone.mediastream.Log; -import org.linphone.mediastream.Version; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.ui.Numpad; @@ -40,6 +39,7 @@ import android.app.FragmentTransaction; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; +import android.media.Image; import android.net.Uri; import android.os.Bundle; import android.os.CountDownTimer; @@ -62,7 +62,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; -import android.widget.TableLayout; import android.widget.TextView; import android.widget.Toast; @@ -79,14 +78,13 @@ public class InCallActivity extends Activity implements OnClickListener { private Runnable mControls; private ImageView switchCamera; private RelativeLayout mActiveCallHeader; - private ImageView pause, hangUp, dialer, video, micro, speaker, options, addCall, transfer, conference; + private ImageView pause, hangUp, dialer, video, micro, speaker, options, addCall, transfer, conference, conferenceStatus; private TextView audioRoute, routeSpeaker, routeReceiver, routeBluetooth; - private LinearLayout routeLayout; + private LinearLayout routeLayout, mNoCurrentCall; private ProgressBar videoProgress; private StatusFragment status; private AudioCallFragment audioCallFragment; private VideoCallFragment videoCallFragment; - private ConferenceCallFragment conferenceCallFragment; private boolean isSpeakerEnabled = false, isMicMuted = false, isTransferAllowed, isAnimationDisabled; private LinearLayout mControlsLayout; private Numpad numpad; @@ -96,7 +94,7 @@ public class InCallActivity extends Activity implements OnClickListener { private boolean isVideoCallPaused = false; AcceptCallUpdateDialogFragment callUpdateDialog; - private TableLayout callsList; + private LinearLayout callsList, conferenceList; private LayoutInflater inflater; private ViewGroup container; private boolean isConferenceRunning = false; @@ -134,13 +132,17 @@ public class InCallActivity extends Activity implements OnClickListener { finish(); return; } - + + Log.w("State " + message); + if (state == State.IncomingReceived) { startIncomingCallActivity(); return; } if (state == State.Paused || state == State.PausedByRemote || state == State.Pausing) { + if(LinphoneManager.getLc().getCurrentCall() != null) + Log.w(LinphoneManager.getLc().getCurrentCall().getRemoteContact()); enabledVideoButton(false); if(isVideoEnabled(call)){ showAudioView(); @@ -149,7 +151,7 @@ public class InCallActivity extends Activity implements OnClickListener { if (state == State.Resuming) { if(LinphonePreferences.instance().isVideoEnabled()){ - //status.refreshStatusItems(call, isVideoEnabled(call)); + status.refreshStatusItems(call, isVideoEnabled(call)); if(call.getCurrentParamsCopy().getVideoEnabled()){ showVideoView(); } @@ -174,9 +176,6 @@ public class InCallActivity extends Activity implements OnClickListener { } } - refreshInCallActions(); - refreshCallList(getResources()); - if (state == State.CallUpdatedByRemote) { // If the correspondent proposes video while audio call boolean videoEnabled = LinphonePreferences.instance().isVideoEnabled(); @@ -209,6 +208,8 @@ public class InCallActivity extends Activity implements OnClickListener { // }); // } } + + refreshIncallUi(); transfer.setEnabled(LinphoneManager.getLc().getCurrentCall() != null); } @@ -290,7 +291,8 @@ public class InCallActivity extends Activity implements OnClickListener { private void initUI() { inflater = LayoutInflater.from(this); container = (ViewGroup) findViewById(R.id.topLayout); - callsList = (TableLayout) findViewById(R.id.calls); + callsList = (LinearLayout) findViewById(R.id.calls); + conferenceList = (LinearLayout) findViewById(R.id.conferenceCalls); //TopBar video = (ImageView) findViewById(R.id.video); @@ -327,6 +329,7 @@ public class InCallActivity extends Activity implements OnClickListener { pause.setEnabled(false); mActiveCallHeader = (RelativeLayout) findViewById(R.id.activeCallHeader); + mNoCurrentCall = (LinearLayout) findViewById(R.id.noCurrentCall); /*if(isTablet()){ speaker.setEnabled(false); @@ -345,6 +348,7 @@ public class InCallActivity extends Activity implements OnClickListener { transfer.setEnabled(false); conference = (ImageView) findViewById(R.id.conference); + conference.setEnabled(false); conference.setOnClickListener(this); @@ -400,9 +404,15 @@ public class InCallActivity extends Activity implements OnClickListener { LinphoneManager.getInstance().changeStatusToOnThePhone(); } + + + private void refreshIncallUi(){ + refreshInCallActions(); + refreshCallList(getResources()); + } private void refreshInCallActions() { - if (!LinphonePreferences.instance().isVideoEnabled()) { + if (!LinphonePreferences.instance().isVideoEnabled() || isConferenceRunning) { enabledVideoButton(false); } else { if(video.isEnabled()) { @@ -454,14 +464,14 @@ public class InCallActivity extends Activity implements OnClickListener { if (LinphoneManager.getLc().getCallsNb() > 1) { //pause.setVisibility(View.GONE); } else { - /*pause.setVisibility(View.VISIBLE); - + //pause.setVisibility(View.VISIBLE); + List pausedCalls = LinphoneUtils.getCallsInState(LinphoneManager.getLc(), Arrays.asList(State.Paused)); if (pausedCalls.size() == 1) { - pause.setBackgroundResource(R.drawable.pause_on); + //pause.setBackgroundResource(R.drawable.pa); } else { - pause.setBackgroundResource(R.drawable.pause_off); - }*/ + //pause.setBackgroundResource(R.drawable.pause_off); + } } } @@ -509,7 +519,7 @@ public class InCallActivity extends Activity implements OnClickListener { goBackToDialer(); } else if (id == R.id.pause) { - pauseOrResumeCall(); + pauseOrResumeCall(LinphoneManager.getLc().getCurrentCall()); } else if (id == R.id.hangUp) { hangUp(); @@ -519,6 +529,7 @@ public class InCallActivity extends Activity implements OnClickListener { } else if (id == R.id.conference) { enterConference(); + hideOrDisplayCallOptions(); } else if (id == R.id.switchCamera) { if (videoCallFragment != null) { @@ -640,12 +651,6 @@ public class InCallActivity extends Activity implements OnClickListener { replaceFragmentVideoByAudio(); setCallControlsVisibleAndRemoveCallbacks(); } - - private void showConferenceView() { - LinphoneManager.startProximitySensorForActivity(InCallActivity.this); - replaceFragmentByConference(); - displayConference(); - } private void showVideoView() { if (!BluetoothManager.getInstance().isBluetoothHeadsetAvailable()) { @@ -659,18 +664,6 @@ public class InCallActivity extends Activity implements OnClickListener { replaceFragmentAudioByVideo(); displayVideoCallControlsIfHidden(); } - - private void replaceFragmentByConference() { - mControlsLayout.setVisibility(View.GONE); - switchCamera.setVisibility(View.INVISIBLE); - conferenceCallFragment = new ConferenceCallFragment(); - FragmentTransaction transaction = getFragmentManager().beginTransaction(); - transaction.replace(R.id.fragmentContainer, conferenceCallFragment); - try { - transaction.commitAllowingStateLoss(); - } catch (Exception e) { - } - } private void replaceFragmentVideoByAudio() { audioCallFragment = new AudioCallFragment(); @@ -695,6 +688,20 @@ public class InCallActivity extends Activity implements OnClickListener { } catch (Exception e) { } } + + private void displayOrHideCallsHeader(boolean display){ + if(display){ + callsList.setVisibility(View.VISIBLE); + mActiveCallHeader.setVisibility(View.VISIBLE); + } else { + callsList.setVisibility(View.GONE); + mActiveCallHeader.setVisibility(View.GONE); + } + } + + private void displayNoCurrentCall(){ + + } private void toggleMicro() { LinphoneCore lc = LinphoneManager.getLc(); @@ -731,25 +738,16 @@ public class InCallActivity extends Activity implements OnClickListener { public void pauseOrResumeCall(LinphoneCall call) { LinphoneCore lc = LinphoneManager.getLc(); if (call != null && LinphoneUtils.isCallRunning(call)) { - if (call.isInConference()) { - lc.removeFromConference(call); - if (lc.getConferenceSize() <= 1) { - lc.leaveConference(); - } - } else { - lc.pauseCall(call); - if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { - isVideoCallPaused = true; - showAudioView(); - } - pause.setImageResource(R.drawable.pause_big_over_selected); + lc.pauseCall(call); + if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { + isVideoCallPaused = true; } + pause.setImageResource(R.drawable.pause_big_over_selected); } else if (call != null) { if (call.getState() == State.Paused) { lc.resumeCall(call); if (isVideoCallPaused) { isVideoCallPaused = false; - showVideoView(); } pause.setImageResource(R.drawable.pause_big_default); } @@ -769,32 +767,12 @@ public class InCallActivity extends Activity implements OnClickListener { } } - private void enterConference() { - LinphoneManager.getLc().addAllToConference(); - } - - public void pauseOrResumeConference() { - LinphoneCore lc = LinphoneManager.getLc(); - if (lc.isInConference()) { - lc.leaveConference(); - } else { - lc.enterConference(); - } - } - - private void displayConference(){ - mControlsLayout.setVisibility(View.VISIBLE); - callsList.setVisibility(View.GONE); - mActiveCallHeader.setVisibility(View.GONE); - } - public void displayVideoCallControlsIfHidden() { if (mControlsLayout != null) { if (mControlsLayout.getVisibility() != View.VISIBLE) { if (isAnimationDisabled) { mControlsLayout.setVisibility(View.VISIBLE); - callsList.setVisibility(View.GONE); - mActiveCallHeader.setVisibility(View.GONE); + displayOrHideCallsHeader(false); if (cameraNumber > 1) { switchCamera.setVisibility(View.VISIBLE); } @@ -804,8 +782,7 @@ public class InCallActivity extends Activity implements OnClickListener { @Override public void onAnimationStart(Animation animation) { mControlsLayout.setVisibility(View.VISIBLE); - callsList.setVisibility(View.GONE); - mActiveCallHeader.setVisibility(View.GONE); + displayOrHideCallsHeader(false); if (cameraNumber > 1) { switchCamera.setVisibility(View.VISIBLE); } @@ -842,11 +819,11 @@ public class InCallActivity extends Activity implements OnClickListener { hideNumpad(); if (isAnimationDisabled) { + video.setEnabled(true); transfer.setVisibility(View.INVISIBLE); addCall.setVisibility(View.INVISIBLE); mControlsLayout.setVisibility(View.GONE); - mActiveCallHeader.setVisibility(View.GONE); - // callsList.setVisibility(View.GONE); + displayOrHideCallsHeader(false); switchCamera.setVisibility(View.INVISIBLE); numpad.setVisibility(View.GONE); options.setImageResource(R.drawable.options_default); @@ -868,8 +845,7 @@ public class InCallActivity extends Activity implements OnClickListener { transfer.setVisibility(View.INVISIBLE); addCall.setVisibility(View.INVISIBLE); mControlsLayout.setVisibility(View.GONE); - // callsList.setVisibility(View.GONE); - mActiveCallHeader.setVisibility(View.GONE); + displayOrHideCallsHeader(false); switchCamera.setVisibility(View.INVISIBLE); numpad.setVisibility(View.GONE); options.setImageResource(R.drawable.options_default); @@ -894,8 +870,6 @@ public class InCallActivity extends Activity implements OnClickListener { mControls = null; mControlsLayout.setVisibility(View.VISIBLE); - callsList.setVisibility(View.VISIBLE); - mActiveCallHeader.setVisibility(View.VISIBLE); switchCamera.setVisibility(View.INVISIBLE); } @@ -1151,7 +1125,8 @@ public class InCallActivity extends Activity implements OnClickListener { transfer.setVisibility(View.VISIBLE); } addCall.setVisibility(View.VISIBLE); - conference.setVisibility(View.VISIBLE); + if(LinphoneManager.getLc().getCalls().length > 1) + conference.setVisibility(View.VISIBLE); options.setImageResource(R.drawable.options_selected); } else { if (isOrientationLandscape) { @@ -1219,7 +1194,7 @@ public class InCallActivity extends Activity implements OnClickListener { if (isVideoEnabled(LinphoneManager.getLc().getCurrentCall())) { displayVideoCallControlsIfHidden(); - } else if(isConferenceRunning) { + } else if(LinphoneManager.getLc().isInConference()) { displayConference(); } else { LinphoneManager.startProximitySensorForActivity(this); @@ -1233,7 +1208,7 @@ public class InCallActivity extends Activity implements OnClickListener { lc.addListener(mListener); } - refreshCallList(getResources()); + refreshIncallUi(); handleViewIntent(); } @@ -1334,11 +1309,14 @@ public class InCallActivity extends Activity implements OnClickListener { videoCallFragment = fragment; } - public void bindConferenceFragment(ConferenceCallFragment fragment) { - conferenceCallFragment = fragment; - } - private void displayActiveCall(LinphoneCall call){ + if(isVideoEnabled(call)){ + mActiveCallHeader.setVisibility(View.GONE); + } else { + mActiveCallHeader.setVisibility(View.VISIBLE); + mNoCurrentCall.setVisibility(View.GONE); + } + if(call == null) return; String sipUri = call.getRemoteAddress().asStringUriOnly(); LinphoneAddress lAddress; @@ -1346,7 +1324,7 @@ public class InCallActivity extends Activity implements OnClickListener { lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); } catch (LinphoneCoreException e) { Log.e("Incall activity cannot parse remote address",e); - lAddress= LinphoneCoreFactory.instance().createLinphoneAddress("uknown","unknown","unkonown"); + lAddress= LinphoneCoreFactory.instance().createLinphoneAddress("unknown","unknown","unknown"); } TextView contact = (TextView) findViewById(R.id.contactNameOrNumber); @@ -1374,10 +1352,9 @@ public class InCallActivity extends Activity implements OnClickListener { timer.setBase(SystemClock.elapsedRealtime() - 1000 * callDuration); timer.start(); - } - private void displayOtherCalls(Resources resources, LinphoneCall call, int index) { + private void displayOtherCalls(Resources resources, final LinphoneCall call, int index) { Log.w("Display other calls"); String sipUri = call.getRemoteAddress().asStringUriOnly(); LinphoneAddress lAddress; @@ -1389,7 +1366,7 @@ public class InCallActivity extends Activity implements OnClickListener { } // Control Row - LinearLayout callView = (LinearLayout) inflater.inflate(R.layout.active_call_control_row, container, false); + LinearLayout callView = (LinearLayout) inflater.inflate(R.layout.active_call_control_row, container, false); callView.setId(index+1); TextView contact = (TextView) callView.findViewById(R.id.contactNameOrNumber); @@ -1405,7 +1382,7 @@ public class InCallActivity extends Activity implements OnClickListener { contact.setText(lContact.getName()); } - //displayCallStatusIconAndReturnCallPaused(callView, call); + displayCallStatusIconAndReturnCallPaused(callView, call); registerCallDurationTimer(callView, call); callsList.addView(callView); @@ -1418,19 +1395,7 @@ public class InCallActivity extends Activity implements OnClickListener { } callsList.addView(imageView);*/ - int callDuration = call.getDuration(); - if (callDuration == 0 && call.getState() != State.StreamsRunning) { - return; - } - Chronometer timer = (Chronometer) findViewById(R.id.callTimer); - if (timer == null) { - throw new IllegalArgumentException("no callee_duration view found"); - } - - timer.setBase(SystemClock.elapsedRealtime() - 1000 * callDuration); - timer.start(); - // callView.setTag(imageView); /* callView.setOnClickListener(new OnClickListener() { @Override @@ -1516,19 +1481,12 @@ public class InCallActivity extends Activity implements OnClickListener { public void refreshCallList(Resources resources) { isConferenceRunning = LinphoneManager.getLc().isInConference(); if (isConferenceRunning) { - callsList.removeAllViews(); - callsList.setVisibility(View.GONE); - showConferenceView(); - return; + displayConference(); + mNoCurrentCall.setVisibility(View.GONE); + } else { + conferenceList.setVisibility(View.GONE); } - if(LinphoneManager.getLc().getCalls().length == 1) { - Log.w(LinphoneManager.getLc().getCalls()[0].getRemoteContact()); - displayActiveCall(LinphoneManager.getLc().getCalls()[0]); - return; - } - - Log.w("Plusieurs call"); if(callsList != null) { callsList.setVisibility(View.VISIBLE); callsList.removeAllViews(); @@ -1540,6 +1498,7 @@ public class InCallActivity extends Activity implements OnClickListener { } for (LinphoneCall call : LinphoneManager.getLc().getCalls()) { + if(call.isInConference()) break; if (call != LinphoneManager.getLc().getCurrentCall()) { displayOtherCalls(resources, call, index); index++; @@ -1550,11 +1509,99 @@ public class InCallActivity extends Activity implements OnClickListener { if (LinphoneManager.getLc().getCurrentCall() == null) { showAudioView(); + mActiveCallHeader.setVisibility(View.GONE); + mNoCurrentCall.setVisibility(View.VISIBLE); video.setEnabled(false); } - callsList.invalidate(); + //callsList.invalidate(); } } + + //Conference + private void exitConference(final LinphoneCall call){ + LinphoneCore lc = LinphoneManager.getLc(); + + if (call.isInConference()) { + lc.removeFromConference(call); + if (lc.getConferenceSize() <= 1) { + lc.leaveConference(); + } + } + refreshIncallUi(); + } + + private void enterConference() { + LinphoneManager.getLc().addAllToConference(); + displayConferenceHeader(); + displayOrHideCallsHeader(false); + } + + public void pauseOrResumeConference() { + LinphoneCore lc = LinphoneManager.getLc(); + if (lc.isInConference()) { + conferenceStatus.setImageResource(R.drawable.pause_big_over_selected); + lc.leaveConference(); + } else { + conferenceStatus.setImageResource(R.drawable.pause_big_default); + lc.enterConference(); + } + } + + private void displayConferenceParticipant(int index, final LinphoneCall call){ + LinearLayout confView = (LinearLayout) inflater.inflate(R.layout.conf_call_control_row, container, false); + conferenceList.setId(index+1); + TextView contact = (TextView) confView.findViewById(R.id.contactNameOrNumber); + + Contact lContact = ContactsManager.getInstance().findContactWithAddress(getContentResolver(),call.getRemoteAddress()); + if (lContact == null) { + contact.setText(call.getRemoteAddress().getUserName()); + } else { + contact.setText(lContact.getName()); + } + + registerCallDurationTimer(confView, call); + + ImageView quitConference = (ImageView) confView.findViewById(R.id.quitConference); + quitConference.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + exitConference(call); + } + }); + conferenceList.addView(confView); + + } + + private void displayConferenceHeader(){ + conferenceList.setVisibility(View.VISIBLE); + RelativeLayout headerConference = (RelativeLayout) inflater.inflate(R.layout.conference_header, container, false); + conferenceStatus = (ImageView) headerConference.findViewById(R.id.conferenceStatus); + conferenceStatus.setOnClickListener(this); + conferenceList.addView(headerConference); + + } + + private void displayConference(){ + mControlsLayout.setVisibility(View.VISIBLE); + LinphoneManager.startProximitySensorForActivity(InCallActivity.this); + mActiveCallHeader.setVisibility(View.GONE); + callsList.setVisibility(View.VISIBLE); + conferenceList.removeAllViews(); + + //Conference Header + displayConferenceHeader(); + + //Conference participant + int index = 1; + for (LinphoneCall call : LinphoneManager.getLc().getCalls()) { + if(call.isInConference()) { + displayConferenceParticipant(index,call); + index++; + } + } + + conferenceList.setVisibility(View.VISIBLE); + } }