Desugared library nio: Support all FileAttributeView

Change-Id: I3d3f4cc871a8cc07bb4c3ffb026ac32e71f6c11d
diff --git a/src/library_desugar/java/j$/nio/file/attribute/AclFileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/AclFileAttributeView.java
new file mode 100644
index 0000000..1b9da3d
--- /dev/null
+++ b/src/library_desugar/java/j$/nio/file/attribute/AclFileAttributeView.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.nio.file.attribute;
+
+public class AclFileAttributeView {}
diff --git a/src/library_desugar/java/j$/nio/file/attribute/UserDefinedFileAttributeView.java b/src/library_desugar/java/j$/nio/file/attribute/UserDefinedFileAttributeView.java
new file mode 100644
index 0000000..490fcec
--- /dev/null
+++ b/src/library_desugar/java/j$/nio/file/attribute/UserDefinedFileAttributeView.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package j$.nio.file.attribute;
+
+public class UserDefinedFileAttributeView {}
diff --git a/src/library_desugar/java/java/nio/file/FileApiFlips.java b/src/library_desugar/java/java/nio/file/FileApiFlips.java
index 24a8d31..3ad0a61 100644
--- a/src/library_desugar/java/java/nio/file/FileApiFlips.java
+++ b/src/library_desugar/java/java/nio/file/FileApiFlips.java
@@ -23,18 +23,21 @@
     if (attributesClass == j$.nio.file.attribute.BasicFileAttributes.class) {
       return java.nio.file.attribute.BasicFileAttributes.class;
     }
-    if (attributesClass == j$.nio.file.attribute.PosixFileAttributes.class) {
-      return java.nio.file.attribute.PosixFileAttributes.class;
-    }
     if (attributesClass == java.nio.file.attribute.BasicFileAttributes.class) {
       return j$.nio.file.attribute.BasicFileAttributes.class;
     }
+    if (attributesClass == j$.nio.file.attribute.PosixFileAttributes.class) {
+      return java.nio.file.attribute.PosixFileAttributes.class;
+    }
     if (attributesClass == java.nio.file.attribute.PosixFileAttributes.class) {
       return j$.nio.file.attribute.PosixFileAttributes.class;
     }
     if (attributesClass == java.nio.file.attribute.DosFileAttributes.class) {
       return j$.nio.file.attribute.DosFileAttributes.class;
     }
+    if (attributesClass == j$.nio.file.attribute.DosFileAttributes.class) {
+      return java.nio.file.attribute.DosFileAttributes.class;
+    }
     throw exception("java.nio.file.attribute.BasicFileAttributes", attributesClass);
   }
 
@@ -45,24 +48,41 @@
     if (attributeView == j$.nio.file.attribute.BasicFileAttributeView.class) {
       return java.nio.file.attribute.BasicFileAttributeView.class;
     }
-    if (attributeView == j$.nio.file.attribute.PosixFileAttributeView.class) {
-      return java.nio.file.attribute.PosixFileAttributeView.class;
-    }
-    if (attributeView == j$.nio.file.attribute.FileOwnerAttributeView.class) {
-      return java.nio.file.attribute.FileOwnerAttributeView.class;
-    }
     if (attributeView == java.nio.file.attribute.BasicFileAttributeView.class) {
       return j$.nio.file.attribute.BasicFileAttributeView.class;
     }
+    if (attributeView == j$.nio.file.attribute.PosixFileAttributeView.class) {
+      return java.nio.file.attribute.PosixFileAttributeView.class;
+    }
     if (attributeView == java.nio.file.attribute.PosixFileAttributeView.class) {
       return j$.nio.file.attribute.PosixFileAttributeView.class;
     }
+    if (attributeView == j$.nio.file.attribute.FileOwnerAttributeView.class) {
+      return java.nio.file.attribute.FileOwnerAttributeView.class;
+    }
     if (attributeView == java.nio.file.attribute.FileOwnerAttributeView.class) {
       return j$.nio.file.attribute.FileOwnerAttributeView.class;
     }
+    // The following ones don't seem to work on any version in Android, but it's still possible
+    // for generic java code to use them and get null as a result.
     if (attributeView == java.nio.file.attribute.DosFileAttributeView.class) {
       return j$.nio.file.attribute.DosFileAttributeView.class;
     }
