ExerciseState.kt

/*
 * Copyright (C) 2021 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 androidx.health.services.client.data

/** Enumerates the state of an exercise. */
public enum class ExerciseState(public val id: Int) {
    /**
     * The exercise is actively being started, but we don't yet have sensor stability or GPS fix.
     *
     * Used only in the manually started exercise.
     */
    USER_STARTING(1),

    /**
     * The exercise is actively in-progress.
     *
     * Used in both of the manually started exercise and the automatic exercise detection. It's also
     * the state when the automatic exercise detection has detected an exercise and the exercise is
     * actively in-progress.
     */
    ACTIVE(2),

    /**
     * The session is being paused by the user. Sensors are actively being flushed.
     *
     * Used only in the manually started exercise.
     */
    USER_PAUSING(3),

    /**
     * The session has been paused by the user. Sensors have completed flushing.
     *
     * Used only in the manually started exercise.
     */
    USER_PAUSED(4),

    /**
     * The session is being paused by auto-pause. Sensors are actively being flushed.
     *
     * Used only in the manually started exercise.
     */
    AUTO_PAUSING(5),

    /**
     * The session has been automatically paused. Sensors have completed flushing.
     *
     * Used only in the manually started exercise.
     */
    AUTO_PAUSED(6),

    /**
     * The session is being resumed by the user.
     *
     * Used only in the manually started exercise.
     */
    USER_RESUMING(7),

    /**
     * The session is being automatically resumed.
     *
     * Used only in the manually started exercise.
     */
    AUTO_RESUMING(8),

    /**
     * The exercise is being ended by the user. Sensors are actively being flushed.
     *
     * Used only in the manually started exercise.
     */
    USER_ENDING(9),

    /**
     * The exercise has been ended by the user. No new metrics will be exported and a final summary
     * should be provided to the client.
     *
     * Used only in the manually started exercise.
     */
    USER_ENDED(10),

    /**
     * The exercise is being automatically ended due to a lack of exercise updates being received by
     * the user. Sensors are actively being flushed.
     *
     * Used only in the manually started exercise.
     */
    AUTO_ENDING(11),

    /**
     * The exercise has been automatically ended due to a lack of exercise updates being received by
     * the user. No new metrics will be exported and a final summary should be provided to the
     * client.
     *
     * Used only in the manually started exercise.
     */
    AUTO_ENDED(12),

    /**
     * The exercise is being ended because it has been superseded by a new exercise being started by
     * another client. Sensors are actively being flushed.
     *
     * Used in both of the manually started exercise and the automatic exercise detection.
     */
    TERMINATING(13),

    /**
     * The exercise has been ended because it was superseded by a new exercise being started by
     * another client. No new metrics will be exported and a final summary should be provided to the
     * client.
     *
     * Used in both of the manually started exercise and the automatic exercise detection.
     */
    TERMINATED(14);

    /**
     * Returns true if this [ExerciseState] corresponds to one of the paused states and false
     * otherwise. This method returns false if the exercise has ended, to check whether it has ended
     * call [isEnded].
     */
    public val isPaused: Boolean
        get() = PAUSED_STATES.contains(this)

    /**
     * Returns true if this [ExerciseState] corresponds to one of the resuming states and false
     * otherwise. This method returns false if the exercise has ended, to check whether it has ended
     * call [isEnded].
     */
    public val isResuming: Boolean
        get() = RESUMING_STATES.contains(this)

    /**
     * Returns true if this [ExerciseState] corresponds to one of the ended states and false
     * otherwise. This method returns false if the exercise has been paused, to check whether it is
     * currently paused call [isPaused].
     */
    public val isEnded: Boolean
        get() = ENDED_STATES.contains(this)

    public companion object {
        private val RESUMING_STATES = setOf(USER_RESUMING, AUTO_RESUMING)
        private val PAUSED_STATES = setOf(USER_PAUSED, AUTO_PAUSED)
        private val ENDED_STATES = setOf(USER_ENDED, AUTO_ENDED, TERMINATED)

        @JvmStatic public fun fromId(id: Int): ExerciseState? = values().firstOrNull { it.id == id }
    }
}