Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit fdcc86b

Browse files
committed
fix: migrate IDEColorSchemeProvider to Kotlin coroutines
1 parent 5a4510d commit fdcc86b

File tree

11 files changed

+190
-86
lines changed

11 files changed

+190
-86
lines changed

app/src/main/java/com/itsaky/androidide/actions/etc/ReloadColorSchemesAction.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,18 @@ package com.itsaky.androidide.actions.etc
1919

2020
import android.content.Context
2121
import androidx.core.content.ContextCompat
22+
import androidx.lifecycle.lifecycleScope
2223
import com.blankj.utilcode.util.ThreadUtils
2324
import com.itsaky.androidide.R
2425
import com.itsaky.androidide.actions.ActionData
2526
import com.itsaky.androidide.actions.EditorActivityAction
2627
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
2728
import com.itsaky.androidide.tasks.executeAsyncProvideError
2829
import com.itsaky.androidide.tasks.executeWithProgress
30+
import com.itsaky.androidide.tasks.launchAsyncWithProgress
2931
import com.itsaky.androidide.utils.ILogger
32+
import kotlinx.coroutines.Dispatchers
33+
import kotlinx.coroutines.withContext
3034

3135
/**
3236
* Action which reloads the editor color schemes.
@@ -51,14 +55,14 @@ class ReloadColorSchemesAction(context: Context, override val order: Int) : Edit
5155

5256
override suspend fun execAction(data: ActionData): Boolean {
5357
val context = data.requireActivity()
54-
context.executeWithProgress { dialog ->
55-
executeAsyncProvideError(IDEColorSchemeProvider::reload) { _, error ->
56-
if (error != null) {
57-
log.error("Failed to load the color schemes", error)
58-
return@executeAsyncProvideError
59-
}
60-
61-
ThreadUtils.runOnUiThread(dialog::dismiss)
58+
context.lifecycleScope.launchAsyncWithProgress(
59+
context = Dispatchers.Default,
60+
configureFlashbar = { builder, _ ->
61+
builder.message(R.string.please_wait)
62+
}) { flashbar, _ ->
63+
IDEColorSchemeProvider.reload()
64+
withContext(Dispatchers.Main) {
65+
flashbar.dismiss()
6266
}
6367
}
6468
return true

app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ abstract class BaseEditorActivity :
109109
protected val log: ILogger = ILogger.newInstance("EditorActivity")
110110

111111
/**
112-
* [CoroutineScope] for executing tasks in the background.
112+
* Editor activity's [CoroutineScope] for executing tasks in the background.
113113
*/
114-
protected val activityBackgroundScope = CoroutineScope(Dispatchers.Default)
114+
protected val editorActivityScope = CoroutineScope(Dispatchers.Default)
115115

116116
internal var installationCallback: ApkInstallationSessionCallback? = null
117117

@@ -168,7 +168,7 @@ abstract class BaseEditorActivity :
168168
installationCallback = null
169169

170170
if (isDestroying) {
171-
activityBackgroundScope.cancelIfActive("Activity is being destroyed")
171+
editorActivityScope.cancelIfActive("Activity is being destroyed")
172172
}
173173
}
174174

