// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/android/modules/dev_ui/provider/dev_ui_module_provider.h"

#include <utility>

#include "base/android/callback_android.h"
#include "base/android/jni_android.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/android/modules/dev_ui/provider/jni_headers/DevUiModuleProvider_jni.h"

namespace dev_ui {

namespace {

// Global DevUiModuleProvider instance for testing.
DevUiModuleProvider* g_test_instance = nullptr;

}  // namespace

// Destructor is public to enable management by std::unique_ptr<>.
DevUiModuleProvider::~DevUiModuleProvider() = default;

// static
DevUiModuleProvider* DevUiModuleProvider::GetInstance() {
  if (g_test_instance)
    return g_test_instance;

  static DevUiModuleProvider instance;
  return &instance;
}

// static
void DevUiModuleProvider::SetTestInstance(DevUiModuleProvider* test_instance) {
  g_test_instance = test_instance;
}

bool DevUiModuleProvider::ModuleInstalled() {
  return Java_DevUiModuleProvider_isModuleInstalled(
      base::android::AttachCurrentThread());
}

void DevUiModuleProvider::InstallModule(
    base::OnceCallback<void(bool)> on_complete) {
  JNIEnv* env = base::android::AttachCurrentThread();
  // This should always return, since there is no InfoBar UI to retry (thus
  // avoiding crbug.com/41477766 and crbug.com/41477779).
  Java_DevUiModuleProvider_installModule(
      env, base::android::ToJniCallback(env, std::move(on_complete)));
}

void DevUiModuleProvider::EnsureLoaded() {
  Java_DevUiModuleProvider_ensureNativeLoaded(
      base::android::AttachCurrentThread());
}

DevUiModuleProvider::DevUiModuleProvider() = default;

}  // namespace dev_ui

DEFINE_JNI(DevUiModuleProvider)
