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

Commit 7e27204

Browse files
committed
feat: add support for selecting build variants in project (closes #223)
1 parent b20e108 commit 7e27204

File tree

39 files changed

+685
-240
lines changed

39 files changed

+685
-240
lines changed

app/src/main/java/com/itsaky/androidide/actions/build/ProjectSyncAction.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ package com.itsaky.androidide.actions.build
1919

2020
import android.content.Context
2121
import androidx.core.content.ContextCompat
22-
import com.itsaky.androidide.resources.R
23-
import com.itsaky.androidide.resources.R.string
2422
import com.itsaky.androidide.actions.ActionData
2523
import com.itsaky.androidide.actions.BaseBuildAction
24+
import com.itsaky.androidide.resources.R
25+
import com.itsaky.androidide.resources.R.string
2626

2727
/**
2828
* Triggers a project sync request.
@@ -40,6 +40,6 @@ class ProjectSyncAction(context: Context) : BaseBuildAction() {
4040
}
4141

4242
override fun execAction(data: ActionData): Any {
43-
return data.getActivity()!!.initializeProject()
43+
return data.requireActivity().initializeProject()
4444
}
4545
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class PreviewLayoutAction(context: Context) : EditorRelatedAction() {
4646
override fun prepare(data: ActionData) {
4747
super.prepare(data)
4848

49-
val viewModel = data.getActivity()!!.viewModel
49+
val viewModel = data.requireActivity().editorViewModel
5050
if (viewModel.isInitializing) {
5151
visible = true
5252
enabled = false
@@ -61,12 +61,12 @@ class PreviewLayoutAction(context: Context) : EditorRelatedAction() {
6161
val file = editor.file!!
6262

6363
val isXml = file.name.endsWith(".xml")
64-
64+
6565
if (!isXml) {
6666
markInvisible()
6767
return
6868
}
69-
69+
7070
val type = try {
7171
extractPathData(file).type
7272
} catch (err: Throwable) {

app/src/main/java/com/itsaky/androidide/actions/file/FileTabAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ abstract class FileTabAction : EditorActivityAction() {
4848
return
4949
}
5050

51-
visible = activity.viewModel.getOpenedFiles().isNotEmpty()
51+
visible = activity.editorViewModel.getOpenedFiles().isNotEmpty()
5252
enabled = visible
5353
}
5454

app/src/main/java/com/itsaky/androidide/actions/file/SaveFileAction.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class SaveFileAction(context: Context) : EditorRelatedAction() {
5050
return
5151
}
5252

53-
visible = context.viewModel.getOpenedFiles().isNotEmpty()
53+
visible = context.editorViewModel.getOpenedFiles().isNotEmpty()
5454
enabled = context.areFilesModified()
5555
}
5656

@@ -81,7 +81,7 @@ class SaveFileAction(context: Context) : EditorRelatedAction() {
8181
}
8282

8383
if (saveResult.gradleSaved) {
84-
context.notifySyncNeeded()
84+
context.editorViewModel.isSyncNeeded = true
8585
}
8686

8787
context.invalidateOptionsMenu()

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

Lines changed: 12 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCa
4646
import com.google.android.material.snackbar.Snackbar
4747
import com.google.android.material.tabs.TabLayout
4848
import com.google.android.material.tabs.TabLayout.Tab
49-
import com.itsaky.androidide.R.attr
50-
import com.itsaky.androidide.R.drawable
5149
import com.itsaky.androidide.R.string
5250
import com.itsaky.androidide.actions.ActionItem.Location.EDITOR_FILE_TABS
5351
import com.itsaky.androidide.adapters.DiagnosticsAdapter
@@ -69,21 +67,15 @@ import com.itsaky.androidide.models.Range
6967
import com.itsaky.androidide.models.SearchResult
7068
import com.itsaky.androidide.projects.ProjectManager.getProjectDirPath
7169
import com.itsaky.androidide.projects.ProjectManager.projectPath
72-
import com.itsaky.androidide.projects.builder.BuildService
7370
import com.itsaky.androidide.ui.ContentTranslatingDrawerLayout
7471
import com.itsaky.androidide.ui.editor.CodeEditorView
7572
import com.itsaky.androidide.uidesigner.UIDesignerActivity
7673
import com.itsaky.androidide.utils.ActionMenuUtils.createMenu
7774
import com.itsaky.androidide.utils.ApkInstallationSessionCallback
78-
import com.itsaky.androidide.utils.DURATION_INDEFINITE
7975
import com.itsaky.androidide.utils.DialogUtils.newMaterialDialogBuilder
8076
import com.itsaky.androidide.utils.ILogger
8177
import com.itsaky.androidide.utils.InstallationResultHandler.onResult
8278
import com.itsaky.androidide.utils.flashError
83-
import com.itsaky.androidide.utils.flashbarBuilder
84-
import com.itsaky.androidide.utils.resolveAttr
85-
import com.itsaky.androidide.utils.showOnUiThread
86-
import com.itsaky.androidide.utils.withIcon
8779
import com.itsaky.androidide.viewmodel.EditorViewModel
8880
import com.itsaky.androidide.xml.resources.ResourceTableRegistry
8981
import com.itsaky.androidide.xml.versions.ApiVersionsRegistry
@@ -114,7 +106,8 @@ abstract class BaseEditorActivity :
114106
internal var installationCallback: ApkInstallationSessionCallback? = null
115107

116108
var uiDesignerResultLauncher: ActivityResultLauncher<Intent>? = null
117-
val viewModel by viewModels<EditorViewModel>()
109+
val editorViewModel by viewModels<EditorViewModel>()
110+
118111
lateinit var binding: ActivityEditorBinding
119112
protected set
120113

@@ -252,12 +245,12 @@ abstract class BaseEditorActivity :
252245

253246
override fun onTabSelected(tab: Tab) {
254247
val position = tab.position
255-
viewModel.displayedFileIndex = position
248+
editorViewModel.displayedFileIndex = position
256249

257250
val editorView = provideEditorAt(position)!!
258251
editorView.onEditorSelected()
259252

260-
viewModel.setCurrentFile(position, editorView.file)
253+
editorViewModel.setCurrentFile(position, editorView.file)
261254
refreshSymbolInput(editorView)
262255
invalidateOptionsMenu()
263256
}
@@ -344,27 +337,6 @@ abstract class BaseEditorActivity :
344337
.show()
345338
}
346339

347-
fun notifySyncNeeded(onConfirm: () -> Unit) {
348-
val buildService = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE)
349-
if (buildService == null || buildService.isBuildInProgress) return
350-
351-
flashbarBuilder(
352-
duration = DURATION_INDEFINITE,
353-
backgroundColor = resolveAttr(attr.colorSecondaryContainer),
354-
messageColor = resolveAttr(attr.colorOnSecondaryContainer)
355-
)
356-
.withIcon(drawable.ic_sync, colorFilter = resolveAttr(attr.colorOnSecondaryContainer))
357-
.message(string.msg_sync_needed)
358-
.positiveActionText(string.btn_sync)
359-
.positiveActionTapListener {
360-
onConfirm()
361-
it.dismiss()
362-
}
363-
.negativeActionText(string.btn_ignore_changes)
364-
.negativeActionTapListener { it.dismiss() }
365-
.showOnUiThread()
366-
}
367-
368340
open fun getFileTreeFragment(): FileTreeFragment? {
369341
if (filesTreeFragment == null) {
370342
filesTreeFragment =
@@ -374,8 +346,8 @@ abstract class BaseEditorActivity :
374346
}
375347

376348
fun doSetStatus(text: CharSequence, @GravityInt gravity: Int) {
377-
viewModel.statusText = text
378-
viewModel.statusGravity = gravity
349+
editorViewModel.statusText = text
350+
editorViewModel.statusGravity = gravity
379351
}
380352

381353
private fun tryLaunchApp(packageName: String) {
@@ -440,18 +412,18 @@ abstract class BaseEditorActivity :
440412

441413
private fun onBuildStatusChanged() {
442414
log.debug(
443-
"onBuildStatusChanged: isInitializing: ${viewModel.isInitializing}, isBuildInProgress: ${viewModel.isBuildInProgress}")
444-
val visible = viewModel.isBuildInProgress || viewModel.isInitializing
415+
"onBuildStatusChanged: isInitializing: ${editorViewModel.isInitializing}, isBuildInProgress: ${editorViewModel.isBuildInProgress}")
416+
val visible = editorViewModel.isBuildInProgress || editorViewModel.isInitializing
445417
binding.buildProgressIndicator.visibility = if (visible) View.VISIBLE else View.GONE
446418
invalidateOptionsMenu()
447419
}
448420

449421
private fun setupViews() {
450-
viewModel._isBuildInProgress.observe(this) { onBuildStatusChanged() }
451-
viewModel._isInitializing.observe(this) { onBuildStatusChanged() }
452-
viewModel._statusText.observe(this) { binding.bottomSheet.setStatus(it.first, it.second) }
422+
editorViewModel._isBuildInProgress.observe(this) { onBuildStatusChanged() }
423+
editorViewModel._isInitializing.observe(this) { onBuildStatusChanged() }
424+
editorViewModel._statusText.observe(this) { binding.bottomSheet.setStatus(it.first, it.second) }
453425

454-
viewModel.observeFiles(this) { files ->
426+
editorViewModel.observeFiles(this) { files ->
455427
binding.apply {
456428
if (files.isNullOrEmpty()) {
457429
tabs.visibility = View.GONE

0 commit comments

Comments
 (0)