aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java385
1 files changed, 385 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java
new file mode 100644
index 000000000..6b9dbb0e8
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java
@@ -0,0 +1,385 @@
+package org.wordpress.android.ui.media;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.ScrollView;
+import android.widget.Toast;
+
+import com.android.volley.toolbox.ImageLoader;
+import com.android.volley.toolbox.NetworkImageView;
+
+import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.WordPressDB;
+import org.wordpress.android.models.Blog;
+import org.wordpress.android.util.ActivityUtils;
+import org.wordpress.android.util.ImageUtils.BitmapWorkerCallback;
+import org.wordpress.android.util.ImageUtils.BitmapWorkerTask;
+import org.wordpress.android.util.MediaUtils;
+import org.xmlrpc.android.ApiHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A fragment for editing media on the Media tab
+ */
+public class MediaEditFragment extends Fragment {
+ private static final String ARGS_MEDIA_ID = "media_id";
+ // also appears in the layouts, from the strings.xml
+ public static final String TAG = "MediaEditFragment";
+
+ private NetworkImageView mNetworkImageView;
+ private ImageView mLocalImageView;
+ private EditText mTitleView;
+ private EditText mCaptionView;
+ private EditText mDescriptionView;
+ private Button mSaveButton;
+
+ private MediaEditFragmentCallback mCallback;
+
+ private boolean mIsMediaUpdating = false;
+
+ private String mMediaId;
+ private ScrollView mScrollView;
+ private View mLinearLayout;
+ private ImageLoader mImageLoader;
+
+ public interface MediaEditFragmentCallback {
+ void onResume(Fragment fragment);
+ void onPause(Fragment fragment);
+ void onSavedEdit(String mediaId, boolean result);
+ }
+
+ public static MediaEditFragment newInstance(String mediaId) {
+ MediaEditFragment fragment = new MediaEditFragment();
+
+ Bundle args = new Bundle();
+ args.putString(ARGS_MEDIA_ID, mediaId);
+ fragment.setArguments(args);
+
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setHasOptionsMenu(true);
+ mImageLoader = MediaImageLoader.getInstance();
+
+ // retain this fragment across configuration changes
+ setRetainInstance(true);
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ try {
+ mCallback = (MediaEditFragmentCallback) activity;
+ } catch (ClassCastException e) {
+ throw new ClassCastException(activity.toString() + " must implement "
+ + MediaEditFragmentCallback.class.getSimpleName());
+ }
+ }
+
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ // set callback to null so we don't accidentally leak the activity instance
+ mCallback = null;
+ }
+
+ private boolean hasCallback() {
+ return (mCallback != null);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (hasCallback()) {
+ mCallback.onResume(this);
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (hasCallback()) {
+ mCallback.onPause(this);
+ }
+ }
+
+ public String getMediaId() {
+ if (mMediaId != null) {
+ return mMediaId;
+ } else if (getArguments() != null) {
+ mMediaId = getArguments().getString(ARGS_MEDIA_ID);
+ return mMediaId;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ mScrollView = (ScrollView) inflater.inflate(R.layout.media_edit_fragment, container, false);
+
+ mLinearLayout = mScrollView.findViewById(R.id.media_edit_linear_layout);
+ mTitleView = (EditText) mScrollView.findViewById(R.id.media_edit_fragment_title);
+ mCaptionView = (EditText) mScrollView.findViewById(R.id.media_edit_fragment_caption);
+ mDescriptionView = (EditText) mScrollView.findViewById(R.id.media_edit_fragment_description);
+ mLocalImageView = (ImageView) mScrollView.findViewById(R.id.media_edit_fragment_image_local);
+ mNetworkImageView = (NetworkImageView) mScrollView.findViewById(R.id.media_edit_fragment_image_network);
+ mSaveButton = (Button) mScrollView.findViewById(R.id.media_edit_save_button);
+ mSaveButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ editMedia();
+ }
+ });
+
+ disableEditingOnOldVersion();
+
+ loadMedia(getMediaId());
+
+ return mScrollView;
+ }
+
+ private void disableEditingOnOldVersion() {
+ if (WordPressMediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
+ return;
+ }
+
+ mSaveButton.setEnabled(false);
+ mTitleView.setEnabled(false);
+ mCaptionView.setEnabled(false);
+ mDescriptionView.setEnabled(false);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ }
+
+ public void loadMedia(String mediaId) {
+ mMediaId = mediaId;
+ Blog blog = WordPress.getCurrentBlog();
+
+ if (blog != null && getActivity() != null) {
+ String blogId = String.valueOf(blog.getLocalTableBlogId());
+
+ if (mMediaId != null) {
+ Cursor cursor = WordPress.wpDB.getMediaFile(blogId, mMediaId);
+ refreshViews(cursor);
+ cursor.close();
+ } else {
+ refreshViews(null);
+ }
+ }
+ }
+
+ void editMedia() {
+ ActivityUtils.hideKeyboard(getActivity());
+ final String mediaId = this.getMediaId();
+ final String title = mTitleView.getText().toString();
+ final String description = mDescriptionView.getText().toString();
+ final Blog currentBlog = WordPress.getCurrentBlog();
+ final String caption = mCaptionView.getText().toString();
+
+ ApiHelper.EditMediaItemTask task = new ApiHelper.EditMediaItemTask(mediaId, title, description, caption,
+ new ApiHelper.GenericCallback() {
+ @Override
+ public void onSuccess() {
+ String blogId = String.valueOf(currentBlog.getLocalTableBlogId());
+ WordPress.wpDB.updateMediaFile(blogId, mediaId, title, description, caption);
+ if (getActivity() != null) {
+ Toast.makeText(getActivity(), R.string.media_edit_success, Toast.LENGTH_LONG).show();
+ }
+ setMediaUpdating(false);
+ if (hasCallback()) {
+ mCallback.onSavedEdit(mediaId, true);
+ }
+ }
+
+ @Override
+ public void onFailure(ApiHelper.ErrorType errorType, String errorMessage, Throwable throwable) {
+ if (getActivity() != null) {
+ Toast.makeText(getActivity(), R.string.media_edit_failure, Toast.LENGTH_LONG).show();
+ getActivity().invalidateOptionsMenu();
+ }
+ setMediaUpdating(false);
+ if (hasCallback()) {
+ mCallback.onSavedEdit(mediaId, false);
+ }
+ }
+ }
+ );
+
+ List<Object> apiArgs = new ArrayList<Object>();
+ apiArgs.add(currentBlog);
+
+ if (!isMediaUpdating()) {
+ setMediaUpdating(true);
+ task.execute(apiArgs);
+ }
+ }
+
+ private void setMediaUpdating(boolean isUpdating) {
+ mIsMediaUpdating = isUpdating;
+ mSaveButton.setEnabled(!isUpdating);
+
+ if (isUpdating) {
+ mSaveButton.setText(R.string.saving);
+ } else {
+ mSaveButton.setText(R.string.save);
+ }
+ }
+
+ private boolean isMediaUpdating() {
+ return mIsMediaUpdating;
+ }
+
+ private void refreshImageView(Cursor cursor, boolean isLocal) {
+ final String imageUri;
+ if (isLocal) {
+ imageUri = cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_PATH));
+ } else {
+ imageUri = cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_URL));
+ }
+ if (MediaUtils.isValidImage(imageUri)) {
+ int width = cursor.getInt(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_WIDTH));
+ int height = cursor.getInt(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_HEIGHT));
+
+ // differentiating between tablet and phone
+ float screenWidth;
+ if (this.isInLayout()) {
+ screenWidth = mLinearLayout.getMeasuredWidth();
+ } else {
+ screenWidth = getActivity().getResources().getDisplayMetrics().widthPixels;
+ }
+ float screenHeight = getActivity().getResources().getDisplayMetrics().heightPixels;
+
+ if (width > screenWidth) {
+ height = (int) (height / (width / screenWidth));
+ } else if (height > screenHeight) {
+ width = (int) (width / (height / screenHeight));
+ }
+
+ if (isLocal) {
+ loadLocalImage(mLocalImageView, imageUri, width, height);
+ mLocalImageView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, height));
+ } else {
+ mNetworkImageView.setImageUrl(imageUri + "?w=" + screenWidth, mImageLoader);
+ mNetworkImageView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, height));
+ }
+ } else {
+ mNetworkImageView.setVisibility(View.GONE);
+ mLocalImageView.setVisibility(View.GONE);
+ }
+ }
+
+ private void refreshViews(Cursor cursor) {
+ if (cursor == null || !cursor.moveToFirst() || cursor.getCount() == 0) {
+ mLinearLayout.setVisibility(View.GONE);
+ return;
+ }
+
+ mLinearLayout.setVisibility(View.VISIBLE);
+
+ mScrollView.scrollTo(0, 0);
+
+ String state = cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_UPLOAD_STATE));
+ boolean isLocal = MediaUtils.isLocalFile(state);
+ if (isLocal) {
+ mNetworkImageView.setVisibility(View.GONE);
+ mLocalImageView.setVisibility(View.VISIBLE);
+ } else {
+ mNetworkImageView.setVisibility(View.VISIBLE);
+ mLocalImageView.setVisibility(View.GONE);
+ }
+
+ // user can't edit local files
+ mSaveButton.setEnabled(!isLocal);
+ mTitleView.setEnabled(!isLocal);
+ mCaptionView.setEnabled(!isLocal);
+ mDescriptionView.setEnabled(!isLocal);
+
+ mMediaId = cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_MEDIA_ID));
+ mTitleView.setText(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_TITLE)));
+ mTitleView.requestFocus();
+ mTitleView.setSelection(mTitleView.getText().length());
+ mCaptionView.setText(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_CAPTION)));
+ mDescriptionView.setText(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_DESCRIPTION)));
+
+ refreshImageView(cursor, isLocal);
+ disableEditingOnOldVersion();
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (!isInLayout()) {
+ inflater.inflate(R.menu.media_edit, menu);
+ }
+ }
+
+ @Override
+ public void onPrepareOptionsMenu(Menu menu) {
+ if (!isInLayout()) {
+ menu.findItem(R.id.menu_new_media).setVisible(false);
+ menu.findItem(R.id.menu_search).setVisible(false);
+
+ if (!WordPressMediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
+ menu.findItem(R.id.menu_save_media).setVisible(false);
+ }
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int itemId = item.getItemId();
+ if (itemId == R.id.menu_save_media) {
+ item.setActionView(R.layout.progressbar);
+ editMedia();
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private synchronized void loadLocalImage(ImageView imageView, String filePath, int width, int height) {
+ if (MediaUtils.isValidImage(filePath)) {
+ imageView.setTag(filePath);
+
+ Bitmap bitmap = WordPress.getBitmapCache().get(filePath);
+ if (bitmap != null) {
+ imageView.setImageBitmap(bitmap);
+ } else {
+ BitmapWorkerTask task = new BitmapWorkerTask(imageView, width, height, new BitmapWorkerCallback() {
+ @Override
+ public void onBitmapReady(String path, ImageView imageView, Bitmap bitmap) {
+ if (imageView != null) {
+ imageView.setImageBitmap(bitmap);
+ }
+ WordPress.getBitmapCache().put(path, bitmap);
+ }
+ });
+ task.execute(filePath);
+ }
+ }
+ }
+}