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

package org.chromium.components.crash;

import org.chromium.base.Callback;
import org.chromium.base.JavaExceptionReporter;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;

/**
 * This is an exception reporter which will delegate to a pure Java reporter until native is loaded.
 *
 * We will use the given PureJava implementation to report crashes, until we see that native is
 * ready, at which point we will use base's {@link JavaExceptionReporter}.
 *
 * @see ChromePureJavaExceptionReporter for Chrome's pure Java implementation.
 * @see AwPureJavaExceptionReporter for Webview's pure Java implementation.
 */
public class NativeAndJavaSmartExceptionReporter {
    private static void uploadReport(Throwable exception, Callback<Throwable> pureJavaReport) {
        if (PureJavaExceptionHandler.isEnabled()) {
            pureJavaReport.onResult(exception);
        } else {
            // The native exception reporter requires to be called on the UI thread.
            PostTask.postTask(TaskTraits.UI_BEST_EFFORT,
                    () -> JavaExceptionReporter.reportException(exception));
        }
    }

    public static void postUploadReport(Throwable exception, Callback<Throwable> pureJavaReport) {
        PostTask.postTask(
                TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> uploadReport(exception, pureJavaReport));
    }
}
