package in.co.praveenkumar.mdroid.fragment;
import in.co.praveenkumar.R;
import in.co.praveenkumar.mdroid.helper.AppInterface.DiscussionIdInterface;
import in.co.praveenkumar.mdroid.helper.ImageLoader;
import in.co.praveenkumar.mdroid.helper.LetterColor;
import in.co.praveenkumar.mdroid.helper.SessionSetting;
import in.co.praveenkumar.mdroid.helper.TimeFormat;
import in.co.praveenkumar.mdroid.helper.Workaround;
import in.co.praveenkumar.mdroid.model.MoodlePost;
import in.co.praveenkumar.mdroid.task.PostSyncTask;
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.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.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class PostFragment extends Fragment implements OnRefreshListener {
private final String DEBUG_TAG = "PostFragment";
PostListAdapter postListAdapter;
SessionSetting session;
int discussionid = 0;
List<MoodlePost> mPosts;
LinearLayout postsEmptyLayout;
SwipeRefreshLayout swipeLayout;
/**
* This constructor lists all forums in the site. Don't use this
* constructor.
*/
public PostFragment() {
}
/**
* If you want to list all forums, use courseid = 0
*
* @param discussionid
*/
public void setDiscussionid(int discussionid) {
this.discussionid = discussionid;
}
@Override
public void onAttach(Activity a) {
super.onAttach(a);
try {
DiscussionIdInterface discussionidInterface = (DiscussionIdInterface) a;
this.discussionid = discussionidInterface.getDiscussionId();
} catch (ClassCastException e) {
e.printStackTrace();
Log.d(DEBUG_TAG,
a.toString()
+ " did not implement DiscussionIdInterface. Fragment may not list any posts.");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.frag_post, container, false);
postsEmptyLayout = (LinearLayout) rootView
.findViewById(R.id.post_empty_layout);
if (discussionid == 0)
return rootView;
session = new SessionSetting(getActivity());
mPosts = MoodlePost.find(MoodlePost.class,
"siteid = ? and discussionid = ?", String.valueOf(session.getCurrentSiteId())
, String.valueOf(discussionid));
sortPostsByTime();
ListView postList = (ListView) rootView.findViewById(R.id.content_post);
postListAdapter = new PostListAdapter(getActivity());
postList.setAdapter(postListAdapter);
swipeLayout = (SwipeRefreshLayout) rootView
.findViewById(R.id.swipe_refresh);
Workaround.linkSwipeRefreshAndListView(swipeLayout, postList);
swipeLayout.setOnRefreshListener(this);
new AsyncPostsSync(session.getmUrl(), session.getToken(),
session.getCurrentSiteId()).execute("");
return rootView;
}
public class PostListAdapter extends BaseAdapter {
private final Context context;
public PostListAdapter(Context context) {
this.context = context;
if (!mPosts.isEmpty())
postsEmptyLayout.setVisibility(LinearLayout.GONE);
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item_post, parent,
false);
viewHolder.postauthorimage = (TextView) convertView
.findViewById(R.id.post_authorimage);
viewHolder.postsubject = (TextView) convertView
.findViewById(R.id.post_subject);
viewHolder.postauthor = (TextView) convertView
.findViewById(R.id.post_author);
viewHolder.postlastmodified = (TextView) convertView
.findViewById(R.id.post_lastmodifiedtime);
viewHolder.postcontent = (TextView) convertView
.findViewById(R.id.post_content);
// Save the holder with the view
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Assign values
viewHolder.postsubject.setText(mPosts.get(position).getSubject());
viewHolder.postauthor.setText(mPosts.get(position)
.getUserfullname());
viewHolder.postlastmodified.setText(TimeFormat.getNiceTime(mPosts
.get(position).getModified()));
// Post content as HTML & links clickable
String message = mPosts.get(position).getMessage();
viewHolder.postcontent.setText(
Html.fromHtml(message, new ImageLoader(context, viewHolder.postcontent), null));
viewHolder.postcontent.setMovementMethod(LinkMovementMethod.getInstance());
// Author image color and value
String authorName = mPosts.get(position).getUserfullname();
char firstChar = 0;
if (authorName != null)
if (authorName.length() != 0)
firstChar = authorName.charAt(0);
viewHolder.postauthorimage.setText(firstChar + "");
viewHolder.postauthorimage.setBackgroundColor(LetterColor
.of(firstChar));
return convertView;
}
@Override
public int getCount() {
return mPosts.size();
}
@Override
public Object getItem(int position) {
return mPosts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
static class ViewHolder {
TextView postauthorimage;
TextView postsubject;
TextView postauthor;
TextView postlastmodified;
TextView postcontent;
}
/**
* This will sort the posts by the time they were posted. This is requried
* after every update to posts list or else the order may be lost.
*/
private void sortPostsByTime() {
Collections.sort(mPosts, new Comparator<MoodlePost>() {
public int compare(MoodlePost o1, MoodlePost o2) {
if (o1.getCreated() == o2.getCreated())
return 0;
return o1.getCreated() < o2.getCreated() ? -1 : 1;
}
});
}
private class AsyncPostsSync extends AsyncTask<String, Integer, Boolean> {
Long siteid;
PostSyncTask pst;
Boolean syncStatus;
public AsyncPostsSync(String mUrl, String token, Long siteid) {
this.siteid = siteid;
pst = new PostSyncTask(mUrl, token, siteid);
}
@Override
protected void onPreExecute() {
swipeLayout.setRefreshing(true);
}
@Override
protected Boolean doInBackground(String... params) {
syncStatus = pst.syncPosts(discussionid);
if (syncStatus) {
mPosts = MoodlePost.find(MoodlePost.class,
"siteid = ? and discussionid = ?", String.valueOf(siteid),
String.valueOf(discussionid));
sortPostsByTime();
return true;
} else
return false;
}
@Override
protected void onPostExecute(Boolean result) {
postListAdapter.notifyDataSetChanged();
if (!mPosts.isEmpty())
postsEmptyLayout.setVisibility(LinearLayout.GONE);
swipeLayout.setRefreshing(false);
}
}
@Override
public void onRefresh() {
new AsyncPostsSync(session.getmUrl(), session.getToken(),
session.getCurrentSiteId()).execute("");
}
}