From b93bb69c285d9dc32d4abdb4382bec0544dcc296 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Mon, 16 Jul 2012 21:35:32 -0700 Subject: [PATCH] Restyle conversation list view. 1. New look for quick contact badges. 2. No more unread indicator, replace with bolded text. 3. Style message count with color rather than parens. 4. Remove "New Message" item, add as item in action bar instead. --- AndroidManifest.xml | 1 + .../ic_menu_msg_compose_holo_dark.png | Bin 0 -> 844 bytes .../ic_menu_search_holo_dark.png | Bin 0 -> 1288 bytes res/drawable-hdpi/ic_menu_trash_holo_dark.png | Bin 0 -> 1062 bytes .../ic_menu_msg_compose_holo_dark.png | Bin 0 -> 669 bytes .../ic_menu_search_holo_dark.png | Bin 0 -> 881 bytes res/drawable-mdpi/ic_menu_trash_holo_dark.png | Bin 0 -> 790 bytes .../ic_menu_msg_compose_holo_dark.png | Bin 0 -> 961 bytes .../ic_menu_search_holo_dark.png | Bin 0 -> 1722 bytes .../ic_menu_trash_holo_dark.png | Bin 0 -> 1329 bytes res/drawable/ic_sms_unread_msg_indicator.png | Bin 265 -> 0 bytes res/layout/conversation_header_view.xml | 21 ++--- .../securesms/ConversationHeaderView.java | 40 +++++---- src/org/thoughtcrime/securesms/SecureSMS.java | 82 ++++++++++-------- 14 files changed, 75 insertions(+), 69 deletions(-) create mode 100644 res/drawable-hdpi/ic_menu_msg_compose_holo_dark.png create mode 100644 res/drawable-hdpi/ic_menu_search_holo_dark.png create mode 100644 res/drawable-hdpi/ic_menu_trash_holo_dark.png create mode 100644 res/drawable-mdpi/ic_menu_msg_compose_holo_dark.png create mode 100644 res/drawable-mdpi/ic_menu_search_holo_dark.png create mode 100644 res/drawable-mdpi/ic_menu_trash_holo_dark.png create mode 100644 res/drawable-xhdpi/ic_menu_msg_compose_holo_dark.png create mode 100644 res/drawable-xhdpi/ic_menu_search_holo_dark.png create mode 100644 res/drawable-xhdpi/ic_menu_trash_holo_dark.png delete mode 100644 res/drawable/ic_sms_unread_msg_indicator.png diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f35df1657e..9689c0005d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -13,6 +13,7 @@ diff --git a/res/drawable-hdpi/ic_menu_msg_compose_holo_dark.png b/res/drawable-hdpi/ic_menu_msg_compose_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..59104581598698ebf694c34d21ef806cf49fa596 GIT binary patch literal 844 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;XrL6o-U3d5r^MSx6c=L6gXO6y}ewmPsz36hmzi3 z))xy4=2{6YT(D%pqwWh6nL3%Qw4|agxotTipn0rI_ISCq$nIzV-rOwz7Q5n)j(2+X z-+TLJ-kfQDBe~yJq=A8jMfTIO4(0#$d`vvdZD*_s5;;08o~wItX5>`xINviUn}7S_ z@jak}-`&lFm>lz(QyDarlXbGzgn?;qqXu6EJdzP@p{ukC_AlfTuypS&nFc7}UlA_syL;_73%xm?WF9tg)|ZKR zbVM>FcywKM+Rgf*?|ZaZhFsUttQ%9-J`~!t<#3Ypi7uIzh8a^BW{2xmHr_cDoACOc z2b08izmTA^3n_QP4c&WQB(gB2@$5)Dpj&JBwk(%bbR^|v@>*? zMoa8A3r+3qT4#kOXs+3O)k)^Vth;^LH@044HhXdXd9<{w?%P*Z%bYrNj=cJzR@bqx z!t9sR5`oB+iL1VcestqGnz853o4KqCtuOk&Ct0*Tnkb<8Dah62LuCi+M&-80$19da zUC_DyKcweafsL@*6!YJ$C!BS<%abhjb-q4jdD+wKqS!=rRt<)WNxk~e`l=Wq2sI6V#q*7h0y7OpJtH@o3MLdg4f608Z)a86s%_nSy2R2TcVWr5$W4Z3W)~+oKXEytMs=jIGT=W0olru%k_!pmSSR(%T za`w6dt;J5~-!POeH(2m;Qd!W}^V=PYPVp>DoBV8UX@tZTCvA`vo7?g|9lj zTxr(JIqb2@d)DiT$3DHBHgBi)x1$Angg&o+uO%ItuUX}EN1{3@{!Le-kz-k^<02m> z`P)mcOX)`~(wlsGiN_?LzFD*PChR-Jr+&I%hDYaR>z#_{Z?3++Hm-EFQ|v^k%&mC~ zkLPZ`A-TqUf!g~g>!-E)7bZqzt=@V}^xKas6YS@jKHxInc{}u##++?;@@DsVF50#E zHcQTKYfH}Bd0#d#&OBt8-g-x=TlB}tve$QCcXZdL?Z0aGDQxj2kIRh9uDFC(pUBlS zQ&23v#<~CJf!%%)8MCcrO&5gw_UD#ub1zxdE%o%Okhw&O=CMDiM>=M0dKZx}yY!e= z#s25Fm94_dmcEYSn*2;tqb26<<#`1$aiygWU$%U&UNJ>|rikLIl?&JLWULF$_Tx-8 zOI*$)=-L1;Fyx1l&avFo0y&&l$w}QS$Hzl2B?U^)78&qol`;+0PyTgeEGA{JW^gDeCHR-zJ?tFn@%vVc%jGG`oP`kh=ebX=dx<6+SfZ? z+@349JpX&{l~_KLFKd5Y|2cpCDyyT;kxH483bzU_`Z}&(ENQq}C+*ljZT@R(&uaKM z#g|0fYgEvVD>=7q#-i?d=W8#yI>u!=9lIU3)ogM0S;hC&Te=(X78z`L<}H6)Xp-&u zUuQN%^F?ti%bwhla&~=J<3yDh!;qB|l00pnR-T%zwQ|X`#U}gzdc9(^ar3)Y$`dG* zm1FU4!{xlnS)jZ*NTC$$6)JrFxPsv$J{3 zm$}?|o=T-kC%UH3Ee?`cA*zyk-|obU)X4K~PsHVSsw}^x>Js^JTJXA8Cxeyw(pEbe zngmqeo2_^9lw)dc(f*mSF)ukICAL0%Rw=OKNuMmUvg_R`uUry+0vAsDYV&U1d&`Xf zi&W-+ns;4hV`i|)Ob*ta8+T9o@-_DRR{fYa^PYUHNH}bGzVevhZ9Z=^n>OpVuG@LP z?ut&2HJ-EPg6Iqp-Jmzmz}$Vl<7 zTLDj31!nm8tV4&OZ11O8n>br&(DpPqUZ#+9odZd5f;UN$>UC?|&Z7lCOEX zz1~hRT-n1oEd1K6|KG1(W;($yC$hTr1!K}3&+`rGR!fskR#$q?b+gTe~DWM4fFX_={ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_msg_compose_holo_dark.png b/res/drawable-mdpi/ic_menu_msg_compose_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2874aec4cd4e769a13a9eb08ed48185ecbba84bf GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOQcoAh5Rc<;r&#+Pb`WUW|8br2Q^iA$8kS5Q z+7}f19Gn?NT}2f696bA5R!r2$Sh4Vtl!!))$Hwc<8()VP9B7=2@(29xAA+ zMoNXK%0ISvB-hNW%fP_1EHE;hb9+s}A?0hIr*buXaJ;3k^n&&tN$H+Sm2Ww$Tn#;p z%kLPj*u(C0YJzl|=nHcNZR5?Xmha2B8P@$!xie{(fn`JDp&6f#b$y>GVC8sm*Sb`$ z*mV_)p1(BhkT85Y;qKATMy)f_kxlEh1undMM8VT^xlpM8;dx6uKR7|(SUqp*+!bFW3=d4)z`EzhybVEN4|iwS zbM9($UFCMsdvC~mpVg11vhXGxN_nQVjhUl!7lY_jrEM$`8(xaP5H(?V;dJj*{WgD1 zi~e)mMg?8Km{TorjVMV;EJ?LWE=mPb3`PcqhPnopx&}rehNf1A=2k{#x(4P}1_pn3 z|LH@~kei>9nO2EgL(el8BcKLJkPX54X(i=}MX3yqDfvmM3ZA)%>8U}fi7AzZCsS>J PiWody{an^LB{Ts5Cg1>s literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_search_holo_dark.png b/res/drawable-mdpi/ic_menu_search_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..24c2a9e1e9cc144c70c80ca35c0dd86204582513 GIT binary patch literal 881 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE>K&gr;B5V$MK_6&w7U>inPx!e$Ug}JT0?v%EVa$ znv-^$=}JYlxNgn5x+r(+2D8KqtHg9~vpBjaxVV`9dRZf*|L*N}EQ3@2@gDVE?8#HT7wHms9rj>boDF{wP`$Qnqn!_=)Qg znuq1w<`w?(co>?#ktIX*=<|y5$PDAtYG&80_6mEtx@^ju7aMYMzF|W{zRt$oi`F`= z?AX{{S+|yNM%pBvUJ=7ZDolD8ob4^Sc3dsxVbqh0tg__XVbL=6L+m*wWl{IlH$8Yy zy_(#|HPdI^oCQn7O%`iAdG6e|Ozgn=^6B%k+@^2Qb(mFE>K*^pQTY|m0YjIX8D#}C zopnC+Sqhb0=szy|>&Efuwwq_1#k7yFs+tpPB$KXxR%GUL-hPSYle0@ED;yPOJN$5) zRHDGqy^hgW*R%+Dam~Hp{`5PsvQH#I2#{nTrungCxj?;QX|b^2DN42FH~Aq*MjZ c+{Ezopr0G{z?bN~PV literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_menu_trash_holo_dark.png b/res/drawable-mdpi/ic_menu_trash_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..071ee2c146055e8d73576b561a0d2bc2629ed126 GIT binary patch literal 790 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 literal 0 HcmV?d00001 diff --git a/res/drawable/ic_sms_unread_msg_indicator.png b/res/drawable/ic_sms_unread_msg_indicator.png deleted file mode 100644 index 473948bb5053b586bcfd1d49a5e98c19ef7de80b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqT!3HGPNfk5zDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MXNns978H@y_vF+_ppM9i~b971xurz3B8*f+fEqGQxu(j zGvv=BZ_fEDW~^S*`+oE8s*b5#{+rp~$H7AR=1F(|>8&#uvm1HN$US_fabU&Dq7bJ~ z3^!Ldin!l%G)#Dy-t4w+&ZN%o?V?JMk}gLW`P8(D>{ieXQ?Tt89E)ym#OCp+e-zCI%x!^{(@dUq8UsR5nM N;OXk;vd$@?2>@BIVzU4M diff --git a/res/layout/conversation_header_view.xml b/res/layout/conversation_header_view.xml index 198b4e6cb1..edd3900670 100644 --- a/res/layout/conversation_header_view.xml +++ b/res/layout/conversation_header_view.xml @@ -5,21 +5,10 @@ android:paddingRight="10dip" > - - - + style="?android:attr/quickContactBadgeStyleWindowLarge" + android:layout_centerVertical="true" + android:layout_alignParentLeft="true" /> diff --git a/src/org/thoughtcrime/securesms/ConversationHeaderView.java b/src/org/thoughtcrime/securesms/ConversationHeaderView.java index a1285857ea..c4db90d67a 100644 --- a/src/org/thoughtcrime/securesms/ConversationHeaderView.java +++ b/src/org/thoughtcrime/securesms/ConversationHeaderView.java @@ -17,8 +17,12 @@ package org.thoughtcrime.securesms; import android.content.Context; +import android.graphics.Color; +import android.graphics.Typeface; import android.text.Spannable; +import android.text.SpannableStringBuilder; import android.text.format.DateUtils; +import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -43,16 +47,13 @@ import java.util.Set; public class ConversationHeaderView extends RelativeLayout { - private final Context context; - private Set selectedThreads; - + private Set selectedThreads; private Recipients recipients; private long threadId; private boolean first; private TextView subjectView; private TextView fromView; private TextView dateView; - private View unreadIndicator; private View keyIndicator; private CheckBox checkbox; private QuickContactBadge contactPhoto; @@ -70,12 +71,10 @@ public class ConversationHeaderView extends RelativeLayout { LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); li.inflate(R.layout.conversation_header_view, this, true); - this.context = context; this.selectedThreads = selectedThreads; this.subjectView = (TextView)findViewById(R.id.subject); this.fromView = (TextView)findViewById(R.id.from); this.dateView = (TextView)findViewById(R.id.date); - this.unreadIndicator = findViewById(R.id.unread_indicator); this.keyIndicator = findViewById(R.id.key_indicator); this.contactPhoto = (QuickContactBadge)findViewById(R.id.contact_photo); this.checkbox = (CheckBox)findViewById(R.id.checkbox); @@ -85,13 +84,12 @@ public class ConversationHeaderView extends RelativeLayout { public ConversationHeaderView(Context context, AttributeSet attrs) { super(context, attrs); - this.context = context; } public void set(MessageRecord message, boolean batchMode) { this.recipients = message.getRecipients(); this.threadId = message.getThreadId(); - this.fromView.setText(formatFrom(recipients, message.getCount())); + this.fromView.setText(formatFrom(recipients, message.getCount(), message.getRead())); if (message.isKeyExchange()) this.subjectView.setText("Key exchange message...", TextView.BufferType.SPANNABLE); @@ -108,7 +106,7 @@ public class ConversationHeaderView extends RelativeLayout { this.checkbox.setChecked(selectedThreads.contains(threadId)); clearIndicators(); - setIndicators(message.getRead(), message.isKeyExchange()); + setIndicators(message.isKeyExchange()); if (!first) { if (batchMode) checkbox.setVisibility(View.VISIBLE); @@ -126,16 +124,28 @@ public class ConversationHeaderView extends RelativeLayout { private void clearIndicators() { this.keyIndicator.setVisibility(View.INVISIBLE); - this.unreadIndicator.setVisibility(View.INVISIBLE); } - private void setIndicators(boolean read, boolean key) { - if (!read && key) this.keyIndicator.setVisibility(View.VISIBLE); - else if (!read) this.unreadIndicator.setVisibility(View.VISIBLE); + private void setIndicators(boolean key) { + if (key) this.keyIndicator.setVisibility(View.VISIBLE); } - private String formatFrom(Recipients from, long count) { - return from.toShortString() + (count > 0 ? " (" + count + ")" : ""); + private CharSequence formatFrom(Recipients from, long count, boolean read) { + SpannableStringBuilder builder = new SpannableStringBuilder(from.toShortString()); + + if (count > 0) { + builder.append(" " + count); + builder.setSpan(new ForegroundColorSpan(Color.parseColor("#66333333")), + from.toShortString().length(), builder.length(), + Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + if (!read) { + builder.setSpan(new StyleSpan(Typeface.BOLD), 0, builder.length(), + Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } + + return builder; } public Recipients getRecipients() { diff --git a/src/org/thoughtcrime/securesms/SecureSMS.java b/src/org/thoughtcrime/securesms/SecureSMS.java index fd588bb418..d96343ac43 100644 --- a/src/org/thoughtcrime/securesms/SecureSMS.java +++ b/src/org/thoughtcrime/securesms/SecureSMS.java @@ -61,7 +61,6 @@ import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.crypto.MasterSecretUtil; import org.thoughtcrime.securesms.database.ApplicationExporter; import org.thoughtcrime.securesms.database.DatabaseFactory; -import org.thoughtcrime.securesms.database.MessageRecord; import org.thoughtcrime.securesms.database.NoExternalStorageException; import org.thoughtcrime.securesms.database.SmsMigrator; import org.thoughtcrime.securesms.database.ThreadDatabase; @@ -75,7 +74,6 @@ import org.thoughtcrime.securesms.util.Eula; import org.thoughtcrime.securesms.util.MemoryCleaner; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -89,6 +87,7 @@ import java.util.Set; public class SecureSMS extends SherlockListActivity { + private static final int MENU_NEW_MESSAGE = 0; private static final int MENU_SEND_KEY = 1; private static final int MENU_PASSPHRASE_KEY = 2; private static final int MENU_PREFERENCES_KEY = 3; @@ -187,30 +186,54 @@ public class SecureSMS extends SherlockListActivity { } private void prepareNormalMenu(Menu menu) { - menu.add(0, MENU_BATCH_MODE, Menu.NONE, "Batch Mode").setIcon(android.R.drawable.ic_menu_share); + menu.add(0, MENU_BATCH_MODE, Menu.NONE, "Batch Mode") + .setIcon(android.R.drawable.ic_menu_share); - if (masterSecret != null) menu.add(0, MENU_SEND_KEY, Menu.NONE, "Secure Session").setIcon(R.drawable.ic_lock_message_sms); - else menu.add(0, MENU_PASSPHRASE_KEY, Menu.NONE, "Enter passphrase").setIcon(R.drawable.ic_lock_message_sms); + if (masterSecret != null) { + menu.add(0, MENU_SEND_KEY, Menu.NONE, "Secure Session") + .setIcon(R.drawable.ic_lock_message_sms); + } else { + menu.add(0, MENU_PASSPHRASE_KEY, Menu.NONE, "Enter passphrase") + .setIcon(R.drawable.ic_lock_message_sms); + } - menu.add(0, MENU_SEARCH, Menu.NONE, "Search").setIcon(android.R.drawable.ic_menu_search); - menu.add(0, MENU_PREFERENCES_KEY, Menu.NONE, "Settings").setIcon(android.R.drawable.ic_menu_preferences); + menu.add(0, MENU_NEW_MESSAGE, Menu.NONE, "New Message") + .setIcon(R.drawable.ic_menu_msg_compose_holo_dark) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - SubMenu importExportMenu = menu.addSubMenu("Import/Export").setIcon(android.R.drawable.ic_menu_save); - importExportMenu.add(0, MENU_EXPORT, Menu.NONE, "Export To SD Card").setIcon(android.R.drawable.ic_menu_save); - importExportMenu.add(0, MENU_IMPORT, Menu.NONE, "Import From SD Card").setIcon(android.R.drawable.ic_menu_revert); + menu.add(0, MENU_SEARCH, Menu.NONE, "Search") + .setIcon(R.drawable.ic_menu_search_holo_dark) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - SubMenu moreMenu = menu.addSubMenu("More").setIcon(android.R.drawable.ic_menu_more); + menu.add(0, MENU_PREFERENCES_KEY, Menu.NONE, "Settings") + .setIcon(android.R.drawable.ic_menu_preferences); - if (masterSecret != null) - moreMenu.add(0, MENU_CLEAR_PASSPHRASE, Menu.NONE, "Clear Passphrase").setIcon(android.R.drawable.ic_menu_close_clear_cancel); + SubMenu importExportMenu = menu.addSubMenu("Import/Export") + .setIcon(android.R.drawable.ic_menu_save); + importExportMenu.add(0, MENU_EXPORT, Menu.NONE, "Export To SD Card") + .setIcon(android.R.drawable.ic_menu_save); + importExportMenu.add(0, MENU_IMPORT, Menu.NONE, "Import From SD Card") + .setIcon(android.R.drawable.ic_menu_revert); + if (masterSecret != null) { + menu.add(0, MENU_CLEAR_PASSPHRASE, Menu.NONE, "Clear Passphrase") + .setIcon(android.R.drawable.ic_menu_close_clear_cancel); + } } private void prepareBatchModeMenu(Menu menu) { - menu.add(0, MENU_EXIT_BATCH, Menu.NONE, "Normal Mode").setIcon(android.R.drawable.ic_menu_set_as); - menu.add(0, MENU_DELETE_SELECTED_THREADS, Menu.NONE, "Delete Selected").setIcon(android.R.drawable.ic_menu_delete); - menu.add(0, MENU_SELECT_ALL_THREADS, Menu.NONE, "Select All").setIcon(android.R.drawable.ic_menu_add); - menu.add(0, MENU_CLEAR_SELECTION, Menu.NONE, "Unselect All").setIcon(android.R.drawable.ic_menu_revert); + menu.add(0, MENU_EXIT_BATCH, Menu.NONE, "Normal Mode") + .setIcon(android.R.drawable.ic_menu_set_as); + + menu.add(0, MENU_DELETE_SELECTED_THREADS, Menu.NONE, "Delete Selected") + .setIcon(R.drawable.ic_menu_trash_holo_dark) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + + menu.add(0, MENU_SELECT_ALL_THREADS, Menu.NONE, "Select All") + .setIcon(android.R.drawable.ic_menu_add); + + menu.add(0, MENU_CLEAR_SELECTION, Menu.NONE, "Unselect All") + .setIcon(android.R.drawable.ic_menu_revert); } @Override @@ -218,6 +241,9 @@ public class SecureSMS extends SherlockListActivity { super.onOptionsItemSelected(item); switch (item.getItemId()) { + case MENU_NEW_MESSAGE: + createConversation(-1, null); + return true; case MENU_SEND_KEY: Intent intent = new Intent(this, SendKeyActivity.class); intent.putExtra("master_secret", masterSecret); @@ -435,7 +461,6 @@ public class SecureSMS extends SherlockListActivity { else DecryptingQueue.schedulePendingDecrypts(this, masterSecret); } - addNewMessageItem(); addConversationItems(); createConversationIfNecessary(this.getIntent()); } @@ -465,9 +490,7 @@ public class SecureSMS extends SherlockListActivity { @Override protected void onListItemClick(ListView l, View v, int position, long id) { - if (position == 0) { - createConversation(-1, null); - } else if (v instanceof ConversationHeaderView) { + if (v instanceof ConversationHeaderView) { ConversationHeaderView headerView = (ConversationHeaderView) v; createConversation(headerView.getThreadId(), headerView.getRecipients()); } @@ -509,23 +532,6 @@ public class SecureSMS extends SherlockListActivity { startActivity(intent); } - private void addNewMessageItem() { - ListView listView = getListView(); - if (listView.getHeaderViewsCount() > 0) return; - - ArrayList dummyList = new ArrayList(); - dummyList.add(new Recipient("New Message", null, null)); - - Recipients recipients = new Recipients(dummyList); - headerView = new ConversationHeaderView(this, true); - MessageRecord messageRecord = new MessageRecord(-1, recipients, 0, 0, true, -1); - messageRecord.setBody("Compose new message."); - headerView.set(messageRecord, false); - // headerView.setBackgroundColor(Color.TRANSPARENT); - - listView.addHeaderView(headerView, null, true); - } - private void addConversationItems() { Cursor cursor = DatabaseFactory.getThreadDatabase(this).getConversationList(); startManagingCursor(cursor);