AAPT2: Add default no-compress extensions

Change-Id: Iff0820993059bcab59208b07601b2c6d8d953c89
diff --git a/tools/aapt2/Flags.cpp b/tools/aapt2/Flags.cpp
index 2033a4c..3731ac7 100644
--- a/tools/aapt2/Flags.cpp
+++ b/tools/aapt2/Flags.cpp
@@ -69,6 +69,17 @@
     return *this;
 }
 
+Flags& Flags::optionalFlagList(const StringPiece& name, const StringPiece& description,
+                               std::unordered_set<std::string>* value) {
+    auto func = [value](const StringPiece& arg) -> bool {
+        value->insert(arg.toString());
+        return true;
+    };
+
+    mFlags.push_back(Flag{ name.toString(), description.toString(), func, false, 1, false });
+    return *this;
+}
+
 Flags& Flags::optionalSwitch(const StringPiece& name, const StringPiece& description,
                              bool* value) {
     auto func = [value](const StringPiece& arg) -> bool {
diff --git a/tools/aapt2/Flags.h b/tools/aapt2/Flags.h
index ce7a485..b092855 100644
--- a/tools/aapt2/Flags.h
+++ b/tools/aapt2/Flags.h
@@ -23,6 +23,7 @@
 #include <functional>
 #include <ostream>
 #include <string>
+#include <unordered_set>
 #include <vector>
 
 namespace aapt {
@@ -37,6 +38,8 @@
                         Maybe<std::string>* value);
     Flags& optionalFlagList(const StringPiece& name, const StringPiece& description,
                             std::vector<std::string>* value);
+    Flags& optionalFlagList(const StringPiece& name, const StringPiece& description,
+                            std::unordered_set<std::string>* value);
     Flags& optionalSwitch(const StringPiece& name, const StringPiece& description,
                           bool* value);
 
diff --git a/tools/aapt2/link/Link.cpp b/tools/aapt2/link/Link.cpp
index ded661e..1417fd6 100644
--- a/tools/aapt2/link/Link.cpp
+++ b/tools/aapt2/link/Link.cpp
@@ -73,7 +73,7 @@
     bool outputToDirectory = false;
     bool autoAddOverlay = false;
     bool doNotCompressAnything = false;
-    std::vector<std::string> extensionsToNotCompress;
+    std::unordered_set<std::string> extensionsToNotCompress;
     Maybe<std::string> privateSymbols;
     ManifestFixerOptions manifestFixerOptions;
     std::unordered_set<std::string> products;
@@ -287,7 +287,7 @@
     bool keepRawValues = false;
     bool doNotCompressAnything = false;
     bool updateProguardSpec = false;
-    std::vector<std::string> extensionsToNotCompress;
+    std::unordered_set<std::string> extensionsToNotCompress;
 };
 
 class ResourceFileFlattener {
@@ -1728,6 +1728,15 @@
         }
     }
 
+    // Populate some default no-compress extensions that are already compressed.
+    options.extensionsToNotCompress.insert({
+            ".jpg", ".jpeg", ".png", ".gif",
+            ".wav", ".mp2", ".mp3", ".ogg", ".aac",
+            ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
+            ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
+            ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
+            ".amr", ".awb", ".wma", ".wmv", ".webm", ".mkv"});
+
     // Turn off auto versioning for static-libs.
     if (options.staticLib) {
         options.noAutoVersion = true;