package org.gscript;
import org.gscript.data.ContentUri;
import org.gscript.data.LibraryProvider;
import org.gscript.data.library.LibraryAttribute;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
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.Checkable;
import android.widget.ListView;
import android.widget.TextView;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.SubMenu;
public class FragmentLibraries extends GenericListFragment implements
LoaderCallbacks<Cursor> {
static final String LOG_TAG = FragmentLibraries.class.getSimpleName();
static final int LOADER_LIBRARIES_CURSOR = 1;
LibraryAdapter mLibraryAdapter;
String[] mLibraryClasses;
MenuItem menuEdit;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLibraryClasses = getResources()
.getStringArray(R.array.library_classes);
mLibraryAdapter = new LibraryAdapter(getActivity(), null, 0);
initListFragment(R.layout.fragment_libraries, R.id.listViewLibraries,
mLibraryAdapter);
setHasOptionsMenu(true);
}
@Override
public void onResume() {
super.onResume();
/*
* restart loader in onResume because of a "bug" with LoaderManager +
* fragments in a viewpager which causes the adapter to not get updated
* correctly when the fragment is paused.
*/
this.getLoaderManager().restartLoader(LOADER_LIBRARIES_CURSOR, null,
this);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_libraries, menu);
/* add-submenu */
MenuItem addItem = menu.findItem(R.id.menu_libraries_add);
SubMenu submenu = addItem.getSubMenu();
if (submenu != null) {
for (String libraryClassName : mLibraryClasses) {
try {
Class<?> clazz = Class.forName(libraryClassName);
LibraryAttribute attribute = clazz
.getAnnotation(LibraryAttribute.class);
if (attribute != null) {
MenuItem item = submenu.add(attribute.title());
Intent libraryIntent = new Intent(this.getActivity(),
LibraryActivity.class);
libraryIntent.setAction(LibraryActivity.ACTION_ADD);
libraryIntent.putExtra(
LibraryActivity.EXTRA_LIBRARY_TYPE,
libraryClassName);
item.setIntent(libraryIntent);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_libraries_add:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
FragmentBrowse.FragmentBrowseListener listener = (FragmentBrowse.FragmentBrowseListener) FragmentLibraries.this
.getActivity();
listener.browseLibrary(ContentUri.URI_LIBRARY_PATH((int) id, "/", 0),
null);
}
@Override
public void onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.fragment_libraries_context, menu);
menuEdit = menu.findItem(R.id.menu_libraries_context_edit);
}
@Override
public void onPrepareActionMode(ActionMode mode, Menu menu) {
int checkedItems = getCheckedItemCount();
String title = getSherlockActivity().getResources().getString(
R.string.menu_libraries_context_title);
mode.setTitle(String.format(title, checkedItems));
if (menuEdit != null) {
menuEdit.setVisible((checkedItems == 1));
}
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
long[] ids = getCheckedItemIds();
switch (item.getItemId()) {
case R.id.menu_libraries_context_edit:
/* edit checked library item */
Intent editIntent = new Intent(getActivity(), LibraryActivity.class);
int libraryId = (int) ids[0];
editIntent.setAction(LibraryActivity.ACTION_EDIT);
editIntent.putExtra(LibraryActivity.EXTRA_LIBRARY_ID, libraryId);
getActivity().startActivity(editIntent);
mode.finish();
return true;
case R.id.menu_libraries_context_remove:
/* remove checked library items */
for (long id : ids) {
Uri itemUri = Uri.withAppendedPath(ContentUri.URI_LIBRARY, "/"
+ id);
getActivity().getContentResolver().delete(itemUri, null, null);
}
mode.finish();
return true;
default:
mode.finish();
return true;
}
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
switch (id) {
case LOADER_LIBRARIES_CURSOR:
return new CursorLoader(getSherlockActivity(),
ContentUri.URI_LIBRARY, null, null, null,
LibraryProvider.COLUMN_TITLE + " ASC");
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case LOADER_LIBRARIES_CURSOR:
mLibraryAdapter.swapCursor(cursor);
restoreCheckedItems();
break;
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
switch (loader.getId()) {
case LOADER_LIBRARIES_CURSOR:
mLibraryAdapter.swapCursor(null);
break;
}
}
class LibraryAdapter extends CursorAdapter {
public LibraryAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
String title = cursor.getString(cursor
.getColumnIndex(LibraryProvider.COLUMN_TITLE));
TextView textViewTitle = (TextView) view
.findViewById(R.id.list_item_title);
textViewTitle.setText(title);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.list_library, parent, false);
bindView(view, context, cursor);
return view;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
mCursor.moveToPosition(position);
if (view == null) {
view = newView(mContext, mCursor, parent);
} else {
bindView(view, mContext, mCursor);
if (view instanceof Checkable) {
Checkable checkable = (Checkable) view;
checkable.setChecked(((ListView) parent)
.isItemChecked(position));
}
}
return view;
}
}
}