-
Notifications
You must be signed in to change notification settings - Fork 444
[Help Wanted]: Background geolocation api request format changes while app is running #2519
Copy link
Copy link
Open
Labels
Description
Required Reading
- Confirmed
Plugin Version
5.0.3
Mobile operating-system(s)
- iOS
- Android
Device Manufacturer(s) and Model(s)
CPH2717 OnePlus
Device operating-systems(s)
Android 16
React Native / Expo version
No response
What do you require assistance about?
I am experiencing a critical issue where the plugin enters a permanent loop of 422 Unprocessable Entity errors immediately following a 403 Forbidden response.
Based on my logs, after the server rejects a request with a 403, the plugin's configuration for persistence and locationTemplate seems to be changed can you identify the issue?
[Optional] Plugin Code and/or Config
import { useEffect, useState } from "react";
import BackgroundGeolocation, {
State,
AuthorizationEvent,
HttpEvent,
} from "react-native-background-geolocation";
import { TokenManager } from "@/lib/token-manager";
import API_CONFIG from "@/config/api.config";
interface UseBackgroundGeoProps {
hubId?: string;
}
const useBackgroundGeolocation = ({ hubId }: UseBackgroundGeoProps) => {
const [enabled, setEnabled] = useState(false);
const [token, setToken] = useState<string | null>(null);
const [refreshToken, setRefreshToken] = useState<string | null>(null);
const syncLibraryTokens = async () => {
try {
const accessToken = await TokenManager.getAccessToken();
const refreshToken = await TokenManager.getRefreshToken();
if (!accessToken || !refreshToken) return;
await BackgroundGeolocation.setConfig({
authorization: {
strategy: "JWT",
accessToken: accessToken,
refreshToken: refreshToken,
refreshUrl: `${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.AUTH.REFRESH_GEO_LOCATION}`,
refreshPayload: {
"refresh_token": "{refreshToken}",
},
refreshHeaders: {
"platform-type": "app",
"app-secret-key": "Test",
},
}
});
} catch (error: any) {
if (error?.includes && error.includes("busy")) {
console.log("ℹ️ [Geo] Library busy, it will retry later.");
}
}
};
useEffect(() => {
const loadTokens = async () => {
try {
const t = await TokenManager.getAccessToken();
const rt = await TokenManager.getRefreshToken();
setToken(t);
setRefreshToken(rt);
} catch (error) {
console.error("Failed to load tokens", error);
}
};
loadTokens();
}, []);
useEffect(() => {
BackgroundGeolocation.onLocation((location) => {
console.log("📍 LOCATION DETECTED", {
lat: location.coords.latitude,
lng: location.coords.longitude,
accuracy: location.coords.accuracy,
event: location.event,
odometer: location.odometer,
});
});
BackgroundGeolocation.onMotionChange((motion) => {
console.log("Motion change", motion);
});
BackgroundGeolocation.onAuthorization(async (event: AuthorizationEvent) => {
if (event.success) {
await TokenManager.setTokens(
event.response?.access_token || event.response?.data?.access_token,
event.response?.refresh_token || event.response?.data?.refresh_token
);
} else {
syncLibraryTokens();
}
});
BackgroundGeolocation.onHttp((response: HttpEvent) => {
console.log(`[http] ${response.status} ${response.responseText}`);
});
BackgroundGeolocation.ready({
geolocation: {
desiredAccuracy: BackgroundGeolocation.DesiredAccuracy.Navigation,
locationUpdateInterval: 5000,
fastestLocationUpdateInterval: 5000,
locationAuthorizationRequest: BackgroundGeolocation.LocationRequest.Always,
distanceFilter:0
},
app: {
stopOnTerminate: false,
startOnBoot: true,
enableHeadless: true,
notification: {
title: "Background Geolocation",
text: "Tracking location",
smallIcon: "mipmap/ic_launcher",
sticky: true,
},
},
logger: {
logLevel: BackgroundGeolocation.LogLevel.Verbose,
debug:false,
logMaxDays:1
},
http: {
url: `${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.RIDER.UPDATE_LOCATION}`,
method: "POST",
autoSync: true,
batchSync: true,
rootProperty: "data",
maxBatchSize:100,
headers: {
"Content-Type": "application/json",
"platform-type": "app",
"app-secret-key": "Test",
},
},
}).then((state: State) => {
console.log("[ready] Plugin initialized, enabled:", state.enabled);
setEnabled(state.enabled);
});
return () => {
BackgroundGeolocation.removeListeners();
};
}, []); /// axios file -import { API_CONFIG } from "@/config/api.config";
import { APP_CONFIG } from "@/config/app.config";
import { store } from "@/store";
import { clearUser } from "@/store/userSlice";
import axios, {
AxiosError,
AxiosResponse,
InternalAxiosRequestConfig,
} from "axios";
import { router } from "expo-router";
import { TokenManager } from "./token-manager";
import BackgroundGeolocation from "react-native-background-geolocation";
const axiosInstance = axios.create({
baseURL: API_CONFIG.BASE_URL,
timeout: API_CONFIG.TIMEOUT,
headers: {
"Content-Type": "application/json",
"platform-type": process.env.EXPO_PUBLIC_PLATFORM_TYPE,
"app-secret-key": process.env.EXPO_PUBLIC_APP_SECRET_KEY,
},
});
axiosInstance.interceptors.request.use(
async (config: InternalAxiosRequestConfig) => {
const authHeader = await TokenManager.getAuthHeader();
if (authHeader.Authorization && config.headers) {
config.headers.Authorization = authHeader.Authorization;
}
if (APP_CONFIG.ENABLE_NETWORK_LOGGER) {
console.log("API Request:", {
method: config.method?.toUpperCase(),
url: config.url,
data: config.data,
Authorization: config.headers.Authorization,
});
}
return config;
},
(error: AxiosError) => {
console.error("Request Error:", error);
return Promise.reject(error);
},
);
axiosInstance.interceptors.response.use(
(response: AxiosResponse) => {
if (APP_CONFIG.ENABLE_NETWORK_LOGGER) {
console.log("API Response:", {
status: response.status,
url: response.config.url,
data: response.data,
});
}
return response;
},
async (error: AxiosError) => {
// If there's no response (network error), keep existing behavior
if (!error.response) {
if (error.message === "Network Error") {
console.error(
"Network Error - please check your internet connection.",
error.message,
);
} else {
console.error("Error:", error.message);
}
return Promise.reject(error);
}
try {
const { status } = error.response;
const originalConfig = error.config as InternalAxiosRequestConfig & {
_retry?: boolean;
};
// Avoid attempting refresh for login-related APIs or refresh endpoint itself
const isLoginAPI =
originalConfig?.url?.includes("/auth/login") ||
originalConfig?.url?.includes("/auth/verify-login-otp");
const isRefreshAPI = originalConfig?.url?.includes(
API_CONFIG.ENDPOINTS.AUTH.REFRESH,
);
// handle 401 with refresh-token flow (skip if login/refresh endpoints)
if (status === 401 && !isLoginAPI && !isRefreshAPI) {
// queue + single-refresh mechanism
type QueueItem = {
resolve: (value?: unknown) => void;
reject: (error?: unknown) => void;
config: InternalAxiosRequestConfig;
};
let isRefreshing = (axiosInstance as any).__isRefreshing as
| boolean
| undefined;
let failedQueue = (axiosInstance as any).__failedQueue as
| QueueItem[]
| undefined;
if (!failedQueue) {
failedQueue = [];
(axiosInstance as any).__failedQueue = failedQueue;
}
const processQueue = (err: any, token: string | null = null) => {
failedQueue!.forEach((prom) => {
if (err) {
prom.reject(err);
} else {
if (prom.config.headers) {
prom.config.headers.Authorization = token
? `Bearer ${token}`
: undefined;
}
prom.resolve(axiosInstance(prom.config));
}
});
(axiosInstance as any).__failedQueue = [];
};
// If we've already tried to refresh, queue this request
if (isRefreshing) {
console.log(
"⏳ [REFRESH] Refresh in progress, queuing request:",
originalConfig.url,
);
return new Promise((resolve, reject) => {
failedQueue!.push({ resolve, reject, config: originalConfig });
});
}
(axiosInstance as any).__isRefreshing = true;
console.log("🔄 [REFRESH] Starting token refresh flow...");
try {
const refreshToken = await TokenManager.getRefreshToken();
if (!refreshToken) {
console.warn("⚠️ [REFRESH] No refresh token found - logging out");
// nothing to do: force logout
await TokenManager.clearTokens();
store.dispatch(clearUser());
try {
router.replace("/Login");
} catch (navErr) {
console.warn("Router navigation failed:", navErr);
}
return Promise.reject(error);
}
console.log("📤 [REFRESH] Calling refresh endpoint...");
// Call refresh endpoint using a bare axios instance to avoid interceptor loops
const refreshUrl = `${API_CONFIG.BASE_URL.replace(
/\/$/,
"",
)}/${API_CONFIG.ENDPOINTS.AUTH.REFRESH.replace(/^\//, "")}`;
const refreshPayload = { data: { refresh_token: refreshToken } };
const refreshResponse = await axios.post(refreshUrl, refreshPayload, {
headers: { "Content-Type": "application/json" },
timeout: API_CONFIG.TIMEOUT,
});
console.log("✅ [REFRESH] Refresh successful, updating tokens...");
const newAccess =
refreshResponse?.data?.data?.access_token ||
refreshResponse?.data?.access_token;
const newRefresh =
refreshResponse?.data?.data?.refresh_token ||
refreshResponse?.data?.refresh_token;
if (!newAccess) {
throw new Error("Refresh did not return new access token");
}
BackgroundGeolocation.setConfig({
authorization: {
strategy: "JWT",
accessToken: newAccess,
refreshToken: newRefresh,
refreshUrl: `${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.AUTH.REFRESH_GEO_LOCATION}`,
refreshPayload: {
refresh_token: "{refreshToken}",
},
},
}).catch(e => console.log("Library busy, skipping manual push."));;
await TokenManager.setTokens(newAccess, newRefresh ?? refreshToken);
// update axiosInstance default header
axiosInstance.defaults.headers.Authorization = `Bearer ${newAccess}`;
console.log(
`✅ [REFRESH] Processing ${failedQueue.length} queued requests...`,
);
processQueue(null, newAccess);
// retry original request with new token
if (originalConfig.headers) {
originalConfig.headers.Authorization = `Bearer ${newAccess}`;
}
console.log("🔁 [REFRESH] Retrying original request with new token");
return axiosInstance(originalConfig);
} catch (refreshErr) {
console.error("❌ [REFRESH] Refresh failed:", refreshErr,refreshErr?.response?.data);
processQueue(refreshErr, null);
// clear tokens and force logout
try {
await TokenManager.clearTokens();
} catch {
/* ignore */
}
store.dispatch(clearUser());
try {
router.replace("/Login");
} catch (navErr) {
console.warn("Router navigation failed:", navErr);
}
return Promise.reject(refreshErr);
} finally {
(axiosInstance as any).__isRefreshing = false;
}
}
// Handle 401 for login/refresh endpoints (no refresh attempt)
if (status === 401 && (isLoginAPI || isRefreshAPI)) {
await TokenManager.clearTokens();
store.dispatch(clearUser());
try {
if (!isLoginAPI) {
router.replace("/Login");
}
} catch (navErr) {
console.warn("Router navigation failed:", navErr);
}
}
// other status codes can be handled here if needed
} catch (err) {
console.log(err);
if (err instanceof Error && err.message === "NEXT_REDIRECT") {
console.log(err.message);
throw err;
}
}
return Promise.reject(error);
},
);
export default axiosInstance;
useEffect(() => {
if (!token || !refreshToken || !hubId) return;
BackgroundGeolocation.setConfig({
persistence: {
locationTemplate:
'{"lat":<%= latitude %>,"lng":<%= longitude %>,"timestamp": "<%= timestamp %>"}',
extras: {
hub_id: hubId,
},
},
geolocation: {
desiredAccuracy: BackgroundGeolocation.DesiredAccuracy.Navigation,
locationUpdateInterval: 5000,
fastestLocationUpdateInterval: 5000,
locationAuthorizationRequest: BackgroundGeolocation.LocationRequest.Always,
distanceFilter:0
},
http: {
url: `${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.RIDER.UPDATE_LOCATION}`,
method: "POST",
autoSync: true,
batchSync: true,
rootProperty: "data",
maxBatchSize:100,
headers: {
"Content-Type": "application/json",
"platform-type": "app",
"app-secret-key": "Test",
},
},
authorization: {
strategy: "JWT",
accessToken: token,
refreshToken: refreshToken,
refreshUrl: `${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.AUTH.REFRESH_GEO_LOCATION}`,
refreshPayload: {
"refresh_token": "{refreshToken}",
},
refreshHeaders: {
"platform-type": "app",
"app-secret-key": "Test",
},
},
}).then(() => {
BackgroundGeolocation.getState().then((state) => {
if (!state.enabled) {
BackgroundGeolocation.start();
setEnabled(true);
}
});
});
}, [token, refreshToken, hubId]);
const handldeCloseGeoLocation = () => {
BackgroundGeolocation.stop().then(() => {
console.log("geolocation sdk is off now");
setEnabled(false);
});
};
return { enabled, setEnabled, handldeCloseGeoLocation };
};
export default useBackgroundGeolocation;
// index.js file
import AsyncStorage from "@react-native-async-storage/async-storage";
import "expo-router/entry";
import BackgroundGeolocation from "react-native-background-geolocation";
const BgHeadlessTask = async (event) => {
const { name, params } = event;
if (name === "authorization") {
try {
const { access_token, refresh_token } = params?.response?.data || {};
if (access_token && refresh_token) {
await AsyncStorage.multiSet([
["access_token", access_token],
["refresh_token", refresh_token]
]);
}
} catch (error) {
console.error("[HeadlessTask] Storage Error:", error);
}
}
return Promise.resolve();
};
BackgroundGeolocation.registerHeadlessTask(BgHeadlessTask);[Optional] Relevant log output
║ HTTP Service (count: 1)
╠═════════════════════════════════════════════
03-02 14:34:54.557 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2431
03-02 14:34:54.597 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 82
03-02 14:34:54.602 DEBUG [d0 a]
✅ Locked 1 records
03-02 14:34:54.603 INFO [HttpService a]
🔵 HTTP POST batch (1)
03-02 14:34:54.708 INFO [HttpService$e onResponse]
🔵 Response: 204
03-02 14:34:54.711 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ http
03-02 14:34:54.712 DEBUG [d0 a]
✅ DELETED: (1)
03-02 14:34:54.715 DEBUG [TSLog d] 💀 event: http
03-02 14:34:54.721 DEBUG [d0 a]
✅ Locked 0 records
03-02 14:34:54.722 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 82
03-02 14:34:54.723 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2432
03-02 14:34:59.530 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5226, eventCount: 1]
03-02 14:34:59.531 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=21.879 et=+6d19h54m27s117ms alt=162.8000030517578 vAcc=1.039805 vel=0.0 sAcc=0.8]
╟─ Age: 154ms, time: 1772442299376
03-02 14:34:59.532 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:34:59.533 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=21.879, acc(prev)=1.3}
03-02 14:34:59.534 INFO [d0 a]
💾 ✅ 7b8c4471-112c-432f-b427-1dd50fe3df72
03-02 14:34:59.535 INFO [TrackingService b]
ℹ️ Distance from stoppedAtLocation: 119.041
03-02 14:34:59.535 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5226, eventCount: 0, sticky: true]
03-02 14:34:59.536 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ location
03-02 14:34:59.536 DEBUG [TSLog d] 💀 event: location
03-02 14:34:59.537 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 1)
╠═════════════════════════════════════════════
03-02 14:34:59.538 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2433
03-02 14:34:59.565 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 83
03-02 14:34:59.569 DEBUG [d0 a]
✅ Locked 1 records
03-02 14:34:59.573 INFO [HttpService a]
🔵 HTTP POST batch (1)
03-02 14:34:59.674 INFO [HttpService$e onResponse]
🔵 Response: 204
03-02 14:34:59.676 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ http
03-02 14:34:59.677 DEBUG [d0 a]
✅ DELETED: (1)
03-02 14:34:59.677 DEBUG [TSLog d] 💀 event: http
03-02 14:34:59.683 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2434
03-02 14:34:59.686 DEBUG [d0 a]
✅ Locked 0 records
03-02 14:34:59.687 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 83
03-02 14:35:04.405 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5227, eventCount: 1]
03-02 14:35:04.407 INFO [TrackingService b]
ℹ️ Location availability: false
03-02 14:35:04.408 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5227, eventCount: 0, sticky: true]
03-02 14:35:04.490 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5228, eventCount: 1]
03-02 14:35:04.492 INFO [TrackingService b]
ℹ️ Location availability: true
03-02 14:35:04.492 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5228, eventCount: 0, sticky: true]
03-02 14:35:04.520 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5229, eventCount: 1]
03-02 14:35:04.521 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.5 et=+6d19h54m32s109ms alt=162.8000030517578 vAcc=1.075651 vel=0.0 sAcc=0.5]
╟─ Age: 153ms, time: 1772442304368
03-02 14:35:04.521 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:04.522 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=1.5, acc(prev)=21.879}
03-02 14:35:04.523 INFO [TrackingService b]
ℹ️ Distance from stoppedAtLocation: 139.42
03-02 14:35:04.523 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5229, eventCount: 0, sticky: true]
03-02 14:35:04.527 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ location
03-02 14:35:04.527 DEBUG [TSLog d] 💀 event: location
03-02 14:35:04.528 INFO [d0 a]
💾 ✅ dde8d2f7-5e97-4a4b-9c0c-84f5411cfff3
03-02 14:35:04.530 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2435
03-02 14:35:04.530 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 1)
╠═════════════════════════════════════════════
03-02 14:35:04.550 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 84
03-02 14:35:04.556 DEBUG [d0 a]
✅ Locked 1 records
03-02 14:35:04.556 INFO [HttpService a]
🔵 HTTP POST batch (1)
03-02 14:35:04.665 INFO [HttpService$e onResponse]
🔵 Response: 204
03-02 14:35:04.666 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ http
03-02 14:35:04.666 DEBUG [d0 a]
✅ DELETED: (1)
03-02 14:35:04.666 DEBUG [TSLog d] 💀 event: http
03-02 14:35:04.669 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2436
03-02 14:35:04.673 DEBUG [d0 a]
✅ Locked 0 records
03-02 14:35:04.674 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 84
03-02 14:35:09.546 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5230, eventCount: 1]
03-02 14:35:09.549 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.1 et=+6d19h54m37s113ms alt=162.8000030517578 vAcc=1.0263518 vel=0.0 sAcc=0.5]
╟─ Age: 177ms, time: 1772442309371
03-02 14:35:09.550 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:09.551 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=1.1, acc(prev)=1.5}
03-02 14:35:09.551 INFO [TrackingService b]
ℹ️ Distance from stoppedAtLocation: 139.81999
03-02 14:35:09.552 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5230, eventCount: 0, sticky: true]
03-02 14:35:09.561 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ location
03-02 14:35:09.562 DEBUG [TSLog d] 💀 event: location
03-02 14:35:09.562 INFO [d0 a]
💾 ✅ ce4ba196-6269-4ec0-91e6-ccc51f1afc88
03-02 14:35:09.566 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 1)
╠═════════════════════════════════════════════
03-02 14:35:09.566 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2437
03-02 14:35:09.612 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 85
03-02 14:35:09.615 DEBUG [d0 a]
✅ Locked 1 records
03-02 14:35:09.616 INFO [HttpService a]
🔵 HTTP POST batch (1)
03-02 14:35:09.724 INFO [HttpService$e onResponse]
🔵 Response: 204
03-02 14:35:09.726 DEBUG [d0 a]
✅ DELETED: (1)
03-02 14:35:09.726 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ http
03-02 14:35:09.727 DEBUG [TSLog d] 💀 event: http
03-02 14:35:09.734 DEBUG [d0 a]
✅ Locked 0 records
03-02 14:35:09.734 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2438
03-02 14:35:09.735 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 85
03-02 14:35:14.430 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5231, eventCount: 1]
03-02 14:35:14.430 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.5 et=+6d19h54m42s99ms alt=162.8000030517578 vAcc=1.0133715 vel=0.0 sAcc=0.7]
╟─ Age: 73ms, time: 1772442314358
03-02 14:35:14.431 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:14.432 INFO [TrackingService b]
ℹ️ Distance from stoppedAtLocation: 139.42
03-02 14:35:14.432 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5231, eventCount: 0, sticky: true]
03-02 14:35:14.432 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=1.5, acc(prev)=1.1}
03-02 14:35:14.434 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ location
03-02 14:35:14.434 DEBUG [TSLog d] 💀 event: location
03-02 14:35:14.436 INFO [d0 a]
💾 ✅ 5897175d-88f4-463c-b39e-423eed7fb36f
03-02 14:35:14.436 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2439
03-02 14:35:14.438 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 1)
╠═════════════════════════════════════════════
03-02 14:35:14.453 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 86
03-02 14:35:14.455 DEBUG [d0 a]
✅ Locked 1 records
03-02 14:35:14.455 INFO [HttpService a]
🔵 HTTP POST batch (1)
03-02 14:35:14.545 INFO [HttpService$e onResponse]
🔵 Response: 204
03-02 14:35:14.546 DEBUG [HeadlessEventTx a] 💀 🛜 ⚡️ http
03-02 14:35:14.546 DEBUG [TSLog d] 💀 event: http
03-02 14:35:14.546 DEBUG [d0 a]
✅ DELETED: (1)
03-02 14:35:14.547 DEBUG [TSLog d] [onHeadlessJsTaskFinish] taskId: 2440
03-02 14:35:14.548 DEBUG [d0 a]
✅ Locked 0 records
03-02 14:35:14.548 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 86
03-02 14:35:15.943 DEBUG [LifecycleManager g] ☯️ onStart
03-02 14:35:15.959 DEBUG [LifecycleManager f] ☯️ onResume
03-02 14:35:16.298 INFO [ActivityRecognitionService d]
🎾 Start motion-activity updates
03-02 14:35:16.302 INFO [ActivityRecognitionService d]
🎾 Start motion-activity updates
03-02 14:35:16.303 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 0)
╠═════════════════════════════════════════════
03-02 14:35:16.312 DEBUG [LocationAuthorization withBackgroundPermission]
ℹ️ LocationAuthorization: Permission granted
03-02 14:35:16.313 DEBUG [TSGeofenceManager$d run]
╔═════════════════════════════════════════════
║ TSGeofenceManager monitoring 0/0
╠═════════════════════════════════════════════
╚═════════════════════════════════════════════
03-02 14:35:16.313 DEBUG [EventManager a] 🛜 ⚡️ geofenceschange
03-02 14:35:16.353 DEBUG [EventManager a] 🛜 ⚡️ providerchange
03-02 14:35:16.358 DEBUG [HttpService startMonitoringConnectivityChanges]
🎾 Start monitoring connectivity changes
03-02 14:35:16.359 DEBUG [DeviceSettings startMonitoringPowerSaveChanges]
🎾 Start monitoring powersave changes
03-02 14:35:16.361 INFO [ActivityRecognitionService d]
🎾 Start motion-activity updates
03-02 14:35:16.365 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: true
03-02 14:35:16.415 DEBUG [SingleLocationRequest trySatisfyLastLocation] 📍
╟─ age: 1057ms
╟─ maximumAge: 30000
╟─ desiredAccuracy: 20.0
╟─ meetsAccuracy: true
╟─ meetsStaleness: true
03-02 14:35:16.416 INFO [TSLocationManager a]
╔═════════════════════════════════════════════
║ motionchange LocationResult: 1 (1058ms old)
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.5 et=+6d19h54m43s99ms alt=162.8000030517578 vAcc=1.023373 vel=0.0 sAcc=0.8], time: 1772442315358
03-02 14:35:16.416 INFO [Odometer b]
ℹ️ Update odometer: 88690.44 (± 656.27m)
03-02 14:35:16.416 INFO [TSLocationManager onSingleLocationResult]
🔵 MOTIONCHANGE isMoving=true df=0.0 — resetting short-term filter state
03-02 14:35:16.416 INFO [TSLocationManager onSingleLocationResult]
🔵 Acquired motionchange position, isMoving: true
03-02 14:35:16.423 DEBUG [EventManager a] 🛜 ⚡️ location
03-02 14:35:16.423 DEBUG [EventManager a] 🛜 ⚡️ motionchange
03-02 14:35:16.423 INFO [TSLocationManager a]
🔴 Location-services: OFF
03-02 14:35:16.424 INFO [TSLocationManager requestLocationUpdates]
🎾 Location-services: ON
03-02 14:35:16.425 INFO [ActivityRecognitionService d]
🎾 Start motion-activity updates
03-02 14:35:16.491 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5232, eventCount: 1]
03-02 14:35:16.492 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.5 et=+6d19h54m43s99ms alt=162.8000030517578 vAcc=1.023373 vel=0.0 sAcc=0.8]
╟─ Age: 1134ms, time: 1772442315358
03-02 14:35:16.492 INFO [TrackingService b]
ℹ️ Distance from stoppedAtLocation: 139.42
03-02 14:35:16.492 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5232, eventCount: 0, sticky: true]
03-02 14:35:16.492 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:16.492 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=1.5, acc(prev)=1.5}
03-02 14:35:16.494 INFO [d0 a]
💾 ✅ ed957acc-1940-4c90-8c2a-7d67fd0929ea
03-02 14:35:16.495 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 1)
╠═════════════════════════════════════════════
03-02 14:35:16.502 DEBUG [EventManager a] 🛜 ⚡️ location
03-02 14:35:16.514 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 87
03-02 14:35:16.526 DEBUG [d0 a]
✅ Locked 1 records
03-02 14:35:16.527 INFO [HttpService a]
🔵 HTTP POST batch (1)
03-02 14:35:16.584 WARN [HttpService$e onResponse]
⚠️ Response: 403,
03-02 14:35:16.584 DEBUG [d0 b]
✅ UNLOCKED (1)
03-02 14:35:16.585 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 87
03-02 14:35:16.595 DEBUG [TSLocationManagerActivity a] locationsettings
03-02 14:35:16.603 DEBUG [EventManager a] 🛜 ⚡️ http
03-02 14:35:16.630 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: false
03-02 14:35:16.632 INFO [TSScheduleManager oneShot]
⏰ Scheduled OneShot: TERMINATE_EVENT in 10000ms (jobID: -1708771588)
03-02 14:35:16.657 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: true
03-02 14:35:16.658 INFO [TSScheduleManager cancelOneShot]
⏰ Cancel OneShot: TERMINATE_EVENT
03-02 14:35:16.673 DEBUG [TSLocationManagerActivity onDestroy] locationsettings
03-02 14:35:17.146 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: false
03-02 14:35:17.151 INFO [TSScheduleManager oneShot]
⏰ Scheduled OneShot: TERMINATE_EVENT in 10000ms (jobID: -1708771588)
03-02 14:35:17.522 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: true
03-02 14:35:17.522 INFO [TSScheduleManager cancelOneShot]
⏰ Cancel OneShot: TERMINATE_EVENT
03-02 14:35:17.529 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: false
03-02 14:35:17.530 INFO [TSScheduleManager oneShot]
⏰ Scheduled OneShot: TERMINATE_EVENT in 10000ms (jobID: -1708771588)
03-02 14:35:17.582 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: true
03-02 14:35:17.583 INFO [TSScheduleManager cancelOneShot]
⏰ Cancel OneShot: TERMINATE_EVENT
03-02 14:35:17.614 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: false
03-02 14:35:17.622 INFO [TSScheduleManager oneShot]
⏰ Scheduled OneShot: TERMINATE_EVENT in 10000ms (jobID: -1708771588)
03-02 14:35:17.683 INFO [TSScheduleManager cancelOneShot]
⏰ Cancel OneShot: TERMINATE_EVENT
03-02 14:35:17.683 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: true
03-02 14:35:18.592 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: false
03-02 14:35:18.592 INFO [TSScheduleManager oneShot]
⏰ Scheduled OneShot: TERMINATE_EVENT in 10000ms (jobID: -1708771588)
03-02 14:35:18.655 DEBUG [LifecycleManager d] ☯️ onWindowFocusChanged: true
03-02 14:35:18.656 INFO [TSScheduleManager cancelOneShot]
⏰ Cancel OneShot: TERMINATE_EVENT
03-02 14:35:23.066 DEBUG [AbstractService a]
🎾 start [ActivityRecognitionService startId: 1, eventCount: 1]
03-02 14:35:23.068 DEBUG [ActivityRecognitionService a]
🚘 ️DetectedActivity [type=TILTING, confidence=100]
03-02 14:35:23.070 DEBUG [AbstractService a]
⚙️︎ FINISH [ActivityRecognitionService startId: 1, eventCount: 0, sticky: false]
03-02 14:35:23.102 DEBUG [AbstractService a]
🎾 start [ActivityRecognitionService startId: 2, eventCount: 1]
03-02 14:35:23.103 DEBUG [ActivityRecognitionService a]
🚘 ️DetectedActivity [type=STILL, confidence=37]
03-02 14:35:23.117 DEBUG [AbstractService a]
⚙️︎ FINISH [ActivityRecognitionService startId: 2, eventCount: 0, sticky: false]
03-02 14:35:23.124 DEBUG [AbstractService a]
🎾 STOP_TIMEOUT [TrackingService startId: 5233, eventCount: 1]
03-02 14:35:23.124 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5233, eventCount: 0, sticky: true]
03-02 14:35:23.133 DEBUG [AbstractService a]
🎾 start [ActivityRecognitionService startId: 3, eventCount: 1]
03-02 14:35:23.134 DEBUG [EventManager a] 🛜 ⚡️ activitychange
03-02 14:35:23.135 INFO [TSScheduleManager cancelOneShot]
⏰ Cancel OneShot: STOP_TIMEOUT
03-02 14:35:23.138 INFO [l c]
🔴 Stop heartbeat
03-02 14:35:23.143 INFO [TrackingService a]
🔵 setPace: true → true
03-02 14:35:23.143 INFO [ActivityRecognitionService a]
╔═════════════════════════════════════════════
║ Motion Transition Result
╠═════════════════════════════════════════════
╟─ 🎾 ENTER: in_vehicle
╚═════════════════════════════════════════════
03-02 14:35:23.143 DEBUG [AbstractService a]
⚙️︎ FINISH [ActivityRecognitionService startId: 3, eventCount: 0, sticky: false]
03-02 14:35:23.147 DEBUG [SingleLocationRequest trySatisfyLastLocation] 📍
╟─ age: 3775ms
╟─ maximumAge: 30000
╟─ desiredAccuracy: 20.0
╟─ meetsAccuracy: true
╟─ meetsStaleness: true
03-02 14:35:23.148 INFO [TSLocationManager a]
╔═════════════════════════════════════════════
║ motionchange LocationResult: 2 (3776ms old)
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.625 et=+6d19h54m47s113ms alt=162.8000030517578 vAcc=1.0635158 vel=0.0 sAcc=0.6], time: 1772442319371
03-02 14:35:23.148 INFO [Odometer b]
ℹ️ Update odometer: 88690.44 (± 656.29m)
03-02 14:35:23.148 INFO [TSLocationManager onSingleLocationResult]
🔵 MOTIONCHANGE isMoving=true df=0.0 — resetting short-term filter state
03-02 14:35:23.148 INFO [TSLocationManager onSingleLocationResult]
🔵 Acquired motionchange position, isMoving: true
03-02 14:35:23.151 INFO [TSLocationManager a]
🔴 Location-services: OFF
03-02 14:35:23.152 INFO [TSLocationManager requestLocationUpdates]
🎾 Location-services: ON
03-02 14:35:23.153 DEBUG [AbstractService a]
🎾 motionchange [TrackingService startId: 5234, eventCount: 1]
03-02 14:35:23.154 INFO [TrackingService l]
╔═════════════════════════════════════════════
║ TrackingService motionchange: true
╠═════════════════════════════════════════════
03-02 14:35:23.154 INFO [d0 a]
💾 ✅ b861e755-0ef5-46a3-b378-3b4730ea46fb
03-02 14:35:23.154 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5234, eventCount: 0, sticky: true]
03-02 14:35:23.156 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 2)
╠═════════════════════════════════════════════
03-02 14:35:23.162 INFO [ActivityRecognitionService d]
🎾 Start motion-activity updates
03-02 14:35:23.163 DEBUG [AbstractService a]
🎾 start [ActivityRecognitionService startId: 4, eventCount: 1]
03-02 14:35:23.164 DEBUG [EventManager a] 🛜 ⚡️ location
03-02 14:35:23.164 DEBUG [EventManager a] 🛜 ⚡️ motionchange
03-02 14:35:23.165 DEBUG [EventManager a] 🛜 ⚡️ activitychange
03-02 14:35:23.165 INFO [ActivityRecognitionService a]
╔═════════════════════════════════════════════
║ Motion Transition Result
╠═════════════════════════════════════════════
╟─ 🎾 ENTER: in_vehicle
╚═════════════════════════════════════════════
03-02 14:35:23.165 DEBUG [AbstractService a]
⚙️︎ FINISH [ActivityRecognitionService startId: 4, eventCount: 0, sticky: false]
03-02 14:35:23.174 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5235, eventCount: 1]
03-02 14:35:23.175 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.625 et=+6d19h54m47s113ms alt=162.8000030517578 vAcc=1.0635158 vel=0.0 sAcc=0.6]
╟─ Age: 3802ms, time: 1772442319371
03-02 14:35:23.175 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:23.175 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=1.625, acc(prev)=1.5}
03-02 14:35:23.175 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5235, eventCount: 0, sticky: true]
03-02 14:35:23.176 DEBUG [EventManager a] 🛜 ⚡️ location
03-02 14:35:23.176 INFO [d0 a]
💾 ✅ 020da855-d1df-4c8b-a614-946169ab3163
03-02 14:35:23.178 INFO [HttpService flush]
ℹ️ HttpService is busy
03-02 14:35:23.185 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 88
03-02 14:35:23.187 DEBUG [d0 a]
✅ Locked 3 records
03-02 14:35:23.187 INFO [HttpService a]
🔵 HTTP POST batch (3)
03-02 14:35:23.272 WARN [HttpService$e onResponse]
⚠️ Response: 422,
03-02 14:35:23.272 DEBUG [EventManager a] 🛜 ⚡️ http
03-02 14:35:23.273 DEBUG [d0 b]
✅ UNLOCKED (3)
03-02 14:35:23.276 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 88
03-02 14:35:23.374 DEBUG [AbstractService f]
⚙️︎ ActivityRecognitionService.stopSelfResult(4): true
03-02 14:35:23.375 DEBUG [AbstractService onDestroy]
🔴 ActivityRecognitionService stopped
03-02 14:35:27.106 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5236, eventCount: 1]
03-02 14:35:27.108 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=96.11 et=+6d19h54m53s472ms alt=162.8000030517578 vAcc=1.0]
╟─ Age: 1377ms, time: 1772442325730
03-02 14:35:27.108 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:27.109 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=96.11, acc(prev)=1.625}
03-02 14:35:27.109 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5236, eventCount: 0, sticky: true]
03-02 14:35:27.110 DEBUG [EventManager a] 🛜 ⚡️ location
03-02 14:35:27.111 INFO [d0 a]
💾 ✅ da1f67b8-133c-457e-bc23-f8c5fa9ae933
03-02 14:35:27.120 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 4)
╠═════════════════════════════════════════════
03-02 14:35:27.171 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 89
03-02 14:35:27.178 DEBUG [d0 a]
✅ Locked 4 records
03-02 14:35:27.179 INFO [HttpService a]
🔵 HTTP POST batch (4)
03-02 14:35:27.279 WARN [HttpService$e onResponse]
⚠️ Response: 422,
03-02 14:35:27.280 DEBUG [EventManager a] 🛜 ⚡️ http
03-02 14:35:27.281 DEBUG [d0 b]
✅ UNLOCKED (4)
03-02 14:35:27.286 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 89
03-02 14:35:33.231 DEBUG [AbstractService a]
🎾 start [ActivityRecognitionService startId: 1, eventCount: 1]
03-02 14:35:33.232 DEBUG [ActivityRecognitionService a]
🚘 ️DetectedActivity [type=TILTING, confidence=100]
03-02 14:35:33.232 DEBUG [AbstractService a]
⚙️︎ FINISH [ActivityRecognitionService startId: 1, eventCount: 0, sticky: false]
03-02 14:35:33.256 DEBUG [AbstractService a]
🎾 start [ActivityRecognitionService startId: 2, eventCount: 1]
03-02 14:35:33.256 INFO [ActivityRecognitionService a]
╔═════════════════════════════════════════════
║ Motion Transition Result
╠═════════════════════════════════════════════
╟─ 🎾 ENTER: in_vehicle
╚═════════════════════════════════════════════
03-02 14:35:33.256 DEBUG [AbstractService a]
⚙️︎ FINISH [ActivityRecognitionService startId: 2, eventCount: 0, sticky: false]
03-02 14:35:33.256 DEBUG [EventManager a] 🛜 ⚡️ activitychange
03-02 14:35:33.400 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5237, eventCount: 1]
03-02 14:35:33.401 INFO [TrackingService b]
ℹ️ Location availability: false
03-02 14:35:33.401 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5237, eventCount: 0, sticky: true]
03-02 14:35:33.422 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5238, eventCount: 1]
03-02 14:35:33.423 INFO [TrackingService b]
ℹ️ Location availability: true
03-02 14:35:33.423 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5238, eventCount: 0, sticky: true]
03-02 14:35:33.426 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5239, eventCount: 1]
03-02 14:35:33.426 DEBUG [TrackingService c]
╔═════════════════════════════════════════════
║ TrackingService: LocationResult
╠═════════════════════════════════════════════
╟─ 📍 Location[fused 28.38****,77.29**** hAcc=1.6 et=+6d19h55m1s96ms alt=162.8000030517578 vAcc=1.0762452 vel=0.0 sAcc=0.5]
╟─ Age: 71ms, time: 1772442333355
03-02 14:35:33.427 DEBUG [AbstractService a]
⚙️︎ FINISH [TrackingService startId: 5239, eventCount: 0, sticky: true]
03-02 14:35:33.427 DEBUG [TSLocationManager onLocationResult]
╔═════════════════════════════════════════════
║ Process LocationResult
╠═════════════════════════════════════════════
03-02 14:35:33.427 DEBUG [TSLocationManager onLocationResult] LocationFilterResult: LocationFilterResult{decision=ADJUSTED, reason='kinematic-cap', selected=0.0, raw=0.0, effective=0.0, anomaly=false, acc(cur)=1.6, acc(prev)=96.11}
03-02 14:35:33.429 DEBUG [EventManager a] 🛜 ⚡️ location
03-02 14:35:33.429 INFO [d0 a]
💾 ✅ 8a1ab568-f31e-4ea6-b5ba-2b38705316b7
03-02 14:35:33.430 INFO [HttpService flush]
╔═════════════════════════════════════════════
║ HTTP Service (count: 5)
╠═════════════════════════════════════════════
03-02 14:35:33.444 INFO [BackgroundTaskManager$a a] ⏳ startBackgroundTask: 90
03-02 14:35:33.449 DEBUG [d0 a]
✅ Locked 5 records
03-02 14:35:33.449 INFO [HttpService a]
🔵 HTTP POST batch (5)
03-02 14:35:33.457 DEBUG [AbstractService f]
⚙️︎ ActivityRecognitionService.stopSelfResult(2): true
03-02 14:35:33.457 DEBUG [AbstractService onDestroy]
🔴 ActivityRecognitionService stopped
03-02 14:35:33.534 WARN [HttpService$e onResponse]
⚠️ Response: 422,
03-02 14:35:33.535 DEBUG [EventManager a] 🛜 ⚡️ http
03-02 14:35:33.535 DEBUG [d0 b]
✅ UNLOCKED (5)
03-02 14:35:33.537 INFO [BackgroundTaskManager$a k] ⏳ stopBackgroundTask: 90
03-02 14:35:38.383 DEBUG [AbstractService a]
🎾 start [TrackingService startId: 5240, eventCount: 1]
03-02 14:35:38.384 INFO [TrackingService b]
ℹ️ Location availability: falseReactions are currently unavailable