<?xml version="1.0" encoding="utf-8"?>
<!--
  Copyright 2012 The Chromium Authors
  Use of this source code is governed by a BSD-style license that can be
  found in the LICENSE file.
-->

<!--
Note: This is a jinja2 template, processed at build time into the final manifest.

Blocks denoted with { % block some_name % }foo{ % endblock % } can be overridden
by a child template that "extends" this file.
-->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="{{manifest_package|default('com.android.webview')}}"
    android:isolatedSplits="true"
    tools:ignore="MissingLeanbackLauncher">

    <uses-feature android:name="android.hardware.touchscreen"
                  android:required="false" />
    <uses-feature android:name="android.software.leanback"
                  android:required="false" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- Required by WebView Developer UI only -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

    {# TODO(wbjacksonjr crbug.com/1417656): Remove once we build against U #}
    {% if android_sdk_release is defined and android_sdk_release == 'u' %}
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
    {% endif %}
    <!-- Required to run the foreground service-->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <application android:label="{{ application_label|default('Android System WebView') }}"
                 android:icon="@{{manifest_package|default('com.android.webview')}}:drawable/icon_webview"
                 android:name="{{ application_name|default('org.chromium.android_webview.nonembedded.WebViewApkApplication') }}"
                 android:multiArch="true"
                 {% if force_32_bit is defined and force_32_bit == 'true' %}
                 android:use32bitAbi="true"
                 {% endif %}
                 android:extractNativeLibs="false">
        {# This part is shared between stand-alone WebView and Monochrome #}
        {% macro common(manifest_package, webview_lib) %}
            <meta-data android:name="com.android.webview.WebViewLibrary"
                       android:value="{{ webview_lib }}" />
            <!-- Service used to hold androidx.webkit startup feature metadata
                 that can be read from other apps via PackageManager. -->
            <service
              android:name="org.chromium.android_webview.services.StartupFeatureMetadataHolder"
              android:enabled="false"
              android:exported="true"
              tools:ignore="ExportedService">
              <meta-data
                  android:name="STARTUP_FEATURE_SET_DATA_DIRECTORY_SUFFIX"
                  android:value="true"/>
              <meta-data
                  android:name="STARTUP_FEATURE_SET_DIRECTORY_BASE_PATH"
                  android:value="true"/>
            </service>
            <!-- WebView Developer UI Activities. If you change these Activities, please update
                 android_webview/test/shell/AndroidManifest.xml as well. -->
            <!--suppress HardcodedText -->
            <activity android:name="org.chromium.android_webview.devui.MainActivity"
                      android:windowSoftInputMode="adjustPan"
                      android:visibleToInstantApps="true"
                      android:label="WebView DevTools"
                      android:icon="@drawable/icon_webview"
                      android:theme="@style/Theme.DevUi.DayNight"
                      android:launchMode="singleTask"
                      android:taskAffinity="{{ manifest_package }}.org.chromium.android_webview.devui" {# Explicit taskAffinity to distinguish from monochrome browser task. #}
                      android:process=":webview_apk"  {# Explicit process required for monochrome compatibility. #}
                      android:exported="true">
                <intent-filter>
                    <action android:name="com.android.webview.SHOW_DEV_UI" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>
            <!-- Don't actually try to launch with this alias: it only exists so we can query its enabled state. -->
            <!-- If you change this component make sure to update the corresponding copy in
                 test/shell/AndroidManifest.xml -->
            <activity-alias android:name="org.chromium.android_webview.devui.DeveloperModeState"
                      android:targetActivity="org.chromium.android_webview.devui.MainActivity"
                      android:visibleToInstantApps="true"
                      android:enabled="false"
                      android:process=":webview_apk" />  {# Explicit process required for monochrome compatibility. #}
            <!-- End of WebView Developer UI Activities -->

            <!-- Don't actually try to launch with this alias: it only exists so we can query its enabled state. -->
            <!-- If you change this component make sure to update the corresponding copy in
                 test/shell/AndroidManifest.xml -->
            <activity-alias android:name="org.chromium.android_webview.SafeModeState"
                      android:targetActivity="org.chromium.android_webview.devui.MainActivity"
                      android:visibleToInstantApps="true"
                      android:enabled="false"
                      android:process=":webview_apk" />  {# Explicit process required for monochrome compatibility. #}

            <activity android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
                      android:label="@string/license_activity_title"
                      android:process=":webview_apk"  {# Explicit process required for monochrome compatibility. #}
                      android:exported="true">
                <intent-filter>
                    <action android:name="android.settings.WEBVIEW_LICENSE" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
                <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                           android:value="true" />
            </activity>
            <provider android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
                      android:exported="true"
                      android:authorities="{{ manifest_package }}.LicenseContentProvider"
                      android:grantUriPermissions="true"
                      android:process=":webview_apk"  {# Explicit process required for monochrome compatibility. #}
                      tools:ignore="ExportedContentProvider"/>
            <!-- Disabled by default, enabled at runtime by Developer UI. -->
            <!-- If you change this component make sure to update the corresponding copy in
                 test/shell/AndroidManifest.xml-->
            <provider android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
                      android:visibleToInstantApps="true"
                      android:exported="true"
                      android:authorities="{{ manifest_package }}.DeveloperModeContentProvider"
                      android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                      tools:ignore="ExportedContentProvider" />
            <!-- If you change this component make sure to update the corresponding copy in
                 test/shell/AndroidManifest.xml-->
            <provider android:name="org.chromium.android_webview.services.SafeModeVariationsSeedContentProvider"
                      android:visibleToInstantApps="true"
                      android:exported="true"
                      android:authorities="{{ manifest_package }}.SafeModeVariationsSeedContentProvider"
                      android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                      tools:ignore="ExportedContentProvider" />
            <provider android:name="org.chromium.android_webview.services.SafeModeContentProvider"
                      android:visibleToInstantApps="true"
                      android:exported="true"
                      android:authorities="{{ manifest_package }}.SafeModeContentProvider"
                      android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                      tools:ignore="ExportedContentProvider" />
            <!-- Disables at startup init of Emoji2. See http://crbug.com/1205141 -->
            <provider
                android:authorities="{{ manifest_package }}.androidx-startup"
                android:name="androidx.startup.InitializationProvider"
                android:exported="false"
                tools:node="remove">
            </provider>
            {% if donor_package is not defined %}
                <!-- If you change the variations services, also see
                     android_webview/test/shell/AndroidManifest.xml. -->
                <!-- These have a separate android:process so that they can
                     run in Monochrome with a different value for
                     PathUtils.getDataDirectory() from Chrome. -->
                <service android:name="org.chromium.android_webview.services.VariationsSeedServer"
                         android:exported="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" />
                <service android:name="org.chromium.android_webview.services.AwVariationsSeedFetcher"
                         android:permission="android.permission.BIND_JOB_SERVICE"
                         android:exported="false"
                         android:process=":webview_service" />  {# Explicit process required for monochrome compatibility. #}
                <service android:name="org.chromium.android_webview.services.CrashReceiverService"
                         android:exported="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" />
                <service android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService"
                         android:permission="android.permission.BIND_JOB_SERVICE"
                         android:exported="true"
                         android:process=":webview_service" />  {# Explicit process required for monochrome compatibility. #}
                <service android:name="org.chromium.android_webview.services.DeveloperUiService"
                         {# TODO(wbjacksonjr crbug.com/1417656): Remove once we build against U#}
                         {% if android_sdk_release is defined and android_sdk_release == 'u' %}
                         android:foregroundServiceType="specialUse"
                         {% endif %}
                         android:exported="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" >
                         {# TODO(wbjacksonjr crbug.com/1417656): Remove once we build against U#}
                         {% if android_sdk_release is defined and android_sdk_release == 'u' %}
                          <property
                            android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
                            android:value="debugging"
                          />
                         {% endif %}
                </service>
                <service android:name="org.chromium.android_webview.services.SafeModeService"
                         android:exported="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" />
                <service android:name="org.chromium.android_webview.services.MetricsBridgeService"
                         android:exported="true"
                         android:visibleToInstantApps="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" />
                <service android:name="org.chromium.android_webview.services.MetricsUploadService"
                         android:exported="true"
                         android:visibleToInstantApps="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" />
                <!-- This service runs inside webview_apk process because it loads native -->
                <service android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService"
                         android:permission="android.permission.BIND_JOB_SERVICE"
                         android:exported="false"
                         android:process=":webview_apk"/>  {# Explicit process required for monochrome compatibility. #}
                <service android:name="org.chromium.android_webview.services.ComponentsProviderService"
                         android:exported="true"
                         android:visibleToInstantApps="true"
                         android:process=":webview_service"  {# Explicit process required for monochrome compatibility. #}
                         tools:ignore="ExportedService" />
                <!-- JS Execution Sandbox -->
                <service android:name="org.chromium.android_webview.js_sandbox.service.JsSandboxService0"
                    android:process=":js_sandboxed_process0"
                    android:isolatedProcess="true"
                    android:exported="true"
                    android:externalService="true"
                    tools:ignore="ExportedService"
                    android:visibleToInstantApps="true" />
                {% block extra_application_definitions %}
                {% endblock %}
            {% endif %}
        {% endmacro %}
        {{ common(manifest_package|default('com.android.webview'), library|default('libwebviewchromium.so')) }}
        {% if donor_package is defined %}
            <meta-data android:name="com.android.webview.WebViewDonorPackage"
                       android:value="{{ donor_package }}" />
        {% endif %}
        {% set num_sandboxed_services = 40 %}
        <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES"
                   android:value="{{ num_sandboxed_services }}" />
        {% for i in range(num_sandboxed_services) %}
            <service android:name="org.chromium.content.app.SandboxedProcessService{{ i }}"
                     android:process=":sandboxed_process{{ i }}"
                     android:isolatedProcess="true"
                     android:exported="true"
                     android:externalService="true"
                     tools:ignore="ExportedService"
                     android:visibleToInstantApps="true" />
        {% endfor %}
        <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES"
                   android:value="0" />
        {% if trichrome_library is defined %}
        <uses-static-library
            android:name="{{ trichrome_library }}"
            android:version="{{ trichrome_version }}"
            android:certDigest="{{ trichrome_certdigest }}" />
        {% endif %}
    </application>
</manifest>