NTP-36665 | removed muyltipliers | aman singh

This commit is contained in:
Aman Singh
2025-02-24 18:49:29 +05:30
parent 980930fa83
commit a36b00cc3a
9 changed files with 145 additions and 28 deletions

37
App.tsx
View File

@@ -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);

View File

@@ -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 {

View File

@@ -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 <DialerAppUpdate onAppUpdate={handleDialerAppUpdate} />;
}
if (!isCosmosDialerDefault && isCosmosDiallerEnabled) {
return <DefaultDialerScreen makeCosmosDialerDefault={makeCosmosDialerDefault} />
}
if (shouldUpdate.switchToFallback) {
const { heading, instructions } = BLOCKER_SCREEN_DATA.UNINSTALL_APP;
return (

View File

@@ -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;

View File

@@ -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<IDefaultDialerScreen> = ({ makeCosmosDialerDefault }) => {
const openHelpForm = () => {
Linking.openURL(
'https://docs.google.com/forms/d/e/1FAIpQLSdKtdzB67-yyidd2Gh_52fYsLtL9QeuTmkUb6BZt4fAPJGyOg/viewform?usp=dialog'
);
};
return (
<Layout>
<View style={[GenericStyles.fill]}>
<NavigationHeader
title="Default Dialer"
titleStyle={GenericStyles.pl16}
rightActionable={
<Pressable onPress={openHelpForm}>
<Text style={styles.helpHeading}>Help</Text>
</Pressable>
}
/>
<View style={[GenericStyles.fill, GenericStyles.centerAligned, GenericStyles.ph24]}>
<DialerAppIcon />
<Text dark bold style={styles.heading}>
Cosmos dialer
</Text>
<Text light style={GenericStyles.centerAlignedText}>
Make the cosmos dialer as default dialer to use cosmos.
</Text>
</View>
<View style={[GenericStyles.elevation10, GenericStyles.p16, GenericStyles.whiteBackground]}>
<Button
title="Open cosmos dialer"
onPress={()=>startDialerApp()}
style={GenericStyles.w100}
/>
</View>
</View>
</Layout>
);
};
const styles = StyleSheet.create({
heading: {
fontWeight: 'bold',
fontSize: 20,
marginBottom: 16,
},
helpHeading: {
color: COLORS.TEXT.WHITE,
paddingVertical: 16,
paddingHorizontal: 12,
},
});
export default DefaultDialerScreen;

View File

@@ -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<ITrackingComponent> = ({ 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<ITrackingComponent> = ({ 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<ITrackingComponent> = ({ children }) => {
},
];
if(isCallingApp()) {
if (isCallingApp()) {
tasks.push({
taskId: FOREGROUND_TASKS.COSMOS_SYNC_WITH_LONGHORN,
task: taskSyncToLonghorn,

View File

@@ -12,3 +12,5 @@ export const isDialerAppValidApk = (filePath: string): Promise<boolean> => {
export const getDefaultCallingApp = (): Promise<string> => {
return CallModule.getDefaultCallingApp();
}
export const startDialerApp = (): void => CallModule.startDialerApp();

View File

@@ -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';

View File

@@ -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;