package com.mixpanel.android.util; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Color; import android.view.View; public class ActivityImageUtils { // May return null. public static Bitmap getScaledScreenshot(final Activity activity, int scaleWidth, int scaleHeight, boolean relativeScaleIfTrue) { final View someView = activity.findViewById(android.R.id.content); final View rootView = someView.getRootView(); final boolean originalCacheState = rootView.isDrawingCacheEnabled(); rootView.setDrawingCacheEnabled(true); rootView.buildDrawingCache(true); // We could get a null or zero px bitmap if the rootView hasn't been measured // appropriately, or we grab it before layout. // This is ok, and we should handle it gracefully. final Bitmap original = rootView.getDrawingCache(); Bitmap scaled = null; if (null != original && original.getWidth() > 0 && original.getHeight() > 0) { if (relativeScaleIfTrue) { scaleWidth = original.getWidth() / scaleWidth; scaleHeight = original.getHeight() / scaleHeight; } if (scaleWidth > 0 && scaleHeight > 0) { try { scaled = Bitmap.createScaledBitmap(original, scaleWidth, scaleHeight, false); } catch (OutOfMemoryError error) { MPLog.i(LOGTAG, "Not enough memory to produce scaled image, returning a null screenshot"); } } } if (!originalCacheState) { rootView.setDrawingCacheEnabled(false); } return scaled; } public static int getHighlightColorFromBackground(final Activity activity) { int incolor = Color.BLACK; final Bitmap screenshot1px = getScaledScreenshot(activity, 1, 1, false); if (null != screenshot1px) { incolor = screenshot1px.getPixel(0, 0); } return getHighlightColor(incolor); } public static int getHighlightColorFromBitmap(final Bitmap bitmap) { int incolor = Color.BLACK; if (null != bitmap) { final Bitmap bitmap1px = Bitmap.createScaledBitmap(bitmap, 1, 1, false); incolor = bitmap1px.getPixel(0, 0); } return getHighlightColor(incolor); } public static int getHighlightColor(int sampleColor) { // Set a constant value level in HSV, in case the averaged color is too light or too dark. float[] hsvBackground = new float[3]; Color.colorToHSV(sampleColor, hsvBackground); hsvBackground[2] = 0.3f; // value parameter return Color.HSVToColor(0xf2, hsvBackground); } @SuppressWarnings("unused") private static final String LOGTAG = "MixpanelAPI.ActImgUtils"; }