@@ -25,6 +25,7 @@ import com.topjohnwu.superuser.internal.UiThreadHandler
2525import me.weishu.kernelsu.ui.util.createRootShell
2626import me.weishu.kernelsu.ui.util.listModules
2727import me.weishu.kernelsu.ui.util.withNewRootShell
28+ import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel
2829import org.json.JSONArray
2930import org.json.JSONObject
3031import java.io.File
@@ -208,15 +209,11 @@ class WebViewInterface(
208209
209210 @JavascriptInterface
210211 fun listSystemPackages (): String {
211- val pm = context.packageManager
212- val packages = pm.getInstalledPackages(0 )
213- val packageNames = packages
214- .mapNotNull { pkg ->
215- val appInfo = pkg.applicationInfo
216- if (appInfo != null && (appInfo.flags and ApplicationInfo .FLAG_SYSTEM ) != 0 ) {
217- pkg.packageName
218- } else null
212+ val packageNames = SuperUserViewModel .apps
213+ .filter { appInfo ->
214+ appInfo.packageInfo.applicationInfo?.let { it.flags and ApplicationInfo .FLAG_SYSTEM != 0 } ? : false
219215 }
216+ .map { it.packageName }
220217 .sorted()
221218 val jsonArray = JSONArray ()
222219 for (pkgName in packageNames) {
@@ -227,15 +224,11 @@ class WebViewInterface(
227224
228225 @JavascriptInterface
229226 fun listUserPackages (): String {
230- val pm = context.packageManager
231- val packages = pm.getInstalledPackages(0 )
232- val packageNames = packages
233- .mapNotNull { pkg ->
234- val appInfo = pkg.applicationInfo
235- if (appInfo != null && (appInfo.flags and ApplicationInfo .FLAG_SYSTEM ) == 0 ) {
236- pkg.packageName
237- } else null
227+ val packageNames = SuperUserViewModel .apps
228+ .filter { appInfo ->
229+ appInfo.packageInfo.applicationInfo?.let { it.flags and ApplicationInfo .FLAG_SYSTEM == 0 } ? : false
238230 }
231+ .map { it.packageName }
239232 .sorted()
240233 val jsonArray = JSONArray ()
241234 for (pkgName in packageNames) {
@@ -246,9 +239,7 @@ class WebViewInterface(
246239
247240 @JavascriptInterface
248241 fun listAllPackages (): String {
249- val pm = context.packageManager
250- val packages = pm.getInstalledPackages(0 )
251- val packageNames = packages.map { it.packageName }.sorted()
242+ val packageNames = SuperUserViewModel .apps.map { it.packageName }.sorted()
252243 val jsonArray = JSONArray ()
253244 for (pkgName in packageNames) {
254245 jsonArray.put(pkgName)
@@ -259,23 +250,24 @@ class WebViewInterface(
259250 @RequiresApi(Build .VERSION_CODES .P )
260251 @JavascriptInterface
261252 fun getPackagesInfo (packageNamesJson : String ): String {
262- val pm = context.packageManager
263253 val packageNames = JSONArray (packageNamesJson)
264254 val jsonArray = JSONArray ()
255+ val appMap = SuperUserViewModel .apps.associateBy { it.packageName }
265256 for (i in 0 until packageNames.length()) {
266257 val pkgName = packageNames.getString(i)
267- try {
268- val pkg = pm.getPackageInfo(pkgName, 0 )
269- val appInfo = pkg.applicationInfo
258+ val appInfo = appMap[pkgName]
259+ if (appInfo != null ) {
260+ val pkg = appInfo.packageInfo
261+ val app = pkg.applicationInfo
270262 val obj = JSONObject ()
271263 obj.put(" packageName" , pkg.packageName)
272264 obj.put(" versionName" , pkg.versionName ? : " " )
273265 obj.put(" versionCode" , pkg.longVersionCode)
274- obj.put(" appLabel" , if ( appInfo != null ) pm.getApplicationLabel(appInfo).toString() else " " )
275- obj.put(" isSystem" , appInfo != null && (appInfo .flags and ApplicationInfo .FLAG_SYSTEM ) != 0 )
276- obj.put(" uid" , appInfo ?.uid ? : JSONObject .NULL )
266+ obj.put(" appLabel" , appInfo.label )
267+ obj.put(" isSystem" , app != null && (app .flags and ApplicationInfo .FLAG_SYSTEM ) != 0 )
268+ obj.put(" uid" , app ?.uid ? : JSONObject .NULL )
277269 jsonArray.put(obj)
278- } catch (e : Exception ) {
270+ } else {
279271 val obj = JSONObject ()
280272 obj.put(" packageName" , pkgName)
281273 obj.put(" error" , " Package not found or inaccessible" )
@@ -289,21 +281,21 @@ class WebViewInterface(
289281
290282 @JavascriptInterface
291283 fun cacheAllPackageIcons (size : Int ) {
292- val pm = context.packageManager
293- val packages = pm.getInstalledPackages(0 )
294284 val outputStream = java.io.ByteArrayOutputStream ()
295- for (pkg in packages) {
296- val pkgName = pkg .packageName
297- if (packageIconCache.containsKey(pkgName)) continue
285+ SuperUserViewModel .apps.forEach { appInfo ->
286+ val pkgName = appInfo .packageName
287+ if (packageIconCache.containsKey(pkgName)) return @forEach
298288 try {
299- val appInfo = pm.getApplicationInfo(pkgName, 0 )
300- val drawable = pm.getApplicationIcon(appInfo)
301- val bitmap = drawableToBitmap(drawable, size)
302- outputStream.reset()
303- bitmap.compress(Bitmap .CompressFormat .PNG , 100 , outputStream)
304- val byteArray = outputStream.toByteArray()
305- val iconBase64 = " data:image/png;base64," + Base64 .encodeToString(byteArray, Base64 .NO_WRAP )
306- packageIconCache[pkgName] = iconBase64
289+ SuperUserViewModel .getAppIconDrawable(context, pkgName)?.let { drawable ->
290+ val bitmap = drawableToBitmap(drawable, size)
291+ outputStream.reset()
292+ bitmap.compress(Bitmap .CompressFormat .PNG , 100 , outputStream)
293+ val byteArray = outputStream.toByteArray()
294+ val iconBase64 = " data:image/png;base64," + Base64 .encodeToString(byteArray, Base64 .NO_WRAP )
295+ packageIconCache[pkgName] = iconBase64
296+ } ? : run {
297+ packageIconCache[pkgName] = " "
298+ }
307299 } catch (_: Exception ) {
308300 packageIconCache[pkgName] = " "
309301 }
@@ -312,7 +304,6 @@ class WebViewInterface(
312304
313305 @JavascriptInterface
314306 fun getPackagesIcons (packageNamesJson : String , size : Int ): String {
315- val pm = context.packageManager
316307 val packageNames = JSONArray (packageNamesJson)
317308 val jsonArray = JSONArray ()
318309 val outputStream = java.io.ByteArrayOutputStream ()
@@ -323,17 +314,19 @@ class WebViewInterface(
323314 var iconBase64 = packageIconCache[pkgName]
324315 if (iconBase64 == null ) {
325316 try {
326- val appInfo = pm.getApplicationInfo(pkgName, 0 )
327- val drawable = pm.getApplicationIcon(appInfo)
328- val bitmap = drawableToBitmap(drawable, size)
329- outputStream.reset()
330- bitmap.compress(Bitmap .CompressFormat .PNG , 100 , outputStream)
331- val byteArray = outputStream.toByteArray()
332- iconBase64 = " data:image/png;base64," + Base64 .encodeToString(byteArray, Base64 .NO_WRAP )
317+ SuperUserViewModel .getAppIconDrawable(context, pkgName)?.let { drawable ->
318+ val bitmap = drawableToBitmap(drawable, size)
319+ outputStream.reset()
320+ bitmap.compress(Bitmap .CompressFormat .PNG , 100 , outputStream)
321+ val byteArray = outputStream.toByteArray()
322+ iconBase64 = " data:image/png;base64," + Base64 .encodeToString(byteArray, Base64 .NO_WRAP )
323+ } ? : run {
324+ iconBase64 = " "
325+ }
333326 } catch (_: Exception ) {
334327 iconBase64 = " "
335328 }
336- packageIconCache[pkgName] = iconBase64
329+ packageIconCache[pkgName] = iconBase64 ? : " "
337330 }
338331 obj.put(" icon" , iconBase64)
339332 jsonArray.put(obj)
0 commit comments