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