Snap for 6798053 from 73902364a12cdb856e8695597c7bf8305f07970b to studio-4.1-release

Change-Id: Id1d0a9529f99f4fd1e1e1629a22aa5f540b087ca
diff --git a/build-system/builder/src/main/java/com/android/builder/png/VectorDrawableRenderer.java b/build-system/builder/src/main/java/com/android/builder/png/VectorDrawableRenderer.java
index b75014b..5d6fec2 100644
--- a/build-system/builder/src/main/java/com/android/builder/png/VectorDrawableRenderer.java
+++ b/build-system/builder/src/main/java/com/android/builder/png/VectorDrawableRenderer.java
@@ -30,6 +30,7 @@
 import com.android.ide.common.vectordrawable.VdPreview;
 import com.android.resources.Density;
 import com.android.resources.ResourceFolderType;
+import com.android.utils.FileUtils;
 import com.android.utils.ILogger;
 import com.google.common.io.Files;
 import java.awt.image.BufferedImage;
@@ -141,8 +142,7 @@
                 // As there is no version qualifier, N density .png format images are generated from
                 // the vectors if they are required e.g when the minimum SDK is below the
                 // PreprocessingReason SDK threshold. A vector with the version qualifier set to the
-                // PR
-                // SDK threshold and ANYDPI density qualifier is created.
+                // PR SDK threshold and ANYDPI density qualifier is created.
                 if (mMinSdk < reason.getSdkThreshold() && mDensities.size() > 0) {
                     for (Density density : mDensities) {
                         FolderConfiguration newConfiguration =
@@ -159,8 +159,25 @@
                 originalConfiguration.setVersionQualifier(
                         new VersionQualifier(reason.getSdkThreshold()));
             }
-            filesToBeGenerated.add(
-                    new File(getDirectory(originalConfiguration), inputXmlFile.getName()));
+
+            // Avoid regenerating a vector with reason.mSdkThreshold which will be directly
+            // generated from a source directory with the SdkThreshold version.
+            FolderConfiguration minSdkSourceConfig =
+                    FolderConfiguration.copyOf(originalConfiguration);
+            if (originalConfiguration.getDensityQualifier()
+                    .isMatchFor(new DensityQualifier(Density.ANYDPI))) {
+                minSdkSourceConfig.removeQualifier(originalConfiguration.getDensityQualifier());
+            }
+            minSdkSourceConfig.setVersionQualifier(new VersionQualifier(reason.mSdkThreshold));
+            File possibleMinReasonSdkResource =
+                    FileUtils.join(
+                            inputXmlFile.getParentFile().getParentFile(),
+                            "drawable-" + minSdkSourceConfig.getQualifierString(),
+                            inputXmlFile.getName());
+            if (filesToBeGenerated.isEmpty() || !possibleMinReasonSdkResource.exists()) {
+                filesToBeGenerated.add(
+                        new File(getDirectory(originalConfiguration), inputXmlFile.getName()));
+            }
         }
 
         return filesToBeGenerated;
diff --git a/build-system/builder/src/test/java/com/android/builder/png/VectorDrawableRendererTest.java b/build-system/builder/src/test/java/com/android/builder/png/VectorDrawableRendererTest.java
index c596439..0f88119 100644
--- a/build-system/builder/src/test/java/com/android/builder/png/VectorDrawableRendererTest.java
+++ b/build-system/builder/src/test/java/com/android/builder/png/VectorDrawableRendererTest.java
@@ -22,6 +22,7 @@
 import com.android.resources.Density;
 import com.android.utils.FileUtils;
 import com.android.utils.NullLogger;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.truth.Truth;
 import java.io.File;
@@ -400,7 +401,7 @@
         writeToFile(input28, VECTOR_WITH_GRADIENT);
         writeToFile(input29, VECTOR_WITH_GRADIENT);
 
