diff options
author | Bobby Georgescu <georgescu@google.com> | 2013-03-07 14:15:57 -0800 |
---|---|---|
committer | Bobby Georgescu <georgescu@google.com> | 2013-03-08 15:41:15 -0800 |
commit | 755e327f63197c2798394bc805df8d98c2f6b6d3 (patch) | |
tree | 83ae5950aa2b35fe38fee84795d0a038fada6be8 /src/com/android/photos/PhotoSetFragment.java | |
parent | 0d84f476ed24922864f39d54e09274f6feac085e (diff) | |
download | android_packages_apps_Snap-755e327f63197c2798394bc805df8d98c2f6b6d3.tar.gz android_packages_apps_Snap-755e327f63197c2798394bc805df8d98c2f6b6d3.tar.bz2 android_packages_apps_Snap-755e327f63197c2798394bc805df8d98c2f6b6d3.zip |
Add sharing support
Change-Id: I2c7f18b0d6dd057c1fba96c1133d563f32abf55c
Diffstat (limited to 'src/com/android/photos/PhotoSetFragment.java')
-rw-r--r-- | src/com/android/photos/PhotoSetFragment.java | 166 |
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; } } |