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

Commit 4035f81a authored by Rohit Goyal's avatar Rohit Goyal
Browse files

Include activity infos corresponding to archived apps in...

Include activity infos corresponding to archived apps in LauncherApps::getActivityList and LauncherApps::resolveActivity.

Test: atest LauncherAppsTest
Bug: 302610213, 302611047
Change-Id: I01a60788de178b6f785ef09618e4f190da1cf795
parent ad920d71
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -205,6 +205,7 @@ java_library_static {
        "com.android.sysprop.watchdog",
        "com.android.sysprop.watchdog",
        "ImmutabilityAnnotation",
        "ImmutabilityAnnotation",
        "securebox",
        "securebox",
        "android.content.pm.flags-aconfig-java",
        "apache-commons-math",
        "apache-commons-math",
        "backstage_power_flags_lib",
        "backstage_power_flags_lib",
        "notification_flags_lib",
        "notification_flags_lib",
+167 −19
Original line number Original line Diff line number Diff line
@@ -56,6 +56,7 @@ import android.content.IntentSender;
import android.content.LocusId;
import android.content.LocusId;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.Flags;
import android.content.pm.ILauncherApps;
import android.content.pm.ILauncherApps;
import android.content.pm.IOnAppsChangedListener;
import android.content.pm.IOnAppsChangedListener;
import android.content.pm.IPackageInstallerCallback;
import android.content.pm.IPackageInstallerCallback;
@@ -94,6 +95,7 @@ import android.os.ShellCommand;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManager;
import android.provider.Settings;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.Pair;
@@ -112,6 +114,8 @@ import com.android.internal.util.SizedInputStream;
import com.android.server.LocalServices;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.SystemService;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.ArchiveState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;


import java.io.DataInputStream;
import java.io.DataInputStream;
@@ -513,18 +517,27 @@ public class LauncherAppsService extends SystemService {


        @Override
        @Override
        public ParceledListSlice<LauncherActivityInfoInternal> getLauncherActivities(
        public ParceledListSlice<LauncherActivityInfoInternal> getLauncherActivities(
                String callingPackage, String packageName, UserHandle user) throws RemoteException {
                String callingPackage, @Nullable String packageName, UserHandle user)
                throws RemoteException {
            ParceledListSlice<LauncherActivityInfoInternal> launcherActivities =
            ParceledListSlice<LauncherActivityInfoInternal> launcherActivities =
                    queryActivitiesForUser(callingPackage,
                    queryActivitiesForUser(
                            callingPackage,
                            new Intent(Intent.ACTION_MAIN)
                            new Intent(Intent.ACTION_MAIN)
                                    .addCategory(Intent.CATEGORY_LAUNCHER)
                                    .addCategory(Intent.CATEGORY_LAUNCHER)
                                    .setPackage(packageName),
                                    .setPackage(packageName),
                            user);
                            user);
            if (Settings.Global.getInt(mContext.getContentResolver(),
            if (Flags.archiving()) {
                    Settings.Global.SHOW_HIDDEN_LAUNCHER_ICON_APPS_ENABLED, 1) == 0) {
                launcherActivities =
                        getActivitiesForArchivedApp(packageName, user, launcherActivities);
            }
            if (Settings.Global.getInt(
                            mContext.getContentResolver(),
                            Settings.Global.SHOW_HIDDEN_LAUNCHER_ICON_APPS_ENABLED,
                            1)
                    == 0) {
                return launcherActivities;
                return launcherActivities;
            }
            }
            if (launcherActivities == null) {
            if (launcherActivities == null || launcherActivities.getList().isEmpty()) {
                // Cannot access profile, so we don't even return any hidden apps.
                // Cannot access profile, so we don't even return any hidden apps.
                return null;
                return null;
            }
            }
@@ -565,14 +578,15 @@ public class LauncherAppsService extends SystemService {
                    visiblePackages.add(info.getActivityInfo().packageName);
                    visiblePackages.add(info.getActivityInfo().packageName);
                }
                }
                final List<ApplicationInfo> installedPackages =
                final List<ApplicationInfo> installedPackages =
                        mPackageManagerInternal.getInstalledApplications(/* flags= */ 0,
                        mPackageManagerInternal.getInstalledApplications(
                                user.getIdentifier(), callingUid);
                                /* flags= */ 0, user.getIdentifier(), callingUid);
                for (ApplicationInfo applicationInfo : installedPackages) {
                for (ApplicationInfo applicationInfo : installedPackages) {
                    if (!visiblePackages.contains(applicationInfo.packageName)) {
                    if (!visiblePackages.contains(applicationInfo.packageName)) {
                        if (!shouldShowSyntheticActivity(user, applicationInfo)) {
                        if (!shouldShowSyntheticActivity(user, applicationInfo)) {
                            continue;
                            continue;
                        }
                        }
                        LauncherActivityInfoInternal info = getHiddenAppActivityInfo(
                        LauncherActivityInfoInternal info =
                                getHiddenAppActivityInfo(
                                        applicationInfo.packageName, callingUid, user);
                                        applicationInfo.packageName, callingUid, user);
                        if (info != null) {
                        if (info != null) {
                            result.add(info);
                            result.add(info);
@@ -585,6 +599,23 @@ public class LauncherAppsService extends SystemService {
            }
            }
        }
        }


        private ParceledListSlice<LauncherActivityInfoInternal> getActivitiesForArchivedApp(
                @Nullable String packageName,
                UserHandle user,
                ParceledListSlice<LauncherActivityInfoInternal> launcherActivities) {
            final List<LauncherActivityInfoInternal> archivedActivities =
                    generateLauncherActivitiesForArchivedApp(packageName, user);
            if (archivedActivities.isEmpty()) {
                return launcherActivities;
            }
            if (launcherActivities == null) {
                return new ParceledListSlice(archivedActivities);
            }
            List<LauncherActivityInfoInternal> result = launcherActivities.getList();
            result.addAll(archivedActivities);
            return new ParceledListSlice(result);
        }

        private boolean shouldShowSyntheticActivity(UserHandle user, ApplicationInfo appInfo) {
        private boolean shouldShowSyntheticActivity(UserHandle user, ApplicationInfo appInfo) {
            if (appInfo == null || appInfo.isSystemApp() || appInfo.isUpdatedSystemApp()) {
            if (appInfo == null || appInfo.isSystemApp() || appInfo.isUpdatedSystemApp()) {
                return false;
                return false;
@@ -650,23 +681,30 @@ public class LauncherAppsService extends SystemService {
                return null;
                return null;
            }
            }


            if (component == null || component.getPackageName() == null) {
                // should not happen
                return null;
            }

            final int callingUid = injectBinderCallingUid();
            final int callingUid = injectBinderCallingUid();
            final long ident = Binder.clearCallingIdentity();
            final long ident = Binder.clearCallingIdentity();
            try {
            try {
                final ActivityInfo activityInfo = mPackageManagerInternal.getActivityInfo(component,
                ActivityInfo activityInfo =
                        mPackageManagerInternal.getActivityInfo(
                                component,
                                PackageManager.MATCH_DIRECT_BOOT_AWARE
                                PackageManager.MATCH_DIRECT_BOOT_AWARE
                                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                        callingUid, user.getIdentifier());
                                callingUid,
                                user.getIdentifier());
                if (activityInfo == null) {
                if (activityInfo == null) {
                    return null;
                    if (Flags.archiving()) {
                        return getMatchingArchivedAppActivityInfo(component, user);
                    }
                    }
                if (component == null || component.getPackageName() == null) {
                    // should not happen
                    return null;
                    return null;
                }
                }
                final IncrementalStatesInfo incrementalStatesInfo =
                final IncrementalStatesInfo incrementalStatesInfo =
                        mPackageManagerInternal.getIncrementalStatesInfo(component.getPackageName(),
                        mPackageManagerInternal.getIncrementalStatesInfo(
                                callingUid, user.getIdentifier());
                                component.getPackageName(), callingUid, user.getIdentifier());
                if (incrementalStatesInfo == null) {
                if (incrementalStatesInfo == null) {
                    // package does not exist; should not happen
                    // package does not exist; should not happen
                    return null;
                    return null;
@@ -677,6 +715,26 @@ public class LauncherAppsService extends SystemService {
            }
            }
        }
        }


        private @Nullable LauncherActivityInfoInternal getMatchingArchivedAppActivityInfo(
                @NonNull ComponentName component, UserHandle user) {
            List<LauncherActivityInfoInternal> archivedActivities =
                    generateLauncherActivitiesForArchivedApp(component.getPackageName(), user);
            if (archivedActivities.isEmpty()) {
                return null;
            }
            for (int i = 0; i < archivedActivities.size(); i++) {
                if (archivedActivities.get(i).getComponentName().equals(component)) {
                    return archivedActivities.get(i);
                }
            }
            Slog.w(
                    TAG,
                    TextUtils.formatSimple(
                            "Expected archived app component name: %s" + " is not available!",
                            component));
            return null;
        }

        @Override
        @Override
        public ParceledListSlice getShortcutConfigActivities(
        public ParceledListSlice getShortcutConfigActivities(
                String callingPackage, String packageName, UserHandle user)
                String callingPackage, String packageName, UserHandle user)
@@ -700,6 +758,96 @@ public class LauncherAppsService extends SystemService {
            }
            }
        }
        }


        @NonNull
        private List<LauncherActivityInfoInternal> generateLauncherActivitiesForArchivedApp(
                @Nullable String packageName, UserHandle user) {
            List<ApplicationInfo> applicationInfoList =
                    (packageName == null)
                            ? getApplicationInfoListForAllArchivedApps(user)
                            : getApplicationInfoForArchivedApp(packageName, user);
            List<LauncherActivityInfoInternal> launcherActivityList = new ArrayList<>();
            for (int i = 0; i < applicationInfoList.size(); i++) {
                ApplicationInfo applicationInfo = applicationInfoList.get(i);
                PackageStateInternal packageState =
                        mPackageManagerInternal.getPackageStateInternal(
                                applicationInfo.packageName);
                if (packageState == null) {
                    continue;
                }
                ArchiveState archiveState =
                        packageState.getUserStateOrDefault(user.getIdentifier()).getArchiveState();
                if (archiveState == null) {
                    Slog.w(
                            TAG,
                            TextUtils.formatSimple(
                                    "Expected package: %s to be archived but missing ArchiveState"
                                            + " in PackageState.",
                                    applicationInfo.packageName));
                    continue;
                }
                List<ArchiveState.ArchiveActivityInfo> archiveActivityInfoList =
                        archiveState.getActivityInfos();
                for (int j = 0; j < archiveActivityInfoList.size(); j++) {
                    launcherActivityList.add(
                            constructLauncherActivityInfoForArchivedApp(
                                    user, applicationInfo, archiveActivityInfoList.get(j)));
                }
            }
            return launcherActivityList;
        }

        private static LauncherActivityInfoInternal constructLauncherActivityInfoForArchivedApp(
                UserHandle user,
                ApplicationInfo applicationInfo,
                ArchiveState.ArchiveActivityInfo archiveActivityInfo) {
            ActivityInfo activityInfo = new ActivityInfo();
            activityInfo.isArchived = applicationInfo.isArchived;
            activityInfo.applicationInfo = applicationInfo;
            activityInfo.packageName =
                    archiveActivityInfo.getOriginalComponentName().getPackageName();
            activityInfo.name = archiveActivityInfo.getOriginalComponentName().getClassName();
            activityInfo.nonLocalizedLabel = archiveActivityInfo.getTitle();

            return new LauncherActivityInfoInternal(
                    activityInfo,
                    new IncrementalStatesInfo(
                            false /* isLoading */, 1 /* progress */, 0 /* loadingCompletedTime */),
                    user);
        }

        @NonNull
        private List<ApplicationInfo> getApplicationInfoListForAllArchivedApps(UserHandle user) {
            final int callingUid = injectBinderCallingUid();
            List<ApplicationInfo> installedApplicationInfoList =
                    mPackageManagerInternal.getInstalledApplications(
                            PackageManager.MATCH_ARCHIVED_PACKAGES,
                            user.getIdentifier(),
                            callingUid);
            List<ApplicationInfo> archivedApplicationInfos = new ArrayList<>();
            for (int i = 0; i < installedApplicationInfoList.size(); i++) {
                ApplicationInfo installedApplicationInfo = installedApplicationInfoList.get(i);
                if (installedApplicationInfo != null && installedApplicationInfo.isArchived) {
                    archivedApplicationInfos.add(installedApplicationInfo);
                }
            }
            return archivedApplicationInfos;
        }

        @NonNull
        private List<ApplicationInfo> getApplicationInfoForArchivedApp(
                @NonNull String packageName, UserHandle user) {
            final int callingUid = injectBinderCallingUid();
            ApplicationInfo applicationInfo = mPackageManagerInternal.getApplicationInfo(
                    packageName,
                    PackageManager.MATCH_ARCHIVED_PACKAGES,
                    callingUid,
                    user.getIdentifier());
            if (applicationInfo == null || !applicationInfo.isArchived) {
                return Collections.EMPTY_LIST;
            }
            return List.of(applicationInfo);
        }

        private List<LauncherActivityInfoInternal> queryIntentLauncherActivities(
        private List<LauncherActivityInfoInternal> queryIntentLauncherActivities(
                Intent intent, int callingUid, UserHandle user) {
                Intent intent, int callingUid, UserHandle user) {
            final List<ResolveInfo> apps = mPackageManagerInternal.queryIntentActivities(intent,
            final List<ResolveInfo> apps = mPackageManagerInternal.queryIntentActivities(intent,