Revert "Enable multi user support for HC"

This reverts commit 911bbc6ebadcfc924bb5be8904ac20f8ec310cbb.

Reason for revert: b/267207147

Change-Id: I294f6befce87bc0fdca222b3968f0e13376e01cc
diff --git a/service/java/com/android/server/healthconnect/HealthConnectManagerService.java b/service/java/com/android/server/healthconnect/HealthConnectManagerService.java
index a494249..a514dba 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectManagerService.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectManagerService.java
@@ -20,11 +20,8 @@
 import static com.android.server.healthconnect.HealthConnectServiceImpl.DATA_RESTORE_WAITING_FOR_STAGING;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.content.Context;
 import android.healthconnect.HealthConnectManager;
-import android.os.UserHandle;
-import android.os.UserManager;
 import android.util.Slog;
 
 import com.android.server.SystemService;
@@ -36,10 +33,6 @@
 import com.android.server.healthconnect.permission.PackagePermissionChangesMonitor;
 import com.android.server.healthconnect.storage.AutoDeleteService;
 import com.android.server.healthconnect.storage.TransactionManager;
-import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.DeviceInfoHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.HealthDataCategoryPriorityHelper;
-import com.android.server.healthconnect.storage.datatypehelpers.PreferenceHelper;
 
 import java.util.Objects;
 
@@ -51,58 +44,41 @@
 public class HealthConnectManagerService extends SystemService {
     private static final String TAG = "HealthConnectManagerService";
     private final Context mContext;
-    private final PackagePermissionChangesMonitor mPackageMonitor;
-    private final HealthConnectServiceImpl mHealthConnectService;
+    private final HealthConnectPermissionHelper mPermissionHelper;
     private final TransactionManager mTransactionManager;
-    private final UserManager mUserManager;
-    private UserHandle mCurrentUser;
+    private final HealthPermissionIntentAppsTracker mPermissionIntentTracker;
+    private final PackagePermissionChangesMonitor mPackageMonitor;
+    private final FirstGrantTimeManager mFirstGrantTimeManager;
+    private final HealthConnectServiceImpl mHealthConnectService;
 
     public HealthConnectManagerService(Context context) {
         super(context);
-        HealthPermissionIntentAppsTracker permissionIntentTracker =
-                new HealthPermissionIntentAppsTracker(context);
-        FirstGrantTimeManager firstGrantTimeManager =
+        mPermissionIntentTracker = new HealthPermissionIntentAppsTracker(context);
+        mFirstGrantTimeManager =
                 new FirstGrantTimeManager(
-                        context, permissionIntentTracker, FirstGrantTimeDatastore.createInstance());
-        HealthConnectPermissionHelper permissionHelper =
+                        context,
+                        mPermissionIntentTracker,
+                        FirstGrantTimeDatastore.createInstance());
+        mPermissionHelper =
                 new HealthConnectPermissionHelper(
                         context,
                         context.getPackageManager(),
                         HealthConnectManager.getHealthPermissions(context),
-                        permissionIntentTracker,
-                        firstGrantTimeManager);
+                        mPermissionIntentTracker,
+                        mFirstGrantTimeManager);
         mPackageMonitor =
-                new PackagePermissionChangesMonitor(permissionIntentTracker, firstGrantTimeManager);
-        mCurrentUser = context.getUser();
+                new PackagePermissionChangesMonitor(
+                        mPermissionIntentTracker, mFirstGrantTimeManager);
+        mTransactionManager = TransactionManager.getInstance(getContext());
         mContext = context;
