| 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); |
| } |
| } |
| } |
| } |