aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryPickerActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryPickerActivity.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryPickerActivity.java275
1 files changed, 275 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryPickerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryPickerActivity.java
new file mode 100644
index 000000000..128ac806a
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryPickerActivity.java
@@ -0,0 +1,275 @@
+package org.wordpress.android.ui.media;
+
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.view.ActionMode;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.AbsListView.MultiChoiceModeListener;
+import android.widget.AdapterView;
+import android.widget.GridView;
+import android.widget.Toast;
+
+import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.util.ToastUtils;
+import org.xmlrpc.android.ApiHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An activity where the user can add new images to their media gallery or where the user
+ * can choose a single image to embed into their post.
+ */
+public class MediaGalleryPickerActivity extends AppCompatActivity
+ implements MultiChoiceModeListener, ActionMode.Callback, MediaGridAdapter.MediaGridAdapterCallback,
+ AdapterView.OnItemClickListener {
+ private GridView mGridView;
+ private MediaGridAdapter mGridAdapter;
+ private ActionMode mActionMode;
+
+ private ArrayList<String> mFilteredItems;
+ private boolean mIsSelectOneItem;
+ private boolean mIsRefreshing;
+ private boolean mHasRetrievedAllMedia;
+
+ private static final String STATE_FILTERED_ITEMS = "STATE_FILTERED_ITEMS";
+ private static final String STATE_SELECTED_ITEMS = "STATE_SELECTED_ITEMS";
+ private static final String STATE_IS_SELECT_ONE_ITEM = "STATE_IS_SELECT_ONE_ITEM";
+
+ public static final int REQUEST_CODE = 4000;
+ public static final String PARAM_SELECT_ONE_ITEM = "PARAM_SELECT_ONE_ITEM";
+ private static final String PARAM_FILTERED_IDS = "PARAM_FILTERED_IDS";
+ public static final String PARAM_SELECTED_IDS = "PARAM_SELECTED_IDS";
+ public static final String RESULT_IDS = "RESULT_IDS";
+ public static final String TAG = MediaGalleryPickerActivity.class.getSimpleName();
+
+ private int mOldMediaSyncOffset = 0;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ ArrayList<String> selectedItems = new ArrayList<String>();
+ mFilteredItems = getIntent().getStringArrayListExtra(PARAM_FILTERED_IDS);
+ mIsSelectOneItem = getIntent().getBooleanExtra(PARAM_SELECT_ONE_ITEM, false);
+
+ ArrayList<String> prevSelectedItems = getIntent().getStringArrayListExtra(PARAM_SELECTED_IDS);
+ if (prevSelectedItems != null) {
+ selectedItems.addAll(prevSelectedItems);
+ }
+
+ if (savedInstanceState != null) {
+ selectedItems.addAll(savedInstanceState.getStringArrayList(STATE_SELECTED_ITEMS));
+ mFilteredItems = savedInstanceState.getStringArrayList(STATE_FILTERED_ITEMS);
+ mIsSelectOneItem = savedInstanceState.getBoolean(STATE_IS_SELECT_ONE_ITEM, mIsSelectOneItem);
+ }
+
+ setContentView(R.layout.media_gallery_picker_layout);
+ mGridView = (GridView) findViewById(R.id.media_gallery_picker_gridview);
+ mGridView.setMultiChoiceModeListener(this);
+ mGridView.setOnItemClickListener(this);
+ mGridAdapter = new MediaGridAdapter(this, null, 0, MediaImageLoader.getInstance());
+ mGridAdapter.setSelectedItems(selectedItems);
+ mGridAdapter.setCallback(this);
+ mGridView.setAdapter(mGridAdapter);
+ if (mIsSelectOneItem) {
+ setTitle(R.string.select_from_media_library);
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+ } else {
+ mActionMode = startActionMode(this);
+ mActionMode.setTitle(String.format(getString(R.string.cab_selected),
+ mGridAdapter.getSelectedItems().size()));
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ refreshViews();
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putStringArrayList(STATE_SELECTED_ITEMS, mGridAdapter.getSelectedItems());
+ outState.putStringArrayList(STATE_FILTERED_ITEMS, mFilteredItems);
+ outState.putBoolean(STATE_IS_SELECT_ONE_ITEM, mIsSelectOneItem);
+ }
+
+ private void refreshViews() {
+ if (WordPress.getCurrentBlog() == null)
+ return;
+ final String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
+ Cursor cursor = WordPress.wpDB.getMediaImagesForBlog(blogId, mFilteredItems);
+ if (cursor.getCount() == 0) {
+ refreshMediaFromServer(0);
+ } else {
+ mGridAdapter.swapCursor(cursor);
+ }
+ }
+
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ setResult(RESULT_CANCELED, new Intent());
+ finish();
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ if (mIsSelectOneItem) {
+ // Single select, just finish the activity once an item is selected
+ mGridAdapter.setItemSelected(position, true);
+ Intent intent = new Intent();
+ intent.putStringArrayListExtra(RESULT_IDS, mGridAdapter.getSelectedItems());
+ setResult(RESULT_OK, intent);
+ finish();
+ } else {
+ mGridAdapter.toggleItemSelected(position);
+ mActionMode.setTitle(String.format(getString(R.string.cab_selected),
+ mGridAdapter.getSelectedItems().size()));
+ }
+ }
+
+ @Override
+ public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
+ mGridAdapter.setItemSelected(position, checked);
+ }
+
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ return false;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ return false;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ Intent intent = new Intent();
+ intent.putStringArrayListExtra(RESULT_IDS, mGridAdapter.getSelectedItems());
+ setResult(RESULT_OK, intent);
+ finish();
+ }
+
+ @Override
+ public void fetchMoreData(int offset) {
+ if (!mHasRetrievedAllMedia) {
+ refreshMediaFromServer(offset);
+ }
+ }
+
+ @Override
+ public void onRetryUpload(String mediaId) {
+ }
+
+ @Override
+ public boolean isInMultiSelect() {
+ return false;
+ }
+
+ private void noMediaFinish() {
+ ToastUtils.showToast(this, R.string.media_empty_list, ToastUtils.Duration.LONG);
+ // Delay activity finish
+ new Handler().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ finish();
+ }
+ }, 1500);
+ }
+
+ void refreshMediaFromServer(int offset) {
+ if (offset == 0 || !mIsRefreshing) {
+ if (offset == mOldMediaSyncOffset) {
+ // we're pulling the same data again for some reason. Pull from the beginning.
+ offset = 0;
+ }
+ mOldMediaSyncOffset = offset;
+ mIsRefreshing = true;
+ mGridAdapter.setRefreshing(true);
+
+ List<Object> apiArgs = new ArrayList<Object>();
+ apiArgs.add(WordPress.getCurrentBlog());
+
+ ApiHelper.SyncMediaLibraryTask.Callback callback = new ApiHelper.SyncMediaLibraryTask.Callback() {
+ // refersh db from server. If returned count is 0, we've retrieved all the media.
+ // stop retrieving until the user manually refreshes
+
+ @Override
+ public void onSuccess(int count) {
+ MediaGridAdapter adapter = (MediaGridAdapter) mGridView.getAdapter();
+ mHasRetrievedAllMedia = (count == 0);
+ adapter.setHasRetrievedAll(mHasRetrievedAllMedia);
+ String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
+ if (WordPress.wpDB.getMediaCountAll(blogId) == 0 && count == 0) {
+ // There is no media at all
+ noMediaFinish();
+ }
+ mIsRefreshing = false;
+
+ // the activity may be gone by the time this finishes, so check for it
+ if (!isFinishing()) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ //mListener.onMediaItemListDownloaded();
+ mGridAdapter.setRefreshing(false);
+ String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
+ Cursor cursor = WordPress.wpDB.getMediaImagesForBlog(blogId, mFilteredItems);
+ mGridAdapter.swapCursor(cursor);
+
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onFailure(ApiHelper.ErrorType errorType, String errorMessage, Throwable throwable) {
+ if (errorType != ApiHelper.ErrorType.NO_ERROR) {
+ String message = errorType == ApiHelper.ErrorType.NO_UPLOAD_FILES_CAP
+ ? getString(R.string.media_error_no_permission)
+ : getString(R.string.error_refresh_media);
+ Toast.makeText(MediaGalleryPickerActivity.this, message, Toast.LENGTH_SHORT).show();
+ MediaGridAdapter adapter = (MediaGridAdapter) mGridView.getAdapter();
+ mHasRetrievedAllMedia = true;
+ adapter.setHasRetrievedAll(mHasRetrievedAllMedia);
+ }
+
+ // the activity may be cone by the time we get this, so check for it
+ if (!isFinishing()) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mIsRefreshing = false;
+ mGridAdapter.setRefreshing(false);
+ }
+ });
+ }
+
+ }
+ };
+
+ ApiHelper.SyncMediaLibraryTask getMediaTask = new ApiHelper.SyncMediaLibraryTask(offset, MediaGridFragment.Filter.ALL, callback);
+ getMediaTask.execute(apiArgs);
+ }
+ }
+}