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);