/*
 * Copyright (C) 2016 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.gnss@1.0;

/** GNSS Network Initiated callback interface. */
interface IGnssNiCallback {
    /**
     * GnssNiType constants
     */
    @export(name="", value_prefix="GPS_NI_TYPE_")
    enum GnssNiType : uint8_t {
        VOICE           = 1,
        UMTS_SUPL       = 2,
        UMTS_CTRL_PLANE = 3,
        EMERGENCY_SUPL  = 4
    };

    /**
     * GnssNiNotifyFlags constants
     */
    @export(name="", value_prefix="GPS_NI_")
    enum GnssNiNotifyFlags : uint32_t {
        /** NI requires notification */
        NEED_NOTIFY      = 0x0001,
        /** NI requires verification */
        NEED_VERIFY      = 0x0002,
        /** NI requires privacy override, no notification/minimal trace */
        PRIVACY_OVERRIDE = 0x0004,
    };

    /**
     * GNSS NI responses, used to define the response in
     * NI structures
     */
    @export(name="", value_prefix="GPS_NI_")
    enum GnssUserResponseType : uint8_t {
        RESPONSE_ACCEPT  = 1,
        RESPONSE_DENY    = 2,
        RESPONSE_NORESP  = 3,
    };

    /**
     * NI data encoding scheme
     */
    @export(name="", value_prefix="GPS_")
    enum GnssNiEncodingType : int32_t {
        ENC_NONE              = 0,
        ENC_SUPL_GSM_DEFAULT  = 1,
        ENC_SUPL_UTF8         = 2,
        ENC_SUPL_UCS2         = 3,
        ENC_UNKNOWN           = -1,
    };

    /** Represents an NI request */
    struct GnssNiNotification{
        /**
         * An ID generated by HAL to associate NI notifications and UI
         * responses.
         */
        int32_t notificationId;

        /**
         * A type used to distinguish different categories of NI
         * events, such as VOICE, UMTS_SUPL etc.
         */
        GnssNiType niType;

        /**
         * Notification/verification options, combinations of GnssNiNotifyFlags
         * constants.
         */
        bitfield<GnssNiNotifyFlags> notifyFlags;

        /**
         * Timeout period to wait for user response.
         * Set to 0 for no timeout limit. Specified in seconds.
         */
        uint32_t timeoutSec;

        /**
         * Default response when timeout.
         */
        GnssUserResponseType defaultResponse;

        /**
         * String representing the requester of the network inititated location
         * request.
         */
        string requestorId;

        /**
         * Notification message. String representing the service(for eg. SUPL-service)
         * who sent the network initiated location request.
         */
        string notificationMessage;

        /**
         * requestorId decoding scheme.
         */
        GnssNiEncodingType requestorIdEncoding;

        /**
         * notificationId decoding scheme
         */
        GnssNiEncodingType notificationIdEncoding;
    };

    /**
     * Callback with a network initiated request.
     *
     * @param notification network initiated request.
     */
    niNotifyCb(GnssNiNotification notification);
};
