diff --git a/res/drawable-hdpi/call_state_delete_default.png b/res/drawable-hdpi/call_state_delete_default.png new file mode 100644 index 000000000..8c1843de8 Binary files /dev/null and b/res/drawable-hdpi/call_state_delete_default.png differ diff --git a/res/drawable-hdpi/call_state_delete_over.png b/res/drawable-hdpi/call_state_delete_over.png new file mode 100644 index 000000000..bc01f8f5d Binary files /dev/null and b/res/drawable-hdpi/call_state_delete_over.png differ diff --git a/res/drawable-hdpi/call_state_ringing_default.png b/res/drawable-hdpi/call_state_ringing_default.png index 1231ba873..f7314e148 100644 Binary files a/res/drawable-hdpi/call_state_ringing_default.png and b/res/drawable-hdpi/call_state_ringing_default.png differ diff --git a/res/drawable-hdpi/cell_call_first_highlight.png b/res/drawable-hdpi/cell_call_first_highlight.png index 1b6d58e0a..99ea085a6 100644 Binary files a/res/drawable-hdpi/cell_call_first_highlight.png and b/res/drawable-hdpi/cell_call_first_highlight.png differ diff --git a/res/drawable-hdpi/cell_call_highlight.png b/res/drawable-hdpi/cell_call_highlight.png index babfa85c3..4aaf77e56 100644 Binary files a/res/drawable-hdpi/cell_call_highlight.png and b/res/drawable-hdpi/cell_call_highlight.png differ diff --git a/res/drawable-hdpi/dialer_alt_disabled.png b/res/drawable-hdpi/dialer_alt_disabled.png new file mode 100644 index 000000000..d85d7fa76 Binary files /dev/null and b/res/drawable-hdpi/dialer_alt_disabled.png differ diff --git a/res/drawable-hdpi/options_add_default.png b/res/drawable-hdpi/options_add_default.png index 59ea816e7..06e0fd2c0 100644 Binary files a/res/drawable-hdpi/options_add_default.png and b/res/drawable-hdpi/options_add_default.png differ diff --git a/res/drawable-hdpi/options_add_default_alt.png b/res/drawable-hdpi/options_add_default_alt.png index 23c776066..8fd635c9c 100644 Binary files a/res/drawable-hdpi/options_add_default_alt.png and b/res/drawable-hdpi/options_add_default_alt.png differ diff --git a/res/drawable-hdpi/options_add_disabled.png b/res/drawable-hdpi/options_add_disabled.png index a8d6f75d8..613b91a2b 100644 Binary files a/res/drawable-hdpi/options_add_disabled.png and b/res/drawable-hdpi/options_add_disabled.png differ diff --git a/res/drawable-hdpi/options_add_disabled_alt.png b/res/drawable-hdpi/options_add_disabled_alt.png index ba19be4db..554e277bc 100644 Binary files a/res/drawable-hdpi/options_add_disabled_alt.png and b/res/drawable-hdpi/options_add_disabled_alt.png differ diff --git a/res/drawable-hdpi/options_add_over.png b/res/drawable-hdpi/options_add_over.png index 06ec439f1..d7b50ebd5 100644 Binary files a/res/drawable-hdpi/options_add_over.png and b/res/drawable-hdpi/options_add_over.png differ diff --git a/res/drawable-hdpi/options_add_over_alt.png b/res/drawable-hdpi/options_add_over_alt.png index 118ef2e51..878f04cd4 100644 Binary files a/res/drawable-hdpi/options_add_over_alt.png and b/res/drawable-hdpi/options_add_over_alt.png differ diff --git a/res/drawable-hdpi/options_default.png b/res/drawable-hdpi/options_default.png index cdec05400..6b1560d1d 100644 Binary files a/res/drawable-hdpi/options_default.png and b/res/drawable-hdpi/options_default.png differ diff --git a/res/drawable-hdpi/options_default_alt.png b/res/drawable-hdpi/options_default_alt.png index 310704721..766cc5458 100644 Binary files a/res/drawable-hdpi/options_default_alt.png and b/res/drawable-hdpi/options_default_alt.png differ diff --git a/res/drawable-hdpi/options_disabled.png b/res/drawable-hdpi/options_disabled.png index 6199d95b9..307775b8b 100644 Binary files a/res/drawable-hdpi/options_disabled.png and b/res/drawable-hdpi/options_disabled.png differ diff --git a/res/drawable-hdpi/options_disabled_alt.png b/res/drawable-hdpi/options_disabled_alt.png index 70c1bc97d..bee08216c 100644 Binary files a/res/drawable-hdpi/options_disabled_alt.png and b/res/drawable-hdpi/options_disabled_alt.png differ diff --git a/res/drawable-hdpi/options_over.png b/res/drawable-hdpi/options_over.png index 4000c7b53..bbad96627 100644 Binary files a/res/drawable-hdpi/options_over.png and b/res/drawable-hdpi/options_over.png differ diff --git a/res/drawable-hdpi/options_over_alt.png b/res/drawable-hdpi/options_over_alt.png index 70fed9af5..e229a55b2 100644 Binary files a/res/drawable-hdpi/options_over_alt.png and b/res/drawable-hdpi/options_over_alt.png differ diff --git a/res/drawable-hdpi/options_selected.png b/res/drawable-hdpi/options_selected.png index ab105de64..a0b05aec2 100644 Binary files a/res/drawable-hdpi/options_selected.png and b/res/drawable-hdpi/options_selected.png differ diff --git a/res/drawable-hdpi/options_selected_alt.png b/res/drawable-hdpi/options_selected_alt.png index 92cc0b473..b737d7e74 100644 Binary files a/res/drawable-hdpi/options_selected_alt.png and b/res/drawable-hdpi/options_selected_alt.png differ diff --git a/res/drawable-hdpi/options_transfer_default.png b/res/drawable-hdpi/options_transfer_default.png index 409193c81..9310c63ea 100644 Binary files a/res/drawable-hdpi/options_transfer_default.png and b/res/drawable-hdpi/options_transfer_default.png differ diff --git a/res/drawable-hdpi/options_transfer_disabled.png b/res/drawable-hdpi/options_transfer_disabled.png index 6e8cd79a2..c40943bf1 100644 Binary files a/res/drawable-hdpi/options_transfer_disabled.png and b/res/drawable-hdpi/options_transfer_disabled.png differ diff --git a/res/drawable-hdpi/options_transfer_over.png b/res/drawable-hdpi/options_transfer_over.png index ea07e8d7f..4101ba4b5 100644 Binary files a/res/drawable-hdpi/options_transfer_over.png and b/res/drawable-hdpi/options_transfer_over.png differ diff --git a/res/drawable-hdpi/pause_off_disabled.png b/res/drawable-hdpi/pause_off_disabled.png new file mode 100644 index 000000000..f6fc66b3c Binary files /dev/null and b/res/drawable-hdpi/pause_off_disabled.png differ diff --git a/res/drawable-land-hdpi/dialer_alt_disabled.png b/res/drawable-land-hdpi/dialer_alt_disabled.png new file mode 100644 index 000000000..00a72ac47 Binary files /dev/null and b/res/drawable-land-hdpi/dialer_alt_disabled.png differ diff --git a/res/drawable-land-hdpi/options_default_alt.png b/res/drawable-land-hdpi/options_default_alt.png index 7399bb1ef..251d184e7 100644 Binary files a/res/drawable-land-hdpi/options_default_alt.png and b/res/drawable-land-hdpi/options_default_alt.png differ diff --git a/res/drawable-land-hdpi/options_disabled_alt.png b/res/drawable-land-hdpi/options_disabled_alt.png index 2bd1f4dc4..c63a4cddd 100644 Binary files a/res/drawable-land-hdpi/options_disabled_alt.png and b/res/drawable-land-hdpi/options_disabled_alt.png differ diff --git a/res/drawable-land-hdpi/options_over_alt.png b/res/drawable-land-hdpi/options_over_alt.png index 019cfa576..487b47905 100644 Binary files a/res/drawable-land-hdpi/options_over_alt.png and b/res/drawable-land-hdpi/options_over_alt.png differ diff --git a/res/drawable-land-hdpi/options_selected_alt.png b/res/drawable-land-hdpi/options_selected_alt.png index 883a6f828..e03a70dc3 100644 Binary files a/res/drawable-land-hdpi/options_selected_alt.png and b/res/drawable-land-hdpi/options_selected_alt.png differ diff --git a/res/drawable-land-hdpi/pause_off_disabled.png b/res/drawable-land-hdpi/pause_off_disabled.png new file mode 100644 index 000000000..11b619fb3 Binary files /dev/null and b/res/drawable-land-hdpi/pause_off_disabled.png differ diff --git a/res/drawable/dialer_alt.xml b/res/drawable/dialer_alt.xml index d18fa3037..2e173a06a 100644 --- a/res/drawable/dialer_alt.xml +++ b/res/drawable/dialer_alt.xml @@ -2,6 +2,8 @@ + diff --git a/res/drawable/pause_off.xml b/res/drawable/pause_off.xml index 3c3479543..20b205848 100644 --- a/res/drawable/pause_off.xml +++ b/res/drawable/pause_off.xml @@ -2,6 +2,8 @@ + diff --git a/res/layout/active_call.xml b/res/layout/active_call.xml index fd7f0cdbc..0714528d2 100644 --- a/res/layout/active_call.xml +++ b/res/layout/active_call.xml @@ -24,6 +24,7 @@ android:textSize="22dp" /> + + + + + + + + + \ No newline at end of file diff --git a/res/values-FR/strings.xml b/res/values-FR/strings.xml index 75a85ea83..4608553cd 100644 --- a/res/values-FR/strings.xml +++ b/res/values-FR/strings.xml @@ -200,6 +200,7 @@ Enregistrement échoué Numéro ou adresse + Conférence diff --git a/res/values/color.xml b/res/values/color.xml index 698993366..b6432d57c 100644 --- a/res/values/color.xml +++ b/res/values/color.xml @@ -5,6 +5,7 @@ #ffcf4c29 #ffb9c4cb #ff5b656f + #ff7e8e9e #ffe4edf2 #ffd8d8d8 diff --git a/res/values/strings.xml b/res/values/strings.xml index 580497725..682a63cf8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -250,6 +250,7 @@ Registration failed Number or address + Conference Add to contacts button diff --git a/src/org/linphone/AudioCallFragment.java b/src/org/linphone/AudioCallFragment.java index 32db60dce..bc50b63e7 100644 --- a/src/org/linphone/AudioCallFragment.java +++ b/src/org/linphone/AudioCallFragment.java @@ -21,7 +21,6 @@ import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.LinphoneCall.State; import org.linphone.core.LinphoneCoreFactory; -import org.linphone.core.Log; import org.linphone.ui.AvatarWithShadow; import android.app.Activity; @@ -49,12 +48,14 @@ public class AudioCallFragment extends Fragment implements OnClickListener { private static final int botMarginIfImage = 25; private static final int rowThickRatio = 85; // Ratio dependent from the image private static final int topMargin = (int) ((rowHeight * rowThickRatio) / 100); + private static final int conferenceMargin = 20; private static final int topMarginWithImage = topMargin + rowImageHeight + botMarginIfImage; private RelativeLayout callsList; private LayoutInflater inflater; private ViewGroup container; private boolean previousCallIsActive = false; + private boolean isConferenceRunning = false; private InCallActivity incallActvityInstance; @@ -71,6 +72,20 @@ public class AudioCallFragment extends Fragment implements OnClickListener { return view; } + private void displayConferenceHeader() { + LinearLayout conferenceHeader = (LinearLayout) inflater.inflate(R.layout.conference_header, container, false); + + ImageView conferenceState = (ImageView) conferenceHeader.findViewById(R.id.conferenceStatus); + conferenceState.setOnClickListener(this); + if (LinphoneManager.getLc().isInConference()) { + conferenceState.setImageResource(R.drawable.play_default); + } else { + conferenceState.setImageResource(R.drawable.pause_default); + } + + callsList.addView(conferenceHeader); + } + private void displayCall(Resources resources, LinearLayout callView, LinphoneCall call, int index) { String sipUri = call.getRemoteAddress().asStringUriOnly(); LinphoneAddress lAddress = LinphoneCoreFactory.instance().createLinphoneAddress(sipUri); @@ -79,9 +94,11 @@ public class AudioCallFragment extends Fragment implements OnClickListener { setContactName(callView, lAddress, sipUri, resources); boolean hide = displayCallStatusIconAndReturnCallPaused(callView, call); displayOrHideContactPicture(callView, pictureUri, hide); - setRowBackgroundAndPadding(callView, resources, index, !hide); + setRowBackgroundAndPadding(callView, resources, index, call, !hide); registerCallDurationTimer(callView, call); previousCallIsActive = !hide; + + callsList.addView(callView); } private void setContactName(LinearLayout callView, LinphoneAddress lAddress, String sipUri, Resources resources) { @@ -98,7 +115,7 @@ public class AudioCallFragment extends Fragment implements OnClickListener { } private boolean displayCallStatusIconAndReturnCallPaused(LinearLayout callView, LinphoneCall call) { - boolean isCallPaused; + boolean isCallPaused, isInConference; ImageView callState = (ImageView) callView.findViewById(R.id.callStatus); callState.setTag(call); callState.setOnClickListener(this); @@ -106,15 +123,23 @@ public class AudioCallFragment extends Fragment implements OnClickListener { if (call.getState() == State.Paused || call.getState() == State.PausedByRemote || call.getState() == State.Pausing) { callState.setImageResource(R.drawable.pause_default); isCallPaused = true; + isInConference = false; } else if (call.getState() == State.OutgoingInit || call.getState() == State.OutgoingProgress || call.getState() == State.OutgoingRinging) { callState.setImageResource(R.drawable.call_state_ringing_default); isCallPaused = false; + isInConference = false; } else { - callState.setImageResource(R.drawable.play_default); + if (isConferenceRunning && call.isInConference()) { + callState.setImageResource(R.drawable.call_state_delete_default); + isInConference = true; + } else { + callState.setImageResource(R.drawable.play_default); + isInConference = false; + } isCallPaused = false; } - return isCallPaused; + return isCallPaused || isInConference; } private void displayOrHideContactPicture(LinearLayout callView, Uri pictureUri, boolean hide) { @@ -127,7 +152,7 @@ public class AudioCallFragment extends Fragment implements OnClickListener { } } - private void setRowBackgroundAndPadding(LinearLayout callView, Resources resources, int index, boolean active) { + private void setRowBackgroundAndPadding(LinearLayout callView, Resources resources, int index, LinphoneCall call, boolean active) { int backgroundResource; if (index == 0) { // backgroundResource = active ? R.drawable.cell_call_first_highlight : R.drawable.cell_call_first; @@ -139,10 +164,16 @@ public class AudioCallFragment extends Fragment implements OnClickListener { callView.findViewById(R.id.row).setBackgroundResource(backgroundResource); if (index != 0) { + int marginIfConferenceAndCallNotInside = 0; + if (isConferenceRunning) { + if (!call.isInConference()) { + marginIfConferenceAndCallNotInside = conferenceMargin; + } + } if (previousCallIsActive) { - callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, topMarginWithImage * index), 0, 0); + callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, (topMarginWithImage * index) + marginIfConferenceAndCallNotInside), 0, 0); } else { - callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, topMargin * index), 0, 0); + callView.setPadding(0, LinphoneUtils.pixelsToDpi(resources, (topMargin * index) + marginIfConferenceAndCallNotInside), 0, 0); } } } @@ -169,8 +200,12 @@ public class AudioCallFragment extends Fragment implements OnClickListener { case R.id.callStatus: LinphoneCall call = (LinphoneCall) v.getTag(); if (incallActvityInstance != null) { - Log.e("InCallActivity instanciated"); - incallActvityInstance.pauseOrResumeCall(call); + incallActvityInstance.pauseOrResumeCall(call, true); + } + break; + case R.id.conferenceStatus: + if (incallActvityInstance != null) { + incallActvityInstance.pauseOrResumeConference(); } break; } @@ -191,8 +226,8 @@ public class AudioCallFragment extends Fragment implements OnClickListener { super.onStart(); // Just to be sure we have incall controls - if (InCallActivity.isInstanciated()) { - InCallActivity.instance().setCallControlsVisibleAndRemoveCallbacks(); + if (incallActvityInstance != null) { + incallActvityInstance.setCallControlsVisibleAndRemoveCallbacks(); } } @@ -213,14 +248,18 @@ public class AudioCallFragment extends Fragment implements OnClickListener { int index = 0; if (LinphoneManager.getLc().getCallsNb() == 0) { - InCallActivity.instance().goBackToDialer(); + incallActvityInstance.goBackToDialer(); return; } + isConferenceRunning = LinphoneManager.getLc().getConferenceSize() > 1; + if (isConferenceRunning) { + displayConferenceHeader(); + index++; + } for (LinphoneCall call : LinphoneManager.getLc().getCalls()) { LinearLayout callView = (LinearLayout) inflater.inflate(R.layout.active_call, container, false); displayCall(resources, callView, call, index); - callsList.addView(callView); index++; } diff --git a/src/org/linphone/InCallActivity.java b/src/org/linphone/InCallActivity.java index 18b560af8..06d442c25 100644 --- a/src/org/linphone/InCallActivity.java +++ b/src/org/linphone/InCallActivity.java @@ -26,7 +26,6 @@ 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.Log; import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration; import org.linphone.ui.Numpad; @@ -385,23 +384,26 @@ public class InCallActivity extends FragmentActivity implements private void pauseOrResumeCall() { LinphoneCore lc = LinphoneManager.getLc(); LinphoneCall call = lc.getCurrentCall(); - pauseOrResumeCall(call); + pauseOrResumeCall(call, false); } - public void pauseOrResumeCall(LinphoneCall call) { - Log.e("Call = " + call); + public void pauseOrResumeCall(LinphoneCall call, boolean leaveConference) { LinphoneCore lc = LinphoneManager.getLc(); if (call != null && LinphoneUtils.isCallRunning(call)) { - Log.e("Pausing call " + call); - lc.pauseCall(call); - pause.setImageResource(R.drawable.pause_on); + if (call.isInConference()) { + lc.removeFromConference(call); + if (lc.getConferenceSize() <= 1) { + lc.leaveConference(); + } + } else { + lc.pauseCall(call); + pause.setImageResource(R.drawable.pause_on); + } } else { List pausedCalls = LinphoneUtils.getCallsInState(lc, Arrays.asList(State.Paused)); if (pausedCalls.size() == 1) { LinphoneCall callToResume = pausedCalls.get(0); - Log.e("CallToResume " + callToResume); if ((call != null && callToResume.equals(call)) || call == null) { - Log.e("Resuming call " + callToResume); lc.resumeCall(callToResume); pause.setImageResource(R.drawable.pause_off); } @@ -423,7 +425,16 @@ public class InCallActivity extends FragmentActivity implements } private void enterConference() { - //TODO + LinphoneManager.getLc().addAllToConference(); + } + + public void pauseOrResumeConference() { + LinphoneCore lc = LinphoneManager.getLc(); + if (lc.isInConference()) { + lc.leaveConference(); + } else { + lc.enterConference(); + } } public void displayVideoCallControlsIfHidden() { diff --git a/src/org/linphone/StatusFragment.java b/src/org/linphone/StatusFragment.java index 925ca4557..c9f46c549 100644 --- a/src/org/linphone/StatusFragment.java +++ b/src/org/linphone/StatusFragment.java @@ -277,9 +277,11 @@ public class StatusFragment extends Fragment { super.onResume(); LinphoneCall call = LinphoneManager.getLc().getCurrentCall(); - if (isInCall && call != null) { + if (isInCall && (call != null || LinphoneManager.getLc().getConferenceSize() > 1)) { startCallQuality(); - refreshStatusItems(call, call.getCurrentParamsCopy().getVideoEnabled()); + if (call != null) { + refreshStatusItems(call, call.getCurrentParamsCopy().getVideoEnabled()); + } // We are obviously connected statusLed.setImageResource(R.drawable.led_connected);