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.PhoneHelper;
 11import de.gultsch.chat.utils.UIHelper;
 12import android.app.Fragment;
 13import android.content.SharedPreferences;
 14import android.graphics.Typeface;
 15import android.net.Uri;
 16import android.os.Bundle;
 17import android.preference.PreferenceManager;
 18import android.util.Log;
 19import android.view.LayoutInflater;
 20import android.view.View;
 21import android.view.View.OnClickListener;
 22import android.view.ViewGroup;
 23import android.widget.ArrayAdapter;
 24import android.widget.EditText;
 25import android.widget.ListView;
 26import android.widget.ImageButton;
 27import android.widget.ImageView;
 28import android.widget.TextView;
 29
 30public class ConversationFragment extends Fragment {
 31	
 32	protected Conversation conversation;
 33	protected ListView messagesView;
 34	protected LayoutInflater inflater;
 35	protected List<Message> messageList = new ArrayList<Message>();
 36	protected ArrayAdapter<Message> messageListAdapter;
 37	protected Contact contact;
 38	
 39	@Override
 40	public View onCreateView(final LayoutInflater inflater,
 41			ViewGroup container, Bundle savedInstanceState) {
 42
 43		this.inflater = inflater;
 44
 45
 46		final View view = inflater.inflate(R.layout.fragment_conversation,
 47				container, false);
 48		((ImageButton) view.findViewById(R.id.textSendButton))
 49				.setOnClickListener(new OnClickListener() {
 50
 51					@Override
 52					public void onClick(View v) {
 53						ConversationActivity activity = (ConversationActivity) getActivity();
 54						EditText chatMsg = (EditText) view
 55								.findViewById(R.id.textinput);
 56						if (chatMsg.getText().length() < 1)
 57							return;
 58						Message message = new Message(conversation, chatMsg
 59								.getText().toString(), Message.ENCRYPTION_NONE);
 60						activity.xmppConnectionService.sendMessage(conversation.getAccount(),message);
 61						chatMsg.setText("");
 62						
 63						/*if (conversation.getMode()==Conversation.MODE_SINGLE) {
 64							conversation.getMessages().add(message);
 65							messageList.add(message);
 66						}*/
 67						
 68						//activity.updateConversationList();
 69						
 70						//messagesView.setSelection(messageList.size() - 1);
 71					}
 72				});
 73
 74		messagesView = (ListView) view.findViewById(R.id.messages_view);
 75		
 76		SharedPreferences sharedPref = PreferenceManager
 77				.getDefaultSharedPreferences(getActivity().getApplicationContext());
 78		boolean showPhoneSelfContactPicture = sharedPref.getBoolean("show_phone_selfcontact_picture",true);
 79		
 80		final Uri selfiUri;
 81		if (showPhoneSelfContactPicture) {
 82			selfiUri =  PhoneHelper.getSefliUri(getActivity());
 83		} else {
 84			selfiUri = null;
 85		}
 86		
 87		messageListAdapter = new ArrayAdapter<Message>(this.getActivity()
 88				.getApplicationContext(), R.layout.message_sent, this.messageList) {
 89
 90			private static final int SENT = 0;
 91			private static final int RECIEVED = 1;
 92			
 93			@Override
 94			public int getViewTypeCount() {
 95				return 2;
 96			}
 97
 98			@Override
 99			public int getItemViewType(int position) {
100				if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
101					return RECIEVED;
102				} else {
103					return SENT;
104				}
105			}
106
107			@Override
108			public View getView(int position, View view, ViewGroup parent) {
109				Message item = getItem(position);
110				int type = getItemViewType(position);
111				if (view == null) {
112					switch (type) {
113					case SENT:
114						view = (View) inflater.inflate(R.layout.message_sent,
115								null);
116						break;
117					case RECIEVED:
118						view = (View) inflater.inflate(
119								R.layout.message_recieved, null);
120						break;
121					}
122				}
123				ImageView imageView = (ImageView) view.findViewById(R.id.message_photo);
124				if (type == RECIEVED) {
125					if(item.getConversation().getMode()==Conversation.MODE_SINGLE) {
126						Uri uri = item.getConversation().getProfilePhotoUri();
127						if (uri!=null) {
128							imageView.setImageURI(uri);
129						} else {
130							imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
131						}
132					} else if (item.getConversation().getMode()==Conversation.MODE_MULTI) {
133						if (item.getCounterpart()!=null) {
134							imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getCounterpart(), 200));
135						} else {
136							imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
137						}
138					}
139				} else {
140					if (selfiUri!=null) {
141						imageView.setImageURI(selfiUri);
142					} else {
143						imageView.setImageBitmap(UIHelper.getUnknownContactPicture(conversation.getAccount().getJid(),200));
144					}
145				}
146				TextView messageBody = (TextView) view.findViewById(R.id.message_body);
147				String body = item.getBody();
148				if (body!=null) {
149					messageBody.setText(body.trim());
150				}
151				TextView time = (TextView) view.findViewById(R.id.message_time);
152				if (item.getStatus() == Message.STATUS_UNSEND) {
153					time.setTypeface(null, Typeface.ITALIC);
154					time.setText("sending\u2026");
155				} else {
156					time.setTypeface(null,Typeface.NORMAL);
157					if ((item.getConversation().getMode()==Conversation.MODE_SINGLE)||(type != RECIEVED)) {
158						time.setText(UIHelper.readableTimeDifference(item
159							.getTimeSent()));
160					} else {
161						time.setText(item.getCounterpart()+" \u00B7 "+UIHelper.readableTimeDifference(item
162								.getTimeSent()));
163					}
164				}
165				return view;
166			}
167		};
168		messagesView.setAdapter(messageListAdapter);
169
170		return view;
171	}
172
173	@Override
174	public void onStart() {
175		super.onStart();
176		final ConversationActivity activity = (ConversationActivity) getActivity();
177		
178		if (activity.xmppConnectionServiceBound) {
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				if (!conversation.isRead()) {
188					conversation.markRead();
189					activity.updateConversationList();
190				}
191			}
192		}
193	}
194	
195	public void onBackendConnected() {
196		final ConversationActivity activity = (ConversationActivity) getActivity();
197		this.conversation = activity.getSelectedConversation();
198		updateMessages();
199		// rendering complete. now go tell activity to close pane
200		if (!activity.shouldPaneBeOpen()) {
201			activity.getSlidingPaneLayout().closePane();
202			activity.getActionBar().setDisplayHomeAsUpEnabled(true);
203			activity.getActionBar().setTitle(conversation.getName());
204			activity.invalidateOptionsMenu();
205			if (!conversation.isRead()) {
206				conversation.markRead();
207				activity.updateConversationList();
208			}
209		}
210	}
211
212	public void updateMessages() {
213		this.messageList.clear();
214		this.messageList.addAll(this.conversation.getMessages());
215		this.messageListAdapter.notifyDataSetChanged();
216		int size = this.messageList.size();
217		if (size >= 1)
218			messagesView.setSelection(size - 1);
219		ConversationActivity activity = (ConversationActivity) getActivity();
220		if (!activity.shouldPaneBeOpen()) {
221			conversation.markRead();
222			activity.updateConversationList();
223		}
224	}
225}