From 0807e6c5cd7e12a08b1ca7fcbf4c94e39864418f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 17 Jul 2012 15:24:29 +0200 Subject: [PATCH] Added context menu for history log, chat threads and chat messages --- res/drawable/call_disabled.png | Bin 0 -> 2116 bytes res/drawable/call_state_outgoing_default.png | Bin 0 -> 1502 bytes res/drawable/chat_send_message.xml | 2 ++ res/drawable/chat_send_message_disabled.png | Bin 0 -> 2879 bytes res/layout/dialer.xml | 4 +-- res/values/strings.xml | 1 + src/org/linphone/ChatFragment.java | 29 +++++++++++++++++++ src/org/linphone/ChatListFragment.java | 22 ++++++++++++++ src/org/linphone/ChatStorage.java | 7 +++++ src/org/linphone/HistoryFragment.java | 21 ++++++++++++++ src/org/linphone/LinphoneActivity.java | 8 +++++ src/org/linphone/ui/Digit.java | 13 +++------ 12 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 res/drawable/call_disabled.png create mode 100644 res/drawable/call_state_outgoing_default.png create mode 100644 res/drawable/chat_send_message_disabled.png diff --git a/res/drawable/call_disabled.png b/res/drawable/call_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5600f19459666f1cd62aae1c6e3329a384e7b000 GIT binary patch literal 2116 zcmZ9NdpHy98^`B3$0)B7qEt>(R8BdcnL{LIhP52(jn*QPOwP%a-j{?>nUFT8VUELS zWO_rg#eRuqC`Qbj=I~Cx-(SDydG70e?$7hRuIIY$>$#q9y2k}aX$eIM001BjcCz#2 zXBs~+VxoJy>Uu0ci3Ykj+5vX=<||TpHlK*!a`L?m07%O1g#h4rp#mQQBf)O=!2gKK zOPxLuU#o}UlOeF3wb$J-_SfA@a?vWiOFo9_C$R5*9R;mx=~(o2vnJ09=flk~-0+>Y zf>uk;%_??LNi^m&2d@SlGrg!>lxd}hKA&oPMJ{W8Tt4k74o8bWb!OC#pu2 znl2~5777#T=T0g=vXJ4G`u$S4L9Q%b<42xix&_&1- z>`cZqAh^pkd~vPfQezf3YqTr-(EN*DJ_^bzn~I-4G|4ZD{$>sJMJVU*>d8o+8T zKvpLKAs{RXAPb5ew5kClQT_l3OCE*t>%B@uR)=5yDwZt|67c$;k_QFI?i z$pnmuf@f`>;I5Lpx`Bm7l?EpR7D3mThI@?!V?1D%q{gV! z3m8uA)2D|;^_iaKF z@bV+wX(ge5enCyG_fLP``tjrNc<$K`gUL^uD<`_TZ2EHXJBikA7E#cO2PV9N(hOOSIrE=p=ev^uC;e1}>%VG;?}+ zixsb}y0RF1fAO=|+vbXN46C6a`P;^6ua{A~V_&FKGalei%+X!NbJacfA%jHZ2HT1j z@y1o(s5kwEu*)Y_Vr$CVgqu>**$*O6B0QAzMyQ$j5w{-Ir@vyAG{Ko5n6-N>Qnew0 z-$Lv~iz&%&5N)GV4 zF+Aj2EU45jEMtfh{K5Nqpn*Y;FwV>NBv@5-?ru1bk$7zMraf7OhX}}79iivGGfOpQ z71#LpY84DSW!|Z;T;I5;U0UlneD7I!NGg4wf9j{PI-FhbxE@#v#_ zCURcdPd{4F9FdC$xf?;Ir?`>oP;<>nOo%Uqp`v_!yxi%8O{vWfZym77{q|;m z<-)3iz1n_=G_4w1whs+*k6*lr3ND@C8opyPnGS3EJ{|EBqd}@JZOADu$f^c?sLJXi z#0Lmeujz}@H#CGCh@GU1qWa^y=K_TZM2j1!GLu9E$vHH_b1mDQW`-p9m5o4mpM?gU zfdJaXX|uDMy^j+GnYK*{K;vYESAl##cqK1vMG<_n_to>)Zv?13`d{>$@)6$yej~n7 zz{qEpInB`lYm@;Ts^h~lT|q=JF?W1tBhDiQaYn>XRjoH1zQs1q^rr`e$8OB97`W~R pW1pWQrR7pl${dg^f22$)bcPqoPi%%9sohkt~>* zC`JgPiy%4@2N`I_2NEIj1vG+;;#6?34Bs-g8Ad4^-NxFrYkTi`{6O2?yLD@~UZjgB zx$QZoj$p*wY4<>0L8_{tfr=hv<4ToxXFVLKYG~h<4e3g zX$A>~!nCxBc?am*K_gWMOZ8rp{c1!Q+Q3>Da(Aia%@h|TH5XQ+X|mr_9Ot* z*4A>ZEv^Z;BuPF1(Cc*rt~5@VYR;JQ?bFLwykAjK5%#RrYGnzd@ntJk{bfqYn5`2< zNU}WSyuYvKl+^Ej_2`jrniEYb002T{85@$*3QQ9xpI!cJ(Taou=RCTEnJy{Ql$u#< zd13XQg$oy&5(_*^+~8mW4Cd0TS@-u8Jy-n1od*wUCFXc12nNBFa@_LLnwq%4OG-*u zoKZ!NRWho$AR1n@SW6v6MV72lN0sX8YG$=sX~&KoNyZ5&B|kU(zOA?G`gy&=F~Lf*q2VS9@1+Es;l-VOI}|;wQA3<4`Px^V`C!&fR>il3{X5-IsTMzv!AwFtYz+X zW$R}}1$R1~00582BWqp>jjbg+J=C^t!=~p)1lQ~J005K8ghXmim+xTdhPMyx-@o5D zVmK58hD2-KuKuF$&iv+jZ|jE-4FRX1t_49%Fl-8a>i=xJ*06E&mbX;kjIo5YI1xaK zU~$dq+PS7|(}^wbR7@Hq6>-pNNs$X_GcgB(*ZGYlRK8q;tdk66mEs8%N+xPSqPpiKoHU2Q=$3Qia!H%95J z5Tw%bp_XnoY}#G<(HAOkPJA?XSNB6MQvR-Rn{sj*A;~GBmDd1}GgFOuyDE2H0D$uH zawbHQ$EfpTocme{tb`T?NU28lsfqfML(l-QefxIOg)E?~>=(*-1YD0C{OZ8vVXMQLGiSnPvmrZs zsu)p=M2gKw5lqj>DosuMR z&N)JdEJ;3}-!Dv=Hfw%rTDoy4X>c)2y$+=`ZatL99rnwY?mJU=y8AzUuQG4Z(x&Nm z-Ti<%l#_azU@{4R2cg|vjvW}`L4`A_p7kB6Y=%$dUy&f-R+-W3Waz1^LiT^;r} ze>!ve>(KeRbLX=9`g%>@erWQ9oRgE|Wn50`x#6h3cBSo&bHCKr0YF|}o?y4zslB}& ziP{(dgDRWOn>W7xtj*2M6~_&1etteHC@2_T7QR#MUq()E_Qg^CNdN!<07*qoM6N<$ Ef@FfvMF0Q* literal 0 HcmV?d00001 diff --git a/res/drawable/chat_send_message.xml b/res/drawable/chat_send_message.xml index afcfe5074..fc995665b 100644 --- a/res/drawable/chat_send_message.xml +++ b/res/drawable/chat_send_message.xml @@ -2,6 +2,8 @@ + diff --git a/res/drawable/chat_send_message_disabled.png b/res/drawable/chat_send_message_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e16748ec1b0ff7d69b5b0103a7e4e7e544494120 GIT binary patch literal 2879 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 + android:orientation="vertical"> diff --git a/res/values/strings.xml b/res/values/strings.xml index 1cb112af9..d3ef2cac2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -254,6 +254,7 @@ Example: john if your account is john@sip.linphone.org sip.linphone.org if your account is john@sip.linphone.org +Delete Chat Add to contacts CONNECTED diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index c2dc50499..669fe6bfa 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -29,7 +29,10 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -102,6 +105,18 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneO return view; } + private void invalidate() { + messagesLayout.removeAllViews(); + List messagesList = LinphoneActivity.instance().getChatMessages(sipUri); + + previousMessageID = -1; + for (ChatMessage msg : messagesList) { + displayMessage(msg.getId(), msg.getMessage(), msg.getTimestamp(), msg.isIncoming(), messagesLayout); + } + + scrollToEnd(); + } + private void displayMessage(final int id, final String message, final String time, final boolean isIncoming, final RelativeLayout layout) { mHandler.post(new Runnable() { @Override @@ -109,10 +124,24 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneO BubbleChat bubble = new BubbleChat(layout.getContext(), id, message, time, isIncoming, previousMessageID); previousMessageID = id; layout.addView(bubble.getView()); + registerForContextMenu(bubble.getView()); } }); } + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + menu.add(0, v.getId(), 0, getString(R.string.delete)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + LinphoneActivity.instance().deleteMessage(item.getItemId()); + invalidate(); + return true; + } + @Override public void onResume() { super.onResume(); diff --git a/src/org/linphone/ChatListFragment.java b/src/org/linphone/ChatListFragment.java index 2332cc7a6..a1d0b2fbe 100644 --- a/src/org/linphone/ChatListFragment.java +++ b/src/org/linphone/ChatListFragment.java @@ -24,11 +24,15 @@ import org.linphone.core.LinphoneCoreFactory; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; @@ -53,6 +57,7 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte View view = inflater.inflate(R.layout.chatlist, container, false); chatList = (ListView) view.findViewById(R.id.chatList); chatList.setOnItemClickListener(this); + registerForContextMenu(chatList); edit = (ImageView) view.findViewById(R.id.edit); edit.setOnClickListener(this); @@ -74,6 +79,23 @@ public class ChatListFragment extends Fragment implements OnClickListener, OnIte mConversations = LinphoneActivity.instance().getChatList(); chatList.setAdapter(new ChatListAdapter()); } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + menu.add(0, v.getId(), 0, getString(R.string.delete)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); + String sipUri = (String) info.targetView.getTag(); + + LinphoneActivity.instance().removeFromChatList(sipUri); + mConversations = LinphoneActivity.instance().getChatList(); + chatList.setAdapter(new ChatListAdapter()); + return true; + } @Override public void onClick(View v) { diff --git a/src/org/linphone/ChatStorage.java b/src/org/linphone/ChatStorage.java index 7e43de391..4cee53f23 100644 --- a/src/org/linphone/ChatStorage.java +++ b/src/org/linphone/ChatStorage.java @@ -20,6 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import java.util.ArrayList; import java.util.List; +import org.linphone.core.Log; + import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -103,6 +105,11 @@ public class ChatStorage { return chatList; } + public void deleteMessage(int id) { + db.delete(TABLE_NAME, "id LIKE " + id, null); + Log.d("db.delete(TABLE_NAME, \"id LIKE \" + " + id + ", null);"); + } + class ChatHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; diff --git a/src/org/linphone/HistoryFragment.java b/src/org/linphone/HistoryFragment.java index d2d38e999..97767af47 100644 --- a/src/org/linphone/HistoryFragment.java +++ b/src/org/linphone/HistoryFragment.java @@ -31,11 +31,15 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.ImageView; @@ -60,6 +64,7 @@ public class HistoryFragment extends Fragment implements OnClickListener, OnItem historyList = (ListView) view.findViewById(R.id.historyList); historyList.setOnItemClickListener(this); + registerForContextMenu(historyList); allCalls = (ImageView) view.findViewById(R.id.allCalls); allCalls.setOnClickListener(this); @@ -85,6 +90,22 @@ public class HistoryFragment extends Fragment implements OnClickListener, OnItem historyList.setAdapter(new CallHistoryAdapter(getActivity().getApplicationContext())); } + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + menu.add(0, v.getId(), 0, getString(R.string.delete)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); + LinphoneCallLog log = mLogs.get(info.position); + LinphoneManager.getLc().removeCallLog(log); + mLogs = Arrays.asList(LinphoneManager.getLc().getCallLogs()); + historyList.setAdapter(new CallHistoryAdapter(getActivity().getApplicationContext())); + return true; + } + @Override public void onClick(View v) { int id = v.getId(); diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 379a97a59..1ccd82f92 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -579,6 +579,14 @@ public class LinphoneActivity extends FragmentActivity implements OnClickListene return currentFragment; } + public void deleteMessage(int id) { + if (chatStorage == null) { + return; + } + + chatStorage.deleteMessage(id); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_FIRST_USER && requestCode == SETTINGS_ACTIVITY) { diff --git a/src/org/linphone/ui/Digit.java b/src/org/linphone/ui/Digit.java index 943ebb70a..cce34ff74 100644 --- a/src/org/linphone/ui/Digit.java +++ b/src/org/linphone/ui/Digit.java @@ -18,7 +18,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package org.linphone.ui; -import org.linphone.DialerFragment; import org.linphone.LinphoneManager; import org.linphone.LinphoneService; import org.linphone.R; @@ -49,7 +48,9 @@ public class Digit extends Button implements AddressAware { int after) { super.onTextChanged(text, start, before, after); - if (text == null || text.length() < 1) return; + if (text == null || text.length() < 1) { + return; + } DialKeyListener lListener = new DialKeyListener(); setOnClickListener(lListener); @@ -57,11 +58,9 @@ public class Digit extends Button implements AddressAware { if ("0+".equals(text)) { setOnLongClickListener(lListener); - } } - public Digit(Context context, AttributeSet attrs, int style) { super(context, attrs, style); setLongClickable(true); @@ -70,7 +69,6 @@ public class Digit extends Button implements AddressAware { public Digit(Context context, AttributeSet attrs) { super(context, attrs); setLongClickable(true); - } public Digit(Context context) { @@ -78,9 +76,6 @@ public class Digit extends Button implements AddressAware { setLongClickable(true); } - - - private class DialKeyListener implements OnClickListener, OnTouchListener, OnLongClickListener { final CharSequence mKeyCode; boolean mIsDtmfStarted; @@ -104,7 +99,7 @@ public class Digit extends Button implements AddressAware { LinphoneCore lc = LinphoneManager.getLc(); lc.stopDtmf(); mIsDtmfStarted =false; - if (lc.isIncall() && !DialerFragment.instance().mVisible) { + if (lc.isIncall()) { lc.sendDtmf(mKeyCode.charAt(0)); } }