ConversationFragment.java

  1package de.gultsch.chat.ui;
  2
  3import java.util.ArrayList;
  4import java.util.List;
  5
  6import de.gultsch.chat.R;
  7import de.gultsch.chat.entities.Contact;
  8import de.gultsch.chat.entities.Conversation;
  9import de.gultsch.chat.entities.Message;
 10import de.gultsch.chat.utils.UIHelper;
 11import android.app.Fragment;
 12import android.database.Cursor;
 13import android.graphics.Typeface;
 14import android.net.Uri;
 15import android.os.Bundle;
 16import android.provider.ContactsContract.Profile;
 17import android.util.Log;
 18import android.view.LayoutInflater;
 19import android.view.View;
 20import android.view.View.OnClickListener;
 21import android.view.ViewGroup;
 22import android.widget.ArrayAdapter;
 23import android.widget.EditText;
 24import android.widget.ListView;
 25import android.widget.ImageButton;
 26import android.widget.ImageView;
 27import android.widget.TextView;
 28
 29public class ConversationFragment extends Fragment {
 30	
 31	protected Conversation conversation;
 32	protected ListView messagesView;
 33	protected LayoutInflater inflater;
 34	protected List<Message> messageList = new ArrayList<Message>();
 35	protected ArrayAdapter<Message> messageListAdapter;
 36	protected Contact contact;
 37	
 38	@Override
 39	public View onCreateView(final LayoutInflater inflater,
 40			ViewGroup container, Bundle savedInstanceState) {
 41
 42		this.inflater = inflater;
 43
 44
 45		final View view = inflater.inflate(R.layout.fragment_conversation,
 46				container, false);
 47		((ImageButton) view.findViewById(R.id.textSendButton))
 48				.setOnClickListener(new OnClickListener() {
 49
 50					@Override
 51					public void onClick(View v) {
 52						ConversationActivity activity = (ConversationActivity) getActivity();
 53						EditText chatMsg = (EditText) view
 54								.findViewById(R.id.textinput);
 55						if (chatMsg.getText().length() < 1)
 56							return;
 57						Message message = new Message(conversation, chatMsg
 58								.getText().toString(), Message.ENCRYPTION_NONE);
 59						activity.xmppConnectionService.sendMessage(conversation.getAccount(),message);
 60						chatMsg.setText("");
 61						
 62						if (conversation.getMode()==Conversation.MODE_SINGLE) {
 63							conversation.getMessages().add(message);
 64							messageList.add(message);
 65						}
 66						
 67						activity.updateConversationList();
 68						
 69						messagesView.setSelection(messageList.size() - 1);
 70					}
 71				});
 72
 73		messagesView = (ListView) view.findViewById(R.id.messages_view);
 74		
 75		String[] mProjection = new String[] { Profile._ID,
 76				Profile.PHOTO_THUMBNAIL_URI };
 77		Cursor mProfileCursor = getActivity().getContentResolver().query(
 78				Profile.CONTENT_URI, mProjection, null, null, null);
 79
 80		mProfileCursor.moveToFirst();
 81		final Uri profilePicture = Uri.parse(mProfileCursor.getString(1));
 82		
 83		messageListAdapter = new ArrayAdapter<Message>(this.getActivity()
 84				.getApplicationContext(), R.layout.message_sent, this.messageList) {
 85
 86			private static final int SENT = 0;
 87			private static final int RECIEVED = 1;
 88			
 89			@Override
 90			public int getViewTypeCount() {
 91				return 2;
 92			}
 93
 94			@Override
 95			public int getItemViewType(int position) {
 96				if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
 97					return RECIEVED;
 98				} else {
 99					return SENT;
100				}
101			}
102
103			@Override
104			public View getView(int position, View view, ViewGroup parent) {
105				Message item = getItem(position);
106				int type = getItemViewType(position);
107				if (view == null) {
108					switch (type) {
109					case SENT:
110						view = (View) inflater.inflate(R.layout.message_sent,
111								null);
112						break;
113					case RECIEVED:
114						view = (View) inflater.inflate(
115								R.layout.message_recieved, null);
116						break;
117					}
118				}
119				ImageView imageView = (ImageView) view.findViewById(R.id.message_photo);
120				if (type == RECIEVED) {
121					if(item.getConversation().getMode()==Conversation.MODE_SINGLE) {
122						Uri uri = item.getConversation().getProfilePhotoUri();
123						if (uri!=null) {
124							imageView.setImageURI(uri);
125						} else {
126							imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
127						}
128					} else if (item.getConversation().getMode()==Conversation.MODE_MULTI) {
129						if (item.getCounterpart()!=null) {
130							imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getCounterpart(), 200));
131						} else {
132							imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
133						}
134					}
135				} else {
136					imageView.setImageURI(profilePicture);
137				}
138				TextView messageBody = (TextView) view.findViewById(R.id.message_body);
139				String body = item.getBody();
140				if (body!=null) {
141					messageBody.setText(body.trim());
142				}
143				TextView time = (TextView) view.findViewById(R.id.message_time);
144				if (item.getStatus() == Message.STATUS_UNSEND) {
145					time.setTypeface(null, Typeface.ITALIC);
146				} else {
147					time.setText(UIHelper.readableTimeDifference(item
148							.getTimeSent()));
149				}
150				return view;
151			}
152		};
153		messagesView.setAdapter(messageListAdapter);
154
155		return view;
156	}
157
158	@Override
159	public void onStart() {
160		super.onStart();
161		final ConversationActivity activity = (ConversationActivity) getActivity();
162		
163		if (activity.xmppConnectionServiceBound) {
164			this.conversation = activity.getSelectedConversation();
165			updateMessages();
166			// rendering complete. now go tell activity to close pane
167			if (!activity.shouldPaneBeOpen()) {
168				activity.getSlidingPaneLayout().closePane();
169				activity.getActionBar().setDisplayHomeAsUpEnabled(true);
170				activity.getActionBar().setTitle(conversation.getName());
171				activity.invalidateOptionsMenu();
172			}
173		}
174	}
175	
176	public void onBackendConnected() {
177		final ConversationActivity activity = (ConversationActivity) getActivity();
178		this.conversation = activity.getSelectedConversation();
179		updateMessages();
180		// rendering complete. now go tell activity to close pane
181		if (!activity.shouldPaneBeOpen()) {
182			activity.getSlidingPaneLayout().closePane();
183			activity.getActionBar().setDisplayHomeAsUpEnabled(true);
184			activity.getActionBar().setTitle(conversation.getName());
185			activity.invalidateOptionsMenu();
186		}
187	}
188
189	public void updateMessages() {
190		this.messageList.clear();
191		this.messageList.addAll(this.conversation.getMessages());
192		this.messageListAdapter.notifyDataSetChanged();
193		int size = this.messageList.size();
194		if (size >= 1)
195			messagesView.setSelection(size - 1);
196	}
197}