Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bfc1c042 authored by Sumedh Sen's avatar Sumedh Sen Committed by Gerrit Code Review
Browse files

Merge changes from topic "cherrypicker-L13500000963621094:N14000001415635321" into main

* changes:
  Recycle the original bitmap after scaling down
  Resize large app icons before adding them in a parcel
  Make AppSnippet parcelable
parents d0d81bd3 99396a46
Loading
Loading
Loading
Loading
+2 −10
Original line number Original line Diff line number Diff line
@@ -33,8 +33,6 @@ import android.view.View;


import androidx.annotation.Nullable;
import androidx.annotation.Nullable;


import java.io.File;

/**
/**
 * Installation failed: Return status code to the caller or display failure UI to user
 * Installation failed: Return status code to the caller or display failure UI to user
 */
 */
@@ -101,14 +99,8 @@ public class InstallFailed extends AlertActivity {
            // Set header icon and title
            // Set header icon and title
            PackageUtil.AppSnippet as;
            PackageUtil.AppSnippet as;
            PackageManager pm = getPackageManager();
            PackageManager pm = getPackageManager();

            as = intent.getParcelableExtra(PackageInstallerActivity.EXTRA_APP_SNIPPET,
            if ("package".equals(packageURI.getScheme())) {
                    PackageUtil.AppSnippet.class);
                as = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo),
                        pm.getApplicationIcon(appInfo));
            } else {
                final File sourceFile = new File(packageURI.getPath());
                as = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
            }


            // Store label for dialog
            // Store label for dialog
            mLabel = as.label;
            mLabel = as.label;
+3 −1
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.packageinstaller;
package com.android.packageinstaller;


import static com.android.packageinstaller.PackageInstallerActivity.EXTRA_APP_SNIPPET;
import static com.android.packageinstaller.PackageInstallerActivity.EXTRA_STAGED_SESSION_ID;
import static com.android.packageinstaller.PackageInstallerActivity.EXTRA_STAGED_SESSION_ID;


