From a0ee5dfaa6f92b0de4f1ba4175daba991e448f51 Mon Sep 17 00:00:00 2001 From: Mantri Ramkishor Date: Wed, 5 Feb 2025 15:18:37 +0530 Subject: [PATCH] NTP-29477 | Blacklisted app optimisation (#1063) --- .../java/com/avapp/DeviceUtilsModule.java | 72 +++++++++++++------ src/common/BlockerScreen.tsx | 21 +++--- src/components/utlis/DeviceUtils.ts | 2 + src/services/blacklistedApps.service.ts | 45 +++--------- 4 files changed, 78 insertions(+), 62 deletions(-) diff --git a/android/app/src/main/java/com/avapp/DeviceUtilsModule.java b/android/app/src/main/java/com/avapp/DeviceUtilsModule.java index ee4debaf..9ded8c78 100644 --- a/android/app/src/main/java/com/avapp/DeviceUtilsModule.java +++ b/android/app/src/main/java/com/avapp/DeviceUtilsModule.java @@ -21,6 +21,7 @@ import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; import com.facebook.react.uimanager.UIManagerModule; import com.navi.alfred.AlfredManager; import com.navi.pulse.PulseManager; @@ -111,30 +112,25 @@ public class DeviceUtilsModule extends ReactContextBaseJavaModule { try { PackageManager packageManager = RNContext.getPackageManager(); List installedPackages = packageManager.getInstalledPackages(0); - List packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); JSONArray jsonArray = new JSONArray(); for (PackageInfo packageInfo : installedPackages) { - - final PackageManager pm = RNContext.getApplicationContext().getPackageManager(); - ApplicationInfo appsInstalled; - try { - appsInstalled = pm.getApplicationInfo( packageInfo.packageName, 0); - } catch (final PackageManager.NameNotFoundException e) { - appsInstalled = null; - } - final String applicationName = (String) (appsInstalled != null ? pm.getApplicationLabel(appsInstalled) : "(unknown)"); - JSONObject mainObject = new JSONObject(); JSONObject appDetails = new JSONObject(); - appDetails.put("appName",packageInfo.applicationInfo.processName); - appDetails.put("firstInstallTime", packageInfo.firstInstallTime); - appDetails.put("lastUpdateTime", packageInfo.lastUpdateTime); - appDetails.put("applicationName", applicationName); - appDetails.put("applicationIcon",getAppIcon(packageInfo.packageName)); - mainObject.put("packageName", packageInfo.packageName); - mainObject.put("appDetails", appDetails); + try { + ApplicationInfo appInfo = packageInfo.applicationInfo; + String applicationName = (String) packageManager.getApplicationLabel(appInfo); + appDetails.put("appName", appInfo.processName); + appDetails.put("firstInstallTime", packageInfo.firstInstallTime); + appDetails.put("lastUpdateTime", packageInfo.lastUpdateTime); + appDetails.put("applicationName", applicationName != null ? applicationName : "(unknown)"); + appDetails.put("applicationIcon", getAppIcon(packageInfo.packageName)); + mainObject.put("packageName", packageInfo.packageName); + mainObject.put("appDetails", appDetails); - jsonArray.put(mainObject); + jsonArray.put(mainObject); + } catch (Exception e) { + Log.e("getAllInstalledApp", "Error processing package: " + packageInfo.packageName, e); + } } promise.resolve(jsonArray.toString()); } catch (Exception err) { @@ -163,7 +159,43 @@ public class DeviceUtilsModule extends ReactContextBaseJavaModule { promise.reject(err); } } - + + @ReactMethod + public void getBlacklistedApps(ReadableMap blacklistedAppsMap, Promise promise) { + try { + PackageManager packageManager = RNContext.getPackageManager(); + List installedPackages = packageManager.getInstalledPackages(0); + JSONArray jsonArray = new JSONArray(); + + for (PackageInfo packageInfo : installedPackages) { + // Skip system apps + if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + continue; + } + + String packageName = packageInfo.packageName; + if (blacklistedAppsMap.hasKey(packageName)) { + JSONObject appDetails = new JSONObject(); + try { + String applicationName = (String) packageManager.getApplicationLabel(packageInfo.applicationInfo); + appDetails.put("packageName", packageName); + appDetails.put("applicationName", applicationName != null ? applicationName : "(unknown)"); + appDetails.put("applicationIcon", getAppIcon(packageName)); + + jsonArray.put(appDetails); + } catch (Exception e) { + e.printStackTrace(); + promise.reject("ERROR", e.getMessage()); + } + } + } + promise.resolve(jsonArray.toString()); + } catch (Exception err) { + err.printStackTrace(); + promise.reject("ERROR", err.getMessage()); + } + } + @ReactMethod public void sendBottomSheetOpenSignal(Boolean isBottomSheetOpen) { } diff --git a/src/common/BlockerScreen.tsx b/src/common/BlockerScreen.tsx index a4e41eed..64e7ee18 100644 --- a/src/common/BlockerScreen.tsx +++ b/src/common/BlockerScreen.tsx @@ -25,10 +25,11 @@ import { installApk, openFallbackLonghornLink, } from '@actions/appDownloadAction'; +import AppUpdate from './AppUpdate'; import { setShouldUpdate } from '@reducers/appUpdateSlice'; import PostOperativeHours from './PostOperativeHours'; import { isFieldApp } from './utils'; -import AppUpdate from './AppUpdate'; +import { AppStates } from '@interfaces/appStates'; interface IBlockerScreen { children?: ReactNode; @@ -152,13 +153,17 @@ const BlockerScreen = (props: IBlockerScreen) => { React.useEffect(() => { const appStateChange = AppState.addEventListener('change', async (change) => { - setTimeout(async () => { - handleBlacklistedAppsForBlockingCosmos().then((blacklistedAppsInstalled) => - dispatch( - setBlacklistedAppsInstalledData({ blacklistedAppsInstalled: blacklistedAppsInstalled }) - ) - ); - }, 3000); + if (change === AppStates.ACTIVE) { + setTimeout(async () => { + handleBlacklistedAppsForBlockingCosmos().then((blacklistedAppsInstalled) => + dispatch( + setBlacklistedAppsInstalledData({ + blacklistedAppsInstalled: blacklistedAppsInstalled, + }) + ) + ); + }, 3000); + } }); return () => appStateChange.remove(); }, []); diff --git a/src/components/utlis/DeviceUtils.ts b/src/components/utlis/DeviceUtils.ts index ef2149ba..696f3d70 100644 --- a/src/components/utlis/DeviceUtils.ts +++ b/src/components/utlis/DeviceUtils.ts @@ -26,6 +26,8 @@ export type buildConfig = { export const getBuildInfo = (): Promise => DeviceUtilsModule.getBuildInfo(); +export const getBlacklistedApps = (blacklistedAppsObject: Record): Promise => DeviceUtilsModule.getBlacklistedApps(blacklistedAppsObject); + export const alfredHandleSWWEvent = (error: Error) => { const { message = '', stack = '', name = '' } = error; diff --git a/src/services/blacklistedApps.service.ts b/src/services/blacklistedApps.service.ts index f3f87855..e0950739 100644 --- a/src/services/blacklistedApps.service.ts +++ b/src/services/blacklistedApps.service.ts @@ -1,5 +1,5 @@ import { GenericType } from '@common/GenericTypes'; -import { getAllInstalledApp } from '@components/utlis/DeviceUtils'; +import { getBlacklistedApps } from '@components/utlis/DeviceUtils'; import { logError } from '@components/utlis/errorUtils'; export type Apps = { @@ -8,18 +8,7 @@ export type Apps = { applicationIcon: string; }; -type deviceApps = { - packageName: string; - appDetails: deviceAppDetails; -}; - -type deviceAppDetails = { - applicationName: string; - applicationIcon: string; -}; - export let BLACKLISTED_APPS_LIST: string[] = []; -let installedBlacklistedApps: Apps[] = []; export const getBlacklistedAppsList = () => BLACKLISTED_APPS_LIST; @@ -27,33 +16,21 @@ export const setBlacklistedAppsList = (blacklistedAppsString: string) => { BLACKLISTED_APPS_LIST = blacklistedAppsString.split(','); }; -function getBlacklistAppsPresent(installedApps: Apps[], blacklistedApps: string[]) { - installedBlacklistedApps = []; - const blacklistedAppsSet = new Set(blacklistedApps); - for (const app of installedApps) { - if (blacklistedAppsSet.has(app.packageName)) { - installedBlacklistedApps.push({ - packageName: app.packageName, - applicationName: app.applicationName, - applicationIcon: app.applicationIcon, - }); - } - } -} - const handleBlacklistedAppsForBlockingCosmos = async () => { const blacklistedApps = getBlacklistedAppsList(); - return getAllInstalledApp() + + const uniqueBlacklistedApps = Array.from(new Set(blacklistedApps)); + + const blacklistedAppsObject = uniqueBlacklistedApps?.reduce((obj, app) => { + obj[app] = true; + return obj; + }, {} as Record); + + return getBlacklistedApps(blacklistedAppsObject) .then((apps) => { try { const appsArray = JSON.parse(apps); - const installedApps = appsArray.map((app: deviceApps) => ({ - packageName: app.packageName, - applicationName: app.appDetails.applicationName, - applicationIcon: app.appDetails.applicationIcon, - })); - getBlacklistAppsPresent(installedApps, blacklistedApps); - return installedBlacklistedApps; + return appsArray; } catch (error: GenericType) { logError(error); return [];