package in.co.praveenkumar.mdroid.fragment;
import in.co.praveenkumar.R;
import in.co.praveenkumar.mdroid.activity.MessagingActivity;
import in.co.praveenkumar.mdroid.helper.AppInterface;
import in.co.praveenkumar.mdroid.helper.AppInterface.UserIdInterface;
import in.co.praveenkumar.mdroid.helper.LetterColor;
import in.co.praveenkumar.mdroid.helper.SessionSetting;
import in.co.praveenkumar.mdroid.helper.Workaround;
import in.co.praveenkumar.mdroid.model.MoodleMessage;
import in.co.praveenkumar.mdroid.task.MessageSyncTask;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class MessageListingFragment extends Fragment implements
OnRefreshListener {
final String DEBUG_TAG = "MessageListingFragment";
List<ListMessage> messages = new ArrayList<>();
FragmentManager mFragmentManager;
MessageListAdapter adapter;
SessionSetting session;
LinearLayout messagesEmptyLayout;
SwipeRefreshLayout swipeLayout;
UserIdInterface useridInterface;
AppInterface.FragmentChanger fragmentChanger;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.frag_message_listing,
container, false);
messagesEmptyLayout = (LinearLayout) rootView
.findViewById(R.id.messages_empty_layout);
ListView messageList = (ListView) rootView
.findViewById(R.id.content_message_listing);
// Setup siteinfo and messages
session = new SessionSetting(getActivity());
setupMessages();
// Setup list adapter
adapter = new MessageListAdapter(getActivity());
messageList.setAdapter(adapter);
// itemclick listener
messageList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
useridInterface.setUserId(messages.get(position).userid);
fragmentChanger.changeFragment(MessagingActivity.FRAG_MESSAGING, true);
}
});
swipeLayout = (SwipeRefreshLayout) rootView
.findViewById(R.id.swipe_refresh);
Workaround.linkSwipeRefreshAndListView(swipeLayout, messageList);
swipeLayout.setOnRefreshListener(this);
new MessageSyncerBg().execute("");
return rootView;
}
@Override
public void onAttach(Activity a) {
super.onAttach(a);
try {
useridInterface = (UserIdInterface) a;
fragmentChanger = (AppInterface.FragmentChanger) a;
mFragmentManager = ((MessagingActivity) a).getSupportFragmentManager();
} catch (ClassCastException e) {
e.printStackTrace();
Log.d(DEBUG_TAG, a.toString()
+ " did not implement UserIdInterface.");
}
}
private class MessageSyncerBg extends AsyncTask<String, Integer, Boolean> {
@Override
protected void onPreExecute() {
swipeLayout.setRefreshing(true);
}
@Override
protected Boolean doInBackground(String... params) {
// Sync from server and update
MessageSyncTask mst = new MessageSyncTask(session.getmUrl(),
session.getToken(), session.getCurrentSiteId());
return mst.syncMessages(session.getSiteInfo().getUserid());
}
@Override
protected void onPostExecute(Boolean result) {
setupMessages();
adapter.notifyDataSetChanged();
swipeLayout.setRefreshing(false);
}
}
public class MessageListAdapter extends BaseAdapter {
private final Context context;
public MessageListAdapter(Context context) {
this.context = context;
if (messages == null || messages.isEmpty())
messagesEmptyLayout.setVisibility(LinearLayout.VISIBLE);
else
messagesEmptyLayout.setVisibility(LinearLayout.GONE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_message_list,
parent, false);
viewHolder.userimage = (TextView) convertView
.findViewById(R.id.list_message_contact_image);
viewHolder.userfullname = (TextView) convertView
.findViewById(R.id.list_message_contact_name);
viewHolder.lastmessage = (TextView) convertView
.findViewById(R.id.list_message_last_message);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Contact image color and value
String name = messages.get(position).userfullname;
char firstChar = 0;
if (name.length() != 0)
firstChar = name.charAt(0);
viewHolder.userimage.setText(firstChar + "");
viewHolder.userimage.setBackgroundColor(LetterColor.of(firstChar));
// Name
viewHolder.userfullname
.setText(messages.get(position).userfullname);
// Last message after trimming html special chars
String msg = messages.get(position).message.getText();
msg = (msg == null) ? "" : Html.fromHtml(msg).toString().trim();
viewHolder.lastmessage.setText(msg);
return convertView;
}
@Override
public int getCount() {
if (messages == null)
return 0;
return messages.size();
}
@Override
public Object getItem(int position) {
return messages.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void notifyDataSetChanged() {
if (!messages.isEmpty())
messagesEmptyLayout.setVisibility(LinearLayout.GONE);
super.notifyDataSetChanged();
}
}
static class ViewHolder {
TextView userimage;
TextView userfullname;
TextView lastmessage;
}
void setupMessages() {
List<MoodleMessage> mMessages = MoodleMessage.find(MoodleMessage.class,
"siteid = ?", session.getCurrentSiteId() + "");
List<ListMessage> lMessages = new ArrayList<>();
// Sort messages with newest first in list
Collections.sort(mMessages, new Comparator<MoodleMessage>() {
public int compare(MoodleMessage m1, MoodleMessage m2) {
if (m1.getTimecreated() == m2.getTimecreated())
return 0;
return m1.getTimecreated() < m2.getTimecreated() ? 1 : -1;
}
});
List<Integer> userids = new ArrayList<>();
int currentuserid = session.getSiteInfo().getUserid();
for (int i = 0; i < mMessages.size(); i++) {
// Message sent by current user
if (currentuserid != mMessages.get(i).getUseridto()
&& !isInList(userids, mMessages.get(i).getUseridto())) {
ListMessage mes = new ListMessage();
mes.message = mMessages.get(i);
mes.userid = mMessages.get(i).getUseridto();
mes.userfullname = mMessages.get(i).getUsertofullname();
lMessages.add(mes);
userids.add(mMessages.get(i).getUseridto());
}
// Message received by current user
else if (currentuserid != mMessages.get(i).getUseridfrom()
&& !isInList(userids, mMessages.get(i).getUseridfrom())) {
ListMessage mes = new ListMessage();
mes.message = mMessages.get(i);
mes.userid = mMessages.get(i).getUseridfrom();
mes.userfullname = mMessages.get(i).getUserfromfullname();
lMessages.add(mes);
userids.add(mMessages.get(i).getUseridfrom());
}
}
messages = (lMessages != null) ? lMessages
: new ArrayList<MessageListingFragment.ListMessage>();
}
Boolean isInList(List<Integer> ids, int id) {
for (int i = 0; i < ids.size(); i++)
if (ids.get(i).intValue() == id)
return true;
return false;
}
class ListMessage {
/**
* Moodle message
*/
MoodleMessage message;
/**
* userid of the user, other the current login user, who is
* participating in this message
*/
int userid;
/**
* Fullname of the user, other the current login user, who is
* participating in this message
*/
String userfullname;
}
@Override
public void onRefresh() {
new MessageSyncerBg().execute("");
}
}