Loading packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java +30 −7 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,8 @@ import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable; Loading @@ -46,6 +48,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.annotation.StringRes; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.Closeable; import java.io.File; import java.io.File; import java.io.IOException; import java.io.IOException; Loading Loading @@ -135,10 +138,10 @@ public class PackageUtil { static final class AppSnippet implements Parcelable { static final class AppSnippet implements Parcelable { @NonNull public CharSequence label; @NonNull public CharSequence label; @Nullable public Drawable icon; @NonNull public Drawable icon; public int iconSize; public int iconSize; AppSnippet(@NonNull CharSequence label, @Nullable Drawable icon, Context context) { AppSnippet(@NonNull CharSequence label, @NonNull Drawable icon, Context context) { this.label = label; this.label = label; this.icon = icon; this.icon = icon; final ActivityManager am = context.getSystemService(ActivityManager.class); final ActivityManager am = context.getSystemService(ActivityManager.class); Loading @@ -147,14 +150,15 @@ public class PackageUtil { private AppSnippet(Parcel in) { private AppSnippet(Parcel in) { label = in.readString(); label = in.readString(); Bitmap bmp = in.readParcelable(getClass().getClassLoader(), Bitmap.class); byte[] b = in.readBlob(); Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length); icon = new BitmapDrawable(Resources.getSystem(), bmp); icon = new BitmapDrawable(Resources.getSystem(), bmp); iconSize = in.readInt(); iconSize = in.readInt(); } } @Override @Override public String toString() { public String toString() { return "AppSnippet[" + label + (icon != null ? "(has" : "(no ") + " icon)]"; return "AppSnippet[" + label + " (has icon)]"; } } @Override @Override Loading @@ -165,16 +169,18 @@ public class PackageUtil { @Override @Override public void writeToParcel(@NonNull Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(label.toString()); dest.writeString(label.toString()); Bitmap bmp = getBitmapFromDrawable(icon); Bitmap bmp = getBitmapFromDrawable(icon); dest.writeParcelable(bmp, 0); dest.writeBlob(getBytesFromBitmap(bmp)); bmp.recycle(); dest.writeInt(iconSize); dest.writeInt(iconSize); } } private Bitmap getBitmapFromDrawable(Drawable drawable) { private Bitmap getBitmapFromDrawable(Drawable drawable) { // Create an empty bitmap with the dimensions of our drawable // Create an empty bitmap with the dimensions of our drawable final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(), final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Bitmap.Config.ARGB_8888); // Associate it with a canvas. This canvas will draw the icon on the bitmap // Associate it with a canvas. This canvas will draw the icon on the bitmap final Canvas canvas = new Canvas(bmp); final Canvas canvas = new Canvas(bmp); // Draw the drawable in the canvas. The canvas will ultimately paint the drawable in the // Draw the drawable in the canvas. The canvas will ultimately paint the drawable in the Loading @@ -192,6 +198,23 @@ public class PackageUtil { return bmp; return bmp; } } private byte[] getBytesFromBitmap(Bitmap bmp) { ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); bmp.compress(CompressFormat.PNG, 100, baos); } finally { try { if (baos != null) { baos.close(); } } catch (IOException e) { Log.e(LOG_TAG, "ByteArrayOutputStream was not closed"); } } return baos.toByteArray(); } public static final Parcelable.Creator<AppSnippet> CREATOR = new Parcelable.Creator<>() { public static final Parcelable.Creator<AppSnippet> CREATOR = new Parcelable.Creator<>() { public AppSnippet createFromParcel(Parcel in) { public AppSnippet createFromParcel(Parcel in) { return new AppSnippet(in); return new AppSnippet(in); Loading Loading
packages/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java +30 −7 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,8 @@ import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable; Loading @@ -46,6 +48,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.annotation.StringRes; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.Closeable; import java.io.File; import java.io.File; import java.io.IOException; import java.io.IOException; Loading Loading @@ -135,10 +138,10 @@ public class PackageUtil { static final class AppSnippet implements Parcelable { static final class AppSnippet implements Parcelable { @NonNull public CharSequence label; @NonNull public CharSequence label; @Nullable public Drawable icon; @NonNull public Drawable icon; public int iconSize; public int iconSize; AppSnippet(@NonNull CharSequence label, @Nullable Drawable icon, Context context) { AppSnippet(@NonNull CharSequence label, @NonNull Drawable icon, Context context) { this.label = label; this.label = label; this.icon = icon; this.icon = icon; final ActivityManager am = context.getSystemService(ActivityManager.class); final ActivityManager am = context.getSystemService(ActivityManager.class); Loading @@ -147,14 +150,15 @@ public class PackageUtil { private AppSnippet(Parcel in) { private AppSnippet(Parcel in) { label = in.readString(); label = in.readString(); Bitmap bmp = in.readParcelable(getClass().getClassLoader(), Bitmap.class); byte[] b = in.readBlob(); Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length); icon = new BitmapDrawable(Resources.getSystem(), bmp); icon = new BitmapDrawable(Resources.getSystem(), bmp); iconSize = in.readInt(); iconSize = in.readInt(); } } @Override @Override public String toString() { public String toString() { return "AppSnippet[" + label + (icon != null ? "(has" : "(no ") + " icon)]"; return "AppSnippet[" + label + " (has icon)]"; } } @Override @Override Loading @@ -165,16 +169,18 @@ public class PackageUtil { @Override @Override public void writeToParcel(@NonNull Parcel dest, int flags) { public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(label.toString()); dest.writeString(label.toString()); Bitmap bmp = getBitmapFromDrawable(icon); Bitmap bmp = getBitmapFromDrawable(icon); dest.writeParcelable(bmp, 0); dest.writeBlob(getBytesFromBitmap(bmp)); bmp.recycle(); dest.writeInt(iconSize); dest.writeInt(iconSize); } } private Bitmap getBitmapFromDrawable(Drawable drawable) { private Bitmap getBitmapFromDrawable(Drawable drawable) { // Create an empty bitmap with the dimensions of our drawable // Create an empty bitmap with the dimensions of our drawable final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(), final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Bitmap.Config.ARGB_8888); // Associate it with a canvas. This canvas will draw the icon on the bitmap // Associate it with a canvas. This canvas will draw the icon on the bitmap final Canvas canvas = new Canvas(bmp); final Canvas canvas = new Canvas(bmp); // Draw the drawable in the canvas. The canvas will ultimately paint the drawable in the // Draw the drawable in the canvas. The canvas will ultimately paint the drawable in the Loading @@ -192,6 +198,23 @@ public class PackageUtil { return bmp; return bmp; } } private byte[] getBytesFromBitmap(Bitmap bmp) { ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); bmp.compress(CompressFormat.PNG, 100, baos); } finally { try { if (baos != null) { baos.close(); } } catch (IOException e) { Log.e(LOG_TAG, "ByteArrayOutputStream was not closed"); } } return baos.toByteArray(); } public static final Parcelable.Creator<AppSnippet> CREATOR = new Parcelable.Creator<>() { public static final Parcelable.Creator<AppSnippet> CREATOR = new Parcelable.Creator<>() { public AppSnippet createFromParcel(Parcel in) { public AppSnippet createFromParcel(Parcel in) { return new AppSnippet(in); return new AppSnippet(in); Loading