From 8f94e5f38bc074bb47db3b56e9c29ee8982178ea Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 15 Mar 2010 18:04:58 +0100 Subject: [PATCH] add support for mute/speaker --- res/drawable/mic_active.png | Bin 0 -> 1712 bytes res/drawable/mic_muted.png | Bin 0 -> 2098 bytes res/drawable/speaker_32_off.png | Bin 0 -> 615 bytes res/drawable/speaker_32_on.png | Bin 0 -> 569 bytes res/layout/dialer.xml | 90 ++++++++++---------- res/values/strings.xml | 1 + res/xml/preferences.xml | 25 ++++-- src/org/linphone/DialerActivity.java | 43 +++++++++- src/org/linphone/HistoryActivity.java | 2 +- src/org/linphone/LinphoneActivity.java | 41 ++++++--- src/org/linphone/LinphoneService.java | 5 +- src/org/linphone/core/LinphoneCore.java | 10 +++ src/org/linphone/core/LinphoneCoreImpl.java | 11 ++- 13 files changed, 157 insertions(+), 71 deletions(-) create mode 100644 res/drawable/mic_active.png create mode 100644 res/drawable/mic_muted.png create mode 100644 res/drawable/speaker_32_off.png create mode 100644 res/drawable/speaker_32_on.png diff --git a/res/drawable/mic_active.png b/res/drawable/mic_active.png new file mode 100644 index 0000000000000000000000000000000000000000..6625269932c25f6b9567d12822b961634a9b33b7 GIT binary patch literal 1712 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 literal 0 HcmV?d00001 diff --git a/res/drawable/speaker_32_off.png b/res/drawable/speaker_32_off.png new file mode 100644 index 0000000000000000000000000000000000000000..e93ae232f1f89192f3c27bd09a17e456f51ffb88 GIT binary patch literal 615 zcmV-t0+{`YP)7lp&1wHyFc(Ho!UD}I?}7cK=Hu-==D{VGTy&hI6P8M))a>l+ z9Vz90ya2%*o+p)3`NhS>XSrOi7z6=A21hGT zD2gz~h<3X@Fg`y1V19o7vDSJp48tF>i3?;hnJY6hGt0$daT357!_d%>n@*=kI-Slh z@ktAaX0tgmH8u4xj$_#q&{}hJbadhdDNnt7e$FYB6Yz4YIJ3FsE&+~cxm>d(Rvlm;r~xm4=V2JW+}+)MRjbv4iHV6qDwP`0TKDdW zSzTRy0yKcW<**gdz*pc4@cH}q0oXq{IC!_Yxp`P96mBb}273Z)Yio%LoP^=HGKZ~J ztFf`M@z!+64Aphp+@7{~GZt*xy$TI*}R@87Iet5yO@;sB$-{cJY- z2=K8ONRl3zBybf_z$c)UaDHpfXBNEVzu+526Vu`Nq;J;%0000=G`P) zO8GGN2^W!fMD(Kw7ZEt;z+8R&l^d|ueo@tzM1;LhnfXja;Jt^4z*>tKBUH6AK&1x8 z4Xr@LI`lq!8r$G3{({{#yde&YM|HaiT57XS{P%B2Efc?D8vuoi;PSOrfO42I=6Vgljom&-1LfJ4!*9E<)-%A&*E24B z8*J@wL6Rie?RJ+$v;(jMu!}KjvD>om3Q(zmBuRcxr_-+hP5=-9tk>&DqtWQ~a5#LE z=ea2kV|i4yN>!bzwn~1is?R5r$)|R^JxkLxOVczl{K5qEQD|vfIS4o7*Dp_?c4M7^PeGvOhgU`Py$KvJbyJ93@*I)m&@hy zumF1qQPpRQ#p3;Dv#In$QoB@@RW*$<-s@9;)KLf1AIy&ks}+pNyZ`_I07*qoM6N<$ Hf;BcaL-hkZ literal 0 HcmV?d00001 diff --git a/res/layout/dialer.xml b/res/layout/dialer.xml index b2af87cec..db93411f3 100644 --- a/res/layout/dialer.xml +++ b/res/layout/dialer.xml @@ -3,9 +3,9 @@ android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> - + + + @@ -13,77 +13,81 @@ android:layout_weight="1" android:id="@+id/DialerRow01" android:layout_width="fill_parent"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="0.33"> + android:id="@+id/ButtonStar" android:layout_weight="0.33"> + android:layout_height="fill_parent" android:text="0+" android:id="@+id/Button00" android:layout_weight="0.33"> + android:text="#" android:layout_weight="0.33"> - + + + + + + + + + - - - - - - - - - - - + android:layout_weight="0.25" android:id="@+id/Decline"> + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index f5abae018..8c8fbed04 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,5 +1,6 @@ + Audio Exit Prefix Advanced diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index ddce3aae4..c160892aa 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -1,11 +1,18 @@ - - - - - - - - + + + + + + + + + + + diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java index a600c37f6..7124eabf7 100644 --- a/src/org/linphone/DialerActivity.java +++ b/src/org/linphone/DialerActivity.java @@ -36,6 +36,8 @@ import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; @@ -44,6 +46,7 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { private TextView mAddress; private TextView mStatus; private ImageButton mCall; + private ImageButton mDecline; private ImageButton mHangup; private Button mZero; private Button mOne; @@ -57,6 +60,10 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { private Button mNine; private Button mStar; private Button mHash; + + private LinearLayout mCallControlRow; + private LinearLayout mInCallControlRow; + private static DialerActivity theDialer; private String mDisplayName; @@ -120,16 +127,19 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { } }); + mDecline= (ImageButton) findViewById(R.id.Decline); mHangup = (ImageButton) findViewById(R.id.HangUp); - mHangup.setEnabled(false); - mHangup.setOnClickListener(new OnClickListener() { + + OnClickListener lHangupListener = new OnClickListener() { public void onClick(View v) { LinphoneCore lLinphoneCore = LinphoneService.instance().getLinphoneCore(); lLinphoneCore.terminateCall(); } - }); + }; + mHangup.setOnClickListener(lHangupListener); + mDecline.setOnClickListener(lHangupListener); class DialKeyListener implements OnClickListener { final String mKeyCode; @@ -143,7 +153,18 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { } }; - + mCallControlRow = (LinearLayout) findViewById(R.id.CallControlRow); + mInCallControlRow = (LinearLayout) findViewById(R.id.IncallControlRow); + mInCallControlRow.setVisibility(View.GONE); + + if (LinphoneService.isready()) { + if (LinphoneService.instance().getLinphoneCore().isIncall()) { + mCall.setEnabled(false); + mHangup.setEnabled(!mCall.isEnabled()); + mCallControlRow.setVisibility(View.GONE); + mInCallControlRow.setVisibility(View.VISIBLE); + } + } mZero = (Button) findViewById(R.id.Button00) ; if (mZero != null) { @@ -172,6 +193,7 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { mHash = (Button) findViewById(R.id.ButtonHash); mHash.setOnClickListener(new DialKeyListener(mAddress,'#')); } + mStatus = (TextView) findViewById(R.id.status_label); theDialer = this; @@ -180,6 +202,11 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { } } + + @Override + protected void onResume() { + super.onResume(); + } public void authInfoRequested(LinphoneCore lc, String realm, String username) { // TODO Auto-generated method stub @@ -202,12 +229,18 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { public void generalState(LinphoneCore lc, GeneralState state) { switch(state) { + case GSTATE_POWER_ON: + mCall.setEnabled(!LinphoneService.instance().getLinphoneCore().isIncall()); + mHangup.setEnabled(!mCall.isEnabled()); + break; case GSTATE_REG_OK: { break; } case GSTATE_CALL_OUT_INVITE: { //de-activate green button mCall.setEnabled(false); + mCallControlRow.setVisibility(View.GONE); + mInCallControlRow.setVisibility(View.VISIBLE); } case GSTATE_CALL_IN_INVITE: { // activate red button @@ -256,6 +289,8 @@ public class DialerActivity extends Activity implements LinphoneCoreListener { } private void exitCallMode() { + mCallControlRow.setVisibility(View.VISIBLE); + mInCallControlRow.setVisibility(View.GONE); mCall.setEnabled(true); mHangup.setEnabled(false); setVolumeControlStream(AudioManager.USE_DEFAULT_STREAM_TYPE); diff --git a/src/org/linphone/HistoryActivity.java b/src/org/linphone/HistoryActivity.java index ee60fc7e9..821c2758d 100644 --- a/src/org/linphone/HistoryActivity.java +++ b/src/org/linphone/HistoryActivity.java @@ -97,7 +97,7 @@ public class HistoryActivity extends ListActivity { lView = mInflater.inflate(R.layout.history_cell, parent,false); } - LinphoneCallLog lLog = mLogs.get(mLogs.size()-position-1); + LinphoneCallLog lLog = mLogs.get(position); LinphoneAddress lAddress; TextView lFirstLineView = (TextView) lView.findViewById(R.id.history_cell_first_line); TextView lSecondLineView = (TextView) lView.findViewById(R.id.history_cell_second_line); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 70292b4fb..f649ff749 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -61,6 +61,11 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener super.onCreate(savedInstanceState); setContentView(R.layout.main); theLinphoneActivity = this; + // start linphone as background + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setClass(this, LinphoneService.class); + startService(intent); + mMainFrame = (FrameLayout) findViewById(R.id.main_frame); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); @@ -70,7 +75,7 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener } mAudioManager = ((AudioManager)getSystemService(Context.AUDIO_SERVICE)); - TabHost lTabHost = getTabHost(); // The activity TabHost + TabHost lTabHost = getTabHost(); // The activity TabHost TabHost.TabSpec spec; // Reusable TabSpec for each tab @@ -100,17 +105,16 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener lTabHost.addTab(spec); lTabHost.setCurrentTabByTag("dialer"); - // start linphone as background - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClass(this, LinphoneService.class); - startService(intent); + } + @Override - protected void onDestroy() { - super.onDestroy(); + protected void onPause() { + // TODO Auto-generated method stub + super.onPause(); if (isFinishing()) { - //restaure audio settings + //restaure audio settings if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.DONUT) { mAudioManager.setMode(AudioManager.MODE_NORMAL); mAudioManager.setRouting(AudioManager.MODE_NORMAL, @@ -121,8 +125,21 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClass(this, LinphoneService.class); stopService(intent); + theLinphoneActivity = null; } - theLinphoneActivity = null; + + } + + @Override + protected void onStop() { + // TODO Auto-generated method stub + super.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -182,15 +199,15 @@ public class LinphoneActivity extends TabActivity implements SensorEventListener } public void onAccuracyChanged(Sensor sensor, int accuracy) { - //nop + //nop } public void onSensorChanged(SensorEvent event) { WindowManager.LayoutParams lAttrs =getWindow().getAttributes(); - if (event.values[0] == 0) { + if (LinphoneService.instance().getLinphoneCore().isIncall() && event.values[0] == 0) { lAttrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; mMainFrame.setVisibility(View.INVISIBLE); - } else if (event.values[0] == 1) { + } else if (mMainFrame.getVisibility() != View.VISIBLE && event.values[0] == 1) { lAttrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); mMainFrame.setVisibility(View.VISIBLE); } diff --git a/src/org/linphone/LinphoneService.java b/src/org/linphone/LinphoneService.java index c61e55f93..186a9064a 100644 --- a/src/org/linphone/LinphoneService.java +++ b/src/org/linphone/LinphoneService.java @@ -60,7 +60,9 @@ public class LinphoneService extends Service implements LinphoneCoreListener { Timer mTimer = new Timer("Linphone scheduler"); private Handler mHandler = new Handler() ; - + static boolean isready() { + return (theLinphone!=null); + } static LinphoneService instance() { if (theLinphone == null) { throw new RuntimeException("LinphoneActivity not instanciated yet"); @@ -83,6 +85,7 @@ public class LinphoneService extends Service implements LinphoneCoreListener { , new File(LINPHONE_FACTORY_RC) , null); + mLinphoneCore.setSoftPlayLevel(3); initFromConf(); TimerTask lTask = new TimerTask() { diff --git a/src/org/linphone/core/LinphoneCore.java b/src/org/linphone/core/LinphoneCore.java index 1f8e73449..915062118 100644 --- a/src/org/linphone/core/LinphoneCore.java +++ b/src/org/linphone/core/LinphoneCore.java @@ -136,5 +136,15 @@ public interface LinphoneCore { * destroy linphone core and free all underlying resources */ public void destroy(); + /** + * Allow to control play level before entering sound card: + * @param level in db + */ + public void setSoftPlayLevel(float gain); + /** + * get play level before entering sound card: + * @return level in db + */ + public float getSoftPlayLevel(); } diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java index b1dedfeb4..81685e886 100644 --- a/src/org/linphone/core/LinphoneCoreImpl.java +++ b/src/org/linphone/core/LinphoneCoreImpl.java @@ -51,7 +51,9 @@ class LinphoneCoreImpl implements LinphoneCore { private native long getCallLog(long nativePtr,int position); private native int getNumberOfCallLogs(long nativePtr); private native void delete(long nativePtr); - private native void setNetworkStateReachable(long nativePtr,boolean isReachable); + private native void setNetworkStateReachable(long nativePtr,boolean isReachable); + private native void setSoftPlayLevel(long nativeptr, float gain); + private native float getSoftPlayLevel(long nativeptr); LinphoneCoreImpl(LinphoneCoreListener listener, File userConfig,File factoryConfig,Object userdata) throws IOException { @@ -159,4 +161,11 @@ class LinphoneCoreImpl implements LinphoneCore { public void setNetworkStateReachable(boolean isReachable) { setNetworkStateReachable(nativePtr,isReachable); } + public void setSoftPlayLevel(float gain) { + setSoftPlayLevel(nativePtr,gain); + + } + public float getSoftPlayLevel() { + return getSoftPlayLevel(nativePtr); + } }