/*
* Copyright 2015. Appsi Mobile
*
* 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.appsimobile.appsii.icontheme.iconpack;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.net.Uri;
import android.util.SparseArray;
import com.appsimobile.appsii.AppsiiUtils;
import java.util.Random;
/**
* Created by Nick Martens on 9/25/13.
*/
public class AppFilterDecorationHelper {
private static final Rect mBoundsRect = new Rect();
final PorterDuffXfermode mDstOut = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
final PorterDuffXfermode mDstOver = new PorterDuffXfermode(PorterDuff.Mode.DST_OVER);
private final Random mRandom = new Random();
private final SparseArray<Bitmap> mIconCache = new SparseArray<Bitmap>();
private final AppFilterParser.AppFilterData mAppFilterData;
private final Resources mResources;
private final String mPackageName;
private final Paint mPaint;
private AppFilterDecorationHelper(String packageName, Resources resources,
AppFilterParser.AppFilterData appFilterData) {
mResources = resources;
mAppFilterData = appFilterData;
mPackageName = packageName;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setFilterBitmap(true);
}
public static AppFilterDecorationHelper getInstance(String packageName, Resources resources,
AppFilterParser.AppFilterData appFilterData) {
return new AppFilterDecorationHelper(packageName, resources, appFilterData);
}
public Bitmap applyDecorations(Bitmap original, Uri uri) {
if (original == null) return null;
if (mAppFilterData == null) {
return original;
}
if (mAppFilterData.mIconBack == null && mAppFilterData.mIconMask == null &&
mAppFilterData.mIconUpon == null) {
return original;
}
if (uri != null) {
mRandom.setSeed(uri.hashCode());
}
int[] load = new int[2];
if (uri == null) {
load[0] = original.getWidth();
load[1] = original.getHeight();
} else {
AppsiiUtils.getIconDimensionsFromQuery(uri, load);
}
int w = load[0];
int h = load[1];
Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
drawMaskedIcon(canvas, original, w, h);
drawback(canvas, w, h);
drawupon(canvas, w, h);
return result;
}
private synchronized void drawMaskedIcon(Canvas canvas, Bitmap original, int w, int h) {
Resources res = mAppFilterData.mResources;
float scaleFactor = mAppFilterData.mScaleFactor;
String[] iconMask = mAppFilterData.mIconMask;
mBoundsRect.set(0, 0, w, h);
//Bitmap target = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
//Canvas targetCanvas = new Canvas(target);
int scaledWidth = (int) (scaleFactor * w);
int scaledHeight = (int) (scaleFactor * h);
int x = (w - scaledWidth) / 2;
int y = (h - scaledHeight) / 2;
mPaint.setXfermode(null);
canvas.drawBitmap(original, null, new Rect(x, y, x + scaledWidth, y + scaledHeight),
mPaint);
if (iconMask != null) {
int idx = mRandom.nextInt(iconMask.length);
String maskDrawableName = iconMask[idx];
int id = res.getIdentifier(maskDrawableName, "drawable", mPackageName);
if (id == 0) return;
Bitmap maskBitmap = getBitmap(id);
if (maskBitmap != null) {
mPaint.setXfermode(mDstOut);
canvas.drawBitmap(maskBitmap, null, mBoundsRect, mPaint);
}
}
}
private synchronized void drawback(Canvas canvas, int w, int h) {
mBoundsRect.set(0, 0, w, h);
if (mAppFilterData.mIconBack == null) return;
int idx = mRandom.nextInt(mAppFilterData.mIconBack.length);
String backDrawableName = mAppFilterData.mIconBack[idx];
int id = mResources.getIdentifier(backDrawableName, "drawable", mPackageName);
Bitmap backBitmap = getBitmap(id);
if (backBitmap == null) return;
mPaint.setXfermode(mDstOver);
canvas.drawBitmap(backBitmap, null, mBoundsRect, mPaint);
}
private synchronized void drawupon(Canvas canvas, int w, int h) {
mBoundsRect.set(0, 0, w, h);
if (mAppFilterData.mIconUpon == null) return;
int idx = mRandom.nextInt(mAppFilterData.mIconUpon.length);
String backDrawableName = mAppFilterData.mIconUpon[idx];
int id = mResources.getIdentifier(backDrawableName, "drawable", mPackageName);
Bitmap uponBitmap = getBitmap(id);
if (uponBitmap == null) return;
mPaint.setXfermode(null);
canvas.drawBitmap(uponBitmap, null, mBoundsRect, mPaint);
}
private Bitmap getBitmap(int resId) {
if (resId == 0) return null;
Bitmap result = mIconCache.get(resId);
if (result != null) return result;
result = BitmapFactory.decodeResource(mResources, resId);
mIconCache.put(resId, result);
return result;
}
}