app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler {
378378
progressConsumer: ((Int, Int) -> Unit)?,
379379
runAfter: (() -> Unit)?
380380
) {
381-
activityBackgroundScope.launch {
381+
editorActivityScope.launch {
382382
saveAll(notify, requestSync, processResources, progressConsumer)
383383
runAfter?.invoke()
384384
}

app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
463463
}
464464

465465
manager.cachedInitResult = result
466-
activityBackgroundScope.launch(Dispatchers.IO) {
466+
editorActivityScope.launch(Dispatchers.IO) {
467467
manager.setupProject()
468468
manager.notifyProjectUpdate()
469469
updateBuildVariants(manager.androidBuildVariants)

app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,11 @@ abstract class LogViewFragment :
238238
}
239239
}
240240

241-
IDEColorSchemeProvider.readScheme(requireContext(), LogLanguage.TS_TYPE) { scheme ->
241+
IDEColorSchemeProvider.readSchemeAsync(
242+
context = requireContext(),
243+
type = LogLanguage.TS_TYPE,
244+
coroutineScope = editor.editorScope
245+
) { scheme ->
242246
editor.applyTreeSitterLang(LogLanguage(requireContext()), LogLanguage.TS_TYPE, scheme)
243247
}
244248
}

common/src/main/java/com/itsaky/androidide/app/BaseIDEActivity.kt

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@ import androidx.core.app.ActivityCompat
2525
import androidx.core.content.ContextCompat
2626
import androidx.fragment.app.Fragment
2727
import com.itsaky.androidide.common.R
28+
import com.itsaky.androidide.tasks.cancelIfActive
2829
import com.itsaky.androidide.utils.ILogger
2930
import com.itsaky.androidide.utils.resolveAttr
31+
import kotlinx.coroutines.CoroutineScope
32+
import kotlinx.coroutines.Dispatchers
3033

3134
abstract class BaseIDEActivity : AppCompatActivity() {
3235

@@ -36,11 +39,17 @@ abstract class BaseIDEActivity : AppCompatActivity() {
3639
open val statusBarColor: Int
3740
get() = resolveAttr(R.attr.colorSurface)
3841

39-
fun loadFragment(fragment: Fragment, id: Int) {
40-
val transaction = supportFragmentManager.beginTransaction()
41-
transaction.replace(id, fragment)
42-
transaction.commit()
43-
}
42+
/**
43+
* [CoroutineScope] for executing tasks with the [Default][Dispatchers.Default] dispatcher.
44+
*/
45+
protected val activityScope = CoroutineScope(Dispatchers.Default)
46+
47+
val isStoragePermissionGranted: Boolean
48+
get() =
49+
(ContextCompat.checkSelfPermission(this, permission.READ_EXTERNAL_STORAGE) ==
50+
PackageManager.PERMISSION_GRANTED &&
51+
ContextCompat.checkSelfPermission(this, permission.WRITE_EXTERNAL_STORAGE) ==
52+
PackageManager.PERMISSION_GRANTED)
4453

4554
override fun onCreate(savedInstanceState: Bundle?) {
4655
window?.apply {
@@ -61,12 +70,16 @@ abstract class BaseIDEActivity : AppCompatActivity() {
6170
}
6271
}
6372

64-
val isStoragePermissionGranted: Boolean
65-
get() =
66-
(ContextCompat.checkSelfPermission(this, permission.READ_EXTERNAL_STORAGE) ==
67-
PackageManager.PERMISSION_GRANTED &&
68-
ContextCompat.checkSelfPermission(this, permission.WRITE_EXTERNAL_STORAGE) ==
69-
PackageManager.PERMISSION_GRANTED)
73+
override fun onDestroy() {
74+
super.onDestroy()
75+
activityScope.cancelIfActive("Activity is being destroyed")
76+
}
77+
78+
fun loadFragment(fragment: Fragment, id: Int) {
79+
val transaction = supportFragmentManager.beginTransaction()
80+
transaction.replace(id, fragment)
81+
transaction.commit()
82+
}
7083

7184
protected fun requestStorage() {
7285
if (isStoragePermissionGranted) {
@@ -80,7 +93,6 @@ abstract class BaseIDEActivity : AppCompatActivity() {
8093
)
8194
}
8295

83-
protected open fun onStorageGranted() {}
8496
override fun onRequestPermissionsResult(
8597
requestCode: Int,
8698
permissions: Array<String>,
@@ -94,13 +106,16 @@ abstract class BaseIDEActivity : AppCompatActivity() {
94106
}
95107
}
96108

109+
protected open fun onStorageGranted() {}
110+
97111
protected open fun onStorageAlreadyGranted() {}
98112
protected open fun onStorageDenied() {}
99113
protected open fun preSetContentLayout() {}
100114

101115
protected abstract fun bindLayout(): View
102116

103117
companion object {
118+
104119
const val REQCODE_STORAGE = 1009
105120
protected var LOG = ILogger.newInstance("StudioActivity")
106121
}

editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import com.itsaky.androidide.editor.language.IDELanguage
2222
import com.itsaky.androidide.editor.language.newline.TSBracketsHandler
2323
import com.itsaky.androidide.editor.language.utils.CommonSymbolPairs
2424
import com.itsaky.androidide.editor.schemes.IDEColorScheme
25-
import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider
2625
import com.itsaky.androidide.editor.schemes.LanguageScheme
2726
import com.itsaky.androidide.editor.schemes.LanguageSpecProvider.getLanguageSpec
2827
import com.itsaky.androidide.editor.schemes.LocalCaptureSpecProvider.newLocalCaptureSpec
@@ -44,8 +43,11 @@ import io.github.rosemoe.sora.widget.SymbolPairMatch
4443
*
4544
* @author Akash Yadav
4645
*/
47-
abstract class TreeSitterLanguage(context: Context, lang: TSLanguage, type: String) :
48-
IDELanguage() {
46+
abstract class TreeSitterLanguage(
47+
context: Context,
48+
lang: TSLanguage,
49+
private val langType: String
50+
) : IDELanguage() {
4951

5052
private lateinit var tsTheme: TsTheme
5153
private lateinit var languageSpec: TreeSitterLanguageSpec
@@ -57,25 +59,15 @@ abstract class TreeSitterLanguage(context: Context, lang: TSLanguage, type: Stri
5759
private val log = ILogger.newInstance("TreeSitterLanguage")
5860

5961
init {
60-
this.languageSpec = getLanguageSpec(context, type, lang, newLocalCaptureSpec(type))
62+
this.languageSpec = getLanguageSpec(context, langType, lang, newLocalCaptureSpec(langType))
6163
this.tsTheme = TsTheme(languageSpec.spec.tsQuery)
62-
IDEColorSchemeProvider.readScheme(context, type) { scheme ->
63-
if (scheme == null) {
64-
log.error("Failed to read color scheme")
65-
return@readScheme
66-
}
67-
68-
if (scheme !is IDEColorScheme) {
69-
log.error("Invalid color scheme returned by color scheme provider", scheme)
70-
return@readScheme
71-
}
72-
73-
val langScheme = scheme.languages[type] ?: return@readScheme
74-
this.languageScheme = langScheme
75-
langScheme.styles.forEach { tsTheme.putStyleRule(it.key, it.value.makeStyle()) }
64+
}
7665

77-
analyzer.langScheme = languageScheme
78-
}
66+
fun setupWith(scheme: IDEColorScheme?) {
67+
val langScheme = scheme?.languages?.get(langType)
68+
this.languageScheme = langScheme
69+
this.analyzer.langScheme = languageScheme
70+
langScheme?.styles?.forEach { tsTheme.putStyleRule(it.key, it.value.makeStyle()) }
7971
}
8072

8173
open fun finalizeIndent(indent: Int): Int {

editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/XMLLanguage.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import io.github.rosemoe.sora.util.MyCharacter
3232
* @author Akash Yadav
3333
*/
3434
class XMLLanguage(context: Context) :
35-
TreeSitterLanguage(context, lang = TSLanguageXml.getInstance(), type = TS_TYPE) {
35+
TreeSitterLanguage(context, lang = TSLanguageXml.getInstance(), langType = TS_TYPE) {
3636

3737
override val languageServer: ILanguageServer?
3838
get() = ILanguageServerRegistry.getDefault().getServer(XMLLanguageServer.SERVER_ID)

0 commit comments

Comments
 (0)