-        mUserManager = mContext.getSystemService(UserManager.class);
-        mTransactionManager =
-                TransactionManager.getInstance(
-                        new HealthConnectUserContext(mContext, mCurrentUser));
         mHealthConnectService =
                 new HealthConnectServiceImpl(
-                        mTransactionManager, permissionHelper, firstGrantTimeManager, mContext);
+                        mTransactionManager, mPermissionHelper, mFirstGrantTimeManager, mContext);
     }
 
     @Override
     public void onStart() {
         mPackageMonitor.registerBroadcastReceiver(mContext);
-        publishBinderService(Context.HEALTHCONNECT_SERVICE, mHealthConnectService);
-    }
-
-    @Override
-    public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) {
-        HealthConnectThreadScheduler.shutdownThreadPools();
-        AppInfoHelper.getInstance().clearCache();
-        DeviceInfoHelper.getInstance().clearCache();
-        HealthDataCategoryPriorityHelper.getInstance().clearCache();
-        PreferenceHelper.getInstance().clearCache();
-        mTransactionManager.onUserSwitching();
-    }
-
-    @Override
-    public void onUserUnlocking(@NonNull TargetUser user) {
-        Objects.requireNonNull(user);
 
         // TODO(b/264791313) Refactor restore related functionality into a separate class
         @HealthConnectServiceImpl.DataRestoreState
@@ -110,19 +86,16 @@
         if (currentDataRestoreState == DATA_RESTORE_STAGING_IN_PROGRESS) {
             mHealthConnectService.setDataRestoreState(DATA_RESTORE_WAITING_FOR_STAGING, 0, true);
         }
+        publishBinderService(Context.HEALTHCONNECT_SERVICE, mHealthConnectService);
+    }
 
