blob: 6e7d5d6a71b2526862c59fc1e9a13415708051e5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
package de.thedevstack.conversationsplus.ui.listeners;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
import java.util.List;
import de.thedevstack.conversationsplus.entities.Conversation;
import de.thedevstack.conversationsplus.entities.Message;
import de.thedevstack.conversationsplus.services.XmppConnectionService;
import de.thedevstack.conversationsplus.ui.ConversationActivity;
import de.thedevstack.conversationsplus.ui.ConversationFragment;
import de.thedevstack.conversationsplus.ui.adapter.MessageAdapter;
/**
* This listener updates the UI when messages are loaded from the server.
*/
public class ConversationMoreMessagesLoadedListener implements XmppConnectionService.OnMoreMessagesLoaded {
private SwipeRefreshLayout swipeLayout;
private List<Message> messageList;
private ConversationFragment fragment;
private ListView messagesView;
private MessageAdapter messageListAdapter;
private Toast messageLoaderToast;
public ConversationMoreMessagesLoadedListener(SwipeRefreshLayout swipeLayout, List<Message> messageList, ConversationFragment fragment, ListView messagesView, MessageAdapter messageListAdapter) {
this.swipeLayout = swipeLayout;
this.messageList = messageList;
this.fragment = fragment;
this.messagesView = messagesView;
this.messageListAdapter = messageListAdapter;
}
@Override
public void onMoreMessagesLoaded(final int c, final Conversation conversation) {
ConversationActivity activity = (ConversationActivity) fragment.getActivity();
if (activity.getSelectedConversation() != conversation) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
swipeLayout.setRefreshing(false);
}
});
return;
}
if (0 == c) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
swipeLayout.setRefreshing(false);
}
});
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
final int oldPosition = messagesView.getFirstVisiblePosition();
int pos = 0;
View v = messagesView.getChildAt(0);
final int pxOffset = (v == null) ? 0 : v.getTop();
if (-1 < oldPosition && messageList.size() > oldPosition) {
Message message = messageList.get(oldPosition);
String uuid = message != null ? message.getUuid() : null;
pos = getIndexOf(uuid, messageList);
}
conversation.populateWithMessages(messageList);
fragment.updateStatusMessages();
messageListAdapter.notifyDataSetChanged();
messagesView.setSelectionFromTop(pos, pxOffset);
if (messageLoaderToast != null) {
messageLoaderToast.cancel();
}
swipeLayout.setRefreshing(false);
}
});
}
@Override
public void informUser(final int resId) {
final ConversationActivity activity = (ConversationActivity) fragment.getActivity();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if (messageLoaderToast != null) {
messageLoaderToast.cancel();
}
messageLoaderToast = Toast.makeText(activity, resId, Toast.LENGTH_LONG);
messageLoaderToast.show();
}
});
}
private int getIndexOf(String uuid, List<Message> messages) {
if (uuid == null) {
return 0;
}
for(int i = 0; i < messages.size(); ++i) {
if (uuid.equals(messages.get(i).getUuid())) {
return i;
} else {
Message next = messages.get(i);
while(next != null && next.wasMergedIntoPrevious()) {
if (uuid.equals(next.getUuid())) {
return i;
}
next = next.next();
}
}
}
return 0;
}
}
|