SlideEditorActivitypublic class SlideEditorActivity extends android.app.Activity This activity allows user to edit the contents of a slide. |
Fields Summary |
---|
private static final String | TAG | private static final boolean | DEBUG | private static final boolean | LOCAL_LOGV | public static final String | SLIDE_INDEX | private static final int | MENU_REMOVE_TEXT | private static final int | MENU_ADD_PICTURE | private static final int | MENU_TAKE_PICTURE | private static final int | MENU_DEL_PICTURE | private static final int | MENU_ADD_AUDIO | private static final int | MENU_DEL_AUDIO | private static final int | MENU_ADD_VIDEO | private static final int | MENU_ADD_SLIDE | private static final int | MENU_DEL_VIDEO | private static final int | MENU_LAYOUT | private static final int | MENU_DURATION | private static final int | MENU_PREVIEW_SLIDESHOW | private static final int | MENU_RECORD_SOUND | private static final int | MENU_SUB_AUDIO | private static final int | REQUEST_CODE_EDIT_TEXT | private static final int | REQUEST_CODE_CHANGE_PICTURE | private static final int | REQUEST_CODE_TAKE_PICTURE | private static final int | REQUEST_CODE_CHANGE_MUSIC | private static final int | REQUEST_CODE_RECORD_SOUND | private static final int | REQUEST_CODE_CHANGE_VIDEO | private static final int | REQUEST_CODE_CHANGE_DURATION | private static final int | NUM_DIRECT_DURATIONS | private android.widget.ImageButton | mNextSlide | private android.widget.ImageButton | mPreSlide | private android.widget.Button | mPreview | private android.widget.Button | mReplaceImage | private android.widget.Button | mRemoveSlide | private android.widget.Button | mDone | private BasicSlideEditorView | mSlideView | private com.android.mms.model.SlideshowModel | mSlideshowModel | private SlideshowEditor | mSlideshowEditor | private SlideshowPresenter | mPresenter | private boolean | mDirty | private int | mPosition | private android.net.Uri | mUri | private static final String | MESSAGE_URI | private final com.android.mms.model.IModelChangedObserver | mModelChangedObserver | private final android.view.View.OnClickListener | mOnRemoveSlide | private final com.android.mms.ui.BasicSlideEditorView.OnTextChangedListener | mOnTextChangedListener | private final android.view.View.OnClickListener | mOnPreview | private final android.view.View.OnClickListener | mOnReplaceImage | private final android.view.View.OnClickListener | mOnNavigateBackward | private final android.view.View.OnClickListener | mOnNavigateForward | private final android.view.View.OnClickListener | mDoneClickListener | private final com.android.mms.ui.MessageUtils.ResizeImageResultCallback | mResizeImageCallback |
Methods Summary |
---|
private java.lang.String | getAudioString()
return getResourcesString(R.string.type_audio);
| private java.lang.String | getPictureString()
return getResourcesString(R.string.type_picture);
| private java.lang.String | getResourcesString(int id, java.lang.String mediaName)
Resources r = getResources();
return r.getString(id, mediaName);
| private java.lang.String | getResourcesString(int id)
Resources r = getResources();
return r.getString(id);
| private java.lang.String | getVideoString()
return getResourcesString(R.string.type_video);
| private void | initActivityState(android.os.Bundle savedInstanceState, android.content.Intent intent)
if (savedInstanceState != null) {
mUri = (Uri) savedInstanceState.getParcelable(MESSAGE_URI);
mPosition = savedInstanceState.getInt(SLIDE_INDEX, 0);
} else {
mUri = intent.getData();
mPosition = intent.getIntExtra(SLIDE_INDEX, 0);
}
| private void | notifyUser(java.lang.String message)
if (LOCAL_LOGV) {
Log.v(TAG, "notifyUser: message=" + message);
}
| protected void | onActivityResult(int requestCode, int resultCode, android.content.Intent data)
if (resultCode != RESULT_OK) {
return;
}
switch(requestCode) {
case REQUEST_CODE_EDIT_TEXT:
// XXX where does this come from? Action is probably not the
// right place to have the text...
mSlideshowEditor.changeText(mPosition, data.getAction());
break;
case REQUEST_CODE_TAKE_PICTURE:
Bitmap bitmap = (Bitmap) data.getParcelableExtra("data");
if (bitmap == null) {
Toast.makeText(this,
getResourcesString(R.string.failed_to_add_media, getPictureString()),
Toast.LENGTH_SHORT).show();
return;
}
try {
mSlideshowEditor.changeImage(mPosition,
MessageUtils.saveBitmapAsPart(this, mUri, bitmap));
setReplaceButtonText(R.string.replace_image);
} catch (MmsException e) {
Log.e(TAG, "add image failed", e);
notifyUser("add picture failed");
Toast.makeText(SlideEditorActivity.this,
getResourcesString(R.string.failed_to_add_media, getPictureString()),
Toast.LENGTH_SHORT).show();
} catch (UnsupportContentTypeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.unsupported_media_format, getPictureString()),
getResourcesString(R.string.select_different_media, getPictureString()));
} catch (ResolutionException e) {
MessageUtils.resizeImageAsync(this, data.getData(), new Handler(), mResizeImageCallback);
} catch (ExceedMessageSizeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.exceed_message_size_limitation),
getResourcesString(R.string.failed_to_add_media, getPictureString()));
}
break;
case REQUEST_CODE_CHANGE_PICTURE:
try {
mSlideshowEditor.changeImage(mPosition, data.getData());
setReplaceButtonText(R.string.replace_image);
} catch (MmsException e) {
Log.e(TAG, "add image failed", e);
notifyUser("add picture failed");
Toast.makeText(SlideEditorActivity.this,
getResourcesString(R.string.failed_to_add_media, getPictureString()),
Toast.LENGTH_SHORT).show();
} catch (UnsupportContentTypeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.unsupported_media_format, getPictureString()),
getResourcesString(R.string.select_different_media, getPictureString()));
} catch (ResolutionException e) {
MessageUtils.resizeImageAsync(this, data.getData(), new Handler(), mResizeImageCallback);
} catch (ExceedMessageSizeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.exceed_message_size_limitation),
getResourcesString(R.string.failed_to_add_media, getPictureString()));
}
break;
case REQUEST_CODE_CHANGE_MUSIC:
case REQUEST_CODE_RECORD_SOUND:
Uri uri;
if (requestCode == REQUEST_CODE_CHANGE_MUSIC) {
uri = (Uri) data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (Settings.System.DEFAULT_RINGTONE_URI.equals(uri)) {
return;
}
} else {
uri = data.getData();
}
try {
mSlideshowEditor.changeAudio(mPosition, uri);
} catch (MmsException e) {
Log.e(TAG, "add audio failed", e);
notifyUser("add music failed");
Toast.makeText(SlideEditorActivity.this,
getResourcesString(R.string.failed_to_add_media, getAudioString()),
Toast.LENGTH_SHORT).show();
} catch (UnsupportContentTypeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.unsupported_media_format, getAudioString()),
getResourcesString(R.string.select_different_media, getAudioString()));
} catch (ExceedMessageSizeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.exceed_message_size_limitation),
getResourcesString(R.string.failed_to_add_media, getAudioString()));
}
break;
case REQUEST_CODE_CHANGE_VIDEO:
try {
mSlideshowEditor.changeVideo(mPosition, data.getData());
} catch (MmsException e) {
Log.e(TAG, "add video failed", e);
notifyUser("add video failed");
Toast.makeText(SlideEditorActivity.this,
getResourcesString(R.string.failed_to_add_media, getVideoString()),
Toast.LENGTH_SHORT).show();
} catch (UnsupportContentTypeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.unsupported_media_format, getVideoString()),
getResourcesString(R.string.select_different_media, getVideoString()));
} catch (ExceedMessageSizeException e) {
MessageUtils.showErrorDialog(SlideEditorActivity.this,
getResourcesString(R.string.exceed_message_size_limitation),
getResourcesString(R.string.failed_to_add_media, getVideoString()));
}
break;
case REQUEST_CODE_CHANGE_DURATION:
mSlideshowEditor.changeDuration(mPosition,
Integer.valueOf(data.getAction()) * 1000);
break;
}
| protected void | onCreate(android.os.Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_slide_activity);
mSlideView = (BasicSlideEditorView) findViewById(R.id.slide_editor_view);
mSlideView.setOnTextChangedListener(mOnTextChangedListener);
mPreSlide = (ImageButton) findViewById(R.id.pre_slide_button);
mPreSlide.setOnClickListener(mOnNavigateBackward);
mNextSlide = (ImageButton) findViewById(R.id.next_slide_button);
mNextSlide.setOnClickListener(mOnNavigateForward);
mPreview = (Button) findViewById(R.id.preview_button);
mPreview.setOnClickListener(mOnPreview);
mReplaceImage = (Button) findViewById(R.id.replace_image_button);
mReplaceImage.setOnClickListener(mOnReplaceImage);
mRemoveSlide = (Button) findViewById(R.id.remove_slide_button);
mRemoveSlide.setOnClickListener(mOnRemoveSlide);
mDone = (Button) findViewById(R.id.done_button);
mDone.setOnClickListener(mDoneClickListener);
initActivityState(savedInstanceState, getIntent());
try {
mSlideshowModel = SlideshowModel.createFromMessageUri(this, mUri);
// Register an observer to watch whether the data model is changed.
mSlideshowModel.registerModelChangedObserver(mModelChangedObserver);
mSlideshowEditor = new SlideshowEditor(this, mSlideshowModel);
mPresenter = (SlideshowPresenter) PresenterFactory.getPresenter(
"SlideshowPresenter", this, mSlideView, mSlideshowModel);
// Sanitize mPosition
if (mPosition >= mSlideshowModel.size()) {
mPosition = Math.max(0, mSlideshowModel.size() - 1);
} else if (mPosition < 0) {
mPosition = 0;
}
showCurrentSlide();
} catch (MmsException e) {
Log.e(TAG, "Create SlideshowModel failed!", e);
finish();
return;
}
| protected void | onDestroy()
super.onDestroy();
if (mSlideshowModel != null) {
mSlideshowModel.unregisterModelChangedObserver(
mModelChangedObserver);
}
| public boolean | onOptionsItemSelected(android.view.MenuItem item)
switch (item.getItemId()) {
case MENU_PREVIEW_SLIDESHOW:
previewSlideshow();
break;
case MENU_REMOVE_TEXT:
SlideModel slide = mSlideshowModel.get(mPosition);
slide.removeText();
break;
case MENU_ADD_PICTURE:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType(ContentType.IMAGE_UNSPECIFIED);
startActivityForResult(intent, REQUEST_CODE_CHANGE_PICTURE);
break;
case MENU_TAKE_PICTURE:
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
break;
case MENU_DEL_PICTURE:
mSlideshowEditor.removeImage(mPosition);
setReplaceButtonText(R.string.add_picture);
break;
case MENU_ADD_AUDIO:
MessageUtils.selectAudio(this, REQUEST_CODE_CHANGE_MUSIC);
break;
case MENU_RECORD_SOUND:
MessageUtils.recordSound(this, REQUEST_CODE_RECORD_SOUND);
break;
case MENU_DEL_AUDIO:
mSlideshowEditor.removeAudio(mPosition);
break;
case MENU_ADD_VIDEO:
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(ContentType.VIDEO_UNSPECIFIED);
startActivityForResult(intent, REQUEST_CODE_CHANGE_VIDEO);
break;
case MENU_DEL_VIDEO:
mSlideshowEditor.removeVideo(mPosition);
break;
case MENU_ADD_SLIDE:
mPosition++;
if ( mSlideshowEditor.addNewSlide(mPosition) ) {
// add successfully
showCurrentSlide();
} else {
// move position back
mPosition--;
Toast.makeText(this, R.string.cannot_add_slide_anymore,
Toast.LENGTH_SHORT).show();
}
break;
case MENU_LAYOUT:
showLayoutSelectorDialog();
break;
case MENU_DURATION:
showDurationDialog();
break;
}
return true;
| protected void | onPause()
super.onPause();
synchronized (this) {
if (mDirty) {
try {
PduBody pb = mSlideshowModel.toPduBody();
PduPersister.getPduPersister(this).updateParts(mUri, pb);
mSlideshowModel.sync(pb);
} catch (MmsException e) {
Log.e(TAG, "Cannot update the message: " + mUri, e);
}
}
}
| public boolean | onPrepareOptionsMenu(android.view.Menu menu)
menu.clear();
SlideModel slide = mSlideshowModel.get(mPosition);
// Preview slideshow.
menu.add(0, MENU_PREVIEW_SLIDESHOW, 0, R.string.preview_slideshow).setIcon(
com.android.internal.R.drawable.ic_menu_play_clip);
// Text
if (slide.hasText() && !TextUtils.isEmpty(slide.getText().getText())) {
//"Change text" if text is set.
menu.add(0, MENU_REMOVE_TEXT, 0, R.string.remove_text).setIcon(
R.drawable.ic_menu_remove_text);
}
// Picture
if (slide.hasImage()) {
menu.add(0, MENU_DEL_PICTURE, 0, R.string.remove_picture).setIcon(
R.drawable.ic_menu_remove_picture);
} else if (!slide.hasVideo()) {
menu.add(0, MENU_ADD_PICTURE, 0, R.string.add_picture).setIcon(
R.drawable.ic_menu_picture);
menu.add(0, MENU_TAKE_PICTURE, 0, R.string.attach_take_photo).setIcon(
R.drawable.ic_menu_picture);
}
// Music
if (slide.hasAudio()) {
menu.add(0, MENU_DEL_AUDIO, 0, R.string.remove_music).setIcon(
R.drawable.ic_menu_remove_sound);
} else if (!slide.hasVideo()) {
SubMenu subMenu = menu.addSubMenu(0, MENU_SUB_AUDIO, 0, R.string.add_music).setIcon(
R.drawable.ic_menu_add_sound);
subMenu.add(0, MENU_ADD_AUDIO, 0, R.string.attach_sound);
subMenu.add(0, MENU_RECORD_SOUND, 0, R.string.attach_record_sound);
}
// Video
if (slide.hasVideo()) {
menu.add(0, MENU_DEL_VIDEO, 0, R.string.remove_video).setIcon(
R.drawable.ic_menu_remove_video);
} else if (!slide.hasAudio() && !slide.hasImage()) {
menu.add(0, MENU_ADD_VIDEO, 0, R.string.add_video).setIcon(R.drawable.ic_menu_movie);
}
// Add slide
menu.add(0, MENU_ADD_SLIDE, 0, R.string.add_slide).setIcon(
R.drawable.ic_menu_add_slide);
// Slide duration
String duration = getResources().getString(R.string.duration_sec);
menu.add(0, MENU_DURATION, 0,
duration.replace("%s", String.valueOf(slide.getDuration() / 1000))).setIcon(
R.drawable.ic_menu_duration);
// Slide layout
int resId;
if (mSlideshowModel.getLayout().getLayoutType() == LayoutModel.LAYOUT_TOP_TEXT) {
resId = R.string.layout_top;
} else {
resId = R.string.layout_bottom;
}
// FIXME: set correct icon when layout icon is available.
menu.add(0, MENU_LAYOUT, 0, resId).setIcon(R.drawable.ic_menu_picture);
return true;
| protected void | onSaveInstanceState(android.os.Bundle outState)
super.onSaveInstanceState(outState);
outState.putInt(SLIDE_INDEX, mPosition);
outState.putParcelable(MESSAGE_URI, mUri);
| private void | previewSlideshow()
MessageUtils.viewMmsMessageAttachment(SlideEditorActivity.this,
mUri, mSlideshowModel,
PduPersister.getPduPersister(SlideEditorActivity.this));
| private void | setReplaceButtonText(int text)
mReplaceImage.setText(text);
| private void | showCurrentSlide()
mPresenter.setLocation(mPosition);
mPresenter.present();
updateTitle();
if (mSlideshowModel.get(mPosition).hasImage()) {
setReplaceButtonText(R.string.replace_image);
} else {
setReplaceButtonText(R.string.add_picture);
}
| private void | showDurationDialog()
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.ic_mms_duration);
String title = getResources().getString(R.string.duration_selector_title);
builder.setTitle(title + (mPosition + 1) + "/" + mSlideshowModel.size());
builder.setItems(R.array.select_dialog_items,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if ((which >= 0) && (which < NUM_DIRECT_DURATIONS)) {
mSlideshowEditor.changeDuration(
mPosition, (which + 1) * 1000);
} else {
Intent intent = new Intent(SlideEditorActivity.this,
EditSlideDurationActivity.class);
intent.putExtra(EditSlideDurationActivity.SLIDE_INDEX, mPosition);
intent.putExtra(EditSlideDurationActivity.SLIDE_TOTAL,
mSlideshowModel.size());
intent.putExtra(EditSlideDurationActivity.SLIDE_DUR,
mSlideshowModel.get(mPosition).getDuration() / 1000); // in seconds
startActivityForResult(intent, REQUEST_CODE_CHANGE_DURATION);
}
}
});
builder.show();
| private void | showLayoutSelectorDialog()
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.ic_mms_layout);
String title = getResources().getString(R.string.layout_selector_title);
builder.setTitle(title + (mPosition + 1) + "/" + mSlideshowModel.size());
LayoutSelectorAdapter adapter = new LayoutSelectorAdapter(this);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0: // Bottom text.
mSlideshowEditor.changeLayout(LayoutModel.LAYOUT_BOTTOM_TEXT);
break;
case 1: // Top text.
mSlideshowEditor.changeLayout(LayoutModel.LAYOUT_TOP_TEXT);
break;
}
}
});
builder.show();
| private void | updateTitle()
setTitle(getString(R.string.slide_show_part, (mPosition + 1), mSlideshowModel.size()));
|
|