<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2015, 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.
*/
-->

<!-- Resources to configure car service based on each OEM's preference. -->

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

    <!--  Configuration to enable usage of dynamic audio routing. If this is set to false,
          dynamic audio routing is disabled and audio works in legacy mode. It may be useful
          during initial development where audio hal does not support bus based addressing yet. -->
    <bool name="audioUseDynamicRouting">false</bool>

    <!--  Configuration to enable usage of core audio volume API, aka using AudioManager's
          AudioAttributes based volume API.
          Volume application is delegated to AudioPolicyManager. -->
    <bool name="audioUseCoreVolume">false</bool>

    <!--  Configuration to enable usage of core audio routing API.
          It may also be enabled with Dynamic Routing enabled, thus, overriding policy routing rules
          when Dynamic rules can be effectively established. -->
    <bool name="audioUseCoreRouting">false</bool>

    <!--  Configuration to enable muting of individual volume groups. If this is set to
          false, muting of individual volume groups is disabled, instead muting will toggle master
          mute. If this is set to true, car volume group muting is enabled and each individual
          volume group can be muted separately. -->
    <bool name="audioUseCarVolumeGroupMuting">false</bool>

    <!--  Configuration to enable IAudioControl#onDevicesToDuckChange API to inform HAL when to
          duck. If this is set to true, the API will receive signals indicating which output devices
          to duck as well as what usages are currently holding focus. If set to false, the API will
          not be called. -->
    <bool name="audioUseHalDuckingSignals">true</bool>

    <!--  Configuration to select version of volume adjustment context priority list.
          Version 1 includes all audio contexts arranged in the following order:
            NAVIGATION, CALL, MUSIC, ANNOUNCEMENT, VOICE_COMMAND, CALL_RING, SYSTEM_SOUND, SAFETY,
            ALARM, NOTIFICATION, VEHICLE_STATUS, EMERGENCY.
          Version 2 is limited to the following contexts in order:
            CALL, MUSIC, ANNOUNCEMENTS, VOICE_COMMAND

          audioVolumeAdjustmentContextsVersion - Integer version number currently limited to
                                                 numbers listed above. -->
    <integer name="audioVolumeAdjustmentContextsVersion">1</integer>

    <!--  Configuration to persist global mute state. If this is set to true,
          Android will restore the global mute state on boot. If audioUseCarVolumeGroupMuting is
          true, this will have no impact on persisting mute changes as mute changes will be based
          on individual volume group.-->
    <bool name="audioPersistMasterMuteState">true</bool>

    <!--  Configuration to indicate the timeout in milliseconds while a car volume group will be
          considered active for volume control changes during volume key events. The configuration
          will be used as follows:
          - The timeout will be used to determine if a playback (audio context associated with the
            playback's audio usage) can still be considered for automatic volume selection after it
            has stopped playing.
          - The timeout will also be used as the pause duration required in between automatic volume
            adjustments to change what user is adjusting. -->
    <integer name="audioVolumeKeyEventTimeoutMs">3000</integer>

    <!--  Configuration to enable callback events to volume groups. If this is set to true, clients
          will receive callback through ICarVolumeGroupEvent to events impacting volume groups.
          When enabled:
          - It is strongly recommended that the vendors also support
            IAudioControl#setModuleChangeCallback, IAudioControl#registerGainCallback for events
            and changes to audio hardware.
          - If both CarVolumeCallback and CarVolumeGroupEventCallback are registered by the same
            application, then the volume group index and volume group mute callbacks shall be
            through CarVolumeGroupEventCallback ONLY. Therefore, it is strongly recommended that
            all the applications migrate to the new callback interface for consistent behavior. -->
    <bool name="audioUseCarVolumeGroupEvent">false</bool>

    <!-- Configuration to enable fade during audio focus changes. If this is set to true, car audio
         framework will parse the car audio fade config definitions and apply the respective
         FadeManagerConfiguration when dispatching audio focus loss.
         Note:
         - Although car audio framework expects valid fade config definitions when the flag is
           enabled, the absence of the such definitions does not automatically result in a fatal
           exception.
         - All applications of fade configs must have matching fade definitions. It is a fatal error
           to call out a fade config (by its name) as part of car audio configuration without
           providing a valid definition.
         - When the flag is disabled, all fade config definitions and any config application shall
           be ignored. -->
    <bool name="audioUseFadeManagerConfiguration">false</bool>

    <!--  Configuration to enable min/max activation volume. If this is set to true, the volume of
          the volume group with min/max activation volume setting will be set to min activation
          volume or max activation volume if volume during activation is lower than min activation
          volume or higher than max activation volume respectively. If this is set to false, no
          volume level will be changed during activation.-->
    <bool name="audioUseMinMaxActivationVolume">false</bool>

    <!--  Configuration to enable isolated audio focus request for playback on dynamic devices. If
          this is set to true, focus requests should only interact if the focus requests are
          for the same zone and targeting playback will be routed to the same device. Otherwise,
          the focus requests should interact only if the requests are for the same audio zone.-->
    <bool name="audioUseIsolatedAudioFocusForDynamicDevices">false</bool>

    <!--  Configuration to enable volume key events affecting volume changes on dynamic devices.
          If this is set to true, volume changes via key events will also consider volume groups
          containing dynamic devices for the volume/mute change. The actual volume group selected
          will be determined by the volume priority list configured with
          audioVolumeAdjustmentContextsVersion. Otherwise, the volume group selection via key events
          will not consider volume groups containing dynamic devices. -->
    <bool name="audioEnableVolumeKeyEventsToDynamicDevices">false</bool>

    <!-- Whether to block other audio while media audio is muted with display off. When set to true,
         other sounds cannot be played either while display is off. If false, only media is muted
         and other sounds can be still played. -->
    <bool name="displayOffMuteLockAllAudio">true</bool>

    <!--  Configuration to enable or disable the default Bluetooth Device Connection Policy. This
          policy determines when to initiate device connections, but does not control the actual
          connection process. Disable this default to implement your own policy. -->
    <bool name="useDefaultBluetoothConnectionPolicy">true</bool>

    <!--  Configuration to enable or disable the default Bluetooth Power Policy. This
          policy determines when to enable and/or disable the Bluetooth adapter based on
          CarPowerManager power states. Disable this default to implement your own policy. -->
    <bool name="useDefaultBluetoothPowerPolicy">true</bool>

    <!--  Service responsible for displaying information on the car instrument cluster. -->
    <string name="instrumentClusterRendererService" translatable="false">android.car.cluster/.ClusterRenderingService</string>

    <!--  The name of Activity who is in charge of ClusterHome. -->
    <string name="config_clusterHomeActivity" translatable="false">com.android.car.cluster.home/.ClusterHomeActivity</string>

    <!-- Configures the mode in which ClusterHomeService operates.
         Currently supported modes are:
           0 (full mode): All VHAL properties in ClusterHalService#CORE_PROPERTIES must be
                          available. Otherwise, the entire ClusterHomeService is disabled.
           1 (light mode): ClusterHomeService is always enabled even without any VHAL properties.
         -->
   <integer name="config_clusterHomeServiceMode">0</integer>

    <!--  Service responsible for handling the rotary controller input. This service will start
          on boot or on user switch. Set this string to empty if you don't want to start this
          service. -->
    <string name="rotaryService" translatable="false">com.android.car.rotary/com.android.car.rotary.RotaryService</string>

    <!--  Whether to enable Activity blocking for safety. When Activity blocking is enabled,
          only allowlisted safe Activities will be allowed while car is not parked. -->
    <bool name="enableActivityBlockingForSafety">true</bool>
    <!--  Activity to be presented when un-safe activity is launched. Take a look at the javadoc of the
          default implementation. -->
    <string name="activityBlockingActivity" translatable="false">
        com.android.systemui/com.android.systemui.car.wm.activity.ActivityBlockingActivity
    </string>
    <string name="continuousBlankActivity" translatable="false">
        com.android.systemui/com.android.systemui.car.wm.activity.ContinuousBlankActivity
    </string>
    <!--  Comma separated list of activities that need to be exempted from getting
          blocked in a UX restricted state.
          Format of each entry is either to specify package name to allowlist the whole package or
          use format of "packagename/activity_classname" for tagging each activities.
          For general guidelines to design distraction optimized apps, please refer
          to Android Auto Driver Distraction Guidelines. -->
    <string name="activityAllowlist" translatable="false"></string>
    <!--  Comma separated list of activities that need to be exempted from getting
          blocked in a UX restricted state.
          Format of each entry is either to specify package name to allowlist the whole package or
          use format of "packagename/activity_classname" for tagging each activities.
          The current implementations expects the following system packages/activities to be
          allowlisted. For general guidelines to design distraction optimized apps, please refer
          to Android Auto Driver Distraction Guidelines. -->
    <string name="systemActivityAllowlist" translatable="false">com.android.systemui,com.google.android.permissioncontroller/com.android.permissioncontroller.permission.ui.GrantPermissionsActivity,com.android.permissioncontroller/com.android.permissioncontroller.permission.ui.GrantPermissionsActivity,android/com.android.internal.app.ResolverActivity,com.android.mtp/com.android.mtp.ReceiverActivity,com.android.server.telecom/com.android.server.telecom.components.UserCallActivity</string>
    <!--  Comma separated list of activities that will be blocked during restricted state.
          Format of each entry is either to specify package name to allowlist the whole package
          or use format of "packagename/activity_classname" for tagging each activities.-->
    <string name="activityDenylist" translatable="false"></string>
    <!-- List of play store package names that are allowed sources of app installation-->
    <string-array translatable="false" name="allowedAppInstallSources">
    </string-array>
    <!-- Default home activity -->
    <string name="defaultHomeActivity" translatable="false"><!--com.your.package/com.your.package.Activity--></string>
    <!-- The vendor-defined HAL property used to collect VMS client metrics. Disabled by default.-->
    <integer name="vmsHalClientMetricsProperty">0</integer>
    <!--  The com.android.car.vms.VmsClientManager will bind to this list of clients running as system user -->
    <string-array translatable="false" name="vmsPublisherSystemClients">
    </string-array>
    <!--  The com.android.car.vms.VmsClientManager will bind to this list of clients running as current user -->
    <string-array translatable="false" name="vmsPublisherUserClients">
    </string-array>
    <!-- Number of milliseconds to wait before trying re-bind to a crashed publisher. -->
    <integer name="millisecondsBeforeRebindToVmsPublisher">10000</integer>

    <!-- Hours of uptime (excluding sleep) after which a 1% increase in the wear of the flash
         storage in the head-unit is considered as acceptable level of wear. -->
    <integer name="acceptableHoursPerOnePercentFlashWear">70</integer>

    <!-- How often (in hours of uptime excluding sleep) CarService will flush to disk information
         about the total running time of the head-unit. A shutdown or reboot of the head-unit
          will always cause a flush of the uptime information, regardless of this setting. -->
    <integer name="uptimeHoursIntervalBetweenUptimeDataWrite">5</integer>

    <!-- The name of an activity to be launched by CarService whenever it detects a change in the
         level of wear of the flash storage. Value must either be an empty string, which means that
         no activity shall be launched, or must be in the format of a flattened ComponentName and
         reference a valid activity. It is strongly recommended that the chosen activity be
         protected with the android.car.permission.STORAGE_MONITORING permission. -->
    <string name="activityHandlerForFlashWearChanges" translatable="false">com.google.android.car.defaultstoragemonitoringcompanionapp/.MainActivity</string>

    <!-- How often (in seconds) CarService will update I/O metrics from the kernel. -->
    <integer name="ioStatsRefreshRateSeconds">60</integer>

    <!-- The number of I/O metrics samples to keep in memory at one time.
         The system will keep a sliding window of samples of this size, and allow
         retrieval of activity this many sample windows back in time. Setting this to
         0 means no samples will be collected, effectively disabling I/O metric collection. -->
    <integer name="ioStatsNumSamplesToStore">15</integer>

    <!-- The maximum number of KB (1024 bytes) that can be written to storage in one sample
         before CarService deems I/O activity excessive. A simple way to set this value
         is - given the total writable amount (storage size * P/E cycles) - to make
         reasonable assumptions about the expected lifetime of the vehicle and the average
         daily driving time, and use that to allocate a per-sample budget. -->
    <integer name="acceptableWrittenKBytesPerSample">115000</integer>
    <!-- The maximum number of fsync() system calls that can be made in one sample before
         CarService deems I/O activity excessive. -->
    <integer name="acceptableFsyncCallsPerSample">150</integer>

    <!-- The maximum number of samples (within an I/O stats sample window) that CarService
         should consider exhibiting excessive I/O activity before broadcasting an intent
         to signal the potential for flash wear. -->
    <integer name="maxExcessiveIoSamplesInWindow">11</integer>

    <!-- The number of days past until the current day considered by car watchdog to
         reset the killable state of a package back to KILLABLE_STATE_YES if the package
         was set to prioritize performance by the user. -->
    <integer name="watchdogUserPackageSettingsResetDays">90</integer>

    <!-- The number of days past until the current day considered by car watchdog to
         attribute recurring overuse to a package.  -->
    <integer name="recurringResourceOverusePeriodInDays">14</integer>

    <!-- The number of overuses a package has to exceed for car watchdog to attribute
         recurring overuse.  -->
    <integer name="recurringResourceOveruseTimes">2</integer>

    <!-- The number of top UID I/O usage summaries to report on car watchdog I/O usage
         summary atom pull.  -->
    <integer name="uidIoUsageSummaryTopCount">10</integer>

    <!-- The minimum number of total bytes written to disk by the system required to
         report the stats on car watchdog I/O usage summary atom pull. Currently 500 MiB.  -->
    <integer name="ioUsageSummaryMinSystemTotalWrittenBytes">524288000</integer>

    <!-- The name of an intent to be notified by CarService whenever it detects too many
         samples with excessive I/O activity. Value must either be an empty string, which
         means that no notification will take place, or be in the format of a flattened
         ComponentName and reference a valid BroadcastReceiver. This broadcast receiver
         must be registered in its containing app's AndroidManifest.xml and it is
         strongly recommended that it be protected with the
         android.car.permission.STORAGE_MONITORING permission. -->
    <string name="intentReceiverForUnacceptableIoMetrics" translatable="false">com.google.android.car.defaultstoragemonitoringcompanionapp/.ExcessiveIoIntentReceiver</string>

     <!-- The path to a file that contains lifetime estimation metrics for the eMMC storage on
          this system, in the lifetimeA lifetimeB format, as defined by the eMMC extended CSD
          register specification. -->
     <string name="eMmcLifetimeFilePath" translatable="false">/sys/bus/mmc/devices/mmc0:0001/life_time</string>

     <!-- The path to a file that contains end of life estimation metrics for the eMMC storage on
          this system, in the format defined by the eMMC extended CSD register specification. -->
     <string name="eMmcEolFilePath" translatable="false">/sys/bus/mmc/devices/mmc0:0001/pre_eol_info</string>

    <!-- The Model ID to advertise Bluetooth Fast Pair connections with.  Must be overlayed with
         device specific model id. A model id of 0 will disable Fast Pair-->
    <integer name="fastPairModelId">0x000000</integer>

    <!-- The Anti Spoofing Public key associated with the advertised Fast Pair Model ID, base64
         encoded. -->
    <string name="fastPairAntiSpoofKey" translatable="false"></string>

    <!-- Enable to allow Fast Pair to automatically accept incoming pairing requests with matching
         Simple Secure Pairing codes without requiring further user input. -->
    <bool name="fastPairAutomaticAcceptance">false</bool>

    <!-- Maximum allowed time to run garage mode. Note that 15 min (=900sec) is the minimum required
         duration and this should not be made shorter. -->
    <integer name="maxGarageModeRunningDurationInSecs">900</integer>

    <!-- The services that need to be started earlier in the boot sequence and in particular order.
         Every item in this array contains a flatten component name of a service that needs to be
         started and a list of parameters after hashtag symbol. Here's the format:

         <item>com.bar.foo/.Service#bind={bind|start|startForeground},
         user={all|system|foreground|visible|backgroundVisible},
         trigger={asap|resume|userUnlocked|userPostUnlocked}</item>

         bind: bind - start service with Context#bindService
               start - start service with Context#startService
               startForeground - start service with Context#startForegroundService
               If service was bound it will be restarted unless it is constantly crashing.
               The default value is 'start'
         user: all - the service will be bound/started for system and all visible users
               system - the service will be started/bound only for system user (u0)
               foreground - the service will be bound/started only for foreground users
               visible - the service will be bound/started only for visible users (as defined by
                         `UserManager#isUserVisible()`).
               backgroundVisible - the service will be bound/started only for background users that
                                   are visible.
               The default value is 'all'
         trigger: indicates when the service needs to be started/bound
               asap - the service might be bound when user is not fully loaded, be careful with
                      this value, the service also needs to have directBootAware flag set to true
               resume - start service when the device resumes from suspend (suspend-to-RAM, or
                        suspend-to-disk).
               userUnlocked - start service when user unlocked the device
               userPostUnlocked - start service later after user unlocked. This is used when the
                                  service is not urgent and can wait to start.
               The default value is 'userUnlocked'
         maxRetries: the maximum number of attempts to rebind/restart a disconnected service.
               Retries start with 4 second initial delay, being doubled after each failed attempt.
               The default value is 6.

         If the service bound/started for foreground user it will be unbound/stopped when user
         is no longer foreground.
     -->
    <string-array translatable="false" name="config_earlyStartupServices">
    </string-array>

    <!-- The consent activity that must be shown for every unknown mobile device before projection
         gets started.  The format is: com.your.package/com.your.Activity
         NOTE: deprecated for aareceiver, see integration guide to use aareceiver specific RROs.
    -->
    <string name="config_projectionConsentActivity" translatable="false"/>

    <!-- Display Id where projection rendering activity needs to be shown, Specify -1 to use system
         defaults
         NOTE: deprecated for aareceiver, see integration guide to use aareceiver specific RROs.
     -->
    <integer name="config_projectionActivityDisplayId" translatable="false">-1</integer>

    <!-- Bounds of the projection activity on the screen. It should be in the pixels and screen
         coordinates in the following order: left, top, right, bottom.
         NOTE: deprecated for aareceiver, see integration guide to use aareceiver specific RROs.
    -->
    <integer-array name="config_projectionActivityLaunchBounds" translatable="false"/>

    <!-- UI mode for projection activity. See ProjectionOptions class for possible values.
         NOTE: deprecated for aareceiver, see integration guide to use aareceiver specific RROs.
    -->
    <integer name="config_projectionUiMode" translatable="false">0</integer>

    <!-- Configure whether access point created for wireless projection should be in tethered mode.
         This will allow mobile device to use Internet provided by the vehicle during projection.
         If this value is true then tethering is enabled. Otherwise, local-only hotspot will be
         created. -->
    <bool name="config_projectionAccessPointTethering" translatable="false">false</bool>

    <!-- If projection Access Point is configured to not provide Internet access (not tethered,
         see config_projectionAccessPointTethering) then this flag will be used to control
         whether Wi-Fi configuration will persist reboots. By default new Wi-Fi credentials are
         created for every local-only hotspot (LOHS) instantiation, changing this flag to true
         will make LOHS credentials persistent. -->
    <bool name="config_stableLocalOnlyHotspotConfig" translatable="false">true</bool>

    <!-- The package name of a service to be launched by CarService to bind to an active media
         service on the current  user.
         TODO(b/139497602): Remove dependency on Media Center, handle in CarMediaService -->
    <string name="serviceMediaConnection" translatable="false">com.android.car.media</string>

    <!-- The package name of the default bugreport application that can use CarBugreportServiceManager.
         There is no default bugreporting app.-->
    <string name="config_car_bugreport_application" translatable="false"></string>

    <!--
        Lists all occupant (= driver + passenger) zones available in the car.
        Some examples are:
        <item>occupantZoneId=0,occupantType=DRIVER,seatRow=1,seatSide=driver</item>
        <item>occupantZoneId=1,occupantType=FRONT_PASSENGER,seatRow=1,seatSide=oppositeDriver</item>
        <item>occupantZoneId=2,occupantType=REAR_PASSENGER,seatRow=2,seatSide=left</item>
        <item>occupantZoneId=3,occupantType=REAR_PASSENGER,seatRow=2,seatSide=right</item>

        occupantZoneId: Unique unsigned integer id to represent each passenger zone. Each zone
                        should have different id.
        occupantType: Occupant type for the display. Use * part from
                       CarOccupantZoneManager.OCCUPANT_TYPE_* like DRIVER, FRONT_PASSENGER,
                       REAR_PASSENGER and etc.
        seatRow: Integer telling which row the seat is located. Row 1 is for front seats.
        seatSide: left/center/right for known side. Or can use driver/center/oppositeDriver to
                  handle both right-hand driving and left-hand driving in one place.
                  If car's RHD / LHD is not specified, LHD will be assumed and driver side becomes
                  left.
    -->
    <string-array translatable="false" name="config_occupant_zones">
        <item>occupantZoneId=0,occupantType=DRIVER,seatRow=1,seatSide=driver</item>
    </string-array>
    <!--
        Specifies configuration of displays in system telling its usage / type and assigned
        occupant. DEFAULT_DISPLAY, if assigned here, should be always assigned to the DRIVER zone.

        Some examples are:
        <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=DPAD_KEYS|
            NAVIGATE_KEYS|ROTARY_NAVIGATION</item>
        <item>displayPort=1,displayType=INSTRUMENT_CLUSTER,occupantZoneId=0,
            inputTypes=DPAD_KEYS</item>
        <item>displayPort=2,displayType=MAIN,occupantZoneId=1,
            inputTypes=TOUCH_SCREEN</item>
        <item>displayPort=3,displayType=MAIN,occupantZoneId=2,
            inputTypes=TOUCH_SCREEN</item>
        <item>displayUniqueId=virtual:com.example:MainD,displayType=MAIN,occupantZoneId=3,
            inputTypes=TOUCH_SCREEN</item>

        NOTE: each item should have displayPort or displayUniqueId, if it has both, displayPort
          will be used.
        displayPort: Unique Port id for the physical display.
        displayUniqueId: Unique Id for the display.
            The unique id of the virtual display will be the form of 'virtual:<PACKAGE>:<ID>'.
        displayType: Display type for the display. Use * part from
                       CarOccupantZoneManager.DISPLAY_TYPE_* like MAIN, INSTRUMENT_CLUSTER and
                       etc.
        occupantZoneId: occupantZoneId specified from config_occupant_zones.
        inputTypes: supported input types for the corresponding display.

    -->
    <string-array translatable="false" name="config_occupant_display_mapping">
        <item>displayPort=0,displayType=MAIN,occupantZoneId=0,inputTypes=TOUCH_SCREEN|DPAD_KEYS|NAVIGATE_KEYS|ROTARY_NAVIGATION</item>
    </string-array>

    <!-- Specifies notice UI that will be launched when user starts a car or do user
         switching. It is recommended to use dialog with at least TYPE_APPLICATION_OVERLAY window
         type to show the UI regardless of activity launches. Target package will be auto-granted
         necessary permission for TYPE_APPLICATION_OVERLAY window type. The UI package should
         resolve permission by itself to use any higher priority window type.
         Setting this string to empty will disable the feature. -->
    <string name="config_userNoticeUiService" translatable="false">com.google.android.car.kitchensink/.UserNoticeDemoUiService</string>

    <!-- Specifies the user picker to be launched on a secondary display when there is no user
         allocation when the system boots and when a visible user stops.
    -->
    <string name="config_userPickerActivity" translatable="false">com.android.systemui/.car.userpicker.UserPickerActivity</string>

    <!-- Configuration to enable media center to autoplay when the media source is changed.
         There are 3 supported configurations:
         0 - never play on change
         1 - always play
         2 - retain per source, play based on last remembered playback state for the new source
         3 - retain previous state, play based on previous source's playback state -->
    <integer name="config_mediaSourceChangedAutoplay">0</integer>
    <!-- Configuration to enable media center to autoplay on boot -->
    <integer name="config_mediaBootAutoplay">2</integer>
    <!-- Setting this flag to true allows for browsing a different source than the
         one that is currently playing audio. By default, there is only one active
         source in the car, for both playback and browse. -->
    <bool name="config_mediaSourceIndependentPlayback">true</bool>

    <!--
        Specifies optional features that can be enabled by this image. Note that vhal can disable
        them depending on product variation.
        Feature name can be either service name defined in Car.*_SERVICE for Car*Manager or any
        optional feature defined under @OptionalFeature annotation.
        Note that '/' is used to have subfeature under main feature like "MAIN_FEATURE/SUB_FEATURE".

        Some examples are:
        <item>storage_monitoring</item>
        <item>com.android.car.user.CarUserNoticeService</item>
        <item>com.example.Feature/SubFeature</item>

        The default list defined below will enable all optional features defined.
    -->
    <string-array translatable="false" name="config_allowed_optional_car_features">
        <item>car_navigation_service</item>
        <item>cluster_service</item>
        <item>com.android.car.user.CarUserNoticeService</item>
        <item>diagnostic</item>
        <item>storage_monitoring</item>
        <item>vehicle_map_service</item>
        <item>car_evs_service</item>
        <item>car_telemetry_service</item>
    </string-array>

    <!-- Configuration to enable passenger support.
         If this is set to true and there is a passenger display, a user can login to the passenger
         display and use it as a normal Android user. -->
    <bool name="enablePassengerSupport">false</bool>

    <!-- Class name of the custom country detector to be used. Override the default value in the
         device specific config file.  -->
    <string name="config_customCountryDetector" translatable="false">com.android.server.location.ComprehensiveCountryDetector</string>

    <!-- Controls the use of bluetooth voice recognition when long pressing the voice assist
         button. -->
    <bool name="enableLongPressBluetoothVoiceRecognition" translatable="false">true</bool>

    <!-- Switch guest user into new guest user before going to sleep. If this is false, it will
         be done after waking up from sleep. This only affects if the current user is a guest user.
         -->
    <bool name="config_switchGuestUserBeforeGoingSleep" translate="false">true</bool>

    <!-- Enable profile user assignment per each CarOccupantZone for per display android user
         assignments. This feature is still experimental. -->
    <bool name="enableProfileUserAssignmentForMultiDisplay" translatable="false">false</bool>

    <!-- The ComponentName of the media source that will be selected as the default -->
    <string name="config_defaultMediaSource">com.android.car.radio/.service.RadioAppService</string>

    <!-- A configuration flag to enable ending an ongoing call using the physical Call button. -->
    <bool name="config_callButtonEndsOngoingCall">false</bool>

    <!-- Number of milliseconds to wait before the system goes into Suspend-to-RAM.
         The valid range is 0 to 3 * 60 * 1000. The default duration is 3 min (= 3 * 60 * 1000). -->
    <integer name="config_maxSuspendWaitDuration">180000</integer>

    <!-- Number of milliseconds to wait until all listeners complete when PRE_SHUTDOWN_PREPARE is
         notified -->
    <integer name="config_preShutdownPrepareTimeout">5000</integer>

    <!-- Number of milliseconds to wait until all listeners complete when SHUTDOWN_ENTER is
         notified -->
    <integer name="config_shutdownEnterTimeout">5000</integer>

    <!-- Number of milliseconds to wait until all listeners complete when POST_SHUTDOWN_ENTER is
         notified -->
    <integer name="config_postShutdownEnterTimeout">5000</integer>

    <!-- A configuration flag to enable auto power saving for passenger displays.
         When it's true, the driver display is not affected and always on. When it's false, auto
         power saving is not applied. OEMs can implement their own auto power saving logic.
         -->
    <bool name="config_enablePassengerDisplayPowerSaving">true</bool>

    <!-- Number of milliseconds to wait until screen is automatically turned off.
         The default duration is 1 min (= 1 * 60 * 1000). -->
    <integer name="config_noUserScreenOffTimeout">60000</integer>

    <!--
        CarEvsService configurations that associate camera devices with service types.

        Some examples are:
        <item>
            serviceType=REARVIEW,cameraId=/dev/video0,activityName=com.android.car/com.google.android.car.evs.CarEvsCameraPreviewActivity
        </item>
        <item>serviceType=FRONTVIEW,cameraId=/dev/video1</item>

        serviceType: One of CarEvsService types to be enabled. Please use "*" part from
                     CarEvsManager.SERVICE_TYPE_* such as REARVIEW and FRONTVIEW.
        cameraId: A camera identifier that will be associated with a given service type.
                  This should be exclusive to a single service type.
        activityName: A component name of an activity to be launched by the system events.
    -->
    <string-array name="config_carEvsService" translatable="false">
    </string-array>

    <!--
        A name of a camera device that provides the rearview through EVS service.
        This configuration becomes effective if and only if config_carEvsService is empty.
    -->
    <string name="config_evsRearviewCameraId" translatable="false">/dev/video10</string>

    <!--
        The camera Activity name for EVS, if defined, the Activity will be launched by
        CarEvsService. This configuration is effective if and only if config_carEvsService
        is empty.
    -->
    <string name="config_evsCameraActivity" translatable="false"></string>

    <!-- A configuration flag to adjust Wifi for suspend. -->
    <bool name="config_wifiAdjustmentForSuspend">false</bool>

    <!-- A configuration flag to adjust enabling and disabling the GNSS Location Provider for Power
         Management purposes such as Supsend to RAM. -->
    <bool name="config_enableCarLocationServiceGnssControlsForPowerManagement" translatable="false">true</bool>

    <!-- A configuration flag to prevent the templated apps from showing dialogs. This is done in
         the view of driver safety as templated apps can potentially show a dialog with custom UI
         which can be a distraction hazard for the driver. -->
    <bool name="config_preventTemplatedAppsFromShowingDialog">true</bool>

    <!-- The class name of the templated activities. This is used to detect currently running
         templated activity.-->
    <string name="config_template_activity_class_name">
        androidx.car.app.activity.CarAppActivity
    </string>

    <!-- A flag to configure whether the ExternalCarTime VHAL property should be used to send
         ExternalTimeSuggestions to the Android TimeManager service. -->
    <bool name="config_enableExternalCarTimeToExternalTimeSuggestion">false</bool>

    <!-- This is the component name for the OEM customization service. OEM can choose to implement
         this service to customize car service behavior for different policies. If OEMs choose to
         implement it, they have to implement a service extending OemCarService exposed by car-lib,
         and implement the needed component services.
         If the component name is invalid, CarService would not connect to any OEM service.
         Component name can not be a third party package. It should be pre-installed -->
   <string name="config_oemCarService" translatable="false"></string>

    <!-- Related to OEM customization service. How many milliseconds CarService should wait for
         OEM service to connect. If `config_oemCarService` is set and oem service package exists,
         then CarService would wait for this much time for OEM service to connect. If OEM service
         doesn't connect within this time, CarService would crash itself. -->
    <integer name="config_oemCarService_connection_timeout_ms">5000</integer>

    <!-- Related to OEM customization service. How many milliseconds CarService should wait for
         OEM service to be ready. This is the wait time after OEM service is connected to
         CarService. CarService would poll OEM service for being ready, if OEM service not ready
         within timeout, CarService would crash. -->
    <integer name="config_oemCarService_serviceReady_timeout_ms">5000</integer>

    <!-- Related to OEM customization service. Default timeout for calls made by CarService to
         OEM service. After this, CarService would timeout the call. If OEM service returns the
         results after timeout, it would be ignored. -->
    <integer name="config_oemCarService_regularCall_timeout_ms">5000</integer>

    <!-- Related to OEM customization service. Default timeout for critical calls made by CarService
         to OEM service. After this timeout, CarService would itself and OEM Service. -->
    <integer name="config_oemCarService_crashCall_timeout_ms">10000</integer>

    <!-- Related to OEM customization service. Default thread pool size for communicating with the
         OEM Service. The value can only be between 8 and 16. If value is higher than 16, thread
         pool size will be 16. If value is lower than 8, thread pool size will be 8.-->
    <integer name="config_oemCarService_thread_pool_size">8</integer>

    <!-- Number of seconds to wait until all remote tasks are completed. Should be no smaller than
         30 seconds -->
    <integer name="config_allowedSystemUptimeForRemoteAccess">300</integer>

    <!-- Assigns passenger Activities to foreground cpuset rather than the top app cpuset.
         This is enabled only for a system having both driver and passenger zones. If the system
         has only driver zone or passenger zones, this configuration will be ignored. -->
    <bool name="config_assignPassengerActivityToForegroundCpuGroup">true</bool>
    <!-- Max number of retires for notifying AP power state change. -->
    <integer name="config_notifyApStateChange_max_retry">100</integer>
    <!-- Number of ms to sleep between retries for notifying AP power state change. -->
    <integer name="config_notifyApStateChange_retry_sleep_ms">100</integer>

    <!-- Configurations for ClusterHome visibility monitoring.
         Please refer to {@link SurfaceControl#TrustedPresentationThresholds} for the detail. -->
    <fraction name="config_clusterHomeVisibility_minAlpha">100%</fraction>
    <fraction name="config_clusterHomeVisibility_minRendered">99.9%</fraction>
    <integer name="config_clusterHomeVisibility_stabilityMs">100</integer>

    <!-- A configuration flag to adjust the enabling of persistent tethering within
         CarWifiService. -->
    <bool name="config_enablePersistTetheringCapabilities">false</bool>

    <!-- The packages that should not be stopped when suspend to disk is initiated. -->
    <string-array translatable="false" name="config_packages_not_to_stop_during_suspend">
    </string-array>

    <!-- The value to be set that describes how much memory will be saved when going into suspend
     to disk. There are 4 values that can be set:
        none: no memory savings will take place
        low: cached processes will be stopped.
        medium: services, cached, and can't save state processes will be stopped.
        high: foreground services, background services, cached, and can't saved state processes
              will be stopped.
    -->
    <string name="config_suspend_to_disk_memory_savings" translatable="false">low</string>
</resources>
