package kr.kdev.dg1s.biowiki.ui.media; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.inputmethod.InputMethodManager; 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.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.NetworkImageView; 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.models.Blog; import kr.kdev.dg1s.biowiki.util.ImageHelper; import kr.kdev.dg1s.biowiki.util.MediaUtils; /** * A fragment for editing media on the Media tab */ public class MediaEditFragment extends SherlockFragment { public static final String TAG = "MediaEditFragment"; // also appears in the layouts, from the strings.xml private static final String ARGS_MEDIA_ID = "media_id"; 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 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 (MediaUtils.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 = BioWiki.getCurrentBlog(); if (blog != null && getActivity() != null) { String blogId = String.valueOf(blog.getLocalTableBlogId()); if (mMediaId != null) { Cursor cursor = BioWiki.wpDB.getMediaFile(blogId, mMediaId); refreshViews(cursor); cursor.close(); } else { refreshViews(null); } } } void hideKeyboard() { if (getActivity() != null) { InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } void editMedia() { hideKeyboard(); final String mediaId = this.getMediaId(); final String title = mTitleView.getText().toString(); final String description = mDescriptionView.getText().toString(); final Blog currentBlog = BioWiki.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()); BioWiki.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(); } setMediaUpdating(false); getSherlockActivity().invalidateOptionsMenu(); if (hasCallback()) { mCallback.onSavedEdit(mediaId, false); } } } ); List<Object> apiArgs = new ArrayList<Object>(); apiArgs.add(currentBlog); if (!isMediaUpdating()) { setMediaUpdating(true); task.execute(apiArgs); } } private boolean isMediaUpdating() { return mIsMediaUpdating; } private void setMediaUpdating(boolean isUpdating) { mIsMediaUpdating = isUpdating; mSaveButton.setEnabled(!isUpdating); if (isUpdating) { mSaveButton.setText("Saving.."); } else { mSaveButton.setText(R.string.save); } } 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("uploadState")); 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("mediaId")); mTitleView.setText(cursor.getString(cursor.getColumnIndex("title"))); mTitleView.requestFocus(); mTitleView.setSelection(mTitleView.getText().length()); mCaptionView.setText(cursor.getString(cursor.getColumnIndex("caption"))); mDescriptionView.setText(cursor.getString(cursor.getColumnIndex("description"))); final String imageUri; if (isLocal) { imageUri = cursor.getString(cursor.getColumnIndex("filePath")); } else { imageUri = cursor.getString(cursor.getColumnIndex("fileURL")); } if (MediaUtils.isValidImage(imageUri)) { int width = cursor.getInt(cursor.getColumnIndex("width")); int height = cursor.getInt(cursor.getColumnIndex("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); } 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 (!MediaUtils.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 = BioWiki.getBitmapCache().get(filePath); if (bitmap != null) { imageView.setImageBitmap(bitmap); } else { ImageHelper.BitmapWorkerTask task = new ImageHelper.BitmapWorkerTask(imageView, width, height, new ImageHelper.BitmapWorkerCallback() { @Override public void onBitmapReady(String path, ImageView imageView, Bitmap bitmap) { imageView.setImageBitmap(bitmap); BioWiki.getBitmapCache().put(path, bitmap); } }); task.execute(filePath); } } } public interface MediaEditFragmentCallback { public void onResume(Fragment fragment); public void onPause(Fragment fragment); public void onSavedEdit(String mediaId, boolean result); } }