summaryrefslogtreecommitdiffstats
path: root/src/com/android/photos/PhotoSetFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/photos/PhotoSetFragment.java')
-rw-r--r--src/com/android/photos/PhotoSetFragment.java166
1 files changed, 119 insertions, 47 deletions
diff --git a/src/com/android/photos/PhotoSetFragment.java b/src/com/android/photos/PhotoSetFragment.java
index 18587fcf3..25d80360d 100644
--- a/src/com/android/photos/PhotoSetFragment.java
+++ b/src/com/android/photos/PhotoSetFragment.java
@@ -18,46 +18,58 @@ package com.android.photos;
import android.app.Fragment;
import android.app.LoaderManager.LoaderCallbacks;
-import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
-import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
+import android.util.SparseBooleanArray;
+import android.view.ActionMode;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
+import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
-import android.widget.CursorAdapter;
import android.widget.GridView;
-import android.widget.ImageView;
+import android.widget.ShareActionProvider;
+import android.widget.ShareActionProvider.OnShareTargetSelectedListener;
import com.android.gallery3d.R;
import com.android.gallery3d.app.Gallery;
+import com.android.gallery3d.data.MediaItem;
+import com.android.photos.adapters.PhotoThumbnailAdapter;
import com.android.photos.data.PhotoSetLoader;
import com.android.photos.shims.LoaderCompatShim;
import com.android.photos.shims.MediaItemsLoader;
-import com.android.photos.views.GalleryThumbnailView.GalleryThumbnailAdapter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
public class PhotoSetFragment extends Fragment implements LoaderCallbacks<Cursor>,
- OnItemClickListener {
+ OnItemClickListener, SelectionManager.SelectedUriSource, MultiChoiceModeListener,
+ OnShareTargetSelectedListener {
private static final int LOADER_PHOTOSET = 1;
private GridView mPhotoSetView;
private View mEmptyView;
- private ThumbnailAdapter mAdapter;
+
private boolean mInitialLoadComplete = false;
private LoaderCompatShim<Cursor> mLoaderCompatShim;
+ private PhotoThumbnailAdapter mAdapter;
+ private SelectionManager mSelectionManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mAdapter = new ThumbnailAdapter(getActivity());
+ GalleryActivity activity = (GalleryActivity) getActivity();
+ mSelectionManager = activity.getSelectionManager();
+ mAdapter = new PhotoThumbnailAdapter(activity);
}
@Override
@@ -71,6 +83,8 @@ public class PhotoSetFragment extends Fragment implements LoaderCallbacks<Cursor
mEmptyView = root.findViewById(android.R.id.empty);
mEmptyView.setVisibility(View.GONE);
mPhotoSetView.setAdapter(mAdapter);
+ mPhotoSetView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
+ mPhotoSetView.setMultiChoiceModeListener(this);
getLoaderManager().initLoader(LOADER_PHOTOSET, null, this);
updateEmptyStatus();
return root;
@@ -101,9 +115,9 @@ public class PhotoSetFragment extends Fragment implements LoaderCallbacks<Cursor
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO: Switch to PhotoSetLoader
MediaItemsLoader loader = new MediaItemsLoader(getActivity());
- mAdapter.setDrawableFactory(loader);
mInitialLoadComplete = false;
mLoaderCompatShim = loader;
+ mAdapter.setDrawableFactory(mLoaderCompatShim);
return loader;
}
@@ -115,54 +129,112 @@ public class PhotoSetFragment extends Fragment implements LoaderCallbacks<Cursor
updateEmptyStatus();
}
+ private Set<Uri> mSelectedUris = new HashSet<Uri>();
+ private ArrayList<Uri> mSelectedUrisArray = new ArrayList<Uri>();
+
+ @Override
+ public ArrayList<Uri> getSelectedShareableUris() {
+ mSelectedUrisArray.clear();
+ mSelectedUrisArray.addAll(mSelectedUris);
+ return mSelectedUrisArray;
+ }
+
+ public ArrayList<Uri> getSelectedShareableUrisUncached() {
+ mSelectedUrisArray.clear();
+ SparseBooleanArray selected = mPhotoSetView.getCheckedItemPositions();
+
+ for (int i = 0; i < selected.size(); i++) {
+ if (selected.valueAt(i)) {
+ Cursor item = mAdapter.getItem(selected.keyAt(i));
+ int supported = item.getInt(PhotoSetLoader.INDEX_SUPPORTED_OPERATIONS);
+ if ((supported & MediaItem.SUPPORT_SHARE) > 0) {
+ mSelectedUrisArray.add(mLoaderCompatShim.uriForItem(item));
+ }
+ }
+ }
+
+ return mSelectedUrisArray;
+ }
+
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
- private static class ThumbnailAdapter extends CursorAdapter implements GalleryThumbnailAdapter {
- private LayoutInflater mInflater;
- private LoaderCompatShim<Cursor> mDrawableFactory;
- public ThumbnailAdapter(Context context) {
- super(context, null, false);
- mInflater = LayoutInflater.from(context);
- }
+ private ShareActionProvider mShareActionProvider;
+ private ActionMode mActionMode;
+ private boolean mSharePending = false;
- public void setDrawableFactory(LoaderCompatShim<Cursor> factory) {
- mDrawableFactory = factory;
- }
+ private void updateSelectedTitle(ActionMode mode) {
+ int count = mPhotoSetView.getCheckedItemCount();
+ mode.setTitle(getResources().getQuantityString(
+ R.plurals.number_of_items_selected, count, count));
+ }
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- ImageView iv = (ImageView) view;
- Drawable recycle = iv.getDrawable();
- Drawable drawable = mDrawableFactory.drawableForItem(cursor, recycle);
- if (recycle != drawable) {
- iv.setImageDrawable(drawable);
- }
- }
+ @Override
+ public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
+ boolean checked) {
+ updateSelectedTitle(mode);
+ Cursor item = mAdapter.getItem(position);
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- View view = mInflater.inflate(R.layout.photo_set_item, parent, false);
- LayoutParams params = view.getLayoutParams();
- int columnWidth = ((GridView) parent).getColumnWidth();
- params.height = columnWidth;
- view.setLayoutParams(params);
- return view;
+ if (checked) {
+ mSelectedUris.add(mLoaderCompatShim.uriForItem(item));
+ } else {
+ mSelectedUris.remove(mLoaderCompatShim.uriForItem(item));
}
- @Override
- public float getIntrinsicAspectRatio(int position) {
- Cursor cursor = getItem(position);
- float width = cursor.getInt(PhotoSetLoader.INDEX_WIDTH);
- float height = cursor.getInt(PhotoSetLoader.INDEX_HEIGHT);
- return width / height;
- }
+ mSelectionManager.onItemSelectedStateChanged(mShareActionProvider,
+ item.getInt(PhotoSetLoader.INDEX_MEDIA_TYPE),
+ item.getInt(PhotoSetLoader.INDEX_SUPPORTED_OPERATIONS),
+ checked);
+ }
+
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ mSelectionManager.setSelectedUriSource(PhotoSetFragment.this);
+ mActionMode = mode;
+ MenuInflater inflater = mode.getMenuInflater();
+ inflater.inflate(R.menu.gallery_multiselect, menu);
+ MenuItem menuItem = menu.findItem(R.id.menu_share);
+ mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
+ mShareActionProvider.setOnShareTargetSelectedListener(this);
+ updateSelectedTitle(mode);
+ return true;
+ }
- @Override
- public Cursor getItem(int position) {
- return (Cursor) super.getItem(position);
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ mSelectedUris.clear();
+ if (mSharePending) {
+ // onDestroyActionMode gets called when the share target was selected,
+ // but apparently before the ArrayList is serialized in the intent
+ // so we can't clear the old one here.
+ mSelectedUrisArray = new ArrayList<Uri>();
+ mSharePending = false;
+ } else {
+ mSelectedUrisArray.clear();
}
+ mSelectionManager.onClearSelection();
+ mSelectionManager.setSelectedUriSource(null);
+ mShareActionProvider = null;
+ mActionMode = null;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ updateSelectedTitle(mode);
+ return false;
+ }
+
+ @Override
+ public boolean onShareTargetSelected(ShareActionProvider provider, Intent intent) {
+ mSharePending = true;
+ mActionMode.finish();
+ return false;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return false;
}
}