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