diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt index 184090a47d82..a7c583bc6eff 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/SuperUserViewModel.kt @@ -18,6 +18,8 @@ import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import com.topjohnwu.superuser.Shell import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize import me.weishu.kernelsu.IKsuInterface @@ -38,6 +40,9 @@ class SuperUserViewModel : ViewModel() { private const val TAG = "SuperUserViewModel" private val appsLock = Any() var apps by mutableStateOf>(emptyList()) + + private val _isAppListLoaded = MutableStateFlow(false) + val isAppListLoaded = _isAppListLoaded.asStateFlow() @JvmStatic fun getAppIconDrawable(context: Context, packageName: String): Drawable? { @@ -185,6 +190,7 @@ class SuperUserViewModel : ViewModel() { synchronized(appsLock) { apps = newApps + _isAppListLoaded.value = true } val comparator = compareBy { diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/AppIconUtil.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/AppIconUtil.kt index e77c173db917..336b6f227fd1 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/AppIconUtil.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/AppIconUtil.kt @@ -24,7 +24,6 @@ object AppIconUtil { val drawable = getAppIconDrawable(context, packageName) ?: return null val raw = drawableToBitmap(drawable, sizePx) val icon = raw.scale(sizePx, sizePx) - if (raw != icon) raw.recycle() iconCache.put(packageName, icon) return icon } catch (_: Exception) { diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt index 6245d9156a8c..adefe90b2a6e 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/webui/WebUIActivity.kt @@ -10,17 +10,23 @@ import android.webkit.WebResourceResponse import android.webkit.WebView import android.webkit.WebViewClient import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.activity.viewModels +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.webkit.WebViewAssetLoader -import kotlinx.coroutines.launch import com.topjohnwu.superuser.Shell +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.launch import me.weishu.kernelsu.ui.util.createRootShell import me.weishu.kernelsu.ui.viewmodel.SuperUserViewModel +import top.yukonga.miuix.kmp.basic.InfiniteProgressIndicator import java.io.File @SuppressLint("SetJavaScriptEnabled") @@ -28,7 +34,6 @@ class WebUIActivity : ComponentActivity() { private lateinit var webviewInterface: WebViewInterface private var rootShell: Shell? = null - private val superUserViewModel: SuperUserViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -40,10 +45,22 @@ class WebUIActivity : ComponentActivity() { super.onCreate(savedInstanceState) + setContent { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + InfiniteProgressIndicator() + } + } + lifecycleScope.launch { - superUserViewModel.fetchAppList() + SuperUserViewModel.isAppListLoaded.first { it } + setupWebView() } + } + private fun setupWebView() { val moduleId = intent.getStringExtra("id")!! val name = intent.getStringExtra("name")!! if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {