Add GnssGeofence AIDL HAL (hardware/interfaces)

Bug: 201253590
Test: on cuttlefish
Change-Id: I3acb2a667f7a31e7ba21b2552549df8fb236e38d
This commit is contained in:
Yu-Han Yang
2021-09-29 21:31:23 -07:00
parent 80bbf093d3
commit 3089df3bd8
15 changed files with 588 additions and 14 deletions

View File

@@ -41,6 +41,7 @@ interface IGnss {
android.hardware.gnss.IGnssMeasurementInterface getExtensionGnssMeasurement();
android.hardware.gnss.IGnssPowerIndication getExtensionGnssPowerIndication();
@nullable android.hardware.gnss.IGnssBatching getExtensionGnssBatching();
@nullable android.hardware.gnss.IGnssGeofence getExtensionGnssGeofence();
const int ERROR_INVALID_ARGUMENT = 1;
const int ERROR_ALREADY_INIT = 2;
const int ERROR_GENERIC = 3;

View File

@@ -0,0 +1,42 @@
/*
* 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.
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
///////////////////////////////////////////////////////////////////////////////
// This file is a snapshot of an AIDL file. Do not edit it manually. There are
// two cases:
// 1). this is a frozen version file - do not edit this in any case.
// 2). this is a 'current' file. If you make a backwards compatible change to
// the interface (from the latest frozen version), the build system will
// prompt you to update this file with `m <name>-update-api`.
//
// You must not make a backward incompatible change to any AIDL file built
// with the aidl_interface module type with versions property set. The module
// type is used to build AIDL files in a way that they can be used across
// independently updatable components of the system. If a device is shipped
// with such a backward incompatible change, it has a high risk of breaking
// later when a module using the interface is updated, e.g., Mainline modules.
package android.hardware.gnss;
@VintfStability
interface IGnssGeofence {
void setCallback(in android.hardware.gnss.IGnssGeofenceCallback callback);
void addGeofence(in int geofenceId, in double latitudeDegrees, in double longitudeDegrees, in double radiusMeters, in int lastTransition, in int monitorTransitions, in int notificationResponsivenessMs, in int unknownTimerMs);
void pauseGeofence(in int geofenceId);
void resumeGeofence(in int geofenceId, in int monitorTransitions);
void removeGeofence(in int geofenceId);
}

View File

@@ -0,0 +1,54 @@
/*
* 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.
*/
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
///////////////////////////////////////////////////////////////////////////////
// This file is a snapshot of an AIDL file. Do not edit it manually. There are
// two cases:
// 1). this is a frozen version file - do not edit this in any case.
// 2). this is a 'current' file. If you make a backwards compatible change to
// the interface (from the latest frozen version), the build system will
// prompt you to update this file with `m <name>-update-api`.
//
// You must not make a backward incompatible change to any AIDL file built
// with the aidl_interface module type with versions property set. The module
// type is used to build AIDL files in a way that they can be used across
// independently updatable components of the system. If a device is shipped
// with such a backward incompatible change, it has a high risk of breaking
// later when a module using the interface is updated, e.g., Mainline modules.
package android.hardware.gnss;
@VintfStability
interface IGnssGeofenceCallback {
void gnssGeofenceTransitionCb(in int geofenceId, in android.hardware.gnss.GnssLocation location, in int transition, in long timestampMillis);
void gnssGeofenceStatusCb(in int availability, in android.hardware.gnss.GnssLocation lastLocation);
void gnssGeofenceAddCb(in int geofenceId, in int status);
void gnssGeofenceRemoveCb(in int geofenceId, in int status);
void gnssGeofencePauseCb(in int geofenceId, in int status);
void gnssGeofenceResumeCb(in int geofenceId, in int status);
const int ENTERED = 1;
const int EXITED = 2;
const int UNCERTAIN = 4;
const int UNAVAILABLE = 1;
const int AVAILABLE = 2;
const int OPERATION_SUCCESS = 0;
const int ERROR_TOO_MANY_GEOFENCES = -100;
const int ERROR_ID_EXISTS = -101;
const int ERROR_ID_UNKNOWN = -102;
const int ERROR_INVALID_TRANSITION = -103;
const int ERROR_GENERIC = -149;
}

View File

@@ -19,6 +19,7 @@ package android.hardware.gnss;
import android.hardware.gnss.IGnssBatching;
import android.hardware.gnss.IGnssCallback;
import android.hardware.gnss.IGnssConfiguration;
import android.hardware.gnss.IGnssGeofence;
import android.hardware.gnss.IGnssMeasurementInterface;
import android.hardware.gnss.IGnssPowerIndication;
import android.hardware.gnss.IGnssPsds;
@@ -110,4 +111,11 @@ interface IGnss {
* @return Handle to the IGnssBatching interface.
*/
@nullable IGnssBatching getExtensionGnssBatching();
/**
* This method returns the IGnssGeofence interface.
*
* @return Handle to the IGnssGeofence interface.
*/
@nullable IGnssGeofence getExtensionGnssGeofence();
}

View File

@@ -0,0 +1,82 @@
/*
* 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 android.hardware.gnss;
import android.hardware.gnss.IGnssGeofenceCallback;
/** Extended interface for GNSS Geofence support. */
@VintfStability
interface IGnssGeofence {
/**
* Opens the geofence interface and provides the callback routines to the HAL.
*
* @param callback Handle to the IGnssGeofenceCallback interface.
*/
void setCallback(in IGnssGeofenceCallback callback);
/**
* Add a geofence area. This api currently supports circular geofences.
*
* @param geofenceId The id for the geofence. If a geofence with this id already exists, an
* error value (ERROR_ID_EXISTS) must be returned.
* @param latitudeDegrees The latitude(in degrees) for the geofence lastTransition.
* @param longitudeDegrees The longitude(in degrees) for the geofence lastTransition.
* @param radiusMeters The radius(in meters) for the geofence lastTransition.
* @param lastTransition The current state of the geofence. It can be one of the transition
* states (ENTERED, EXITED, UNCERTAIN) as defined in IGnssGeofenceCallback. For example, if
* the system already knows that the user is inside the geofence, this will be set to ENTERED.
* In most cases, it will be UNCERTAIN.
* @param monitorTransitions A bitfield of ENTERED, EXITED and UNCERTAIN. It represents which
* transitions to monitor.
* @param notificationResponsivenessMs - Defines the best-effort description of how soon must
* the callback be called when the transition associated with the Geofence is triggered. For
* instance, if set to 1000 milliseconds with ENTERED, the callback must be called 1000
* milliseconds within entering the geofence. This parameter is defined in milliseconds.
* NOTE: This is not to be confused with the rate that the GNSS is polled at. It is acceptable
* to dynamically vary the rate of sampling the GNSS for power-saving reasons; thus the rate of
* sampling may be faster or slower than this.
* @param unknownTimerMs - The time limit in millisecondsafter which the UNCERTAIN transition
* must be triggered.
*/
void addGeofence(in int geofenceId, in double latitudeDegrees, in double longitudeDegrees,
in double radiusMeters, in int lastTransition, in int monitorTransitions,
in int notificationResponsivenessMs, in int unknownTimerMs);
/**
* Pause monitoring a particular geofence.
*
* @param geofenceId The id for the geofence.
*/
void pauseGeofence(in int geofenceId);
/**
* Resume monitoring a particular geofence.
*
* @param geofenceId - The id for the geofence.
* @param monitorTransitions Specifies which transitions to monitor. It can be a bitwise OR of
* ENTERED, EXITED and UNCERTAIN. This supersedes the value associated provided in the
* addGeofence call.
*/
void resumeGeofence(in int geofenceId, in int monitorTransitions);
/**
* Remove a geofence area. After the function returns, no notifications must be sent.
*
* @param geofenceId The id of the geofence.
*/
void removeGeofence(in int geofenceId);
}

View File

@@ -0,0 +1,184 @@
/*
* 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 android.hardware.gnss;
import android.hardware.gnss.GnssLocation;
/**
* The callback interface to report GNSS geofence events from the HAL.
*
* There are 3 states associated with a Geofence: Inside, Outside, Unknown.
* There are 3 transitions: ENTERED, EXITED, UNCERTAIN.
*
* An example state diagram with confidence level: 95% and Unknown time limit
* set as 30 secs is shown below. (confidence level and Unknown time limit are
* explained latter).
* ____________________________
* | Unknown (30 secs) |
* """"""""""""""""""""""""""""
* ^ | | ^
* UNCERTAIN| |ENTERED EXITED| |UNCERTAIN
* | v v |
* ________ EXITED _________
* | Inside | -----------> | Outside |
* | | <----------- | |
* """""""" ENTERED """""""""
*
* Inside state: We are 95% confident that the user is inside the geofence.
* Outside state: We are 95% confident that the user is outside the geofence
* Unknown state: Rest of the time.
*
* The Unknown state is better explained with an example:
*
* __________
* | c|
* | ___ | _______
* | |a| | | b |
* | """ | """""""
* | |
* """"""""""
* In the diagram above, "a" and "b" are 2 geofences and "c" is the accuracy
* circle reported by the GNSS subsystem. Now with regard to "b", the system is
* confident that the user is outside. But with regard to "a" is not confident
* whether it is inside or outside the geofence. If the accuracy remains the
* same for a sufficient period of time, the UNCERTAIN transition must be
* triggered with the state set to Unknown. If the accuracy improves later, an
* appropriate transition must be triggered. This "sufficient period of time"
* is defined by the parameter in the addGeofenceArea API.
* In other words, Unknown state can be interpreted as a state in which the
* GNSS subsystem isn't confident enough that the user is either inside or
* outside the Geofence. It moves to Unknown state only after the expiry of the
* timeout.
*
* The geofence callback needs to be triggered for the ENTERED and EXITED
* transitions, when the GNSS system is confident that the user has entered
* (Inside state) or exited (Outside state) the Geofence. An implementation
* which uses a value of 95% as the confidence is recommended. The callback
* must be triggered only for the transitions requested by the
* addGeofenceArea method.
*
* Even though the diagram and explanation talks about states and transitions,
* the callee is only interested in the transitions. The states are mentioned
* here for illustrative purposes.
*
* Startup Scenario: When the device boots up, if an application adds geofences,
* and then we get an accurate GNSS location fix, it needs to trigger the
* appropriate (ENTERED or EXITED) transition for every Geofence it knows about.
* By default, all the Geofences will be in the Unknown state.
*
* When the GNSS system is unavailable, gnssGeofenceStatusCb must be
* called to inform the upper layers of the same. Similarly, when it becomes
* available the callback must be called. This is a global state while the
* UNKNOWN transition described above is per geofence.
*
* An important aspect to note is that users of this API (framework), will use
* other subsystems like wifi, sensors, cell to handle Unknown case and
* hopefully provide a definitive state transition to the third party
* application. GNSS Geofence will just be a signal indicating what the GNSS
* subsystem knows about the Geofence.
*/
@VintfStability
interface IGnssGeofenceCallback {
// Geofence transition status
const int ENTERED = 1 << 0;
const int EXITED = 1 << 1;
const int UNCERTAIN = 1 << 2;
// Geofence availability status
const int UNAVAILABLE = 1 << 0;
const int AVAILABLE = 1 << 1;
// Geofence operation status
const int OPERATION_SUCCESS = 0;
const int ERROR_TOO_MANY_GEOFENCES = -100;
const int ERROR_ID_EXISTS = -101;
const int ERROR_ID_UNKNOWN = -102;
const int ERROR_INVALID_TRANSITION = -103;
const int ERROR_GENERIC = -149;
/**
* The callback associated with the geofence transition.
*
* The callback must only be called when the caller is interested in that particular transition.
* For instance, if the caller is interested only in ENTERED transition, then the callback must
* not be called with the EXITED transition.
*
* IMPORTANT: If a transition is triggered resulting in this callback, the GNSS subsystem will
* wake up the application processor, if it is in suspend state.
*
* @param geofenceId The id associated with the addGeofenceArea.
* @param location The current GNSS location.
* @param transition Can be one of ENTERED, EXITED or UNCERTAIN.
* @param timestamp Timestamp (in UTC milliseconds) when the transition was detected.
*/
void gnssGeofenceTransitionCb(in int geofenceId, in GnssLocation location, in int transition,
in long timestampMillis);
/**
* The callback associated with the availability of the GNSS system for geofencing monitoring.
* If the GNSS system determines that it cannot monitor geofences because of lack of reliability
* or unavailability of the GNSS signals, it will call this callback with UNAVAILABLE parameter.
*
* @param status - UNAVAILABLE or AVAILABLE.
* @param lastLocation - Last known location.
*/
void gnssGeofenceStatusCb(in int availability, in GnssLocation lastLocation);
/**
* The callback associated with the addGeofence call.
*
* @param geofenceId Id of the geofence.
* @param status Returns OPERATION_SUCCESS if the geofence add was successful,
* returns ERROR_TOO_MANY_GEOFENCES if the geofence limit has been reached,
* returns ERROR_ID_EXISTS if geofence with id already exists,
* returns ERROR_INVALID_TRANSITION if the monitorTransition contains an invalid
* transition, and
* returns ERROR_GENERIC for other errors.
*/
void gnssGeofenceAddCb(in int geofenceId, in int status);
/**
* The callback associated with the removeGeofence call.
*
* @param geofenceId Id of the geofence.
* @param status Returns OPERATION_SUCCESS if successful,
* returns ERROR_ID_UNKNOWN for invalid id and
* returns ERROR_GENERIC for others.
*/
void gnssGeofenceRemoveCb(in int geofenceId, in int status);
/**
* The callback associated with the pauseGeofence call.
*
* @param geofenceId Id of the geofence.
* @param status Returns OPERATION_SUCCESS if success,
* returns ERROR_ID_UNKNOWN for invalid id,
* returns ERROR_INVALID_TRANSITION when monitorTransitions is invalid, and
* returns ERROR_GENERIC for other err errors.
*/
void gnssGeofencePauseCb(in int geofenceId, in int status);
/**
* The callback associated with the resumeGeofence call.
*
* @param geofenceId - Id of the geofence.
* @param status Returns OPERATION_SUCCESS if successful,
* returns ERROR_ID_UNKNOWN for invalid id, and
* returns ERROR_GENERIC for others.
*/
void gnssGeofenceResumeCb(in int geofenceId, in int status);
}

View File

@@ -57,6 +57,7 @@ cc_binary {
srcs: [
"Gnss.cpp",
"GnssBatching.cpp",
"GnssGeofence.cpp",
"GnssHidlHal.cpp",
"GnssPowerIndication.cpp",
"GnssPsds.cpp",

View File

@@ -20,6 +20,7 @@
#include <log/log.h>
#include "GnssBatching.h"
#include "GnssConfiguration.h"
#include "GnssGeofence.h"
#include "GnssMeasurementInterface.h"
#include "GnssPsds.h"
@@ -96,4 +97,11 @@ ndk::ScopedAStatus Gnss::getExtensionGnssBatching(std::shared_ptr<IGnssBatching>
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus Gnss::getExtensionGnssGeofence(std::shared_ptr<IGnssGeofence>* iGnssGeofence) {
ALOGD("Gnss::getExtensionGnssGeofence");
*iGnssGeofence = SharedRefBase::make<GnssGeofence>();
return ndk::ScopedAStatus::ok();
}
} // namespace aidl::android::hardware::gnss

View File

@@ -40,6 +40,8 @@ class Gnss : public BnGnss {
std::shared_ptr<IGnssMeasurementInterface>* iGnssMeasurement) override;
ndk::ScopedAStatus getExtensionGnssBatching(
std::shared_ptr<IGnssBatching>* iGnssBatching) override;
ndk::ScopedAStatus getExtensionGnssGeofence(
std::shared_ptr<IGnssGeofence>* iGnssGeofence) override;
std::shared_ptr<GnssConfiguration> mGnssConfiguration;
std::shared_ptr<GnssPowerIndication> mGnssPowerIndication;

View File

@@ -0,0 +1,61 @@
/*
* 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.
*/
#define LOG_TAG "GnssGeofenceAidl"
#include "GnssGeofence.h"
#include <aidl/android/hardware/gnss/BnGnssGeofence.h>
#include <log/log.h>
namespace aidl::android::hardware::gnss {
std::shared_ptr<IGnssGeofenceCallback> GnssGeofence::sCallback = nullptr;
ndk::ScopedAStatus GnssGeofence::setCallback(
const std::shared_ptr<IGnssGeofenceCallback>& callback) {
ALOGD("setCallback");
std::unique_lock<std::mutex> lock(mMutex);
sCallback = callback;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus GnssGeofence::addGeofence(int geofenceId, double latitudeDegrees,
double longitudeDegrees, double radiusMeters,
int lastTransition, int monitorTransitions,
int notificationResponsivenessMs, int unknownTimerMs) {
ALOGD("addGeofence. geofenceId=%d, lat=%lf, lng=%lf, rad=%lf, lastTransition=%d, "
"monitorTransitions=%d, notificationResponsivenessMs=%d, unknownTimerMs=%d",
geofenceId, latitudeDegrees, longitudeDegrees, radiusMeters, lastTransition,
monitorTransitions, notificationResponsivenessMs, unknownTimerMs);
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus GnssGeofence::pauseGeofence(int geofenceId) {
ALOGD("pauseGeofence. id=%d", geofenceId);
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus GnssGeofence::resumeGeofence(int geofenceId, int monitorTransitions) {
ALOGD("resumeGeofence. id=%d, monitorTransitions=%d", geofenceId, monitorTransitions);
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus GnssGeofence::removeGeofence(int geofenceId) {
ALOGD("removeGeofence. id=%d", geofenceId);
return ndk::ScopedAStatus::ok();
}
} // namespace aidl::android::hardware::gnss

View File

@@ -0,0 +1,41 @@
/*
* 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.
*/
#pragma once
#include <aidl/android/hardware/gnss/BnGnssGeofence.h>
namespace aidl::android::hardware::gnss {
struct GnssGeofence : public BnGnssGeofence {
public:
ndk::ScopedAStatus setCallback(const std::shared_ptr<IGnssGeofenceCallback>& callback) override;
ndk::ScopedAStatus addGeofence(int geofenceId, double latitudeDegrees, double longitudeDegrees,
double radiusMeters, int lastTransition, int monitorTransitions,
int notificationResponsivenessMs, int unknownTimerMs) override;
ndk::ScopedAStatus pauseGeofence(int geofenceId) override;
ndk::ScopedAStatus resumeGeofence(int geofenceId, int monitorTransitions) override;
ndk::ScopedAStatus removeGeofence(int geofenceId) override;
private:
// Guarded by mMutex
static std::shared_ptr<IGnssGeofenceCallback> sCallback;
// Synchronization lock for sCallback
mutable std::mutex mMutex;
};
} // namespace aidl::android::hardware::gnss

View File

@@ -32,6 +32,7 @@ cc_test {
"gnss_hal_test_cases.cpp",
"GnssBatchingCallback.cpp",
"GnssCallbackAidl.cpp",
"GnssGeofenceCallback.cpp",
"GnssMeasurementCallbackAidl.cpp",
"GnssPowerIndicationCallback.cpp",
"VtsHalGnssTargetTest.cpp",

View File

@@ -0,0 +1,46 @@
/*
* 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.
*/
#include "GnssGeofenceCallback.h"
#include <log/log.h>
using android::binder::Status;
using android::hardware::gnss::GnssLocation;
Status GnssGeofenceCallback::gnssGeofenceTransitionCb(int, const GnssLocation&, int, int64_t) {
// To implement
return Status::ok();
}
Status GnssGeofenceCallback::gnssGeofenceStatusCb(int, const GnssLocation&) {
// To implement
return Status::ok();
}
Status GnssGeofenceCallback::gnssGeofenceAddCb(int, int) {
// To implement
return Status::ok();
}
Status GnssGeofenceCallback::gnssGeofenceRemoveCb(int, int) {
// To implement
return Status::ok();
}
Status GnssGeofenceCallback::gnssGeofencePauseCb(int, int) {
// To implement
return Status::ok();
}
Status GnssGeofenceCallback::gnssGeofenceResumeCb(int, int) {
// To implement
return Status::ok();
}

View File

@@ -0,0 +1,38 @@
/*
* 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.
*/
#pragma once
#include <android/hardware/gnss/BnGnssGeofenceCallback.h>
#include <vector>
#include "GnssCallbackEventQueue.h"
/** Implementation for IGnssGeofenceCallback. */
class GnssGeofenceCallback : public android::hardware::gnss::BnGnssGeofenceCallback {
public:
GnssGeofenceCallback() {}
~GnssGeofenceCallback() {}
android::binder::Status gnssGeofenceTransitionCb(
int geofenceId, const android::hardware::gnss::GnssLocation& location, int transition,
int64_t timestampMillis) override;
android::binder::Status gnssGeofenceStatusCb(
int availability, const android::hardware::gnss::GnssLocation& lastLocation) override;
android::binder::Status gnssGeofenceAddCb(int geofenceId, int status) override;
android::binder::Status gnssGeofenceRemoveCb(int geofenceId, int status) override;
android::binder::Status gnssGeofencePauseCb(int geofenceId, int status) override;
android::binder::Status gnssGeofenceResumeCb(int geofenceId, int status) override;
};

View File

@@ -23,6 +23,7 @@
#include <android/hardware/gnss/IGnssPowerIndication.h>
#include <android/hardware/gnss/IGnssPsds.h>
#include "GnssBatchingCallback.h"
#include "GnssGeofenceCallback.h"
#include "GnssMeasurementCallbackAidl.h"
#include "GnssPowerIndicationCallback.h"
#include "gnss_hal_test.h"
@@ -38,6 +39,8 @@ using android::hardware::gnss::IGnss;
using android::hardware::gnss::IGnssBatching;
using android::hardware::gnss::IGnssBatchingCallback;
using android::hardware::gnss::IGnssConfiguration;
using android::hardware::gnss::IGnssGeofence;
using android::hardware::gnss::IGnssGeofenceCallback;
using android::hardware::gnss::IGnssMeasurementCallback;
using android::hardware::gnss::IGnssMeasurementInterface;
using android::hardware::gnss::IGnssPowerIndication;
@@ -755,23 +758,25 @@ TEST_P(GnssHalTest, BlocklistConstellationLocationOn) {
}
/*
* TestGnssBatchingExtension:
* 1. Gets the IGnssBatching extension.
* 2. Initializes the interface with an IGnssBatchingCallback.
* 3. Clean up.
* TestAllExtensions.
*/
TEST_P(GnssHalTest, TestGnssBatchingExtension) {
TEST_P(GnssHalTest, TestAllExtensions) {
sp<IGnssBatching> iGnssBatching;
auto status = aidl_gnss_hal_->getExtensionGnssBatching(&iGnssBatching);
if (!status.isOk() || iGnssBatching == nullptr) {
// Device doesn't support batching. Skip the test.
return;
if (status.isOk() && iGnssBatching != nullptr) {
auto gnssBatchingCallback = sp<GnssBatchingCallback>::make();
status = iGnssBatching->init(gnssBatchingCallback);
ASSERT_TRUE(status.isOk());
status = iGnssBatching->cleanup();
ASSERT_TRUE(status.isOk());
}
sp<IGnssBatchingCallback> iGnssBatchingCallback;
status = iGnssBatching->init(iGnssBatchingCallback);
ASSERT_TRUE(status.isOk());
status = iGnssBatching->cleanup();
ASSERT_TRUE(status.isOk());
sp<IGnssGeofence> iGnssGeofence;
status = aidl_gnss_hal_->getExtensionGnssGeofence(&iGnssGeofence);
if (status.isOk() && iGnssGeofence != nullptr) {
auto gnssGeofenceCallback = sp<GnssGeofenceCallback>::make();
status = iGnssGeofence->setCallback(gnssGeofenceCallback);
ASSERT_TRUE(status.isOk());
}
}