diff --git a/src/CONST.ts b/src/CONST.ts
index 7a8635895071..c19adca9867f 100755
--- a/src/CONST.ts
+++ b/src/CONST.ts
@@ -1614,6 +1614,8 @@ const CONST = {
TIMING: {
GET_ORDERED_REPORT_IDS: 'get_ordered_report_ids',
CALCULATE_MOST_RECENT_LAST_MODIFIED_ACTION: 'calc_most_recent_last_modified_action',
+ OPEN_APP: 'open_app',
+ SPLASH_SCREEN: 'splash_screen',
OPEN_SEARCH: 'open_search',
OPEN_REPORT: 'open_report',
OPEN_REPORT_FROM_PREVIEW: 'open_report_from_preview',
diff --git a/src/SplashScreenStateContext.tsx b/src/SplashScreenStateContext.tsx
index 90a858f70c42..edceb6a9da47 100644
--- a/src/SplashScreenStateContext.tsx
+++ b/src/SplashScreenStateContext.tsx
@@ -1,6 +1,7 @@
-import React, {useContext, useMemo, useState} from 'react';
+import React, {useContext, useEffect, useMemo, useState} from 'react';
import type {ValueOf} from 'type-fest';
import CONST from './CONST';
+import Timing from './libs/actions/Timing';
import type ChildrenProps from './types/utils/ChildrenProps';
type SplashScreenStateContextType = {
@@ -23,6 +24,14 @@ function SplashScreenStateContextProvider({children}: ChildrenProps) {
[splashScreenState],
);
+ useEffect(() => {
+ if (splashScreenState !== 'hidden') {
+ return;
+ }
+
+ Timing.end(CONST.TIMING.SPLASH_SCREEN);
+ }, [splashScreenState]);
+
return {children};
}
diff --git a/src/libs/actions/App.ts b/src/libs/actions/App.ts
index 8b95c70fc9a6..8426468d9e84 100644
--- a/src/libs/actions/App.ts
+++ b/src/libs/actions/App.ts
@@ -162,6 +162,7 @@ const isReadyToOpenApp = new Promise((resolve) => {
});
function confirmReadyToOpenApp() {
+ Timing.end(CONST.TIMING.OPEN_APP);
resolveIsReadyPromise();
}
@@ -215,7 +216,6 @@ function setSidebarLoaded() {
Onyx.set(ONYXKEYS.IS_SIDEBAR_LOADED, true);
Performance.markEnd(CONST.TIMING.SIDEBAR_LOADED);
- Timing.end(CONST.TIMING.SIDEBAR_LOADED);
}
function setAppLoading(isLoading: boolean) {
diff --git a/src/pages/Search/SearchPage.tsx b/src/pages/Search/SearchPage.tsx
index c8fe13e6d712..a3f3e34d3b19 100644
--- a/src/pages/Search/SearchPage.tsx
+++ b/src/pages/Search/SearchPage.tsx
@@ -26,6 +26,7 @@ import usePermissions from '@hooks/usePermissions';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
+import {confirmReadyToOpenApp} from '@libs/actions/App';
import {searchInServer} from '@libs/actions/Report';
import {
approveMoneyRequestOnSearch,
@@ -90,6 +91,10 @@ function SearchPage({route}: SearchPageProps) {
const [currentSearchResults] = useOnyx(`${ONYXKEYS.COLLECTION.SNAPSHOT}${queryJSON?.hash ?? CONST.DEFAULT_NUMBER_ID}`, {canBeMissing: true});
const [lastNonEmptySearchResults, setLastNonEmptySearchResults] = useState(undefined);
+ useEffect(() => {
+ confirmReadyToOpenApp();
+ }, []);
+
useEffect(() => {
if (!currentSearchResults?.search?.type) {
return;
diff --git a/src/pages/home/sidebar/BaseSidebarScreen.tsx b/src/pages/home/sidebar/BaseSidebarScreen.tsx
index b1c6f2fcdf28..b713f09429d7 100644
--- a/src/pages/home/sidebar/BaseSidebarScreen.tsx
+++ b/src/pages/home/sidebar/BaseSidebarScreen.tsx
@@ -9,7 +9,6 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useThemeStyles from '@hooks/useThemeStyles';
import {isMobile} from '@libs/Browser';
import Performance from '@libs/Performance';
-import Timing from '@userActions/Timing';
import CONST from '@src/CONST';
import SidebarLinksData from './SidebarLinksData';
@@ -21,7 +20,6 @@ function BaseSidebarScreen() {
useEffect(() => {
Performance.markStart(CONST.TIMING.SIDEBAR_LOADED);
- Timing.start(CONST.TIMING.SIDEBAR_LOADED);
}, []);
return (
diff --git a/src/setup/index.ts b/src/setup/index.ts
index 5cc21e47373c..a327f8e8df93 100644
--- a/src/setup/index.ts
+++ b/src/setup/index.ts
@@ -8,8 +8,11 @@ import ONYXKEYS from '@src/ONYXKEYS';
import addUtilsToWindow from './addUtilsToWindow';
import initializeLastVisitedPath from './initializeLastVisitedPath';
import platformSetup from './platformSetup';
+import telemetry from './telemetry';
export default function () {
+ telemetry();
+
/*
* Initialize the Onyx store when the app loads for the first time.
*
diff --git a/src/setup/telemetry/index.native.ts b/src/setup/telemetry/index.native.ts
new file mode 100644
index 000000000000..821f3b30447b
--- /dev/null
+++ b/src/setup/telemetry/index.native.ts
@@ -0,0 +1,17 @@
+import {AppState} from 'react-native';
+import type {AppStateStatus} from 'react-native';
+import Timing from '@userActions/Timing';
+import CONST from '@src/CONST';
+
+export default function () {
+ Timing.start(CONST.TIMING.SPLASH_SCREEN);
+ Timing.start(CONST.TIMING.OPEN_APP);
+
+ AppState.addEventListener('change', (nextState: AppStateStatus) => {
+ if (nextState !== 'active') {
+ return;
+ }
+
+ Timing.clearData();
+ });
+}
diff --git a/src/setup/telemetry/index.ts b/src/setup/telemetry/index.ts
new file mode 100644
index 000000000000..419176e84f76
--- /dev/null
+++ b/src/setup/telemetry/index.ts
@@ -0,0 +1,15 @@
+import Timing from '@userActions/Timing';
+import CONST from '@src/CONST';
+
+export default function () {
+ Timing.start(CONST.TIMING.SPLASH_SCREEN);
+ Timing.start(CONST.TIMING.OPEN_APP);
+
+ document.addEventListener('visibilitychange', () => {
+ if (!document.hidden) {
+ return;
+ }
+
+ Timing.clearData();
+ });
+}