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.database.Cursor;
15import android.graphics.Bitmap;
16import android.graphics.Typeface;
17import android.net.Uri;
18import android.os.Bundle;
19import android.preference.PreferenceManager;
20import android.provider.ContactsContract.Profile;
21import android.util.Log;
22import android.view.LayoutInflater;
23import android.view.View;
24import android.view.View.OnClickListener;
25import android.view.ViewGroup;
26import android.widget.ArrayAdapter;
27import android.widget.EditText;
28import android.widget.ListView;
29import android.widget.ImageButton;
30import android.widget.ImageView;
31import android.widget.TextView;
32
33public class ConversationFragment extends Fragment {
34
35 protected Conversation conversation;
36 protected ListView messagesView;
37 protected LayoutInflater inflater;
38 protected List<Message> messageList = new ArrayList<Message>();
39 protected ArrayAdapter<Message> messageListAdapter;
40 protected Contact contact;
41
42 @Override
43 public View onCreateView(final LayoutInflater inflater,
44 ViewGroup container, Bundle savedInstanceState) {
45
46 this.inflater = inflater;
47
48
49 final View view = inflater.inflate(R.layout.fragment_conversation,
50 container, false);
51 ((ImageButton) view.findViewById(R.id.textSendButton))
52 .setOnClickListener(new OnClickListener() {
53
54 @Override
55 public void onClick(View v) {
56 ConversationActivity activity = (ConversationActivity) getActivity();
57 EditText chatMsg = (EditText) view
58 .findViewById(R.id.textinput);
59 if (chatMsg.getText().length() < 1)
60 return;
61 Message message = new Message(conversation, chatMsg
62 .getText().toString(), Message.ENCRYPTION_NONE);
63 activity.xmppConnectionService.sendMessage(conversation.getAccount(),message);
64 chatMsg.setText("");
65
66 if (conversation.getMode()==Conversation.MODE_SINGLE) {
67 conversation.getMessages().add(message);
68 messageList.add(message);
69 }
70
71 activity.updateConversationList();
72
73 messagesView.setSelection(messageList.size() - 1);
74 }
75 });
76
77 messagesView = (ListView) view.findViewById(R.id.messages_view);
78
79 SharedPreferences sharedPref = PreferenceManager
80 .getDefaultSharedPreferences(getActivity().getApplicationContext());
81 boolean showPhoneSelfContactPicture = sharedPref.getBoolean("show_phone_selfcontact_picture",true);
82
83 final Uri selfiUri;
84 if (showPhoneSelfContactPicture) {
85 selfiUri = PhoneHelper.getSefliUri(getActivity());
86 } else {
87 selfiUri = null;
88 }
89
90 messageListAdapter = new ArrayAdapter<Message>(this.getActivity()
91 .getApplicationContext(), R.layout.message_sent, this.messageList) {
92
93 private static final int SENT = 0;
94 private static final int RECIEVED = 1;
95
96 @Override
97 public int getViewTypeCount() {
98 return 2;
99 }
100
101 @Override
102 public int getItemViewType(int position) {
103 if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
104 return RECIEVED;
105 } else {
106 return SENT;
107 }
108 }
109
110 @Override
111 public View getView(int position, View view, ViewGroup parent) {
112 Message item = getItem(position);
113 int type = getItemViewType(position);
114 if (view == null) {
115 switch (type) {
116 case SENT:
117 view = (View) inflater.inflate(R.layout.message_sent,
118 null);
119 break;
120 case RECIEVED:
121 view = (View) inflater.inflate(
122 R.layout.message_recieved, null);
123 break;
124 }
125 }
126 ImageView imageView = (ImageView) view.findViewById(R.id.message_photo);
127 if (type == RECIEVED) {
128 if(item.getConversation().getMode()==Conversation.MODE_SINGLE) {
129 Uri uri = item.getConversation().getProfilePhotoUri();
130 if (uri!=null) {
131 imageView.setImageURI(uri);
132 } else {
133 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
134 }
135 } else if (item.getConversation().getMode()==Conversation.MODE_MULTI) {
136 if (item.getCounterpart()!=null) {
137 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getCounterpart(), 200));
138 } else {
139 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
140 }
141 }
142 } else {
143 if (selfiUri!=null) {
144 imageView.setImageURI(selfiUri);
145 } else {
146 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(conversation.getAccount().getJid(),200));
147 }
148 }
149 TextView messageBody = (TextView) view.findViewById(R.id.message_body);
150 String body = item.getBody();
151 if (body!=null) {
152 messageBody.setText(body.trim());
153 }
154 TextView time = (TextView) view.findViewById(R.id.message_time);
155 if (item.getStatus() == Message.STATUS_UNSEND) {
156 time.setTypeface(null, Typeface.ITALIC);
157 } else {
158 time.setText(UIHelper.readableTimeDifference(item
159 .getTimeSent()));
160 }
161 return view;
162 }
163 };
164 messagesView.setAdapter(messageListAdapter);
165
166 return view;
167 }
168
169 @Override
170 public void onStart() {
171 super.onStart();
172 final ConversationActivity activity = (ConversationActivity) getActivity();
173
174 if (activity.xmppConnectionServiceBound) {
175 this.conversation = activity.getSelectedConversation();
176 updateMessages();
177 // rendering complete. now go tell activity to close pane
178 if (!activity.shouldPaneBeOpen()) {
179 activity.getSlidingPaneLayout().closePane();
180 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
181 activity.getActionBar().setTitle(conversation.getName());
182 activity.invalidateOptionsMenu();
183 }
184 }
185 }
186
187 public void onBackendConnected() {
188 final ConversationActivity activity = (ConversationActivity) getActivity();
189 this.conversation = activity.getSelectedConversation();
190 updateMessages();
191 // rendering complete. now go tell activity to close pane
192 if (!activity.shouldPaneBeOpen()) {
193 activity.getSlidingPaneLayout().closePane();
194 activity.getActionBar().setDisplayHomeAsUpEnabled(true);
195 activity.getActionBar().setTitle(conversation.getName());
196 activity.invalidateOptionsMenu();
197 }
198 }
199
200 public void updateMessages() {
201 this.messageList.clear();
202 this.messageList.addAll(this.conversation.getMessages());
203 this.messageListAdapter.notifyDataSetChanged();
204 int size = this.messageList.size();
205 if (size >= 1)
206 messagesView.setSelection(size - 1);
207 }
208}