-        ImmutableSet.Builder<File> result = ImmutableSet.builder();
+        ImmutableList.Builder<File> result = ImmutableList.builder();
         result.addAll(mRenderer.getFilesToBeGenerated(input))
                 .addAll(mRenderer.getFilesToBeGenerated(input21))
                 .addAll(mRenderer.getFilesToBeGenerated(input22))
@@ -409,23 +410,61 @@
                 .addAll(mRenderer.getFilesToBeGenerated(input29));
 
         assertEquals(
-                ImmutableSet.of(
+                ImmutableList.of(
                         FileUtils.join(mOutput, "drawable-hdpi/icon.png"),
                         FileUtils.join(mOutput, "drawable-mdpi/icon.png"),
                         FileUtils.join(mOutput, "drawable-ldpi/icon.png"),
-                        FileUtils.join(mOutput, "drawable-anydpi-v24/icon.xml"),
                         FileUtils.join(mOutput, "drawable-hdpi-v21/icon.png"),
                         FileUtils.join(mOutput, "drawable-mdpi-v21/icon.png"),
                         FileUtils.join(mOutput, "drawable-ldpi-v21/icon.png"),
                         FileUtils.join(mOutput, "drawable-hdpi-v22/icon.png"),
                         FileUtils.join(mOutput, "drawable-mdpi-v22/icon.png"),
                         FileUtils.join(mOutput, "drawable-ldpi-v22/icon.png"),
+                        FileUtils.join(mOutput, "drawable-anydpi-v24/icon.xml"),
                         FileUtils.join(mOutput, "drawable-anydpi-v28/icon.xml"),
                         FileUtils.join(mOutput, "drawable-anydpi-v29/icon.xml")),
                 result.build());
     }
 
     @Test
+    public void multipleGradientVersionsAndQualifiers() throws Exception {
+        File drawable = new File(mRes, "drawable-port");
+        File input = new File(drawable, "icon.xml");
+
+        File drawable21 = new File(mRes, "drawable-port-v21");
+        File input21 = new File(drawable21, "icon.xml");
+
+        File drawable24 = new File(mRes, "drawable-port-v24");
+        File input24 = new File(drawable24, "icon.xml");
+
+        File drawable29 = new File(mRes, "drawable-port-v29");
+        File input29 = new File(drawable29, "icon.xml");
+
+        writeToFile(input, VECTOR_WITH_GRADIENT);
+        writeToFile(input21, VECTOR_WITH_GRADIENT);
+        writeToFile(input24, VECTOR_WITH_GRADIENT);
+        writeToFile(input29, VECTOR_WITH_GRADIENT);
+
+        ImmutableList.Builder<File> result = ImmutableList.builder();
+        result.addAll(mRenderer.getFilesToBeGenerated(input))
+                .addAll(mRenderer.getFilesToBeGenerated(input21))
+                .addAll(mRenderer.getFilesToBeGenerated(input24))
+                .addAll(mRenderer.getFilesToBeGenerated(input29));
+
+        assertEquals(
+                ImmutableList.of(
+                        FileUtils.join(mOutput, "drawable-port-hdpi/icon.png"),
+                        FileUtils.join(mOutput, "drawable-port-mdpi/icon.png"),
+                        FileUtils.join(mOutput, "drawable-port-ldpi/icon.png"),
+                        FileUtils.join(mOutput, "drawable-port-hdpi-v21/icon.png"),
+                        FileUtils.join(mOutput, "drawable-port-mdpi-v21/icon.png"),
+                        FileUtils.join(mOutput, "drawable-port-ldpi-v21/icon.png"),
+                        FileUtils.join(mOutput, "drawable-port-anydpi-v24/icon.xml"),
+                        FileUtils.join(mOutput, "drawable-port-anydpi-v29/icon.xml")),
+                result.build());
+    }
+
+    @Test
     public void fillTypeSdk23WithoutSupportLibrary() throws Exception {
         mRenderer = new VectorDrawableRenderer(23, false, mOutput, mDensities, NullLogger::new);
         File drawable = new File(mRes, "drawable");