package org.gscript; import org.gscript.data.ContentUri; import org.gscript.data.library.Library; import org.gscript.data.library.LibraryItem; import org.gscript.process.ProcessService; 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.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; public class FragmentBrowse extends GenericListFragment implements LoaderCallbacks<Cursor> { static final String LOG_TAG = FragmentLibraries.class.getSimpleName(); static final String BUNDLE_LIBRARY_ID = "library_id"; static final String BUNDLE_LIBRARY_PATH = "library_path"; static final String BUNDLE_QUERY_FLAGS = "flags"; static final int LOADER_LIBRARY_ITEM_CURSOR = 2; LibraryItemAdapter mLibraryItemAdapter; int mLibraryId; String mLibraryPath; MenuItem menuEdit; MenuItem menuShortcut; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle args = this.getArguments(); mLibraryId = args.getInt(BUNDLE_LIBRARY_ID); mLibraryPath = args.getString(BUNDLE_LIBRARY_PATH); if (mLibraryPath != null) mLibraryItemAdapter = new LibraryItemAdapter(getActivity(), null, 0); initListFragment(R.layout.fragment_browse, R.id.listViewBrowse, mLibraryItemAdapter); 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_LIBRARY_ITEM_CURSOR, null, this); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_browse, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { Bundle bundle = new Bundle(); bundle.putInt(BUNDLE_QUERY_FLAGS, Library.FLAG_MANUAL_REFRESH); switch (item.getItemId()) { case R.id.menu_browse_refresh: this.getLoaderManager().restartLoader(LOADER_LIBRARY_ITEM_CURSOR, bundle, this); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { FragmentBrowse.FragmentBrowseListener listener = (FragmentBrowse.FragmentBrowseListener) FragmentBrowse.this .getActivity(); LibraryItem item = (LibraryItem) view.getTag(); switch (item.getType()) { case LibraryItem.TYPE_FOLDER: /* browse folder */ listener.browseLibrary( ContentUri.URI_LIBRARY_PATH(item.getLibraryId(), item.getPath(true), 0), null); break; case LibraryItem.TYPE_SCRIPT: /* execute item */ Intent processIntent = new Intent(getActivity(), ProcessService.class); processIntent.setAction(ProcessService.ACTION_EXECUTE); processIntent.setData(ContentUri.URI_LIBRARY_PATH( item.getLibraryId(), item.getPath())); getActivity().startService(processIntent); break; } } @Override public void onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.fragment_browse_context, menu); menuEdit = menu.findItem(R.id.menu_browse_context_edit); menuShortcut = menu.findItem(R.id.menu_browse_context_shortcut); } @Override public void onPrepareActionMode(ActionMode mode, Menu menu) { int checkedItems = getCheckedItemCount(); String title = getSherlockActivity().getResources().getString( R.string.menu_browse_context_title); mode.setTitle(String.format(title, checkedItems)); menuEdit.setVisible(false); menuShortcut.setVisible(false); if (getCheckedItemCount() == 1) { int libraryId = (int) getCheckedItemIds()[0]; Cursor cursor = (Cursor) mLibraryItemAdapter.getItem(libraryId); if (cursor != null) { LibraryItem libraryItem = LibraryItem.fromCursor(cursor); if (libraryItem.getType() == LibraryItem.TYPE_SCRIPT) { Uri itemUri = ContentUri.URI_LIBRARY_PATH( libraryItem.getLibraryId(), libraryItem.getPath()); /* set edit intent */ Intent editIntent = new Intent(getActivity(), LibraryItemActivity.class); editIntent.setAction(LibraryItemActivity.ACTION_EDIT); editIntent.putExtra(LibraryItemActivity.EXTRA_ITEM_PATH, itemUri); menuEdit.setVisible(true); menuEdit.setIntent(editIntent); /* set shortcut intent */ // add the shortcut menuShortcut.setVisible(true); menuShortcut.setIntent(ExecuteDialog.createShortcutIntent( getActivity(), itemUri)); } } } } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menu_browse_context_edit: /* edit checked library item */ Intent editIntent = item.getIntent(); if (editIntent != null) getActivity().startActivity(editIntent); mode.finish(); return true; case R.id.menu_browse_context_shortcut: Intent shortcutIntent = item.getIntent(); if (shortcutIntent != null) { getActivity().sendBroadcast(shortcutIntent); Toast.makeText(getActivity(), "Desktop shortcut broadcasted", Toast.LENGTH_SHORT).show(); } mode.finish(); return true; default: mode.finish(); return true; } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { switch (id) { case LOADER_LIBRARY_ITEM_CURSOR: int flags = Library.FLAG_INCLUDE_PERMISSIONS; if (bundle != null) flags |= bundle.getInt(BUNDLE_QUERY_FLAGS, 0); return new CursorLoader(getSherlockActivity(), ContentUri .URI_LIBRARY_PATH(mLibraryId, mLibraryPath, flags), null, null, null, null); default: return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { switch (loader.getId()) { case LOADER_LIBRARY_ITEM_CURSOR: mLibraryItemAdapter.swapCursor(cursor); restoreCheckedItems(); break; } } @Override public void onLoaderReset(Loader<Cursor> loader) { switch (loader.getId()) { case LOADER_LIBRARY_ITEM_CURSOR: mLibraryItemAdapter.swapCursor(null); break; } } class LibraryItemAdapter extends CursorAdapter { public LibraryItemAdapter(Context context, Cursor c, int flags) { super(context, c, flags); } @Override public void bindView(View view, Context context, Cursor cursor) { final LibraryItem item = LibraryItem.fromCursor(cursor); view.setTag(item); ImageView imageViewIcon = (ImageView) view .findViewById(R.id.list_item_icon); switch (item.getType()) { case LibraryItem.TYPE_FOLDER: imageViewIcon.setImageResource(R.drawable.ic_folder); break; case LibraryItem.TYPE_SCRIPT: imageViewIcon.setImageResource(R.drawable.ic_item); break; } TextView textViewTitle = (TextView) view .findViewById(R.id.list_item_title); textViewTitle.setText(item.getName()); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { final LayoutInflater inflater = LayoutInflater.from(context); View view = inflater.inflate(R.layout.list_library_item, 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; } } public static interface FragmentBrowseListener { public void browseLibrary(Uri path, Bundle extra); } }