// Copyright 2018 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 com.android.webview.chromium;

import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Looper;

import org.chromium.android_webview.AwContentsClient;
import org.chromium.android_webview.AwContentsStatics;
import org.chromium.android_webview.AwDevToolsServer;
import org.chromium.android_webview.AwSettings;
import org.chromium.base.BuildInfo;
import org.chromium.base.Callback;
import org.chromium.base.MemoryPressureLevel;
import org.chromium.base.ThreadUtils;
import org.chromium.base.memory.MemoryPressureMonitor;
import org.chromium.base.task.PostTask;
import org.chromium.content_public.browser.UiThreadTaskTraits;

import java.util.List;

/**
 * This class provides functionality that is accessed in a static way from apps using WebView.
 * This class is meant to be shared between the webkit-glue layer and the support library glue
 * layer.
 * Ideally this class would live in a lower layer than the webkit-glue layer, to allow sharing the
 * implementation between different glue layers without needing to depend on the webkit-glue layer
 * (right now there are dependencies from this class on the webkit-glue layer though).
 */
public class SharedStatics {
    private AwDevToolsServer mDevToolsServer;

    public SharedStatics() {}

    public String findAddress(String addr) {
        return AwContentsStatics.findAddress(addr);
    }

    public String getDefaultUserAgent(Context context) {
        return AwSettings.getDefaultUserAgent();
    }

    public void setWebContentsDebuggingEnabled(boolean enable) {
        // On debug builds, Web Contents debugging is enabled elsewhere, and cannot be disabled.
        if (BuildInfo.isDebugAndroid()) return;
        setWebContentsDebuggingEnabledUnconditionally(enable);
    }

    public void setWebContentsDebuggingEnabledUnconditionally(boolean enable) {
        if (Looper.myLooper() != ThreadUtils.getUiThreadLooper()) {
            throw new RuntimeException(
                    "Toggling of Web Contents Debugging must be done on the UI thread");
        }
        if (mDevToolsServer == null) {
            if (!enable) return;
            mDevToolsServer = new AwDevToolsServer();
        }
        mDevToolsServer.setRemoteDebuggingEnabled(enable);
    }

    public void clearClientCertPreferences(Runnable onCleared) {
        // clang-format off
        ThreadUtils.runOnUiThread(() ->
                AwContentsStatics.clearClientCertPreferences(onCleared));
        // clang-format on
    }

    public void freeMemoryForTests() {
        if (ActivityManager.isRunningInTestHarness()) {
            PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
                // This variable is needed to prevent weird formatting by "git cl format".
                MemoryPressureMonitor pressureMonitor = MemoryPressureMonitor.INSTANCE;
                pressureMonitor.notifyPressure(MemoryPressureLevel.CRITICAL);
            });
        }
    }

    public void enableSlowWholeDocumentDraw() {
        WebViewChromium.enableSlowWholeDocumentDraw();
    }

    public Uri[] parseFileChooserResult(int resultCode, Intent intent) {
        return AwContentsClient.parseFileChooserResult(resultCode, intent);
    }

    /**
     * Starts Safe Browsing initialization. This should only be called once.
     * @param context is the application context the WebView will be used in.
     * @param callback will be called with the value true if initialization is
     * successful. The callback will be run on the UI thread.
     */
    public void initSafeBrowsing(Context context, Callback<Boolean> callback) {
        // clang-format off
        ThreadUtils.runOnUiThread(() -> AwContentsStatics.initSafeBrowsing(context,
                    callback));
        // clang-format on
    }

    public void setSafeBrowsingWhitelist(List<String> urls, Callback<Boolean> callback) {
        // clang-format off
        ThreadUtils.runOnUiThread(() -> AwContentsStatics.setSafeBrowsingWhitelist(
                urls, callback));
        // clang-format on
    }

    /**
     * Returns a URL pointing to the privacy policy for Safe Browsing reporting.
     *
     * @return the url pointing to a privacy policy document which can be displayed
     * to users.
     */
    public Uri getSafeBrowsingPrivacyPolicyUrl() {
        return ThreadUtils.runOnUiThreadBlockingNoException(
                () -> AwContentsStatics.getSafeBrowsingPrivacyPolicyUrl());
    }
}
