packages/apps/Mms/src/com/android/mms/ui/
ComposeMessageActivity.java
onClick(){
else if ((v == mAddAttachmentButton)) {
if (mAttachmentSelector.getVisibility() == View.VISIBLE && !mIsReplaceAttachment) {
mAttachmentSelector.setVisibility(View.GONE);
} else {
showAttachmentSelector(false);
if (mWorkingMessage.hasAttachment()) {
Toast.makeText(this, R.string.add_another_attachment, Toast.LENGTH_SHORT)
.show();
}
}
}
showAttachmentSelector(){//
mAttachmentPagerAdapter.setGridItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (view != null) {
addAttachment((mCurrentAttachmentPager > DEFAULT_ATTACHMENT_PAGER ? position
+ mAttachmentPagerAdapter.PAGE_GRID_COUNT : position), replace);
if (mIsRTL) {
addAttachment((mCurrentAttachmentPager > DEFAULT_ATTACHMENT_PAGER ? position
: mAttachmentPagerAdapter.PAGE_GRID_COUNT + position), replace);
}
mAttachmentSelector.setVisibility(View.GONE);
}
}
});
}
addAttachment(){//添加附件
case AttachmentPagerAdapter.TAKE_PICTURE: {
MessageUtils.capturePicture(this,
getMakRequestCode(replace, REQUEST_CODE_TAKE_PICTURE));
break;
}
}
onActivityResult(){
case REQUEST_CODE_TAKE_PICTURE: {
// create a file based uri and pass to addImage(). We want to read the JPEG
// data directly from file (using UriImage) instead of decoding it into a Bitmap,
// which takes up too much memory and could easily lead to OOM.
File file = new File(TempFileProvider.getScrapPath(this));
Uri uri = Uri.fromFile(file);
// Remove the old captured picture's thumbnail from the cache
MmsApp.getApplication().getThumbnailManager().removeThumbnail(uri);
addImageAsync(uri, append);
break;
}
}
private void addImageAsync(final Uri uri, final boolean append) {
mInAsyncAddAttathProcess = true;
getAsyncDialog().runAsync(new Runnable() {
@Override
public void run() {
addImage(uri, append);
mInAsyncAddAttathProcess = false;
}
}, null, R.string.adding_attachments_title);
}
private void addImage(final Uri uri, final boolean append) {
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
log("addImage: append=" + append + ", uri=" + uri);
}
int result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, uri, append);
Log.d(TAG, "result: " + result);
if (result == WorkingMessage.IMAGE_TOO_LARGE ||
result == WorkingMessage.MESSAGE_SIZE_EXCEEDED) {//图像太大,最新压缩
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
log("resize image " + uri);
}
mResizeImageCount ++;
MessageUtils.resizeImageAsync(ComposeMessageActivity.this,
uri, mWorkingMessage.hasSlideshow() ? mWorkingMessage.getSlideshow()
.getCurrentMessageSize() : 0, mAttachmentEditorHandler,
mResizeImageCallback, append);
return;
}
Log.d(TAG, "isCreationModeEnabled: " + MmsConfig.isCreationModeEnabled());
if ((MmsConfig.isCreationModeEnabled())
&& (result == WorkingMessage.UNSUPPORTED_TYPE_WARNING)) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
addImage(uri, append);
}
};
packages/apps/Mms/src/com/android/mms/data/
WorkingMessage.java
setAttachment(){ changeMedia() }
internalChangeMedia(){ if (type == IMAGE) {slideShowEditor.changeImage(slideNum, uri); }
SlideshowEditor.java
public void changeImage(int position, Uri newImage) throws MmsException {
mModel.get(position).add(new ImageModel(
mContext, newImage, mModel.getLayout().getImageRegion()));
}
SlideshowModel.java
add()
SlideModel.java
internalAdd()---> internalAddOrReplace(mImage, media){ mParent.checkMessageSize(addSize); }
SlideshowModel.java
public void checkMessageSize(int increaseSize) throws ContentRestrictionException {
ContentRestriction cr = ContentRestrictionFactory.getContentRestriction();
cr.checkMessageSize(mCurrentMessageSize, increaseSize, mContext.getContentResolver());
}
CarrierContentRestriction.java
checkMessageSize(){
// 0, and MmsConfig.getMaxMessageSize() - SlideshowModel.SLIDESHOW_SLOP is limitation.
// Reserve SlideshowModel.SLIDESHOW_SLOP(1k) for overhead.
if ( (newSize < 0) || ((newSize + SlideshowModel.SLIDESHOW_SLOP)
> MmsConfig.getMaxMessageSize() )) {
throw new ExceedMessageSizeException(
"Exceed message size limitation").putMmsSize(newSize);
}
MessageUtils.java
resizeImageAsync(){
UriImage image = new UriImage(context, imageUri);
int widthLimit = MmsConfig.getMaxImageWidth();
int heightLimit = MmsConfig.getMaxImageHeight();
part = image.getResizedImageAsPart(
widthLimit,
heightLimit,
MmsConfig.getMaxMessageSize() - currentMsgSize - MESSAGE_OVERHEAD);
Log.d(TAG, "part="+part.getDataLength());
} finally {
// Cancel pending show of the progress toast if necessary.
handler.removeCallbacks(showProgress);
}
handler.post(new Runnable() {
@Override
public void run() {
cb.onResizeResult(part, append);//ComposeMessageActivity
}
});
}
}, "MessageUtils.resizeImageAsync").start();
}
UriImage.java
getResizedImageAsPart(){}
getResizedImageData(){
float scaleFactor = 1.F;
while ((outWidth * scaleFactor > widthLimit) || (outHeight * scaleFactor > heightLimit)) {
scaleFactor *= .75F;
}
/**
* The quality parameter which is used to compress JPEG images.
*/
public static final int IMAGE_COMPRESSION_QUALITY = 95;
/**
* The minimum quality parameter which is used to compress JPEG images.
*/
public static final int MINIMUM_IMAGE_COMPRESSION_QUALITY = 50;
}
ComposeMessageActivity.java
private final ResizeImageResultCallback mResizeImageCallback = new ResizeImageResultCallback() {
// TODO: make this produce a Uri, that's what we want anyway
@Override
public void onResizeResult(PduPart part, boolean append) {
synchronized (mObjectLock) {
mResizeImageCount = mResizeImageCount - 1;
if (mResizeImageCount <= 0) {
log("finish resize all images.");
mObjectLock.notifyAll();
}
}
if (part == null) {
handleAddAttachmentError(WorkingMessage.UNKNOWN_ERROR, R.string.type_picture);
return;
}
Context context = ComposeMessageActivity.this;
PduPersister persister = PduPersister.getPduPersister(context);
int result;
Uri messageUri = mWorkingMessage.saveAsMms(true);
if (messageUri == null) {
result = WorkingMessage.UNKNOWN_ERROR;
} else {
try {
Uri dataUri = persister.persistPart(part,
ContentUris.parseId(messageUri), null);
result = mWorkingMessage.setAttachment(WorkingMessage.IMAGE, dataUri, append);
if (Log.isLoggable(LogTag.APP, Log.VERBOSE)) {
log("ResizeImageResultCallback: dataUri=" + dataUri);
}
} catch (MmsException e) {
result = WorkingMessage.UNKNOWN_ERROR;
}
}
updateMmsSizeIndicator();
drawBottomPanel();
handleAddAttachmentError(result, R.string.type_picture);
}
};