-        if (user.getUserHandle().equals(mCurrentUser)) {
-            // The current setup in place is for {@code user} only, so just ignore this request
-            return;
-        }
-
-        mCurrentUser = user.getUserHandle();
-        mTransactionManager.onUserUnlocking(new HealthConnectUserContext(mContext, mCurrentUser));
-        HealthConnectThreadScheduler.resetThreadPools();
+    @Override
+    public void onUserUnlocking(@NonNull TargetUser user) {
+        Objects.requireNonNull(user);
         HealthConnectThreadScheduler.scheduleInternalTask(
                 () -> {
                     try {
-                        AutoDeleteService.schedule(mContext, mCurrentUser.getIdentifier());
+                        AutoDeleteService.schedule(mContext, user.getUserHandle().getIdentifier());
                     } catch (Exception e) {
                         Slog.e(TAG, "Auto delete schedule failed", e);
                     }
@@ -130,11 +103,6 @@
     }
 
     @Override
-    public boolean isUserSupported(@NonNull TargetUser user) {
-        return !mUserManager.isManagedProfile(user.getUserHandle().getIdentifier());
-    }
-
-    @Override
     public void onUserUnlocked(@NonNull TargetUser user) {
         // TODO(b/265119843) Run on a background thread and send broadcast
         // up to 10 times with a 60s delay
diff --git a/service/java/com/android/server/healthconnect/HealthConnectRoundRobinScheduler.java b/service/java/com/android/server/healthconnect/HealthConnectRoundRobinScheduler.java
index e08ddc0..c85640b 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectRoundRobinScheduler.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectRoundRobinScheduler.java
@@ -17,7 +17,6 @@
 package com.android.server.healthconnect;
 
 import android.annotation.NonNull;
-import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
 
@@ -32,40 +31,22 @@
  * @hide
  */
 public final class HealthConnectRoundRobinScheduler {
-    private static final String TAG = "HealthConnectScheduler";
     private final ConcurrentSkipListMap<Integer, Queue<Runnable>> mTasks =
             new ConcurrentSkipListMap<>();
     private final Object mLock = new Object();
 
     @GuardedBy("mLock")
-    private boolean mPauseScheduler;
-
-    @GuardedBy("mLock")
     private Integer mLastKeyUsed;
 
-    void resume() {
+    public void addTask(int uid, Runnable task) {
         synchronized (mLock) {
-            mPauseScheduler = false;
-        }
-    }
-
-    void addTask(int uid, Runnable task) {
-        synchronized (mLock) {
-            // If the scheduler is currently paused (this can happen if the platform is doing a user
-            // switch), ignore this request. This most likely means that we won't be able to deliver
-            // the result back anyway.
-            if (mPauseScheduler) {
-                Log.e(TAG, "Unable to schedule task for uid: " + uid);
-                return;
-            }
-
             mTasks.putIfAbsent(uid, new LinkedBlockingQueue<>());
             mTasks.get(uid).add(task);
         }
     }
 
     @NonNull
-    Runnable getNextTask() {
+    public Runnable getNextTask() {
         synchronized (mLock) {
             if (mLastKeyUsed == null) {
                 mLastKeyUsed = mTasks.firstKey();
@@ -94,11 +75,4 @@
             throw new InternalError("Task scheduled but none found");
         }
     }
-
-    void killTasksAndPauseScheduler() {
-        synchronized (mLock) {
-            mPauseScheduler = true;
-            mTasks.clear();
-        }
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java b/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java
index 3651124..0822140 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectServiceImpl.java
@@ -145,6 +145,29 @@
 final class HealthConnectServiceImpl extends IHealthConnectService.Stub {
     // Key for storing the current data download state
     @VisibleForTesting static final String DATA_DOWNLOAD_STATE_KEY = "DATA_DOWNLOAD_STATE_KEY";
+    private static final String TAG = "HealthConnectService";
+    // Permission for test api for deleting staged data
+    private static final String DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA_PERMISSION =
+            "android.permission.DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA";
+
+    // Key for storing the current data restore state on disk.
+    private static final String DATA_RESTORE_STATE_KEY = "DATA_RESTORE_STATE_KEY";
+    // Key for storing whether there was any error during the whole data "restore" phase.
+    // The "restore" phase includes downloading, staging, and merging.
+    private static final String WAS_DATA_RESTORE_ERROR_ENCOUNTERED =
+            "WAS_DATA_RESTORE_ERROR_ENCOUNTERED";
+
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({
+        DATA_RESTORE_STATE_UNKNOWN,
+        DATA_RESTORE_WAITING_FOR_STAGING,
+        DATA_RESTORE_STAGING_IN_PROGRESS,
+        DATA_RESTORE_STAGING_DONE,
+        DATA_RESTORE_MERGING_IN_PROGRESS,
+        DATA_RESTORE_MERGING_DONE
+    })
+    @interface DataRestoreState {}
+
     // The below values for the IntDef are defined in chronological order of the restore process.
     static final int DATA_RESTORE_STATE_UNKNOWN = 0;
     static final int DATA_RESTORE_WAITING_FOR_STAGING = 1;
@@ -152,16 +175,7 @@
     static final int DATA_RESTORE_STAGING_DONE = 3;
     static final int DATA_RESTORE_MERGING_IN_PROGRESS = 4;
     static final int DATA_RESTORE_MERGING_DONE = 5;
-    private static final String TAG = "HealthConnectService";
-    // Permission for test api for deleting staged data
-    private static final String DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA_PERMISSION =
-            "android.permission.DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA";
-    // Key for storing the current data restore state on disk.
-    private static final String DATA_RESTORE_STATE_KEY = "DATA_RESTORE_STATE_KEY";
-    // Key for storing whether there was any error during the whole data "restore" phase.
-    // The "restore" phase includes downloading, staging, and merging.
-    private static final String WAS_DATA_RESTORE_ERROR_ENCOUNTERED =
-            "WAS_DATA_RESTORE_ERROR_ENCOUNTERED";
+
     private final TransactionManager mTransactionManager;
     private final HealthConnectPermissionHelper mPermissionHelper;
     private final FirstGrantTimeManager mFirstGrantTimeManager;
@@ -662,7 +676,8 @@
         HealthConnectThreadScheduler.scheduleControllerTask(
                 () -> {
                     try {
-                        AutoDeleteService.setRecordRetentionPeriodInDays(days);
+                        AutoDeleteService.setRecordRetentionPeriodInDays(
+                                days, user.getIdentifier());
                         callback.onResult();
                     } catch (SQLiteException sqLiteException) {
                         Slog.e(TAG, "SQLiteException: ", sqLiteException);
@@ -680,7 +695,7 @@
     public int getRecordRetentionPeriodInDays(@NonNull UserHandle user) {
         try {
             mContext.enforceCallingPermission(MANAGE_HEALTH_DATA_PERMISSION, null);
-            return AutoDeleteService.getRecordRetentionPeriodInDays();
+            return AutoDeleteService.getRecordRetentionPeriodInDays(user.getIdentifier());
         } catch (Exception e) {
             if (e instanceof SecurityException) {
                 throw e;
@@ -1465,15 +1480,4 @@
             Log.e(TAG, "Unable to send result to the callback", e);
         }
     }
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({
-        DATA_RESTORE_STATE_UNKNOWN,
-        DATA_RESTORE_WAITING_FOR_STAGING,
-        DATA_RESTORE_STAGING_IN_PROGRESS,
-        DATA_RESTORE_STAGING_DONE,
-        DATA_RESTORE_MERGING_IN_PROGRESS,
-        DATA_RESTORE_MERGING_DONE
-    })
-    @interface DataRestoreState {}
 }
diff --git a/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java b/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java
index 7cbd7ab..718ffaf 100644
--- a/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java
+++ b/service/java/com/android/server/healthconnect/HealthConnectThreadScheduler.java
@@ -22,6 +22,7 @@
 
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -34,94 +35,51 @@
 public final class HealthConnectThreadScheduler {
     private static final int NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND = 1;
     private static final long KEEP_ALIVE_TIME_INTERNAL_BACKGROUND = 60L;
-    private static final int NUM_EXECUTOR_THREADS_BACKGROUND = 1;
-    private static final long KEEP_ALIVE_TIME_BACKGROUND = 60L;
-    private static final int NUM_EXECUTOR_THREADS_FOREGROUND = 1;
-    private static final long KEEP_ALIVE_TIME_SHARED = 60L;
-    private static final int NUM_EXECUTOR_THREADS_CONTROLLER = 1;
-    private static final long KEEP_ALIVE_TIME_CONTROLLER = 60L;
-
-    // Scheduler to run the tasks in a RR fashion based on client package names.
-    private static final HealthConnectRoundRobinScheduler
-            HEALTH_CONNECT_BACKGROUND_ROUND_ROBIN_SCHEDULER =
-                    new HealthConnectRoundRobinScheduler();
-
     // Executor to run HC background tasks
-    static ThreadPoolExecutor BACKGROUND_EXECUTOR =
-            new ThreadPoolExecutor(
-                    NUM_EXECUTOR_THREADS_BACKGROUND,
-                    NUM_EXECUTOR_THREADS_BACKGROUND,
-                    KEEP_ALIVE_TIME_BACKGROUND,
-                    TimeUnit.SECONDS,
-                    new LinkedBlockingQueue<>());
-    // Executor to run HC background tasks
-    private static ThreadPoolExecutor INTERNAL_BACKGROUND_EXECUTOR =
+    private static final Executor INTERNAL_BACKGROUND_EXECUTOR =
             new ThreadPoolExecutor(
                     NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
                     NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
                     KEEP_ALIVE_TIME_INTERNAL_BACKGROUND,
                     TimeUnit.SECONDS,
                     new LinkedBlockingQueue<>());
+
+    private static final int NUM_EXECUTOR_THREADS_BACKGROUND = 1;
+    private static final long KEEP_ALIVE_TIME_BACKGROUND = 60L;
+    // Executor to run HC background tasks
+    static final Executor BACKGROUND_EXECUTOR =
+            new ThreadPoolExecutor(
+                    NUM_EXECUTOR_THREADS_BACKGROUND,
+                    NUM_EXECUTOR_THREADS_BACKGROUND,
+                    KEEP_ALIVE_TIME_BACKGROUND,
+                    TimeUnit.SECONDS,
+                    new LinkedBlockingQueue<>());
+
+    private static final int NUM_EXECUTOR_THREADS_FOREGROUND = 1;
+    private static final long KEEP_ALIVE_TIME_SHARED = 60L;
     // Executor to run HC tasks for clients
-    private static ThreadPoolExecutor FOREGROUND_EXECUTOR =
+    private static final Executor FOREGROUND_EXECUTOR =
             new ThreadPoolExecutor(
                     NUM_EXECUTOR_THREADS_FOREGROUND,
                     NUM_EXECUTOR_THREADS_FOREGROUND,
                     KEEP_ALIVE_TIME_SHARED,
                     TimeUnit.SECONDS,
                     new LinkedBlockingQueue<>());
+
+    private static final int NUM_EXECUTOR_THREADS_CONTROLLER = 1;
+    private static final long KEEP_ALIVE_TIME_CONTROLLER = 60L;
     // Executor to run HC controller tasks
-    private static ThreadPoolExecutor CONTROLLER_EXECUTOR =
+    private static final Executor CONTROLLER_EXECUTOR =
             new ThreadPoolExecutor(
                     NUM_EXECUTOR_THREADS_CONTROLLER,
                     NUM_EXECUTOR_THREADS_CONTROLLER,
                     KEEP_ALIVE_TIME_CONTROLLER,
                     TimeUnit.SECONDS,
                     new LinkedBlockingQueue<>());
-
-    public static void resetThreadPools() {
-        INTERNAL_BACKGROUND_EXECUTOR =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
-                        NUM_EXECUTOR_THREADS_INTERNAL_BACKGROUND,
-                        KEEP_ALIVE_TIME_INTERNAL_BACKGROUND,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
-
-        BACKGROUND_EXECUTOR =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_BACKGROUND,
-                        NUM_EXECUTOR_THREADS_BACKGROUND,
-                        KEEP_ALIVE_TIME_BACKGROUND,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
-
-        FOREGROUND_EXECUTOR =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_FOREGROUND,
-                        NUM_EXECUTOR_THREADS_FOREGROUND,
-                        KEEP_ALIVE_TIME_SHARED,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
-
-        CONTROLLER_EXECUTOR =
-                new ThreadPoolExecutor(
-                        NUM_EXECUTOR_THREADS_CONTROLLER,
-                        NUM_EXECUTOR_THREADS_CONTROLLER,
-                        KEEP_ALIVE_TIME_CONTROLLER,
-                        TimeUnit.SECONDS,
-                        new LinkedBlockingQueue<>());
-        HEALTH_CONNECT_BACKGROUND_ROUND_ROBIN_SCHEDULER.resume();
-    }
-
-    static void shutdownThreadPools() {
-        HEALTH_CONNECT_BACKGROUND_ROUND_ROBIN_SCHEDULER.killTasksAndPauseScheduler();
-
-        INTERNAL_BACKGROUND_EXECUTOR.shutdownNow();
-        BACKGROUND_EXECUTOR.shutdownNow();
-        FOREGROUND_EXECUTOR.shutdownNow();
-        CONTROLLER_EXECUTOR.shutdownNow();
-    }
+    // Scheduler to run the tasks in a RR fashion based on client package names.
+    private static final HealthConnectRoundRobinScheduler
+            HEALTH_CONNECT_BACKGROUND_ROUND_ROBIN_SCHEDULER =
+                    new HealthConnectRoundRobinScheduler();
 
     /** Schedules the task on the executor dedicated for performing internal tasks */
     static void scheduleInternalTask(Runnable task) {
diff --git a/service/java/com/android/server/healthconnect/HealthConnectUserContext.java b/service/java/com/android/server/healthconnect/HealthConnectUserContext.java
deleted file mode 100644
index e22acb3..0000000
--- a/service/java/com/android/server/healthconnect/HealthConnectUserContext.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.healthconnect;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.os.Environment;
-import android.os.UserHandle;
-
-import java.io.File;
-import java.util.Objects;
-
-/** @hide */
-public class HealthConnectUserContext extends ContextWrapper {
-    public static final String HEALTH_CONNECT_FOLDER_NAME = "healthconnect";
-    private final UserHandle mUserHandle;
-
-    public HealthConnectUserContext(@NonNull Context context, @NonNull UserHandle userHandle) {
-        super(context);
-        Objects.requireNonNull(context);
-        Objects.requireNonNull(userHandle);
-
-        mUserHandle = userHandle;
-    }
-
-    @NonNull
-    public UserHandle getCurrentUserHandle() {
-        return mUserHandle;
-    }
-
-    @Override
-    public File getDatabasePath(String name) {
-        File systemCeDir = new File(Environment.getDataDirectory(), "system_ce");
-        File systemCeUserDir = new File(systemCeDir, String.valueOf(mUserHandle.getIdentifier()));
-        File systemCeUserHcDir = new File(systemCeUserDir, HEALTH_CONNECT_FOLDER_NAME);
-        if (!systemCeUserHcDir.exists()) {
-            systemCeUserHcDir.mkdir();
-        }
-
-        return new File(systemCeUserHcDir, name);
-    }
-}
diff --git a/service/java/com/android/server/healthconnect/storage/AutoDeleteService.java b/service/java/com/android/server/healthconnect/storage/AutoDeleteService.java
index 719210e..d2508ec 100644
--- a/service/java/com/android/server/healthconnect/storage/AutoDeleteService.java
+++ b/service/java/com/android/server/healthconnect/storage/AutoDeleteService.java
@@ -45,7 +45,6 @@
     private static final long JOB_RUN_INTERVAL = TimeUnit.DAYS.toMillis(1);
     private static final String TAG = "HealthConnectAutoDelete";
     private static final String EXTRA_USER_ID = "user_id";
-    @UserIdInt private static int mCurrentUserId;
 
     /** Start periodically scheduling this service for this {@code userId} */
     public static void schedule(Context context, @UserIdInt int userId) {
@@ -53,10 +52,9 @@
         Objects.requireNonNull(jobScheduler);
         ComponentName componentName = new ComponentName(context, AutoDeleteService.class);
         final PersistableBundle extras = new PersistableBundle();
-        mCurrentUserId = userId;
-        extras.putInt(EXTRA_USER_ID, mCurrentUserId);
+        extras.putInt(EXTRA_USER_ID, userId);
         JobInfo.Builder builder =
-                new JobInfo.Builder(MIN_JOB_ID + mCurrentUserId, componentName)
+                new JobInfo.Builder(MIN_JOB_ID + userId, componentName)
                         .setExtras(extras)
                         .setRequiresDeviceIdle(true)
                         .setRequiresCharging(true)
@@ -74,36 +72,36 @@
         Objects.requireNonNull(jobScheduler).cancel(MIN_JOB_ID + userId);
     }
 
+    /** Sets auto delete period for automatically deleting record entries */
+    public static void setRecordRetentionPeriodInDays(int days, @UserIdInt int userId) {
+        PreferenceHelper.getInstance()
+                .insertPreference(AUTO_DELETE_DURATION_RECORDS_KEY + userId, String.valueOf(days));
+    }
+
     /** Gets auto delete period for automatically deleting record entries */
-    public static int getRecordRetentionPeriodInDays() {
+    public static int getRecordRetentionPeriodInDays(@UserIdInt int userId) {
         String result =
-                PreferenceHelper.getInstance().getPreference(AUTO_DELETE_DURATION_RECORDS_KEY);
+                PreferenceHelper.getInstance()
+                        .getPreference(AUTO_DELETE_DURATION_RECORDS_KEY + userId);
 
         if (result == null) return 0;
         return Integer.parseInt(result);
     }
 
-    /** Sets auto delete period for automatically deleting record entries */
-    public static void setRecordRetentionPeriodInDays(int days) {
-        PreferenceHelper.getInstance()
-                .insertPreference(AUTO_DELETE_DURATION_RECORDS_KEY, String.valueOf(days));
-    }
-
     /** Called everytime when the operation corresponding to this service is to be performed */
     @Override
     public boolean onStartJob(JobParameters params) {
         try {
             int userId = params.getExtras().getInt(EXTRA_USER_ID, /*defaultValue=*/ DEFAULT_INT);
-            if (userId == DEFAULT_INT || userId != mCurrentUserId) {
-                // This job is no longer valid, the service should have been stopped. Just ignore
-                // this request in case we still got the request.
+            if (userId == DEFAULT_INT) {
                 return false;
             }
 
             // Only do transactional operations here - as this job might get cancelled for
             // several reasons, such as: User switch, low battery etc.
             String recordAutoDeletePeriodString =
-                    PreferenceHelper.getInstance().getPreference(AUTO_DELETE_DURATION_RECORDS_KEY);
+                    PreferenceHelper.getInstance()
+                            .getPreference(AUTO_DELETE_DURATION_RECORDS_KEY + userId);
             int recordAutoDeletePeriod =
                     recordAutoDeletePeriodString == null
                             ? 0
diff --git a/service/java/com/android/server/healthconnect/storage/TransactionManager.java b/service/java/com/android/server/healthconnect/storage/TransactionManager.java
index e582135..c70df67 100644
--- a/service/java/com/android/server/healthconnect/storage/TransactionManager.java
+++ b/service/java/com/android/server/healthconnect/storage/TransactionManager.java
@@ -24,17 +24,16 @@
 import static com.android.server.healthconnect.storage.utils.StorageUtils.getCursorLong;
 
 import android.annotation.NonNull;
+import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteException;
 import android.healthconnect.Constants;
 import android.healthconnect.datatypes.DataOrigin;
 import android.healthconnect.internal.datatypes.RecordInternal;
-import android.os.UserHandle;
 import android.util.Pair;
 import android.util.Slog;
 
-import com.android.server.healthconnect.HealthConnectUserContext;
 import com.android.server.healthconnect.storage.datatypehelpers.AppInfoHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsHelper;
 import com.android.server.healthconnect.storage.datatypehelpers.ChangeLogsRequestHelper;
@@ -50,7 +49,6 @@
 import com.android.server.healthconnect.storage.utils.StorageUtils;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
 import java.util.function.BiConsumer;
@@ -62,20 +60,17 @@
  *
  * @hide
  */
-public final class TransactionManager {
+public class TransactionManager {
     private static final String TAG = "HealthConnectTransactionMan";
-    private static final HashMap<UserHandle, HealthConnectDatabase> mUserHandleToDatabaseMap =
-            new HashMap<>();
     private static TransactionManager sTransactionManager;
-    private HealthConnectDatabase mHealthConnectDatabase;
+    private final HealthConnectDatabase mHealthConnectDatabase;
 
-    private TransactionManager(@NonNull HealthConnectUserContext context) {
+    private TransactionManager(@NonNull Context context) {
         mHealthConnectDatabase = new HealthConnectDatabase(context);
-        mUserHandleToDatabaseMap.put(context.getCurrentUserHandle(), mHealthConnectDatabase);
     }
 
     @NonNull
-    public static TransactionManager getInstance(@NonNull HealthConnectUserContext context) {
+    public static TransactionManager getInstance(@NonNull Context context) {
         if (sTransactionManager == null) {
             sTransactionManager = new TransactionManager(context);
         }
@@ -90,18 +85,6 @@
         return sTransactionManager;
     }
 
-    public void onUserUnlocking(@NonNull HealthConnectUserContext healthConnectUserContext) {
-        if (!mUserHandleToDatabaseMap.containsKey(
-                healthConnectUserContext.getCurrentUserHandle())) {
-            mUserHandleToDatabaseMap.put(
-                    healthConnectUserContext.getCurrentUserHandle(),
-                    new HealthConnectDatabase(healthConnectUserContext));
-        }
-
-        mHealthConnectDatabase =
-                mUserHandleToDatabaseMap.get(healthConnectUserContext.getCurrentUserHandle());
-    }
-
     /**
      * Inserts all the {@link RecordInternal} in {@code request} into the HealthConnect database.
      *
@@ -240,11 +223,11 @@
         if (request.getReadRequests().size() != 1) {
             throw new IllegalArgumentException("Read requested is not for a single record type");
         }
-        List<RecordInternal<?>> recordInternalList;
+        List<RecordInternal<?>> recordInternalList = new ArrayList<>();
         long token = DEFAULT_LONG;
         ReadTableRequest readTableRequest = request.getReadRequests().get(0);
-        final SQLiteDatabase db = mHealthConnectDatabase.getReadableDatabase();
-        try (Cursor cursor = read(db, readTableRequest)) {
+        try (SQLiteDatabase db = mHealthConnectDatabase.getReadableDatabase();
+                Cursor cursor = read(db, readTableRequest)) {
             recordInternalList =
                     readTableRequest
                             .getRecordHelper()
@@ -429,10 +412,6 @@
         }
     }
 
-    public void onUserSwitching() {
-        mHealthConnectDatabase.close();
-    }
-
     private void insertAll(
             @NonNull List<UpsertTableRequest> upsertTableRequests,
             @NonNull BiConsumer<SQLiteDatabase, UpsertTableRequest> insert) {
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java
index 9fd4767..528b601 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/AppInfoHelper.java
@@ -99,9 +99,17 @@
         return sAppInfoHelper;
     }
 
-    public synchronized void clearCache() {
-        mAppInfoMap = null;
-        mIdPackageNameMap = null;
+    @NonNull
+    private static Bitmap getBitmapFromDrawable(@NonNull Drawable drawable) {
+        final Bitmap bmp =
+                Bitmap.createBitmap(
+                        drawable.getIntrinsicWidth(),
+                        drawable.getIntrinsicHeight(),
+                        Bitmap.Config.ARGB_8888);
+        final Canvas canvas = new Canvas(bmp);
+        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+        drawable.draw(canvas);
+        return bmp;
     }
 
     /**
@@ -109,7 +117,7 @@
      * helper
      */
     @NonNull
-    public CreateTableRequest getCreateTableRequest() {
+    public final CreateTableRequest getCreateTableRequest() {
         return new CreateTableRequest(TABLE_NAME, getColumnInfo());
     }
 
@@ -339,17 +347,4 @@
 
         return columnInfo;
     }
-
-    @NonNull
-    private static Bitmap getBitmapFromDrawable(@NonNull Drawable drawable) {
-        final Bitmap bmp =
-                Bitmap.createBitmap(
-                        drawable.getIntrinsicWidth(),
-                        drawable.getIntrinsicHeight(),
-                        Bitmap.Config.ARGB_8888);
-        final Canvas canvas = new Canvas(bmp);
-        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
-        drawable.draw(canvas);
-        return bmp;
-    }
 }
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java
index e0bdde8..b12f326 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/DeviceInfoHelper.java
@@ -115,11 +115,6 @@
         // empty by default
     }
 
-    public synchronized void clearCache() {
-        mDeviceInfoMap = null;
-        mIdDeviceInfoMap = null;
-    }
-
     private synchronized void populateDeviceInfoMap() {
         if (mDeviceInfoMap != null) {
             return;
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java
index 29dc05c..6a85b8a 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/HealthDataCategoryPriorityHelper.java
@@ -195,10 +195,6 @@
                 newPriorityOrder);
     }
 
-    public synchronized void clearCache() {
-        mHealthDataCategoryToAppIdPriorityMap = null;
-    }
-
     private Map<Integer, List<Long>> getHealthDataCategoryToAppIdPriorityMap() {
         if (mHealthDataCategoryToAppIdPriorityMap == null) {
             populateDataCategoryToAppIdPriorityMap();
diff --git a/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java b/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java
index 5aefd63..b14e68d 100644
--- a/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java
+++ b/service/java/com/android/server/healthconnect/storage/datatypehelpers/PreferenceHelper.java
@@ -75,10 +75,6 @@
         return getPreferences().get(key);
     }
 
-    public synchronized void clearCache() {
-        mPreferences = null;
-    }
-
     private Map<String, String> getPreferences() {
         if (mPreferences == null) {
             populatePreferences();
@@ -94,15 +90,11 @@
         return contentValues;
     }
 
-    private synchronized void populatePreferences() {
-        if (mPreferences != null) {
-            return;
-        }
-
+    private void populatePreferences() {
         mPreferences = new ConcurrentHashMap<>();
         final TransactionManager transactionManager = TransactionManager.getInitialisedInstance();
-        final SQLiteDatabase db = transactionManager.getReadableDb();
-        try (Cursor cursor = transactionManager.read(db, new ReadTableRequest(TABLE_NAME))) {
+        try (SQLiteDatabase db = transactionManager.getReadableDb();
+                Cursor cursor = transactionManager.read(db, new ReadTableRequest(TABLE_NAME))) {
             while (cursor.moveToNext()) {
                 String key = StorageUtils.getCursorString(cursor, KEY_COLUMN_NAME);
                 String value = StorageUtils.getCursorString(cursor, VALUE_COLUMN_NAME);