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.Beautifier;
 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
 35	@Override
 36	public View onCreateView(final LayoutInflater inflater,
 37			ViewGroup container, Bundle savedInstanceState) {
 38
 39		this.inflater = inflater;
 40
 41
 42
 43		final View view = inflater.inflate(R.layout.fragment_conversation,
 44				container, false);
 45		((ImageButton) view.findViewById(R.id.textSendButton))
 46				.setOnClickListener(new OnClickListener() {
 47
 48					@Override
 49					public void onClick(View v) {
 50						ConversationActivity activity = (ConversationActivity) getActivity();
 51						EditText chatMsg = (EditText) view
 52								.findViewById(R.id.textinput);
 53						if (chatMsg.getText().length() < 1)
 54							return;
 55						Message message = new Message(conversation, chatMsg
 56								.getText().toString(), Message.ENCRYPTION_NONE);
 57						activity.xmppConnectionService.sendMessage(conversation.getAccount(),message);
 58						conversation.getMessages().add(message);
 59						chatMsg.setText("");
 60						
 61						messageList.add(message);
 62						
 63						activity.updateConversationList();
 64						
 65						messagesView.setSelection(messageList.size() - 1);
 66					}
 67				});
 68
 69		messagesView = (ListView) view.findViewById(R.id.messages_view);
 70		
 71		String[] mProjection = new String[] { Profile._ID,
 72				Profile.PHOTO_THUMBNAIL_URI };
 73		Cursor mProfileCursor = getActivity().getContentResolver().query(
 74				Profile.CONTENT_URI, mProjection, null, null, null);
 75
 76		mProfileCursor.moveToFirst();
 77		final Uri profilePicture = Uri.parse(mProfileCursor.getString(1));
 78		
 79		messagesView.setAdapter(new ArrayAdapter<Message>(this.getActivity()
 80				.getApplicationContext(), R.layout.message_sent, this.messageList) {
 81
 82			private static final int SENT = 0;
 83			private static final int RECIEVED = 1;
 84			
 85			@Override
 86			public int getViewTypeCount() {
 87				return 2;
 88			}
 89
 90			@Override
 91			public int getItemViewType(int position) {
 92				if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
 93					return RECIEVED;
 94				} else {
 95					return SENT;
 96				}
 97			}
 98
 99			@Override
100			public View getView(int position, View view, ViewGroup parent) {
101				Message item = getItem(position);
102				int type = getItemViewType(position);
103				if (view == null) {
104					switch (type) {
105					case SENT:
106						view = (View) inflater.inflate(R.layout.message_sent,
107								null);
108						break;
109					case RECIEVED:
110						view = (View) inflater.inflate(
111								R.layout.message_recieved, null);
112						break;
113					}
114				}
115				ImageView imageView = (ImageView) view.findViewById(R.id.message_photo);
116				if (type == RECIEVED) {
117					Uri uri = item.getConversation().getProfilePhotoUri();
118					if (uri!=null) {
119						imageView.setImageURI(uri);
120					} else {
121						imageView.setImageBitmap(Beautifier.getUnknownContactPicture(item.getConversation().getName(), 200));
122					}
123				} else {
124					imageView.setImageURI(profilePicture);
125				}
126				((TextView) view.findViewById(R.id.message_body)).setText(item
127						.getBody().trim());
128				TextView time = (TextView) view.findViewById(R.id.message_time);
129				if (item.getStatus() == Message.STATUS_UNSEND) {
130					time.setTypeface(null, Typeface.ITALIC);
131				} else {
132					time.setText(Beautifier.readableTimeDifference(item
133							.getTimeSent()));
134				}
135				return view;
136			}
137		});
138
139		return view;
140	}
141
142	@Override
143	public void onStart() {
144		super.onStart();
145		
146		Log.d("gultsch","conversationfragment onStart");
147
148		final ConversationActivity activity = (ConversationActivity) getActivity();
149		
150		// TODO check if bond and get data back
151		
152		if (activity.xmppConnectionServiceBound) {
153			this.conversation = activity.getConversationList().get(activity.getSelectedConversation());
154			this.messageList.clear();
155			this.messageList.addAll(this.conversation.getMessages());
156			// rendering complete. now go tell activity to close pane
157			if (!activity.shouldPaneBeOpen()) {
158				activity.getSlidingPaneLayout().closePane();
159				activity.getActionBar().setDisplayHomeAsUpEnabled(true);
160				activity.getActionBar().setTitle(conversation.getName());
161				activity.invalidateOptionsMenu();
162			}
163			
164			int size = this.messageList.size();
165			if (size >= 1)
166				messagesView.setSelection(size - 1);
167		}
168	}
169	
170	public void onBackendConnected() {
171		final ConversationActivity activity = (ConversationActivity) getActivity();
172		this.conversation = activity.getConversationList().get(activity.getSelectedConversation());
173		this.messageList.clear();
174		this.messageList.addAll(this.conversation.getMessages());
175		// rendering complete. now go tell activity to close pane
176		if (!activity.shouldPaneBeOpen()) {
177			activity.getSlidingPaneLayout().closePane();
178			activity.getActionBar().setDisplayHomeAsUpEnabled(true);
179			activity.getActionBar().setTitle(conversation.getName());
180			activity.invalidateOptionsMenu();
181		}
182	}
183}