Skip to content

Commit 94449ad

Browse files
committed
fix: implement usage of variant-specific applicationId in actions (fixes AndroidIDEOfficial#1387)
1 parent adee0d6 commit 94449ad

15 files changed

Lines changed: 37 additions & 71 deletions

File tree

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

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.itsaky.androidide.actions.markInvisible
2727
import com.itsaky.androidide.actions.openApplicationModuleChooser
2828
import com.itsaky.androidide.builder.model.UNKNOWN_PACKAGE
2929
import com.itsaky.androidide.projects.IProjectManager
30+
import com.itsaky.androidide.utils.ILogger
3031
import com.itsaky.androidide.utils.IntentUtils
3132
import com.itsaky.androidide.utils.flashError
3233

@@ -38,14 +39,17 @@ import com.itsaky.androidide.utils.flashError
3839
class LaunchAppAction(context: Context, override val order: Int) : EditorActivityAction() {
3940

4041
override val id: String = "ide.editor.launchInstalledApp"
41-
4242
override var requiresUIThread: Boolean = true
4343

4444
init {
4545
label = context.getString(R.string.title_launch_app)
4646
icon = ContextCompat.getDrawable(context, R.drawable.ic_open_external)
4747
}
4848

49+
companion object {
50+
private val log = ILogger.newInstance("LaunchAppAction")
51+
}
52+
4953
override fun prepare(data: ActionData) {
5054
super.prepare(data)
5155
data.getActivity() ?: run {
@@ -61,14 +65,26 @@ class LaunchAppAction(context: Context, override val order: Int) : EditorActivit
6165

6266
override suspend fun execAction(data: ActionData) {
6367
openApplicationModuleChooser(data) { app ->
64-
val packageName = app.packageName
65-
if (packageName == UNKNOWN_PACKAGE) {
68+
val variant = app.getSelectedVariant()
69+
70+
log.debug("Selected variant: ${variant?.name}")
71+
72+
if (variant == null) {
73+
flashError(R.string.err_selected_variant_not_found)
74+
return@openApplicationModuleChooser
75+
}
76+
77+
val applicationId = variant.mainArtifact.applicationId
78+
if (applicationId == null) {
79+
log.error("Unable to launch application. variant.mainArtifact.applicationId is null")
6680
flashError(R.string.err_cannot_determine_package)
6781
return@openApplicationModuleChooser
6882
}
6983

84+
log.info("Launching application: $applicationId")
85+
7086
val activity = data.requireActivity()
71-
IntentUtils.launchApp(activity, packageName, logError = false)
87+
IntentUtils.launchApp(activity, applicationId, logError = false)
7288
}
7389
}
7490

build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ plugins {
2828
alias(libs.plugins.android.application) apply false
2929
alias(libs.plugins.android.library) apply false
3030
alias(libs.plugins.kotlin.android) apply false
31-
alias(libs.plugins.kotlin.jvm) apply false
3231
alias(libs.plugins.maven.publish) apply false
3332
alias(libs.plugins.gradle.publish) apply false
3433
}

classes

Whitespace-only changes.

gradle/libs.versions.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,5 @@ maven-publish = { module = "com.vanniktech:gradle-maven-publish-plugin", version
148148
android-application = { id = "com.android.application", version.ref = "agp" }
149149
android-library = { id = "com.android.library", version.ref = "agp" }
150150
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
151-
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
152151
maven-publish = { id = "com.vanniktech.maven.publish.base", version.ref = "maven-publish-plugin" }
153152
gradle-publish = { id = "com.gradle.plugin-publish", version = "1.2.1" }

subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ import java.util.concurrent.CompletableFuture
6666
* @param buildDir The build directory of the project.
6767
* @param buildScript The Gradle buildscript file of the project.
6868
* @param tasks The tasks of the project.
69-
* @param packageName The package name of this module extracted from `AndroidManifest.xml`.
7069
* @param resourcePrefix The resource prefix.
7170
* @param namespace The namespace of this project. As defined in the buildscript.
7271
* @param androidTestNamespace The androidTestNamespace of this project. As defined in the
@@ -95,7 +94,6 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this..
9594
buildDir: File,
9695
buildScript: File,
9796
tasks: List<GradleTask>,
98-
open val packageName: String, // Property must be open because BaseXMLTest mocks this...
9997
val resourcePrefix: String?,
10098
val namespace: String?,
10199
val androidTestNamespace: String?,
@@ -306,24 +304,23 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this..
306304

307305
/** Get the resource table for this module i.e. without resource tables for dependent modules. */
308306
fun getResourceTable(): ResourceTable? {
309-
if (this.packageName == UNKNOWN_PACKAGE) {
310-
return null
311-
}
307+
val namespace = this.namespace ?: return null
308+
312309
val resDirs = mainSourceSet?.sourceProvider?.resDirectories ?: return null
313-
return ResourceTableRegistry.getInstance().forPackage(this.packageName, *resDirs.toTypedArray())
310+
return ResourceTableRegistry.getInstance().forPackage(namespace, *resDirs.toTypedArray())
314311
}
315312

316313
/** Updates the resource table for this module. */
317314
fun updateResourceTable() {
318-
if (this.packageName == UNKNOWN_PACKAGE) {
315+
if (this.namespace == null) {
319316
return
320317
}
321318

322319
CompletableFuture.runAsync {
323320
val tableRegistry = ResourceTableRegistry.getInstance()
324321
val resDirs = mainSourceSet?.sourceProvider?.resDirectories ?: return@runAsync
325-
tableRegistry.removeTable(this.packageName)
326-
tableRegistry.forPackage(this.packageName, *resDirs.toTypedArray())
322+
tableRegistry.removeTable(this.namespace)
323+
tableRegistry.forPackage(this.namespace, *resDirs.toTypedArray())
327324
}
328325
}
329326

subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ class ProjectTransformer {
9999
buildDir = metadata.buildDir,
100100
buildScript = metadata.buildScript,
101101
tasks = project.getTasks().get(),
102-
packageName = metadata.packageName,
103102
resourcePrefix = metadata.resourcePrefix,
104103
namespace = metadata.namespace,
105104
androidTestNamespace = metadata.androidTestNamespace,

subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/internal/AndroidProjectImpl.kt

Lines changed: 1 addition & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,6 @@ internal class AndroidProjectImpl(
6666

6767
private val serialVersionUID = 1L
6868

69-
private var shouldLookupPackage = true
70-
var packageName: String = UNKNOWN_PACKAGE
71-
get() {
72-
if (field == UNKNOWN_PACKAGE && shouldLookupPackage) {
73-
findPackageName()
74-
}
75-
76-
return field
77-
}
78-
7969
override fun getConfiguredVariant(): CompletableFuture<String> {
8070
return CompletableFuture.completedFuture(this.configuredVariant)
8171
}
@@ -190,39 +180,14 @@ internal class AndroidProjectImpl(
190180
val viewBindingOptions = androidProject.viewBindingOptions?.let(
191181
AndroidModulePropertyCopier::copy) ?: DefaultViewBindingOptions()
192182

193-
return@supplyAsync AndroidProjectMetadata(gradleMetadata, packageName,
183+
return@supplyAsync AndroidProjectMetadata(gradleMetadata,
194184
basicAndroidProject.projectType, copy(androidProject.flags),
195185
copy(androidProject.javaCompileOptions), viewBindingOptions, androidProject.resourcePrefix,
196186
androidProject.namespace, androidProject.androidTestNamespace,
197187
androidProject.testFixturesNamespace, getClassesJar())
198188
}
199189
}
200190

201-
private fun findPackageName() {
202-
203-
val namespace = androidProject.namespace
204-
if (namespace.isNotBlank()) {
205-
this.packageName = namespace
206-
this.shouldLookupPackage = false
207-
return
208-
}
209-
210-
val mainSourceSet = basicAndroidProject.mainSourceSet
211-
if (mainSourceSet == null) {
212-
shouldLookupPackage = false
213-
return
214-
}
215-
216-
val manifestFile = mainSourceSet.sourceProvider.manifestFile
217-
if (manifestFile == DefaultSourceProvider.NoFile) {
218-
shouldLookupPackage = false
219-
return
220-
}
221-
222-
this.packageName = extractPackageName(manifestFile) ?: UNKNOWN_PACKAGE
223-
this.shouldLookupPackage = false
224-
}
225-
226191
private fun AndroidArtifact.computeApplicationId(variantName: String): String? {
227192
val minAgpForAppId = AndroidPluginVersion(7, 4, 0)
228193
return if (minAgpForAppId <= AndroidPluginVersion.parse(versions.agp)) {

subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/common.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ internal fun performBasicProjectAssertions(project: IProject, server: IToolingAp
7373
assertThat(metadata.javaCompileOptions.isCoreLibraryDesugaringEnabled).isFalse()
7474
assertThat(metadata.androidType)
7575
.isEqualTo(com.android.builder.model.v2.ide.ProjectType.APPLICATION)
76-
assertThat(metadata.packageName).isEqualTo("com.itsaky.test.app")
76+
assertThat(metadata.namespace).isEqualTo("com.itsaky.test.app")
7777
assertThat(metadata.viewBindingOptions).isNotNull()
7878
assertThat(metadata.viewBindingOptions.isEnabled).isTrue()
7979

subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/AndroidProjectMetadata.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ class AndroidProjectMetadata(
3636
description: String?,
3737
buildScript: File,
3838
type: ProjectType,
39-
val packageName: String,
4039
val androidType: AndroidProjectType,
4140
val flags: DefaultAndroidGradlePluginProjectFlags,
4241
val javaCompileOptions: DefaultJavaCompileOptions,
@@ -51,7 +50,6 @@ class AndroidProjectMetadata(
5150

5251
constructor(
5352
base: ProjectMetadata,
54-
packageName: String,
5553
androidType: AndroidProjectType,
5654
flags: DefaultAndroidGradlePluginProjectFlags,
5755
javaCompileOptiosn: DefaultJavaCompileOptions,
@@ -70,7 +68,6 @@ class AndroidProjectMetadata(
7068
base.description,
7169
base.buildScript,
7270
base.type,
73-
packageName,
7471
androidType,
7572
flags,
7673
javaCompileOptiosn,

testing/android/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
* along with AndroidIDE. If not, see <https://www.gnu.org/licenses/>.
1616
*/
1717

18-
@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
1918
plugins {
2019
id("com.android.library")
2120
kotlin("android")

0 commit comments

Comments
 (0)