/*
 * Copyright (C) 2019 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.hardware.health@2.1;

import @2.0::IHealth;
import @2.0::Result;
import HealthConfig;
import HealthInfo;
import IHealthInfoCallback;

/**
 * IHealth manages health info and posts events on registered callbacks.
 *
 * An implementation of @2.1::IHealth must be able to handle both
 * @2.0::IHealthInfoCallback and @2.1::IHealthInfoCallback.
 * - When registerCallback() is called, an implementation must cast the callback
 * to @2.1::IHealthInfoCallback.
 *   - If the cast is successful, when a health info broadcast is sent, the
 *     implementation must call
 *     @2.1::IHealthInfoCallback.healthInfoChanged_2_1(). All fields introduced
 *     in 2.1 must be set appropriately. The implementation must not call
 *     @2.0::IHealthInfoCallback.healthInfoChanged().
 *   - If the cast is unsuccessful, the implementation must call
 *     @2.0::IHealthInfoCallback.healthInfoChanged().
 * - When unregisterCallback() is called, from then on, updates must not be sent
 *   through either healthInfoChanged_2_1() or healthInfoChanged().
 *
 * Passthrough implementations are not required to send health info to all
 * callbacks periodically, but they must do so when update() is called.
 * Binderized implementations must send health info to all callbacks
 * periodically. The intervals between two notifications must be retrieved from
 * the passthrough implementation through the getHealthConfig() function.
 */
interface IHealth extends @2.0::IHealth {
    /**
     * Get configuration of this HAL.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this API is not supported,
     *                UNKNOWN for other errors.
     * @return config HAL configuration, to be ignored if result is not
     *                SUCCESS.
     */
    getHealthConfig() generates (Result result, HealthConfig config);

    /**
     * Get Health Information.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this API is not supported,
     *                UNKNOWN for other errors.
     * @return value  Health information, to be ignored if result is not
     *                SUCCESS.
     */
    getHealthInfo_2_1() generates (Result result, @2.1::HealthInfo value);

    /**
     * Return whether the screen should be kept on in charger mode.
     *
     * @return result SUCCESS if successful,
     *                NOT_SUPPORTED if this API is not supported,
     *                UNKNOWN for other errors.
     * @return value whether screen should be kept on.
     */
    shouldKeepScreenOn() generates (Result result, bool value);
};
