package kr.kdev.dg1s.biowiki.ui.media;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.ActionMode.Callback;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import org.xmlrpc.android.ApiHelper;
import java.util.ArrayList;
import java.util.List;
import kr.kdev.dg1s.biowiki.BioWiki;
import kr.kdev.dg1s.biowiki.R;
import kr.kdev.dg1s.biowiki.ui.MultiSelectGridView;
import kr.kdev.dg1s.biowiki.util.ToastUtils;
/**
* 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 SherlockActivity implements MultiSelectGridView.MultiSelectListener, Callback, MediaGridAdapter.MediaGridAdapterCallback, AdapterView.OnItemClickListener {
public static final int REQUEST_CODE = 4000;
public static final String PARAM_SELECT_ONE_ITEM = "PARAM_SELECT_ONE_ITEM";
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 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";
private static final String PARAM_FILTERED_IDS = "PARAM_FILTERED_IDS";
private MultiSelectGridView mGridView;
private MediaGridAdapter mGridAdapter;
private ActionMode mActionMode;
private ArrayList<String> mFilteredItems;
private boolean mIsSelectOneItem;
private boolean mIsRefreshing;
private boolean mHasRetrievedAllMedia;
private int mOldMediaSyncOffset = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<String> checkedItems = 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)
checkedItems.addAll(prevSelectedItems);
if (savedInstanceState != null) {
checkedItems.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 = (MultiSelectGridView) findViewById(R.id.media_gallery_picker_gridview);
mGridView.setMultiSelectListener(this);
if (mIsSelectOneItem) {
mGridView.setOnItemClickListener(this);
setTitle(R.string.select_from_media_library);
mGridView.setHighlightSelectModeEnabled(false);
mGridView.setMultiSelectModeEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
mActionMode = getSherlock().startActionMode(this);
mActionMode.setTitle(checkedItems.size() + " selected");
mGridView.setMultiSelectModeActive(true);
}
mGridAdapter = new MediaGridAdapter(this, null, 0, checkedItems, MediaImageLoader.getInstance());
mGridAdapter.setCallback(this);
mGridView.setAdapter(mGridAdapter);
}
@Override
public void onResume() {
super.onResume();
refreshViews();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArrayList(STATE_SELECTED_ITEMS, mGridAdapter.getCheckedItems());
outState.putStringArrayList(STATE_FILTERED_ITEMS, mFilteredItems);
outState.putBoolean(STATE_IS_SELECT_ONE_ITEM, mIsSelectOneItem);
}
private void refreshViews() {
if (BioWiki.getCurrentBlog() == null)
return;
final String blogId = String.valueOf(BioWiki.getCurrentBlog().getLocalTableBlogId());
Cursor cursor = BioWiki.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 onMultiSelectChange(int count) {
mActionMode.setTitle(count + " selected");
// stay always in multi-select mode, even when count reaches 0
if (count == 0 && !mIsSelectOneItem)
mGridView.setMultiSelectModeActive(true);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Single select, just finish the activity once an item is selected
Intent intent = new Intent();
intent.putExtra(RESULT_IDS, mGridAdapter.getCheckedItems());
setResult(RESULT_OK, intent);
finish();
}
@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.putExtra(RESULT_IDS, mGridAdapter.getCheckedItems());
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(BioWiki.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(BioWiki.getCurrentBlog().getLocalTableBlogId());
if (BioWiki.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(BioWiki.getCurrentBlog().getLocalTableBlogId());
Cursor cursor = BioWiki.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);
}
}
}