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

Commit ec9a21c8 authored by Beverly's avatar Beverly
Browse files

Toast app icons should show for secondary users

Use the package manager to get app info instead of
ApplicationState b/c ApplicationState lazy-loads information
and the info may not be ready when the Toast app icon needs it.

Test: manual
Fixes: 211777563
Bug: 201097772
Change-Id: I6b32346bd253993bc129dd411260c4010626aef4
parent b413b9a1
Loading
Loading
Loading
Loading
+15 −37
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.UserHandle;
import android.util.IconDrawableFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -40,10 +41,6 @@ import android.widget.ImageView;
import android.widget.TextView;

import com.android.internal.R;
import com.android.launcher3.icons.BaseIconFactory.IconOptions;
import com.android.launcher3.icons.IconFactory;
import com.android.settingslib.applications.ApplicationsState;
import com.android.settingslib.applications.ApplicationsState.AppEntry;
import com.android.systemui.plugins.ToastPlugin;

/**
@@ -252,48 +249,29 @@ public class SystemUIToast implements ToastPlugin.Toast {
            return null;
        }

        final Context userContext;
        try {
            userContext = context.createPackageContextAsUser("android",
                0, new UserHandle(userId));
        } catch (NameNotFoundException e) {
            Log.e(TAG, "Could not create user package context");
            return null;
        }

        final ApplicationsState appState =
                ApplicationsState.getInstance((Application) context.getApplicationContext());
        if (!appState.isUserAdded(userId)) {
            Log.d(TAG, "user hasn't been fully initialized, not showing an app icon for "
                    + "packageName=" + packageName);
            final PackageManager packageManager = context.getPackageManager();
            final ApplicationInfo appInfo = packageManager.getApplicationInfoAsUser(
                    packageName,
                    PackageManager.ApplicationInfoFlags.of(PackageManager.GET_META_DATA),
                    userId);
            if (appInfo == null || !showApplicationIcon(appInfo, packageManager)) {
                return null;
            }

        final PackageManager packageManager = userContext.getPackageManager();
        final AppEntry appEntry = appState.getEntry(packageName, userId);
        if (appEntry == null || appEntry.info == null
                || !showApplicationIcon(appEntry.info, packageManager)) {
            IconDrawableFactory iconFactory = IconDrawableFactory.newInstance(context);
            return iconFactory.getBadgedIcon(appInfo, UserHandle.getUserId(appInfo.uid));
        } catch (NameNotFoundException e) {
            Log.e(TAG, "Couldn't find application info for packageName=" + packageName
                    + " userId=" + userId);
            return null;
        }

        final ApplicationInfo appInfo = appEntry.info;
        UserHandle user = UserHandle.getUserHandleForUid(appInfo.uid);
        IconFactory iconFactory = IconFactory.obtain(context);
        try {
            return iconFactory.createBadgedIconBitmap(
                        appInfo.loadUnbadgedIcon(packageManager),
                        new IconOptions().setUser(user))
                    .newIcon(context);
        } finally {
            iconFactory.recycle();
        }
    }

    private static boolean showApplicationIcon(ApplicationInfo appInfo,
            PackageManager packageManager) {
        if (hasFlag(appInfo.flags, FLAG_UPDATED_SYSTEM_APP)) {
            return packageManager.getLaunchIntentForPackage(appInfo.packageName)
                != null;
            return packageManager.getLaunchIntentForPackage(appInfo.packageName) != null;
        }
        return !hasFlag(appInfo.flags, FLAG_SYSTEM);
    }