Skip to content

Commit 1b0a66e

Browse files
committed
Refactor WebUI activity lifecycle and initialization
Refactored WebUIActivity and KsuWebUIActivity to use coroutine-based initialization and improved separation of concerns. Updated WXActivity to use nullable view/options, moved loading renderer to a companion extension, and streamlined keyboard and back event handling. Updated AndroidManifest to specify process names and added KILL_BACKGROUND_PROCESSES permission.
1 parent e0aab2c commit 1b0a66e

File tree

4 files changed

+224
-198
lines changed

4 files changed

+224
-198
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
77
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
88
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
9+
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
910
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
1011

1112
<uses-permission
@@ -69,6 +70,7 @@
6970
android:exported="true"
7071
android:label="WebUI X"
7172
android:permission="${webuiPermissionId}.permission.WEBUI_X"
73+
android:process="${webuiPermissionId}.process.webuix"
7274
android:taskAffinity="${applicationId}.WEBUI_X">
7375
<intent-filter>
7476
<action android:name="android.intent.action.VIEW" />
@@ -83,6 +85,7 @@
8385
android:exported="true"
8486
android:label="WebUI Legacy"
8587
android:permission="${webuiPermissionId}.permission.WEBUI_LEGACY"
88+
android:process="${webuiPermissionId}.process.webui"
8689
android:taskAffinity="${applicationId}.KSU_WEBUI">
8790
<intent-filter>
8891
<action android:name="android.intent.action.VIEW" />

app/src/main/java/com/dergoogler/mmrl/wx/ui/activity/webui/KsuWebUIActivity.kt

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.dergoogler.mmrl.wx.ui.activity.webui
33
import android.annotation.SuppressLint
44
import android.os.Build
55
import android.os.Bundle
6-
import android.view.ViewGroup.MarginLayoutParams
6+
import android.view.ViewGroup
77
import android.webkit.WebResourceRequest
88
import android.webkit.WebResourceResponse
99
import android.webkit.WebView
@@ -12,9 +12,13 @@ import androidx.activity.enableEdgeToEdge
1212
import androidx.core.view.ViewCompat
1313
import androidx.core.view.WindowInsetsCompat
1414
import androidx.core.view.updateLayoutParams
15+
import androidx.lifecycle.lifecycleScope
1516
import com.dergoogler.mmrl.ext.exception.BrickException
1617
import com.dergoogler.mmrl.platform.model.ModId.Companion.getModId
1718
import com.dergoogler.mmrl.platform.model.ModId.Companion.webrootDir
19+
import com.dergoogler.mmrl.ui.component.dialog.ConfirmData
20+
import com.dergoogler.mmrl.ui.component.dialog.confirm
21+
import com.dergoogler.mmrl.webui.activity.WXActivity.Companion.createLoadingRenderer
1822
import com.dergoogler.mmrl.webui.handler.suPathHandler
1923
import com.dergoogler.mmrl.webui.util.WebUIOptions
2024
import com.dergoogler.mmrl.webui.view.WebUIView
@@ -24,11 +28,14 @@ import com.dergoogler.mmrl.wx.util.BaseActivity
2428
import com.dergoogler.mmrl.wx.util.initPlatform
2529
import dagger.hilt.android.AndroidEntryPoint
2630
import kotlinx.coroutines.flow.first
31+
import kotlinx.coroutines.launch
2732
import kotlinx.coroutines.runBlocking
2833

