1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.messaging.datamodel.media; 17 18 import android.content.Context; 19 import android.content.res.Resources; 20 import android.graphics.Bitmap; 21 import android.graphics.Canvas; 22 import android.graphics.Color; 23 import android.graphics.Paint; 24 import android.graphics.PorterDuff; 25 import android.graphics.PorterDuffColorFilter; 26 import android.graphics.Rect; 27 import android.graphics.Typeface; 28 import android.graphics.drawable.BitmapDrawable; 29 import android.media.ExifInterface; 30 import android.text.TextUtils; 31 32 import com.android.messaging.R; 33 import com.android.messaging.util.Assert; 34 import com.android.messaging.util.AvatarUriUtil; 35 36 import java.io.IOException; 37 import java.util.List; 38 39 public class SimSelectorAvatarRequest extends AvatarRequest { 40 private static Bitmap sRegularSimIcon; 41 42 public SimSelectorAvatarRequest(final Context context, 43 final AvatarRequestDescriptor descriptor) { 44 super(context, descriptor); 45 } 46 47 /** 48 * {@inheritDoc} 49 */ 50 @Override 51 protected ImageResource loadMediaInternal(List<MediaRequest<ImageResource>> chainedTasks) 52 throws IOException { 53 Assert.isNotMainThread(); 54 final String avatarType = AvatarUriUtil.getAvatarType(mDescriptor.uri); 55 if (AvatarUriUtil.TYPE_SIM_SELECTOR_URI.equals(avatarType)){ 56 final int width = mDescriptor.desiredWidth; 57 final int height = mDescriptor.desiredHeight; 58 final String identifier = AvatarUriUtil.getIdentifier(mDescriptor.uri); 59 final boolean simSelected = AvatarUriUtil.getSimSelected(mDescriptor.uri); 60 final int simColor = AvatarUriUtil.getSimColor(mDescriptor.uri); 61 final boolean incoming = AvatarUriUtil.getSimIncoming(mDescriptor.uri); 62 return renderSimAvatarInternal(identifier, width, height, simColor, simSelected, 63 incoming); 64 } 65 return super.loadMediaInternal(chainedTasks); 66 } 67 68 private ImageResource renderSimAvatarInternal(final String identifier, final int width, 69 final int height, final int subColor, final boolean selected, final boolean incoming) { 70 final Resources resources = mContext.getResources(); 71 final float halfWidth = width / 2; 72 final float halfHeight = height / 2; 73 final int minOfWidthAndHeight = Math.min(width, height); 74 final int backgroundColor = selected ? subColor : Color.WHITE; 75 final int textColor = selected ? subColor : Color.WHITE; 76 final int simColor = selected ? Color.WHITE : subColor; 77 final Bitmap bitmap = getBitmapPool().createOrReuseBitmap(width, height, backgroundColor); 78 final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 79 final Canvas canvas = new Canvas(bitmap); 80 81 if (sRegularSimIcon == null) { 82 final BitmapDrawable regularSim = (BitmapDrawable) mContext.getResources() 83 .getDrawable(R.drawable.ic_sim_card_send); 84 sRegularSimIcon = regularSim.getBitmap(); 85 } 86 87 paint.setColorFilter(new PorterDuffColorFilter(simColor, PorterDuff.Mode.SRC_ATOP)); 88 paint.setAlpha(0xff); 89 canvas.drawBitmap(sRegularSimIcon, halfWidth - sRegularSimIcon.getWidth() / 2, 90 halfHeight - sRegularSimIcon.getHeight() / 2, paint); 91 paint.setColorFilter(null); 92 paint.setAlpha(0xff); 93 94 if (!TextUtils.isEmpty(identifier)) { 95 paint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL)); 96 paint.setColor(textColor); 97 final float letterToTileRatio = 98 resources.getFraction(R.dimen.sim_identifier_to_tile_ratio, 1, 1); 99 paint.setTextSize(letterToTileRatio * minOfWidthAndHeight); 100 101 final String firstCharString = identifier.substring(0, 1).toUpperCase(); 102 final Rect textBound = new Rect(); 103 paint.getTextBounds(firstCharString, 0, 1, textBound); 104 105 final float xOffset = halfWidth - textBound.centerX(); 106 final float yOffset = halfHeight - textBound.centerY(); 107 canvas.drawText(firstCharString, xOffset, yOffset, paint); 108 } 109 110 return new DecodedImageResource(getKey(), bitmap, ExifInterface.ORIENTATION_NORMAL); 111 } 112 113 @Override 114 public int getCacheId() { 115 return BugleMediaCacheManager.AVATAR_IMAGE_CACHE; 116 } 117 } 118