package com.nuscomputing.ivle; import java.util.Locale; import org.joda.time.DateTime; import com.actionbarsherlock.app.SherlockListFragment; import com.nuscomputing.ivle.providers.AnnouncementsContract; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Typeface; import android.os.Bundle; import android.support.v4.app.LoaderManager; import android.support.v4.widget.CursorAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.TextView; /** * Fragment to list modules. * @author yjwong */ public class NewAnnouncementsFragment extends SherlockListFragment implements DataLoaderListener { // {{{ properties /** TAG for logging */ public static final String TAG = "NewAnnouncementsFragment"; /** Data loader instance */ private DataLoader mLoader; /** LoaderManager instance */ private LoaderManager mLoaderManager; /** The list adapter */ private AnnouncementsCursorAdapter mAdapter = null; // }}} // {{{ methods @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the module info view. return inflater.inflate(R.layout.new_announcements_fragment, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Set up the announcement adapter. mAdapter = new AnnouncementsCursorAdapter( getActivity(), null, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER ); // Load announcement data. mLoader = new DataLoader(getActivity(), mAdapter, this); mLoaderManager = getLoaderManager(); mLoaderManager.initLoader(DataLoader.LOADER_NEW_ANNOUNCEMENTS_FRAGMENT, new Bundle(), mLoader); // Get the listview. getListView().setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Should start a webview here. Intent intent = new Intent(); intent.setClass(getActivity(), ViewAnnouncementActivity.class); intent.putExtra("announcementId", id); startActivity(intent); } }); // Set the list adapter. setListAdapter(mAdapter); } @Override public void onResume() { super.onResume(); // Our announcements list might have changed, requery. getLoaderManager().restartLoader(DataLoader.LOADER_NEW_ANNOUNCEMENTS_FRAGMENT, new Bundle(), mLoader); } public void onLoaderFinished(Bundle result) { TextView tvNoAnnouncements = (TextView) getActivity().findViewById(R.id.new_announcements_fragment_no_announcements); tvNoAnnouncements.setVisibility(result.getInt("cursorCount") == 0 ? TextView.VISIBLE : TextView.GONE); } // }}} // {{{ classes /** * Extended SimpleCursorAdapter to also show unread items. * @author yjwong */ class AnnouncementsCursorAdapter extends CursorAdapter { // {{{ methods public AnnouncementsCursorAdapter(Context context, Cursor c, int flags) { super(context, c, flags); } @Override public View getView(int position, View convertView, ViewGroup parent) { // To reference the child views in subsequent actions. AnnouncementsViewHolder holder; // Inflate the list item. if (convertView == null) { convertView = newView(mContext, null, parent); // Cache view fields into the holder. holder = new AnnouncementsViewHolder(); holder.tvTitle = (TextView) convertView.findViewById(R.id.new_announcements_fragment_list_title); holder.tvDescription = (TextView) convertView.findViewById(R.id.new_announcements_fragment_list_description); holder.tvCreatedDate = (TextView) convertView.findViewById(R.id.new_announcements_fragment_list_created_date); // Associate the holder with the view for later lookup. convertView.setTag(holder); } else { // View already exists, get the holder instance. holder = (AnnouncementsViewHolder) convertView.getTag(); } // Return the view. getCursor().moveToPosition(position); this.bindView(convertView, mContext, getCursor()); return convertView; } @Override public void bindView(View view, Context context, Cursor c) { // Get the view holder. AnnouncementsViewHolder holder = (AnnouncementsViewHolder) view.getTag(); // Set read status. boolean isRead = c.getInt(c.getColumnIndex(AnnouncementsContract.IS_READ)) == 1 ? true : false; if (!isRead) { view.setBackgroundResource(R.drawable.new_announcements_fragment_list_item_unread); holder.tvTitle.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); } else { view.setBackgroundResource(0); holder.tvTitle.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); } // Assign the title. String title = c.getString(c.getColumnIndex(AnnouncementsContract.TITLE)); holder.tvTitle.setText(title); // Use the filtered HTML description. String description = c.getString(c.getColumnIndex(AnnouncementsContract._DESCRIPTION_NOHTML)); holder.tvDescription.setText(description); // Format the date and assign it. DateTime createdDate = new DateTime(c.getString(c.getColumnIndex(AnnouncementsContract.CREATED_DATE))); String month = createdDate.monthOfYear().getAsShortText(Locale.ENGLISH); String day = Integer.toString(createdDate.getDayOfMonth()); String createdDateStr = month.concat(" ").concat(day); holder.tvCreatedDate.setText(createdDateStr); } @Override public View newView(Context context, Cursor c, ViewGroup parent) { // Inflate the layout. LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.new_announcements_fragment_list_item, null); // Return the view. return v; } // }}} } /** * A view holder to cache views for scrolling performance. * @author yjwong */ static class AnnouncementsViewHolder { TextView tvTitle; TextView tvDescription; TextView tvCreatedDate; } // }}} }