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}