CMSDK : Fix generateAlertColorFromDrawable for non BitmapDrawable
In the case that the bitmap being passed in was not a bitmap drawable, we were not retaining any of the attributes from the original drawable. This patch ensures we ask that drawable to draw on the canvas/bitmap so we can use that information. Also add tests around it. Change-Id: I3eefba6e6624fe0bed4965ddf9029320c40f7420
This commit is contained in:
parent
4ceac56022
commit
e1ba9407f7
@ -16,6 +16,7 @@
|
|||||||
package cyanogenmod.util;
|
package cyanogenmod.util;
|
||||||
|
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
@ -270,9 +271,13 @@ public class ColorUtils {
|
|||||||
if (drawable instanceof BitmapDrawable) {
|
if (drawable instanceof BitmapDrawable) {
|
||||||
bitmap = ((BitmapDrawable) drawable).getBitmap();
|
bitmap = ((BitmapDrawable) drawable).getBitmap();
|
||||||
} else {
|
} else {
|
||||||
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
|
int width = drawable.getIntrinsicWidth();
|
||||||
drawable.getIntrinsicHeight(),
|
int height = drawable.getIntrinsicHeight();
|
||||||
|
bitmap = Bitmap.createBitmap(Math.max(1, width),
|
||||||
|
Math.max(1, height),
|
||||||
Bitmap.Config.ARGB_8888);
|
Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
drawable.draw(canvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bitmap != null) {
|
if (bitmap != null) {
|
||||||
|
@ -21,9 +21,12 @@ import android.graphics.Canvas;
|
|||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
|
import android.graphics.drawable.ColorDrawable;
|
||||||
import android.test.AndroidTestCase;
|
import android.test.AndroidTestCase;
|
||||||
import android.util.MathUtils;
|
|
||||||
import cyanogenmod.util.ColorUtils;
|
import cyanogenmod.util.ColorUtils;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
public class ColorUtilTest extends AndroidTestCase {
|
public class ColorUtilTest extends AndroidTestCase {
|
||||||
private ColorUtils mColorUtils;
|
private ColorUtils mColorUtils;
|
||||||
@ -59,13 +62,17 @@ public class ColorUtilTest extends AndroidTestCase {
|
|||||||
assertEquals(color, Color.BLACK);
|
assertEquals(color, Color.BLACK);
|
||||||
|
|
||||||
Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
|
Bitmap bitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
|
||||||
|
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
|
||||||
|
bitmapDrawable.setBounds(0, 0, 10, 10);
|
||||||
Canvas canvas = new Canvas(bitmap);
|
Canvas canvas = new Canvas(bitmap);
|
||||||
canvas.drawColor(Color.RED);
|
canvas.drawColor(Color.RED);
|
||||||
|
|
||||||
// Test fully red bitmap
|
// Test fully red bitmap
|
||||||
BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);
|
|
||||||
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
||||||
assertEquals(color, Color.RED);
|
assertEquals(color, Color.RED);
|
||||||
|
color = mColorUtils.generateAlertColorFromDrawable(
|
||||||
|
getColorDrawableFromBitmapDrawable(bitmapDrawable));
|
||||||
|
assertEquals(color, Color.RED);
|
||||||
|
|
||||||
// Test blue/red bitmap with blue dominating
|
// Test blue/red bitmap with blue dominating
|
||||||
Paint p = new Paint();
|
Paint p = new Paint();
|
||||||
@ -74,12 +81,18 @@ public class ColorUtilTest extends AndroidTestCase {
|
|||||||
canvas.drawRect(0, 0, 8, 8, p);
|
canvas.drawRect(0, 0, 8, 8, p);
|
||||||
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
||||||
assertEquals(color, Color.BLUE);
|
assertEquals(color, Color.BLUE);
|
||||||
|
color = mColorUtils.generateAlertColorFromDrawable(
|
||||||
|
getColorDrawableFromBitmapDrawable(bitmapDrawable));
|
||||||
|
assertEquals(color, Color.BLUE);
|
||||||
|
|
||||||
// Test large white + small blue scenario
|
// Test large white + small blue scenario
|
||||||
canvas.drawColor(Color.WHITE);
|
canvas.drawColor(Color.WHITE);
|
||||||
canvas.drawRect(0, 0, 2, 2, p);
|
canvas.drawRect(0, 0, 2, 2, p);
|
||||||
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
||||||
assertEquals(color, Color.BLUE);
|
assertEquals(color, Color.BLUE);
|
||||||
|
color = mColorUtils.generateAlertColorFromDrawable(
|
||||||
|
getColorDrawableFromBitmapDrawable(bitmapDrawable));
|
||||||
|
assertEquals(color, Color.BLUE);
|
||||||
|
|
||||||
// Test large white + small black scenario
|
// Test large white + small black scenario
|
||||||
canvas.drawColor(Color.WHITE);
|
canvas.drawColor(Color.WHITE);
|
||||||
@ -87,8 +100,24 @@ public class ColorUtilTest extends AndroidTestCase {
|
|||||||
canvas.drawRect(0, 0, 2, 2, p);
|
canvas.drawRect(0, 0, 2, 2, p);
|
||||||
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
color = mColorUtils.generateAlertColorFromDrawable(bitmapDrawable);
|
||||||
assertEquals(color, Color.WHITE);
|
assertEquals(color, Color.WHITE);
|
||||||
|
color = mColorUtils.generateAlertColorFromDrawable(
|
||||||
|
getColorDrawableFromBitmapDrawable(bitmapDrawable));
|
||||||
|
assertEquals(color, Color.WHITE);
|
||||||
|
|
||||||
assertEquals(bitmap.isRecycled(), false);
|
assertEquals(bitmap.isRecycled(), false);
|
||||||
bitmap.recycle();
|
bitmap.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ColorDrawable getColorDrawableFromBitmapDrawable(final BitmapDrawable bitmapDrawable) {
|
||||||
|
ColorDrawable colorDrawable = Mockito.mock(ColorDrawable.class);
|
||||||
|
Mockito.doAnswer(new Answer() {
|
||||||
|
@Override
|
||||||
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
||||||
|
Canvas canvas = (Canvas) invocation.getArguments()[0];
|
||||||
|
bitmapDrawable.draw(canvas);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}).when(colorDrawable).draw(Mockito.any(Canvas.class));
|
||||||
|
return colorDrawable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user