From 6e9ee17b2799c8fde5820e43505cf8a4a573c6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:18:30 +0300 Subject: [PATCH 01/53] Update Util.kt --- .../kotlin/com/sharmadhiraj/installed_apps/Util.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index 79a1924..55120df 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -23,15 +23,25 @@ class Util { map["icon"] = if (withIcon) DrawableUtil.drawableToByteArray(app.loadIcon(packageManager)) else ByteArray(0) - val packageInfo = packageManager.getPackageInfo(app.packageName, 0) + + val packageInfo = packageManager.getPackageInfo(app.packageName, PackageManager.GET_PERMISSIONS) map["version_name"] = packageInfo.versionName map["version_code"] = getVersionCode(packageInfo) map["built_with"] = BuiltWithUtil.getPlatform(packageInfo.applicationInfo) map["installed_timestamp"] = File(packageInfo.applicationInfo.sourceDir).lastModified() + + // Uygulamanın izinlerini ekleyelim + if (packageInfo.requestedPermissions != null) { + map["permissions"] = packageInfo.requestedPermissions.toList() + } else { + map["permissions"] = emptyList() + } + return map } + fun getPackageManager(context: Context): PackageManager { return context.packageManager } @@ -44,4 +54,4 @@ class Util { } -} \ No newline at end of file +} From aef2384445adbdf193b11c5f47353f58189e51f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:22:27 +0300 Subject: [PATCH 02/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 5cf0e6c..0020d88 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -124,10 +124,9 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { packageNamePrefix: String ): List> { val packageManager = getPackageManager(context!!) - var installedApps = packageManager.getInstalledApplications(0) + var installedApps = packageManager.getInstalledApplications(PackageManager.GET_PERMISSIONS) if (excludeSystemApps) - installedApps = - installedApps.filter { app -> !isSystemApp(packageManager, app.packageName) } + installedApps = installedApps.filter { app -> !isSystemApp(packageManager, app.packageName) } if (packageNamePrefix.isNotEmpty()) installedApps = installedApps.filter { app -> app.packageName.startsWith( @@ -137,6 +136,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { return installedApps.map { app -> convertAppToMap(packageManager, app, withIcon) } } + private fun startApp(packageName: String?): Boolean { if (packageName.isNullOrBlank()) return false return try { From fca7f0504309f032d4a3c3aafb138cd07641c1fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:23:28 +0300 Subject: [PATCH 03/53] Update app_info.dart --- lib/app_info.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/app_info.dart b/lib/app_info.dart index 3d729f6..df9cb6e 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -8,6 +8,7 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; + List permissions; // Yeni eklenen alan AppInfo({ required this.name, @@ -17,6 +18,7 @@ class AppInfo { required this.versionCode, required this.builtWith, required this.installedTimestamp, + required this.permissions, // Yeni eklenen alan }); factory AppInfo.create(dynamic data) { @@ -28,6 +30,7 @@ class AppInfo { versionCode: data["version_code"] ?? 1, builtWith: parseBuiltWith(data["built_with"]), installedTimestamp: data["installed_timestamp"] ?? 0, + permissions: List.from(data["permissions"] ?? []), // Yeni eklenen alan ); } From bd1e664de95c5115d30fb7781eb27a0603235ba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:38:56 +0300 Subject: [PATCH 04/53] Update Util.kt --- .../com/sharmadhiraj/installed_apps/Util.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index 55120df..315e2b1 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -32,14 +32,24 @@ class Util { // Uygulamanın izinlerini ekleyelim if (packageInfo.requestedPermissions != null) { - map["permissions"] = packageInfo.requestedPermissions.toList() + // İzinleri ve durumlarını kontrol et + val permissionsStatus = packageInfo.requestedPermissions.map { permission -> + val isGranted = checkPermissionStatus(packageManager, app.packageName, permission) + mapOf("permission" to permission, "granted" to isGranted) + } + map["permissions"] = permissionsStatus } else { - map["permissions"] = emptyList() + map["permissions"] = emptyList>() } return map } - + + fun checkPermissionStatus(packageManager: PackageManager, packageName: String, permission: String): Boolean { + // İzni kontrol et + val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS) + return packageInfo.requestedPermissions?.contains(permission) == true + } fun getPackageManager(context: Context): PackageManager { From 6670c4d7997500c82563ba40bc710a0894b57379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:40:14 +0300 Subject: [PATCH 05/53] Update app_info.dart --- lib/app_info.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index df9cb6e..855a17b 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -8,7 +8,7 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; - List permissions; // Yeni eklenen alan + List> permissions; // Yeni eklenen alan AppInfo({ required this.name, @@ -30,7 +30,7 @@ class AppInfo { versionCode: data["version_code"] ?? 1, builtWith: parseBuiltWith(data["built_with"]), installedTimestamp: data["installed_timestamp"] ?? 0, - permissions: List.from(data["permissions"] ?? []), // Yeni eklenen alan + permissions: List>.from(data["permissions"] ?? []), // Yeni eklenen alan ); } From 37a37ffc588a21f16cc318777cfb8ee9766a30a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:41:52 +0300 Subject: [PATCH 06/53] Update app_info.dart --- lib/app_info.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index 855a17b..e0dda4f 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -8,7 +8,7 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; - List> permissions; // Yeni eklenen alan + List> permissions; // Yeni eklenen alan AppInfo({ required this.name, @@ -30,7 +30,7 @@ class AppInfo { versionCode: data["version_code"] ?? 1, builtWith: parseBuiltWith(data["built_with"]), installedTimestamp: data["installed_timestamp"] ?? 0, - permissions: List>.from(data["permissions"] ?? []), // Yeni eklenen alan + permissions: List>.from(data["permissions"] ?? []), // Yeni eklenen alan ); } From 835ee26194db76bfdedc189701dcea135c6bb3b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:47:41 +0300 Subject: [PATCH 07/53] Update app_info.dart --- lib/app_info.dart | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index e0dda4f..c411d25 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -8,7 +8,8 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; - List> permissions; // Yeni eklenen alan + List> permissions; + List permissionsTest; AppInfo({ required this.name, @@ -18,7 +19,8 @@ class AppInfo { required this.versionCode, required this.builtWith, required this.installedTimestamp, - required this.permissions, // Yeni eklenen alan + required this.permissions, + required this.permissionsTest, }); factory AppInfo.create(dynamic data) { @@ -30,7 +32,16 @@ class AppInfo { versionCode: data["version_code"] ?? 1, builtWith: parseBuiltWith(data["built_with"]), installedTimestamp: data["installed_timestamp"] ?? 0, - permissions: List>.from(data["permissions"] ?? []), // Yeni eklenen alan + permissions: List>.from( + (data["permissions"] as List?)?.map((e) { + if (e is Map) { + return e; + } else { + return {}; + } + }) ?? [] + ), + permissionsTest: List.from(data["permissions"] ?? []), ); } From 50a040fb7f7326b565658dae6c04c1f452558ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:48:28 +0300 Subject: [PATCH 08/53] Update app_info.dart --- lib/app_info.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index c411d25..eb12c59 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -9,7 +9,7 @@ class AppInfo { BuiltWith builtWith; int installedTimestamp; List> permissions; - List permissionsTest; + List permissionsTest; AppInfo({ required this.name, @@ -41,7 +41,7 @@ class AppInfo { } }) ?? [] ), - permissionsTest: List.from(data["permissions"] ?? []), + permissionsTest: List.from(data["permissions"] ?? []), ); } From 9392970923da36fe9e5a658af7483c9fefdf535a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:51:03 +0300 Subject: [PATCH 09/53] Update app_info.dart --- lib/app_info.dart | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index eb12c59..d8b3ac8 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -8,7 +8,6 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; - List> permissions; List permissionsTest; AppInfo({ @@ -32,15 +31,6 @@ class AppInfo { versionCode: data["version_code"] ?? 1, builtWith: parseBuiltWith(data["built_with"]), installedTimestamp: data["installed_timestamp"] ?? 0, - permissions: List>.from( - (data["permissions"] as List?)?.map((e) { - if (e is Map) { - return e; - } else { - return {}; - } - }) ?? [] - ), permissionsTest: List.from(data["permissions"] ?? []), ); } From bd13c0dc505c66d6d29bf6c128d85a4eca8a4fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:52:20 +0300 Subject: [PATCH 10/53] Update app_info.dart --- lib/app_info.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index d8b3ac8..a173f59 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -18,7 +18,6 @@ class AppInfo { required this.versionCode, required this.builtWith, required this.installedTimestamp, - required this.permissions, required this.permissionsTest, }); From 57f902c287698adc6473474594742286a5aa0f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 00:58:06 +0300 Subject: [PATCH 11/53] Update Util.kt --- .../src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index 315e2b1..7ef6e98 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -47,8 +47,8 @@ class Util { fun checkPermissionStatus(packageManager: PackageManager, packageName: String, permission: String): Boolean { // İzni kontrol et - val packageInfo = packageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS) - return packageInfo.requestedPermissions?.contains(permission) == true + val permissionCheck = packageManager.checkPermission(permission, packageName) + return permissionCheck == PackageManager.PERMISSION_GRANTED } From c338d55383ac9d57b70d4d2adf450f7fb43949c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 01:00:39 +0300 Subject: [PATCH 12/53] Update app_info.dart --- lib/app_info.dart | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index a173f59..a3fab34 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -1,5 +1,13 @@ import 'dart:typed_data'; +// İzin durumu için bir sınıf tanımlayalım +class PermissionStatus { + final String permission; + final bool granted; + + PermissionStatus({required this.permission, required this.granted}); +} + class AppInfo { String name; Uint8List? icon; @@ -8,7 +16,7 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; - List permissionsTest; + List permissions; // Güncellenen alan AppInfo({ required this.name, @@ -18,7 +26,7 @@ class AppInfo { required this.versionCode, required this.builtWith, required this.installedTimestamp, - required this.permissionsTest, + required this.permissions, // Güncellenen alan }); factory AppInfo.create(dynamic data) { @@ -30,7 +38,12 @@ class AppInfo { versionCode: data["version_code"] ?? 1, builtWith: parseBuiltWith(data["built_with"]), installedTimestamp: data["installed_timestamp"] ?? 0, - permissionsTest: List.from(data["permissions"] ?? []), + permissions: (data["permissions"] as List?) + ?.map((perm) => PermissionStatus( + permission: perm["permission"], + granted: perm["granted"], + )) + .toList() ?? [], // Güncellenen alan ); } From fe7944127d13f129ce4b01820795c630113845a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 01:05:49 +0300 Subject: [PATCH 13/53] Update app_info.dart --- lib/app_info.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/app_info.dart b/lib/app_info.dart index a3fab34..dc39c36 100644 --- a/lib/app_info.dart +++ b/lib/app_info.dart @@ -1,6 +1,5 @@ import 'dart:typed_data'; -// İzin durumu için bir sınıf tanımlayalım class PermissionStatus { final String permission; final bool granted; @@ -16,7 +15,7 @@ class AppInfo { int versionCode; BuiltWith builtWith; int installedTimestamp; - List permissions; // Güncellenen alan + List permissions; AppInfo({ required this.name, @@ -26,7 +25,7 @@ class AppInfo { required this.versionCode, required this.builtWith, required this.installedTimestamp, - required this.permissions, // Güncellenen alan + required this.permissions, }); factory AppInfo.create(dynamic data) { @@ -43,7 +42,7 @@ class AppInfo { permission: perm["permission"], granted: perm["granted"], )) - .toList() ?? [], // Güncellenen alan + .toList() ?? [], ); } From cdbb3712a24722e4fafa3c3dc00e66640213862e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Mon, 21 Oct 2024 01:06:02 +0300 Subject: [PATCH 14/53] Update Util.kt --- .../src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index 7ef6e98..dd81551 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -30,9 +30,7 @@ class Util { map["built_with"] = BuiltWithUtil.getPlatform(packageInfo.applicationInfo) map["installed_timestamp"] = File(packageInfo.applicationInfo.sourceDir).lastModified() - // Uygulamanın izinlerini ekleyelim if (packageInfo.requestedPermissions != null) { - // İzinleri ve durumlarını kontrol et val permissionsStatus = packageInfo.requestedPermissions.map { permission -> val isGranted = checkPermissionStatus(packageManager, app.packageName, permission) mapOf("permission" to permission, "granted" to isGranted) @@ -46,7 +44,6 @@ class Util { } fun checkPermissionStatus(packageManager: PackageManager, packageName: String, permission: String): Boolean { - // İzni kontrol et val permissionCheck = packageManager.checkPermission(permission, packageName) return permissionCheck == PackageManager.PERMISSION_GRANTED } From 3387e9ba1b389fce2f55788034eb113118601969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 18:50:24 +0300 Subject: [PATCH 15/53] Update BuiltWithUtil.kt --- .../installed_apps/BuiltWithUtil.kt | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt index cb3c31d..0240b69 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt @@ -10,19 +10,27 @@ class BuiltWithUtil { companion object { fun getPlatform(applicationInfo: ApplicationInfo): String { + if (Build.VERSION.SDK_INT >= 34) { + ZipPathValidator.clearCallback() + } + val apkPath = applicationInfo.sourceDir - val zipFile = ZipFile(apkPath) - val entries: List = zipFile.entries().toList().map { entry -> entry.name } - return if (isFlutterApp(entries)) { - "flutter" - } else if (isReactNativeApp(entries)) { - "react_native" - } else if (isXamarinApp(entries)) { - "xamarin" - } else if (isIonicApp(entries)) { - "ionic" - } else { - "native_or_others" + val zipFile: ZipFile + val entries: List + try { + zipFile = ZipFile(apkPath) + entries = zipFile.entries().toList().map { it.name } + } catch (e: ZipException) { + Log.e("ZIP_ERROR", "Error processing ZIP file", e) + return "error_processing_zip" + } + + return when { + isFlutterApp(entries) -> "flutter" + isReactNativeApp(entries) -> "react_native" + isXamarinApp(entries) -> "xamarin" + isIonicApp(entries) -> "ionic" + else -> "native_or_others" } } @@ -55,4 +63,4 @@ class BuiltWithUtil { } -} \ No newline at end of file +} From 5be269e5db487a93b99da4ab2a3db23c93327dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 18:51:54 +0300 Subject: [PATCH 16/53] Update BuiltWithUtil.kt --- .../main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt index 0240b69..b4fcc34 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import java.util.zip.ZipFile +import dalvik.system.ZipPathValidator class BuiltWithUtil { From 6caa61a82d3ef6e872ac59b4b48a968802cf9c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 18:54:20 +0300 Subject: [PATCH 17/53] Update BuiltWithUtil.kt --- .../installed_apps/BuiltWithUtil.kt | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt index b4fcc34..5dfc4bf 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import java.util.zip.ZipFile +import android.os.Build import dalvik.system.ZipPathValidator class BuiltWithUtil { @@ -14,24 +15,20 @@ class BuiltWithUtil { if (Build.VERSION.SDK_INT >= 34) { ZipPathValidator.clearCallback() } - + val apkPath = applicationInfo.sourceDir - val zipFile: ZipFile - val entries: List - try { - zipFile = ZipFile(apkPath) - entries = zipFile.entries().toList().map { it.name } - } catch (e: ZipException) { - Log.e("ZIP_ERROR", "Error processing ZIP file", e) - return "error_processing_zip" - } - - return when { - isFlutterApp(entries) -> "flutter" - isReactNativeApp(entries) -> "react_native" - isXamarinApp(entries) -> "xamarin" - isIonicApp(entries) -> "ionic" - else -> "native_or_others" + val zipFile = ZipFile(apkPath) + val entries: List = zipFile.entries().toList().map { entry -> entry.name } + return if (isFlutterApp(entries)) { + "flutter" + } else if (isReactNativeApp(entries)) { + "react_native" + } else if (isXamarinApp(entries)) { + "xamarin" + } else if (isIonicApp(entries)) { + "ionic" + } else { + "native_or_others" } } From 2f673bbc21242d812a1d3b770a522bae6da52f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 19:13:45 +0300 Subject: [PATCH 18/53] Update BuiltWithUtil.kt --- .../kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt index 5dfc4bf..226a94f 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt @@ -4,18 +4,12 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageInfo import java.util.zip.ZipFile -import android.os.Build -import dalvik.system.ZipPathValidator class BuiltWithUtil { companion object { fun getPlatform(applicationInfo: ApplicationInfo): String { - if (Build.VERSION.SDK_INT >= 34) { - ZipPathValidator.clearCallback() - } - val apkPath = applicationInfo.sourceDir val zipFile = ZipFile(apkPath) val entries: List = zipFile.entries().toList().map { entry -> entry.name } From 3d1f502693053ec471e021414fc7da06083ceec4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 19:31:33 +0300 Subject: [PATCH 19/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 0020d88..4df7e02 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -71,9 +71,10 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { val includeSystemApps = call.argument("exclude_system_apps") ?: true val withIcon = call.argument("with_icon") ?: false val packageNamePrefix: String = call.argument("package_name_prefix") ?: "" + val platformTypeName: String = call.argument("platform_type") ?: "" Thread { - val apps: List> = - getInstalledApps(includeSystemApps, withIcon, packageNamePrefix) + val apps: List> = + getInstalledApps(includeSystemApps, withIcon, packageNamePrefix, PlatformType.fromString(platformTypeName)) result.success(apps) }.start() } @@ -96,7 +97,9 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { "getAppInfo" -> { val packageName: String = call.argument("package_name") ?: "" - result.success(getAppInfo(getPackageManager(context!!), packageName)) + val platformTypeName: String = call.argument("platform_type") ?: "" + val platformType: PlatformType? = PlatformType.fromString(platformTypeName) + result.success(getAppInfo(getPackageManager(context!!), packageName, platformType)) } "isSystemApp" -> { @@ -122,6 +125,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { excludeSystemApps: Boolean, withIcon: Boolean, packageNamePrefix: String + platformType: PlatformType? ): List> { val packageManager = getPackageManager(context!!) var installedApps = packageManager.getInstalledApplications(PackageManager.GET_PERMISSIONS) @@ -133,7 +137,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { packageNamePrefix.lowercase(ENGLISH) ) } - return installedApps.map { app -> convertAppToMap(packageManager, app, withIcon) } + return installedApps.map { app -> convertAppToMap(packageManager, app, withIcon, platformType) } } @@ -178,12 +182,13 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { private fun getAppInfo( packageManager: PackageManager, - packageName: String + packageName: String, + platformType: PlatformType? ): Map? { var installedApps = packageManager.getInstalledApplications(0) installedApps = installedApps.filter { app -> app.packageName == packageName } return if (installedApps.isEmpty()) null - else convertAppToMap(packageManager, installedApps[0], true) + else convertAppToMap(packageManager, installedApps[0], true, platformType) } private fun uninstallApp(packageName: String): Boolean { From ea0323245248533534a9c9dbcc2da43ae25bc9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 19:31:58 +0300 Subject: [PATCH 20/53] Create PlatfromType.kt --- .../installed_apps/PlatfromType.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 android/src/main/kotlin/com/sharmadhiraj/installed_apps/PlatfromType.kt diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/PlatfromType.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/PlatfromType.kt new file mode 100644 index 0000000..805d1e0 --- /dev/null +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/PlatfromType.kt @@ -0,0 +1,21 @@ +package com.sharmadhiraj.installed_apps +enum class PlatformType(val value: String) { + FLUTTER("flutter"), + REACT_NATIVE("react_native"), + XAMARIN("xamarin"), + IONIC("ionic"), + NATIVE_OR_OTHERS("native_or_others"); + + companion object { + fun fromString(platform: String): PlatformType? { + if (platform.isEmpty()) return null; + return when (platform.lowercase()) { + "flutter" -> FLUTTER + "react_native" -> REACT_NATIVE + "xamarin" -> XAMARIN + "ionic" -> IONIC + else -> NATIVE_OR_OTHERS + } + } + } +} From 2816b615ae22c61e6507bd39920710b75991dfaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 19:32:41 +0300 Subject: [PATCH 21/53] Update Util.kt --- .../src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index dd81551..d65b603 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -15,7 +15,8 @@ class Util { fun convertAppToMap( packageManager: PackageManager, app: ApplicationInfo, - withIcon: Boolean + withIcon: Boolean, + platformType: PlatformType?, ): HashMap { val map = HashMap() map["name"] = packageManager.getApplicationLabel(app) @@ -27,7 +28,7 @@ class Util { val packageInfo = packageManager.getPackageInfo(app.packageName, PackageManager.GET_PERMISSIONS) map["version_name"] = packageInfo.versionName map["version_code"] = getVersionCode(packageInfo) - map["built_with"] = BuiltWithUtil.getPlatform(packageInfo.applicationInfo) + map["built_with"] = platformType?.value ?: BuiltWithUtil.getPlatform(packageInfo.applicationInfo) map["installed_timestamp"] = File(packageInfo.applicationInfo.sourceDir).lastModified() if (packageInfo.requestedPermissions != null) { From 3aa46dc0bfd5b69bc89b83270e83264aea9b8b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 19:34:39 +0300 Subject: [PATCH 22/53] Update installed_apps.dart --- lib/installed_apps.dart | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index a3d12d2..3bbee3d 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -10,12 +10,14 @@ class InstalledApps { /// [excludeSystemApps] specifies whether to exclude system apps from the list. /// [withIcon] specifies whether to include app icons in the list. /// [packageNamePrefix] is an optional parameter to filter apps with package names starting with a specific prefix. + /// [platformType] is an optional parameter to set the app type. Default is [AppPlatformType.flutter]. /// /// Returns a list of [AppInfo] objects representing the installed apps. static Future> getInstalledApps([ bool excludeSystemApps = true, bool withIcon = false, String packageNamePrefix = "", + BuiltWith platformType = BuiltWith.flutter, ]) async { dynamic apps = await _channel.invokeMethod( "getInstalledApps", @@ -23,6 +25,7 @@ class InstalledApps { "exclude_system_apps": excludeSystemApps, "with_icon": withIcon, "package_name_prefix": packageNamePrefix, + "platform_type": platformType.name, }, ); return AppInfo.parseList(apps); @@ -69,10 +72,16 @@ class InstalledApps { /// [packageName] is the package name of the app to retrieve information for. /// /// Returns [AppInfo] for the given package name, or null if not found. - static Future getAppInfo(String packageName) async { + static Future getAppInfo( + String packageName, + BuiltWith? platformType, + ) async { var app = await _channel.invokeMethod( "getAppInfo", - {"package_name": packageName}, + { + "package_name": packageName, + "platform_type": platformType?.name ?? '', + }, ); if (app == null) { return null; From d6ab72770cc942f5d77322b68c9b2b031fbe5956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Tue, 19 Nov 2024 19:36:53 +0300 Subject: [PATCH 23/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 4df7e02..47116cd 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -124,8 +124,8 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { private fun getInstalledApps( excludeSystemApps: Boolean, withIcon: Boolean, - packageNamePrefix: String - platformType: PlatformType? + packageNamePrefix: String, + platformType: PlatformType?, ): List> { val packageManager = getPackageManager(context!!) var installedApps = packageManager.getInstalledApplications(PackageManager.GET_PERMISSIONS) From 443f5a5363dc42889dfc4a420730d3b0c1ea9e28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 13:53:55 +0300 Subject: [PATCH 24/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 47116cd..9fd2b07 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -79,6 +79,14 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { }.start() } + "getRunningApps" -> { + val excludeSystemApps = call.argument("exclude_system_apps") ?: true + Thread { + val apps = getRunningApps(excludeSystemApps) + result.success(apps) + }.start() + } + "startApp" -> { val packageName: String? = call.argument("package_name") result.success(startApp(packageName)) @@ -140,6 +148,31 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { return installedApps.map { app -> convertAppToMap(packageManager, app, withIcon, platformType) } } + private fun getRunningApps(excludeSystemApps: Boolean): List> { + val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as android.app.ActivityManager + val packageManager = getPackageManager(context!!) + val runningProcesses = activityManager.runningAppProcesses + val runningApps = mutableListOf>() + + runningProcesses?.forEach { processInfo -> + try { + val appInfo = packageManager.getApplicationInfo(processInfo.processName, 0) + val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + if (!excludeSystemApps || !isSystemApp) { + runningApps.add( + mapOf( + "packageName" to processInfo.processName, + "appName" to packageManager.getApplicationLabel(appInfo).toString() + ) + ) + } + } catch (e: PackageManager.NameNotFoundException) { + // Uygulama bilgisi bulunamadı + } + } + return runningApps + } + private fun startApp(packageName: String?): Boolean { if (packageName.isNullOrBlank()) return false From 21ff9cff1a79926afa41629480847f9251395f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 13:58:18 +0300 Subject: [PATCH 25/53] Update installed_apps.dart --- lib/installed_apps.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 3bbee3d..7530a7b 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -43,6 +43,21 @@ class InstalledApps { ); } + /// Getting running apps + /// [excludeSystemApps] specifies whether to exclude system apps from the list.wld + /// Returns a list of [AppInfo] objects representing the installed apps. + static Future> getRunningApps([ + bool excludeSystemApps = true, + ]) async { + dynamic apps = await _channel.invokeMethod( + "getRunningApps", + {"exclude_system_apps": excludeSystemApps}, + ); + + return AppInfo.parseList(apps); + } + + /// Opens the settings screen (App Info) of an app with the specified package name. /// /// [packageName] is the package name of the app whose settings screen should be opened. From 02dc38ae8af5c2e6f86910626b5206ddea316954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 14:11:05 +0300 Subject: [PATCH 26/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 9fd2b07..b5be4f0 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -154,23 +154,24 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { val runningProcesses = activityManager.runningAppProcesses val runningApps = mutableListOf>() - runningProcesses?.forEach { processInfo -> - try { - val appInfo = packageManager.getApplicationInfo(processInfo.processName, 0) - val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 - if (!excludeSystemApps || !isSystemApp) { - runningApps.add( - mapOf( - "packageName" to processInfo.processName, - "appName" to packageManager.getApplicationLabel(appInfo).toString() - ) - ) + runningProcesses?.forEach { processInfo -> + processInfo.pkgList?.forEach { packageName -> + try { + val appInfo = packageManager.getApplicationInfo(packageName, 0) + val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + if (!excludeSystemApps || !isSystemApp) { + runningApps.add(appInfo) + } + } catch (e: PackageManager.NameNotFoundException) { + // No App Info + } } - } catch (e: PackageManager.NameNotFoundException) { - // Uygulama bilgisi bulunamadı } - } - return runningApps + + // convertAppToMap ile dönüştürüp geri döndür + return runningApps.map { app -> + convertAppToMap(packageManager, app, withIcon, platformType) + } } From 450df3ff3084714d21bcf5a0b88d3712de8f0d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 14:19:00 +0300 Subject: [PATCH 27/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index b5be4f0..658ca8b 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -148,33 +148,36 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { return installedApps.map { app -> convertAppToMap(packageManager, app, withIcon, platformType) } } - private fun getRunningApps(excludeSystemApps: Boolean): List> { + private fun getRunningApps( + excludeSystemApps: Boolean, + withIcon: Boolean, + platformType: PlatformType? + ): List> { val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as android.app.ActivityManager val packageManager = getPackageManager(context!!) val runningProcesses = activityManager.runningAppProcesses val runningApps = mutableListOf>() - runningProcesses?.forEach { processInfo -> - processInfo.pkgList?.forEach { packageName -> - try { - val appInfo = packageManager.getApplicationInfo(packageName, 0) - val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 - if (!excludeSystemApps || !isSystemApp) { - runningApps.add(appInfo) - } - } catch (e: PackageManager.NameNotFoundException) { - // No App Info + runningProcesses?.forEach { processInfo -> + processInfo.pkgList?.forEach { packageName -> + try { + val appInfo = packageManager.getApplicationInfo(packageName, 0) + val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + if (!excludeSystemApps || !isSystemApp) { + // convertAppToMap kullanarak Map türüne dönüştür + val appMap = convertAppToMap(packageManager, appInfo, withIcon, platformType) + runningApps.add(appMap) } + } catch (e: PackageManager.NameNotFoundException) { + // Uygulama bilgisi bulunamadı, devam et } } - - // convertAppToMap ile dönüştürüp geri döndür - return runningApps.map { app -> - convertAppToMap(packageManager, app, withIcon, platformType) - } + } + return runningApps } + private fun startApp(packageName: String?): Boolean { if (packageName.isNullOrBlank()) return false return try { From fa6099515350ad65cf4e5eaf9fa883dfde1cc7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 14:22:14 +0300 Subject: [PATCH 28/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 658ca8b..f48b74f 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -81,8 +81,10 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { "getRunningApps" -> { val excludeSystemApps = call.argument("exclude_system_apps") ?: true + val withIcon = call.argument("with_icon") ?: false + val platformTypeName: String = call.argument("platform_type") ?: "" Thread { - val apps = getRunningApps(excludeSystemApps) + val apps = getRunningApps(excludeSystemApps, withIcon, PlatformType.fromString(platformTypeName)) result.success(apps) }.start() } From afce2aebfabff3d54da92772c1fedf390f166970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 14:47:44 +0300 Subject: [PATCH 29/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index f48b74f..74e3d2c 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -154,32 +154,66 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { excludeSystemApps: Boolean, withIcon: Boolean, platformType: PlatformType? - ): List> { - val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as android.app.ActivityManager + ): List> { val packageManager = getPackageManager(context!!) - val runningProcesses = activityManager.runningAppProcesses val runningApps = mutableListOf>() + // 1. Kullanıcı İstatistiklerini Kullanma + val usageStatsManager = context!!.getSystemService(Context.USAGE_STATS_SERVICE) as android.app.usage.UsageStatsManager + val currentTime = System.currentTimeMillis() + val endTime = currentTime + val startTime = currentTime - 1000 * 60 * 60 * 24 // Son 24 saat + + val usageStats = usageStatsManager.queryUsageStats( + android.app.usage.UsageStatsManager.INTERVAL_DAILY, + startTime, + endTime + ) + + if (usageStats != null) { + val uniquePackages = mutableSetOf() + + usageStats.forEach { stat -> + val packageName = stat.packageName + if (packageName != null && uniquePackages.add(packageName)) { + try { + val appInfo = packageManager.getApplicationInfo(packageName, 0) + val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + if (!excludeSystemApps || !isSystemApp) { + val appMap = convertAppToMap(packageManager, appInfo, withIcon, platformType) + runningApps.add(appMap) + } + } catch (e: PackageManager.NameNotFoundException) { + // Paket bulunamadı, devam et + } + } + } + } + + // 2. Çalışan İşlemleri Kullanma (Eski Yöntem) + val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as android.app.ActivityManager + val runningProcesses = activityManager.runningAppProcesses runningProcesses?.forEach { processInfo -> processInfo.pkgList?.forEach { packageName -> try { - val appInfo = packageManager.getApplicationInfo(packageName, 0) - val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 - if (!excludeSystemApps || !isSystemApp) { - // convertAppToMap kullanarak Map türüne dönüştür - val appMap = convertAppToMap(packageManager, appInfo, withIcon, platformType) - runningApps.add(appMap) + if (!runningApps.any { it["packageName"] == packageName }) { // Eğer daha önce eklenmediyse + val appInfo = packageManager.getApplicationInfo(packageName, 0) + val isSystemApp = (appInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0 + if (!excludeSystemApps || !isSystemApp) { + val appMap = convertAppToMap(packageManager, appInfo, withIcon, platformType) + runningApps.add(appMap) + } } } catch (e: PackageManager.NameNotFoundException) { // Uygulama bilgisi bulunamadı, devam et } } } + return runningApps } - private fun startApp(packageName: String?): Boolean { if (packageName.isNullOrBlank()) return false return try { From 918e0721ec7395cb1addf384d09a07ab61b49625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 15:07:30 +0300 Subject: [PATCH 30/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 74e3d2c..719cd06 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -127,10 +127,20 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { result.success(isAppInstalled(packageName)) } + "openUsageAccessSettings" -> { + openUsageAccessSettings() + result.success(null) + } + else -> result.notImplemented() } } - + + private fun openUsageAccessSettings() { + val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) + context!!.startActivity(intent) + } + private fun getInstalledApps( excludeSystemApps: Boolean, withIcon: Boolean, From 2d2c204c58ede5bbe21f9479ab039f26eb7c92ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 15:08:18 +0300 Subject: [PATCH 31/53] Update installed_apps.dart --- lib/installed_apps.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 7530a7b..1e05b26 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -68,6 +68,14 @@ class InstalledApps { ); } + /// Opens Usage Access Settings + /// + static openUsageAccessSettings() { + _channel.invokeMethod( + "openUsageAccessSettings" + ); + } + /// Displays a toast message on the device. /// /// [message] is the message to display. From 6d0e305ef1ae8872ea0d69b6cfe4d5eea507a198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 15:09:52 +0300 Subject: [PATCH 32/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 719cd06..cf8f258 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -6,6 +6,8 @@ import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.pm.PackageManager import android.content.pm.ApplicationInfo import android.net.Uri +import android.provider.Settings +import android.app.usage.UsageStatsManager import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS import android.widget.Toast import android.widget.Toast.LENGTH_LONG From fc363ee8e1703eedaf81e6e36cf8e98f3daa2227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 15:13:12 +0300 Subject: [PATCH 33/53] Update InstalledAppsPlugin.kt --- .../sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index cf8f258..7fee199 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -6,8 +6,8 @@ import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.pm.PackageManager import android.content.pm.ApplicationInfo import android.net.Uri -import android.provider.Settings import android.app.usage.UsageStatsManager +import android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS import android.widget.Toast import android.widget.Toast.LENGTH_LONG @@ -139,7 +139,11 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } private fun openUsageAccessSettings() { - val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) + val intent = Intent().apply { + flags = FLAG_ACTIVITY_NEW_TASK + action = ACTION_USAGE_ACCESS_SETTINGS + } + context!!.startActivity(intent) } From 6a6ca6550448ead671f6f4e8f99ece1455aa8a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 16:20:02 +0300 Subject: [PATCH 34/53] Update installed_apps.dart --- lib/installed_apps.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 1e05b26..4ddb01b 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -46,9 +46,10 @@ class InstalledApps { /// Getting running apps /// [excludeSystemApps] specifies whether to exclude system apps from the list.wld /// Returns a list of [AppInfo] objects representing the installed apps. - static Future> getRunningApps([ + static Future> getRunningApps({ bool excludeSystemApps = true, - ]) async { + bool withIcon = true, + }) async { dynamic apps = await _channel.invokeMethod( "getRunningApps", {"exclude_system_apps": excludeSystemApps}, From eb12710a6297be30e398344b982b7d698d293bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Wed, 27 Nov 2024 16:22:32 +0300 Subject: [PATCH 35/53] Update installed_apps.dart --- lib/installed_apps.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 4ddb01b..836fc7b 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -52,7 +52,10 @@ class InstalledApps { }) async { dynamic apps = await _channel.invokeMethod( "getRunningApps", - {"exclude_system_apps": excludeSystemApps}, + { + "exclude_system_apps": excludeSystemApps, + "with_icon": withIcon, + }, ); return AppInfo.parseList(apps); From 6069d7ecf12cd15fc5b06edf7f7f9bf9a6c682e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 11:10:48 +0300 Subject: [PATCH 36/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 7fee199..7bfb496 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -1,5 +1,7 @@ package com.sharmadhiraj.installed_apps +import android.app.AppOpsManager +import android.os.Build import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK @@ -129,6 +131,11 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { result.success(isAppInstalled(packageName)) } + "checkUsageAccessPermission" -> { + val isGranted = isUsageAccessGranted() + result.success(isGranted) + } + "openUsageAccessSettings" -> { openUsageAccessSettings() result.success(null) @@ -146,6 +153,24 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { context!!.startActivity(intent) } + + private fun isUsageAccessGranted(): Boolean { + val appOpsManager = context!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager + val mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + appOpsManager.unsafeCheckOpNoThrow( + AppOpsManager.OPSTR_GET_USAGE_STATS, + android.os.Process.myUid(), + context!!.packageName + ) + } else { + appOpsManager.checkOpNoThrow( + AppOpsManager.OPSTR_GET_USAGE_STATS, + android.os.Process.myUid(), + context!!.packageName + ) + } + return mode == AppOpsManager.MODE_ALLOWED + } private fun getInstalledApps( excludeSystemApps: Boolean, From e108b21bc87be5efca10c251c85cb85c592f97e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 11:12:08 +0300 Subject: [PATCH 37/53] Update installed_apps.dart --- lib/installed_apps.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 836fc7b..2d40bdf 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -72,6 +72,19 @@ class InstalledApps { ); } + /// Check Usage Access Permission + /// + static Future isUsageAccessGranted() async { + try { + final bool isGranted = + await _channel.invokeMethod('checkUsageAccessPermission'); + return isGranted; + } on PlatformException catch (e) { + print("Error checking Usage Access permission: ${e.message}"); + return false; + } + } + /// Opens Usage Access Settings /// static openUsageAccessSettings() { From 6354733682d1dd90897a2897e157273ad8b8da1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 11:19:40 +0300 Subject: [PATCH 38/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 7bfb496..4f9fd22 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -203,7 +203,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { val usageStatsManager = context!!.getSystemService(Context.USAGE_STATS_SERVICE) as android.app.usage.UsageStatsManager val currentTime = System.currentTimeMillis() val endTime = currentTime - val startTime = currentTime - 1000 * 60 * 60 * 24 // Son 24 saat + val startTime = currentTime - 1000 * 60 * 60 * 1 // Last 1 hour val usageStats = usageStatsManager.queryUsageStats( android.app.usage.UsageStatsManager.INTERVAL_DAILY, From aad18f71b1c8f656b1468f3f88ddb259d86b20e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 13:18:07 +0300 Subject: [PATCH 39/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 4f9fd22..0e72464 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -1,5 +1,7 @@ package com.sharmadhiraj.installed_apps +import android.app.ActivityManager +import android.view.accessibility.AccessibilityManager import android.app.AppOpsManager import android.os.Build import android.content.Context @@ -11,6 +13,7 @@ import android.net.Uri import android.app.usage.UsageStatsManager import android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS import android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS +import android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS import android.widget.Toast import android.widget.Toast.LENGTH_LONG import android.widget.Toast.LENGTH_SHORT @@ -135,6 +138,20 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { val isGranted = isUsageAccessGranted() result.success(isGranted) } + + "checkAccessibilityPermission" -> { + result.success(isAccessibilityPermissionGranted()) + } + + "requestAccessibilityPermission" -> { + checkAndRequestAccessibilityPermission() + result.success(null) // İşlem başlatıldığı için geri dönecek bir sonuç yok + } + + "closeBackgroundApps" -> { + val success = closeBackgroundApps() + result.success(success) + } "openUsageAccessSettings" -> { openUsageAccessSettings() @@ -154,6 +171,43 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { context!!.startActivity(intent) } + private fun checkAndRequestAccessibilityPermission() { + val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + context!!.startActivity(intent) + } + + private fun isAccessibilityPermissionGranted(): Boolean { + val accessibilityManager = context!!.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager + return accessibilityManager.isEnabled && accessibilityManager.isTouchExplorationEnabled + } + + private fun closeBackgroundApps(): Boolean { + if (!isAccessibilityPermissionGranted()) { + checkAndRequestAccessibilityPermission() + return false + } + + // Kullanıcı izin verdikten sonra çalışan uygulamaları kapatır + val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager + val runningApps = activityManager.runningAppProcesses ?: return false + + runningApps.forEach { processInfo -> + processInfo.pkgList.forEach { packageName -> + if (packageName != context!!.packageName) { + try { + activityManager.killBackgroundProcesses(packageName) + } catch (e: Exception) { + // Uygulama kapatılamadı + } + } + } + } + return true + } + + private fun isUsageAccessGranted(): Boolean { val appOpsManager = context!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager val mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { From 96ce2ee998944aa138ec307e2bdeea7c18f25a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 13:18:52 +0300 Subject: [PATCH 40/53] Update installed_apps.dart --- lib/installed_apps.dart | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 2d40bdf..394aad4 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -43,6 +43,21 @@ class InstalledApps { ); } + /// isAccessibilityPermissionGranted + static Future isAccessibilityPermissionGranted() async { + return await _channel.invokeMethod('checkAccessibilityPermission') ?? false; + } + + /// requestAccessibilityPermission + static Future requestAccessibilityPermission() async { + await _channel.invokeMethod('requestAccessibilityPermission'); + } + + /// closeBackgroundApps + static Future closeBackgroundApps() async { + return await _channel.invokeMethod('closeBackgroundApps') ?? false; + } + /// Getting running apps /// [excludeSystemApps] specifies whether to exclude system apps from the list.wld /// Returns a list of [AppInfo] objects representing the installed apps. From 5f6ed554858b3d36a45af7214304e28791fe920e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 13:24:35 +0300 Subject: [PATCH 41/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 0e72464..799a7e9 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -172,9 +172,11 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } private fun checkAndRequestAccessibilityPermission() { - val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS).apply { - flags = Intent.FLAG_ACTIVITY_NEW_TASK + val intent = Intent().apply { + flags = FLAG_ACTIVITY_NEW_TASK + action = ACTION_ACCESSIBILITY_SETTINGS } + context!!.startActivity(intent) } From 271ddc5278a6d21249c10a545f6397d29417dac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 13:42:52 +0300 Subject: [PATCH 42/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 799a7e9..01c5dd8 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -181,13 +181,22 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } private fun isAccessibilityPermissionGranted(): Boolean { - val accessibilityManager = context!!.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager - return accessibilityManager.isEnabled && accessibilityManager.isTouchExplorationEnabled + val accessibilityManager = + context!!.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager + + val enabledServices = Settings.Secure.getString( + context!!.contentResolver, + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES + ) + val myServiceName = "${context!!.packageName}/net.permission.man.MyAccessibilityService" + + // check: MyAccessibilityService is enabled? + return enabledServices?.contains(myServiceName) == true && + accessibilityManager.isEnabled } private fun closeBackgroundApps(): Boolean { if (!isAccessibilityPermissionGranted()) { - checkAndRequestAccessibilityPermission() return false } From bafd4165af66dfb1aa240da3b2a25c64ea920470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 13:46:23 +0300 Subject: [PATCH 43/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 01c5dd8..2a9af39 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -1,5 +1,6 @@ package com.sharmadhiraj.installed_apps +import android.provider.Settings import android.app.ActivityManager import android.view.accessibility.AccessibilityManager import android.app.AppOpsManager @@ -181,8 +182,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } private fun isAccessibilityPermissionGranted(): Boolean { - val accessibilityManager = - context!!.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager + val accessibilityManager = context!!.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager val enabledServices = Settings.Secure.getString( context!!.contentResolver, @@ -190,7 +190,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { ) val myServiceName = "${context!!.packageName}/net.permission.man.MyAccessibilityService" - // check: MyAccessibilityService is enabled? + // Kontrol: MyAccessibilityService etkin mi? return enabledServices?.contains(myServiceName) == true && accessibilityManager.isEnabled } From 0d1400f4921fdb98ab5bc9b344f8b33e00a9276d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Thu, 28 Nov 2024 15:12:00 +0300 Subject: [PATCH 44/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 2a9af39..0c27c0c 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -150,7 +150,8 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } "closeBackgroundApps" -> { - val success = closeBackgroundApps() + val packageNames: List = call.argument>("package_names") ?: emptyList() + val success = closeBackgroundApps(packageNames) result.success(success) } @@ -195,23 +196,23 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { accessibilityManager.isEnabled } - private fun closeBackgroundApps(): Boolean { + private fun closeBackgroundApps(packages: List): Boolean { if (!isAccessibilityPermissionGranted()) { + Log.e("AccessibilityPermission", "Accessibility permission is not granted.") return false } - // Kullanıcı izin verdikten sonra çalışan uygulamaları kapatır val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - val runningApps = activityManager.runningAppProcesses ?: return false - runningApps.forEach { processInfo -> - processInfo.pkgList.forEach { packageName -> - if (packageName != context!!.packageName) { - try { - activityManager.killBackgroundProcesses(packageName) - } catch (e: Exception) { - // Uygulama kapatılamadı - } + packages.forEach { packageName -> + if (packageName != context!!.packageName) { + try { + // Kill background process for the given package name + activityManager.killBackgroundProcesses(packageName) + Log.d("ClosedApp", "Successfully killed process for $packageName") + } catch (e: Exception) { + // Log the exception if any error occurs + Log.e("ErrorClosingApp", "Error closing app $packageName: ${e.message}") } } } @@ -219,6 +220,7 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } + private fun isUsageAccessGranted(): Boolean { val appOpsManager = context!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager val mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { From 022c23db211dd9468a7df152eccb1a20edc6ea5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Fri, 29 Nov 2024 12:37:41 +0300 Subject: [PATCH 45/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 0c27c0c..bc59bbd 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -1,5 +1,6 @@ package com.sharmadhiraj.installed_apps +import android.util.Log import android.provider.Settings import android.app.ActivityManager import android.view.accessibility.AccessibilityManager From e3d37cb23b3bb7c434122b1088921950a9a6cadc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Fri, 29 Nov 2024 12:42:43 +0300 Subject: [PATCH 46/53] Update installed_apps.dart --- lib/installed_apps.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/installed_apps.dart b/lib/installed_apps.dart index 394aad4..9ad6161 100644 --- a/lib/installed_apps.dart +++ b/lib/installed_apps.dart @@ -54,8 +54,10 @@ class InstalledApps { } /// closeBackgroundApps - static Future closeBackgroundApps() async { - return await _channel.invokeMethod('closeBackgroundApps') ?? false; + static Future closeBackgroundApps(List packages) async { + return await _channel.invokeMethod("closeBackgroundApps", { + "package_names": packages, + }) ?? false; } /// Getting running apps From 5e8d6672c95d2bfa58eeb0832c37fb39e635ff6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Fri, 29 Nov 2024 13:03:37 +0300 Subject: [PATCH 47/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index bc59bbd..834a0e5 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -203,25 +203,20 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { return false } - val activityManager = context!!.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - + val accessibilityService = MyAccessibilityService() packages.forEach { packageName -> if (packageName != context!!.packageName) { - try { - // Kill background process for the given package name - activityManager.killBackgroundProcesses(packageName) - Log.d("ClosedApp", "Successfully killed process for $packageName") - } catch (e: Exception) { - // Log the exception if any error occurs - Log.e("ErrorClosingApp", "Error closing app $packageName: ${e.message}") + val result = accessibilityService.closeAppInBackground(packageName) + if (result) { + Log.d("ClosedApp", "Successfully stopped $packageName") + } else { + Log.e("ClosedApp", "Failed to stop $packageName") } } } return true } - - private fun isUsageAccessGranted(): Boolean { val appOpsManager = context!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager val mode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { From 4a56c9ee3fa71fd1fe0704d407a7e6806bb31aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Fri, 29 Nov 2024 13:12:17 +0300 Subject: [PATCH 48/53] Update InstalledAppsPlugin.kt --- .../com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 834a0e5..b5cf342 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -21,6 +21,7 @@ import android.widget.Toast.LENGTH_LONG import android.widget.Toast.LENGTH_SHORT import com.sharmadhiraj.installed_apps.Util.Companion.convertAppToMap import com.sharmadhiraj.installed_apps.Util.Companion.getPackageManager +import com.sharmadhiraj.installed_apps.MyAccessibilityService import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.embedding.engine.plugins.activity.ActivityAware import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding @@ -31,7 +32,6 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.PluginRegistry.Registrar import java.util.Locale.ENGLISH - class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { companion object { From 028d181ef3d7dc51e8180b89cf18c05cf52a1924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Fri, 29 Nov 2024 13:15:55 +0300 Subject: [PATCH 49/53] Update InstalledAppsPlugin.kt --- .../installed_apps/InstalledAppsPlugin.kt | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index b5cf342..02c4326 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -21,7 +21,6 @@ import android.widget.Toast.LENGTH_LONG import android.widget.Toast.LENGTH_SHORT import com.sharmadhiraj.installed_apps.Util.Companion.convertAppToMap import com.sharmadhiraj.installed_apps.Util.Companion.getPackageManager -import com.sharmadhiraj.installed_apps.MyAccessibilityService import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.embedding.engine.plugins.activity.ActivityAware import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding @@ -149,12 +148,6 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { checkAndRequestAccessibilityPermission() result.success(null) // İşlem başlatıldığı için geri dönecek bir sonuç yok } - - "closeBackgroundApps" -> { - val packageNames: List = call.argument>("package_names") ?: emptyList() - val success = closeBackgroundApps(packageNames) - result.success(success) - } "openUsageAccessSettings" -> { openUsageAccessSettings() @@ -196,26 +189,6 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { return enabledServices?.contains(myServiceName) == true && accessibilityManager.isEnabled } - - private fun closeBackgroundApps(packages: List): Boolean { - if (!isAccessibilityPermissionGranted()) { - Log.e("AccessibilityPermission", "Accessibility permission is not granted.") - return false - } - - val accessibilityService = MyAccessibilityService() - packages.forEach { packageName -> - if (packageName != context!!.packageName) { - val result = accessibilityService.closeAppInBackground(packageName) - if (result) { - Log.d("ClosedApp", "Successfully stopped $packageName") - } else { - Log.e("ClosedApp", "Failed to stop $packageName") - } - } - } - return true - } private fun isUsageAccessGranted(): Boolean { val appOpsManager = context!!.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager From 4c54ffe4b909fd26a8b7aae277f11466ea50789d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Sun, 27 Apr 2025 10:18:47 +0300 Subject: [PATCH 50/53] Update InstalledAppsPlugin.kt flutter 3.29 --- .../installed_apps/InstalledAppsPlugin.kt | 51 ++++++++----------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt index 02c4326..0152a8d 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/InstalledAppsPlugin.kt @@ -28,33 +28,22 @@ import io.flutter.plugin.common.BinaryMessenger import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import io.flutter.plugin.common.PluginRegistry.Registrar -import java.util.Locale.ENGLISH - -class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { - - companion object { - var context: Context? = null +import java.util.Locale.ENGLISH - @JvmStatic - fun registerWith(registrar: Registrar) { - context = registrar.context() - register(registrar.messenger()) - } +class InstalledAppsPlugin : MethodCallHandler, FlutterPlugin, ActivityAware { - @JvmStatic - fun register(messenger: BinaryMessenger) { - val channel = MethodChannel(messenger, "installed_apps") - channel.setMethodCallHandler(InstalledAppsPlugin()) - } - } + private lateinit var channel: MethodChannel + private var context: Context? = null override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { - register(binding.binaryMessenger) + context = binding.applicationContext + channel = MethodChannel(binding.binaryMessenger, "installed_apps") + channel.setMethodCallHandler(this) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) } override fun onAttachedToActivity(activityPluginBinding: ActivityPluginBinding) { @@ -76,10 +65,10 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } when (call.method) { "getInstalledApps" -> { - val includeSystemApps = call.argument("exclude_system_apps") ?: true - val withIcon = call.argument("with_icon") ?: false - val packageNamePrefix: String = call.argument("package_name_prefix") ?: "" - val platformTypeName: String = call.argument("platform_type") ?: "" + val includeSystemApps = call.argument("exclude_system_apps") ?: true + val withIcon = call.argument("with_icon") ?: false + val packageNamePrefix = call.argument("package_name_prefix") ?: "" + val platformTypeName = call.argument("platform_type") ?: "" Thread { val apps: List> = getInstalledApps(includeSystemApps, withIcon, packageNamePrefix, PlatformType.fromString(platformTypeName)) @@ -98,12 +87,12 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } "startApp" -> { - val packageName: String? = call.argument("package_name") + val packageName = call.argument("package_name") result.success(startApp(packageName)) } "openSettings" -> { - val packageName: String? = call.argument("package_name") + val packageName = call.argument("package_name") openSettings(packageName) } @@ -114,24 +103,24 @@ class InstalledAppsPlugin() : MethodCallHandler, FlutterPlugin, ActivityAware { } "getAppInfo" -> { - val packageName: String = call.argument("package_name") ?: "" - val platformTypeName: String = call.argument("platform_type") ?: "" - val platformType: PlatformType? = PlatformType.fromString(platformTypeName) + val packageName = call.argument("package_name") ?: "" + val platformTypeName = call.argument("platform_type") ?: "" + val platformType = PlatformType.fromString(platformTypeName) result.success(getAppInfo(getPackageManager(context!!), packageName, platformType)) } "isSystemApp" -> { - val packageName: String = call.argument("package_name") ?: "" + val packageName = call.argument("package_name") ?: "" result.success(isSystemApp(getPackageManager(context!!), packageName)) } "uninstallApp" -> { - val packageName: String = call.argument("package_name") ?: "" + val packageName = call.argument("package_name") ?: "" result.success(uninstallApp(packageName)) } "isAppInstalled" -> { - val packageName: String = call.argument("package_name") ?: "" + val packageName = call.argument("package_name") ?: "" result.success(isAppInstalled(packageName)) } From 7a7c657e25140b18c7b005817645adffe2d8a7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Sun, 20 Jul 2025 19:33:50 +0300 Subject: [PATCH 51/53] Update BuiltWithUtil.kt --- .../kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt index 226a94f..e846cc5 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/BuiltWithUtil.kt @@ -49,7 +49,7 @@ class BuiltWithUtil { } fun getAppNameFromPackage(context: Context, packageInfo: PackageInfo): String { - return packageInfo.applicationInfo.loadLabel(context.packageManager).toString() + return packageInfo.applicationInfo?.loadLabel(context.packageManager)?.toString() ?: packageInfo.packageName } From e9b7716d937742b1266b00762d4e928a48615828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Sun, 20 Jul 2025 19:34:28 +0300 Subject: [PATCH 52/53] Update Util.kt --- .../src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index d65b603..d75ae1c 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -28,8 +28,8 @@ class Util { val packageInfo = packageManager.getPackageInfo(app.packageName, PackageManager.GET_PERMISSIONS) map["version_name"] = packageInfo.versionName map["version_code"] = getVersionCode(packageInfo) - map["built_with"] = platformType?.value ?: BuiltWithUtil.getPlatform(packageInfo.applicationInfo) - map["installed_timestamp"] = File(packageInfo.applicationInfo.sourceDir).lastModified() + map["built_with"] = platformType?.value ?: BuiltWithUtil.getPlatform(packageInfo.applicationInfo ?: app) + map["installed_timestamp"] = File(packageInfo.applicationInfo?.sourceDir ?: app.sourceDir).lastModified() if (packageInfo.requestedPermissions != null) { val permissionsStatus = packageInfo.requestedPermissions.map { permission -> From 58cf5fcf0fb5e98b4c41b2230634ab5a8c87470e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Mete=20Erdo=C4=9Fan?= Date: Sun, 20 Jul 2025 19:35:20 +0300 Subject: [PATCH 53/53] Update Util.kt --- .../src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt index d75ae1c..52bbedf 100644 --- a/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt +++ b/android/src/main/kotlin/com/sharmadhiraj/installed_apps/Util.kt @@ -31,8 +31,9 @@ class Util { map["built_with"] = platformType?.value ?: BuiltWithUtil.getPlatform(packageInfo.applicationInfo ?: app) map["installed_timestamp"] = File(packageInfo.applicationInfo?.sourceDir ?: app.sourceDir).lastModified() - if (packageInfo.requestedPermissions != null) { - val permissionsStatus = packageInfo.requestedPermissions.map { permission -> + val requestedPermissions = packageInfo.requestedPermissions + if (requestedPermissions != null) { + val permissionsStatus = requestedPermissions.map { permission -> val isGranted = checkPermissionStatus(packageManager, app.packageName, permission) mapOf("permission" to permission, "granted" to isGranted) }