<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2023 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.
  -->

<!--The base manifest file contains all elements from DeviceLockController.
    Any new components should also be added to
    src/com/android/devicelockcontroller/debug/AndroidManifest.xml
    -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.android.devicelockcontroller">

    <!-- Permission for calls from controller to device lock service -->
    <permission android:name="com.android.devicelockcontroller.permission.MANAGE_DEVICE_LOCK_SERVICE_FROM_CONTROLLER"
        android:protectionLevel="signature" />
    <!-- Permission used by a Kiosk app to send the clear device broadcast. Given that no app holds
      this permission, only our system service component is able to receive the broadcast -->
    <permission android:name="com.android.devicelock.permission.RECEIVE_CLEAR_BROADCAST"
        android:protectionLevel="signature" />
    <!-- Permission checked by kiosk setup activity -->
    <permission android:name="com.android.devicelock.permission.START_KIOSK_SETUP_ACTIVITY"
        android:protectionLevel="signature" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
    <uses-permission android:name="android.permission.MASTER_CLEAR" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_APPS_CONTROL" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_CALLS" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_INSTALL_UNKNOWN_SOURCES" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_LOCK_TASK" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_SAFE_BOOT" />
    <uses-permission android:name="android.permission.MANAGE_DEVICE_POLICY_TIME" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    <uses-permission android:name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS" />
    <!-- Controller grants itself this permission to call internal APIs on device lock system service -->
    <uses-permission android:name="com.android.devicelockcontroller.permission.MANAGE_DEVICE_LOCK_SERVICE_FROM_CONTROLLER" />
    <!-- Kiosk app setup activity should have a corresponding "android:permission" attribute -->
    <uses-permission android:name="com.android.devicelock.permission.START_KIOSK_SETUP_ACTIVITY" />

    <application
        android:name=".DeviceLockControllerApplication"
        android:allowBackup="false"
        android:allowClearUserData="false"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity
            android:name="com.android.devicelockcontroller.activities.HelpActivity"
            android:exported="false"
            android:theme="@style/Theme.DeviceLock.NoActionBar" />
        <activity
            android:name="com.android.devicelockcontroller.activities.LandingActivity"
            android:exported="false"
            android:excludeFromRecents="true"
            android:immersive="true"
            android:theme="@style/Theme.DeviceLock.NoActionBar">
            <intent-filter>
                <action android:name="com.android.devicelockcontroller.action.START_DEVICE_FINANCING_PROVISIONING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.android.devicelockcontroller.activities.LockedHomeActivity"
            android:enabled="false"
            android:excludeFromRecents="true"
            android:launchMode="singleInstance"
            android:exported="true"
            android:noHistory="true"
            android:theme="@android:style/Theme.Translucent.NoTitleBar">>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

        <activity
            android:name="com.android.devicelockcontroller.activities.ProvisioningActivity"
            android:exported="false"
            android:excludeFromRecents="true"
            android:immersive="true"
            android:theme="@style/Theme.DeviceLock.NoActionBar" />

        <activity-alias
            android:name="com.android.devicelockcontroller.activities.DeviceFinancingSecondaryUserLandingActivity"
            android:exported="false"
            android:targetActivity=".activities.LandingActivity">
            <intent-filter>
                <action android:name="com.android.devicelockcontroller.action.START_DEVICE_FINANCING_SECONDARY_USER_PROVISIONING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity-alias>
        <activity-alias
            android:name="com.android.devicelockcontroller.activities.DeviceFinancingDeferredProvisioningLandingActivity"
            android:exported="false"
            android:targetActivity=".activities.LandingActivity">
            <intent-filter>
                <action android:name="com.android.devicelockcontroller.action.START_DEVICE_FINANCING_DEFERRED_PROVISIONING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity-alias>
        <activity-alias
            android:name="com.android.devicelockcontroller.activities.DeviceSubsidyProvisioningLandingActivity"
            android:exported="false"
            android:targetActivity=".activities.LandingActivity">
            <intent-filter>
                <action android:name="com.android.devicelockcontroller.action.START_DEVICE_SUBSIDY_PROVISIONING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity-alias>

        <activity-alias
            android:name="com.android.devicelockcontroller.activities.DeviceSubsidyDeferredProvisioningLandingActivity"
            android:exported="false"
            android:targetActivity=".activities.LandingActivity">
            <intent-filter>
                <action android:name="com.android.devicelockcontroller.action.START_DEVICE_SUBSIDY_DEFERRED_PROVISIONING" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity-alias>

        <activity
            android:name="com.android.devicelockcontroller.activities.DeviceLockSettingsActivity"
            android:theme="@style/Theme.DeviceLock.NoActionBar"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.devicelockcontroller.action.DEVICE_INFO_SETTINGS"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            tools:node="remove" />

        <!-- System user only boot completed broadcast receiver. This should disabled after provision ready -->
        <receiver
            android:name="com.android.devicelockcontroller.receivers.CheckInBootCompletedReceiver"
            android:exported="false"
            androidprv:systemUserOnly="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <!-- Multi users boot completed broadcast receiver. -->
        <receiver
            android:name="com.android.devicelockcontroller.receivers.FinalizationBootCompletedReceiver"
            android:exported="false"
            android:singleUser="false"
            android:enabled="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <!-- Multi users locked boot completed broadcast receiver. This receiver should only be enabled after provision ready -->
        <receiver
            android:name="com.android.devicelockcontroller.receivers.LockedBootCompletedReceiver"
            android:directBootAware="true"
            android:enabled="false"
            android:exported="false"
            android:singleUser="false">
            <intent-filter>
                <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <!-- Multi users locked boot completed broadcast receiver. This receiver records the boot
         timestamp -->
        <receiver
            android:name="com.android.devicelockcontroller.receivers.RecordBootTimestampReceiver"
            android:directBootAware="true"
            android:exported="false"
            android:singleUser="false">
            <intent-filter>
                <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <!-- Multi users time changed broadcast receiver -->
        <receiver
            android:name="com.android.devicelockcontroller.receivers.TimeChangedBroadcastReceiver"
            android:exported="false"
            android:singleUser="false">
            <intent-filter>
                <action android:name="android.intent.action.TIME_SET" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.android.devicelockcontroller.receivers.ProvisionReadyReceiver"
            android:exported="false"
            android:singleUser="false" />

        <receiver
            android:name="com.android.devicelockcontroller.receivers.ResumeProvisionReceiver"
            android:exported="false"
            android:singleUser="false" />

        <receiver
            android:name="com.android.devicelockcontroller.receivers.NextProvisionFailedStepReceiver"
            android:exported="false"
            android:singleUser="false" />

        <receiver
            android:name="com.android.devicelockcontroller.receivers.ResetDeviceReceiver"
            android:exported="false"
            android:singleUser="false" />

        <receiver
            android:name="com.android.devicelockcontroller.WorkManagerExceptionHandler$WorkFailureAlarmReceiver"
            android:exported="false"
            androidprv:systemUserOnly="true" />

        <service
            android:name="com.android.devicelockcontroller.DeviceLockControllerService"
            android:directBootAware="true"
            android:exported="false">
            <intent-filter>
                <action android:name="android.app.action.DEVICE_LOCK_CONTROLLER_SERVICE" />
            </intent-filter>
        </service>

        <service
            android:name="com.android.devicelockcontroller.storage.SetupParametersService"
            android:directBootAware="true"
            android:exported="false"
            android:singleUser="true" />

        <service
            android:name="com.android.devicelockcontroller.storage.GlobalParametersService"
            android:directBootAware="true"
            android:exported="false"
            android:singleUser="true" />

        <service
            android:name="com.android.devicelockcontroller.services.DeviceLockKeepAliveService"
            android:directBootAware="true"
            android:exported="false">
            <intent-filter>
                <action android:name="com.android.devicelock.action.KEEPALIVE" />
            </intent-filter>
        </service>

    </application>

</manifest>