mirror of
https://github.com/moparisthebest/Conversations
synced 2024-11-24 01:32:17 -05:00
conversation archiveable. new conversation will find or restart old conversations
This commit is contained in:
parent
898b0ca8c4
commit
4f902d8210
@ -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;
|
||||
|
@ -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" />
|
||||
|
||||
|
@ -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>
|
52
res/layout/message_recieved.xml
Normal file
52
res/layout/message_recieved.xml
Normal file
@ -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>
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
||||
Conversation conversation;
|
||||
|
||||
public void setConversation(Conversation conv) {
|
||||
this.conversation = conv;
|
||||
}
|
||||
|
||||
protected Conversation conversation;
|
||||
protected ListView messagesView;
|
||||
protected LayoutInflater inflater;
|
||||
protected List<Message> messageList = new ArrayList<Message>();
|
||||
|
||||
@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);
|
||||
public View onCreateView(final LayoutInflater inflater,
|
||||
ViewGroup container, Bundle savedInstanceState) {
|
||||
|
||||
this.inflater = inflater;
|
||||
|
||||
|
||||
|
||||
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);
|
||||
|
||||
messagesView.setSelection(conversation.getMessages().size() -1);
|
||||
activity.updateConversationList();
|
||||
|
||||
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");
|
||||
}
|
||||
((TextView) view.findViewById(R.id.message_body)).setText(item.getBody());
|
||||
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 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());
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user