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

Commit 4d969427 authored by Kevin Lim's avatar Kevin Lim
Browse files

Fix app SearchTarget id generation to consider UserHandle.

Previously, `SearchTargetEventHelper#generateAppTargetIdForLogging` was
assuming Process.myUserHandle() was the UserHandle to use, instead of
the ItemInfo.users. In the case of work profile, this would generate the
incorrect id, and even worse create a name collision.

Bug: 277363943
Flag: Production bug fix. Flag not needed.
Test: Before: http://recall/clips/08f8a142-ceeb-475e-8c4c-99b78240c592
Test: After: http://recall/clips/af50580e-74d5-46d8-97d6-60147a778a59
Change-Id: Ie075467555a61b6edd3cc9453c5108815351c54a
parent d73328b0
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.app.search.SearchTargetExtras.isRichAnswer;
import android.app.search.SearchTarget;
import android.content.ComponentName;
import android.os.Process;
import android.os.UserHandle;

import androidx.annotation.Nullable;

@@ -72,21 +73,24 @@ public class SearchTargetEventHelper {
    }

    /**
     * Generate application target id similar to AiAi targetId for logging only 0-state.
     * For n-state, AiAi already populates the target id in right format.
     * AiAi target id is of format "resultType:userId:packageName:extraInfo"
     * Generate application target id that matches the AiAi targetId for only 0-state.
     * For n-state, AiAi already populates the target id in right format and it's unnecessary for
     * Launcher to generate it itself.
     * AiAi target id is of format "resultType:userHandle.Id:packageName:extraInfo"
     *
     * When the apps from AiAi's AppPredictionService are converted to {@link SearchTarget}, we need
     * to construct the targetId using componentName.
     * When the apps from AiAi's AppPredictionService are converted to {@link SearchTarget},
     * we need to construct the targetId using {@link ComponentName} and {@link UserHandle}.
     * Both are required to create a unique id for the SearchTarget.
     *
     * @return string appTargetId
     * Example appTargetId for
     * maps - APPLICATION:0:com.google.android.apps.maps:com.google.android.maps.MapsActivity
     * clock - APPLICATION:0:com.google.android.deskclock:com.android.deskclock.DeskClock
     */
    public static String generateAppTargetIdForLogging(@Nullable ComponentName appComponentName) {
    public static String generateAppTargetId(@Nullable ComponentName appComponentName,
            UserHandle userHandle) {
        StringBuilder appTargetId = new StringBuilder(
                "APPLICATION" + ":" + Process.myUserHandle().getIdentifier() + ":");
                "APPLICATION" + ":" + userHandle.getIdentifier() + ":");
        if (appComponentName == null) return appTargetId.append(" : ").toString();
        return appTargetId + appComponentName.getPackageName() + ":"
                + appComponentName.getClassName();