diff options
Diffstat (limited to '')
-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 |
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(); } |