aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-01-27 20:40:42 +0100
committerDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-01-27 20:40:42 +0100
commit4f902d8210d50a586c7ece1bb7da2ab26fd18da5 (patch)
treeb15d34a909443f79ac10d28f23eca19cf1c3301e
parent898b0ca8c485888e06e2b5b1c798eebce1a6dabc (diff)
conversation archiveable. new conversation will find or restart old conversations
-rw-r--r--gen/de/gultsch/chat/R.java3
-rw-r--r--res/layout/conversation_list_row.xml5
-rw-r--r--res/layout/fragment_conversation.xml4
-rw-r--r--res/layout/message_recieved.xml52
-rw-r--r--res/layout/message_sent.xml3
-rw-r--r--res/menu/conversations.xml2
-rw-r--r--src/de/gultsch/chat/entities/Conversation.java27
-rw-r--r--src/de/gultsch/chat/entities/Message.java11
-rw-r--r--src/de/gultsch/chat/persistance/DatabaseBackend.java64
-rw-r--r--src/de/gultsch/chat/services/XmppConnectionService.java30
-rw-r--r--src/de/gultsch/chat/ui/ConversationActivity.java139
-rw-r--r--src/de/gultsch/chat/ui/ConversationFragment.java165
-rw-r--r--src/de/gultsch/chat/ui/NewConversationActivity.java9
-rw-r--r--src/de/gultsch/chat/ui/XmppActivity.java4
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();
}