diff options
-rw-r--r-- | gen/de/gultsch/chat/R.java | 3 | ||||
-rw-r--r-- | res/layout/conversation_list_row.xml | 5 | ||||
-rw-r--r-- | res/layout/fragment_conversation.xml | 4 | ||||
-rw-r--r-- | res/layout/message_recieved.xml | 52 | ||||
-rw-r--r-- | res/layout/message_sent.xml | 3 | ||||
-rw-r--r-- | res/menu/conversations.xml | 2 | ||||
-rw-r--r-- | src/de/gultsch/chat/entities/Conversation.java | 27 | ||||
-rw-r--r-- | src/de/gultsch/chat/entities/Message.java | 11 | ||||
-rw-r--r-- | src/de/gultsch/chat/persistance/DatabaseBackend.java | 64 | ||||
-rw-r--r-- | src/de/gultsch/chat/services/XmppConnectionService.java | 30 | ||||
-rw-r--r-- | src/de/gultsch/chat/ui/ConversationActivity.java | 139 | ||||
-rw-r--r-- | src/de/gultsch/chat/ui/ConversationFragment.java | 165 | ||||
-rw-r--r-- | src/de/gultsch/chat/ui/NewConversationActivity.java | 9 | ||||
-rw-r--r-- | src/de/gultsch/chat/ui/XmppActivity.java | 4 |
14 files changed, 402 insertions, 116 deletions
diff --git a/gen/de/gultsch/chat/R.java b/gen/de/gultsch/chat/R.java index cdd36a905..f59f53e1a 100644 --- a/gen/de/gultsch/chat/R.java +++ b/gen/de/gultsch/chat/R.java @@ -76,7 +76,8 @@ public final class R { public static final int conversation_list_row=0x7f030002; public static final int fragment_conversation=0x7f030003; public static final int fragment_conversations_overview=0x7f030004; - public static final int message_sent=0x7f030005; + public static final int message_recieved=0x7f030005; + public static final int message_sent=0x7f030006; } public static final class menu { public static final int conversations=0x7f090000; diff --git a/res/layout/conversation_list_row.xml b/res/layout/conversation_list_row.xml index 303fdd1d2..41747240e 100644 --- a/res/layout/conversation_list_row.xml +++ b/res/layout/conversation_list_row.xml @@ -22,7 +22,6 @@ android:id="@+id/conversation_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Mein Contact" android:textColor="#636363" android:textSize="20sp" android:typeface="sans" /> @@ -34,7 +33,8 @@ android:layout_below="@id/conversation_name" android:textColor="#636363" android:textSize="14sp" - android:text="This is my last message" + android:singleLine="true" + android:scrollHorizontally="false" android:paddingTop="3dp"/> <TextView @@ -44,7 +44,6 @@ android:layout_alignBaseline="@+id/conversation_name" android:layout_alignParentRight="true" android:gravity="right" - android:text="2 min" android:textColor="#636363" android:textSize="12sp" /> diff --git a/res/layout/fragment_conversation.xml b/res/layout/fragment_conversation.xml index 11859573c..3b965af28 100644 --- a/res/layout/fragment_conversation.xml +++ b/res/layout/fragment_conversation.xml @@ -49,7 +49,9 @@ android:background="#e5e5e5" tools:listitem="@layout/message_sent" android:divider="@null" - android:dividerHeight="0dp"> + android:dividerHeight="0dp" + android:transcriptMode="alwaysScroll" + android:listSelector="@android:color/transparent"> </ListView> </RelativeLayout>
\ No newline at end of file diff --git a/res/layout/message_recieved.xml b/res/layout/message_recieved.xml new file mode 100644 index 000000000..bde702aee --- /dev/null +++ b/res/layout/message_recieved.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:padding="8dp"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/message_border" + android:layout_toRightOf="@+id/message_photo" + android:layout_alignParentBottom="true" + android:minHeight="48dp" + > +<LinearLayout + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:orientation="vertical" + android:background="#ededed" + android:padding="5dp"> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Hi, how are you?" + android:textSize="16sp" + android:id="@+id/message_body" + android:textColor="#333333"/> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:paddingTop="1dp" + android:text="@string/sending" + android:textColor="#8e8e8e" + android:textSize="12sp" + android:id="@+id/message_time"/> + + </LinearLayout> +</LinearLayout> + <ImageView + android:id="@+id/message_photo" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_alignParentTop="true" + android:layout_alignParentLeft="true" + android:layout_marginRight="-1.5dp" + android:padding="0dp" + android:src="@drawable/ic_profile" + android:scaleType="fitXY"/> + +</RelativeLayout> diff --git a/res/layout/message_sent.xml b/res/layout/message_sent.xml index c690c2173..c3136a55e 100644 --- a/res/layout/message_sent.xml +++ b/res/layout/message_sent.xml @@ -10,12 +10,11 @@ android:layout_height="wrap_content" android:background="@drawable/message_border" android:layout_toLeftOf="@+id/message_photo" - android:layout_alignParentLeft="true" android:layout_alignParentBottom="true" android:minHeight="48dp" > <LinearLayout - android:layout_width="fill_parent" + android:layout_width="wrap_content" android:layout_height="fill_parent" android:orientation="vertical" android:background="#ededed" diff --git a/res/menu/conversations.xml b/res/menu/conversations.xml index 39c36a533..a6cdd8857 100644 --- a/res/menu/conversations.xml +++ b/res/menu/conversations.xml @@ -24,7 +24,7 @@ android:id="@+id/action_archive" android:orderInCategory="50" android:showAsAction="never" - android:title="@string/action_archive" /> + android:title="@string/action_archive"/> <item android:id="@+id/action_accounts" diff --git a/src/de/gultsch/chat/entities/Conversation.java b/src/de/gultsch/chat/entities/Conversation.java index 413e3d626..a00dd476a 100644 --- a/src/de/gultsch/chat/entities/Conversation.java +++ b/src/de/gultsch/chat/entities/Conversation.java @@ -53,8 +53,31 @@ public class Conversation extends AbstractEntity { public List<Message> getMessages() { if (messages == null) this.messages = new ArrayList<Message>(); //prevent null pointer + + //populate with Conversation (this) + + for(Message msg : messages) { + msg.setConversation(this); + } + return messages; } + + public String getLatestMessage() { + if ((this.messages == null)||(this.messages.size()==0)) { + return null; + } else { + return this.messages.get(this.messages.size() - 1).getBody(); + } + } + + public long getLatestMessageDate() { + if ((this.messages == null)||(this.messages.size()==0)) { + return this.getCreated(); + } else { + return this.messages.get(this.messages.size() - 1).getTimeSent(); + } + } public void setMessages(List<Message> msgs) { this.messages = msgs; @@ -112,4 +135,8 @@ public class Conversation extends AbstractEntity { cursor.getLong(cursor.getColumnIndex(CREATED)), cursor.getInt(cursor.getColumnIndex(STATUS))); } + + public void setStatus(int status) { + this.status = status; + } } diff --git a/src/de/gultsch/chat/entities/Message.java b/src/de/gultsch/chat/entities/Message.java index 26e646ff4..b52e44b4e 100644 --- a/src/de/gultsch/chat/entities/Message.java +++ b/src/de/gultsch/chat/entities/Message.java @@ -35,8 +35,9 @@ public class Message extends AbstractEntity { public Message(Conversation conversation, String body, int encryption) { this(java.util.UUID.randomUUID().toString(), conversation.getUuid(), - conversation.getContactJid(), body, 0, encryption, + conversation.getContactJid(), body, System.currentTimeMillis(), encryption, Message.STATUS_UNSEND); + this.conversation = conversation; } public Message(String uuid, String conversationUUid, String counterpart, @@ -66,6 +67,10 @@ public class Message extends AbstractEntity { public String getConversationUuid() { return conversationUuid; } + + public Conversation getConversation() { + return this.conversation; + } public String getCounterpart() { return counterpart; @@ -97,4 +102,8 @@ public class Message extends AbstractEntity { cursor.getInt(cursor.getColumnIndex(STATUS))); } + public void setConversation(Conversation conv) { + this.conversation = conv; + } + } diff --git a/src/de/gultsch/chat/persistance/DatabaseBackend.java b/src/de/gultsch/chat/persistance/DatabaseBackend.java index 06b9af16f..0689851fa 100644 --- a/src/de/gultsch/chat/persistance/DatabaseBackend.java +++ b/src/de/gultsch/chat/persistance/DatabaseBackend.java @@ -3,6 +3,8 @@ package de.gultsch.chat.persistance; import java.util.ArrayList; import java.util.List; +import de.gultsch.chat.entities.Account; +import de.gultsch.chat.entities.Contact; import de.gultsch.chat.entities.Conversation; import de.gultsch.chat.entities.Message; import android.content.Context; @@ -24,12 +26,16 @@ public class DatabaseBackend extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table " + Conversation.TABLENAME + " (" - + Conversation.UUID + " TEXT, " + Conversation.NAME + " TEXT, " - + Conversation.PHOTO_URI + " TEXT, " + Conversation.ACCOUNT - + " TEXT, " + Conversation.CONTACT + " TEXT, " - + Conversation.CREATED + " NUMBER, " + Conversation.STATUS + + Conversation.UUID + " TEXT PRIMARY KEY, " + Conversation.NAME + + " TEXT, " + Conversation.PHOTO_URI + " TEXT, " + + Conversation.ACCOUNT + " TEXT, " + Conversation.CONTACT + + " TEXT, " + Conversation.CREATED + " NUMBER, " + + Conversation.STATUS + " NUMBER)"); + db.execSQL("create table " + Message.TABLENAME + "( " + Message.UUID + + " TEXT PRIMARY KEY, " + Message.CONVERSATION + " TEXT, " + Message.TIME_SENT +" NUMBER, " + + Message.COUNTERPART + " TEXT, " + Message.BODY + " TEXT, " + + Message.ENCRYPTION + " NUMBER, " + Message.STATUS + " NUMBER)"); - db.execSQL("create table "+Message.TABLENAME+ "()"); } @Override @@ -45,15 +51,20 @@ public class DatabaseBackend extends SQLiteOpenHelper { return instance; } - public void addConversation(Conversation conversation) { + public void createConversation(Conversation conversation) { SQLiteDatabase db = this.getWritableDatabase(); - db.insert("conversations", null, conversation.getContentValues()); + db.insert(Conversation.TABLENAME, null, conversation.getContentValues()); + } + + public void createMessage(Message message) { + SQLiteDatabase db = this.getWritableDatabase(); + db.insert(Message.TABLENAME, null, message.getContentValues()); } public int getConversationCount() { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery( - "select count(uuid) as count from conversations", null); + "select count(uuid) as count from "+Conversation.TABLENAME+" where "+Conversation.STATUS+"="+Conversation.STATUS_AVAILABLE, null); cursor.moveToFirst(); return cursor.getInt(0); } @@ -62,14 +73,43 @@ public class DatabaseBackend extends SQLiteOpenHelper { List<Conversation> list = new ArrayList<Conversation>(); SQLiteDatabase db = this.getReadableDatabase(); String[] selectionArgs = { "" + status }; - Cursor cursor = db - .rawQuery( - "select * from conversations where status = ? order by created desc", - selectionArgs); + Cursor cursor = db.rawQuery("select * from " + Conversation.TABLENAME + + " where " + Conversation.STATUS + " = ? order by " + + Conversation.CREATED + " desc", selectionArgs); while (cursor.moveToNext()) { list.add(Conversation.fromCursor(cursor)); } return list; } + public List<Message> getMessages(Conversation conversation, int limit) { + List<Message> list = new ArrayList<Message>(); + SQLiteDatabase db = this.getReadableDatabase(); + String[] selectionArgs = { conversation.getUuid() }; + Cursor cursor = db.query(Message.TABLENAME, null,Message.CONVERSATION +"=?", selectionArgs, null, null, + Message.TIME_SENT+" DESC",String.valueOf(limit)); + if (cursor.getCount() > 0 ) { + cursor.moveToLast(); + do { + list.add(Message.fromCursor(cursor)); + } while (cursor.moveToPrevious()); + } + return list; + } + + public Conversation findConversation(Account account, Contact contact) { + SQLiteDatabase db = this.getReadableDatabase(); + String[] selectionArgs = { account.getUuid() , contact.getJid() }; + Cursor cursor = db.query(Conversation.TABLENAME, null,Conversation.ACCOUNT+"=? AND "+Conversation.CONTACT+"=?", selectionArgs, null, null, null); + if (cursor.getCount() == 0) return null; + cursor.moveToFirst(); + return Conversation.fromCursor(cursor); + } + + public void updateConversation(Conversation conversation) { + SQLiteDatabase db = this.getReadableDatabase(); + String[] args = {conversation.getUuid()}; + db.update(Conversation.TABLENAME, conversation.getContentValues(),Conversation.UUID+"=?",args); + } + } diff --git a/src/de/gultsch/chat/services/XmppConnectionService.java b/src/de/gultsch/chat/services/XmppConnectionService.java index 67e3901e7..20af97420 100644 --- a/src/de/gultsch/chat/services/XmppConnectionService.java +++ b/src/de/gultsch/chat/services/XmppConnectionService.java @@ -2,6 +2,8 @@ package de.gultsch.chat.services; import java.util.List; +import de.gultsch.chat.entities.Account; +import de.gultsch.chat.entities.Contact; import de.gultsch.chat.entities.Conversation; import de.gultsch.chat.entities.Message; import de.gultsch.chat.persistance.DatabaseBackend; @@ -35,15 +37,39 @@ public class XmppConnectionService extends Service { } public void sendMessage(Message message) { - Log.d(LOGTAG,"sending message"); + databaseBackend.createMessage(message); } public void addConversation(Conversation conversation) { - databaseBackend.addConversation(conversation); + databaseBackend.createConversation(conversation); } public List<Conversation> getConversations(int status) { return databaseBackend.getConversations(status); } + + public List<Message> getMessages(Conversation conversation) { + return databaseBackend.getMessages(conversation, 100); + } + public Conversation findOrCreateConversation(Account account, Contact contact) { + Conversation conversation = databaseBackend.findConversation(account, contact); + if (conversation!=null) { + Log.d("gultsch","found one. unarchive it"); + conversation.setStatus(Conversation.STATUS_AVAILABLE); + this.databaseBackend.updateConversation(conversation); + } else { + conversation = new Conversation(contact.getDisplayName(), contact.getProfilePhoto(), account, contact.getJid()); + this.databaseBackend.createConversation(conversation); + } + return conversation; + } + + public void updateConversation(Conversation conversation) { + this.databaseBackend.updateConversation(conversation); + } + + public int getConversationCount() { + return this.databaseBackend.getConversationCount(); + } } diff --git a/src/de/gultsch/chat/ui/ConversationActivity.java b/src/de/gultsch/chat/ui/ConversationActivity.java index 4f76e9c12..959e39a9c 100644 --- a/src/de/gultsch/chat/ui/ConversationActivity.java +++ b/src/de/gultsch/chat/ui/ConversationActivity.java @@ -1,14 +1,13 @@ package de.gultsch.chat.ui; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import de.gultsch.chat.R; import de.gultsch.chat.R.id; -import de.gultsch.chat.entities.Account; -import de.gultsch.chat.entities.Contact; import de.gultsch.chat.entities.Conversation; -import de.gultsch.chat.persistance.DatabaseBackend; import de.gultsch.chat.utils.Beautifier; import android.os.Bundle; import android.app.FragmentTransaction; @@ -34,13 +33,56 @@ import android.widget.ImageView; public class ConversationActivity extends XmppActivity { public static final String VIEW_CONVERSATION = "viewConversation"; - private static final String LOGTAG = "secureconversation"; protected static final String CONVERSATION = "conversationUuid"; protected SlidingPaneLayout spl; - final List<Conversation> conversationList = new ArrayList<Conversation>(); + private List<Conversation> conversationList = new ArrayList<Conversation>(); + private int selectedConversation = 0; + private ListView listView; + + private boolean paneShouldBeOpen = true; + + + public List<Conversation> getConversationList() { + return this.conversationList; + } + public int getSelectedConversation() { + return this.selectedConversation; + } + + public ListView getConversationListView() { + return this.listView; + } + + public SlidingPaneLayout getSlidingPaneLayout() { + return this.spl; + } + + public boolean shouldPaneBeOpen() { + return paneShouldBeOpen; + } + + public void updateConversationList() { + if (conversationList.size() >= 1) { + Conversation currentConv = conversationList.get(selectedConversation); + Collections.sort(this.conversationList, new Comparator<Conversation>() { + @Override + public int compare(Conversation lhs, Conversation rhs) { + return (int) (rhs.getLatestMessageDate() - lhs.getLatestMessageDate()); + } + }); + for(int i = 0; i < conversationList.size(); ++i) { + if (currentConv == conversationList.get(i)) { + selectedConversation = i; + break; + } + } + } + this.listView.invalidateViews(); + } + @Override protected void onCreate(Bundle savedInstanceState) { @@ -48,7 +90,7 @@ public class ConversationActivity extends XmppActivity { setContentView(R.layout.fragment_conversations_overview); - final ListView listView = (ListView) findViewById(R.id.list); + listView = (ListView) findViewById(R.id.list); listView.setAdapter(new ArrayAdapter<Conversation>(this, R.layout.conversation_list_row, conversationList) { @@ -61,8 +103,9 @@ public class ConversationActivity extends XmppActivity { } ((TextView) view.findViewById(R.id.conversation_name)) .setText(getItem(position).getName()); + ((TextView) view.findViewById(R.id.conversation_lastmsg)).setText(getItem(position).getLatestMessage()); ((TextView) view.findViewById(R.id.conversation_lastupdate)) - .setText(Beautifier.readableTimeDifference(getItem(position).getCreated())); + .setText(Beautifier.readableTimeDifference(getItem(position).getLatestMessageDate())); ((ImageView) view.findViewById(R.id.conversation_image)) .setImageURI(getItem(position).getProfilePhotoUri()); return view; @@ -75,11 +118,13 @@ public class ConversationActivity extends XmppActivity { @Override public void onItemClick(AdapterView<?> arg0, View clickedView, int position, long arg3) { - Log.d(LOGTAG, "List view was klicked on position " + position); - swapConversationFragment(conversationList.get(position)); - getActionBar().setTitle( - conversationList.get(position).getName()); - spl.closePane(); + paneShouldBeOpen = false; + if (selectedConversation != position) { + selectedConversation = position; + swapConversationFragment(); //.onBackendConnected(conversationList.get(position)); + } else { + spl.closePane(); + } } }); spl = (SlidingPaneLayout) findViewById(id.slidingpanelayout); @@ -91,6 +136,7 @@ public class ConversationActivity extends XmppActivity { @Override public void onPanelOpened(View arg0) { + paneShouldBeOpen = true; getActionBar().setDisplayHomeAsUpEnabled(false); getActionBar().setTitle(R.string.app_name); invalidateOptionsMenu(); @@ -105,21 +151,13 @@ public class ConversationActivity extends XmppActivity { focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } - listView.requestFocus(); } @Override public void onPanelClosed(View arg0) { if (conversationList.size() > 0) { getActionBar().setDisplayHomeAsUpEnabled(true); - ConversationFragment convFrag = (ConversationFragment) getFragmentManager() - .findFragmentById(R.id.selected_conversation); - if (convFrag == null) { - Log.d(LOGTAG, "conversation fragment was not found."); - return; // just do nothing. at least dont crash - } - getActionBar().setTitle( - convFrag.getConversation().getName()); + getActionBar().setTitle(conversationList.get(selectedConversation).getName()); invalidateOptionsMenu(); } } @@ -134,7 +172,6 @@ public class ConversationActivity extends XmppActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.conversations, menu); if (spl.isOpen()) { @@ -161,8 +198,23 @@ public class ConversationActivity extends XmppActivity { break; case R.id.action_add: startActivity(new Intent(this, NewConversationActivity.class)); + break; case R.id.action_archive: - + Conversation conv = getConversationList().get(selectedConversation); + conv.setStatus(Conversation.STATUS_ARCHIVED); + xmppConnectionService.updateConversation(conv); + conversationList.remove(selectedConversation); + selectedConversation = 0; + if (conversationList.size() >= 1) { + paneShouldBeOpen = true; + swapConversationFragment(); + ((ArrayAdapter) listView.getAdapter()).notifyDataSetChanged(); + spl.openPane(); + } else { + startActivity(new Intent(this, NewConversationActivity.class)); + finish(); + } + //goto new break; default: break; @@ -170,14 +222,14 @@ public class ConversationActivity extends XmppActivity { return super.onOptionsItemSelected(item); } - protected void swapConversationFragment(Conversation conv) { - Log.d(LOGTAG, "swap conversation fragment to " + conv.getName()); + protected ConversationFragment swapConversationFragment() { ConversationFragment selectedFragment = new ConversationFragment(); - selectedFragment.setConversation(conv); + FragmentTransaction transaction = getFragmentManager() .beginTransaction(); - transaction.replace(R.id.selected_conversation, selectedFragment); + transaction.replace(R.id.selected_conversation, selectedFragment,"conversation"); transaction.commit(); + return selectedFragment; } @Override @@ -202,25 +254,31 @@ public class ConversationActivity extends XmppActivity { } @Override - void servConnected() { + void onBackendConnected() { conversationList.clear(); conversationList.addAll(xmppConnectionService .getConversations(Conversation.STATUS_AVAILABLE)); + + for(Conversation conversation : conversationList) { + conversation.setMessages(xmppConnectionService.getMessages(conversation)); + } - //spl.openPane(); + this.updateConversationList(); if ((getIntent().getAction().equals(Intent.ACTION_VIEW) && (!handledViewIntent))) { if (getIntent().getType().equals( ConversationActivity.VIEW_CONVERSATION)) { handledViewIntent = true; - swapConversationFragment(conversationList.get(0)); - spl.closePane(); - - // why do i even need this - getActionBar().setDisplayHomeAsUpEnabled(true); - getActionBar().setTitle(conversationList.get(0).getName()); + String convToView = (String) getIntent().getExtras().get(CONVERSATION); + for(int i = 0; i < conversationList.size(); ++i) { + if (conversationList.get(i).getUuid().equals(convToView)) { + selectedConversation = i; + } + } + paneShouldBeOpen = false; + swapConversationFragment(); } } else { if (conversationList.size() <= 0) { @@ -228,7 +286,16 @@ public class ConversationActivity extends XmppActivity { startActivity(new Intent(this, NewConversationActivity.class)); finish(); } else { - swapConversationFragment(conversationList.get(0)); + //find currently loaded fragment + ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation"); + if (selectedFragment!=null) { + Log.d("gultsch","ConversationActivity. found old fragment."); + selectedFragment.onBackendConnected(); + } else { + Log.d("gultsch","conversationactivity. no old fragment found. creating new one"); + Log.d("gultsch","selected conversation is #"+selectedConversation); + swapConversationFragment(); + } } } } diff --git a/src/de/gultsch/chat/ui/ConversationFragment.java b/src/de/gultsch/chat/ui/ConversationFragment.java index fca5202a7..5ba58bbff 100644 --- a/src/de/gultsch/chat/ui/ConversationFragment.java +++ b/src/de/gultsch/chat/ui/ConversationFragment.java @@ -1,11 +1,13 @@ package de.gultsch.chat.ui; +import java.util.ArrayList; +import java.util.List; + import de.gultsch.chat.R; import de.gultsch.chat.entities.Conversation; import de.gultsch.chat.entities.Message; import de.gultsch.chat.utils.Beautifier; import android.app.Fragment; -import android.content.Context; import android.database.Cursor; import android.graphics.Typeface; import android.net.Uri; @@ -18,85 +20,118 @@ import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.EditText; -import android.widget.ListAdapter; import android.widget.ListView; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; public class ConversationFragment extends Fragment { + + protected Conversation conversation; + protected ListView messagesView; + protected LayoutInflater inflater; + protected List<Message> messageList = new ArrayList<Message>(); - Conversation conversation; + @Override + public View onCreateView(final LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { - public void setConversation(Conversation conv) { - this.conversation = conv; - } + this.inflater = inflater; - @Override - public View onCreateView(final LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - - String[] mProjection = new String[] - { - Profile._ID, - Profile.PHOTO_THUMBNAIL_URI - }; - Cursor mProfileCursor = getActivity().getContentResolver().query( - Profile.CONTENT_URI, - mProjection , - null, - null, - null); - - mProfileCursor.moveToFirst(); - final Uri profilePicture = Uri.parse(mProfileCursor.getString(1)); - - Log.d("gultsch","found user profile pic "+profilePicture.toString()); - - final View view = inflater.inflate(R.layout.fragment_conversation, container, - false); + + + final View view = inflater.inflate(R.layout.fragment_conversation, + container, false); ((ImageButton) view.findViewById(R.id.textSendButton)) .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - EditText chatMsg = (EditText) view.findViewById(R.id.textinput); - if (chatMsg.getText().length() < 1) return; - Message message = new Message(conversation,chatMsg.getText().toString(), - Message.ENCRYPTION_NONE); - XmppActivity activity = (XmppActivity) getActivity(); + ConversationActivity activity = (ConversationActivity) getActivity(); + EditText chatMsg = (EditText) view + .findViewById(R.id.textinput); + if (chatMsg.getText().length() < 1) + return; + Message message = new Message(conversation, chatMsg + .getText().toString(), Message.ENCRYPTION_NONE); activity.xmppConnectionService.sendMessage(message); conversation.getMessages().add(message); chatMsg.setText(""); - ListView messagesView = (ListView) view.findViewById(R.id.messages_view); - ArrayAdapter<Message> adapter = (ArrayAdapter<Message>) messagesView.getAdapter(); - adapter.notifyDataSetChanged(); + messageList.add(message); + + activity.updateConversationList(); - messagesView.setSelection(conversation.getMessages().size() -1); + messagesView.setSelection(messageList.size() - 1); } }); - ListView messagesView = (ListView) view - .findViewById(R.id.messages_view); + messagesView = (ListView) view.findViewById(R.id.messages_view); + + String[] mProjection = new String[] { Profile._ID, + Profile.PHOTO_THUMBNAIL_URI }; + Cursor mProfileCursor = getActivity().getContentResolver().query( + Profile.CONTENT_URI, mProjection, null, null, null); + + mProfileCursor.moveToFirst(); + final Uri profilePicture = Uri.parse(mProfileCursor.getString(1)); + messagesView.setAdapter(new ArrayAdapter<Message>(this.getActivity() - .getApplicationContext(), R.layout.message_sent, - this.conversation.getMessages()) { + .getApplicationContext(), R.layout.message_sent, this.messageList) { + + private static final int SENT = 0; + private static final int RECIEVED = 1; + + @Override + public int getViewTypeCount() { + return 2; + } + + @Override + public int getItemViewType(int position) { + if (getItem(position).getStatus() == Message.STATUS_RECIEVED) { + return RECIEVED; + } else { + return SENT; + } + } @Override public View getView(int position, View view, ViewGroup parent) { Message item = getItem(position); - if ((item.getStatus() != Message.STATUS_RECIEVED) - || (item.getStatus() == Message.STATUS_SEND)) { - view = (View) inflater.inflate(R.layout.message_sent, null); - ((ImageView) view.findViewById(R.id.message_photo)).setImageURI(profilePicture); + int type = getItemViewType(position); + if (view == null) { + switch (type) { + case SENT: + view = (View) inflater.inflate(R.layout.message_sent, + null); + Log.d("gultsch", "inflated new message_sent view"); + break; + case RECIEVED: + view = (View) inflater.inflate( + R.layout.message_recieved, null); + Log.d("gultsch", "inflated new message_recieved view"); + break; + } + } else { + Log.d("gultsch", "recylecd a view"); + } + if (type == RECIEVED) { + ((ImageView) view.findViewById(R.id.message_photo)) + .setImageURI(item.getConversation() + .getProfilePhotoUri()); + } else { + ((ImageView) view.findViewById(R.id.message_photo)) + .setImageURI(profilePicture); } - ((TextView) view.findViewById(R.id.message_body)).setText(item.getBody()); + ((TextView) view.findViewById(R.id.message_body)).setText(item + .getBody()); TextView time = (TextView) view.findViewById(R.id.message_time); if (item.getStatus() == Message.STATUS_UNSEND) { time.setTypeface(null, Typeface.ITALIC); } else { - time.setText(Beautifier.readableTimeDifference(item.getTimeSent())); + time.setText(Beautifier.readableTimeDifference(item + .getTimeSent())); } return view; } @@ -105,7 +140,37 @@ public class ConversationFragment extends Fragment { return view; } - public Conversation getConversation() { - return conversation; + @Override + public void onStart() { + super.onStart(); + + Log.d("gultsch","conversationfragment onStart"); + + final ConversationActivity activity = (ConversationActivity) getActivity(); + + // TODO check if bond and get data back + + if (activity.xmppConnectionServiceBound) { + this.conversation = activity.getConversationList().get(activity.getSelectedConversation()); + this.messageList.clear(); + this.messageList.addAll(this.conversation.getMessages()); + } + + + // rendering complete. now go tell activity to close pane + if (!activity.shouldPaneBeOpen()) { + activity.getSlidingPaneLayout().closePane(); + } + + int size = this.messageList.size(); + if (size >= 1) + messagesView.setSelection(size - 1); + } + + public void onBackendConnected() { + final ConversationActivity activity = (ConversationActivity) getActivity(); + this.conversation = activity.getConversationList().get(activity.getSelectedConversation()); + this.messageList.clear(); + this.messageList.addAll(this.conversation.getMessages()); } } diff --git a/src/de/gultsch/chat/ui/NewConversationActivity.java b/src/de/gultsch/chat/ui/NewConversationActivity.java index 917b4c627..d3a3aa00a 100644 --- a/src/de/gultsch/chat/ui/NewConversationActivity.java +++ b/src/de/gultsch/chat/ui/NewConversationActivity.java @@ -85,9 +85,7 @@ public class NewConversationActivity extends XmppActivity { Account account = new Account(); - Conversation conversation = new Conversation(clickedContact.getDisplayName(), clickedContact.getProfilePhoto(), account, clickedContact.getJid()); - - xmppConnectionService.addConversation(conversation); + Conversation conversation = xmppConnectionService.findOrCreateConversation(account, clickedContact); Intent viewConversationIntent = new Intent(v.getContext(),ConversationActivity.class); viewConversationIntent.setAction(Intent.ACTION_VIEW); @@ -218,9 +216,10 @@ public class NewConversationActivity extends XmppActivity { } @Override - void servConnected() { - // TODO Auto-generated method stub + void onBackendConnected() { + getActionBar().setDisplayHomeAsUpEnabled(false); + getActionBar().setHomeButtonEnabled(false); } @Override diff --git a/src/de/gultsch/chat/ui/XmppActivity.java b/src/de/gultsch/chat/ui/XmppActivity.java index c15482ac4..ce65ab5ec 100644 --- a/src/de/gultsch/chat/ui/XmppActivity.java +++ b/src/de/gultsch/chat/ui/XmppActivity.java @@ -20,7 +20,7 @@ public abstract class XmppActivity extends Activity { XmppConnectionBinder binder = (XmppConnectionBinder) service; xmppConnectionService = binder.getService(); xmppConnectionServiceBound = true; - servConnected(); + onBackendConnected(); } @Override @@ -47,5 +47,5 @@ public abstract class XmppActivity extends Activity { } } - abstract void servConnected(); + abstract void onBackendConnected(); } |