/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.webkit;

import android.content.pm.PackageInfo;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;

/**
 * Private service to wait for the updatable WebView to be ready for use.
 * @hide
 */
interface IWebViewUpdateService {

    /**
     * Used by the relro file creator to notify the service that it's done.
     */
    void notifyRelroCreationCompleted();

    /**
     * Used by WebViewFactory to block loading of WebView code until
     * preparations are complete. Returns the package used as WebView provider.
     */
    WebViewProviderResponse waitForAndGetProvider();

    /**
     * DevelopmentSettings uses this to notify WebViewUpdateService that a new provider has been
     * selected by the user. Returns the provider we end up switching to, this could be different to
     * the one passed as argument to this method since the Dev Setting calling this method could be
     * stale. I.e. the Dev setting could be letting the user choose uninstalled/disabled packages,
     * it would then try to update the provider to such a package while in reality the update
     * service would switch to another one.
     */
    String changeProviderAndSetting(String newProvider);

    /**
     * DevelopmentSettings uses this to get the current available WebView
     * providers (to display as choices to the user).
     */
    @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
    WebViewProviderInfo[] getValidWebViewPackages();

    /**
     * Fetch all packages that could potentially implement WebView.
     */
    WebViewProviderInfo[] getAllWebViewPackages();

    /**
     * Used by DevelopmentSetting to get the name of the WebView provider currently in use.
     */
    @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
    String getCurrentWebViewPackageName();

    /**
     * Used by public API for debugging purposes.
     */
    PackageInfo getCurrentWebViewPackage();

    /**
     * Used by Settings to determine whether multiprocess is enabled.
     */
    boolean isMultiProcessEnabled();

    /**
     * Used by Settings to enable/disable multiprocess.
     */
    void enableMultiProcess(boolean enable);
}
