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