aboutsummaryrefslogtreecommitdiffstats
path: root/src/de/gultsch/chat/ui
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 /src/de/gultsch/chat/ui
parent898b0ca8c485888e06e2b5b1c798eebce1a6dabc (diff)
conversation archiveable. new conversation will find or restart old conversations
Diffstat (limited to '')
-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
4 files changed, 224 insertions, 93 deletions
diff --git a/src/de/gultsch/chat/ui/ConversationActivity.java b/src/de/gultsch/chat/ui/ConversationActivity.java
index 4f76e9c1..959e39a9 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 fca5202a..5ba58bbf 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 917b4c62..d3a3aa00 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 c15482ac..ce65ab5e 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();
}