package in.co.praveenkumar.mdroid.fragment;
import in.co.praveenkumar.R;
import in.co.praveenkumar.mdroid.activity.PostActivity;
import in.co.praveenkumar.mdroid.helper.AppInterface.ForumIdInterface;
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.MoodleDiscussion;
import in.co.praveenkumar.mdroid.task.DiscussionSyncTask;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
/**
* Any activity that includes this Fragment must implement ForumIdInterface
*
* @author Praveen Kumar Pendyala (praveen@praveenkumar.co.in)
*
*/
public class DiscussionFragment extends Fragment implements OnRefreshListener {
private final String DEBUG_TAG = "DiscussionFragment";
TopicListAdapter topicListAdapter;
SessionSetting session;
int forumid = 0;
List<MoodleDiscussion> mTopics;
LinearLayout topicsEmptyLayout;
SwipeRefreshLayout swipeLayout;
/**
* Don't use this constructor. We need a forumid. Any activity that includes
* this Fragment must implement ForumIdInterface
*
* @author Praveen Kumar Pendyala (praveen@praveenkumar.co.in)
*/
public DiscussionFragment() {
}
/**
* Lists all discussions in a forum. Any activity that includes this
* Fragment must implement ForumIdInterface
*
* @param forumid
*/
public void setForumid(int forumid){
this.forumid = forumid;
}
@Override
public void onAttach(Activity a) {
super.onAttach(a);
try {
ForumIdInterface forumidInterface = (ForumIdInterface) a;
this.forumid = forumidInterface.getForumId();
} catch (ClassCastException e) {
e.printStackTrace();
Log.d(DEBUG_TAG, a.toString()
+ " did not implement ForumIdInterface.");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.frag_discussion, container,
false);
topicsEmptyLayout = (LinearLayout) rootView
.findViewById(R.id.discussion_empty_layout);
if (forumid == 0)
return rootView;
session = new SessionSetting(getActivity());
mTopics = MoodleDiscussion.find(MoodleDiscussion.class,
"siteid = ? and forumid = ?", session.getCurrentSiteId() + "",
forumid + "");
ListView topicList = (ListView) rootView
.findViewById(R.id.content_discussion);
topicListAdapter = new TopicListAdapter(getActivity());
topicList.setAdapter(topicListAdapter);
swipeLayout = (SwipeRefreshLayout) rootView
.findViewById(R.id.swipe_refresh);
Workaround.linkSwipeRefreshAndListView(swipeLayout, topicList);
swipeLayout.setOnRefreshListener(this);
new AsyncTopicsSync(session.getmUrl(), session.getToken(),
session.getCurrentSiteId()).execute("");
return rootView;
}
public class TopicListAdapter extends BaseAdapter {
private final Context context;
public TopicListAdapter(Context context) {
this.context = context;
if (!mTopics.isEmpty())
topicsEmptyLayout.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_discussion,
parent, false);
viewHolder.topicname = (TextView) convertView
.findViewById(R.id.discussion_name);
viewHolder.topicreplies = (TextView) convertView
.findViewById(R.id.discussion_reply_count);
viewHolder.topicstarttime = (TextView) convertView
.findViewById(R.id.discussion_startedtime);
viewHolder.topicstartby = (TextView) convertView
.findViewById(R.id.discussion_startedby);
viewHolder.topiclasttime = (TextView) convertView
.findViewById(R.id.discussion_lastmodifiedtime);
viewHolder.topiclastby = (TextView) convertView
.findViewById(R.id.discussion_lastmodifiedby);
// Save the holder with the view
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Assign values
viewHolder.topicname.setText(mTopics.get(position).getName());
viewHolder.topicreplies.setText(mTopics.get(position)
.getNumreplies());
viewHolder.topicstartby.setText(mTopics.get(position)
.getFirstuserfullname());
viewHolder.topiclastby.setText(mTopics.get(position)
.getLastuserfullname());
// Time values
String timeString = TimeFormat.getNiceTime(mTopics.get(position)
.getTimestart());
if (timeString.contentEquals(""))
viewHolder.topicstarttime.setText("Started by");
else
viewHolder.topicstarttime.setText(timeString);
timeString = TimeFormat.getNiceTime(mTopics.get(position)
.getTimemodified());
if (timeString.contentEquals(""))
viewHolder.topiclasttime.setText("Last replied");
else
viewHolder.topiclasttime.setText(timeString);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i = new Intent(context, PostActivity.class);
i.putExtra("discussionid", mTopics.get(position)
.getDiscussionid());
context.startActivity(i);
}
});
return convertView;
}
@Override
public int getCount() {
return mTopics.size();
}
@Override
public Object getItem(int position) {
return mTopics.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public void notifyDataSetChanged() {
if (!mTopics.isEmpty())
topicsEmptyLayout.setVisibility(LinearLayout.GONE);
super.notifyDataSetChanged();
}
}
static class ViewHolder {
TextView topicname;
TextView topicreplies;
TextView topicstarttime;
TextView topicstartby;
TextView topiclasttime;
TextView topiclastby;
}
private class AsyncTopicsSync extends AsyncTask<String, Integer, Boolean> {
Long siteid;
DiscussionSyncTask dst;
public AsyncTopicsSync(String mUrl, String token, Long siteid) {
this.siteid = siteid;
dst = new DiscussionSyncTask(mUrl, token, siteid);
}
@Override
protected void onPreExecute() {
swipeLayout.setRefreshing(true);
}
@Override
protected Boolean doInBackground(String... params) {
return dst.syncDiscussions(forumid);
}
@Override
protected void onPostExecute(Boolean result) {
if (result)
mTopics = MoodleDiscussion
.find(MoodleDiscussion.class,
"siteid = ? and forumid = ?", siteid + "",
forumid + "");
topicListAdapter.notifyDataSetChanged();
swipeLayout.setRefreshing(false);
}
}
@Override
public void onRefresh() {
new AsyncTopicsSync(session.getmUrl(), session.getToken(),
session.getCurrentSiteId()).execute("");
}
}