import android.app.PendingIntent;
import android.app.PendingIntent;
@@ -86,7 +87,8 @@ public class InstallInstalling extends AlertActivity {
            // ContentResolver.SCHEME_FILE
            // ContentResolver.SCHEME_FILE
            // STAGED_SESSION_ID extra contains an ID of a previously staged install session.
            // STAGED_SESSION_ID extra contains an ID of a previously staged install session.
            final File sourceFile = new File(mPackageURI.getPath());
            final File sourceFile = new File(mPackageURI.getPath());
            PackageUtil.AppSnippet as = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
            PackageUtil.AppSnippet as = getIntent()
                    .getParcelableExtra(EXTRA_APP_SNIPPET, PackageUtil.AppSnippet.class);


            mAlert.setIcon(as.icon);
            mAlert.setIcon(as.icon);
            mAlert.setTitle(as.label);
            mAlert.setTitle(as.label);
+2 −14
Original line number Original line Diff line number Diff line
@@ -23,7 +23,6 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.util.Log;
import android.util.Log;
import android.view.View;
import android.view.View;
@@ -31,7 +30,6 @@ import android.widget.Button;


import androidx.annotation.Nullable;
import androidx.annotation.Nullable;


import java.io.File;
import java.util.List;
import java.util.List;


/**
/**
@@ -66,18 +64,8 @@ public class InstallSuccess extends AlertActivity {
            ApplicationInfo appInfo =
            ApplicationInfo appInfo =
                    intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
                    intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
            mAppPackageName = appInfo.packageName;
            mAppPackageName = appInfo.packageName;
            Uri packageURI = intent.getData();
            mAppSnippet = intent.getParcelableExtra(PackageInstallerActivity.EXTRA_APP_SNIPPET,

                    PackageUtil.AppSnippet.class);
            // Set header icon and title
            PackageManager pm = getPackageManager();

            if ("package".equals(packageURI.getScheme())) {
                mAppSnippet = new PackageUtil.AppSnippet(pm.getApplicationLabel(appInfo),
                        pm.getApplicationIcon(appInfo));
            } else {
                File sourceFile = new File(packageURI.getPath());
                mAppSnippet = PackageUtil.getAppSnippet(this, appInfo, sourceFile);
            }


            mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppPackageName);
            mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppPackageName);


+6 −2
Original line number Original line Diff line number Diff line
@@ -81,6 +81,7 @@ public class PackageInstallerActivity extends AlertActivity {
    static final String EXTRA_CALLING_ATTRIBUTION_TAG = "EXTRA_CALLING_ATTRIBUTION_TAG";
    static final String EXTRA_CALLING_ATTRIBUTION_TAG = "EXTRA_CALLING_ATTRIBUTION_TAG";
    static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO";
    static final String EXTRA_ORIGINAL_SOURCE_INFO = "EXTRA_ORIGINAL_SOURCE_INFO";
    static final String EXTRA_STAGED_SESSION_ID = "EXTRA_STAGED_SESSION_ID";
    static final String EXTRA_STAGED_SESSION_ID = "EXTRA_STAGED_SESSION_ID";
    static final String EXTRA_APP_SNIPPET = "EXTRA_APP_SNIPPET";
    private static final String ALLOW_UNKNOWN_SOURCES_KEY =
    private static final String ALLOW_UNKNOWN_SOURCES_KEY =
            PackageInstallerActivity.class.getName() + "ALLOW_UNKNOWN_SOURCES_KEY";
            PackageInstallerActivity.class.getName() + "ALLOW_UNKNOWN_SOURCES_KEY";


@@ -595,7 +596,7 @@ public class PackageInstallerActivity extends AlertActivity {
                CharSequence label = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
                CharSequence label = mPm.getApplicationLabel(mPkgInfo.applicationInfo);
                if (mLocalLOGV) Log.i(TAG, "creating snippet for " + label);
                if (mLocalLOGV) Log.i(TAG, "creating snippet for " + label);
                mAppSnippet = new PackageUtil.AppSnippet(label,
                mAppSnippet = new PackageUtil.AppSnippet(label,
                        mPm.getApplicationIcon(mPkgInfo.applicationInfo));
                        mPm.getApplicationIcon(mPkgInfo.applicationInfo), getBaseContext());
            } break;
            } break;


            case ContentResolver.SCHEME_FILE: {
            case ContentResolver.SCHEME_FILE: {
@@ -633,7 +634,7 @@ public class PackageInstallerActivity extends AlertActivity {
        mPkgInfo = generateStubPackageInfo(info.getAppPackageName());
        mPkgInfo = generateStubPackageInfo(info.getAppPackageName());
        mAppSnippet = new PackageUtil.AppSnippet(info.getAppLabel(),
        mAppSnippet = new PackageUtil.AppSnippet(info.getAppLabel(),
                info.getAppIcon() != null ? new BitmapDrawable(getResources(), info.getAppIcon())
                info.getAppIcon() != null ? new BitmapDrawable(getResources(), info.getAppIcon())
                        : getPackageManager().getDefaultActivityIcon());
                        : getPackageManager().getDefaultActivityIcon(), getBaseContext());
        return true;
        return true;
    }
    }


@@ -693,6 +694,9 @@ public class PackageInstallerActivity extends AlertActivity {
        if (stagedSessionId > 0) {
        if (stagedSessionId > 0) {
            newIntent.putExtra(EXTRA_STAGED_SESSION_ID, stagedSessionId);
            newIntent.putExtra(EXTRA_STAGED_SESSION_ID, stagedSessionId);
        }
        }
        if (mAppSnippet != null) {
            newIntent.putExtra(EXTRA_APP_SNIPPET, mAppSnippet);
        }
        newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
        if (mLocalLOGV) Log.i(TAG, "downloaded app uri=" + mPackageURI);
        if (mLocalLOGV) Log.i(TAG, "downloaded app uri=" + mPackageURI);
        startActivity(newIntent);
        startActivity(newIntent);
+66 −3
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@
package com.android.packageinstaller;
package com.android.packageinstaller;


import android.app.Activity;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.DialogFragment;
@@ -27,8 +28,13 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
import android.os.UserHandle;
import android.util.Log;
import android.util.Log;
import android.view.View;
import android.view.View;
@@ -115,18 +121,75 @@ public class PackageUtil {
                icon);
                icon);
    }
    }


    static final class AppSnippet {
    static final class AppSnippet implements Parcelable {
        @NonNull public CharSequence label;
        @NonNull public CharSequence label;
        @Nullable public Drawable icon;
        @Nullable public Drawable icon;
        public AppSnippet(@NonNull CharSequence label, @Nullable Drawable icon) {
        public int iconSize;

        public AppSnippet(@NonNull CharSequence label, @Nullable Drawable icon, Context context) {
            this.label = label;
            this.label = label;
            this.icon = icon;
            this.icon = icon;
            final ActivityManager am = context.getSystemService(ActivityManager.class);
            this.iconSize = am.getLauncherLargeIconSize();
        }

        private AppSnippet(Parcel in) {
            label = in.readString();
            Bitmap bmp = in.readParcelable(getClass().getClassLoader(), Bitmap.class);
            icon = new BitmapDrawable(Resources.getSystem(), bmp);
            iconSize = in.readInt();
        }
        }


        @Override
        @Override
        public String toString() {
        public String toString() {
            return "AppSnippet[" + label + (icon != null ? "(has" : "(no ") + " icon)]";
            return "AppSnippet[" + label + (icon != null ? "(has" : "(no ") + " icon)]";
        }
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(@NonNull Parcel dest, int flags) {
            dest.writeString(label.toString());
            Bitmap bmp = getBitmapFromDrawable(icon);
            dest.writeParcelable(bmp, 0);
            dest.writeInt(iconSize);
        }

        private Bitmap getBitmapFromDrawable(Drawable drawable) {
            // Create an empty bitmap with the dimensions of our drawable
            final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
                    drawable.getIntrinsicHeight(),
                    Bitmap.Config.ARGB_8888);
            // Associate it with a canvas. This canvas will draw the icon on the bitmap
            final Canvas canvas = new Canvas(bmp);
            // Draw the drawable in the canvas. The canvas will ultimately paint the drawable in the
            // bitmap held within
            drawable.draw(canvas);

            // Scale it down if the icon is too large
            if ((bmp.getWidth() > iconSize * 2) || (bmp.getHeight() > iconSize * 2)) {
                Bitmap scaledBitmap = Bitmap.createScaledBitmap(bmp, iconSize, iconSize, true);
                if (scaledBitmap != bmp) {
                    bmp.recycle();
                }
                return scaledBitmap;
            }

            return bmp;
        }

        public static final Parcelable.Creator<AppSnippet> CREATOR = new Parcelable.Creator<>() {
            public AppSnippet createFromParcel(Parcel in) {
                return new AppSnippet(in);
            }

            public AppSnippet[] newArray(int size) {
                return new AppSnippet[size];
            }
        };
    }
    }


    /**
    /**
@@ -171,7 +234,7 @@ public class PackageUtil {
        } catch (OutOfMemoryError e) {
        } catch (OutOfMemoryError e) {
            Log.i(LOG_TAG, "Could not load app icon", e);
            Log.i(LOG_TAG, "Could not load app icon", e);
        }
        }
        return new PackageUtil.AppSnippet(label, icon);
        return new PackageUtil.AppSnippet(label, icon, pContext);
    }
    }


    /**
    /**