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.Conversation;
8import de.gultsch.chat.entities.Message;
9import de.gultsch.chat.utils.UIHelper;
10import android.app.Fragment;
11import android.database.Cursor;
12import android.graphics.Typeface;
13import android.net.Uri;
14import android.os.Bundle;
15import android.provider.ContactsContract.Profile;
16import android.util.Log;
17import android.view.LayoutInflater;
18import android.view.View;
19import android.view.View.OnClickListener;
20import android.view.ViewGroup;
21import android.widget.ArrayAdapter;
22import android.widget.EditText;
23import android.widget.ListView;
24import android.widget.ImageButton;
25import android.widget.ImageView;
26import android.widget.TextView;
27
28public class ConversationFragment extends Fragment {
29
30 protected Conversation conversation;
31 protected ListView messagesView;
32 protected LayoutInflater inflater;
33 protected List<Message> messageList = new ArrayList<Message>();
34 protected ArrayAdapter<Message> messageListAdapter;
35
36 @Override
37 public View onCreateView(final LayoutInflater inflater,
38 ViewGroup container, Bundle savedInstanceState) {
39
40 this.inflater = inflater;
41
42
43
44 final View view = inflater.inflate(R.layout.fragment_conversation,
45 container, false);
46 ((ImageButton) view.findViewById(R.id.textSendButton))
47 .setOnClickListener(new OnClickListener() {
48
49 @Override
50 public void onClick(View v) {
51 ConversationActivity activity = (ConversationActivity) getActivity();
52 EditText chatMsg = (EditText) view
53 .findViewById(R.id.textinput);
54 if (chatMsg.getText().length() < 1)
55 return;
56 Message message = new Message(conversation, chatMsg
57 .getText().toString(), Message.ENCRYPTION_NONE);
58 activity.xmppConnectionService.sendMessage(conversation.getAccount(),message);
59 conversation.getMessages().add(message);
60 chatMsg.setText("");
61
62 messageList.add(message);
63
64 activity.updateConversationList();
65
66 messagesView.setSelection(messageList.size() - 1);
67 }
68 });
69
70 messagesView = (ListView) view.findViewById(R.id.messages_view);
71
72 String[] mProjection = new String[] { Profile._ID,
73 Profile.PHOTO_THUMBNAIL_URI };
74 Cursor mProfileCursor = getActivity().getContentResolver().query(
75 Profile.CONTENT_URI, mProjection, null, null, null);
76
77 mProfileCursor.moveToFirst();
78 final Uri profilePicture = Uri.parse(mProfileCursor.getString(1));
79
80 messageListAdapter = new ArrayAdapter<Message>(this.getActivity()
81 .getApplicationContext(), R.layout.message_sent, this.messageList) {
82
83 private static final int SENT = 0;
84 private static final int RECIEVED = 1;
85
86 @Override
87 public int getViewTypeCount() {
88 return 2;
89 }
90
91 @Override
92 public int getItemViewType(int position) {
93 if (getItem(position).getStatus() == Message.STATUS_RECIEVED) {
94 return RECIEVED;
95 } else {
96 return SENT;
97 }
98 }
99
100 @Override
101 public View getView(int position, View view, ViewGroup parent) {
102 Message item = getItem(position);
103 int type = getItemViewType(position);
104 if (view == null) {
105 switch (type) {
106 case SENT:
107 view = (View) inflater.inflate(R.layout.message_sent,
108 null);
109 break;
110 case RECIEVED:
111 view = (View) inflater.inflate(
112 R.layout.message_recieved, null);
113 break;
114 }
115 }
116 ImageView imageView = (ImageView) view.findViewById(R.id.message_photo);
117 if (type == RECIEVED) {
118 if(item.getConversation().getMode()==Conversation.MODE_SINGLE) {
119 Uri uri = item.getConversation().getProfilePhotoUri();
120 if (uri!=null) {
121 imageView.setImageURI(uri);
122 } else {
123 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
124 }
125 } else if (item.getConversation().getMode()==Conversation.MODE_MULTI) {
126 if (item.getCounterpart()!=null) {
127 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getCounterpart(), 200));
128 } else {
129 imageView.setImageBitmap(UIHelper.getUnknownContactPicture(item.getConversation().getName(), 200));
130 }
131 }
132 } else {
133 imageView.setImageURI(profilePicture);
134 }
135 TextView messageBody = (TextView) view.findViewById(R.id.message_body);
136 String body = item.getBody();
137 if (body!=null) {
138 messageBody.setText(body.trim());
139 }
140 TextView time = (TextView) view.findViewById(R.id.message_time);
141 if (item.getStatus() == Message.STATUS_UNSEND) {
142 time.setTypeface(null, Typeface.ITALIC);
143 } else {
144 time.setText(UIHelper.readableTimeDifference(item
145 .getTimeSent()));
146 }
147 return view;
148 }
149 };
150 messagesView.setAdapter(messageListAdapter);
151
152 return view;
153 }
154
155 @Override
156 public void onStart() {
157 super.onStart();
158
159 Log.d("gultsch","conversationfragment onStart");
160
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 Log.d("gultsch","calling on backend connected in conversation fragment");
178 final ConversationActivity activity = (ConversationActivity) getActivity();
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 }
188 }
189
190 public void updateMessages() {
191 this.messageList.clear();
192 this.messageList.addAll(this.conversation.getMessages());
193 this.messageListAdapter.notifyDataSetChanged();
194 int size = this.messageList.size();
195 if (size >= 1)
196 messagesView.setSelection(size - 1);
197 }
198}