/* * 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 android.health.connect; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Represents the state of HealthConnect data as it goes through one of the following operations: *
  • Data Restore: fetching and restoring the data either from the cloud or from another device. *
  • Data Migration: migrating the data from the app using the data-migration APIs: {@link * HealthConnectManager#startMigration}, {@link HealthConnectManager#writeMigrationData}, and * {@link HealthConnectManager#finishMigration} * * @hide */ @SystemApi public final class HealthConnectDataState implements Parcelable { /** * The default idle state of HealthConnect data restore process. This states means that nothing * related to the data restore process is undergoing. {@link #getDataRestoreError()} could * return an error for previous restoration attempt. * *

    See also {@link DataRestoreState} * * @hide */ @SystemApi public static final int RESTORE_STATE_IDLE = 0; /** * The HealthConnect data is pending restoration. The system is in the process of fetching / * staging the remote data on this device. Once the data has been fetched and staged for * restoration an attempt will be made to restore the data. So, this will follow with {@link * #RESTORE_STATE_IN_PROGRESS} state. * *

    See also {@link DataRestoreState} * * @hide */ @SystemApi public static final int RESTORE_STATE_PENDING = 1; /** * The HealthConnect staged data is being restored. On a successful restore the data will be * available for use on this device. * *

    After the restore process is finished, we'll come back to the {@link #RESTORE_STATE_IDLE}. * *

    See also {@link DataRestoreState} * * @hide */ @SystemApi public static final int RESTORE_STATE_IN_PROGRESS = 2; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef({RESTORE_STATE_IDLE, RESTORE_STATE_PENDING, RESTORE_STATE_IN_PROGRESS}) public @interface DataRestoreState {} /** * No error. * * @hide */ @SystemApi public static final int RESTORE_ERROR_NONE = 0; /** * An unknown error caused a failure in restoring the data. * *

    This is a non-recoverable error. * * @hide */ @SystemApi public static final int RESTORE_ERROR_UNKNOWN = 1; /** * An error was encountered fetching the remote HealthConnect data. * *

    This is a non-recoverable error. * *

    For instance, this could have been caused by a network issue leading to download failure. * In such a case a retry would've been attempted, but eventually that failed as well. * * @hide */ @SystemApi public static final int RESTORE_ERROR_FETCHING_DATA = 2; /** * The fetched remote data could not be restored because the current HealthConnect version on * the device is behind the staged data version. * *

    This is a recoverable error. * *

    Until the module has been updated we'll be waiting in the {@link #RESTORE_STATE_PENDING} * state. Once the HealthConnect version on the device is updated and rebooted then the restore * will be attempted on the same device reboot. * * @hide */ @SystemApi public static final int RESTORE_ERROR_VERSION_DIFF = 3; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef({ RESTORE_ERROR_NONE, RESTORE_ERROR_UNKNOWN, RESTORE_ERROR_FETCHING_DATA, RESTORE_ERROR_VERSION_DIFF }) public @interface DataRestoreError {} /** * The starting default state for the Migration process. * *

    We'll begin in this state irrespective of whether there's an app installed that can * perform Migration. If there's no such app installed then we stay in this state. However, if * an installed app can be upgraded to become Migration-aware, then we'll move to the {@link * #MIGRATION_STATE_APP_UPGRADE_REQUIRED} state. Please see {@link * #MIGRATION_STATE_APP_UPGRADE_REQUIRED} for more info. * *

    See also {@link DataMigrationState} * * @hide */ @SystemApi public static final int MIGRATION_STATE_IDLE = 0; /** * This reflects that the app needs an upgrade before it can start the Migration process. * *

    This happens when the module finds out that there's an installed app that can perform the * Migration process once it has been upgraded to the correct version. Once such an app is * available then we'll move back to the {@link #MIGRATION_STATE_IDLE} state. * *

    We can come here only from the {@link #MIGRATION_STATE_IDLE} state. * *

    See also {@link DataMigrationState} * * @hide */ @SystemApi public static final int MIGRATION_STATE_APP_UPGRADE_REQUIRED = 1; /** * This reflects that the module needs an upgrade to handle the Migration process. * *

    This happens when the version set by the caller is ahead of the HealthConnect module. Once * the module has updated to a version greater or equal to the said set version, then we'll move * to the {@link #MIGRATION_STATE_ALLOWED} state from where the Migration process can start. * *

    We can come here only from the {@link #MIGRATION_STATE_IDLE} state. * *

    See also {@link DataMigrationState} * * @hide */ @SystemApi public static final int MIGRATION_STATE_MODULE_UPGRADE_REQUIRED = 2; /** * We are in the process of integrating the data shared by the app using the {@link * HealthConnectManager#writeMigrationData} API. * *

    We get into this state when the app makes the {@link HealthConnectManager#startMigration} * call. * *

    We can come here from either {@link #MIGRATION_STATE_ALLOWED} or {@link * #MIGRATION_STATE_IDLE} states when {@link HealthConnectManager#startMigration} is called. * *

    From here we can go to either {@link #MIGRATION_STATE_ALLOWED} OR {@link * #MIGRATION_STATE_COMPLETE} state. * *

    All other HealthConnect APIs unrelated to Migration are blocked while we are in this * state. For more info on this please see * *

    See also {@link DataMigrationState} * * @hide */ @SystemApi public static final int MIGRATION_STATE_IN_PROGRESS = 3; /** * The Migration is now allowed and is waiting to start or resume. * *

    We can come to this state from any of the following states: * *

    * *

    From this state we can go to either {@link #MIGRATION_STATE_IN_PROGRESS} or {@link * #MIGRATION_STATE_COMPLETE} (in case of timeout of 15 days). * *

    See also {@link DataMigrationState} * * @hide */ @SystemApi public static final int MIGRATION_STATE_ALLOWED = 4; /** * This is the final state for the Migration process. We can come here from any other state: * *

    * *

    See also {@link DataMigrationState} * * @hide */ @SystemApi public static final int MIGRATION_STATE_COMPLETE = 5; /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef({ MIGRATION_STATE_IDLE, MIGRATION_STATE_APP_UPGRADE_REQUIRED, MIGRATION_STATE_MODULE_UPGRADE_REQUIRED, MIGRATION_STATE_IN_PROGRESS, MIGRATION_STATE_ALLOWED, MIGRATION_STATE_COMPLETE }) public @interface DataMigrationState {} private final @DataRestoreState int mDataRestoreState; private final @DataRestoreError int mDataRestoreError; private final @DataMigrationState int mDataMigrationState; /** * The state of the HealthConnect data as it goes through the Data Restore process. * *

    See also {@link DataRestoreState} */ public @DataRestoreState int getDataRestoreState() { return mDataRestoreState; } /** * Get error encountered at the time of calling this API as we try to fetch and restore the * remote HealthConnect data. * *

    Since we stop at the first encounter of an error there can be only one error at any time. * *

    Some of the errors are recoverable while others are non-recoverable. Please see {@link * DataRestoreError} for more details on which errors are recoverable and how to recover from * them. */ public @DataRestoreError int getDataRestoreError() { return mDataRestoreError; } /** * The state of the HealthConnect data as it goes through the Data Migration process. * *

    See also {@link DataMigrationState} */ public @DataMigrationState int getDataMigrationState() { return mDataMigrationState; } /** @hide */ public HealthConnectDataState( @DataRestoreState int dataRestoreState, @DataRestoreError int dataRestoreError, @DataMigrationState int dataMigrationState) { this.mDataRestoreState = dataRestoreState; this.mDataRestoreError = dataRestoreError; this.mDataMigrationState = dataMigrationState; } @NonNull public static final Creator CREATOR = new Creator<>() { @Override public HealthConnectDataState createFromParcel(Parcel in) { return new HealthConnectDataState(in); } @Override public HealthConnectDataState[] newArray(int size) { return new HealthConnectDataState[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mDataRestoreState); dest.writeInt(mDataRestoreError); dest.writeInt(mDataMigrationState); } private HealthConnectDataState(Parcel in) { mDataRestoreState = in.readInt(); mDataRestoreError = in.readInt(); mDataMigrationState = in.readInt(); } }