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);