/* Copyright (C) 2017 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.broadcastradio@2.0;

import IAnnouncementListener;
import ICloseHandle;
import ITunerCallback;
import ITunerSession;

/**
 * Represents a hardware broadcast radio module. A single module may contain
 * multiple hardware tuners (i.e. with an additional background tuner), but the
 * layers above the HAL see them as a single logical unit.
 */
interface IBroadcastRadio {
    /**
     * Returns module properties: a description of a module and its
     * capabilities. This method must not fail.
     *
     * @return properties Module description.
     */
    getProperties() generates (Properties properties);

    /**
     * Fetches current or possible AM/FM region configuration.
     *
     * @param full If true, returns full hardware capabilities.
     *             If false, returns current regional configuration.
     * @return result OK in case of success.
     *                NOT_SUPPORTED if the tuner doesn't support AM/FM.
     * @return config Hardware capabilities (full=true) or
     *                current configuration (full=false).
     */
    getAmFmRegionConfig(bool full)
            generates (Result result, AmFmRegionConfig config);

    /**
     * Fetches current DAB region configuration.
     *
     * @return result OK in case of success.
     *                NOT_SUPPORTED if the tuner doesn't support DAB.
     * @return config Current configuration.
     */
    getDabRegionConfig() generates (Result result, vec<DabTableEntry> config);

    /**
     * Opens a new tuner session.
     *
     * There may be only one session active at a time. If the new session was
     * requested when the old one was active, the old must be terminated
     * (aggressive open).
     *
     * @param callback The callback interface.
     * @return result OK in case of success.
     * @return session The session interface.
     */
    openSession(ITunerCallback callback)
        generates (Result result, ITunerSession session);

    /**
     * Fetch image from radio module cache.
     *
     * This is out-of-band transport mechanism for images carried with metadata.
     * The metadata vector only passes the identifier, so the client may cache
     * images or even not fetch them.
     *
     * The identifier may be any arbitrary number (i.e. sha256 prefix) selected
     * by the vendor. It must be stable across sessions so the application may
     * cache it.
     *
     * The data must be a valid PNG, JPEG, GIF or BMP file.
     * Image data with an invalid format must be handled gracefully in the same
     * way as a missing image.
     *
     * The image identifier may become invalid after some time from passing it
     * with metadata struct (due to resource cleanup at the HAL implementation).
     * However, it must remain valid for a currently tuned program at least
     * until onCurrentProgramInfoChanged is called.
     *
     * There is still a race condition possible between
     * onCurrentProgramInfoChanged callback and the HAL implementation eagerly
     * clearing the cache (because the next onCurrentProgramInfoChanged came).
     * In such case, client application may expect the new
     * onCurrentProgramInfoChanged callback with updated image identifier.
     *
     * @param id Identifier of an image (value of Constants::INVALID_IMAGE is
     *           reserved and must be treated as invalid image).
     * @return image A binary blob with image data
     *               or a zero-length vector if identifier doesn't exist.
     */
    getImage(uint32_t id) generates (vec<uint8_t> image);

    /**
     * Registers announcement listener.
     *
     * If there is at least one observer registered, HAL implementation must
     * notify about announcements even if no sessions are active.
     *
     * If the observer dies, the HAL implementation must unregister observer
     * automatically.
     *
     * @param enabled The list of announcement types to watch for.
     * @param listener The listener interface.
     * @return result OK in case of success.
     *                NOT_SUPPORTED if the tuner doesn't support announcements.
     * @return closeHandle A handle to unregister observer,
     *                     nullptr if result was not OK.
     */
    registerAnnouncementListener(
            vec<AnnouncementType> enabled,
            IAnnouncementListener listener
        ) generates (
            Result result,
            ICloseHandle closeHandle
        );
};
