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}