blob: 66f1bff2c155ad47bec3d04288eb07fd6298e6e5 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.messaging.datamodel.media;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.media.ExifInterface;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ImageUtils;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
/**
* Requests a composite image resource. The composite image resource is constructed by first
* sequentially requesting a number of sub image resources specified by
* {@link CompositeImageRequestDescriptor#getChildRequestDescriptors()}. After this, the
* individual sub images are composed into the final image onto their respective target rects
* returned by {@link CompositeImageRequestDescriptor#getChildRequestTargetRects()}.
*/
public class CompositeImageRequest<D extends CompositeImageRequestDescriptor>
extends ImageRequest<D> {
private final Bitmap mBitmap;
private final Canvas mCanvas;
private final Paint mPaint;
public CompositeImageRequest(final Context context, final D descriptor) {
super(context, descriptor);
mBitmap = getBitmapPool().createOrReuseBitmap(
mDescriptor.desiredWidth, mDescriptor.desiredHeight);
mCanvas = new Canvas(mBitmap);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
}
@Override
protected ImageResource loadMediaInternal(List<MediaRequest<ImageResource>> chainedTask) {
final List<? extends ImageRequestDescriptor> descriptors =
mDescriptor.getChildRequestDescriptors();
final List<RectF> targetRects = mDescriptor.getChildRequestTargetRects();
Assert.equals(descriptors.size(), targetRects.size());
Assert.isTrue(descriptors.size() > 1);
for (int i = 0; i < descriptors.size(); i++) {
final MediaRequest<ImageResource> request =
descriptors.get(i).buildSyncMediaRequest(mContext);
// Synchronously request the child image.
final ImageResource resource =
MediaResourceManager.get().requestMediaResourceSync(request);
if (resource != null) {
try {
final RectF avatarDestOnGroup = targetRects.get(i);
// Draw the bitmap into a smaller size with a circle mask.
final Bitmap resourceBitmap = resource.getBitmap();
final RectF resourceRect = new RectF(
0, 0, resourceBitmap.getWidth(), resourceBitmap.getHeight());
final Bitmap smallCircleBitmap = getBitmapPool().createOrReuseBitmap(
Math.round(avatarDestOnGroup.width()),
Math.round(avatarDestOnGroup.height()));
final RectF smallCircleRect = new RectF(
0, 0, smallCircleBitmap.getWidth(), smallCircleBitmap.getHeight());
final Canvas smallCircleCanvas = new Canvas(smallCircleBitmap);
ImageUtils.drawBitmapWithCircleOnCanvas(resource.getBitmap(), smallCircleCanvas,
resourceRect, smallCircleRect, null /* bitmapPaint */,
false /* fillBackground */,
ImageUtils.DEFAULT_CIRCLE_BACKGROUND_COLOR /* circleBackgroundColor */,
ImageUtils.DEFAULT_CIRCLE_STROKE_COLOR /* circleStrokeColor */);
final Matrix matrix = new Matrix();
matrix.setRectToRect(smallCircleRect, avatarDestOnGroup,
Matrix.ScaleToFit.FILL);
mCanvas.drawBitmap(smallCircleBitmap, matrix, mPaint);
} finally {
resource.release();
}
}
}
return new DecodedImageResource(getKey(), mBitmap, ExifInterface.ORIENTATION_NORMAL);
}
@Override
public int getCacheId() {
return BugleMediaCacheManager.AVATAR_IMAGE_CACHE;
}
@Override
protected InputStream getInputStreamForResource() throws FileNotFoundException {
throw new IllegalStateException("Composite image request doesn't support input stream!");
}
}