diff --git a/App.tsx b/App.tsx
index 4e3d18d2..7f2a32b2 100644
--- a/App.tsx
+++ b/App.tsx
@@ -20,37 +20,36 @@ import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import store, { persistor } from './src/store/store';
+import { navigationRef } from '@utils/navigationUtlis';
import FullScreenLoader from './RN-UI-LIB/src/components/FullScreenLoader';
import { toastConfigs, ToastContainer } from './RN-UI-LIB/src/components/toast';
-import { navigationRef } from '@utils/navigationUtlis';
+import { hydrateGlobalImageMap } from '@common/CachedImage';
+import { CLICKSTREAM_EVENT_NAMES, LocalStorageKeys } from '@common/Constants';
import { sendDeviceDetailsToClickstream } from '@components/utlis/commonFunctions';
import { linkingConf } from '@components/utlis/deeplinkingUtils';
import { getBuildFlavour } from '@components/utlis/DeviceUtils';
+import { initSentry } from '@components/utlis/sentry';
import { GLOBAL, setGlobalBuildFlavour } from '@constants/Global';
+import { AppStates } from '@interfaces/appStates';
import analytics from '@react-native-firebase/analytics';
-import dayJs from 'dayjs';
import { COLORS } from '@rn-ui-lib/colors';
import { MILLISECONDS_IN_A_SECOND } from '@rn-ui-lib/utils/common';
-import { hydrateGlobalImageMap } from '@common/CachedImage';
-import { CLICKSTREAM_EVENT_NAMES, LocalStorageKeys } from '@common/Constants';
-import ErrorBoundary from './src/common/ErrorBoundary';
-import { getPermissionsToRequest } from '@utils/PermissionUtils';
-import ScreenshotBlocker from './src/components/utlis/ScreenshotBlocker';
-import { setItem } from './src/components/utlis/storageHelper';
-import { COSMOS_DIALER_PACKAGE_NAME, ENV } from './src/constants/config';
-import AuthRouter from './src/screens/auth/AuthRouter';
import { type TDocumentObj } from '@screens/caseDetails/interface';
-import Permissions from './src/screens/permissions/Permissions';
import { addClickstreamEvent } from '@services/clickstreamEventService';
import { setJsErrorHandler } from '@services/exception-handler.service';
+import syncSelfCallData from '@services/syncSelfCallData';
+import { getPermissionsToRequest } from '@utils/PermissionUtils';
+import dayJs from 'dayjs';
+import CodePushLoadingModal, { CodePushLoadingModalRef } from './CodePushModal';
+import ErrorBoundary from './src/common/ErrorBoundary';
+import ScreenshotBlocker from './src/components/utlis/ScreenshotBlocker';
+import { setItem } from './src/components/utlis/storageHelper';
+import { ENV } from './src/constants/config';
+import AuthRouter from './src/screens/auth/AuthRouter';
+import Permissions from './src/screens/permissions/Permissions';
import fetchUpdatedRemoteConfig from './src/services/firebaseFetchAndUpdate.service';
import { StorageKeys } from './src/types/storageKeys';
-import CodePushLoadingModal, { CodePushLoadingModalRef } from './CodePushModal';
-import { initSentry } from '@components/utlis/sentry';
-import { AppStates } from '@interfaces/appStates';
-import syncSelfCallData from '@services/syncSelfCallData';
-import { getDefaultCallingApp } from '@components/utlis/callModuleUtils';
if (!__DEV__) {
initSentry();
@@ -98,9 +97,7 @@ function App() {
const askForPermissions = async () => {
const permissionsToRequest = await getPermissionsToRequest();
- const defaultCallingApp = await getDefaultCallingApp() === COSMOS_DIALER_PACKAGE_NAME;
-
- console.log('Default calling app:', defaultCallingApp);
+
if (Platform.OS === 'android') {
PermissionsAndroid.requestMultiple(permissionsToRequest)
.then(async (result) => {
@@ -111,7 +108,7 @@ function App() {
break;
}
}
- setPermissions(isAllPermissionsGranted && defaultCallingApp);
+ setPermissions(isAllPermissionsGranted);
})
.catch((err) => {
setPermissions(false);
diff --git a/android/app/src/main/java/com/avapp/callModule/CallModule.java b/android/app/src/main/java/com/avapp/callModule/CallModule.java
index ff600379..71c4981e 100644
--- a/android/app/src/main/java/com/avapp/callModule/CallModule.java
+++ b/android/app/src/main/java/com/avapp/callModule/CallModule.java
@@ -199,6 +199,16 @@ public class CallModule extends ReactContextBaseJavaModule {
Log.e(TAG, "No app found to handle the call.");
}
}
+ @ReactMethod
+ public void startDialerApp() {
+ Intent launchIntent = reactContext.getPackageManager().getLaunchIntentForPackage("org.fossify.phone");
+ if (launchIntent != null) {
+ Log.d(TAG, "Call initiated successfully.");
+ reactContext.startActivity(launchIntent);
+ } else {
+ Log.e(TAG, "No app found to handle the call.");
+ }
+ }
private void promptForInstall(Uri apkUri) {
try {
diff --git a/src/common/BlockerScreen.tsx b/src/common/BlockerScreen.tsx
index 9aa91dcc..18ffc867 100644
--- a/src/common/BlockerScreen.tsx
+++ b/src/common/BlockerScreen.tsx
@@ -29,6 +29,7 @@ import {
import AppUpdate from './AppUpdate';
import {
IShouldDialerAppUpdate,
+ setDefaultDialer,
setShouldDialerAppUpdate,
setShouldUpdate,
} from '@reducers/appUpdateSlice';
@@ -36,6 +37,9 @@ import PostOperativeHours from './PostOperativeHours';
import { isFieldApp } from './utils';
import { AppStates } from '@interfaces/appStates';
import DialerAppUpdate from './DialerAppUpdate';
+import { getDefaultCallingApp } from '@components/utlis/callModuleUtils';
+import { COSMOS_DIALER_PACKAGE_NAME } from '@constants/config';
+import DefaultDialerScreen from './DefaultDialerScreen';
interface IBlockerScreen {
children?: ReactNode;
@@ -60,6 +64,9 @@ const BlockerScreen = (props: IBlockerScreen) => {
);
const shouldDialerAppUpdate =
useAppSelector((state) => state.appUpdate.shouldDialerAppUpdate) || {};
+ const isCosmosDialerDefault =
+ useAppSelector((state) => state.appUpdate.isCosmosDialerDefault);
+
const withinOperativeHours = useAppSelector((state) => state.user?.withinOperativeHours);
const isLoggedIn = useAppSelector((state: RootState) => state.user?.isLoggedIn);
const isFieldAgent =
@@ -155,6 +162,13 @@ const BlockerScreen = (props: IBlockerScreen) => {
});
};
+ const makeCosmosDialerDefault = async () => {
+ const appUrl = `intent://${COSMOS_DIALER_PACKAGE_NAME}#Intent;scheme=package;end`;
+ if (appUrl) {
+ await Linking.openSettings();
+ }
+ };
+
const handleDialerAppUpdate = async () => {
const url = dialerAppState?.currentProdAPK;
if (!shouldDialerAppUpdate.newApkCachedUrl) {
@@ -235,6 +249,8 @@ const BlockerScreen = (props: IBlockerScreen) => {
);
deleteCachedApkFiles(true);
}
+ const defaultCallingApp = await getDefaultCallingApp()=== COSMOS_DIALER_PACKAGE_NAME;
+ dispatch(setDefaultDialer(defaultCallingApp));
},
[dialerAppState, shouldDialerAppUpdate, isCosmosDiallerEnabled]
);
@@ -295,6 +311,10 @@ const BlockerScreen = (props: IBlockerScreen) => {
return ;
}
+ if (!isCosmosDialerDefault && isCosmosDiallerEnabled) {
+ return
+ }
+
if (shouldUpdate.switchToFallback) {
const { heading, instructions } = BLOCKER_SCREEN_DATA.UNINSTALL_APP;
return (
diff --git a/src/common/Constants.ts b/src/common/Constants.ts
index 34f698a2..e9cd465e 100644
--- a/src/common/Constants.ts
+++ b/src/common/Constants.ts
@@ -1467,6 +1467,10 @@ export const CLICKSTREAM_EVENT_NAMES = {
FA_CALL_SYNC_SELF_CALL_ERROR: {
name: 'FA_CALL_SYNC_SELF_CALL_ERROR',
description: 'Call sync self call error',
+ },
+ FA_COSMOS_DEFAULT_DIALER: {
+ name: 'FA_COSMOS_DEFAULT_DIALER',
+ description: 'Cosmos default dialer',
}
} as const;
diff --git a/src/common/DefaultDialerScreen.tsx b/src/common/DefaultDialerScreen.tsx
new file mode 100644
index 00000000..571254d3
--- /dev/null
+++ b/src/common/DefaultDialerScreen.tsx
@@ -0,0 +1,70 @@
+import DialerAppIcon from '@assets/icons/DialerAppIcon';
+import { startDialerApp } from '@components/utlis/callModuleUtils';
+import { COLORS } from '@rn-ui-lib/colors';
+import Button from '@rn-ui-lib/components/Button';
+import NavigationHeader from '@rn-ui-lib/components/NavigationHeader';
+import Text from '@rn-ui-lib/components/Text';
+import { GenericStyles } from '@rn-ui-lib/styles';
+import Layout from '@screens/layout/Layout';
+import React from 'react';
+import { Linking, Pressable, StyleSheet, View } from 'react-native';
+
+interface IDefaultDialerScreen {
+ makeCosmosDialerDefault: () => void;
+}
+
+const DefaultDialerScreen: React.FC = ({ makeCosmosDialerDefault }) => {
+ const openHelpForm = () => {
+ Linking.openURL(
+ 'https://docs.google.com/forms/d/e/1FAIpQLSdKtdzB67-yyidd2Gh_52fYsLtL9QeuTmkUb6BZt4fAPJGyOg/viewform?usp=dialog'
+ );
+ };
+
+ return (
+
+
+
+ Help
+
+ }
+ />
+
+
+
+ Cosmos dialer
+
+
+ Make the cosmos dialer as default dialer to use cosmos.
+
+
+
+
+
+
+
+ );
+};
+
+const styles = StyleSheet.create({
+ heading: {
+ fontWeight: 'bold',
+ fontSize: 20,
+ marginBottom: 16,
+ },
+ helpHeading: {
+ color: COLORS.TEXT.WHITE,
+ paddingVertical: 16,
+ paddingHorizontal: 12,
+ },
+});
+
+export default DefaultDialerScreen;
diff --git a/src/common/TrackingComponent.tsx b/src/common/TrackingComponent.tsx
index d592b341..bd687a66 100644
--- a/src/common/TrackingComponent.tsx
+++ b/src/common/TrackingComponent.tsx
@@ -1,4 +1,4 @@
-import React,{ type ReactNode, useEffect, useRef } from 'react';
+import React, { type ReactNode, useEffect, useRef } from 'react';
import { AppState, type AppStateStatus } from 'react-native';
import dayJs from 'dayjs';
import RNFS from 'react-native-fs';
@@ -54,6 +54,7 @@ import useFirestoreUpdates from '@hooks/useFirestoreUpdates';
import { handlePostOperativeHourActivity } from '@screens/caseDetails/utils/postOperationalHourActions';
import { setPostOperationalHourRestrictions } from '@reducers/postOperationalHourRestrictionsSlice';
import { isCallingApp } from './utils';
+import { getDefaultCallingApp } from '@components/utlis/callModuleUtils';
export enum FOREGROUND_TASKS {
GEOLOCATION = 'GEOLOCATION',
@@ -106,6 +107,13 @@ const TrackingComponent: React.FC = ({ children }) => {
const resyncFirebase = useResyncFirebase();
const handleUpdateActivity = async () => {
+ const isDialerEnabled = store?.getState()?.user?.featureFlags?.isCosmosDiallerEnabled;
+ const defaultDialer = await getDefaultCallingApp();
+ if (isDialerEnabled) {
+ addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_COSMOS_DEFAULT_DIALER, {
+ defaultDialer
+ }, true);
+ }
const foregroundTimestamp = await getItem(StorageKeys.APP_FOREGROUND_TIMESTAMP);
const backgroundTimestamp = await getItem(StorageKeys.APP_BACKGROUND_TIMESTAMP);
const stateSetTimestamp = await getItem(StorageKeys.STATE_SET_TIMESTAMP);
@@ -204,18 +212,18 @@ const TrackingComponent: React.FC = ({ children }) => {
const allPermissionsGranted = permissionsToRequest?.length === 0;
return allPermissionsGranted;
};
-
+
const appVersion = getAppVersion();
const taskSyncToLonghorn = async () => {
- const allPermissionsGranted = await checkPermissions();
- const agentId= store.getState().user.user?.referenceId!;
- if(!agentId) {
+ const allPermissionsGranted = await checkPermissions();
+ const agentId = store.getState().user.user?.referenceId!;
+ if (!agentId) {
addClickstreamEvent(CLICKSTREAM_EVENT_NAMES.FA_COSMOS_SYNC_TO_LONGHORN_ERROR);
return;
}
- await syncToLonghorn({allPermissionsGranted, agentId, appVersion, isSyncToastEnabled: false});
+ await syncToLonghorn({ allPermissionsGranted, agentId, appVersion, isSyncToastEnabled: false });
};
const tasks: IForegroundTask[] = [
@@ -294,7 +302,7 @@ const TrackingComponent: React.FC = ({ children }) => {
},
];
- if(isCallingApp()) {
+ if (isCallingApp()) {
tasks.push({
taskId: FOREGROUND_TASKS.COSMOS_SYNC_WITH_LONGHORN,
task: taskSyncToLonghorn,
diff --git a/src/components/utlis/callModuleUtils.ts b/src/components/utlis/callModuleUtils.ts
index b7b9bf33..4dac572f 100644
--- a/src/components/utlis/callModuleUtils.ts
+++ b/src/components/utlis/callModuleUtils.ts
@@ -12,3 +12,5 @@ export const isDialerAppValidApk = (filePath: string): Promise => {
export const getDefaultCallingApp = (): Promise => {
return CallModule.getDefaultCallingApp();
}
+
+export const startDialerApp = (): void => CallModule.startDialerApp();
\ No newline at end of file
diff --git a/src/constants/config.js b/src/constants/config.js
index 1381cea2..62afaf32 100644
--- a/src/constants/config.js
+++ b/src/constants/config.js
@@ -14,3 +14,4 @@ export const GOOGLE_SSO_CLIENT_ID =
'60755663443-40k0fbrbbqv4ci4hrjlbrphab5fj387b.apps.googleusercontent.com';
export const MS_CLARITY_PROJECT_ID = '';
export const COSMOS_DIALER_PACKAGE_NAME = 'org.fossify.phone';
+
diff --git a/src/reducer/appUpdateSlice.ts b/src/reducer/appUpdateSlice.ts
index c96fd068..f2db8ac8 100644
--- a/src/reducer/appUpdateSlice.ts
+++ b/src/reducer/appUpdateSlice.ts
@@ -12,6 +12,7 @@ interface IAppUpdateSlice {
switchToFallback: boolean;
};
shouldDialerAppUpdate: IShouldDialerAppUpdate;
+ isCosmosDialerDefault: boolean;
}
const initialState: IAppUpdateSlice = {
@@ -24,6 +25,7 @@ const initialState: IAppUpdateSlice = {
switchToFallback: false,
isAppInstalled: false,
},
+ isCosmosDialerDefault: false,
};
const AppUpdateSlice = createSlice({
@@ -36,9 +38,12 @@ const AppUpdateSlice = createSlice({
setShouldDialerAppUpdate: (state, action) => {
state.shouldDialerAppUpdate = action.payload;
},
+ setDefaultDialer: (state, action) => {
+ state.isCosmosDialerDefault = action.payload;
+ }
},
});
-export const { setShouldUpdate, setShouldDialerAppUpdate } = AppUpdateSlice.actions;
+export const { setShouldUpdate, setShouldDialerAppUpdate, setDefaultDialer } = AppUpdateSlice.actions;
export default AppUpdateSlice.reducer;