aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryEditFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryEditFragment.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryEditFragment.java191
1 files changed, 191 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryEditFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryEditFragment.java
new file mode 100644
index 000000000..e99418720
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryEditFragment.java
@@ -0,0 +1,191 @@
+package org.wordpress.android.ui.media;
+
+import android.app.Fragment;
+import android.database.Cursor;
+import android.database.CursorWrapper;
+import android.os.Bundle;
+import android.util.SparseIntArray;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+
+import com.mobeta.android.dslv.DragSortListView;
+import com.mobeta.android.dslv.DragSortListView.DropListener;
+import com.mobeta.android.dslv.DragSortListView.RemoveListener;
+
+import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Fragment where containing a drag-sort listview where the user can drag items
+ * to change their position in a media gallery
+ */
+public class MediaGalleryEditFragment extends Fragment implements DropListener, RemoveListener {
+ private static final String SAVED_MEDIA_IDS = "SAVED_MEDIA_IDS";
+ private MediaGalleryAdapter mGridAdapter;
+ private ArrayList<String> mIds;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+
+ mIds = new ArrayList<String>();
+ if (savedInstanceState != null) {
+ mIds = savedInstanceState.getStringArrayList(SAVED_MEDIA_IDS);
+ }
+
+ mGridAdapter = new MediaGalleryAdapter(getActivity(), R.layout.media_gallery_item, null, true,
+ MediaImageLoader.getInstance());
+
+ View view = inflater.inflate(R.layout.media_gallery_edit_fragment, container, false);
+
+ DragSortListView gridView = (DragSortListView) view.findViewById(R.id.edit_media_gallery_gridview);
+ gridView.setAdapter(mGridAdapter);
+ gridView.setOnCreateContextMenuListener(this);
+ gridView.setDropListener(this);
+ gridView.setRemoveListener(this);
+ refreshGridView();
+
+ return view;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putStringArrayList(SAVED_MEDIA_IDS, mIds);
+ }
+
+ private void refreshGridView() {
+ if (WordPress.getCurrentBlog() == null) {
+ return;
+ }
+
+ String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
+ Cursor cursor = WordPress.wpDB.getMediaFiles(blogId, mIds);
+ if (cursor == null) {
+ mGridAdapter.changeCursor(null);
+ return;
+ }
+ SparseIntArray positions = mapIdsToCursorPositions(cursor);
+ mGridAdapter.swapCursor(new OrderedCursor(cursor, positions));
+ }
+
+ private SparseIntArray mapIdsToCursorPositions(Cursor cursor) {
+ SparseIntArray positions = new SparseIntArray();
+ int size = mIds.size();
+ for (int i = 0; i < size; i++) {
+ while (cursor.moveToNext()) {
+ String mediaId = cursor.getString(cursor.getColumnIndex("mediaId"));
+ if (mediaId.equals(mIds.get(i))) {
+ positions.put(i, cursor.getPosition());
+ cursor.moveToPosition(-1);
+ break;
+ }
+ }
+ }
+ return positions;
+ }
+
+ public void setMediaIds(ArrayList<String> ids) {
+ mIds = ids;
+ refreshGridView();
+ }
+
+ public ArrayList<String> getMediaIds() {
+ return mIds;
+ }
+
+ public void reverseIds() {
+ Collections.reverse(mIds);
+ refreshGridView();
+ }
+
+ private class OrderedCursor extends CursorWrapper {
+ final int mPos;
+ private final int mCount;
+
+ // a map of custom position to cursor position
+ private final SparseIntArray mPositions;
+
+ /**
+ * A wrapper to allow for a custom order of items in a cursor *
+ */
+ public OrderedCursor(Cursor cursor, SparseIntArray positions) {
+ super(cursor);
+ cursor.moveToPosition(-1);
+ mPos = 0;
+ mCount = cursor.getCount();
+ mPositions = positions;
+ }
+
+ @Override
+ public boolean move(int offset) {
+ return this.moveToPosition(this.mPos + offset);
+ }
+
+ @Override
+ public boolean moveToNext() {
+ return this.moveToPosition(this.mPos + 1);
+ }
+
+ @Override
+ public boolean moveToPrevious() {
+ return this.moveToPosition(this.mPos - 1);
+ }
+
+ @Override
+ public boolean moveToFirst() {
+ return this.moveToPosition(0);
+ }
+
+ @Override
+ public boolean moveToLast() {
+ return this.moveToPosition(this.mCount - 1);
+ }
+
+ @Override
+ public boolean moveToPosition(int position) {
+ return super.moveToPosition(mPositions.get(position));
+ }
+ }
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
+ Cursor cursor = mGridAdapter.getCursor();
+ if (cursor == null) {
+ return;
+ }
+ cursor.moveToPosition(info.position);
+ String mediaId = cursor.getString(cursor.getColumnIndex("mediaId"));
+
+ menu.add(ContextMenu.NONE, mIds.indexOf(mediaId), ContextMenu.NONE, R.string.delete);
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ int index = item.getItemId();
+ mIds.remove(index);
+ refreshGridView();
+ return true;
+ }
+
+ @Override
+ public void drop(int from, int to) {
+ String id = mIds.get(from);
+ mIds.remove(id);
+ mIds.add(to, id);
+ refreshGridView();
+ }
+
+ @Override
+ public void remove(int position) {
+ }
+}