/*
 * 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@1.1;

import @1.0::ITunerCallback;

/**
 * Some methods of @1.1::ITunerCallback are updated versions of those from
 * @1.0:ITunerCallback. All 1.1 HAL implementations must call both
 * (eg. tuneComplete and tuneComplete_1_1), while 1.1 clients may ignore 1.0
 * ones, to avoid receiving a callback twice.
 */
interface ITunerCallback extends @1.0::ITunerCallback {
    /**
     * Method called by the HAL when a tuning operation completes
     * following a step(), scan() or tune() command.
     *
     * This callback supersedes V1_0::tuneComplete.
     * The 1.0 callback must not be called when HAL implementation detects
     * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback).
     *
     * In case of success, currentProgramInfoChanged must be called too.
     * It means the success case may (or may not) be handled by the client in
     * currentProgramInfoChanged, instead of here.
     *
     * @param result OK if tune succeeded or TIMEOUT in case of time out.
     * @param selector A ProgramSelector structure describing the tuned station.
     */
    oneway tuneComplete_1_1(Result result, ProgramSelector selector);

    /**
     * Called by the HAL when background scan feature becomes available or not.
     *
     * @param isAvailable true, if the tuner turned temporarily background-
     *                    capable, false in the other case.
     */
    oneway backgroundScanAvailable(bool isAvailable);

    /**
     * Called by the HAL when background scan initiated by startBackgroundScan
     * finishes. If the list was changed, programListChanged must be called too.
     * @param result OK if the scan succeeded, client may retrieve the actual
     *               list with ITuner::getProgramList.
     *               UNAVAILABLE if the scan was interrupted due to
     *               hardware becoming temporarily unavailable.
     *               NOT_INITIALIZED other error, ie. HW failure.
     */
    oneway backgroundScanComplete(ProgramListResult result);

    /**
     * Called each time the internally cached program list changes. HAL may not
     * call it immediately, ie. it may wait for a short time to accumulate
     * multiple list change notifications into a single event.
     *
     * This callback is only for notifying about insertions and deletions,
     * not about metadata changes.
     *
     * It may be triggered either by an explicitly issued background scan,
     * or a scan issued by the device internally.
     *
     * Client may retrieve the actual list with ITuner::getProgramList.
     */
    oneway programListChanged();

    /**
     * Method called by the HAL when current program information (including
     * metadata) is updated.
     *
     * Client may retrieve the actual program info with
     * ITuner::getProgramInformation_1_1.
     *
     * This may be called together with tuneComplete_1_1 or afSwitch_1_1.
     *
     * This callback supersedes V1_0::newMetadata and V1_0::afSwitch;
     * partly V1_0::tuneComplete.
     * 1.0 callbacks must not be called when HAL implementation detects
     * 1.1 client (by casting V1_0::ITunerCallback to V1_1::ITunerCallback).
     *
     * @param info current program information
     */
    oneway currentProgramInfoChanged(ProgramInfo info);
};
