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 chatMsg.setText("");
60
61 if (conversation.getMode()==Conversation.MODE_SINGLE) {
62 conversation.getMessages().add(message);
63 messageList.add(message);
64 }
65
66 activity.updateConversationList();
67
68 messagesView.setSelection(messageList.size() - 1);
69 }
70 });
71
72 messagesView = (ListView) view.findViewById(R.id.messages_view);
73
74 String[] mProjection = new String[] { Profile._ID,
75 Profile.PHOTO_THUMBNAIL_URI };
76 Cursor mProfileCursor = getActivity().getContentResolver().query(
77 Profile.CONTENT_URI, mProjection, null, null, null);
78
79 mProfileCursor.moveToFirst();
80 final Uri profilePicture = Uri.parse(mProfileCursor.getString(1));
81
82 messageListAdapter = new ArrayAdapter<Message>(this.getActivity()
83 .getApplicationContext(), R.layout.message_sent, this.messageList) {
84
85 private static final int SENT = 0;
86 private static final int RECIEVED = 1;
87
88 @Override
89 public int getViewTypeCount() {
90 return 2;
91 }
92
93 @Override
94 public int getItemViewType(int position) {
95 if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
96 return RECIEVED;
97 } else {
98 return SENT;
99 }
100 }
101
102 @Override
103 public View getView(int position, View view, ViewGroup parent) {
104 Message item = getItem(position);
105 int type = getItemViewType(position);
106 if (view == null) {
107 switch (type) {
108 case SENT:
109 view = (View) inflater.inflate(R.layout.message_sent,
110 null);
111 break;
112 case RECIEVED:
113 view = (View) inflater.inflate(
114 R.layout.message_recieved, null);
115 break;
116 }
117 }
118 ImageView imageView = (ImageView) view.findViewById(R.id.message_photo);
119 if (type == RECIEVED) {
120 if(item.getConversation().getMode()==Conversation.MODE_SINGLE) {
121 Uri uri = item.getConversation().getProfilePhotoUri();
122 if (uri!=null) {
123 imageView.setImageURI(uri);
124 } else {
125 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
126 }
127 } else if (item.getConversation().getMode()==Conversation.MODE_MULTI) {
128 if (item.getCounterpart()!=null) {
129 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getCounterpart(), 200));
130 } else {
131 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
132 }
133 }
134 } else {
135 imageView.setImageURI(profilePicture);
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 } else {
146 time.setText(UIHelper.readableTimeDifference(item
147 .getTimeSent()));
148 }
149 return view;
150 }
151 };
152 messagesView.setAdapter(messageListAdapter);
153
154 return view;
155 }
156
157 @Override
158 public void onStart() {
159 super.onStart();
160 final ConversationActivity activity = (ConversationActivity) getActivity();
161
162 if (activity.xmppConnectionServiceBound) {
163 this.conversation = activity.getSelectedConversation();
164 updateMessages();
165 // rendering complete. now go tell activity to close pane
166 if (!activity.shouldPaneBeOpen()) {
167 activity.getSlidingPaneLayout().closePane();
168 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
169 activity.getActionBar().setTitle(conversation.getName());
170 activity.invalidateOptionsMenu();
171 }
172 }
173 }
174
175 public void onBackendConnected() {
176 final ConversationActivity activity = (ConversationActivity) getActivity();
177 this.conversation = activity.getSelectedConversation();
178 updateMessages();
179 // rendering complete. now go tell activity to close pane
180 if (!activity.shouldPaneBeOpen()) {
181 activity.getSlidingPaneLayout().closePane();
182 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
183 activity.getActionBar().setTitle(conversation.getName());
184 activity.invalidateOptionsMenu();
185 }
186 }
187
188 public void updateMessages() {
189 this.messageList.clear();
190 this.messageList.addAll(this.conversation.getMessages());
191 this.messageListAdapter.notifyDataSetChanged();
192 int size = this.messageList.size();
193 if (size >= 1)
194 messagesView.setSelection(size - 1);
195 }
196}