2934
@SuppressLint("SetJavaScriptEnabled")
3035
@AndroidEntryPoint
3136
class KsuWebUIActivity : BaseActivity() {
37+
val modId get() = intent.getModId() ?: throw BrickException("Invalid Module ID")
38+
val userPrefs get() = runBlocking { userPreferencesRepository.data.first() }
3239

3340
override fun onCreate(savedInstanceState: Bundle?) {
3441
// Enable edge to edge
@@ -39,11 +46,43 @@ class KsuWebUIActivity : BaseActivity() {
3946

4047
super.onCreate(savedInstanceState)
4148

42-
val userPrefs = runBlocking { userPreferencesRepository.data.first() }
49+
val colorScheme = userPrefs.colorScheme(this)
50+
val loading = createLoadingRenderer(colorScheme)
51+
setContentView(loading)
4352

44-
initPlatform(userPrefs)
53+
lifecycleScope.launch {
54+
val ready = initPlatform(
55+
context = this@KsuWebUIActivity,
56+
platform = userPrefs.workingMode.toPlatform(),
57+
scope = this
58+
)
59+
60+
if (ready.await()) {
61+
init()
62+
return@launch
63+
}
64+
65+
confirm(
66+
ConfirmData(
67+
title = "Failed!",
68+
description = "Failed to initialize platform. Please try again.",
69+
confirmText = "Close",
70+
onConfirm = {
71+
finish()
72+
},
73+
),
74+
colorScheme = colorScheme
75+
)
76+
}
4577

46-
val modId = intent.getModId() ?: throw BrickException("Invalid Module ID")
78+
}
79+
80+
private fun init() {
81+
val options = WebUIOptions(
82+
modId = modId,
83+
debug = userPrefs.developerMode,
84+
context = this,
85+
)
4786

4887
val webViewClient = object : WebViewClient() {
4988
val assetLoader = wxAssetLoader(
@@ -60,16 +99,10 @@ class KsuWebUIActivity : BaseActivity() {
6099
}
61100
}
62101

63-
val options = WebUIOptions(
64-
modId = modId,
65-
debug = userPrefs.developerMode,
66-
context = this,
67-
)
68-
69102
val webView = WebUIView(options).apply {
70103
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
71104
val inset = insets.getInsets(WindowInsetsCompat.Type.systemBars())
72-
view.updateLayoutParams<MarginLayoutParams> {
105+
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
73106
leftMargin = inset.left
74107
rightMargin = inset.right
75108
topMargin = inset.top
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
package com.dergoogler.mmrl.wx.ui.activity.webui
22

3-
import android.os.Bundle
43
import android.os.Build
5-
import androidx.lifecycle.lifecycleScope
6-
import com.dergoogler.mmrl.wx.datastore.UserPreferencesRepository
7-
import com.dergoogler.mmrl.ext.managerVersion
8-
import com.dergoogler.mmrl.wx.ui.activity.webui.interfaces.KernelSUInterface
4+
import androidx.compose.material3.ColorScheme
95
import com.dergoogler.mmrl.ext.exception.BrickException
6+
import com.dergoogler.mmrl.ext.managerVersion
107
import com.dergoogler.mmrl.platform.PlatformManager
118
import com.dergoogler.mmrl.ui.component.dialog.ConfirmData
129
import com.dergoogler.mmrl.ui.component.dialog.confirm
1310
import com.dergoogler.mmrl.webui.activity.WXActivity
1411
import com.dergoogler.mmrl.webui.util.WebUIOptions
1512
import com.dergoogler.mmrl.webui.view.WebUIXView
1613
import com.dergoogler.mmrl.wx.BuildConfig
14+
import com.dergoogler.mmrl.wx.datastore.UserPreferencesRepository
15+
import com.dergoogler.mmrl.wx.ui.activity.webui.interfaces.KernelSUInterface
1716
import com.dergoogler.mmrl.wx.util.initPlatform
17+
import dagger.hilt.android.AndroidEntryPoint
18+
import kotlinx.coroutines.CoroutineScope
1819
import kotlinx.coroutines.flow.first
19-
import kotlinx.coroutines.launch
2020
import kotlinx.coroutines.runBlocking
21-
import dagger.hilt.android.AndroidEntryPoint
22-
import kotlinx.coroutines.Dispatchers
23-
import kotlinx.coroutines.withContext
2421
import javax.inject.Inject
2522

2623
@AndroidEntryPoint
@@ -46,65 +43,68 @@ class WebUIActivity : WXActivity() {
4643
return "WebUI X/$mmrlVersion (Linux; Android $osVersion; $deviceModel; $platform/$platformVersion)"
4744
}
4845

49-
override fun onRender(savedInstanceState: Bundle?) {
46+
override suspend fun onRender(scope: CoroutineScope) {
5047
initPlatform(userPrefs)
51-
super.onRender(savedInstanceState)
48+
super.onRender(scope)
5249

5350
val colorScheme = userPrefs.colorScheme(this)
54-
5551
val loading = createLoadingRenderer(colorScheme)
5652
setContentView(loading)
5753

58-
lifecycleScope.launch {
59-
val active = initPlatform(this, this@WebUIActivity, userPrefs.workingMode.toPlatform())
60-
61-
if (!active.await()) {
62-
confirm(
63-
ConfirmData(
64-
title = "Failed!",
65-
description = "Failed to initialize platform. Please try again.",
66-
confirmText = "Close",
67-
onConfirm = {
68-
finish()
69-
},
70-
),
71-
colorScheme = colorScheme
72-
)
73-
74-
return@launch
75-
}
76-
77-
val modId = this@WebUIActivity.modId ?: throw BrickException("modId cannot be null or empty")
78-
79-
this@WebUIActivity.options = WebUIOptions(
80-
modId = modId,
81-
context = this@WebUIActivity,
82-
debug = userPrefs.developerMode,
83-
appVersionCode = BuildConfig.VERSION_CODE,
84-
remoteDebug = userPrefs.useWebUiDevUrl,
85-
enableEruda = userPrefs.enableErudaConsole,
86-
autoOpenEruda = userPrefs.enableAutoOpenEruda,
87-
debugDomain = userPrefs.webUiDevUrl,
88-
userAgentString = userAgent,
89-
isDarkMode = userPrefs.isDarkMode(),
90-
colorScheme = colorScheme,
91-
cls = WebUIActivity::class.java
54+
val ready = initPlatform(
55+
scope = scope,
56+
context = this@WebUIActivity,
57+
platform = userPrefs.workingMode.toPlatform()
58+
)
59+
60+
if (!ready.await()) {
61+
confirm(
62+
ConfirmData(
63+
title = "Failed!",
64+
description = "Failed to initialize platform. Please try again.",
65+
confirmText = "Close",
66+
onConfirm = {
67+
finish()
68+
},
69+
),
70+
colorScheme = colorScheme
9271
)
72+
return
73+
}
9374

94-
this@WebUIActivity.view = WebUIXView(options).apply {
95-
wx.addJavascriptInterface<KernelSUInterface>()
96-
// not required anymore since onInit() handles it
97-
// wx.loadDomain()
98-
}
75+
init(colorScheme)
76+
}
9977

100-
// Activity Title
101-
config {
102-
if (title != null) {
103-
setActivityTitle("WebUI X - $title")
104-
}
105-
}
78+
private fun init(colorScheme: ColorScheme) {
79+
val modId =
80+
this@WebUIActivity.modId ?: throw BrickException("modId cannot be null or empty")
81+
82+
val options = WebUIOptions(
83+
modId = modId,
84+
context = this@WebUIActivity,
85+
debug = userPrefs.developerMode,
86+
appVersionCode = BuildConfig.VERSION_CODE,
87+
remoteDebug = userPrefs.useWebUiDevUrl,
88+
enableEruda = userPrefs.enableErudaConsole,
89+
autoOpenEruda = userPrefs.enableAutoOpenEruda,
90+
debugDomain = userPrefs.webUiDevUrl,
91+
userAgentString = userAgent,
92+
isDarkMode = userPrefs.isDarkMode(),
93+
colorScheme = colorScheme,
94+
cls = WebUIActivity::class.java
95+
)
96+
97+
this@WebUIActivity.view = WebUIXView(options).apply {
98+
wx.addJavascriptInterface<KernelSUInterface>()
99+
}
106100

107-
setContentView(view)
101+
// Activity Title
102+
config {
103+
if (title != null) {
104+
setActivityTitle("WebUI X - $title")
105+
}
108106
}
107+
108+
setContentView(view)
109109
}
110110
}

0 commit comments

Comments
 (0)