Merge tag 'LA.UM.10.6.2.r1-02500-89xx.0' into int/13/fp3

"LA.UM.10.6.2.r1-02500-89xx.0"

* tag 'LA.UM.10.6.2.r1-02500-89xx.0':
  Enable protected dynamic interface control

Change-Id: I145a595f36ee08e1a80fb406cc4c2ef28cc3d4a9
diff --git a/batching/BatchingAdapter.cpp b/batching/BatchingAdapter.cpp
index 4f1a43c..4fdacda 100644
--- a/batching/BatchingAdapter.cpp
+++ b/batching/BatchingAdapter.cpp
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #define LOG_NDEBUG 0
 #define LOG_TAG "LocSvc_BatchingAdapter"
 
@@ -163,6 +200,41 @@
 }
 
 void
+BatchingAdapter::handleEngineLockStatusEvent(EngineLockState engineLockState) {
+
+    LOC_LOGD("%s]: Old Engine state %d, New Engine state : %d,", __func__,
+        mLocApi->getEngineLockState(), engineLockState);
+
+    struct MsgEngineLockStateEvent : public LocMsg {
+        BatchingAdapter& mAdapter;
+        EngineLockState mEngineLockState;
+
+        inline MsgEngineLockStateEvent(BatchingAdapter& adapter, EngineLockState engineLockState) :
+            LocMsg(),
+            mAdapter(adapter),
+            mEngineLockState(engineLockState){}
+
+        virtual void proc() const {
+            mAdapter.handleEngineLockStatus(mEngineLockState);
+        }
+    };
+
+    sendMsg(new MsgEngineLockStateEvent(*this, engineLockState));
+}
+
+void
+BatchingAdapter::handleEngineLockStatus(EngineLockState engineLockState) {
+
+    LOC_LOGd("lock state %d, pending msgs %zu", engineLockState, mPendingGnssEnabledMsgs.size());
+    if (ENGINE_LOCK_STATE_ENABLED == engineLockState) {
+        for (auto msg: mPendingGnssEnabledMsgs) {
+            sendMsg(msg);
+        }
+        mPendingGnssEnabledMsgs.clear();
+    }
+}
+
+void
 BatchingAdapter::handleEngineUpEvent()
 {
     struct MsgSSREvent : public LocMsg {
@@ -178,11 +250,13 @@
             mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
             mApi.setBatchSize(mAdapter.getBatchSize());
             mApi.setTripBatchSize(mAdapter.getTripBatchSize());
-            mAdapter.restartSessions();
-            for (auto msg: mAdapter.mPendingMsgs) {
-                mAdapter.sendMsg(msg);
+            if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
+                mAdapter.restartSessions();
+                for (auto msg: mAdapter.mPendingMsgs) {
+                    mAdapter.sendMsg(msg);
+                }
+                mAdapter.mPendingMsgs.clear();
             }
-            mAdapter.mPendingMsgs.clear();
         }
     };
 
@@ -354,7 +428,8 @@
             if (LOCATION_ERROR_SUCCESS == err) {
                 if (mBatchingOptions.batchingMode == BATCHING_MODE_ROUTINE ||
                     mBatchingOptions.batchingMode == BATCHING_MODE_NO_AUTO_REPORT) {
-                    mAdapter.startBatching(mClient, mSessionId, mBatchingOptions);
+                    mAdapter.startBatching(
+                            mClient, mSessionId, mBatchingOptions, new MsgStartBatching(*this));
                 } else if (mBatchingOptions.batchingMode == BATCHING_MODE_TRIP) {
                     mAdapter.startTripBatchingMultiplex(mClient, mSessionId, mBatchingOptions);
                 } else {
@@ -371,7 +446,7 @@
 
 void
 BatchingAdapter::startBatching(LocationAPI* client, uint32_t sessionId,
-        const BatchingOptions& batchingOptions)
+        const BatchingOptions& batchingOptions, LocMsg* pendingMsg)
 {
     if (batchingOptions.batchingMode != BATCHING_MODE_NO_AUTO_REPORT &&
         0 == autoReportBatchingSessionsCount()) {
@@ -385,8 +460,9 @@
     saveBatchingSession(client, sessionId, batchingOptions);
     mLocApi->startBatching(sessionId, batchingOptions, getBatchingAccuracy(), getBatchingTimeout(),
             new LocApiResponse(*getContext(),
-            [this, client, sessionId, batchingOptions] (LocationError err) {
-        if (LOCATION_ERROR_SUCCESS != err) {
+            [this, client, sessionId, batchingOptions, pendingMsg] (LocationError err) {
+        if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+            LOCATION_ERROR_SUCCESS != err) {
             eraseBatchingSession(client, sessionId);
         }
 
@@ -399,6 +475,13 @@
                           LOC_REGISTRATION_MASK_DISABLED);
         }
 
+        if (LOCATION_ERROR_GNSS_DISABLED == err && pendingMsg != nullptr) {
+            LOC_LOGd("GNSS_DISABLED, add request to pending queue");
+            mPendingGnssEnabledMsgs.push_back(pendingMsg);
+        } else if (pendingMsg != nullptr) {
+            delete pendingMsg;
+        }
+
         reportResponse(client, err, sessionId);
     }));
 }
@@ -509,7 +592,8 @@
                 new LocApiResponse(*getContext(),
                 [this, client, sessionId, flpOptions, restartNeeded, batchOptions]
                 (LocationError err) {
-            if (LOCATION_ERROR_SUCCESS != err) {
+            if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+                LOCATION_ERROR_SUCCESS != err) {
                 saveBatchingSession(client, sessionId, batchOptions);
             } else {
                 // if stopBatching is success, unregister for batch full event if this was the last
@@ -766,7 +850,8 @@
         mLocApi->startOutdoorTripBatching(batchingOptions.minDistance,
                 batchingOptions.minInterval, getBatchingTimeout(), new LocApiResponse(*getContext(),
                 [this, client, sessionId, batchingOptions] (LocationError err) {
-            if (err == LOCATION_ERROR_SUCCESS) {
+            if (ENGINE_LOCK_STATE_DISABLED == mLocApi->getEngineLockState() ||
+                err == LOCATION_ERROR_SUCCESS) {
                 mOngoingTripDistance = batchingOptions.minDistance;
                 mOngoingTripTBFInterval = batchingOptions.minInterval;
                 LOC_LOGD("%s] New Trip started ...", __func__);
diff --git a/batching/BatchingAdapter.h b/batching/BatchingAdapter.h
index 66f7c5f..4580976 100644
--- a/batching/BatchingAdapter.h
+++ b/batching/BatchingAdapter.h
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #ifndef BATCHING_ADAPTER_H
 #define BATCHING_ADAPTER_H
 
@@ -114,7 +151,7 @@
     void eraseBatchingSession(LocationAPI* client, uint32_t sessionId);
     uint32_t autoReportBatchingSessionsCount();
     void startBatching(LocationAPI* client, uint32_t sessionId,
-                       const BatchingOptions& batchingOptions);
+                       const BatchingOptions& batchingOptions, LocMsg* pendingMsg = nullptr);
     void stopBatching(LocationAPI* client, uint32_t sessionId, bool restartNeeded,
                       const BatchingOptions& batchOptions);
     void stopBatching(LocationAPI* client, uint32_t sessionId) {
@@ -123,6 +160,8 @@
     };
 
     /* ==== REPORTS ======================================================================== */
+    virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
+    void handleEngineLockStatus(EngineLockState engineLockState);
     /* ======== EVENTS ====(Called from QMI Thread)========================================= */
     void reportLocationsEvent(const Location* locations, size_t count,
             BatchingMode batchingMode);
@@ -146,7 +185,6 @@
     uint32_t getBatchingTimeout() { return mBatchingTimeout; }
     void setBatchingAccuracy(uint32_t accuracy) { mBatchingAccuracy = accuracy; }
     uint32_t getBatchingAccuracy() { return mBatchingAccuracy; }
-
 };
 
 #endif /* BATCHING_ADAPTER_H */
diff --git a/core/LocAdapterBase.cpp b/core/LocAdapterBase.cpp
index 95f2728..21975ed 100644
--- a/core/LocAdapterBase.cpp
+++ b/core/LocAdapterBase.cpp
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+  /*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #define LOG_NDEBUG 0
 #define LOG_TAG "LocSvc_LocAdapterBase"
 
@@ -432,6 +469,10 @@
 LocAdapterBase::reportLatencyInfoEvent(const GnssLatencyInfo& /*gnssLatencyInfo*/)
 DEFAULT_IMPL()
 
+void
+LocAdapterBase::handleEngineLockStatusEvent(const EngineLockState engineLockState)
+DEFAULT_IMPL()
+
 bool LocAdapterBase::
     reportQwesCapabilities(const std::unordered_map<LocationQwesFeatureType, bool> &featureMap)
 DEFAULT_IMPL(false)
diff --git a/core/LocAdapterBase.h b/core/LocAdapterBase.h
index 51b2306..f2ae52e 100644
--- a/core/LocAdapterBase.h
+++ b/core/LocAdapterBase.h
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+  /*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #ifndef LOC_API_ADAPTER_BASE_H
 #define LOC_API_ADAPTER_BASE_H
 
@@ -80,6 +117,8 @@
     typedef std::map<LocationAPI*, LocationCallbacks> ClientDataMap;
     ClientDataMap mClientData;
     std::vector<LocMsg*> mPendingMsgs; // For temporal storage of msgs before Open is completed
+    std::vector<LocMsg*> mPendingGnssEnabledMsgs; // For temporal storage of msgs failed with
+                                                  // GNSS disabled error
     /* ======== UTILITIES ================================================================== */
     void saveClient(LocationAPI* client, const LocationCallbacks& callbacks);
     void eraseClient(LocationAPI* client);
@@ -237,6 +276,7 @@
     void requestCapabilitiesCommand(LocationAPI* client);
 
     virtual void reportLatencyInfoEvent(const GnssLatencyInfo& gnssLatencyInfo);
+    virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
     virtual bool reportQwesCapabilities(
             const std::unordered_map<LocationQwesFeatureType, bool> &featureMap);
 };
diff --git a/core/LocApiBase.cpp b/core/LocApiBase.cpp
index 860da2e..b571e36 100644
--- a/core/LocApiBase.cpp
+++ b/core/LocApiBase.cpp
@@ -155,7 +155,7 @@
 LocApiBase::LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
                        ContextBase* context) :
     mContext(context),
-    mMask(0), mExcludedMask(excludedMask)
+    mMask(0), mExcludedMask(excludedMask), mEngineLockState(ENGINE_LOCK_STATE_ENABLED)
 {
     memset(mLocAdapters, 0, sizeof(mLocAdapters));
 
@@ -615,6 +615,12 @@
     TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportLatencyInfoEvent(gnssLatencyInfo));
 }
 
+void LocApiBase::reportEngineLockStatus(EngineLockState engineLockState)
+{
+    // loop through adapters, and deliver to the All handling adapter.
+    TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineLockStatusEvent(engineLockState));
+}
+
 enum loc_api_adapter_err LocApiBase::
    open(LOC_API_ADAPTER_EVENT_MASK_T /*mask*/)
 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
diff --git a/core/LocApiBase.h b/core/LocApiBase.h
index cbe5f9f..6f1b04f 100644
--- a/core/LocApiBase.h
+++ b/core/LocApiBase.h
@@ -137,6 +137,7 @@
     bool isInSession();
     const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask;
     bool isMaster();
+    EngineLockState mEngineLockState;
 
 public:
     inline void sendMsg(const LocMsg* msg) const {
@@ -203,6 +204,7 @@
     void sendNfwNotification(GnssNfwNotification& notification);
     void reportGnssConfig(uint32_t sessionId, const GnssConfig& gnssConfig);
     void reportLatencyInfo(GnssLatencyInfo& gnssLatencyInfo);
+    void reportEngineLockStatus(EngineLockState engineLockState);
     void reportQwesCapabilities
     (
         const std::unordered_map<LocationQwesFeatureType, bool> &featureMap
@@ -345,6 +347,14 @@
                                               LocApiResponse* adapterResponse=nullptr);
     virtual void getConstellationMultiBandConfig(uint32_t sessionId,
                                         LocApiResponse* adapterResponse=nullptr);
+
+    inline EngineLockState getEngineLockState() {
+        return mEngineLockState;
+    }
+
+    inline void setEngineLockState(EngineLockState engineLockState) {
+        mEngineLockState = engineLockState;
+    }
 };
 
 class ElapsedRealtimeEstimator {
diff --git a/geofence/GeofenceAdapter.cpp b/geofence/GeofenceAdapter.cpp
index 1aeea0a..3fbe0a9 100644
--- a/geofence/GeofenceAdapter.cpp
+++ b/geofence/GeofenceAdapter.cpp
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #define LOG_TAG "LocSvc_GeofenceAdapter"
 
 #include <GeofenceAdapter.h>
@@ -117,25 +154,62 @@
 }
 
 void
+GeofenceAdapter::handleEngineLockStatusEvent(EngineLockState engineLockState) {
+
+    LOC_LOGD("%s]: Old Engine state %d, New Engine state : %d,", __func__,
+        mLocApi->getEngineLockState(), engineLockState);
+
+    struct MsgEngineLockStateEvent : public LocMsg {
+        GeofenceAdapter& mAdapter;
+        EngineLockState mEngineLockState;
+
+        inline MsgEngineLockStateEvent(GeofenceAdapter& adapter, EngineLockState engineLockState) :
+            LocMsg(),
+            mAdapter(adapter),
+            mEngineLockState(engineLockState){}
+
+        virtual void proc() const {
+            mAdapter.handleEngineLockStatus(mEngineLockState);
+        }
+    };
+
+    sendMsg(new MsgEngineLockStateEvent(*this, engineLockState));
+}
+
+void
+GeofenceAdapter::handleEngineLockStatus(EngineLockState engineLockState) {
+
+    if (ENGINE_LOCK_STATE_ENABLED == engineLockState) {
+        for (auto msg: mPendingGnssEnabledMsgs) {
+            sendMsg(msg);
+        }
+        mPendingGnssEnabledMsgs.clear();
+    }
+}
+
+void
 GeofenceAdapter::handleEngineUpEvent()
 {
     struct MsgSSREvent : public LocMsg {
         GeofenceAdapter& mAdapter;
-        inline MsgSSREvent(GeofenceAdapter& adapter) :
+        LocApiBase& mApi;
+        inline MsgSSREvent(GeofenceAdapter& adapter, LocApiBase& api) :
             LocMsg(),
-            mAdapter(adapter) {}
+            mAdapter(adapter),
+            mApi(api) {}
         virtual void proc() const {
             mAdapter.setEngineCapabilitiesKnown(true);
             mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
-            mAdapter.restartGeofences();
-            for (auto msg: mAdapter.mPendingMsgs) {
-                mAdapter.sendMsg(msg);
+            if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
+                mAdapter.restartGeofences();
+                for (auto msg: mAdapter.mPendingMsgs) {
+                    mAdapter.sendMsg(msg);
+                }
             }
-            mAdapter.mPendingMsgs.clear();
         }
     };
 
-    sendMsg(new MsgSSREvent(*this));
+    sendMsg(new MsgSSREvent(*this, *mLocApi));
 }
 
 void
@@ -231,7 +305,7 @@
             mCount(count),
             mIds(ids),
             mOptions(options),
-            mInfos(infos) {}
+            mInfos(infos){}
         inline virtual void proc() const {
             LocationError* errs = new LocationError[mCount];
             if (nullptr == errs) {
@@ -249,9 +323,10 @@
                         mApi.addGeofence(mIds[i], mOptions[i], mInfos[i],
                         new LocApiResponseData<LocApiGeofenceData>(*mAdapter.getContext(),
                         [&mAdapter = mAdapter, mOptions = mOptions, mClient = mClient,
-                        mCount = mCount, mIds = mIds, mInfos = mInfos, errs, i]
+                        mCount = mCount, mIds = mIds, mInfos = mInfos, errs, i, &mApi = mApi]
                         (LocationError err, LocApiGeofenceData data) {
-                            if (LOCATION_ERROR_SUCCESS == err) {
+                            if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+                                LOCATION_ERROR_SUCCESS == err) {
                                 mAdapter.saveGeofenceItem(mClient,
                                 mIds[i],
                                 data.hwId,
@@ -353,8 +428,9 @@
                         mApi.removeGeofence(hwId, mIds[i],
                         new LocApiResponse(*mAdapter.getContext(),
                         [&mAdapter = mAdapter, mCount = mCount, mClient = mClient, mIds = mIds,
-                        hwId, errs, i] (LocationError err ) {
-                            if (LOCATION_ERROR_SUCCESS == err) {
+                        hwId, errs, i, &mApi = mApi] (LocationError err ) {
+                            if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+                                LOCATION_ERROR_SUCCESS == err) {
                                 mAdapter.removeGeofenceItem(hwId);
                             }
                             errs[i] = err;
@@ -587,9 +663,10 @@
                             mApi.modifyGeofence(hwId, mIds[i], mOptions[i],
                                     new LocApiResponse(*mAdapter.getContext(),
                                     [&mAdapter = mAdapter, mCount = mCount, mClient = mClient,
-                                    mIds = mIds, mOptions = mOptions, hwId, errs, i]
+                                    mIds = mIds, mOptions = mOptions, hwId, errs, i, &mApi = mApi]
                                     (LocationError err ) {
-                                if (LOCATION_ERROR_SUCCESS == err) {
+                                if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+                                    LOCATION_ERROR_SUCCESS == err) {
                                     errs[i] = err;
 
                                     mAdapter.modifyGeofenceItem(hwId, mOptions[i]);
diff --git a/geofence/GeofenceAdapter.h b/geofence/GeofenceAdapter.h
index 38f4823..83911a9 100644
--- a/geofence/GeofenceAdapter.h
+++ b/geofence/GeofenceAdapter.h
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #ifndef GEOFENCE_ADAPTER_H
 #define GEOFENCE_ADAPTER_H
 
@@ -121,8 +158,9 @@
     LocationError getHwIdFromClient(LocationAPI* client, uint32_t clientId, uint32_t& hwId);
     LocationError getGeofenceKeyFromHwId(uint32_t hwId, GeofenceKey& key);
     void dump();
-
     /* ==== REPORTS ======================================================================== */
+    virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
+    void handleEngineLockStatus(EngineLockState engineLockState);
     /* ======== EVENTS ====(Called from QMI Thread)========================================= */
     void geofenceBreachEvent(size_t count, uint32_t* hwIds, Location& location,
                              GeofenceBreachType breachType, uint64_t timestamp);
diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp
index f3ccd99..0235d2c 100644
--- a/gnss/GnssAdapter.cpp
+++ b/gnss/GnssAdapter.cpp
@@ -170,7 +170,6 @@
     readConfigCommand();
     initDefaultAgpsCommand();
     initEngHubProxyCommand();
-
     // at last step, let us inform adapater base that we are done
     // with initialization, e.g.: ready to process handleEngineUpEvent
     doneInit();
@@ -2565,15 +2564,51 @@
 }
 
 void
+GnssAdapter::handleEngineLockStatusEvent(EngineLockState engineLockState) {
+
+    LOC_LOGD("%s]: Old Engine state %d, New Engine state : %d,",
+        __func__, mLocApi->getEngineLockState(), engineLockState);
+
+    struct MsgEngineLockStateEvent : public LocMsg {
+        GnssAdapter& mAdapter;
+        EngineLockState mEngineLockState;
+
+        inline MsgEngineLockStateEvent(GnssAdapter& adapter, EngineLockState engineLockState) :
+            LocMsg(),
+            mAdapter(adapter),
+            mEngineLockState(engineLockState) {}
+
+        virtual void proc() const {
+            mAdapter.handleEngineLockStatus(mEngineLockState);
+        }
+    };
+
+    sendMsg(new MsgEngineLockStateEvent(*this, engineLockState));
+}
+
+void
+GnssAdapter::handleEngineLockStatus(EngineLockState engineLockState) {
+
+    if (ENGINE_LOCK_STATE_ENABLED == engineLockState) {
+        for (auto msg: mPendingGnssEnabledMsgs) {
+            sendMsg(msg);
+        }
+        mPendingGnssEnabledMsgs.clear();
+    }
+}
+
+void
 GnssAdapter::handleEngineUpEvent()
 {
     LOC_LOGD("%s]: ", __func__);
 
     struct MsgHandleEngineUpEvent : public LocMsg {
         GnssAdapter& mAdapter;
-        inline MsgHandleEngineUpEvent(GnssAdapter& adapter) :
+        LocApiBase& mApi;
+        inline MsgHandleEngineUpEvent(GnssAdapter& adapter, LocApiBase& api) :
             LocMsg(),
-            mAdapter(adapter) {}
+            mAdapter(adapter),
+            mApi(api) {}
         virtual void proc() const {
             mAdapter.setEngineCapabilitiesKnown(true);
             mAdapter.broadcastCapabilities(mAdapter.getCapabilities());
@@ -2585,17 +2620,19 @@
             mAdapter.gnssSecondaryBandConfigUpdate();
             // start CDFW service
             mAdapter.initCDFWService();
-            // restart sessions
-            mAdapter.restartSessions(true);
-            for (auto msg: mAdapter.mPendingMsgs) {
-                mAdapter.sendMsg(msg);
+
+            if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState()) {
+                // restart sessions
+                mAdapter.restartSessions(true);
+                for (auto msg: mAdapter.mPendingMsgs) {
+                    mAdapter.sendMsg(msg);
+                }
             }
-            mAdapter.mPendingMsgs.clear();
         }
     };
 
     readConfigCommand();
-    sendMsg(new MsgHandleEngineUpEvent(*this));
+    sendMsg(new MsgHandleEngineUpEvent(*this, *mLocApi));
 }
 
 void
@@ -2972,9 +3009,11 @@
                     mAdapter.saveTrackingSession(mClient, mSessionId, mOptions);
                     mApi.startDistanceBasedTracking(mSessionId, mOptions,
                             new LocApiResponse(*mAdapter.getContext(),
-                            [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient]
+                            [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient,
+                            &mApi = mApi]
                             (LocationError err) {
-                        if (LOCATION_ERROR_SUCCESS != err) {
+                        if (ENGINE_LOCK_STATE_ENABLED == mApi.getEngineLockState() &&
+                            LOCATION_ERROR_SUCCESS != err) {
                             mAdapter.eraseTrackingSession(mClient, mSessionId);
                         }
                         mAdapter.reportResponse(mClient, err, mSessionId);
@@ -3081,7 +3120,8 @@
     if (!checkAndSetSPEToRunforNHz(tempOptions)) {
         mLocApi->startTimeBasedTracking(tempOptions, new LocApiResponse(*getContext(),
                           [this, client, sessionId] (LocationError err) {
-                if (LOCATION_ERROR_SUCCESS != err) {
+                if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+                    LOCATION_ERROR_SUCCESS != err) {
                     eraseTrackingSession(client, sessionId);
                 } else {
                     checkUpdateDgnssNtrip(false);
@@ -3116,7 +3156,8 @@
     if(!checkAndSetSPEToRunforNHz(tempOptions)) {
         mLocApi->startTimeBasedTracking(tempOptions, new LocApiResponse(*getContext(),
                           [this, client, sessionId, oldOptions] (LocationError err) {
-                if (LOCATION_ERROR_SUCCESS != err) {
+                if (ENGINE_LOCK_STATE_ENABLED == mLocApi->getEngineLockState() &&
+                    LOCATION_ERROR_SUCCESS != err) {
                     // restore the old LocationOptions
                     saveTrackingSession(client, sessionId, oldOptions);
                 }
@@ -3231,9 +3272,10 @@
                         if (LOCATION_ERROR_SUCCESS == err) {
                             mApi.startDistanceBasedTracking(mSessionId, mOptions,
                                     new LocApiResponse(*mAdapter.getContext(),
-                                    [&mAdapter, mClient, mSessionId, mOptions]
+                                    [&mAdapter, mClient, mSessionId, mOptions, &mApi = mApi]
                                     (LocationError err) {
-                                if (LOCATION_ERROR_SUCCESS == err) {
+                                if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+                                    LOCATION_ERROR_SUCCESS == err) {
                                     mAdapter.saveTrackingSession(mClient, mSessionId, mOptions);
                                 }
                                 mAdapter.reportResponse(mClient, err, mSessionId);
@@ -3347,9 +3389,11 @@
                 } else if (isDistanceBased) {
                     mApi.stopDistanceBasedTracking(mSessionId, new LocApiResponse(
                             *mAdapter.getContext(),
-                            [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient]
+                            [&mAdapter = mAdapter, mSessionId = mSessionId, mClient = mClient,
+                            &mApi = mApi]
                             (LocationError err) {
-                        if (LOCATION_ERROR_SUCCESS == err) {
+                        if (ENGINE_LOCK_STATE_DISABLED == mApi.getEngineLockState() ||
+                            LOCATION_ERROR_SUCCESS == err) {
                             mAdapter.eraseTrackingSession(mClient, mSessionId);
                         }
                         mAdapter.reportResponse(mClient, err, mSessionId);
diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h
index d7b4275..a9d0456 100644
--- a/gnss/GnssAdapter.h
+++ b/gnss/GnssAdapter.h
@@ -26,6 +26,43 @@
  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
+
+/*
+Changes from Qualcomm Innovation Center are provided under the following license:
+
+Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Qualcomm Innovation Center, Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
 #ifndef GNSS_ADAPTER_H
 #define GNSS_ADAPTER_H
 
@@ -487,6 +524,8 @@
     void odcpiTimerExpireEvent();
 
     /* ==== REPORTS ======================================================================== */
+    virtual void handleEngineLockStatusEvent(EngineLockState engineLockState);
+    void handleEngineLockStatus(EngineLockState engineLockState);
     /* ======== EVENTS ====(Called from QMI/EngineHub Thread)===================================== */
     virtual void reportPositionEvent(const UlpLocation& ulpLocation,
                                      const GpsLocationExtended& locationExtended,
diff --git a/location/LocationDataTypes.h b/location/LocationDataTypes.h
index b85464a..ca8281a 100644
--- a/location/LocationDataTypes.h
+++ b/location/LocationDataTypes.h
@@ -63,6 +63,7 @@
     LOCATION_ERROR_GEOFENCES_AT_MAX,
     LOCATION_ERROR_NOT_SUPPORTED,
     LOCATION_ERROR_TIMEOUT,
+    LOCATION_ERROR_GNSS_DISABLED,
 } LocationError;
 
 // Flags to indicate which values are valid in a Location
diff --git a/utils/gps_extended_c.h b/utils/gps_extended_c.h
index f368975..fc10841 100644
--- a/utils/gps_extended_c.h
+++ b/utils/gps_extended_c.h
@@ -2422,6 +2422,13 @@
 #define NETWORK_HANDLE_UNKNOWN  ~0
 #define MAX_NETWORK_HANDLES 10
 
+typedef enum {
+  ENGINE_LOCK_STATE_INVALID = 0,
+  ENGINE_LOCK_STATE_ENABLED = 1,  /**<  Location engine is enabled.  */
+  ENGINE_LOCK_STATE_DISABLED = 2, /**<  location engine is disabled. */
+  ENGINE_LOCK_STATE_MAX,
+}EngineLockState;
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */