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