package com.nuscomputing.ivle.online;
import java.util.Arrays;
import java.util.List;
import android.annotation.TargetApi;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.AsyncTaskLoader;
import android.support.v4.content.Loader;
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.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
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.DataLoader;
import com.nuscomputing.ivle.IVLEUtils;
import com.nuscomputing.ivle.R;
import com.nuscomputing.ivlelapi.FailedLoginException;
import com.nuscomputing.ivlelapi.IVLE;
import com.nuscomputing.ivlelapi.JSONParserException;
import com.nuscomputing.ivlelapi.Module;
import com.nuscomputing.ivlelapi.NetworkErrorException;
import com.nuscomputing.ivlelapi.Weblink;
/**
* Fragment to list modules.
* @author yjwong
*/
public class ModuleWeblinksFragment extends SherlockListFragment {
// {{{ properties
/** TAG for logging */
public static final String TAG = "ModuleWeblinksFragment";
/** The layout inflater */
private LayoutInflater mLayoutInflater;
/** The module IVLE ID */
private String mModuleIvleId;
// }}}
// {{{ methods
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the module info view.
return inflater.inflate(R.layout.module_weblinks_fragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Obtain the module IVLE ID.
Bundle args = getArguments();
mModuleIvleId = args.getString("moduleIvleId");
if (mModuleIvleId == null) {
throw new IllegalStateException("No module IVLE ID was passed to ModuleWeblinksFragment");
}
// Get the layout inflater.
mLayoutInflater = getActivity().getLayoutInflater();
// Load the weblinks.
getLoaderManager().initLoader(DataLoader.LOADER_MODULE_WEBLINKS_FRAGMENT, args, new WeblinksLoaderCallbacks());
// 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 WeblinksActionModeCallback(position));
getListView().setItemChecked(position, true);
return true;
}
});
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Get the weblink object.
Weblink weblink = (Weblink) getListView().getItemAtPosition(position);
// Create the intent.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(weblink.url));
startActivity(intent);
// Remove the selection.
l.setItemChecked(position, false);
}
// }}}
// {{{ classes
/**
* The list adapter for lecturers.
* @author yjwong
*/
@TargetApi(11)
class WeblinkAdapter extends ArrayAdapter<Weblink> {
// {{{ methods
public WeblinkAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public WeblinkAdapter(Context context, int textViewResourceId,
List<Weblink> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the item.
final Weblink weblink = getItem(position);
// Inflate list item from layout XML.
convertView = mLayoutInflater.inflate(R.layout.module_weblinks_fragment_list_item, null);
// Set the description.
TextView tvDescription = (TextView) convertView.findViewById(R.id.module_weblinks_fragment_list_description);
tvDescription.setText(weblink.description);
// Set the site type.
TextView tvURL = (TextView) convertView.findViewById(R.id.module_weblinks_fragment_list_url);
tvURL.setText(weblink.url);
// Return the view.
return convertView;
}
// }}}
}
// }}}
// {{{ classes
/**
* The loader callbacks for module information.
* @author yjwong
*/
class WeblinksLoaderCallbacks implements
LoaderManager.LoaderCallbacks<List<Weblink>> {
// {{{ methods
@Override
public Loader<List<Weblink>> onCreateLoader(int id, Bundle args) {
// We are loading!
ArrayAdapter<String> loadingAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, new String[] { getString(R.string.loading) });
setListAdapter(loadingAdapter);
return new WeblinksLoader(getActivity(), args);
}
@Override
public void onLoadFinished(Loader<List<Weblink>> loader, List<Weblink> result) {
// Set the view data.
if (result != null) {
if (result.size() == 0) {
TextView tvNoLecturers = (TextView) getActivity().findViewById(R.id.module_weblinks_fragment_no_weblinks);
tvNoLecturers.setVisibility(View.VISIBLE);
// Hide the list.
ListView listview = getListView();
listview.setVisibility(View.GONE);
} else {
// Create new list adapter.
WeblinkAdapter adapter = new WeblinkAdapter(getActivity(), R.id.module_weblinks_fragment_no_weblinks, result);
setListAdapter(adapter);
}
} else {
Toast.makeText(getActivity(), R.string.module_lecturers_fragment_unable_to_load, Toast.LENGTH_SHORT)
.show();
}
}
@Override
public void onLoaderReset(Loader<List<Weblink>> loader) {
// Do nothing.
}
// }}}
}
/**
* The weblinks loader.
* @author yjwong
*/
static class WeblinksLoader extends AsyncTaskLoader<List<Weblink>> {
// {{{ properties
/** Arguments to this loader */
private Bundle mArgs;
/** The context */
private Context mContext;
/** The list of weblinks */
private List<Weblink> mWeblinks;
// }}}
// {{{ methods
WeblinksLoader(Context context, Bundle args) {
super(context);
mContext = context;
mArgs = args;
}
@Override
public void onStartLoading() {
if (mWeblinks != null ) {
deliverResult(mWeblinks);
}
if (takeContentChanged() || mWeblinks == null) {
forceLoad();
}
}
@Override
public List<Weblink> loadInBackground() {
// Obtain the IVLE ID.
String moduleIvleId = mArgs.getString("moduleIvleId");
// Acquire a new IVLE object.
IVLE ivle = IVLEUtils.getIVLEInstance(mContext);
try {
Weblink[] weblinks = Module.getWeblinks(ivle, moduleIvleId);
mWeblinks = Arrays.asList(weblinks);
return mWeblinks;
} catch (NetworkErrorException e) {
Log.e(TAG, "NetworkErrorException encountered while loading lecturers");
} catch (FailedLoginException e) {
Log.e(TAG, "FailedLoginException encountered while loading lecturers");
} catch (JSONParserException e) {
Log.e(TAG, "JSONParserException encountered while loading lecturers");
}
return null;
}
// }}}
}
/**
* ActionMode callbacks for weblinks.
* @author yjwong
*/
class WeblinksActionModeCallback implements ActionMode.Callback {
// {{{ properties
/** The item position */
private int mPosition;
// }}}
// {{{ methods
WeblinksActionModeCallback(int position) {
mPosition = position;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.view_weblinks_fragment_contextual, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode,
Menu menu) {
mode.setTitle("Weblink selected");
return false;
}
@SuppressWarnings("deprecation")
@TargetApi(11)
@Override
public boolean onActionItemClicked(ActionMode mode,
MenuItem item) {
// Get details.
Weblink weblink = (Weblink) getListView().getItemAtPosition(mPosition);
switch (item.getItemId()) {
case R.id.view_weblinks_fragment_contextual_copy:
// Copy URL to clipboard.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ClipboardManager manager = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("weblinkUrl", weblink.url);
manager.setPrimaryClip(clip);
} else {
android.text.ClipboardManager manager = (android.text.ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
manager.setText(weblink.url);
}
// Show a toast.
Toast.makeText(getActivity(), "Weblink copied.", Toast.LENGTH_SHORT).show();
// End contextual action mode.
mode.finish();
return true;
case R.id.view_weblinks_fragment_contextual_share:
// Create share intent.
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, weblink.description);
intent.putExtra(Intent.EXTRA_TEXT, weblink.url);
startActivity(Intent.createChooser(intent, getString(R.string.share_via)));
// End contextual action mode.
mode.finish();
return true;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// Do nothing.
getListView().setItemChecked(mPosition, false);
}
// }}}
}
// }}}
}