diff --git a/res/drawable/conf_speaking.png b/res/drawable/conf_speaking.png
new file mode 100644
index 000000000..2324d81c3
Binary files /dev/null and b/res/drawable/conf_speaking.png differ
diff --git a/res/layout/conf_callee.xml b/res/layout/conf_callee.xml
index f2fa06a33..e3792b58d 100644
--- a/res/layout/conf_callee.xml
+++ b/res/layout/conf_callee.xml
@@ -23,8 +23,9 @@
android:layout_width="wrap_content" android:layout_height="fill_parent"
android:layout_centerVertical="true">
-
-
+
+
+
diff --git a/src/org/linphone/AbstractCalleesActivity.java b/src/org/linphone/AbstractCalleesActivity.java
index 3b40cb296..c88db583b 100644
--- a/src/org/linphone/AbstractCalleesActivity.java
+++ b/src/org/linphone/AbstractCalleesActivity.java
@@ -67,6 +67,7 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li
private Handler callqualityHandler;
private List viewsToUpdateCallQuality;
+ private boolean shouldDisplayWhoIsTalking = false;
@Override
/**
* Called by the child classes AFTER their own onCreate.
@@ -215,6 +216,12 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li
}
protected final void initCallQualityListener() {
+ final int timeToRefresh;
+ if (shouldDisplayWhoIsTalking)
+ timeToRefresh = 100;
+ else
+ timeToRefresh = 1000;
+
callqualityHandler = new Handler();
viewsToUpdateCallQuality = new ArrayList();
callqualityHandler.postDelayed(new Runnable() {
@@ -222,16 +229,24 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li
if (viewsToUpdateCallQuality == null) {
return;
}
-
+
for (View v : viewsToUpdateCallQuality) {
LinphoneCall call = (LinphoneCall) v.getTag();
float newQuality = call.getCurrentQuality();
- updateQualityOfSignalIcon(v, newQuality);
+ updateQualityOfSignalIcon(v, newQuality);
+
+ // We also use this handler to display the ones who speaks
+ ImageView speaking = (ImageView) v.findViewById(R.id.callee_status_speeking);
+ if (shouldDisplayWhoIsTalking && call.getPlayVolume() >= -20) {
+ speaking.setVisibility(View.VISIBLE);
+ } else if (speaking.getVisibility() != View.GONE) {
+ speaking.setVisibility(View.GONE);
+ }
}
- callqualityHandler.postDelayed(this, 1000);
+ callqualityHandler.postDelayed(this, timeToRefresh);
}
- },1000);
+ },timeToRefresh);
}
protected final void registerCallQualityListener(final View v, final LinphoneCall call) {
@@ -241,6 +256,10 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li
v.setTag(call);
viewsToUpdateCallQuality.add(v);
}
+
+ protected final void registerCallSpeakerListener() {
+ shouldDisplayWhoIsTalking = true;
+ }
}
@Override
@@ -282,7 +301,10 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li
void updateQualityOfSignalIcon(View v, float quality)
{
- ImageView qos = (ImageView) v.findViewById(R.id.QoS);
+ ImageView qos = (ImageView) v.findViewById(R.id.callee_status_qos);
+ if (!(qos.getVisibility() == View.VISIBLE)) {
+ qos.setVisibility(View.VISIBLE);
+ }
if (quality >= 4) // Good Quality
{
qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_4));
diff --git a/src/org/linphone/ConferenceDetailsActivity.java b/src/org/linphone/ConferenceDetailsActivity.java
index 08bcea633..a0bb02d8b 100644
--- a/src/org/linphone/ConferenceDetailsActivity.java
+++ b/src/org/linphone/ConferenceDetailsActivity.java
@@ -95,6 +95,8 @@ public class ConferenceDetailsActivity extends AbstractCalleesActivity {
dialog.show();
}
});
+
+ setVisibility(v, R.id.callee_status_qos, true);
// May be greatly sped up using a drawable cache
ImageView pictureView = (ImageView) v.findViewById(R.id.picture);
@@ -102,6 +104,7 @@ public class ConferenceDetailsActivity extends AbstractCalleesActivity {
registerCallDurationTimer(v, call);
registerCallQualityListener(v, call);
+ registerCallSpeakerListener();
return v;
}
diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java
index 91cda16cd..0f7738f8b 100644
--- a/src/org/linphone/IncallActivity.java
+++ b/src/org/linphone/IncallActivity.java
@@ -456,7 +456,7 @@ public class IncallActivity extends AbstractCalleesActivity implements
boolean statusPaused = state== State.Paused || state == State.PausedByRemote;
setVisibility(v, R.id.callee_status_paused, statusPaused);
- setVisibility(v, R.id.QoS, !statusPaused);
+ setVisibility(v, R.id.callee_status_qos, !statusPaused);
final OnLongClickListener showCallActionsLongListener = new OnLongClickListener() {
public boolean onLongClick(View v) {
diff --git a/src/org/linphone/core/LinphoneCallImpl.java b/src/org/linphone/core/LinphoneCallImpl.java
index 802801155..b2b71dcb5 100644
--- a/src/org/linphone/core/LinphoneCallImpl.java
+++ b/src/org/linphone/core/LinphoneCallImpl.java
@@ -147,4 +147,9 @@ class LinphoneCallImpl implements LinphoneCall {
public String toString() {
return "Call " + nativePtr;
}
+
+ private native float getPlayVolume(long nativePtr);
+ public float getPlayVolume() {
+ return getPlayVolume(nativePtr);
+ }
}