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

Commit 8f749a77 authored by Anna Bauza's avatar Anna Bauza
Browse files

Fix wrong userId being reported to CUJ metrics

CUJ does not need to know user id before it is created as long as begin and end session is the same.
User Journey Create User Begin will report user id -1 as it was not yet created.
On finish it will semd corrent user id or -1 if user creation faild.

Bug: 251357485
Bug: 251357372

Test: atest CtsStatsdAtomHostTestCases:android.cts.statsdatom.users.UserLifecycleEventStatsTests#testCreateFullUser
Test: atest CtsStatsdAtomHostTestCases:android.cts.statsdatom.users.UserLifecycleEventStatsTests#testCreateGuestUser
Change-Id: I4a81ba5c1a78a9123fb19697b03e6b8cb8530068
parent 3fd1e0d7
Loading
Loading
Loading
Loading
+47 −26
Original line number Diff line number Diff line
@@ -4466,17 +4466,19 @@ public class UserManagerService extends IUserManager.Stub {
            boolean preCreate, @Nullable String[] disallowedPackages,
            @Nullable Object token)
            throws UserManager.CheckedUserOperationException {
        final int nextProbableUserId = getNextAvailableId();
        final int noneUserId = -1;
        final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
        t.traceBegin("createUser-" + flags);
        final long sessionId = logUserCreateJourneyBegin(nextProbableUserId, userType, flags);
        final long sessionId = logUserCreateJourneyBegin(noneUserId);
        UserInfo newUser = null;
        try {
            newUser = createUserInternalUncheckedNoTracing(name, userType, flags, parentId,
                        preCreate, disallowedPackages, t, token);
            return newUser;
        } finally {
            logUserCreateJourneyFinish(sessionId, nextProbableUserId, newUser != null);
            logUserCreateJourneyFinish(sessionId,
                    newUser != null ? newUser.id : noneUserId, userType, flags,
                    newUser != null);
            t.traceEnd();
        }
    }
@@ -4969,42 +4971,60 @@ public class UserManagerService extends IUserManager.Stub {
                && !userTypeDetails.getName().equals(UserManager.USER_TYPE_FULL_RESTRICTED);
    }

    private long logUserCreateJourneyBegin(@UserIdInt int userId, String userType,
            @UserInfoFlag int flags) {
    private long logUserCreateJourneyBegin(@UserIdInt int userId) {
        return logUserJourneyBegin(
                FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_CREATE,
                userId, userType, flags);
                userId);
    }

    private void logUserCreateJourneyFinish(long sessionId, @UserIdInt int userId, boolean finish) {
        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId,
                FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__CREATE_USER,
                finish ? FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__FINISH
                        : FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__NONE);
    private void logUserCreateJourneyFinish(long sessionId, @UserIdInt int userId, String userType,
            @UserInfoFlag int flags, boolean finish) {
        logUserJourneyFinish(sessionId,
                FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_CREATE,
                userId, userType, flags, finish);
    }

    private long logUserRemoveJourneyBegin(@UserIdInt int userId, String userType,
            @UserInfoFlag int flags) {
    private long logUserRemoveJourneyBegin(@UserIdInt int userId) {
        return logUserJourneyBegin(
                FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_REMOVE,
                userId, userType, flags);
                userId);
    }

    private void logUserRemoveJourneyFinish(long sessionId, @UserIdInt int userId, boolean finish) {
        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId,
                FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REMOVE_USER,
                finish ? FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__FINISH
                        : FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__NONE);
    private void logUserRemoveJourneyFinish(long sessionId, @UserIdInt int userId, String userType,
            @UserInfoFlag int flags, boolean finish) {
        logUserJourneyFinish(sessionId,
                FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_REMOVE,
                userId, userType, flags, finish);
    }

    private long logUserJourneyBegin(int journey, @UserIdInt int userId, String userType,
            @UserInfoFlag int flags) {
        final long sessionId = ThreadLocalRandom.current().nextLong(1, Long.MAX_VALUE);
    private void logUserJourneyFinish(long sessionId, int journey, @UserIdInt int userId,
            String userType, @UserInfoFlag int flags, boolean finish) {

        // log the journey atom with the user metadata
        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED, sessionId,
                journey, /* origin_user= */ -1, userId,
                UserManager.getUserTypeForStatsd(userType), flags);

        int event;
        switch (journey) {
            case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_CREATE:
                event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__CREATE_USER;
                break;
            case FrameworkStatsLog.USER_LIFECYCLE_JOURNEY_REPORTED__JOURNEY__USER_REMOVE:
                event = FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__EVENT__REMOVE_USER;
                break;
            default:
                throw new IllegalArgumentException("Journey " + journey + " not expected.");
        }
        FrameworkStatsLog.write(FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED, sessionId, userId,
                event,
                finish ? FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__FINISH
                        : FrameworkStatsLog.USER_LIFECYCLE_EVENT_OCCURRED__STATE__NONE);
    }

    private long logUserJourneyBegin(int journey, @UserIdInt int userId) {
        final long sessionId = ThreadLocalRandom.current().nextLong(1, Long.MAX_VALUE);

        // log the event atom to indicate the event start
        int event;
        switch (journey) {
@@ -5322,8 +5342,7 @@ public class UserManagerService extends IUserManager.Stub {
                writeUserLP(userData);
            }

            final long sessionId = logUserRemoveJourneyBegin(
                    userId, userData.info.userType, userData.info.flags);
            final long sessionId = logUserRemoveJourneyBegin(userId);

            try {
                mAppOpsService.removeUser(userId);
@@ -5344,11 +5363,13 @@ public class UserManagerService extends IUserManager.Stub {
                            @Override
                            public void userStopped(int userIdParam) {
                                finishRemoveUser(userIdParam);
                                logUserRemoveJourneyFinish(sessionId, userIdParam, true);
                                logUserRemoveJourneyFinish(sessionId, userIdParam,
                                        userData.info.userType, userData.info.flags, true);
                            }
                            @Override
                            public void userStopAborted(int userIdParam) {
                                logUserRemoveJourneyFinish(sessionId, userIdParam, false);
                                logUserRemoveJourneyFinish(sessionId, userIdParam,
                                        userData.info.userType, userData.info.flags, false);
                            }
                        });
            } catch (RemoteException e) {