package org.wordpress.android.ui.media;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.fluxc.Dispatcher;
import org.wordpress.android.fluxc.generated.MediaActionBuilder;
import org.wordpress.android.fluxc.model.MediaModel;
import org.wordpress.android.fluxc.model.SiteModel;
import org.wordpress.android.fluxc.store.MediaStore;
import org.wordpress.android.fluxc.store.MediaStore.MediaPayload;
import org.wordpress.android.util.DisplayUtils;
import org.wordpress.android.util.EditTextUtils;
import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.ToastUtils;
import javax.inject.Inject;
/**
* 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 static final int MISSING_MEDIA_ID = -1;
@Inject Dispatcher mDispatcher;
@Inject MediaStore mMediaStore;
private EditText mTitleView;
private EditText mCaptionView;
private EditText mDescriptionView;
private String mTitleOriginal;
private String mDescriptionOriginal;
private String mCaptionOriginal;
private int mLocalMediaId = MISSING_MEDIA_ID;
private SiteModel mSite;
private MediaModel mMediaModel;
public static MediaEditFragment newInstance(SiteModel site, int localMediaId) {
MediaEditFragment fragment = new MediaEditFragment();
Bundle args = new Bundle();
args.putInt(ARGS_MEDIA_ID, localMediaId);
args.putSerializable(WordPress.SITE, site);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((WordPress) getActivity().getApplication()).component().inject(this);
if (savedInstanceState == null) {
if (getArguments() != null) {
mSite = (SiteModel) getArguments().getSerializable(WordPress.SITE);
} else {
mSite = (SiteModel) getActivity().getIntent().getSerializableExtra(WordPress.SITE);
}
} else {
mSite = (SiteModel) savedInstanceState.getSerializable(WordPress.SITE);
}
if (mSite == null) {
ToastUtils.showToast(getActivity(), R.string.blog_not_found, ToastUtils.Duration.SHORT);
getActivity().finish();
}
setHasOptionsMenu(true);
// retain this fragment across configuration changes
setRetainInstance(true);
}
@Override
public void onStart() {
super.onStart();
mDispatcher.register(this);
}
@Override
public void onStop() {
mDispatcher.unregister(this);
super.onStop();
}
private int getLocalMediaId() {
if (mLocalMediaId != MISSING_MEDIA_ID) {
return mLocalMediaId;
} else if (getArguments() != null) {
mLocalMediaId = getArguments().getInt(ARGS_MEDIA_ID);
return mLocalMediaId;
} else {
return MISSING_MEDIA_ID;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.media_edit_fragment, container, false);
mTitleView = (EditText) view.findViewById(R.id.media_edit_fragment_title);
mCaptionView = (EditText) view.findViewById(R.id.media_edit_fragment_caption);
mDescriptionView = (EditText) view.findViewById(R.id.media_edit_fragment_description);
loadMedia(getLocalMediaId());
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// force the keyboard to appear on the title when activity is created (but not in landscape)
if (savedInstanceState == null && !DisplayUtils.isLandscape(getActivity())) {
EditTextUtils.showSoftInput(mTitleView);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(WordPress.SITE, mSite);
}
public void loadMedia(int localMediaId) {
mLocalMediaId = localMediaId;
if (getActivity() != null && mLocalMediaId != MISSING_MEDIA_ID) {
mMediaModel = mMediaStore.getMediaWithLocalId(mLocalMediaId);
refreshViews(mMediaModel);
} else {
refreshViews(null);
}
}
public void saveChanges() {
if (isDirty()) {
mMediaModel.setTitle(mTitleView.getText().toString());
mMediaModel.setDescription(mDescriptionView.getText().toString());
mMediaModel.setCaption(mCaptionView.getText().toString());
mDispatcher.dispatch(MediaActionBuilder.newPushMediaAction(new MediaPayload(mSite, mMediaModel)));
}
}
private void refreshViews(MediaModel mediaModel) {
if (mediaModel == null) {
return;
}
boolean isLocal = MediaUtils.isLocalFile(mediaModel.getUploadState());
// user can't edit local files
mTitleView.setEnabled(!isLocal);
mCaptionView.setEnabled(!isLocal);
mDescriptionView.setEnabled(!isLocal);
mTitleOriginal = mediaModel.getTitle();
mCaptionOriginal = mediaModel.getCaption();
mDescriptionOriginal = mediaModel.getDescription();
mTitleView.setText(mediaModel.getTitle());
mTitleView.requestFocus();
mTitleView.setSelection(mTitleView.getText().length());
mCaptionView.setText(mediaModel.getCaption());
mDescriptionView.setText(mediaModel.getDescription());
}
private boolean isDirty() {
return mLocalMediaId != MISSING_MEDIA_ID &&
(!StringUtils.equals(mTitleOriginal, mTitleView.getText().toString())
|| !StringUtils.equals(mCaptionOriginal, mCaptionView.getText().toString())
|| !StringUtils.equals(mDescriptionOriginal, mDescriptionView.getText().toString()));
}
@SuppressWarnings("unused")
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMediaChanged(MediaStore.OnMediaChanged event) {
if (isAdded() && event.isError()) {
ToastUtils.showToast(getActivity(), R.string.media_edit_failure);
}
}
}