Skip to content

Commit 1165f12

Browse files
committed
fix(projects): introduce workspace API and remove 'Project' model
1 parent dba601b commit 1165f12

File tree

51 files changed

+674
-538
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+674
-538
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ class FindInProjectAction() : EditorActivityAction() {
4747
return
4848
}
4949

50-
val project = IProjectManager.getInstance().rootProject
51-
if (project == null || project.subProjects.isEmpty()) {
50+
val project = IProjectManager.getInstance().getWorkspace()
51+
if (project == null || project.getSubProjects().isEmpty()) {
5252
markInvisible()
5353
return
5454
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.itsaky.androidide.actions.EditorActivityAction
2626
import com.itsaky.androidide.actions.markInvisible
2727
import com.itsaky.androidide.actions.openApplicationModuleChooser
2828
import com.itsaky.androidide.projects.IProjectManager
29+
import com.itsaky.androidide.projects.android.androidAppProjects
2930
import com.itsaky.androidide.utils.IntentUtils
3031
import com.itsaky.androidide.utils.flashError
3132
import org.slf4j.LoggerFactory
@@ -58,8 +59,11 @@ class LaunchAppAction(context: Context, override val order: Int) : EditorActivit
5859

5960
visible = true
6061

61-
val projectManager = IProjectManager.getInstance()
62-
enabled = projectManager.getAndroidAppModules().isNotEmpty()
62+
enabled = IProjectManager.getInstance()
63+
.getWorkspace()
64+
?.androidAppProjects()
65+
?.iterator()
66+
?.hasNext() == true
6367
}
6468

6569
override suspend fun execAction(data: ActionData) {

core/app/src/main/java/com/itsaky/androidide/actions/internalActionUtils.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ inline fun openApplicationModuleChooser(data: ActionData,
4141
*/
4242
inline fun openApplicationModuleChooser(context: Context,
4343
crossinline callback: (AndroidModule) -> Unit) {
44-
val projectManager = IProjectManager.getInstance()
45-
val applications = projectManager.getAndroidAppModules()
44+
val applications = IProjectManager.getInstance()
45+
.getWorkspace()
46+
?.androidProjects()
47+
?.filter(AndroidModule::isApplication)
48+
?.toList() ?: emptyList()
49+
4650
if (applications.isEmpty()) {
4751
flashError(R.string.msg_launch_failure_no_app_module)
4852
ILogger.ROOT.error("Cannot run application. No application modules found in project.")
@@ -61,7 +65,8 @@ inline fun openApplicationModuleChooser(context: Context,
6165
context,
6266
context.getString(R.string.title_choose_application),
6367
applications.map { it.path }.toTypedArray(),
64-
0) { selection ->
68+
0
69+
) { selection ->
6570
val app = applications[selection]
6671
ILogger.ROOT.info("Selected application: '{}'", app.path)
6772
callback(app)

core/app/src/main/java/com/itsaky/androidide/actions/sidebar/TerminalSidebarAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class TerminalSidebarAction(context: Context, override val order: Int) : Abstrac
5858
)
5959
putExtra(
6060
TERMUX_ACTIVITY.EXTRA_SESSION_NAME,
61-
IProjectManager.getInstance().rootProject?.rootProject?.name
61+
IProjectManager.getInstance().getWorkspace()?.getRootProject()?.name
6262
)
6363
putExtra(TERMUX_ACTIVITY.EXTRA_FAILSAFE_SESSION, isFailsafe)
6464
}

core/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import com.itsaky.androidide.activities.editor.EditorActivityKt
3232
import com.itsaky.androidide.app.EdgeToEdgeIDEActivity
3333
import com.itsaky.androidide.databinding.ActivityMainBinding
3434
import com.itsaky.androidide.preferences.internal.GeneralPreferences
35-
import com.itsaky.androidide.projects.internal.ProjectManagerImpl
35+
import com.itsaky.androidide.projects.IProjectManager
3636
import com.itsaky.androidide.resources.R.string
3737
import com.itsaky.androidide.templates.ITemplateProvider
3838
import com.itsaky.androidide.utils.DialogUtils
@@ -196,7 +196,7 @@ class MainActivity : EdgeToEdgeIDEActivity() {
196196
}
197197

198198
internal fun openProject(root: File) {
199-
ProjectManagerImpl.getInstance().projectPath = root.absolutePath
199+
IProjectManager.getInstance().openProject(root)
200200
startActivity(Intent(this, EditorActivityKt::class.java))
201201
}
202202

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ import com.itsaky.androidide.models.Range
8484
import com.itsaky.androidide.models.SearchResult
8585
import com.itsaky.androidide.preferences.internal.BuildPreferences
8686
import com.itsaky.androidide.projects.IProjectManager
87-
import com.itsaky.androidide.projects.internal.ProjectManagerImpl
8887
import com.itsaky.androidide.tasks.cancelIfActive
8988
import com.itsaky.androidide.ui.CodeEditorView
9089
import com.itsaky.androidide.ui.ContentTranslatingDrawerLayout
@@ -325,9 +324,8 @@ abstract class BaseEditorActivity : EdgeToEdgeIDEActivity(), TabLayout.OnTabSele
325324
registerLanguageServers()
326325

327326
if (savedInstanceState != null && savedInstanceState.containsKey(KEY_PROJECT_PATH)) {
328-
ProjectManagerImpl.getInstance().projectPath = savedInstanceState.getString(
329-
KEY_PROJECT_PATH
330-
)!!
327+
IProjectManager.getInstance()
328+
.openProject(savedInstanceState.getString(KEY_PROJECT_PATH)!!)
331329
}
332330

333331
onBackPressedDispatcher.addCallback(this, onBackPressedCallback)

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ import com.itsaky.androidide.lookup.Lookup
3939
import com.itsaky.androidide.lsp.IDELanguageClientImpl
4040
import com.itsaky.androidide.lsp.java.utils.CancelChecker
4141
import com.itsaky.androidide.preferences.internal.GeneralPreferences
42-
import com.itsaky.androidide.projects.internal.ProjectManagerImpl
4342
import com.itsaky.androidide.projects.GradleProject
4443
import com.itsaky.androidide.projects.builder.BuildService
44+
import com.itsaky.androidide.projects.internal.ProjectManagerImpl
4545
import com.itsaky.androidide.services.builder.GradleBuildService
4646
import com.itsaky.androidide.services.builder.GradleBuildServiceConnnection
4747
import com.itsaky.androidide.services.builder.gradleDistributionParams
@@ -320,7 +320,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
320320
// use the default variant selections
321321
if (currentVariants == null) {
322322
log.debug(
323-
"No variant selection information available. Default build variants will be selected.")
323+
"No variant selection information available. Default build variants will be selected."
324+
)
324325
initializeProject(emptyMap())
325326
return
326327
}
@@ -355,7 +356,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
355356
*/
356357
fun initializeProject(buildVariants: Map<String, String>) {
357358
val manager = ProjectManagerImpl.getInstance()
358-
val projectDir = File(manager.projectPath)
359+
val projectDir = manager.projectDir
359360
if (!projectDir.exists()) {
360361
log.error("GradleProject directory does not exist. Cannot initialize project")
361362
return
@@ -471,7 +472,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
471472
if (pid != metadata.pid) {
472473
log.warn(
473474
"Tooling server pid mismatch. Expected: {}, Actual: {}. Replacing memory watcher...",
474-
pid, metadata.pid)
475+
pid, metadata.pid
476+
)
475477
memoryUsageWatcher.watchProcess(metadata.pid, PROC_GRADLE_TOOLING)
476478
resetMemUsageChart()
477479
}
@@ -495,7 +497,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
495497
editorActivityScope.launch(Dispatchers.IO) {
496498
manager.setupProject()
497499
manager.notifyProjectUpdate()
498-
updateBuildVariants(manager.androidBuildVariants)
500+
updateBuildVariants(manager.requireWorkspace().getAndroidVariantSelections())
499501

500502
com.itsaky.androidide.tasks.runOnUiThread {
501503
postProjectInit(true, null)
@@ -552,15 +554,15 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
552554

553555
protected open fun createFindInProjectDialog(): AlertDialog? {
554556
val manager = ProjectManagerImpl.getInstance()
555-
if (manager.rootProject == null) {
557+
if (manager.getWorkspace() == null) {
556558
log.warn("No root project model found. Is the project initialized?")
557559
flashError(getString(string.msg_project_not_initialized))
558560
return null
559561
}
560562

561563
val moduleDirs =
562564
try {
563-
manager.rootProject!!.subProjects.stream().map(GradleProject::projectDir)
565+
manager.getWorkspace()!!.getSubProjects().stream().map(GradleProject::projectDir)
564566
.collect(Collectors.toList())
565567
} catch (e: Throwable) {
566568
flashError(getString(string.msg_no_modules))
@@ -655,13 +657,13 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() {
655657
val manager = ProjectManagerImpl.getInstance()
656658
GeneralPreferences.lastOpenedProject = manager.projectDirPath
657659
try {
658-
val project = manager.rootProject
659-
if (project == null) {
660+
val workspace = manager.getWorkspace()
661+
if (workspace == null) {
660662
log.warn("GradleProject not initialized. Skipping initial setup...")
661663
return
662664
}
663665

664-
var projectName = project.rootProject.name
666+
var projectName = workspace.getRootProject().name
665667
if (projectName.isEmpty()) {
666668
projectName = manager.projectDir.name
667669
}

core/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,10 @@ class RunTasksDialogFragment : BottomSheetDialogFragment() {
177177
viewModel.displayedChild = CHILD_LOADING
178178

179179
executeAsync({
180-
val project = IProjectManager.getInstance().rootProject
180+
val workspace = IProjectManager.getInstance().getWorkspace()
181181
?: return@executeAsync emptyList<Checkable<GradleTask>>()
182182

183-
return@executeAsync project.subProjects
183+
return@executeAsync workspace.getSubProjects()
184184
.flatMap<GradleProject, GradleTask> { it.tasks }
185185
.map<GradleTask, Checkable<GradleTask>> {
186186
Checkable<GradleTask>(false, it)

core/app/src/main/java/com/itsaky/androidide/indexing/platform/PlatformIndexService.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package com.itsaky.androidide.indexing.platform
1919

2020
import com.google.auto.service.AutoService
2121
import com.itsaky.androidide.indexing.IIndexService
22-
import com.itsaky.androidide.projects.Project
22+
import com.itsaky.androidide.projects.IWorkspace
2323
import org.slf4j.LoggerFactory
2424
import java.io.File
2525

@@ -36,9 +36,9 @@ internal class PlatformIndexService : IIndexService {
3636
override val displayName: String
3737
get() = "Android Platform Indexing Service"
3838

39-
override fun scanFiles(project: Project): Collection<File> {
39+
override fun scanFiles(workspace: IWorkspace): Collection<File> {
4040
return mutableListOf<File>().apply {
41-
project.findAndroidModules().forEach { androidModule ->
41+
workspace.androidProjects().forEach { androidModule ->
4242
add(androidModule.getPlatformDir()?.also {
4343
log.debug("Adding {} to the list of indexable paths", it)
4444
} ?: return@forEach)
@@ -47,7 +47,7 @@ internal class PlatformIndexService : IIndexService {
4747
}
4848

4949
override suspend fun indexFiles(
50-
project: Project,
50+
workspace: IWorkspace,
5151
files: Collection<File>
5252
) {
5353
}

core/indexing-api/src/main/java/com/itsaky/androidide/indexing/IIndexService.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
package com.itsaky.androidide.indexing
1919

20-
import com.itsaky.androidide.projects.Project
20+
import com.itsaky.androidide.projects.IWorkspace
2121
import kotlinx.coroutines.Deferred
2222
import java.io.File
2323

@@ -36,16 +36,16 @@ interface IIndexService {
3636
/**
3737
* Called to scan files that need to be indexed by this index service.
3838
*
39-
* @param project The root project model which can be used to query the project properties.
39+
* @param workspace The root workspace model which can be used to query the workspace properties.
4040
* @return A [Deferred] collection of files that need to be indexed.
4141
*/
42-
fun scanFiles(project: Project): Collection<File>
42+
fun scanFiles(workspace: IWorkspace): Collection<File>
4343

4444
/**
4545
* Called to index the given files.
4646
*
47-
* @param project The root project model which can be used to query the project properties.
47+
* @param workspace The root workspace model which can be used to query the workspace properties.
4848
* @param files The files to index.
4949
*/
50-
suspend fun indexFiles(project: Project, files: Collection<File>)
50+
suspend fun indexFiles(workspace: IWorkspace, files: Collection<File>)
5151
}

0 commit comments

Comments
 (0)