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