package com.nuscomputing.ivle; import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map; import com.actionbarsherlock.app.SherlockListFragment; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.nuscomputing.ivle.providers.WebcastFilesContract; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentManager; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; import android.support.v4.widget.SimpleCursorAdapter.ViewBinder; import android.text.Html; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.TextView; /** * Fragment to view an announcement. * @author yjwong */ public class ViewWebcastItemGroupsFragment extends SherlockListFragment { // {{{ properties /** TAG for logging */ public static final String TAG = "ViewWebcastItemGroupsFragment"; /** The list adapter */ private SimpleCursorAdapter mAdapter = null; /** The webcast item group ID */ private long mWebcastItemGroupId = -1; /** The bundle containing details used in the AlertDialog */ private LinkedHashMap<String, String> mDetailsDialogMap; // }}} // {{{ methods @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the module info view. return inflater.inflate(R.layout.view_webcast_item_group_fragment, container, false); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Restore the state of this fragment. mDetailsDialogMap = new LinkedHashMap<String, String>(); if (savedInstanceState != null) { // Add the details that were previously there. LinkedHashMap<?, ?> detailsDialogMapTemp = (LinkedHashMap<?, ?>) savedInstanceState.getSerializable("detailsDialogMap"); for (Map.Entry<?, ?> item : detailsDialogMapTemp.entrySet()) { mDetailsDialogMap.put(item.getKey().toString(), item.getValue().toString()); } } // Obtain the webcast item group ID. mWebcastItemGroupId = this.getArguments().getLong("webcastItemGroupId", -1); Log.v(TAG, "requesting files from item group " + mWebcastItemGroupId); if (mWebcastItemGroupId == -1) { throw new IllegalStateException("No webcast ID was passed to ViewWebcastItemGroupsFragment"); } // Define the bindings for the webcast data. String[] uiBindFrom = { WebcastFilesContract.FILE_TITLE, WebcastFilesContract.FILE_DESCRIPTION }; int[] uiBindTo = { R.id.view_webcast_item_group_fragment_list_file_title, R.id.view_webcast_item_group_fragment_list_file_description, }; mAdapter = new SimpleCursorAdapter( getActivity(), R.layout.view_webcast_item_group_fragment_list_item, null, uiBindFrom, uiBindTo, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER ); mAdapter.setViewBinder(new ViewBinder() { @Override public boolean setViewValue(View view, Cursor cursor, int columnIndex) { // The description field. if (columnIndex == cursor.getColumnIndex(WebcastFilesContract.FILE_DESCRIPTION)) { // Filter HTML in description. String description = cursor.getString(columnIndex); description = Html.fromHtml(description).toString(); description = description.replace('\r', ' ').replace('\n', ' ').trim(); TextView tvDescription = (TextView) view; tvDescription.setText(description); return true; } return false; } }); // Load webcast file data. Bundle args = new Bundle(); args.putLong("webcastItemGroupId", mWebcastItemGroupId); DataLoader loader = new DataLoader(getActivity(), mAdapter); getLoaderManager().initLoader(DataLoader.LOADER_VIEW_WEBCAST_ITEM_GROUP_FRAGMENT, args, loader); // Set up the list view. getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); // Show the CAB when long clicked. getListView().setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { // Use contextual action bar to show items. getSherlockActivity().startActionMode(new WebcastFilesActionModeCallback(position)); getListView().setItemChecked(position, true); return true; } }); // Set the list adapter. setListAdapter(mAdapter); } @Override public void onListItemClick(ListView l, View v, int position, long id) { // Prevent item from being checked. getListView().setItemChecked(position, false); // Invoke another item. Intent intent = new Intent(); intent.setClass(getActivity(), ViewWebcastFileActivity.class); intent.putExtra("webcastFileId", id); startActivity(intent); } @Override public void onSaveInstanceState(Bundle outState) { // Put the details bundle into our state. outState.putSerializable("detailsDialogMap", mDetailsDialogMap); } // }}} // {{{ classes /** * ActionMode callbacks for webcast files. * @author yjwong */ class WebcastFilesActionModeCallback implements ActionMode.Callback { // {{{ properties /** The item position */ private int mPosition; // }}} // {{{ methods WebcastFilesActionModeCallback(int position) { mPosition = position; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.view_webcast_item_group_fragment_contextual, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { mode.setTitle("Webcast selected"); return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.view_webcast_item_group_fragment_contextual_details: // Get details. Cursor cursor = (Cursor) getListView().getItemAtPosition(mPosition); cursor.moveToPosition(mPosition); // Add the details. Map<String, String> detailsMap = new LinkedHashMap<String, String>(); detailsMap.put("File Title", cursor.getString(cursor.getColumnIndex(WebcastFilesContract.FILE_TITLE))); detailsMap.put("File Name", cursor.getString(cursor.getColumnIndex(WebcastFilesContract.FILE_NAME))); detailsMap.put("Created", cursor.getString(cursor.getColumnIndex(WebcastFilesContract.CREATE_DATE))); detailsMap.put("Media Format", cursor.getString(cursor.getColumnIndex(WebcastFilesContract.MEDIA_FORMAT))); // Define dialog fragment arguments. Bundle fragmentArgs = new Bundle(); fragmentArgs.putSerializable("items", (Serializable) detailsMap); fragmentArgs.putString("title", "Webcast Details"); // Create the fragment. DialogFragment fragment = new DetailsDialogFragment(); fragment.setArguments(fragmentArgs); // Add the fragment. FragmentManager manager = getFragmentManager(); fragment.show(manager, null); // End contextual action mode. mode.finish(); return true; default: return false; } } @Override public void onDestroyActionMode(ActionMode mode) { // Do nothing. getListView().setItemChecked(mPosition, false); } // }}} } // }}} }