summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Smith <smithbradley@google.com>2022-05-18 20:00:54 -0700
committerBradley Smith <smithbradley@google.com>2022-05-23 20:27:42 +0000
commitd396da7b75df3ee0d38caa7157865c92850484a4 (patch)
treec7b755f913265c14a57230704188a173fb739849
parent35704a1bc880deee597e85a8147c513bcc42e9d0 (diff)
downloadidea-d396da7b75df3ee0d38caa7157865c92850484a4.tar.gz
Correctly record the number of Gradle projects
We used to use the number of IDE modules to record the number of Gradle projects when tracking the project structure. This used to be roughly correct since each Gradle project mapped to a single IDE modules. As of switching on Module Per Source Set this number became wildly wrong. This change re-adjusts the number recorded by traversing the ExternalProject tree that the platform obtains from Gradle. Each ExternalProject is built from exactly one Gradle project. Fixes: 233115161 Test: test updated, mannually checked for some larger projects Change-Id: If9c59c6ed3272a8b32c1eddf13924b775d36093f
-rw-r--r--project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java53
-rw-r--r--project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt4
-rw-r--r--project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java3
3 files changed, 42 insertions, 18 deletions
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java
index a039cbe001d..c5cb397cb88 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTracker.java
@@ -45,14 +45,14 @@ import com.google.wireless.android.sdk.stats.GradleNativeAndroidModule;
import com.google.wireless.android.sdk.stats.GradleNativeAndroidModule.NativeBuildSystemType;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
import java.util.ArrayList;
import java.util.List;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.gradle.model.ExternalProject;
+import org.jetbrains.plugins.gradle.service.project.data.ExternalProjectDataCache;
/**
* Tracks, using {@link UsageTracker}, the structure of a project.
@@ -66,11 +66,13 @@ public class ProjectStructureUsageTracker {
myProject = project;
}
- public void trackProjectStructure() {
+ public void trackProjectStructure(@NotNull String linkedGradleBuildPath) {
ApplicationManager.getApplication().executeOnPooledThread(() -> {
- ModuleManager moduleManager = ModuleManager.getInstance(myProject);
try {
- trackProjectStructure(moduleManager.getModules());
+ ExternalProject externalProject = ExternalProjectDataCache.getInstance(myProject).getRootExternalProject(linkedGradleBuildPath);
+ if (externalProject != null) {
+ trackProjectStructure(externalProject);
+ }
}
catch (Throwable e) {
// Any errors in project tracking should not be displayed to the user.
@@ -80,7 +82,7 @@ public class ProjectStructureUsageTracker {
}
@VisibleForTesting
- void trackProjectStructure(@NotNull Module[] modules) {
+ void trackProjectStructure(@NotNull ExternalProject externalProject) {
GradleAndroidModel appModel = null;
GradleAndroidModel libModel = null;
@@ -92,15 +94,23 @@ public class ProjectStructureUsageTracker {
for (AndroidFacet facet : ProjectSystemUtil.getAndroidFacets(myProject)) {
GradleAndroidModel androidModel = GradleAndroidModel.get(facet);
if (androidModel != null) {
- if (androidModel.getAndroidProject().getProjectType() == IdeAndroidProjectType.PROJECT_TYPE_LIBRARY) {
- libModel = androidModel;
- libCount++;
- continue;
+ switch (androidModel.getAndroidProject().getProjectType()) {
+ case PROJECT_TYPE_LIBRARY:
+ libModel = androidModel;
+ libCount++;
+ break;
+ case PROJECT_TYPE_APP:
+ appModel = androidModel;
+ appCount++;
+ GradleLibrary gradleLibrary = trackExternalDependenciesInAndroidApp(androidModel);
+ gradleLibraries.add(gradleLibrary);
+ break;
+ case PROJECT_TYPE_ATOM:
+ case PROJECT_TYPE_DYNAMIC_FEATURE:
+ case PROJECT_TYPE_FEATURE:
+ case PROJECT_TYPE_INSTANTAPP:
+ case PROJECT_TYPE_TEST:
}
- appModel = androidModel;
- appCount++;
- GradleLibrary gradleLibrary = trackExternalDependenciesInAndroidApp(androidModel);
- gradleLibraries.add(gradleLibrary);
}
}
@@ -119,7 +129,7 @@ public class ProjectStructureUsageTracker {
}
// @formatter:off
- GradleModule gradleModule = GradleModule.newBuilder().setTotalModuleCount(modules.length)
+ GradleModule gradleModule = GradleModule.newBuilder().setTotalModuleCount(countGradleProjects(externalProject))
.setAppModuleCount(appCount)
.setLibModuleCount(libCount)
.build();
@@ -217,4 +227,17 @@ public class ProjectStructureUsageTracker {
.build();
// @formatter:on
}
+
+ private static int countGradleProjects(@NotNull ExternalProject externalProject) {
+ List<ExternalProject> projects = new ArrayList<>();
+ projects.add(externalProject);
+ int count = 0;
+ while (!projects.isEmpty()) {
+ count++;
+ ExternalProject project = projects.remove(0);
+ projects.addAll(project.getChildProjects().values());
+ }
+
+ return count;
+ }
}
diff --git a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt
index 5a29d4b997e..7ad14980d83 100644
--- a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt
+++ b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/sync/AndroidModuleDataService.kt
@@ -210,7 +210,9 @@ internal constructor(private val myModuleValidatorFactory: AndroidModuleValidato
.checkSettings(project, TimeBasedReminder(project, "memory.settings.postsync", TimeUnit.DAYS.toMillis(1)))
}
- ProjectStructureUsageTracker(project).trackProjectStructure()
+ if (projectData != null) {
+ ProjectStructureUsageTracker(project).trackProjectStructure(projectData.linkedExternalProjectPath)
+ }
SupportedModuleChecker.getInstance().checkForSupportedModules(project)
diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java
index 037d9168b77..c8164a8bead 100644
--- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java
+++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/setup/post/ProjectStructureUsageTrackerTest.java
@@ -21,7 +21,6 @@ import com.android.tools.analytics.LoggedUsage;
import com.android.tools.analytics.TestUsageTracker;
import com.android.tools.analytics.UsageTracker;
import com.android.tools.idea.gradle.plugin.LatestKnownPluginVersionProvider;
-import com.android.tools.idea.gradle.project.sync.idea.ModuleUtil;
import com.android.tools.idea.gradle.util.GradleVersions;
import com.android.tools.idea.stats.AnonymizerUtil;
import com.android.tools.idea.testing.AndroidGradleTestCase;
@@ -81,7 +80,7 @@ public class ProjectStructureUsageTrackerTest extends AndroidGradleTestCase {
.setJarDependencyCount(12)
.setAarDependencyCount(49))
.addModules(GradleModule.newBuilder()
- .setTotalModuleCount(9)
+ .setTotalModuleCount(3)
.setAppModuleCount(1)
.setLibModuleCount(1))
.addAndroidModules(GradleAndroidModule.newBuilder()