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