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 } else {
155 time.setText(UIHelper.readableTimeDifference(item
156 .getTimeSent()));
157 }
158 return view;
159 }
160 };
161 messagesView.setAdapter(messageListAdapter);
162
163 return view;
164 }
165
166 @Override
167 public void onStart() {
168 super.onStart();
169 final ConversationActivity activity = (ConversationActivity) getActivity();
170
171 if (activity.xmppConnectionServiceBound) {
172 this.conversation = activity.getSelectedConversation();
173 updateMessages();
174 // rendering complete. now go tell activity to close pane
175 if (!activity.shouldPaneBeOpen()) {
176 activity.getSlidingPaneLayout().closePane();
177 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
178 activity.getActionBar().setTitle(conversation.getName());
179 activity.invalidateOptionsMenu();
180 if (!conversation.isRead()) {
181 conversation.markRead();
182 activity.updateConversationList();
183 }
184 }
185 }
186 }
187
188 public void onBackendConnected() {
189 final ConversationActivity activity = (ConversationActivity) getActivity();
190 this.conversation = activity.getSelectedConversation();
191 updateMessages();
192 // rendering complete. now go tell activity to close pane
193 if (!activity.shouldPaneBeOpen()) {
194 activity.getSlidingPaneLayout().closePane();
195 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
196 activity.getActionBar().setTitle(conversation.getName());
197 activity.invalidateOptionsMenu();
198 if (!conversation.isRead()) {
199 conversation.markRead();
200 activity.updateConversationList();
201 }
202 }
203 }
204
205 public void updateMessages() {
206 this.messageList.clear();
207 this.messageList.addAll(this.conversation.getMessages());
208 this.messageListAdapter.notifyDataSetChanged();
209 int size = this.messageList.size();
210 if (size >= 1)
211 messagesView.setSelection(size - 1);
212 ConversationActivity activity = (ConversationActivity) getActivity();
213 if (!activity.shouldPaneBeOpen()) {
214 conversation.markRead();
215 activity.updateConversationList();
216 }
217 }
218}