1
1
package com.sharmadhiraj.installed_apps
2
2
3
+ import android.content.Context
3
4
import android.content.Intent
4
5
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
5
6
import android.content.pm.PackageManager
@@ -9,32 +10,71 @@ import android.widget.Toast
9
10
import android.widget.Toast.LENGTH_LONG
10
11
import android.widget.Toast.LENGTH_SHORT
11
12
import com.sharmadhiraj.installed_apps.Util.Companion.convertAppToMap
12
- import com.sharmadhiraj.installed_apps.Util.Companion.getContext
13
13
import com.sharmadhiraj.installed_apps.Util.Companion.getPackageManager
14
+ import io.flutter.embedding.engine.plugins.FlutterPlugin
15
+ import io.flutter.embedding.engine.plugins.activity.ActivityAware
16
+ import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
17
+ import io.flutter.plugin.common.BinaryMessenger
14
18
import io.flutter.plugin.common.MethodCall
15
19
import io.flutter.plugin.common.MethodChannel
16
20
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
17
- import io.flutter.plugin.common.MethodChannel.Result
18
21
import io.flutter.plugin.common.PluginRegistry.Registrar
19
22
import java.util.Locale.ENGLISH
20
23
21
- class InstalledAppsPlugin (private val registrar : Registrar ) : MethodCallHandler {
24
+
25
+ class InstalledAppsPlugin () : MethodCallHandler, FlutterPlugin, ActivityAware {
22
26
23
27
companion object {
28
+
29
+ var context: Context ? = null
30
+
24
31
@JvmStatic
25
32
fun registerWith (registrar : Registrar ) {
26
- val channel = MethodChannel ( registrar.messenger(), " installed_apps " )
27
- channel.setMethodCallHandler( InstalledAppsPlugin ( registrar))
33
+ context = registrar.context( )
34
+ register( registrar.messenger( ))
28
35
}
36
+
37
+ @JvmStatic
38
+ fun register (messenger : BinaryMessenger ? ) {
39
+ val channel = MethodChannel (messenger, " installed_apps" )
40
+ channel.setMethodCallHandler(InstalledAppsPlugin ())
41
+ }
42
+ }
43
+
44
+ override fun onAttachedToEngine (binding : FlutterPlugin .FlutterPluginBinding ) {
45
+ InstalledAppsPlugin .register(binding.getBinaryMessenger())
46
+ }
47
+
48
+ override fun onDetachedFromEngine (binding : FlutterPlugin .FlutterPluginBinding ) {
49
+ }
50
+
51
+ override fun onAttachedToActivity (activityPluginBinding : ActivityPluginBinding ) {
52
+ context = activityPluginBinding.getActivity()
29
53
}
30
54
31
- override fun onMethodCall (call : MethodCall , result : Result ) {
55
+ override fun onDetachedFromActivityForConfigChanges () {}
56
+
57
+ override fun onReattachedToActivityForConfigChanges (activityPluginBinding : ActivityPluginBinding ) {
58
+ context = activityPluginBinding.getActivity()
59
+ }
60
+
61
+ override fun onDetachedFromActivity () {}
62
+
63
+ override fun onMethodCall (call : MethodCall , result : MethodChannel .Result ) {
64
+ if (context == null ) {
65
+ result.error(" " , " Something went wrong!" , null )
66
+ return
67
+ }
32
68
when (call.method) {
33
69
" getInstalledApps" -> {
34
70
val includeSystemApps = call.argument(" exclude_system_apps" ) ? : true
35
71
val withIcon = call.argument(" with_icon" ) ? : false
36
72
val packageNamePrefix: String = call.argument(" package_name_prefix" ) ? : " "
37
- result.success(getInstalledApps(includeSystemApps, withIcon, packageNamePrefix))
73
+ Thread {
74
+ val apps: List <Map <String , Any ?>> =
75
+ getInstalledApps(includeSystemApps, withIcon, packageNamePrefix)
76
+ result.success(apps)
77
+ }.start()
38
78
}
39
79
" startApp" -> {
40
80
val packageName: String? = call.argument(" package_name" )
@@ -47,44 +87,54 @@ class InstalledAppsPlugin(private val registrar: Registrar) : MethodCallHandler
47
87
" toast" -> {
48
88
val message = call.argument(" message" ) ? : " "
49
89
val short = call.argument(" short_length" ) ? : true
50
- toast(message, short);
90
+ toast(message, short)
51
91
}
52
92
" getAppInfo" -> {
53
93
val packageName: String = call.argument(" package_name" ) ? : " "
54
- result.success(getAppInfo(getPackageManager(registrar ), packageName))
94
+ result.success(getAppInfo(getPackageManager(context !! ), packageName))
55
95
}
56
96
" isSystemApp" -> {
57
97
val packageName: String = call.argument(" package_name" ) ? : " "
58
- result.success(isSystemApp(getPackageManager(registrar ), packageName))
98
+ result.success(isSystemApp(getPackageManager(context !! ), packageName))
59
99
}
60
100
else -> result.notImplemented()
61
101
}
62
102
}
63
103
64
- private fun getInstalledApps (excludeSystemApps : Boolean , withIcon : Boolean , packageNamePrefix : String ): List <Map <String , Any ?>> {
65
- val packageManager = getPackageManager(registrar)
104
+ private fun getInstalledApps (
105
+ excludeSystemApps : Boolean ,
106
+ withIcon : Boolean ,
107
+ packageNamePrefix : String
108
+ ): List <Map <String , Any ?>> {
109
+ val packageManager = getPackageManager(context!! )
66
110
var installedApps = packageManager.getInstalledApplications(0 )
67
111
if (excludeSystemApps)
68
- installedApps = installedApps.filter { app -> ! isSystemApp(packageManager, app.packageName) }
112
+ installedApps =
113
+ installedApps.filter { app -> ! isSystemApp(packageManager, app.packageName) }
69
114
if (packageNamePrefix.isNotEmpty())
70
- installedApps = installedApps.filter { app -> app.packageName.startsWith(packageNamePrefix.toLowerCase(ENGLISH )) }
115
+ installedApps = installedApps.filter { app ->
116
+ app.packageName.startsWith(
117
+ packageNamePrefix.lowercase(ENGLISH )
118
+ )
119
+ }
71
120
return installedApps.map { app -> convertAppToMap(packageManager, app, withIcon) }
72
121
}
73
122
74
123
private fun startApp (packageName : String? ): Boolean {
75
124
if (packageName.isNullOrBlank()) return false
76
125
return try {
77
- val launchIntent = getPackageManager(registrar ).getLaunchIntentForPackage(packageName)
78
- registrar. context() .startActivity(launchIntent)
79
- true ;
126
+ val launchIntent = getPackageManager(context !! ).getLaunchIntentForPackage(packageName)
127
+ context!! .startActivity(launchIntent)
128
+ true
80
129
} catch (e: Exception ) {
81
130
print (e)
82
131
false
83
132
}
84
133
}
85
134
86
135
private fun toast (text : String , short : Boolean ) {
87
- Toast .makeText(getContext(registrar), text, if (short) LENGTH_SHORT else LENGTH_LONG ).show()
136
+ Toast .makeText(context!! , text, if (short) LENGTH_SHORT else LENGTH_LONG )
137
+ .show()
88
138
}
89
139
90
140
private fun isSystemApp (packageManager : PackageManager , packageName : String ): Boolean {
@@ -97,14 +147,17 @@ class InstalledAppsPlugin(private val registrar: Registrar) : MethodCallHandler
97
147
intent.action = ACTION_APPLICATION_DETAILS_SETTINGS
98
148
val uri = Uri .fromParts(" package" , packageName, null )
99
149
intent.data = uri
100
- getContext(registrar) .startActivity(intent)
150
+ context !! .startActivity(intent)
101
151
}
102
152
103
- private fun getAppInfo (packageManager : PackageManager , packageName : String ): Map <String , Any ?>? {
153
+ private fun getAppInfo (
154
+ packageManager : PackageManager ,
155
+ packageName : String
156
+ ): Map <String , Any ?>? {
104
157
var installedApps = packageManager.getInstalledApplications(0 )
105
158
installedApps = installedApps.filter { app -> app.packageName == packageName }
106
159
return if (installedApps.isEmpty()) null
107
- else convertAppToMap(packageManager, installedApps[0 ], true );
160
+ else convertAppToMap(packageManager, installedApps[0 ], true )
108
161
}
109
162
110
163
}
0 commit comments