// 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 java.adapter;

import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import desugar.sun.nio.fs.DesugarDefaultFileSystemProvider;
import j$.nio.file.FileSystems;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.spi.FileSystemProvider;

/**
 * A hybrid file system provider adapter that delegates different implementations based on the
 * runtime environment.
 */
public final class HybridFileSystemProvider {
  private static final FileSystemProvider INSTANCE = getFileSystemProvider();
  private static final FileSystem FILE_SYSTEM_INSTANCE =
      INSTANCE.getFileSystem(URI.create("file:///"));

  private static FileSystemProvider getFileSystemProvider() {
    try {
      // On API 26 and above, FileSystems is present.
      Class.forName("java.nio.file.FileSystems");
      j$.nio.file.FileSystem fileSystem = FileSystems.getDefault();
      j$.nio.file.spi.FileSystemProvider provider = fileSystem.provider();
      return j$.nio.file.spi.FileSystemProvider.wrap_convert(provider);
    } catch (ClassNotFoundException ignored) {
      // We reach this path is API < 26.
    }
    // The DesugarDefaultFileSystemProvider requires the ThreadPolicy to be set to work correctly.
    // We cannot set the ThreadPolicy in headless and it should not matter.
    // In headless, android.os is absent so the following line will throw.
    // In headfull, android.os is present and we set the thread policy.
    try {
      Class.forName("android.os.Build");
      setThreadPolicy();
    } catch (ClassNotFoundException ignored) {
      // Headless mode.
    }
    return DesugarDefaultFileSystemProvider.instance();
  }

  private static void setThreadPolicy() {
    // The references to the android.os methods need to be outlined.
    // TODO(b/207004118): Fix the strict mode allowlisting.
    ThreadPolicy threadPolicy = StrictMode.getThreadPolicy();
    StrictMode.setThreadPolicy(new ThreadPolicy.Builder(threadPolicy).permitDiskReads().build());
  }

  private HybridFileSystemProvider() {}

  /** Returns the platform's default file system provider. */
  public static FileSystemProvider instance() {
    return INSTANCE;
  }

  /** Returns the platform's default file system. */
  public static FileSystem theFileSystem() {
    return FILE_SYSTEM_INSTANCE;
  }
}