+    if (attributeView == j$.nio.file.attribute.DosFileAttributeView.class) {
+      return java.nio.file.attribute.DosFileAttributeView.class;
+    }
+    if (attributeView == java.nio.file.attribute.UserDefinedFileAttributeView.class) {
+      return j$.nio.file.attribute.UserDefinedFileAttributeView.class;
+    }
+    if (attributeView == j$.nio.file.attribute.UserDefinedFileAttributeView.class) {
+      return java.nio.file.attribute.UserDefinedFileAttributeView.class;
+    }
+    if (attributeView == java.nio.file.attribute.AclFileAttributeView.class) {
+      return j$.nio.file.attribute.AclFileAttributeView.class;
+    }
+    if (attributeView == j$.nio.file.attribute.AclFileAttributeView.class) {
+      return java.nio.file.attribute.AclFileAttributeView.class;
+    }
     throw exception("java.nio.file.attribute.FileAttributeView", attributeView);
   }
 
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
index 52c5568..f4a3aef 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
@@ -270,7 +270,9 @@
         "java.nio.file.attribute.FileOwnerAttributeView",
         "java.nio.file.attribute.DosFileAttributeView",
         "java.nio.file.attribute.PosixFileAttributeView",
-        "java.nio.file.attribute.BasicFileAttributeView"
+        "java.nio.file.attribute.BasicFileAttributeView",
+        "java.nio.file.attribute.AclFileAttributeView",
+        "java.nio.file.attribute.UserDefinedFileAttributeView"
       ],
       "wrapper_conversion_excluding": {
         "java.nio.channels.AsynchronousFileChannel": [
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
index 63e4f02..27f42f0 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/FilesTest.java
@@ -27,14 +27,17 @@
 import java.nio.file.OpenOption;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
+import java.nio.file.attribute.AclFileAttributeView;
 import java.nio.file.attribute.BasicFileAttributeView;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.nio.file.attribute.DosFileAttributeView;
 import java.nio.file.attribute.DosFileAttributes;
+import java.nio.file.attribute.FileOwnerAttributeView;
 import java.nio.file.attribute.FileTime;
 import java.nio.file.attribute.PosixFileAttributeView;
 import java.nio.file.attribute.PosixFileAttributes;
 import java.nio.file.attribute.PosixFilePermission;
+import java.nio.file.attribute.UserDefinedFileAttributeView;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -63,6 +66,9 @@
           "true",
           "%s",
           "null",
+          "null",
+          "%s",
+          "null",
           "true",
           "%s",
           "unsupported",
@@ -81,12 +87,14 @@
       ImmutableList.of(
           "true",
           "true",
+          "true",
           "Succeeded with POSIX RO:false",
           "Successfully set RO with POSIX",
           "Succeeded with POSIX RO:true");
   private static final List<String> EXPECTED_RESULT_DESUGARING_NON_POSIX =
       ImmutableList.of(
           "null",
+          "null",
           "unsupported",
           "Fail to understand if the file is read-only: class"
               + " java.lang.UnsupportedOperationException",
@@ -153,6 +161,7 @@
       Path path = Files.createTempFile("example", ".txt");
       readWriteThroughFilesAPI(path);
       readThroughFileChannelAPI(path);
+      attributeViewAccess(path);
       attributeAccess(path);
       Files.setAttribute(path, "basic:lastModifiedTime", FileTime.from(Instant.EPOCH));
       pathGeneric();
@@ -247,7 +256,7 @@
       System.out.println(mapping.values().iterator().next().getClass().getPackage().getName());
     }
 
-    private static void attributeAccess(Path path) throws IOException {
+    private static void attributeViewAccess(Path path) throws IOException {
       BasicFileAttributeView basicView =
           Files.getFileAttributeView(path, BasicFileAttributeView.class);
       if (basicView != null) {
@@ -275,6 +284,43 @@
         System.out.println("unsupported");
       }
 
+      try {
+        AclFileAttributeView aclView = Files.getFileAttributeView(path, AclFileAttributeView.class);
+        if (aclView != null) {
+          System.out.println(aclView.getAcl().isEmpty());
+        } else {
+          System.out.println("null");
+        }
+      } catch (UnsupportedOperationException e) {
+        System.out.println("unsupported");
+      }
+
+      try {
+        FileOwnerAttributeView foView =
+            Files.getFileAttributeView(path, FileOwnerAttributeView.class);
+        if (foView != null) {
+          System.out.println(foView.getOwner() != null);
+        } else {
+          System.out.println("null");
+        }
+      } catch (UnsupportedOperationException e) {
+        System.out.println("unsupported");
+      }
+
+      try {
+        UserDefinedFileAttributeView udView =
+            Files.getFileAttributeView(path, UserDefinedFileAttributeView.class);
+        if (udView != null) {
+          System.out.println(udView.name());
+        } else {
+          System.out.println("null");
+        }
+      } catch (UnsupportedOperationException e) {
+        System.out.println("unsupported");
+      }
+    }
+
+    private static void attributeAccess(Path path) throws IOException {
       BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class);
       if (attributes != null) {
         System.out.println(attributes.isRegularFile());