// 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() {
    // Note: this fails on non Android devices.
    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;
  }
}
