diff options
author | Alex Kutsan <akutsan@luxoft.com> | 2017-01-27 16:28:34 +0200 |
---|---|---|
committer | Alex Kutsan <akutsan@luxoft.com> | 2017-01-27 16:28:34 +0200 |
commit | 6b408ccced65e5bc7ce0d911cc4884223eaeac56 (patch) | |
tree | c3495a73ec8a16f681433448023f43b0e973334a /src/components/policy/policy_external | |
parent | 6cc4475f1300dfd351d3b203d9881fa6fe6e4ee1 (diff) | |
parent | 55d7b3429d974e9e4d945920a93cdec02f2dcb06 (diff) | |
download | sdl_core-6b408ccced65e5bc7ce0d911cc4884223eaeac56.tar.gz |
Merge release to develop
Diffstat (limited to 'src/components/policy/policy_external')
141 files changed, 85957 insertions, 0 deletions
diff --git a/src/components/policy/policy_external/.gitignore b/src/components/policy/policy_external/.gitignore new file mode 100644 index 0000000000..3e5fc41721 --- /dev/null +++ b/src/components/policy/policy_external/.gitignore @@ -0,0 +1,85 @@ +*.a +*.so +*.cmake +!cmake/ +bin +build +CMakeFiles +*-prefix +Makefile +CMakeCache.txt +CMakeLists.txt.user +install_manifest.txt +*.o +*.lo +.libs +*.la +*.kdev4 +*.*~ +.project +.cproject +*.pyc +*.swp + +# logs +*.log + +# binaries +src/appMain/hmi_link +src/appMain/smartDeviceLinkCore +test/components/application_manager/policies_manager/test_policies_table +test/components/application_manager/test_formatters_commands +test/components/dbus/test_DBusAdapter +test/components/dbus/test_DBusSchema +test/components/protocol_handler/test_ProtocolHandler +test/components/request_watchdog/test_RequestWatchdog +test/components/smart_objects/SchemaItem/test_SmartObject_AlwaysFalseSchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_AlwaysTrueSchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_ArraySchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_BoolSchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_EnumSchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_NumberSchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_ObjectSchemaItemTest +test/components/smart_objects/SchemaItem/test_SmartObject_StringSchemaItemTest +test/components/smart_objects/test_SmartObject_ConvertionTimeTest +test/components/smart_objects/test_SmartObject_DraftTest +test/components/smart_objects/test_SmartObject_InvalidTest +test/components/smart_objects/test_SmartObject_StressTest +test/components/smart_objects/test_SmartObject_UnitTest +test/components/smart_objects/test_TSharedPtrTest +test/components/transport_manager/test_DnssdServiceDiscovery +test/components/transport_manager/test_TcpTransportAdapter +test/components/transport_manager/test_TransportManagerTest +test/components/utils/test_Utils +test/test_suit + +# libraries +src/components/qt_hmi/qml_plugins/dbus/libhmi_dbus.so +src/components/qt_hmi/qml_plugins/hmi_framework/libHmiFramework.so + +# install folders +src/components/qt_hmi/qml_model/com/ford/sdl + +# ctags-generated +tags + +# Qt +moc_*.cpp +*.pro.user +*.qmlproject.user +*_automoc.cpp + +# generated files +src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus.cc +src/components/qt_hmi/qml_plugins/dbus_adapter/qml_dbus.h +src/components/qt_hmi/qml_model/hmi_api/*Proxy.qml + +# Mac OS Specific +.DS_Store +# Android specific +*.iml +*.orig +.idea +.gradle +local.properties +mobile/android/FordSnadbox diff --git a/src/components/policy/policy_external/CMakeLists.txt b/src/components/policy/policy_external/CMakeLists.txt new file mode 100644 index 0000000000..2cbdbd7f64 --- /dev/null +++ b/src/components/policy/policy_external/CMakeLists.txt @@ -0,0 +1,121 @@ +# Copyright (c) 2016, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# --- Policy +set(target Policy) +set(install_destination bin) +set(copy_destination ${CMAKE_BINARY_DIR}/src/appMain) +set(library_name ${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX}) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +include_directories ( + include + ${COMPONENTS_DIR}/rpc_base/include + ${COMPONENTS_DIR}/utils/include/ + ${COMPONENTS_DIR}/config_profile/include + ${POLICY_GLOBAL_INCLUDE_PATH}/ + ${LOG4CXX_INCLUDE_DIRECTORY} + ${JSONCPP_INCLUDE_DIRECTORY} +) + +set(SOURCES + ${POLICY_PATH}/src/policy_manager_impl.cc + ${POLICY_PATH}/src/policy_helper.cc + ${POLICY_PATH}/src/policy_table.cc + ${POLICY_PATH}/src/sql_pt_queries.cc + ${POLICY_PATH}/src/sql_pt_representation.cc + ${POLICY_PATH}/src/update_status_manager.cc + ${POLICY_PATH}/src/status.cc + ${POLICY_PATH}/src/cache_manager.cc + ${COMPONENTS_DIR}/rpc_base/src/rpc_base/rpc_base.cc +) + +list(APPEND SOURCES + ${POLICY_PATH}/src/sql_pt_ext_queries.cc + ${POLICY_PATH}/src/sql_pt_ext_representation.cc +) + +set(LIBRARIES ConfigProfile policy_struct dbms jsoncpp Utils) +if (CMAKE_SYSTEM_NAME STREQUAL "QNX") + # --- QDB Wrapper + include_directories (${COMPONENTS_DIR}/utils/include/utils) +else () + # --- SQLite Wrapper + include_directories (${COMPONENTS_DIR}/utils/include/utils) + list(APPEND LIBRARIES sqlite3) +endif () + +add_library(${target} SHARED ${SOURCES}) +target_link_libraries(${target} ${LIBRARIES} ) + +if (ENABLE_LOG) + target_link_libraries(${target} log4cxx -L${LOG4CXX_LIBS_DIRECTORY}) +endif() + +add_custom_target(copy_library_${target} ALL + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_CURRENT_BINARY_DIR}/${library_name} + ${copy_destination} + DEPENDS ${target} + COMMENT "Copying library ${library_name}") + +install(TARGETS ${target} + DESTINATION ${install_destination} + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE +) + +# --- Table struct +set(struct_target policy_struct) + +set(TABLE_STRUCT_SOURCES + ${POLICY_PATH}/src/policy_table/enums.cc + ${POLICY_PATH}/src/policy_table/types.cc + ${POLICY_PATH}/src/policy_table/validation.cc +) + +add_library(${struct_target} ${TABLE_STRUCT_SOURCES}) +target_link_libraries(${struct_target} Utils) + +# --- Usage statistics +set(USAGE_STATISTICS_SOURCES + ./src/usage_statistics/counter.cc +) + +add_library(UsageStatistics ${USAGE_STATISTICS_SOURCES}) +target_link_libraries(UsageStatistics Utils) + +#======================= Unit-Test section ======================= +if (BUILD_TESTS) + add_subdirectory(test) +endif() +#================================================================= diff --git a/src/components/policy/policy_external/Readme.txt b/src/components/policy/policy_external/Readme.txt new file mode 100644 index 0000000000..370fab238a --- /dev/null +++ b/src/components/policy/policy_external/Readme.txt @@ -0,0 +1,3 @@ +To use SQLite and SQLite wrapper need to install libsqlite3-0 and libsqlite3-dev packages. +To use QDB and QDB wrapper on QNX need to install SDP QNX 6.5.0 and run qdb server. +To start qdb server need use script qdbserver.sh from directory qdb_wrapper. diff --git a/src/components/policy/policy_external/doc/doxygen/components/AppMgr/index.txt b/src/components/policy/policy_external/doc/doxygen/components/AppMgr/index.txt new file mode 100644 index 0000000000..17584b09e1 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/AppMgr/index.txt @@ -0,0 +1,5 @@ +/*! \page components_appmgr App Manager + +Here will be information about App Manager component + +*/
\ No newline at end of file diff --git a/src/components/policy/policy_external/doc/doxygen/components/HMI/index.txt b/src/components/policy/policy_external/doc/doxygen/components/HMI/index.txt new file mode 100644 index 0000000000..361763118d --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/HMI/index.txt @@ -0,0 +1,5 @@ +/*! \page components_hmi HMI + +Here will be information about HMI component + +*/
\ No newline at end of file diff --git a/src/components/policy/policy_external/doc/doxygen/components/JSONHandler/Formatters/index.txt b/src/components/policy/policy_external/doc/doxygen/components/JSONHandler/Formatters/index.txt new file mode 100644 index 0000000000..9854b88d5f --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/JSONHandler/Formatters/index.txt @@ -0,0 +1,9 @@ +/*! \page components_jsonhandler_formatters Smart Objects Formatters + +In order to create JSON string representation from Smart Object or create Smart Object data structure from JSON string representation JSON Handler component has special classes called formatters. + +The interface of formatter is quite simple and defined by NsSmartDeviceLink::NsJSONHandler::Formatters::CFormatterJsonBase class. Actually it has two methods - NsSmartDeviceLink::NsJSONHandler::Formatters::CFormatterJsonBase::objToJsonValue to convert JSON string to object and NsSmartDeviceLink::NsJSONHandler::Formatters::CFormatterJsonBase::jsonValueToObj to create JSON string from object. + +Current implementation has two different implementations of NsSmartDeviceLink::NsJSONHandler::Formatters::CFormatterJsonBase class: NsSmartDeviceLink::NsJSONHandler::Formatters::CFormatterJsonALRPCv1 for ALRPC.v1 and NsSmartDeviceLink::NsJSONHandler::Formatters::CFormatterJsonALRPCv2 for ALRPC.v2. These implementations handle specifics of each format. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/JSONHandler/index.txt b/src/components/policy/policy_external/doc/doxygen/components/JSONHandler/index.txt new file mode 100644 index 0000000000..a65c8ddc7d --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/JSONHandler/index.txt @@ -0,0 +1,8 @@ +/*! \page components_jsonhandler JSON Handler + +Here will be information about JSON Handler component + +Detailed information: + - \subpage components_jsonhandler_formatters "Smart Objects Formatters" + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/ProtocolHandler/index.txt b/src/components/policy/policy_external/doc/doxygen/components/ProtocolHandler/index.txt new file mode 100644 index 0000000000..c5b5ceb79c --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/ProtocolHandler/index.txt @@ -0,0 +1,5 @@ +/*! \page components_protocolhandler Protocol Handler + +Here will be information about Protocol Handler component + +*/
\ No newline at end of file diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Types/Value representation.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Types/Value representation.txt new file mode 100644 index 0000000000..6505ae6f43 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Types/Value representation.txt @@ -0,0 +1,25 @@ +/*! \page components_smartobjects_types_repr Type value representation methods for SmartObjects + +As alternative to the type casts NsSmartDeviceLink::NsSmartObjects::CSmartObject class defines set of usable methods that allow to represent object values as desired type. Use of these methods may change code style and readability but functionally it completely similar to the type casts of Smart Objects. + +Example: + +<pre> +NsSmartDeviceLink::NsSmartObjects::CSmartObject obj; + +obj[0] = 1; + +obj[1] = true; + +obj[2] = 'a'; + +obj[3] = 3.14; + +int i = obj[0].asInt(); + +char c = obj[1].asChar(); + +double d = obj[2].asDouble(); +</pre> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Types/index.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Types/index.txt new file mode 100644 index 0000000000..61ca201507 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Types/index.txt @@ -0,0 +1,9 @@ +/*! \page components_smartobjects_types Smart Objects Types + +Current implementation of Smart Objects contains definitions that allow working with every Smart Object +as variable of one of the basic types: bool, int, long, double, char, string (both as char* and std::string), array and map. + +There are two different ways to work with type values in SmartObjects: + - \subpage components_smartobjects_types_cast "Type cast for SmartObjects" + - \subpage components_smartobjects_types_repr "Type value representation methods for SmartObjects" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/Schema Structure.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/Schema Structure.txt new file mode 100644 index 0000000000..2e611f74b9 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/Schema Structure.txt @@ -0,0 +1,101 @@ +/*! \page components_smartobjects_validation_items Schema structure: Schema Items + +In order to create new Schema (new object of class NsSmartDeviceLink::NsSmartObjects::CSmartSchema) client first must define all required Schema Items. Actually every Schema is a tree of respective Schema Items. Each node and leaf of that tree defines structural rules for some Smart Object data structure. + +Schema Items are represented as class hierarchy. The base class for all schema items is a NsSmartDeviceLink::NsSmartObjects::ISchemaItem class. This base class defines generic validation interface for Schema Items. + +To define special elements with always successful or always failing validation there are two special Schema Items: NsSmartDeviceLink::NsSmartObjects::CAlwaysTrueSchemaItem and NsSmartDeviceLink::NsSmartObjects::CAlwaysFalseSchemaItem. + +NsSmartDeviceLink::NsSmartObjects::CBoolSchemaItem is used for boolean values and has no parameters (only verifies that respective Smart Object is really has boolean value). + +NsSmartDeviceLink::NsSmartObjects::TNumberSchemaItem is template Schema Item that can be used for both integer and floating point values. In addition to the regular type verification it is possible to set min and max value range (these values are optional). + +NsSmartDeviceLink::NsSmartObjects::TEnumSchemaItem is used to verify any custom client-defined enum. + +NsSmartDeviceLink::NsSmartObjects::CStringSchemaItem is used to verify a string values. As optional parameter max length of the string could be set. + +NsSmartDeviceLink::NsSmartObjects::CArraySchemaItem provides validation for array. Can be used to verify special type and array size. + +NsSmartDeviceLink::NsSmartObjects::CObjectSchemaItem used in case when Schema Item includes another Schema Item. Actually this is only way to create tree node of new Schema. All other Schema Items will be used only to become leafs of validation tree. + +After creation of all required Schema Items (which is actually bind in the tree) it is possible to create Schema. +Schema can be initialized not only by raw root Schema Item, but also by special abstraction called Member (defined by NsSmartDeviceLink::NsSmartObjects::CObjectSchemaItem::SMember class). So every root item (NsSmartDeviceLink::NsSmartObjects::CObjectSchemaItem) firstly should be wrapped as Member. This wrapping process also allows to set "is mandatory" status for every Member. + + and pass root Schema Item as initial parameter to the new Schema. + +Currently Schemas are generated by the InterfaceGenerator. For supported ALRPC.v1/.v2 Schema has following structure: + +<pre> + +ROOT + | + -- PARAMS + | | + | -- FUNCTION_ID + | | + | -- MESSAGE_TYPE + | | + | -- CORRELATION_ID + | | + | -- PROTOCOL_VERSION + | | + | -- PROTOCOL_TYPE + | + -- MSG_PARAMS + | + -- OBJECT + | + -- (Actually contains function-specific leaf item) + ... +</pre> + +Example: + +<pre> + +// Function parameter success. +// +// true, if successful +// false, if failed +TSharedPtr<ISchemaItem> success_SchemaItem = CBoolSchemaItem::create(TSchemaItemParameter<bool>()); + +// Function parameter resultCode. +// +// See Result +TSharedPtr<ISchemaItem> resultCode_SchemaItem = TEnumSchemaItem<Result::eType>::create(resultCode_allowedEnumSubsetValues, TSchemaItemParameter<Result::eType>()); + +// Function parameter info. +// +// Provides additional human readable info regarding the result. +TSharedPtr<ISchemaItem> info_SchemaItem = CStringSchemaItem::create(TSchemaItemParameter<size_t>(1000), TSchemaItemParameter<std::string>()); + +schemaMembersMap["success"] = CObjectSchemaItem::SMember(success_SchemaItem, true); + +schemaMembersMap["resultCode"] = CObjectSchemaItem::SMember(resultCode_SchemaItem, true); + +schemaMembersMap["info"] = CObjectSchemaItem::SMember(info_SchemaItem, false); + +std::map<std::string, CObjectSchemaItem::SMember> paramsMembersMap; + +paramsMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_FUNCTION_ID] = CObjectSchemaItem::SMember(TEnumSchemaItem<FunctionID::eType>::create(FunctionIDItems), true); + +paramsMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_MESSAGE_TYPE] = CObjectSchemaItem::SMember(TEnumSchemaItem<messageType::eType>::create(MessageTypeItems), true); + +paramsMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_CORRELATION_ID] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + +paramsMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_VERSION] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(1, 2), true); + +paramsMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_PROTOCOL_TYPE] = CObjectSchemaItem::SMember(TNumberSchemaItem<int>::create(), true); + +std::map<std::string, CObjectSchemaItem::SMember> rootMembersMap; + +rootMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_MSG_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(schemaMembersMap), true); + +rootMembersMap[NsSmartDeviceLink::NsJSONHandler::strings::S_PARAMS] = CObjectSchemaItem::SMember(CObjectSchemaItem::create(paramsMembersMap), true); + + +CSmartSchema(CObjectSchemaItem::create(rootMembersMap)); + +</pre> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/Validation.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/Validation.txt new file mode 100644 index 0000000000..a02f0be4bd --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/Validation.txt @@ -0,0 +1,9 @@ +/*! \page components_smartobjects_validation_use Using Schema for validation + +The main purpose of Schema is validation of existing Smart Object. This process includes type and value validation. The client can use results of validation to determine if given Smart Object is valid or not. Validation of specific Smart Object can be triggered by using NsSmartDeviceLink::NsSmartObjects::CSmartSchema::validate method. Internally Schema triggers respective validate method of every Schema Item in order to perform validation. + +Another feature of Schema is capability to be applied to the Smart Object. Applying means that Schema tries to modify object to "normalize" data. Currently this "normalization" effects on string representation of enums. Applying of the Schema can be triggered by using NsSmartDeviceLink::NsSmartObjects::CSmartSchema::applySchema method. Internally Schema triggers respective apply method of every Schema Item and at the moment only enum Schema Items try to covert string representation to enum values. + +To "unapply" modifications done by apply feature Schema has NsSmartDeviceLink::NsSmartObjects::CSmartSchema::unapplySchema method. It can be used to make string representations of enums. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/index.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/index.txt new file mode 100644 index 0000000000..d425791873 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Smart Objects Validation/index.txt @@ -0,0 +1,10 @@ +/*! \page components_smartobjects_validation Smart Objects validation + +The mechanism of Smart Objects validation includes special Schema. This Schema is similar to the regular XML schema. In other words Schema defines structural description of desired object. After that definition is done Schema can be applied to the object in order to make validation. + +Every Schema is constructed from objects called SchemaItems. Every SchemaItem defines type and restriction of specific data structure. + +For more details please review: + - \subpage components_smartobjects_validation_items "Schema structure: Schema Items" + - \subpage components_smartobjects_validation_use "Using Schema for validation" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Use b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Use new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Use diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Use of Smart Objects/index.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Use of Smart Objects/index.txt new file mode 100644 index 0000000000..d270436890 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/Use of Smart Objects/index.txt @@ -0,0 +1,6 @@ +/*! \page components_smartobjects_usage Use Smart Objects + +There are lots of useful applications for the Smart Objects. They allow building complex dynamic data +structures in runtime and can be used to store and provide almost any data. For example any array can contain an item which is other array and so on. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/index.txt b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/index.txt new file mode 100644 index 0000000000..3844e1ab69 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/SmartObjects/index.txt @@ -0,0 +1,11 @@ +/*! \page components_smartobjects Smart Objects + +Smart Object is building block for a custom dynamic data structures with virtually unlimited complexity. Client code can use Smart Objects to create containers for simple basic types such as bools, ints, doubles, chars, strings end enums as well as arrays and maps. + +Smart Objects solution also includes validation/normalization mechanism of schemas witch is similar to the XML schemas. This feature allows client to validate any data structure. + +More detailed information is described in following chapters: + - \subpage components_smartobjects_types "Smart Objects Types" + - \subpage components_smartobjects_usage "Use of Smart Objects" + - \subpage components_smartobjects_validation "Smart Objects validation" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/ConnectionManagement.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/ConnectionManagement.txt new file mode 100644 index 0000000000..2ba273e9d4 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/ConnectionManagement.txt @@ -0,0 +1,11 @@ +/** @page components_transportmanager_client_connection_management Connection Management + * + * As all requests to TransportManager are asynchronous, client must implement NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener + * interface and add itself as a device listener with NsSmartDeviceLink::NsTransportManager::ITransportManager::addDeviceListener() + * in order to receive notifications. + * To connect remote device client must use NsSmartDeviceLink::NsTransportManager::ITransportManager::connectDevice(). It will initiate connections to all + * applications running on remove device. For TCP device this call has no effect as TCP connections are initiated by remote devices. + * Client will be notified about each connected application with NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener::onApplicationConnected(). + * To disconnect all applications running on remote device client must use NsSmartDeviceLink::NsTransportManager::ITransportManager::disconnectDevice(). + * Client will be notified about each disconnected application with NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener::onApplicationDisconnected(). + */ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/DataTransfer.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/DataTransfer.txt new file mode 100644 index 0000000000..98dd7426be --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/DataTransfer.txt @@ -0,0 +1,11 @@ +/** @page components_transportmanager_client_data_transfer Data Transfer + * + * As all requests to TransportManager are asynchronous, client must implement NsSmartDeviceLink::NsTransportManager::ITransportManagerDataListener + * interface and add itself as a data listener with NsSmartDeviceLink::NsTransportManager::ITransportManager::addDataListener() + * in order to receive notifications. + * To send frame to remote device client must use NsSmartDeviceLink::NsTransportManager::ITransportManager::sendFrame() poviding connection handle, + * frame data, data size and user data. User data is an integer that is assigned to a frame and will be sent back to client when sending of frame + * will be completed. Client may use this data to identify frame when send result will be reported. When sending of frame is completed + * client is notified via NsSmartDeviceLink::NsTransportManager::ITransportManagerDataListener::onFrameSendCompleted(). When frame is received from a remote + * device client is notified via NsSmartDeviceLink::NsTransportManager::ITransportManagerDataListener::onFrameReceived(). + */ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/DeviceManagement.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/DeviceManagement.txt new file mode 100644 index 0000000000..eb5f3e477e --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/DeviceManagement.txt @@ -0,0 +1,14 @@ +/** @page components_transportmanager_client_device_management Device Management + * + * As all requests to TransportManager are asynchronous, client must implement NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener + * interface and add itself as a device listener with NsSmartDeviceLink::NsTransportManager::ITransportManager::addDeviceListener() + * in order to receive notifications. + * Client of TransportManager may use NsSmartDeviceLink::NsTransportManager::ITransportManager::scanForNewDevices() + * to initiate device scan on all device adapters that support this feature. In order to get list of available + * devices client must override NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener::onDeviceListUpdated(). + * Each device adapter will perform scan independently from other device adapters and device list might be updated + * several times (after each adapter that supports scanning finishes scanning operation). Device list might also be + * updated without device scan request, e.g. if new client connects via TCP this device will be added to device list + * and update notification will be sent to client. In any of these cases client will be provided with the full + * device list from all device adapters in every notification. + */ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/index.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/index.txt new file mode 100644 index 0000000000..8916dbeb55 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Client Specification/index.txt @@ -0,0 +1,18 @@ +/*! \page components_transportmanager_client Transport Manager Client Specification + +This chapter describes details of correct use of Transport Manager on the client side. In other words this chapter can be called "How to create effective and safe client of Transport Manager". +Transport Manager defines set of asynchronous requests (means that operations are non-blocking in the calling thread) and provides two different interfaces to monitor asynchronous responses and notifications about data update. + +Clients of Transport Manager should use NsSmartDeviceLink::NsTransportManager::ITransportManager interface to initiate any request to the component. +Also Transport Manager provides two different interfaces: + +1) NsSmartDeviceLink::NsTransportManager::ITransportManagerDataListener. Client can implement this interface if it needs information about data frame send/receive. + +2) NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener. Client can implement this interface if it needs information about updates of devices available for communication and current client applications status. + +For more information about typical use of Transport Manager please read the following topics: + - \subpage components_transportmanager_client_device_management "Device Management" + - \subpage components_transportmanager_client_connection_management "Connection Management" + - \subpage components_transportmanager_client_data_transfer "Data Transfer" + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/BluetoothAdapter.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/BluetoothAdapter.txt new file mode 100644 index 0000000000..970aeffd83 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/BluetoothAdapter.txt @@ -0,0 +1,19 @@ +/** @page components_transportmanager_internal_design_transport_adapters_bluetooth_adapter Bluetooth Adapter + * + * Bluetooth adapter handles communication with external devices via bluetooth. It is implemented in + * NsSmartDeviceLink::NsTransportManager::CBluetoothAdapter. + * + * @section components_transportmanager_internal_design_transport_adapters_bluetooth_adapter_discovery Device discovery + * + * When requested by a call to NsSmartDeviceLink::NsTransportManager::CTransportAdapter::scanForNewDevices() bluetooth adapter + * searches for bluetooth devices. For each found device it runs SDP query for service with SmartDeviceLink UUID + * (936DA01F-9ABD-4D9D-80C7-02AF85C822A8). Devices that support this service are added to bluetooth adapter device list. + * Bluetooth device scans are performed only when explicitly requested. + * + * @section components_transportmanager_internal_design_transport_adapters_bluetooth_adapter_connecting_devices Connecting devices + * + * NsSmartDeviceLink::NsTransportManager::CBluetoothAdapter::createConnectionsListForDevice() runs SDP query for specified device + * and fills connection list with connections to all RFCOMM channels on remote device where SmartDeviceLink service has been discovered. + * + * @see @ref components_transportmanager_internal_design_transport_adapters_common_connecting_devices + */ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/TCPAdapter.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/TCPAdapter.txt new file mode 100644 index 0000000000..d81b70dfe8 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/TCPAdapter.txt @@ -0,0 +1,20 @@ +/** @page components_transportmanager_internal_design_transport_adapters_tcp_adapter TCP Adapter + * + * TCP adapter handles communication with remote devices via TCP/IP socket. It is implemented in + * NsSmartDeviceLink::NsTransportManager::CTCPAdapter. + * + * @section components_transportmanager_internal_design_transport_adapters_tcp_adapter_listen Listening for connections + * + * TCP adapter creates listening TCP socket (TCP port is specified in NsSmartDeviceLink::NsTransportManager::CTCPAdapter::cTCPAdapterPort) + * and listens for incoming connections. Devices are identified by their IP address. + * + * @section components_transportmanager_internal_design_transport_adapters_tcp_adapter_accept Accepting connection + * + * When TCP adapter accepts connection it checks if there is a device with IP address matching with IP address of accepted connection. + * If there is no such device, then this device is added and device list is updated. + * + * @section components_transportmanager_internal_design_transport_adapters_tcp_adapter_disconnecting Disconnecting + * + * When socket gets disconnected TCP adapter checks if there is another opened connection for IP address of disconnected application. + * If it was the last application from this IP address then device with this IP address is removed and devices list is updated. + */ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/index.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/index.txt new file mode 100644 index 0000000000..3a5d0f0e91 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Device Adapters/index.txt @@ -0,0 +1,89 @@ +/** @page components_transportmanager_internal_design_transport_adapters Device Adapters + * + * TransportManager communicates with actual devices via device adapters. + * + * @section components_transportmanager_internal_design_transport_adapters_common Common logic + * + * Logic common to all device adapters is implemented in class NsSmartDeviceLink::NsTransportManager::CTransportAdapter. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_devices_map Devices map + * + * Devices map is a map of device handle to internal device structure NsSmartDeviceLink::NsTransportManager::CTransportAdapter::SDevice. + * Devices map is stored in NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mDevices. Any access to this map must be performed + * with NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mDevicesMutex locked. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_connections_map Connections map + * + * Connections map is a map of connection handle to internal connection structure NsSmartDeviceLink::NsTransportManager::CTransportAdapter::SConnection. + * Connections map is stored in NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mConnections. Any access to this map must be performed + * with NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mConnectionsMutex locked. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_main_thread Device adapter main thread + * + * Device adapter main thread is started in NsSmartDeviceLink::NsTransportManager::CTransportAdapter::run(). + * Specific device adapter must implement virtual function NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mainThread() + * and implement its specific main thread logic there. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_connection_thread Device adapter connection thread + * + * Device adapter connection thread is started in NsSmartDeviceLink::NsTransportManager::CTransportAdapter::startConnection(). + * Specific device adapter must implement virtual function NsSmartDeviceLink::NsTransportManager::CTransportAdapter::connectionThread() + * and implement its specific connection thread logic there. When connection is established and socket file descriptor is set + * in NsSmartDeviceLink::NsTransportManager::CTransportAdapter::SConnection::mConnectionSocket specific device adapter may call + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::handleCommunication() to handle all communication through this socket + * until connection is terminated. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_threads_termination Termination of device adapter threads + * + * Specific device adapter implementation must call in its destructor NsSmartDeviceLink::NsTransportManager::CTransportAdapter::waitForThreadsTermination() + * to wait for termination of all threads (main thread and connection threads). Device adapter threads must be terminated before specific + * device adapter class is destructed, so it can't be called in the destructor of base class and must be called explicitly from the inherited + * class's destructor. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_device_scan Requesting scan for new devices + * + * Device scan is requested by setting flag NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mDeviceScanRequested + * and signaling conditional variable NsSmartDeviceLink::NsTransportManager::CTransportAdapter::mDeviceScanRequestedCond, which may be monitored + * by specific device adapter if it supports device scanning. Specific device adaptere may call for this purpose + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::waitForDeviceScanRequest() which will wait on this conditional variable + * until it's signaled or specified timeout expires. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_connecting_devices Connecting devices + * + * Device connection is initiated with a call to NsSmartDeviceLink::NsTransportManager::CTransportAdapter::connectDevice(). + * This method calls virtual function NsSmartDeviceLink::NsTransportManager::CTransportAdapter::createConnectionsListForDevice() + * which may be implemented by specific device adapter to create a list of connections that must be established for the device. + * For each connection created by device adapter it calls NsSmartDeviceLink::NsTransportManager::CTransportAdapter::startConnection() + * which adds connection to connections map and starts connection thread. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_disconnecting_devices Disconnecting devices + * + * Device disconnection is initiated with a call to NsSmartDeviceLink::NsTransportManager::CTransportAdapter::disconnectDevice(). + * This method finds all connections in connections map that corresponds to specified device and calls + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::stopConnection() for each of them. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_handling_communication Handling communication + * + * All frames requested to be sent via NsSmartDeviceLink::NsTransportManager::CTransportAdapter::sendFrame() are stored in + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::SConnection::mFramesToSend. Pipe + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::SConnection::mNotificationPipeFds is used by + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::sendFrame() to notify connection thread that data is available + * to be sent. NsSmartDeviceLink::NsTransportManager::CTransportAdapter::sendFrame() writes one byte to the write end of this pipe. + * NsSmartDeviceLink::NsTransportManager::CTransportAdapter::handleCommunication() uses poll() to wait for + * incoming data using connection socket file descriptor and outgoing data using file descriptor of the read end of this pipe. + * When either of them become available for reading or some error occurs (e.g. socket gets disconnected) connection thread + * wakes up and handles this event. Notification pipe is also used to notify connection thread that connection has to be + * terminated using NsSmartDeviceLink::NsTransportManager::CTransportAdapter::SConnection::mTerminateFlag. + * + * @subsection components_transportmanager_internal_design_transport_adapters_common_update_client_device_list Updating client device list. + * + * Specific device adapter may call NsSmartDeviceLink::NsTransportManager::CTransportAdapter::updateClientDeviceList() when its internal + * knowledge about available devices is updated to notify device adapter client (TransportManager) about this update. + * + * @section components_transportmanager_internal_design_transport_adapters_common_specific Specific device adapters + * + * Current TransportManager implementation contains following device adapters: + * + * - @subpage components_transportmanager_internal_design_transport_adapters_bluetooth_adapter "Bluetooth Adapter" + * - @subpage components_transportmanager_internal_design_transport_adapters_tcp_adapter "TCP Adapter" + */ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Interaction.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Interaction.txt new file mode 100644 index 0000000000..655d0a1290 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/Interaction.txt @@ -0,0 +1,7 @@ +/*! \page components_transportmanager_internal_design_interaction Sub-Components Interaction + +Internally Transport Manager is a root component for Device Adapters. After running Transport Manager creates Device Adapters and runs them too. + +During system life cycle all messages from Device Adapter are translated via Transport Manager to the clients. In other direction – all requests from clients are re-directed to respective Device Adapters by the Transport Manager. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/MultiThreading.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/MultiThreading.txt new file mode 100644 index 0000000000..6c35f0962f --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/MultiThreading.txt @@ -0,0 +1,9 @@ +/*! \page components_transportmanager_internal_design_multithreading Multi-Threading in Component + +Internally Transport Manager uses different threads for different operations. This design solution was used to provide efficient asynchronous communication with clients and underlying Device Adapters. + +Transport Manager uses one thread to operate with all device-related callbacks. In other word all callbacks declared in NsSmartDeviceLink::NsTransportManager::ITransportManagerDeviceListener will be called from that thread. + +For every active connection one service thread will be created. This thread will be used for all connection-related callbacks. Therefore every implementation of NsSmartDeviceLink::NsTransportManager::ITransportManagerDataListener will be called in separated thread that allows client to support multiple connection simultaneously. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/TrasportManager.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/TrasportManager.txt new file mode 100644 index 0000000000..c96fd46a22 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/TrasportManager.txt @@ -0,0 +1,15 @@ +/*! \page components_transportmanager_internal_design_trasport_manager Trasport Manager Implementation + +Actually Transport Manager component is implemented as classical manager component. It manages connections and abstract devices and provides unified information for the clients. + +Connection-related information encapsulated in structure NsSmartDeviceLink::NsTransportManager::CTransportManager::SConnectionInfo. Transport Manager manages these structures to store information about every active connection. + +Frame processing encapsulated in structure NsSmartDeviceLink::NsTransportManager::CTransportManager::SFrameDataForConnection. Transport Manager manages these structures to store information related to data for specific connection. + +Callback information between transport manager threads passed in form of special structures: +NsSmartDeviceLink::NsTransportManager::CTransportManager::SDeviceListenerCallback. +NsSmartDeviceLink::NsTransportManager::CTransportManager::SDataListenerCallback. + +Client calls to TM guarded by separate mutex. This allows use component from different threads without any risk. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/index.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/index.txt new file mode 100644 index 0000000000..b29ec48dd1 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Internal Design/index.txt @@ -0,0 +1,15 @@ +/*! \page components_transportmanager_internal_design Component Internal Design + +This chapter is focused on Transport Manager internal design and describes internal sub-components and use of multi-threading. + +Information regarding sub-components is described in following topics: + - \subpage components_transportmanager_internal_design_transport_adapters "Device Adapters" + - \subpage components_transportmanager_internal_design_trasport_manager "Trasport Manager Implementation" + +Detailed description of sub-components interaction is described here: + - \subpage components_transportmanager_internal_design_interaction "Sub-Components Interaction" + +More information about internal usage of multi-threading id described here: + - \subpage components_transportmanager_internal_design_multithreading "Multi-Threading in Component" + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase1.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase1.txt new file mode 100644 index 0000000000..4af46e4320 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase1.txt @@ -0,0 +1,74 @@ +/*! \page components_transportmanager_use_cases_1 Scenario with 1 device and 1 application + +<h3>Preconditions:</h3> +<table> + <tr> + <th>Steps</th> + <th>Actions</th> + <th>Expected result</th> + </tr> + <tr> + <td>1</td> + <td>The Device is connected to SmartDeviceLink Core VIA Bluetooth or Wi-Fi</td> + <td> + <p>For BT: Devices are paired</p> + <p>For Wi-Fi: Devices are in the same network</p> + </td> + </tr> + <tr> + <td>2</td> + <td>Make sure that correct device is connected to SmartDeviceLink core</td> + <td>IP-address of connected device is relevant</td> + </tr> +</table> + +<h3>Testcase:</h3> +<table> + <tr> + <th>Steps</th> + <th>Actions</th> + <th>Expected result</th> + </tr> + <tr> + <td>1</td> + <td>Start SmartDeviceLink application on the Devices</td> + <td>SmartDeviceLink application is up and ready</td> + </tr> + <tr> + <td>2</td> + <td>Initiate a Device search in HMI</td> + <td>HMI displays the list of found devices/applications</td> + </tr> + <tr> + <td>3</td> + <td>Connect to desired device\application</td> + <td>Application is marked as connected/notification is displayed in HMI</td> + </tr> + <tr> + <td>4</td> + <td>Send alert message from SmartDeviceLink application</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>5</td> + <td>Disconnect device from SmartDeviceLink core</td> + <td>Application is marked as disconnected/notification is displayed in HMI</td> + </tr> + <tr> + <td>6</td> + <td>Try to send alert from disconnected device</td> + <td>Alert shouldn’t be delivered and displayed in HMI</td> + </tr> + <tr> + <td>7</td> + <td><strong>Repeat steps 1-4 with using another connection method (BT of Wi-Fi)</strong></td> + <td>Expected results should be the same</td> + </tr> + <tr> + <td>8</td> + <td><h3>Stress:</h3>Send big amount of alert messages in a short period of time</td> + <td>All alert messages are processed correctly</td> + </tr> +</table> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase2.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase2.txt new file mode 100644 index 0000000000..de1d6baae0 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase2.txt @@ -0,0 +1,96 @@ +/*! \page components_transportmanager_use_cases_2 Scenario with 2 or more devices with 1 application onboard + +<h3>Preconditions:</h3> +<table> + <tr> + <th>Steps</th> + <th>Actions</th> + <th>Expected result</th> + </tr> + <tr> + <td>1</td> + <td>Device-1 is connected to Core via Bluetooth</td> + <td>Devices are paired</td> + </tr> + <tr> + <td>2</td> + <td>Device-2 is connected to SmartDeviceLink Core via Wi-Fi</td> + <td>Devices are in the same network</td> + </tr> + <tr> + <td>3</td> + <td>Make sure that correct devices are connected to SmartDeviceLink core</td> + <td>IP-address of connected devices are relevant</td> + </tr> +</table> + +<h3>Testcase:</h3> +<table> + <tr> + <th>Steps</th> + <th>Actions</th> + <th>Expected result</th> + </tr> + <tr> + <td>1</td> + <td>Start SmartDeviceLink application on the Devices</td> + <td>SmartDeviceLink application is up and ready</td> + </tr> + <tr> + <td>2</td> + <td>Initiate a Device search in HMI</td> + <td>HMI displays the list of found devices/applications</td> + </tr> + <tr> + <td>3</td> + <td>Connect to application-1 on 1-st device</td> + <td>Application is marked as connected/notification is displayed in HMI</td> + </tr> + <tr> + <td>4</td> + <td>Connect to application on 2-nd device</td> + <td>Application is marked as connected/notification is displayed in HMI. Both applications on device-1 and device-2 are marked as connected</td> + </tr> + <tr> + <td>5</td> + <td>Send alert message from SmartDeviceLink application-1</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>6</td> + <td>Send alert message from SmartDeviceLink application-2</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>7</td> + <td>Send alert messages from both application simultaneously</td> + <td>Both alerts are displayed on HMI/Alerts are showed consequently</td> + </tr> + <tr> + <td>8</td> + <td>Disconnect device-2 from SmartDeviceLink core</td> + <td>Application is marked as disconnected/notification is displayed in HMI</td> + </tr> + <tr> + <td>9</td> + <td>Try to send alert messages from both application simultaneously</td> + <td>Alert is delivered only from device-1</td> + </tr> + <tr> + <td>10</td> + <td>Disconnect device-1 from SmartDeviceLink core</td> + <td>Application is marked as disconnected/notification is displayed in HMI</td> + </tr> + <tr> + <td>11</td> + <td><strong>Repeat steps 1-9 with more devices or use same connection method (BT of Wi-Fi)</strong></td> + <td>Expected results should be the same</td> + </tr> + <tr> + <td>12</td> + <td><h3>Stress:</h3>Send big amount of alert messages in a short period of time from all devices</td> + <td>All alert messages are processed correctly</td> + </tr> +</table> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase3.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase3.txt new file mode 100644 index 0000000000..f11faadfdc --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/UseCase3.txt @@ -0,0 +1,131 @@ +/*! \page components_transportmanager_use_cases_3 Scenario with 2 or more devices with 2 or more applications onboard + +<h3>Preconditions:</h3> +<table> + <tr> + <th>Steps</th> + <th>Actions</th> + <th>Expected result</th> + </tr> + <tr> + <td>1</td> + <td>Device-1 is connected to Core via Bluetooth</td> + <td>Devices are paired</td> + </tr> + <tr> + <td>2</td> + <td>Device-2 is connected to SmartDeviceLink Core via Wi-Fi</td> + <td>Devices are in the same network</td> + </tr> + <tr> + <td>3</td> + <td>Make sure that correct devices are connected to SmartDeviceLink core</td> + <td>IP-address of connected devices are relevant</td> + </tr> +</table> + +<h3>Testcase:</h3> +<table> + <tr> + <th>Steps</th> + <th>Actions</th> + <th>Expected result</th> + </tr> + <tr> + <td>1</td> + <td>Start SmartDeviceLink application on the Devices</td> + <td>SmartDeviceLink application is up and ready</td> + </tr> + <tr> + <td>2</td> + <td>Initiate a Device search in HMI</td> + <td>HMI displays the list of found devices/applications</td> + </tr> + <tr> + <td>3</td> + <td>Connect to application-1 on 1-st device</td> + <td>Application is marked as connected/notification is displayed in HMI</td> + </tr> + <tr> + <td>4</td> + <td>Send alert message from SmartDeviceLink application-1 on device-1</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>5</td> + <td>Connect to application-2 on 1-st device</td> + <td>Application is marked as connected/notification is displayed in HMI Both applications are marked as connected</td> + </tr> + <tr> + <td>6</td> + <td>Send alert message from SmartDeviceLink application-2 on device-1</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>7</td> + <td>Send alert messages from application-1 and application-2 on device-1 simultaneously</td> + <td>Both alerts are displayed on HMI/Alerts are showed consequently</td> + </tr> + <tr> + <td>8</td> + <td>Connect to application-1 on 2-st device</td> + <td>Application is marked as connected/notification is displayed in HMI. All 3 applications are marked as connected</td> + </tr> + <tr> + <td>9</td> + <td>Send alert messages from application-1 on device-1 and device-2 simultaneously</td> + <td>Both alerts are displayed on HMI/Alerts are showed consequently</td> + </tr> + <tr> + <td>10</td> + <td>Send alert message from SmartDeviceLink application-1 on device-2</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>11</td> + <td>Connect to application on 2-nd device</td> + <td>Application is marked as connected/notification is displayed in HMI. All 4 applications are marked as connected</td> + </tr> + <tr> + <td>12</td> + <td>Send alert message from SmartDeviceLink application-2 on device-2</td> + <td>Alert is displayed on HMI</td> + </tr> + <tr> + <td>13</td> + <td>Send alert messages from application-1 and application-2 on device-2 simultaneously</td> + <td>Both alerts are displayed on HMI/Alerts are showed consequently</td> + </tr> + <tr> + <td>14</td> + <td>Send alert messages from application-2 on device-1 and device-2 simultaneously</td> + <td>Both alerts are displayed on HMI/Alerts are showed consequently</td> + </tr> + <tr> + <td>15</td> + <td>Send alert messages from all application simultaneously</td> + <td>Both alerts are displayed on HMI/Alerts are showed consequently</td> + </tr> + <tr> + <td>16</td> + <td>Disconnect device-1 from SmartDeviceLink core</td> + <td>Applications are marked as disconnected/notification is displayed in HMI</td> + </tr> + <tr> + <td>17</td> + <td>Disconnect device-2 from SmartDeviceLink core</td> + <td>All applications are marked as disconnected/notification is displayed in HMI</td> + </tr> + <tr> + <td>18</td> + <td><strong>Repeat steps 1-15 with more devices and more applications or use same connection method (BT of Wi-Fi)</strong></td> + <td>Expected results should be the same</td> + </tr> + <tr> + <td>19</td> + <td><h3>Stress:</h3>Send big amount of alert messages in a short period of time from all devices</td> + <td>All alert messages are processed correctly</td> + </tr> +</table> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/index.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/index.txt new file mode 100644 index 0000000000..c929a16a88 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/Use Cases/index.txt @@ -0,0 +1,11 @@ +/*! \page components_transportmanager_use_cases High-Level Use Cases to Test Component + +This page contains set of high-level use-cases which can be used for testing of Transport Manager functionallity. + +In described scenarious term “Device” means any device which is able to run SmartDeviceLink Applications and capable to connect via BT or +Wi-Fi. + +- \subpage components_transportmanager_use_cases_1 Simple scenario for smoke tests of trasprot level. +- \subpage components_transportmanager_use_cases_2 Many devices verification for transport level operations. +- \subpage components_transportmanager_use_cases_3 Complex verification of correct transport level operations. +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/TransportManager/index.txt b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/index.txt new file mode 100644 index 0000000000..73252c751c --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/TransportManager/index.txt @@ -0,0 +1,9 @@ +/*! \page components_transportmanager Transport Manager + +Transport Manager is a component of SmartDeviceLink application which is designed to provide transparent access to transport layer for other components. Current implementation provides unified access to connections via Bluetooth and TCP. Also this component allows run automatic device discovery and provides information about found devices which is able to connect to SmartDeviceLink. + +More detailed information is described in following chapters: + - \subpage components_transportmanager_client "Transport Manager Client Specification" + - \subpage components_transportmanager_internal_design "Component Internal Design" + - \subpage components_transportmanager_use_cases "High-Level Use Cases to Test Component" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/components/index.txt b/src/components/policy/policy_external/doc/doxygen/components/index.txt new file mode 100644 index 0000000000..186de88af0 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/components/index.txt @@ -0,0 +1,10 @@ +/*! \page components Components + +Project contain following components: + - \subpage components_transportmanager "Transport Manager" + - \subpage components_protocolhandler "Protocol Handler" + - \subpage components_jsonhandler "JSON Handler" + - \subpage components_smartobjects "Smart Objects" + - \subpage components_appmgr "App Manager" + - \subpage components_hmi "HMI" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/info.txt b/src/components/policy/policy_external/doc/doxygen/info.txt new file mode 100644 index 0000000000..e8afe55c12 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/info.txt @@ -0,0 +1,5 @@ +/*! \page info Project information + +Here will be general information about project + +*/
\ No newline at end of file diff --git a/src/components/policy/policy_external/doc/doxygen/mainpage.txt b/src/components/policy/policy_external/doc/doxygen/mainpage.txt new file mode 100644 index 0000000000..5cd05e2606 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/mainpage.txt @@ -0,0 +1,9 @@ +/*! \mainpage Project SmartDeviceLink + +This is the entry point to the documentation about project. + +This manual is divided in the following sections: +- \subpage info "General project information" +- \subpage components "Project components" +- \subpage tools "Project specific tools" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/Arhitecture.txt b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/Arhitecture.txt new file mode 100644 index 0000000000..4cf9e84d99 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/Arhitecture.txt @@ -0,0 +1,5 @@ +/*! \page tools_interfacegenerator_architecture InterfaceGenerator architecture + +InterfaceGenerator is designed as flexible and easily expendable tool that allows to implement both new parsers and generators independently. The core idea of InterfaceGenerator that it has middle-ware product - abstract model of interface that should be generated. This middle layer allows to separate collection of parsers from generators. Also it is possible to add any new validation / normalization component between them. So at the moment the root script creates actual parser and that parser produces model of interface (set of Python classes objects). After that interface model is passed to the desired generator and generator creates result source code files. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/CMake Integration.txt b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/CMake Integration.txt new file mode 100644 index 0000000000..b4fb0b3df5 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/CMake Integration.txt @@ -0,0 +1,13 @@ +/*! \page tools_interfacegenerator_cmakeintegration Integration with CMake + +In order to organize usable build process that allows to create generated code at every workstation in accordance with local setting and ensure that code re-generated after any modification in source XML or InterfaceGenerator itself was designed custom CMake rule "GenerateInterface". + +This rule takes 3 arguments - name of source XML file, desired namespace for generated code and name of parser to use (name of parser is required because supported XML formats are indistinguishable and client must explicitly specify desired parser type). + +Example: + +<pre> +GenerateInterface("test_v4_protocol_v2_0_revP.xml" "Gen::test::components::JSONHandler" "alrpcv2") +</pre> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/How To Use.txt b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/How To Use.txt new file mode 100644 index 0000000000..0f9e340bc5 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/How To Use.txt @@ -0,0 +1,31 @@ +/*! \page tools_interfacegenerator_usage How to use InterfaceGenerator + +To run InterfaceGenerator the Python 2.7 interpreter should be installed. As input InterfaceGenerator requires full path to the source XML file, namespace to generate result code in, full path to the output directory where result source code C++ will be created and optionally explicit specification of parser type. + +Example1 (Run Generator.py to display help): + +<pre> +$ python Generator.py -h + +usage: Generator.py [-h] --parser-type {alrpcv1,alrpcv2} + source-xml namespace output-dir + +SmartSchema interface generator + +positional arguments: + source-xml + namespace + output-dir + +optional arguments: + -h, --help show this help message and exit + --parser-type {alrpcv1,alrpcv2} +</pre> + +Example2 (Run Generator.py to generate some code) + +<pre> +python Generator.py /home/user1/xml/alrpc1.xml App::Gen:: /home/user1/gen --parser-type=alrpcv2 +</pre> + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/Use of Output.txt b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/Use of Output.txt new file mode 100644 index 0000000000..b486fd7e37 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/Use of Output.txt @@ -0,0 +1,11 @@ +/*! \page tools_interfacegenerator_output Use of InterfaceGenerator output + +As a result InterfaceGenerator produces one .cpp and one .hpp file in the output directory. Those files contain one C++ class which named in accordance with input XML file name. Class is declared and implemented in specified namespace. Also all enums form source XML file have automatically generated declarations within specified namespace. + +Generated class is inherited form predefined base template class CSmartFactory. Actually this inherited class defines specific set of Smart Object schema's initialization methods which are set to the base class member and can be used by the clients. + +Also generated code contains string mapping for enums that is used to convert string representation or enums to integer values and vice versa. + +Result source code should be compilable but this is not guaranteed if source XML file contains identifier names that are not correct C++ identifiers. + +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/index.txt b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/index.txt new file mode 100644 index 0000000000..21b437f6b7 --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/tools/InterfaceGenerator/index.txt @@ -0,0 +1,12 @@ +/*! \page tools_interfacegenerator InterfaceGenerator + +InterfaceGenerator is a special code generation tool that allows creating of C++ source code to work with interface described as XML file. +InterfaceGenerator is a bundle of Python scripts. Root script is a Generator.py. This script should be used by the client to run generator. +Currently InterfaceGenerator supports generation form ALRPC v.1 and ALRPC v.2 XML formats. + +For more details please review: + - \subpage tools_interfacegenerator_usage "How to use InterfaceGenerator" + - \subpage tools_interfacegenerator_output "Use of InterfaceGenerator output" + - \subpage tools_interfacegenerator_architecture "InterfaceGenerator architecture" + - \subpage tools_interfacegenerator_cmakeintegration "Integration with CMake" +*/ diff --git a/src/components/policy/policy_external/doc/doxygen/tools/index.txt b/src/components/policy/policy_external/doc/doxygen/tools/index.txt new file mode 100644 index 0000000000..4befa33e8d --- /dev/null +++ b/src/components/policy/policy_external/doc/doxygen/tools/index.txt @@ -0,0 +1,5 @@ +/*! \page tools Tools + +Project uses following special tools: + - \subpage tools_interfacegenerator "InterfaceGenerator" +*/ diff --git a/src/components/policy/policy_external/doc/grc/conf.smartDeviceLinkCore b/src/components/policy/policy_external/doc/grc/conf.smartDeviceLinkCore new file mode 100644 index 0000000000..a026407723 --- /dev/null +++ b/src/components/policy/policy_external/doc/grc/conf.smartDeviceLinkCore @@ -0,0 +1,33 @@ +# source filename +regexp=\w+\.(?:cpp|h) +colours=yellow +=== +regexp=^(ERROR|FATAL) +colours=red on_yellow +=== +regexp=^WARN +colours=red +=== +regexp=^INFO +colours=blue +=== +regexp=^TRACE +colours=magenta +=== +# component +regexp=(?<=\])\[[^]]+\] +colours=cyan +=== +# something invalid +regexp=(?i)invalid +colours=red +=== +# RPC message start +regexp=^\{$ +colours=bold +count=block +=== +# RPC message end +regexp=^\}$ +colours=bold +count=unblock
\ No newline at end of file diff --git a/src/components/policy/policy_external/doc/grc/grc.conf b/src/components/policy/policy_external/doc/grc/grc.conf new file mode 100644 index 0000000000..dfd3d4cbef --- /dev/null +++ b/src/components/policy/policy_external/doc/grc/grc.conf @@ -0,0 +1,3 @@ +# smartDeviceCore command +(^|[/\w\.]+/)smartDeviceLinkCore\s? +conf.smartDeviceLinkCore diff --git a/src/components/policy/policy_external/doc/install.txt b/src/components/policy/policy_external/doc/install.txt new file mode 100644 index 0000000000..c870856e97 --- /dev/null +++ b/src/components/policy/policy_external/doc/install.txt @@ -0,0 +1,91 @@ +* Introduction + ================ + smartDeviceLinkCore is an application which manages the transport, connection and communication between a head unit and mobile device. + +* OS and Hardware + ========= + Ubuntu 12.04.01 LTS 32-bit OS on the PC with USB-dongle + Application has been tested using 2 types of USB-dongle: + D-Link DBT-122 + STLab B-121mini + +* External components + =================== + For build application we need: + libbluetooth3, the BlueZ library + libbluetooth-dev, the development files to link to the BluetZ library. + Install libraries: + sudo apt-get install libbluetooth3 + sudo apt-get install libbluetooth-dev + + We are using cmake to create build configurations. + Install cmake: + sudo apt-get install cmake + + Also, make sure the g++ compiler is installed: + sudo apt-get install g++ + + To start web-based HMI we need web-browser with web-socket RFC6455 support. + For example Google Chromium. Install it using: + sudo apt-get install chromium-browser + + To run InterfaceGenerator some python libraries are required and must be + installed with following command: + sudo pip install -r tools/InterfaceGenerator/requirements.txt + + For logging Apache log4cxx library is used. Install required packages with the following command: + sudo apt-get install liblog4cxx10 liblog4cxx10-dev + + For installing pulseaudio development files which neededfor audio management fetures run: + sudo apt-get install libpulse-dev + + For installing gstreamer development files which needed for audio management fetures: + First add gstreamer repositories to your apt source list (/etc/apt/sources.list): + deb http://ppa.launchpad.net/gstreamer-developers/ppa/ubuntu <distributive codename> main + deb-src http://ppa.launchpad.net/gstreamer-developers/ppa/ubuntu <distributive codename> main + use code name relevant to the Ubuntu version which you use instead of <distributive codename>. + Run: + sudo apt-get update + and: + sudo apt-get install gstreamer1.0* + +* Build application + ================= + We support "out of sources" concept for build from R3.0.0 + It means all generated by build tools files will be stored in separate folder. + Temporary build of application requires two steps. + 1. Enter src/thirdPartyLibs/logger + build logger: + + 1. Create directory outside of SmartDeviceLink project directory. + For example "build" folder in the same folder with SmartDeviceLink git repo folder which has a name "git_repo": + You will have folders structure like this: + /home/projects/smart_device_link + |--build + |--git_repo + |--doc + |--src + |--test + |--DoxyFile + \--CMakeLists.txt + Enter this folder: + cd build + + 2. Create build configuration using cmake: + 2.1 For Debug configuration + cmake ../git_repo + 2.2 For Release configuration, run: + cmake -DCMAKE_BUILD_TYPE=Release ../git_repo + 2.3 For Debug configuration with tests, run: + cmake -DBUILD_TESTS=On ../git_repo + + 3. Make project: + make + + Ready to use release application will be in build/src/appMain/smartDeviceLinkCore + + 4. If You built configuration with tests (see 2.3 above), then You can run all project tests and see overall result with: + make test + + 5. For creating the doxygen documentation run: + make doxygen
\ No newline at end of file diff --git a/src/components/policy/policy_external/doc/qnx_build.txt b/src/components/policy/policy_external/doc/qnx_build.txt new file mode 100644 index 0000000000..4f67d6eed3 --- /dev/null +++ b/src/components/policy/policy_external/doc/qnx_build.txt @@ -0,0 +1,28 @@ +Building the project +cmake -DCMAKE_TOOLCHAIN_FILE=../applink/qnx_6.5.0_linux_x86.cmake ../applink +or for Momentics project: +cmake -DCMAKE_TOOLCHAIN_FILE=../applink/qnx_6.5.0_linux_x86.cmake -G "Eclipse CDT4 - Unix Makefiles" ../applink + +Building with support D-Bus and Qt 4.8 +Install D-Bus (see https://adc.luxoft.com/confluence/x/0AHJDw) +Install Qt 4.8 (see https://adc.luxoft.com/confluence/x/UwfJDw) +cmake -DHMI2=ON -DCMAKE_TOOLCHAIN_FILE=../applink/qnx_6.5.0_linux_x86.cmake ../applink +or for Momentics project: +cmake -DHMI2=ON -DCMAKE_TOOLCHAIN_FILE=../applink/qnx_6.5.0_linux_x86.cmake -G "Eclipse CDT4 - Unix Makefiles" ../applink + +make +make install + +Running project: +Change server IP in configuration file to QNX target IP. +Copy directory bin to QNX target. +You can copy it using scp. Example: +scp -r user_name@linux_pc_ip:/full_path/to/dir . + +For Web HMI set target IP in ini file and change target IP in src/components/HMI/ffw/RPCClient.js +! Currently we don't have any configuration file for HMI. + +Execute smartDeviceLinkCore on QNX qtarget. +Execute HMI on Linux PC (only Web HMI). + +Have fun! diff --git a/src/components/policy/policy_external/doc/readme.txt b/src/components/policy/policy_external/doc/readme.txt new file mode 100644 index 0000000000..66087df057 --- /dev/null +++ b/src/components/policy/policy_external/doc/readme.txt @@ -0,0 +1,65 @@ +* Introduction + ================ + smartDeviceCore is an application which manages the transport, connection and communication between a head unit and mobile device. + +* OS and Hardware + ========= + Ubuntu 12.04.1 LTS 32-bit OS on the PC with USB-dongle + Application has been tested using 2 types of USB-dongle: + D-Link DBT-122 + STLab B-121mini + + * External components + =================== + For start application we need: + libbluetooth3, the BlueZ library + Install library: + sudo apt-get install libbluetooth3 + To start web-based HMI we need web-browser with web-socket RFC6455 support. + For example Google Chromium. Install it using: + sudo apt-get install chromium-browser + In current implementation Chromium is required for autostart HMI feature. + For HMI autostart please set path to hmi in config file + For example: + LinkToWebHMI = ${path_to_HMI_repository}/index.html + +* Running application + ==================== + Plug USB-dongle in. + Switch Bluetooth on a mobile device ON and make the device discoverable. + Pair mobile device with PC using Ubuntu tools. + Device should contain SmartDeviceLink compatible application installed. + Start application with command: + ./smartDeviceLinkCore + Application starts to search devices and starts HMI in cromium-browser. + In case HMI has not been started please start web-based HMI manually in browser opening src/components/HMI/index.html. + SmartDeviceLinkCore is searching Bluetooth devices with a correspondibg service. + Go to info menu in HMI and press App button. + Press change Devices button. + Select the device from a list. + Application opens all available ports on devices and starts communication. + Returning to the App menu all applications will be shown in a list. + +* Colorized logs + ============== + You can have colorized log output of smartDeviceLinkCore's messages in the terminal with the help of grc: + + 1. Make sure grc is installed: + sudo apt-get install grc + + 2. Copy the config files from the grc/ directory into ~/.grc/ directory: + mkdir ~/.grc + cp grc/* ~/.grc/ + + 3. Add an alias to your shell's config (usually, ~/.bashrc or ~/.zshrc): + alias grca='grc -es --colour=auto' + + Either restart the shell session or source the edited file: + source ~/.bashrc + or + source ~/.zshrc + + 4. Start the smartDeviceLink core with the following command: + grca ./smartDeviceLinkCore + + 5. PROFIT
\ No newline at end of file diff --git a/src/components/policy/policy_external/include/policy/cache_manager.h b/src/components/policy/policy_external/include/policy/cache_manager.h new file mode 100644 index 0000000000..13b7dd88bb --- /dev/null +++ b/src/components/policy/policy_external/include/policy/cache_manager.h @@ -0,0 +1,840 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_CACHE_MANAGER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_CACHE_MANAGER_H_ + +#include <map> + +#include "utils/shared_ptr.h" +#include "policy/pt_representation.h" +#include "policy/pt_ext_representation.h" +#include "policy/usage_statistics/statistics_manager.h" +#include "policy/cache_manager_interface.h" +#include "utils/threads/thread.h" +#include "utils/threads/thread_delegate.h" + +#include "utils/lock.h" +#include "utils/conditional_variable.h" + +namespace policy { +class PolicySettings; + +class CacheManager : public CacheManagerInterface { + public: + CacheManager(); + explicit CacheManager(bool in_memory); + ~CacheManager(); + + /** + * @brief Checks if specified RPC for specified application + * has permission to be executed in specified HMI Level + * and also its permitted params. + * @param app_id Id of application provided during registration + * @param hmi_level Current HMI Level of application + * @param rpc Name of RPC + * @return CheckPermissionResult containing flag if HMI Level is allowed + * and list of allowed params. + */ + virtual void CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result); + + /** + * @brief Returns true if Policy Table was not updated yet + * from preloaded pt file. + */ + virtual bool IsPTPreloaded(); + + /** + * Gets number of ignition cycles before next update policy table + * @return number of ignition cycles + */ + virtual int IgnitionCyclesBeforeExchange(); + + /** + * Gets value in kilometers before next update policy table + * @param current value in kilometers from the odometers + * @return value in kilometers + */ + virtual int KilometersBeforeExchange(int current); + + /** + * @brief Sets counter value that passed for recieved successful PT UPdate + */ + virtual bool SetCountersPassedForSuccessfulUpdate(Counters counter, + int value); + + /** + * Gets value in days before next update policy table + * @param current value in days after epoch + * @return value in days + */ + virtual int DaysBeforeExchange(uint16_t current); + + /** + * @brief Increments number of ignition cycles since last exchange by 1 + */ + virtual void IncrementIgnitionCycles(); + + /** + * @brief Resets number of ignition cycles since last exchange to 0 + */ + virtual void ResetIgnitionCycles(); + + /** + * @brief Returns timeout to wait for a response of PT update + * @return value in seconds + */ + virtual int TimeoutResponse(); + + /** + * @brief Returns number of seconds between each try of sending PTS + * @param seconds Return value: array of 5 elements + * @return bool Success of operation + */ + virtual bool SecondsBetweenRetries(std::vector<int>& seconds); + + /** + * @brief Gets information about vehicle + */ + virtual const VehicleInfo GetVehicleInfo() const; + + /** + * @brief Allows to update 'vin' field in module_meta table. + * + * @param new 'vin' value. + * + * @return true in case when data has been successfully updated, + * false otherwise. + */ + bool SetVINValue(const std::string& value); + + /** + * @brief Gets message text for displaying/pronouncing for user + * dependent on language and context. + * @param msg_codes Context of message (Driver distraction, Grant permission + * etc) + * @param language Requested language of the message + * @param active_hmi_language Last language has been received + * via UI.GetLanguage (used as first fallback language) + * @return Array of appropriate messages parameters + */ + std::vector<UserFriendlyMessage> GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, + const std::string& language, + const std::string& active_hmi_language); + + /** + * @brief GetLockScreenIcon allows to obtain lock screen icon url; + * + * @return url which point to the resourse where lock screen icon could be + *obtained. + */ + virtual std::string GetLockScreenIconUrl() const; + + /** + * @brief Gets list of URL to send PTS to + * @param service_type If URLs for specific service are preset, + * return them otherwise default URLs. + */ + virtual void GetUpdateUrls(const std::string& service_type, + EndpointUrls& out_end_points); + + virtual void GetUpdateUrls(const uint32_t service_type, + EndpointUrls& out_end_points); + + /** + * @brief Gets allowed number of notifications + * depending on application priority. + * @param priority Priority of application + */ + virtual rpc::policy_table_interface_base::NumberOfNotificationsType + GetNotificationsNumber(const std::string& priority); + + /** + * @brief Gets priority for given application + * @param policy_app_id Unique application id + * @param priority Priority for application or empty, if value was not set + * @return true, if succedeed, otherwise - false + */ + virtual bool GetPriority(const std::string& policy_app_id, + std::string& priority) const OVERRIDE; + + /** + * @brief Initialized Policy Table (load) + * @return bool Success of operation + */ + bool Init(const std::string& file_name, const PolicySettings* settings); + + /** + * @brief Gets snapshot of Policy Table + * including app_policies, functional_groups, + * device_info, statistics, excluding user messages + * @return Generated structure for obtaining Json string. + */ + virtual utils::SharedPtr<policy_table::Table> GenerateSnapshot(); + + /** + * Applies policy table to the current table + * @param update_pt policy table + * @return true if successfully + */ + bool ApplyUpdate(const policy_table::Table& update_pt); + + /** + * @brief Gets list of appHMIType associated with mobile appID + * @param container of appHMIType + */ + virtual void GetHMIAppTypeAfterUpdate( + std::map<std::string, StringArray>& app_hmi_types); + + /** + * @brief AppHasHMIType checks whether app has been registered with certain + *HMI type. + * + * @return true in case app contains certain HMI type, false otherwise. + */ + virtual bool AppHasHMIType(const std::string& application_id, + policy_table::AppHMIType hmi_type) const; + + /** + * Gets flag updateRequired + * @return true if update is required + */ + bool UpdateRequired() const; + + /** + * @brief Saves flag updateRequired + * @param status update status if true then update required. + */ + void SaveUpdateRequired(bool status); + + /** + * @brief GetInitialAppData Retrieves data from app_policies + * about app on its registration + * @param app_id id of registered app. + * All outputs are filled in only if not null + * @param nicknames Synonyms for application + * @param app_hmi_types app_types Section on HMI where app can + * appear (Navigation, Phone etc) + * @return true in case initial application data was obtained successfuly. + */ + bool GetInitialAppData(const std::string& app_id, + StringArray& nicknames, + StringArray& app_hmi_types); + + /** + * Checks if the application is revoked + * @param app_id application id + * @return true if application is revoked + */ + bool IsApplicationRevoked(const std::string& app_id) const; + + /** + * @brief Gets functional groupings from DB + * @param groups Known functional groupings + * @return true, if succeeded, otherwise - false + */ + bool GetFunctionalGroupings(policy_table::FunctionalGroupings& groups); + + /** + * Checks if the application is represented in policy table + * @param app_id application id + * @return true if application is represented in policy table + */ + bool IsApplicationRepresented(const std::string& app_id) const; + + /** + * Checks if the application has default policy + * @param app_id application id + * @return true if application has default policy + */ + bool IsDefaultPolicy(const std::string& app_id) const OVERRIDE; + + /** + * @brief SetIsDefault Sets is_default flag for application + * @param app_id app specific application + * @return true in case opperation was done successfully. + */ + bool SetIsDefault(const std::string& app_id); + + /** + * @brief SetIsPredata Sets is_predata flag for application + * @param app_id app specific application + * @return true in case opperation was done successfully. + */ + bool SetIsPredata(const std::string& app_id); + + /** + * Checks if the application has pre_data policy + * @param app_id application id + * @return true if application has pre_data policy + */ + bool IsPredataPolicy(const std::string& app_id) const OVERRIDE; + + /** + * Sets default policy for application + * @param app_id application id + * @return true if success + */ + bool SetDefaultPolicy(const std::string& app_id); + + /** + * @brief Is application allowed to send notifications while in + * Backgound or limited mode. + * @param app_id Application id + * @return bool Allowed/disallowed. + */ + bool CanAppKeepContext(const std::string& app_id) const OVERRIDE; + + /** + * @brief Is application allowed to move foreground at will? + * @param app_id Application id + * @return bool Allowed/disallowed. + */ + bool CanAppStealFocus(const std::string& app_id) const; + + /** + * @brief Gets default_hmi for given application + * @param policy_app_id Unique application id + * @param default_hmi Default HMI level for application or empty, if value was + * not set + * @return true, if succedeed, otherwise - false + */ + bool GetDefaultHMI(const std::string& app_id, std::string& default_hmi) const; + + /** + * @brief Resets user consent for device data and applications permissions + * @return + */ + bool ResetUserConsent(); + + /** + * @brief Gets user permissions for device data usage + * @param device_id Generated or obtained id of device + * @param consented_groups Groups consented by user + * @param disallowed_groups Groups not consented by user + * @return true, if query was successfull, otherwise - false + */ + bool GetUserPermissionsForDevice(const std::string& device_id, + StringArray& consented_groups, + StringArray& disallowed_groups) const; + + /** + * @brief Gets list of groups permissions from policy table + * @param device_id Unique device id, which hosts specific application + * @param policy_app_id Unique application id + * @param group_types Group list sorted by permission status + * @return true, if query was successfull, otherwise - false + */ + bool GetPermissionsForApp(const std::string& device_id, + const std::string& app_id, + FunctionalIdType& group_types); + + /** + * @brief Gets device groups and preconsented groups from policies section + * @param groups List of groups to be consented for device usage + * @param preconsented_groups List of preconsented groups for device usage + * @return true, if query was successful, otherwise - false + */ + bool GetDeviceGroupsFromPolicies( + rpc::policy_table_interface_base::Strings& groups, + rpc::policy_table_interface_base::Strings& preconsented_groups) const; + + /** + * @brief Adds information about mobile device in Policy Table. + * @param device_id Generated or obtained id of device + * @param connection_type device connection type + * @return bool Success of operation + */ + bool AddDevice(const std::string& device_id, + const std::string& connection_type); + + /** + * @brief Records information about mobile device in Policy Table. + * @param device_id Generated or obtained id of device + * @return bool Success of operation + */ + bool SetDeviceData(const std::string& device_id, + const std::string& hardware = "", + const std::string& firmware = "", + const std::string& os = "", + const std::string& os_version = "", + const std::string& carrier = "", + const uint32_t number_of_ports = 0, + const std::string& connection_type = ""); + + /** + * @brief Sets user consent for particular mobile device, + * i.e. to use device for exchanging of Policy Table. + * @return bool Success of operation + */ + bool SetUserPermissionsForDevice( + const std::string& device_id, + const StringArray& consented_groups = StringArray(), + const StringArray& disallowed_groups = StringArray()); + + /** + * @brief Checks if particular mobile device has user consent in cache + * @return bool Suceess, if has, otherwise - false + */ + bool IsDeviceConsentCached(const std::string& device_id) const; + /** + * @brief Update Application Policies as reaction + * on User allowing/disallowing device this app is running on. + */ + + /** + * @brief Gets user consent for particular mobile device + * @return actual consent for device + */ + DeviceConsent GetDeviceConsent(const std::string& device_id) const OVERRIDE; + + /** + * @brief Sets user consent for particular mobile device + */ + void SetDeviceConsent(const std::string& device_id, + const bool is_allowed) OVERRIDE; + + bool ReactOnUserDevConsentForApp(const std::string& app_id, + bool is_device_allowed); + + /** + * @brief Set user consent on functional groups + * @param permissions User consent on functional group + * @return true, if operation succedeed, otherwise - false + */ + bool SetUserPermissionsForApp(const PermissionConsent& permissions); + + /** + * @brief Records information about head unit system to PT + * @return bool Success of operation + */ + bool SetMetaInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language); + + /** + * @brief Checks, if specific head unit is present in PT + * @return boot Suceess, if present, otherwise - false + */ + bool IsMetaInfoPresent() const; + + /** + * @brief Set current system language + * @param language System language + * @return true, if succedeed, otherwise - false + */ + bool SetSystemLanguage(const std::string& language); + + /** + * Increments global counter + * @param type type of counter + */ + void Increment(usage_statistics::GlobalCounterId type); + + /** + * Increments counter of application + * @param app_id id application + * @param type type of counter + */ + void Increment(const std::string& app_id, + usage_statistics::AppCounterId type); + + /** + * Sets value of application information + * @param app_id id application + * @param type type of information + * @param value value of information + */ + void Set(const std::string& app_id, + usage_statistics::AppInfoId type, + const std::string& value); + + /** + * Adds value to stopwatch of application + * @param app_id id application + * @param type type of stopwatch + * @param seconds value for adding in seconds + */ + void Add(const std::string& app_id, + usage_statistics::AppStopwatchId type, + int seconds); + + /** + * @brief CountUnconsentedGroups allows to obtain the count of unconsented + * groups for specific application. + * @param policy_app_id application id. + * @param device_id device id. + * @return the count of unconsented groups + */ + int CountUnconsentedGroups(const std::string& policy_app_id, + const std::string& device_id); + + /** + * @brief Gets functional group names and user_consent_prompts, if any + * @param Array to be filled with group ids, names and functional prompts + * @return true, if succeeded, otherwise - false + */ + bool GetFunctionalGroupNames(FunctionalGroupNames& names); + + /** + * @brief GetAllAppGroups allows to obtain all groups for certain application. + * @param app_id specific application id. + * @param all_group_ids parameter to fill. + */ + void GetAllAppGroups(const std::string& app_id, + FunctionalGroupIDs& all_group_ids); + /** + * @brief GetPreConsentedGroups allows to obtain all pre-consented groups for + * specific application. + * @param app_id specific application id. + * @param preconsented_groups parameter to fill. + */ + void GetPreConsentedGroups(const std::string& app_id, + FunctionalGroupIDs& preconsented_groups); + /** + * @brief GetConsentedGroups allows to obtain list of allowed and disallowed + * groups for specific application on certain device. + * @param device_id certain device + * @param app_id application id. + * @param allowed_groups list of allowed groups + * @param disallowed_groups list of disallowed groups + */ + void GetConsentedGroups(const std::string& device_id, + const std::string& app_id, + FunctionalGroupIDs& allowed_groups, + FunctionalGroupIDs& disallowed_groups); + + /** + * @brief GetUnconsentedGroups allows to obtain list of allowed and disallowed + * groups for specific application on certain device. + * @param device_id certain device + * @param policy_app_id application id. + * @param unconsented_groups list of unconsented groups. + */ + void GetUnconsentedGroups(const std::string& device_id, + const std::string& policy_app_id, + FunctionalGroupIDs& unconsented_groups); + + void RemoveAppConsentForGroup(const std::string& app_id, + const std::string& group_name); + + /** + * @brief Set app policy to pre_DataConsented policy + * @param app_id Policy ID of application to be changed + * @return true, if succeeded, otherwise - false + */ + bool SetPredataPolicy(const std::string& app_id); + + /** + * @brief Removes unpaired devices + * @return true if success + */ + bool CleanupUnpairedDevices(); + + /** + * Sets flag of unpaired device + * @param device_id Unique device id + * @param unpaired True, if should be marked as unpaired, otherwise - false + * @return true if success + */ + bool SetUnpairedDevice(const std::string& device_id, bool unpaired = true); + + /** + * Resets Policy Table + * @param file_name Path to preloaded PT file + * @return true if successfully + */ + bool ResetPT(const std::string& file_name); + + /** + * @brief LoadFromBackup allows to load policy into the cache from backup. + * @return true in case operation was successful. + */ + bool LoadFromBackup(); + + /** + * @brief LoadFromFile allows to load policy cache from preloaded table. + * @param file_name preloaded + * @param table object which will be filled during file parsing. + * @return true in case file was successfuly loaded, false otherwise. + */ + bool LoadFromFile(const std::string& file_name, policy_table::Table& table); + + /** + * @brief Backup allows to save cache onto hard drive. + */ + void Backup(); + + /** + * Returns heart beat timeout + * @param app_id application id + * @return if timeout was set then value in milliseconds greater zero + * otherwise heart beat for specific application isn't set + */ + uint32_t HeartBeatTimeout(const std::string& app_id) const; + + /** + * @brief Gets request types for application + * @param policy_app_id Unique application id + * @param request_types Request types of application + */ + void GetAppRequestTypes(const std::string& policy_app_id, + std::vector<std::string>& request_types) const; + + virtual const MetaInfo GetMetaInfo() const OVERRIDE; + + /** + * @brief GetCertificate allows to obtain certificate in order to + * make secure connection + * + * @return The certificate in PKCS#7. + */ + virtual std::string GetCertificate() const OVERRIDE; + + virtual void SetDecryptedCertificate(const std::string& certificate) OVERRIDE; + +#ifdef BUILD_TESTS + utils::SharedPtr<policy_table::Table> GetPT() const { + return pt_; + } +#endif + + const PolicySettings& get_settings() const; + + private: + std::string currentDateTime(); + struct AppHMITypeToString { + std::string operator()(rpc::Enum<policy_table::AppHMIType> value) { + return std::string(policy_table::EnumToJsonString(value)); + } + }; + + void GetGroupNameByHashID(const int32_t group_id, std::string& group_name); + void FillDeviceSpecificData(); + long ConvertSecondsToMinute(int seconds); + + /** + * @brief Checks snapshot initialization and initializes to default values, if + * necessary + */ + void CheckSnapshotInitialization(); + + void PersistData(); + + /** + * @brief Resets all calculated permissions in cache + */ + void ResetCalculatedPermissions(); + + /** + * @brief Resets all calculated permissions for specified device in cache + */ + void ResetCalculatedPermissionsForDevice(const std::string& device_id); + + void AddCalculatedPermissions(const std::string& device_id, + const std::string& policy_app_id, + const policy::Permissions& permissions); + + bool IsPermissionsCalculated(const std::string& device_id, + const std::string& policy_app_id, + policy::Permissions& permission); + + private: + utils::SharedPtr<policy_table::Table> pt_; + utils::SharedPtr<policy_table::Table> snapshot_; + utils::SharedPtr<PTRepresentation> backup_; + utils::SharedPtr<PTExtRepresentation> ex_backup_; + bool update_required; + typedef std::set<std::string> UnpairedDevices; + UnpairedDevices is_unpaired_; + + sync_primitives::Lock cache_lock_; + sync_primitives::Lock unpaired_lock_; + + typedef std::map<std::string, Permissions> AppCalculatedPermissions; + typedef std::map<std::string, AppCalculatedPermissions> CalculatedPermissions; + typedef std::map<std::string, DeviceConsent> CachedDevicePermissions; + CalculatedPermissions calculated_permissions_; + CachedDevicePermissions cached_device_permissions_; + mutable sync_primitives::Lock cached_device_permissions_lock_; + sync_primitives::Lock calculated_permissions_lock_; + + /** + * @brief MergePreloadPT allows to load policy table from certain JSON file, + * and then decide if merge is needed. The merge is needed in case when + *preload + * JSON date is different than current database. + * + * @param file_name the preloaded policy table JSON file. + */ + void MergePreloadPT(const std::string& file_name); + + bool GetPermissionsList(StringArray& perm_list) const; + + /** + * @brief Gets user consent from cache for particular mobile device + * @return actual consent for device + */ + DeviceConsent GetCachedDeviceConsent( + const std::string& device_id) const OVERRIDE; + + /** + * @brief Checks if specified device has specified consent + * @return True if consent for device is set, otherwise - false + */ + bool HasDeviceSpecifiedConsent(const std::string& device_id, + const bool is_allowed) const OVERRIDE; + + /** + * @brief Saves user consent to cache for particular mobile device + */ + void SaveDeviceConsentToCache(const std::string& device_id, + const bool is_allowed); + + /** + * @brief MergeMC allows to merge ModuleConfig section by definite rules. + * + * The rules are: + * 1. Add new fields (known to PoliciesManager) & sub-sections if such are + * present in the updated Preloaded PT + * 2. "vehicle_make", “model”, “year” – leave the fields & values as they were + * in the database + * 3. For all other fields – overwrite the values with the new ones from + *preloaded PT. + * + * @param new_pt the policy table loaded from updated preload JSON file. + * + * @param pt the exists database. + */ + void MergeMC(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt); + + /** + * @brief MergeFG allows to merge FunctionalGroupings sections by definite + *rules. + * + * The rules are: + * 1. If functional_group_name exists in both database (LocalPT) and updated + * PreloadedPT -> PoliciesManager must overwrite it (that is, replace such + * functional_group_name in the database by the one from Pre-PT). + * 2. If functional_group_name exists in updated PreloadedPT and does not + * exist in database (LocalPT), PoliciesManager must add such group to the + *database. + * 3. If functional_group_name does not exist in updated PreloadedPT and + * exists in the database (LocalPT), PoliciesManager must leave such group in + * the database without changes. + * + * @param new_pt the policy table loaded from updated preload JSON file. + * + * @param pt the exists database. + */ + void MergeFG(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt); + + /** + * @brief MergeAP Allows to merge ApplicationPolicies section by definite + *relues. + * The rules are: + * 1. Leave “<appID>” sub-sections as they were in the database (fields & + *their values). + * 2. Over-write "default", "device", "pre_DataConsent" subsections. + * + * @param new_pt the policy table loaded from updated preload JSON file. + * + * @param pt the exists database. + */ + void MergeAP(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt); + + /** + * @brief MergeCFM allows to merge ConsumerFriendlyMessages section by + *definite rules. + * + * The rules are: + * 1. If friendly_message_name exists in both database (LocalPT) and updated + * Preloaded PT -> PoliciesManager must overwrite it. + * 2. If friendly_message_name exists in updated Preloaded PT and does not + * exist in database (LocalPT), PoliciesManager must add such + * friendly_message_name to the database (LocalPT). + * 3. If friendly_message_name does not exist in updated Preloaded PT and + * exists in the database (LocalPT), PoliciesManager must leave such + * friendly_message_name in the database without changes. + * + * @param new_pt the policy table loaded from updated preload JSON file. + * + * @param pt the exists database + */ + void MergeCFM(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt); + + void InitBackupThread(); + + /** + * @brief Processes the PTU process by distinguishing the policy type. + * For the RequestType" array of "<default>" or "<pre_DataConsent>" + * rules are applied as described in APPLINK-14698 + * @param initial_policy_iter Iterator to application policy to use for update + */ + void ProcessUpdate(const policy_table::ApplicationPolicies::const_iterator + initial_policy_iter); + + class BackgroundBackuper : public threads::ThreadDelegate { + friend class CacheManager; + + public: + BackgroundBackuper(CacheManager* cache_manager); + ~BackgroundBackuper(); + virtual void threadMain(); + virtual void exitThreadMain(); + void DoBackup(); + + private: + void InternalBackup(); + CacheManager* cache_manager_; + sync_primitives::ConditionalVariable backup_notifier_; + volatile bool stop_flag_; + volatile bool new_data_available_; + + sync_primitives::Lock need_backup_lock_; + DISALLOW_COPY_AND_ASSIGN(BackgroundBackuper); + }; + threads::Thread* backup_thread_; + sync_primitives::Lock backuper_locker_; + BackgroundBackuper* backuper_; + const PolicySettings* settings_; +}; +} // namespace policy +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_CACHE_MANAGER_H_ diff --git a/src/components/policy/policy_external/include/policy/cache_manager_interface.h b/src/components/policy/policy_external/include/policy/cache_manager_interface.h new file mode 100644 index 0000000000..fa31290987 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/cache_manager_interface.h @@ -0,0 +1,717 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_CACHE_MANAGER_INTERFACE_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_CACHE_MANAGER_INTERFACE_H_ + +#include <string> +#include <vector> + +#include "utils/shared_ptr.h" +#include "usage_statistics/counter.h" +#include "policy/policy_types.h" +#include "policy/policy_settings.h" + +namespace policy_table = rpc::policy_table_interface_base; + +namespace policy { + +class CacheManagerInterface { + public: + virtual ~CacheManagerInterface() {} + + /** + * @brief Check if specified RPC for specified application + * has permission to be executed in specified HMI Level + * and also its permitted params. + * @param app_id Id of application provided during registration + * @param hmi_level Current HMI Level of application + * @param rpc Name of RPC + * @return CheckPermissionResult containing flag if HMI Level is allowed + * and list of allowed params. + */ + virtual void CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result) = 0; + + /** + * @brief Returns true if Policy Table was not updated yet + * from preloaded pt file. + */ + virtual bool IsPTPreloaded() = 0; + + /** + * Gets number of ignition cycles before next update policy table + * @return number of ignition cycles + */ + virtual int IgnitionCyclesBeforeExchange() = 0; + + /** + * Gets value in kilometers before next update policy table + * @param current value in kilometers from the odometers + * @return value in kilometers + */ + virtual int KilometersBeforeExchange(int current) = 0; + + /** + * @brief Sets counter value that passed for recieved successful PT UPdate + */ + virtual bool SetCountersPassedForSuccessfulUpdate(Counters counter, + int value) = 0; + + /** + * Gets value in days before next update policy table + * @param current value in days after epoch + * @return value in days + */ + virtual int DaysBeforeExchange(uint16_t current) = 0; + + /** + * @brief Increment number of ignition cycles since last exchange by 1 + */ + virtual void IncrementIgnitionCycles() = 0; + + /** + * @brief Reset number of ignition cycles since last exchange to 0 + */ + virtual void ResetIgnitionCycles() = 0; + + /** + * @brief Returns timeout to wait for a response of PT update + * @return value in seconds + */ + virtual int TimeoutResponse() = 0; + + /** + * @brief Returns number of seconds between each try of sending PTS + * @param seconds Return value: array of 5 elements + * @return bool Success of operation + */ + virtual bool SecondsBetweenRetries(std::vector<int>& seconds) = 0; + + /** + * @brief Get information about vehicle + */ + virtual const VehicleInfo GetVehicleInfo() const = 0; + + /** + * @brief Allows to update 'vin' field in module_meta table. + * + * @param new 'vin' value. + * + * @return true in case when data has been successfully updated, + * false otherwise. + */ + virtual bool SetVINValue(const std::string& value) = 0; + + /** + * @brief Get message text for displaying/pronouncing for user + * dependent on language and context. + * @param msg_codes Context of message (Driver distraction, Grant permission + * etc) + * @param language Language of the message + * @return Array of appropriate messages parameters + */ + virtual std::vector<UserFriendlyMessage> GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, + const std::string& language, + const std::string& active_hmi_language) = 0; + + /** + * @brief Get list of URL to send PTS to + * @param service_type If URLs for specific service are preset, + * return them otherwise default URLs. + */ + virtual void GetUpdateUrls(const std::string& service_type, + EndpointUrls& out_end_points) = 0; + + virtual void GetUpdateUrls(const uint32_t service_type, + EndpointUrls& out_end_points) = 0; + + /** + * @brief GetLockScreenIcon allows to obtain lock screen icon url; + * + * @return url which point to the resourse where lock screen icon could be + *obtained. + */ + virtual std::string GetLockScreenIconUrl() const = 0; + + /** + * @brief Get allowed number of notifications + * depending on application priority. + * @param priority Priority of application + */ + virtual policy_table::NumberOfNotificationsType GetNotificationsNumber( + const std::string& priority) = 0; + + /** + * @brief Get priority for given application + * @param policy_app_id Unique application id + * @param priority Priority for application or empty, if value was not set + * @return true, if succedeed, otherwise - false + */ + virtual bool GetPriority(const std::string& policy_app_id, + std::string& priority) const = 0; + + /** + * @brief Initialized Policy Table (load) + * @return bool Success of operation + */ + virtual bool Init(const std::string& file_name, + const PolicySettings* settings) = 0; + + /** + * @brief Get snapshot of Policy Table + * including app_policies, functional_groups, + * device_info, statistics, excluding user messages + * @return Generated structure for obtaining Json string. + */ + virtual utils::SharedPtr<policy_table::Table> GenerateSnapshot() = 0; + + /** + * Applies policy table to the current table + * @param update_pt policy table + * @return true if successfully + */ + virtual bool ApplyUpdate(const policy_table::Table& update_pt) = 0; + + /** + * @brief Gets list of appHMIType associated with mobile appID + * @param container of appHMIType + */ + virtual void GetHMIAppTypeAfterUpdate( + std::map<std::string, StringArray>& app_hmi_types) = 0; + + /** + * @brief AppHasHMIType checks whether app has been registered with certain + *HMI type. + * + * @return true in case app contains certain HMI type, false otherwise. + */ + virtual bool AppHasHMIType(const std::string& application_id, + policy_table::AppHMIType hmi_type) const = 0; + + /** + * Gets flag updateRequired + * @return true if update is required + */ + virtual bool UpdateRequired() const = 0; + + /** + * @brief Saves flag updateRequired + * @param status update status if true then update required. + */ + virtual void SaveUpdateRequired(bool status) = 0; + + /** + * @brief GetInitialAppData Retrieves data from app_policies + * about app on its registration + * @param app_id id of registered app. + * All outputs are filled in only if not null + * @param nicknames Synonyms for application + * @param app_hmi_types app_types Section on HMI where app can + * appear (Navigation, Phone etc) + * @return true in case initial application data was obtained successfuly. + */ + virtual bool GetInitialAppData(const std::string& app_id, + StringArray& nicknames, + StringArray& app_hmi_types) = 0; + + /** + * Checks if the application is revoked + * @param app_id application id + * @return true if application is revoked + */ + virtual bool IsApplicationRevoked(const std::string& app_id) const = 0; + + /** + * @brief Get functional groupings from DB + * @param groups Known functional groupings + * @return true, if succeeded, otherwise - false + */ + virtual bool GetFunctionalGroupings( + policy_table::FunctionalGroupings& groups) = 0; + + /** + * Checks if the application is represented in policy table + * @param app_id application id + * @return true if application is represented in policy table + */ + virtual bool IsApplicationRepresented(const std::string& app_id) const = 0; + + /** + * Checks if the application has default policy + * @param app_id application id + * @return true if application has default policy + */ + virtual bool IsDefaultPolicy(const std::string& app_id) const = 0; + + /** + * @brief SetIsDefault Sets is_default flag for application + * @param app_id app specific application + * @return true in case opperation was done successfully. + */ + virtual bool SetIsDefault(const std::string& app_id) = 0; + + /** + * @brief SetIsPredata Sets is_predata flag for application + * @param app_id app specific application + * @return true in case opperation was done successfully. + */ + virtual bool SetIsPredata(const std::string& app_id) = 0; + + /** + * Checks if the application has pre_data policy + * @param app_id application id + * @return true if application has pre_data policy + */ + virtual bool IsPredataPolicy(const std::string& app_id) const = 0; + + /** + * Sets default policy for application + * @param app_id application id + * @return true if success + */ + virtual bool SetDefaultPolicy(const std::string& app_id) = 0; + + /** + * @brief Is application allowed to send notifications while in + * Backgound or limited mode. + * @param app_id Application id + * @return bool Allowed/disallowed. + */ + virtual bool CanAppKeepContext(const std::string& app_id) const = 0; + + /** + * @brief Is application allowed to move foreground at will? + * @param app_id Application id + * @return bool Allowed/disallowed. + */ + virtual bool CanAppStealFocus(const std::string& app_id) const = 0; + + /** + * @brief Get default_hmi for given application + * @param policy_app_id Unique application id + * @param default_hmi Default HMI level for application or empty, if value was + * not set + * @return true, if succedeed, otherwise - false + */ + virtual bool GetDefaultHMI(const std::string& app_id, + std::string& default_hmi) const = 0; + + /** + * @brief Resets user consent for device data and applications permissions + * @return + */ + virtual bool ResetUserConsent() = 0; + + /** + * @brief Gets user permissions for device data usage + * @param device_id Generated or obtained id of device + * @param consented_groups Groups consented by user + * @param disallowed_groups Groups not consented by user + * @return true, if query was successfull, otherwise - false + */ + virtual bool GetUserPermissionsForDevice( + const std::string& device_id, + StringArray& consented_groups, + StringArray& disallowed_groups) const = 0; + + /** + * @brief Checks if particular mobile device has user consent in cache + * @return bool Suceess, if has, otherwise - false + */ + virtual bool IsDeviceConsentCached(const std::string& device_id) const = 0; + + /** + * @brief Gets permissions list for device data usage + * @param device_id Generated or obtained id of device + * @return true, if query was successfull, otherwise - false + */ + virtual bool GetPermissionsList(StringArray& perm_list) const = 0; + + /** + * @brief Checks if specified device has specified consent + * @return True if consent for device is set, otherwise - false + */ + virtual bool HasDeviceSpecifiedConsent(const std::string& device_id, + const bool is_allowed) const = 0; + + /** + * @brief Gets user consent for particular mobile device + * @return actual consent for device + */ + virtual DeviceConsent GetDeviceConsent( + const std::string& device_id) const = 0; + + /** + * @brief Sets user consent for particular mobile device + */ + virtual void SetDeviceConsent(const std::string& device_id, + const bool is_allowed) = 0; + + /** + * @brief Gets list of groups permissions from policy table + * @param device_id Unique device id, which hosts specific application + * @param policy_app_id Unique application id + * @param group_types Group list sorted by permission status + * @return true, if query was successfull, otherwise - false + */ + virtual bool GetPermissionsForApp(const std::string& device_id, + const std::string& app_id, + FunctionalIdType& group_types) = 0; + + /** + * @brief Gets device groups and preconsented groups from policies section + * @param groups List of groups to be consented for device usage + * @param preconsented_groups List of preconsented groups for device usage + * @return true, if query was successful, otherwise - false + */ + virtual bool GetDeviceGroupsFromPolicies( + rpc::policy_table_interface_base::Strings& groups, + rpc::policy_table_interface_base::Strings& preconsented_groups) const = 0; + + /** + * @brief Adds information about mobile device in Policy Table. + * @param device_id Generated or obtained id of device + * @param connection_type device connection type + * @return bool Success of operation + */ + virtual bool AddDevice(const std::string& device_id, + const std::string& connection_type) = 0; + + /** + * @brief Records information about mobile device in Policy Table. + * @param device_id Generated or obtained id of device + * @return bool Success of operation + */ + virtual bool SetDeviceData(const std::string& device_id, + const std::string& hardware, + const std::string& firmware, + const std::string& os, + const std::string& os_version, + const std::string& carrier, + const uint32_t number_of_ports, + const std::string& connection_type) = 0; + + /** + * @brief Sets user consent for particular mobile device, + * i.e. to use device for exchanging of Policy Table. + * @return bool Success of operation + */ + virtual bool SetUserPermissionsForDevice( + const std::string& device_id, + const StringArray& consented_groups, + const StringArray& disallowed_groups) = 0; + + /** + * @brief Update Application Policies as reaction + * on User allowing/disallowing device this app is running on. + */ + virtual bool ReactOnUserDevConsentForApp(const std::string& app_id, + bool is_device_allowed) = 0; + + /** + * @brief Set user consent on functional groups + * @param permissions User consent on functional group + * @return true, if operation succedeed, otherwise - false + */ + virtual bool SetUserPermissionsForApp( + const PermissionConsent& permissions) = 0; + + /** + * @brief Records information about head unit system to PT + * @return bool Success of operation + */ + virtual bool SetMetaInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language) = 0; + + /** + * @brief Checks, if specific head unit is present in PT + * @return boot Suceess, if present, otherwise - false + */ + virtual bool IsMetaInfoPresent() const = 0; + + /** + * @brief Set current system language + * @param language System language + * @return true, if succedeed, otherwise - false + */ + virtual bool SetSystemLanguage(const std::string& language) = 0; + + /** + * Increments global counter + * @param type type of counter + */ + virtual void Increment(usage_statistics::GlobalCounterId type) = 0; + + /** + * Increments counter of application + * @param app_id id application + * @param type type of counter + */ + virtual void Increment(const std::string& app_id, + usage_statistics::AppCounterId type) = 0; + + /** + * Sets value of application information + * @param app_id id application + * @param type type of information + * @param value value of information + */ + virtual void Set(const std::string& app_id, + usage_statistics::AppInfoId type, + const std::string& value) = 0; + + /** + * Adds value to stopwatch of application + * @param app_id id application + * @param type type of stopwatch + * @param seconds value for adding in seconds + */ + virtual void Add(const std::string& app_id, + usage_statistics::AppStopwatchId type, + int seconds) = 0; + + /** + * @brief CountUnconsentedGroups allows to obtain the count of unconsented + * groups for specific application. + * @param policy_app_id application id. + * @param device_id device id. + * @param the count of unconsented groups + */ + virtual int CountUnconsentedGroups(const std::string& policy_app_id, + const std::string& device_id) = 0; + + /** + * @brief Gets user consent from cache for particular mobile device + * @return actual consent for device + */ + virtual DeviceConsent GetCachedDeviceConsent( + const std::string& device_id) const = 0; + + /** + * @brief Saves user consent to cache for particular mobile device + */ + virtual void SaveDeviceConsentToCache(const std::string& device_id, + const bool is_allowed) = 0; + + /** + * @brief Gets functional group names and user_consent_prompts, if any + * @param Array to be filled with group ids, names and functional prompts + * @return true, if succeeded, otherwise - false + */ + virtual bool GetFunctionalGroupNames(FunctionalGroupNames& names) = 0; + + /** + * @brief GetAllAppGroups allows to obtain all groups for certain application. + * @param app_id specific application id. + * @param all_group_ids parameter to fill. + */ + virtual void GetAllAppGroups(const std::string& app_id, + FunctionalGroupIDs& all_group_ids) = 0; + + /** + * @brief GetPreConsentedGroups allows to obtain all pre-consented groups for + * specific application. + * @param app_id specific application id. + * @param preconsented_groups parameter to fill. + */ + virtual void GetPreConsentedGroups( + const std::string& app_id, FunctionalGroupIDs& preconsented_groups) = 0; + + /** + * @brief GetConsentedGroups allows to obtain list of allowed and disallowed + * groups for specific application on certain device. + * @param device_id certain device + * @param app_id application id. + * @param allowed_groups list of allowed groups + * @param disallowed_groups list of disallowed groups + */ + virtual void GetConsentedGroups(const std::string& device_id, + const std::string& app_id, + FunctionalGroupIDs& allowed_groups, + FunctionalGroupIDs& disallowed_groups) = 0; + + /** + * @brief GetUnconsentedGroups allows to obtain list of allowed and disallowed + * groups for specific application on certain device. + * @param device_id certain device + * @param policy_app_id application id. + * @param unconsented_groups list of unconsented groups. + */ + virtual void GetUnconsentedGroups(const std::string& device_id, + const std::string& policy_app_id, + FunctionalGroupIDs& unconsented_groups) = 0; + + virtual void RemoveAppConsentForGroup(const std::string& app_id, + const std::string& group_name) = 0; + + /** + * @brief Set app policy to pre_DataConsented policy + * @param app_id Policy ID of application to be changed + * @return true, if succeeded, otherwise - false + */ + virtual bool SetPredataPolicy(const std::string& app_id) = 0; + + /** + * @brief Removes unpaired devices + * @return true if success + */ + virtual bool CleanupUnpairedDevices() = 0; + + /** + * Sets flag of unpaired device + * @param device_id Unique device id + * @param unpaired True, if should be marked as unpaired, otherwise - false + * @return true if success + */ + virtual bool SetUnpairedDevice(const std::string& device_id, + bool unpaired = true) = 0; + + /** + * Resets Policy Table + * @param file_name Path to preloaded PT file + * @return true if successfully + */ + virtual bool ResetPT(const std::string& file_name) = 0; + + /** + * @brief LoadFromBackup allows to load policy into the cache from backup. + * @return true in case operation was successful. + */ + virtual bool LoadFromBackup() = 0; + + /** + * @brief LoadFromFile allows to load policy cache from preloaded table. + * @param file_name preloaded + * @param table object which will be filled during file parsing. + * @return true in case file was successfuly loaded, false otherwise. + */ + virtual bool LoadFromFile(const std::string& file_name, + policy_table::Table& table) = 0; + + /** + * @brief Backup allows to save cache onto hard drive. + */ + virtual void Backup() = 0; + + /** + * Returns heart beat timeout + * @param app_id application id + * @return if timeout was set then value in milliseconds greater zero + * otherwise heart beat for specific application isn't set + */ + virtual uint32_t HeartBeatTimeout(const std::string& app_id) const = 0; + + /** + * @brief Resets all calculated permissions in cache + */ + virtual void ResetCalculatedPermissions() = 0; + + /** + * @brief Resets all calculated permissions for specified device in cache + */ + virtual void ResetCalculatedPermissionsForDevice( + const std::string& device_id) = 0; + + /** + * @brief Adds calculated permissions for specific app on particular device + * into cache + * @param device_id Device id + * @param policy_app_id Application id + * @param permissions Calculated permissions + */ + virtual void AddCalculatedPermissions( + const std::string& device_id, + const std::string& policy_app_id, + const policy::Permissions& permissions) = 0; + + /** + * @brief Checks if permissions calculated for specific app on particular + * device + * @param device_id Device id + * @param policy_app_id Application id + * @param permission Permissions to be filled, in case of presence in cache + * @return true if present, otherwise false + */ + virtual bool IsPermissionsCalculated(const std::string& device_id, + const std::string& policy_app_id, + policy::Permissions& permission) = 0; + + /** + * @brief Gets request types for application + * @param policy_app_id Unique application id + * @param request_types Request types of application + */ + virtual void GetAppRequestTypes( + const std::string& policy_app_id, + std::vector<std::string>& request_types) const = 0; + + /** + * @brief Gets meta information + * @return meta information + */ + virtual const MetaInfo GetMetaInfo() const = 0; + + /** + * @brief GetCertificate allows to obtain certificate in order to + * make secure connection + * + * @return The certificate in PKCS#7. + */ + virtual std::string GetCertificate() const = 0; + + /** + * @brief Sets decrypted certificate in policy table + * @param certificate content of certificate + */ + virtual void SetDecryptedCertificate(const std::string& certificate) = 0; + +#ifdef BUILD_TESTS + /** + * @brief GetPT allows to obtain SharedPtr to PT. + * Used ONLY in Unit tests + * @return SharedPTR to PT + * + */ + virtual utils::SharedPtr<policy_table::Table> GetPT() const = 0; +#endif +}; + +typedef utils::SharedPtr<CacheManagerInterface> CacheManagerInterfaceSPtr; + +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_CACHE_MANAGER_INTERFACE_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_helper.h b/src/components/policy/policy_external/include/policy/policy_helper.h new file mode 100644 index 0000000000..9f8151e29f --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_helper.h @@ -0,0 +1,262 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_HELPER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_HELPER_H_ + +#include "policy/policy_table/functions.h" +#include "utils/shared_ptr.h" +#include "policy/policy_types.h" + +namespace policy { +class PolicyManagerImpl; + +const std::string kAllowedKey = "allowed"; +const std::string kUserDisallowedKey = "userDisallowed"; +const std::string kUndefinedKey = "undefined"; + +namespace policy_table = rpc::policy_table_interface_base; + +typedef policy_table::Strings::const_iterator StringsConstItr; +typedef policy_table::ApplicationPolicies::const_iterator AppPoliciesConstItr; +typedef policy_table::HmiLevels::const_iterator HMILevelsConstItr; +typedef policy_table::Parameters::const_iterator ParametersConstItr; +typedef policy_table::Rpc::const_iterator RpcConstItr; +typedef policy_table::FunctionalGroupings::const_iterator FuncGroupConstItr; + +typedef policy_table::ApplicationPolicies::value_type AppPoliciesValueType; +typedef policy_table::Rpc::value_type RpcValueType; +typedef policy_table::Strings::value_type StringsValueType; + +/* + * @brief Helper struct to compare functional group names + */ +struct CompareGroupName { + explicit CompareGroupName(const StringsValueType& group_name); + bool operator()(const StringsValueType& group_name_to_compare) const; + + private: + const StringsValueType& group_name_; +}; + +/* + * @brief Used for compare of policies parameters mapped with specific + * application ids + */ +bool operator!=(const policy_table::ApplicationParams& first, + const policy_table::ApplicationParams& second); + +/* + * @brief Helper struct for checking changes of application policies, which + * come with update along with current data snapshot + * In case of policies changed for some application, current data will be + * updated and notification will be sent to application + */ +struct CheckAppPolicy { + CheckAppPolicy(PolicyManagerImpl* pm, + const utils::SharedPtr<policy_table::Table> update, + const utils::SharedPtr<policy_table::Table> snapshot); + bool operator()(const AppPoliciesValueType& app_policy); + + private: + enum PermissionsCheckResult { + RESULT_NO_CHANGES, + RESULT_APP_REVOKED, + RESULT_NICKNAME_MISMATCH, + RESULT_PERMISSIONS_REVOKED, + RESULT_CONSENT_NEEDED, + RESULT_CONSENT_NOT_REQIURED, + RESULT_PERMISSIONS_REVOKED_AND_CONSENT_NEEDED, + RESULT_REQUEST_TYPE_CHANGED + }; + + void SetPendingPermissions(const AppPoliciesValueType& app_policy, + PermissionsCheckResult result) const; + PermissionsCheckResult CheckPermissionsChanges( + const AppPoliciesValueType& app_policy) const; + bool HasRevokedGroups(const AppPoliciesValueType& app_policy, + policy_table::Strings* revoked_groups = NULL) const; + bool HasNewGroups(const AppPoliciesValueType& app_policy, + policy_table::Strings* new_groups = NULL) const; + bool HasConsentNeededGroups(const AppPoliciesValueType& app_policy) const; + std::vector<FunctionalGroupPermission> GetRevokedGroups( + const AppPoliciesValueType& app_policy) const; + void RemoveRevokedConsents( + const AppPoliciesValueType& app_policy, + const std::vector<FunctionalGroupPermission>& revoked_groups) const; + bool IsKnownAppication(const std::string& application_id) const; + void NotifySystem(const AppPoliciesValueType& app_policy) const; + void SendPermissionsToApp(const AppPoliciesValueType& app_policy) const; + bool IsAppRevoked(const AppPoliciesValueType& app_policy) const; + bool NicknamesMatch(const AppPoliciesValueType& app_policy) const; + /** + * @brief Allows to check if appropriate group requires any consent. + * @param group_name the group for which consent will be checked. + * @return true if consent is required, false otherwise. + */ + bool IsConsentRequired(const std::string& app_id, + const std::string& group_name) const; + bool IsRequestTypeChanged(const AppPoliciesValueType& app_policy) const; + + private: + PolicyManagerImpl* pm_; + const utils::SharedPtr<policy_table::Table> update_; + const utils::SharedPtr<policy_table::Table> snapshot_; +}; + +/* + * @brief Fill permissions data with merged rpc permissions for hmi levels and + * parameters + */ +struct FillNotificationData { + /** + * @brief Constructor + * @param data Output structure with filled data + * @param group_state Consent of the group processed by instance + * @param undefined_group_consent Defines how to treat 'undefined' consent + * @param does_require_user_consent Specifies whether processed group requires + * user consent + */ + FillNotificationData(Permissions& data, + GroupConsent group_state, + GroupConsent undefined_group_consent, + bool does_require_user_consent); + bool operator()(const RpcValueType& rpc); + void UpdateHMILevels(const policy_table::HmiLevels& in_hmi, + HMIPermissions& out_hmi); + void UpdateParameters(const policy_table::Parameters& in_parameters, + ParameterPermissions& out_parameter); + + private: + void ExcludeSame(RpcPermissions& rpc); + void ExcludeSameHMILevels(std::set<HMILevel>& source, + const std::set<HMILevel>& target); + void ExcludeSameParameters(std::set<Parameter>& source, + const std::set<Parameter>& target); + void InitRpcKeys(const std::string& rpc_name); + bool RpcParametersEmpty(RpcPermissions& rpc); + bool IsSectionEmpty(ParameterPermissions& permissions, + const std::string& section); + std::string current_key_; + Permissions& data_; + const bool does_require_user_consent_; +}; + +/* + * @brief Checks for functional group presence and pass it to helper struct, + * which fills permissions data according to group consent + */ +struct ProcessFunctionalGroup { + ProcessFunctionalGroup( + const policy_table::FunctionalGroupings& fg, + const std::vector<FunctionalGroupPermission>& group_permissions, + Permissions& data, + GroupConsent undefined_group_consent = GroupConsent::kGroupDisallowed); + bool operator()(const StringsValueType& group_name); + + private: + GroupConsent GetGroupState(const std::string& group_name); + const policy_table::FunctionalGroupings& fg_; + const std::vector<FunctionalGroupPermission>& group_permissions_; + Permissions& data_; + GroupConsent undefined_group_consent_; +}; + +struct FunctionalGroupInserter { + FunctionalGroupInserter(const policy_table::Strings& preconsented_groups, + PermissionsList& list); + void operator()(const StringsValueType& group_name); + + private: + PermissionsList& list_; + const policy_table::Strings& preconsented_; +}; + +/** + * @brief Fills FunctionalGroupPermissions with provided params + * @param ids Functional group ids from DB + * @param names Group names and user_consent_prompt + * @param state User consent for group + * @param permissions Struct to be filled with provided params + */ +void FillFunctionalGroupPermissions( + FunctionalGroupIDs& ids, + FunctionalGroupNames& names, + GroupConsent state, + std::vector<FunctionalGroupPermission>& permissions); + +/** + * @brief Checks, if application is predefined, e.g. "default", i.e. which is + * must be present in policy table + * @param app Application struct + * @return true, if app is predefined, otherwise - false + */ +bool IsPredefinedApp(const AppPoliciesValueType& app); + +/** + * @brief Excludes same values + * @param from Source, which should be checked + * @param what Target, which should be excluded from source + * @return Values without excluded + */ +FunctionalGroupIDs ExcludeSame(const FunctionalGroupIDs& from, + const FunctionalGroupIDs& what); + +/** + * @brief Merges all values without same values + * @param first First source of values + * @param second Second source of values + * @return Merged values w/o same values + */ +FunctionalGroupIDs Merge(const FunctionalGroupIDs& first, + const FunctionalGroupIDs& second); + +/** + * @brief Finds same values + * @param first First source of values + * @param second Second source of values + * @return Same values set, if any found + */ +FunctionalGroupIDs FindSame(const FunctionalGroupIDs& first, + const FunctionalGroupIDs& second); + +/** + * @brief Unwrap application policies from predefined values to specific policy + * values, i.e. if application has "default", it will be assigned default + * policies + * @param app_policies Application policies to unwrap + * @return true, if succeded, otherwise - false + */ +bool UnwrapAppPolicies(policy_table::ApplicationPolicies& app_policies); +} + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_HELPER_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_manager_impl.h b/src/components/policy/policy_external/include/policy/policy_manager_impl.h new file mode 100644 index 0000000000..55b5ab1212 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_manager_impl.h @@ -0,0 +1,342 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_MANAGER_IMPL_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_MANAGER_IMPL_H_ + +#include <list> +#include "utils/shared_ptr.h" +#include "utils/lock.h" +#include "policy/policy_manager.h" +#include "policy/policy_table.h" +#include "policy/cache_manager_interface.h" +#include "policy/update_status_manager.h" +#include "policy/policy_table/functions.h" +#include "policy/usage_statistics/statistics_manager.h" + +namespace policy_table = rpc::policy_table_interface_base; + +namespace policy { +struct CheckAppPolicy; + +class PolicyManagerImpl : public PolicyManager { + public: + PolicyManagerImpl(); + explicit PolicyManagerImpl(bool in_memory); + virtual void set_listener(PolicyListener* listener); + PolicyListener* listener() const { + return listener_; + } + virtual bool InitPT(const std::string& file_name, + const PolicySettings* settings); + virtual bool LoadPT(const std::string& file, const BinaryMessage& pt_content); + virtual bool ResetPT(const std::string& file_name); + virtual void GetUpdateUrls(const uint32_t service_type, + EndpointUrls& out_end_points); + virtual void GetUpdateUrls(const std::string& service_type, + EndpointUrls& out_end_points); + virtual void RequestPTUpdate(); + virtual void CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + const RPCParams& rpc_params, + CheckPermissionResult& result); + virtual bool ResetUserConsent(); + virtual void KmsChanged(int kilometers); + virtual void IncrementIgnitionCycles(); + virtual std::string ForcePTExchange(); + virtual std::string GetPolicyTableStatus() const; + virtual void ResetRetrySequence(); + virtual int NextRetryTimeout(); + virtual uint32_t TimeoutExchangeMSec(); + virtual const std::vector<int> RetrySequenceDelaysSeconds(); + virtual void OnExceededTimeout(); + virtual std::string GetLockScreenIconUrl() const OVERRIDE; + virtual void OnUpdateStarted(); + virtual void PTUpdatedAt(Counters counter, int value); + + /** + * Refresh data about retry sequence from policy table + */ + virtual void RefreshRetrySequence(); + virtual DeviceConsent GetUserConsentForDevice( + const std::string& device_id) const OVERRIDE; + virtual void GetUserConsentForApp( + const std::string& device_id, + const std::string& policy_app_id, + std::vector<FunctionalGroupPermission>& permissions); + virtual void SetUserConsentForDevice(const std::string& device_id, + const bool is_allowed); + virtual bool ReactOnUserDevConsentForApp(const std::string& app_id, + const bool is_device_allowed); + virtual bool GetInitialAppData(const std::string& application_id, + StringArray* nicknames = NULL, + StringArray* app_hmi_types = NULL); + + virtual void AddDevice(const std::string& device_id, + const std::string& connection_type); + + virtual void SetDeviceInfo(const std::string& device_id, + const DeviceInfo& device_info); + + virtual void SetUserConsentForApp(const PermissionConsent& permissions); + + virtual bool GetDefaultHmi(const std::string& policy_app_id, + std::string* default_hmi) const; + + virtual bool GetPriority(const std::string& policy_app_id, + std::string* priority) const; + + virtual std::vector<UserFriendlyMessage> GetUserFriendlyMessages( + const std::vector<std::string>& message_code, + const std::string& language, + const std::string& active_hmi_language); + + virtual bool IsApplicationRevoked(const std::string& app_id) const; + + virtual void GetPermissionsForApp( + const std::string& device_id, + const std::string& policy_app_id, + std::vector<FunctionalGroupPermission>& permissions); + + virtual std::string& GetCurrentDeviceId( + const std::string& policy_app_id) const; + + virtual void SetSystemLanguage(const std::string& language); + + virtual void SetSystemInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language); + virtual void OnSystemReady(); + + virtual uint32_t GetNotificationsNumber( + const std::string& priority) const OVERRIDE; + + virtual void SetVINValue(const std::string& value); + + // Interface StatisticsManager (begin) + virtual void Increment(usage_statistics::GlobalCounterId type); + virtual void Increment(const std::string& app_id, + usage_statistics::AppCounterId type); + virtual void Set(const std::string& app_id, + usage_statistics::AppInfoId type, + const std::string& value); + virtual void Add(const std::string& app_id, + usage_statistics::AppStopwatchId type, + int32_t timespan_seconds); + // Interface StatisticsManager (end) + + AppPermissions GetAppPermissionsChanges(const std::string& policy_app_id); + void RemovePendingPermissionChanges(const std::string& app_id); + + void SendNotificationOnPermissionsUpdated(const std::string& application_id); + + bool CleanupUnpairedDevices(); + + bool CanAppKeepContext(const std::string& app_id) const; + bool CanAppStealFocus(const std::string& app_id) const; + void MarkUnpairedDevice(const std::string& device_id); + + StatusNotifier AddApplication(const std::string& application_id); + + virtual void RemoveAppConsentForGroup(const std::string& app_id, + const std::string& group_name); + + virtual uint32_t HeartBeatTimeout(const std::string& app_id) const; + + virtual void SaveUpdateStatusRequired(bool is_update_needed); + + virtual bool IsPredataPolicy(const std::string& policy_app_id) const OVERRIDE; + void set_cache_manager(CacheManagerInterface* cache_manager); + + virtual void OnAppsSearchStarted(); + + virtual void OnAppsSearchCompleted(); + +#ifdef BUILD_TESTS + inline CacheManagerInterfaceSPtr GetCache() { + return cache_; + } +#endif // BUILD_TESTS + + virtual const std::vector<std::string> GetAppRequestTypes( + const std::string policy_app_id) const; + + virtual const VehicleInfo GetVehicleInfo() const; + + virtual void OnAppRegisteredOnMobile(const std::string& application_id); + + virtual const MetaInfo GetMetaInfo() const OVERRIDE; + + virtual std::string RetrieveCertificate() const OVERRIDE; + + virtual bool HasCertificate() const OVERRIDE; + + virtual void SetDecryptedCertificate(const std::string& certificate) OVERRIDE; + + const PolicySettings& get_settings() const OVERRIDE; + + protected: + virtual utils::SharedPtr<policy_table::Table> Parse( + const BinaryMessage& pt_content); + + private: + void CheckTriggers(); + /* + * @brief Checks policy table update along with current data for any changes + * in assigned functional group list of application + * + * @param Policy table update struct + */ + void CheckPermissionsChanges( + const utils::SharedPtr<policy_table::Table> update, + const utils::SharedPtr<policy_table::Table> snapshot); + + /** + * @brief Fill structure to be sent with OnPermissionsChanged notification + * + * @param Policy table struct, which contains rpc functional groups data + * @param List of rpc functional group names, which should be checked + * @param group_permission User permissions for functional groups + * @param Notification struct to be filled and sent + */ + void PrepareNotificationData( + const policy_table::FunctionalGroupings& groups, + const policy_table::Strings& group_names, + const std::vector<FunctionalGroupPermission>& group_permission, + Permissions& notification_data); + + /** + * @brief Validate PermissionConsent structure according to currently + * assigned groups + * @param permissions PermissionConsent structure that should be validated. + * @return PermissonConsent struct, which contains no foreign groups + */ + PermissionConsent EnsureCorrectPermissionConsent( + const PermissionConsent& permissions_to_check); + + /** + * @brief Allows to process case when added application is not present in + * policy db. + * @param policy application id. + * @param cuuren consent for application's device. + */ + void AddNewApplication(const std::string& application_id, + DeviceConsent device_consent); + + /** + * @brief Allows to process case when added application is already + * in policy db. + * @param policy application id. + * @param cuuren consent for application's device. + */ + void PromoteExistedApplication(const std::string& application_id, + DeviceConsent device_consent); + + /** + * @brief Check if certain application already in policy db. + * @param policy application id. + * @return true if application presents false otherwise. + */ + bool IsNewApplication(const std::string& application_id) const; + + /** + * Checks existing and permissions of AppStorageFolder + * @return true if AppStorageFolder exists and has permissions read/write + */ + bool CheckAppStorageFolder() const; + + /** + * @brief Checks whether need ask the permission of users + * @return true if user consent is needed + */ + virtual bool IsConsentNeeded(const std::string& app_id); + + /** + * @brief Changes isConsentNeeded for app pending permissions, in case + * user set permissions before app activation. + * @param Unique app id + * @param Current permissions for app + */ + void CheckPendingPermissionsChanges( + const std::string& policy_app_id, + const std::vector<FunctionalGroupPermission>& current_permissions); + + virtual void StartPTExchange(); + virtual bool ExceededDays(); + virtual bool ExceededIgnitionCycles(); + bool IsPTValid(utils::SharedPtr<policy_table::Table> policy_table, + policy_table::PolicyTableType type) const; + + PolicyListener* listener_; + + UpdateStatusManager update_status_manager_; + CacheManagerInterfaceSPtr cache_; + sync_primitives::Lock apps_registration_lock_; + sync_primitives::Lock app_permissions_diff_lock_; + std::map<std::string, AppPermissions> app_permissions_diff_; + + /** + * Timeout to wait response with UpdatePT + */ + int retry_sequence_timeout_; + + /** + * Seconds between retries to update PT + */ + std::vector<int> retry_sequence_seconds_; + + /** + * Current index trying of retry sequence + */ + uint32_t retry_sequence_index_; + + /** + * Lock for guarding retry sequence + */ + sync_primitives::Lock retry_sequence_lock_; + + /** + * @brief Device id, which is used during PTU handling for specific + * application + */ + mutable std::string last_device_id_; + + bool ignition_check; + + const PolicySettings* settings_; + friend struct CheckAppPolicy; +}; + +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_MANAGER_IMPL_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_table.h b/src/components/policy/policy_external/include/policy/policy_table.h new file mode 100644 index 0000000000..ecbd56c2e4 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_table.h @@ -0,0 +1,62 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_H_ + +#include "utils/shared_ptr.h" +#include "policy/pt_representation.h" +#include "policy/pt_ext_representation.h" + +namespace policy { + +class PolicyTable { + public: + PolicyTable(); + explicit PolicyTable(utils::SharedPtr<PTRepresentation> pt_data); + virtual ~PolicyTable(); + + /** + * @brief Returns current implementation of + * actual class storing policy table. + * @return PTRepresentation* Policy Table Content Handler + */ + utils::SharedPtr<PTRepresentation> pt_data() const { + return pt_data_; + } + + private: + utils::SharedPtr<PTRepresentation> pt_data_; +}; +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_table/enums.h b/src/components/policy/policy_external/include/policy/policy_table/enums.h new file mode 100644 index 0000000000..9dceeb1c4a --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_table/enums.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_ENUMS_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_ENUMS_H_ + +#include <string> + +namespace rpc { +namespace policy_table_interface_base { + +enum Priority { + P_EMERGENCY, + P_NAVIGATION, + P_VOICECOM, + P_COMMUNICATION, + P_NORMAL, + P_NONE, +}; +bool IsValidEnum(Priority val); +const char* EnumToJsonString(Priority val); +bool EnumFromJsonString(const std::string& literal, Priority* result); + +enum HmiLevel { + HL_BACKGROUND, + HL_FULL, + HL_LIMITED, + HL_NONE, +}; +bool IsValidEnum(HmiLevel val); +const char* EnumToJsonString(HmiLevel val); +bool EnumFromJsonString(const std::string& literal, HmiLevel* result); + +enum Parameter { + P_GPS, + P_SPEED, + P_ENGINETORQUE, + P_EXTERNALTEMPERATURE, + P_FUELLEVEL, + P_FUELLEVEL_STATE, + P_HEADLAMPSTATUS, + P_INSTANTFUELCONSUMPTION, + P_ODOMETER, + P_TIREPRESSURE, + P_WIPERSTATUS, + P_VIN, + P_ACCPEDALPOSITION, + P_BELTSTATUS, + P_DRIVERBRAKING, + P_PRNDL, + P_RPM, + P_STEERINGWHEELANGLE, + P_MYKEY, + P_AIRBAGSTATUS, + P_BODYINFORMATION, + P_CLUSTERMODESTATUS, + P_DEVICESTATUS, + P_EMERGENCYEVENT, + P_ECALLINFO, + P_ABS_STATE, + P_TURN_SIGNAL, + P_FUEL_RANGE, + P_TIRE_PRESSURE_VALUE, + P_TPMS, + P_LONGTITUDE_DEGREES, + P_LATITUDE_DEGREES, + P_LOCATION_NAME, + P_LOCATION_DESCRIPTION, + P_ADDRESS_LINES, + P_PHONE_NUMBER, + P_LOCATION_IMAGE, + P_DELIVERY_MODE, + P_TIMESTAMP, + P_ADDRESS, + P_EMPTY // Added to allow empty parameters handling +}; + +bool IsValidEnum(Parameter val); +const char* EnumToJsonString(Parameter val); +bool EnumFromJsonString(const std::string& literal, Parameter* result); + +enum AppHMIType { + AHT_DEFAULT, + AHT_COMMUNICATION, + AHT_MEDIA, + AHT_MESSAGING, + AHT_NAVIGATION, + AHT_INFORMATION, + AHT_SOCIAL, + AHT_BACKGROUND_PROCESS, + AHT_TESTING, + AHT_SYSTEM +}; +bool IsValidEnum(AppHMIType val); +const char* EnumToJsonString(AppHMIType val); +bool EnumFromJsonString(const std::string& literal, AppHMIType* result); + +enum Input { + I_GUI, + I_VUI, +}; +bool IsValidEnum(Input val); +const char* EnumToJsonString(Input val); +bool EnumFromJsonString(const std::string& literal, Input* result); + +enum RequestType { + RT_HTTP, + RT_FILE_RESUME, + RT_AUTH_REQUEST, + RT_AUTH_CHALLENGE, + RT_AUTH_ACK, + RT_PROPRIETARY, + RT_QUERY_APPS, + RT_LAUNCH_APP, + RT_LOCK_SCREEN_ICON_URL, + RT_TRAFFIC_MESSAGE_CHANNEL, + RT_DRIVER_PROFILE, + RT_VOICE_SEARCH, + RT_NAVIGATION, + RT_PHONE, + RT_CLIMATE, + RT_SETTINGS, + RT_VEHICLE_DIAGNOSTICS, + RT_EMERGENCY, + RT_MEDIA, + RT_FOTA +}; +bool IsValidEnum(RequestType val); +const char* EnumToJsonString(RequestType val); +bool EnumFromJsonString(const std::string& literal, RequestType* result); + +extern const std::string kDefaultApp; +extern const std::string kPreDataConsentApp; +extern const std::string kDeviceApp; + +} // namespace policy_table_interface_base +} // namespace rpc + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_ENUMS_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_table/functions.h b/src/components/policy/policy_external/include/policy/policy_table/functions.h new file mode 100644 index 0000000000..07d4a42a25 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_table/functions.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_FUNCTIONS_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_FUNCTIONS_H_ + +#include "policy/policy_table/enums.h" +#include "policy/policy_table/types.h" + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_FUNCTIONS_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_table/types.h b/src/components/policy/policy_external/include/policy/policy_table/types.h new file mode 100644 index 0000000000..8ca91c310a --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_table/types.h @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_TYPES_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TABLE_TYPES_H_ + +#include <climits> +#include "utils/macro.h" + +#include "policy/policy_table/enums.h" +#include "rpc_base/rpc_message.h" +namespace Json { +class Value; +} // namespace Json +namespace rpc { +namespace policy_table_interface_base { +struct AppLevel; +struct ApplicationParams; +struct ConsentRecords; +struct DeviceParams; +struct MessageLanguages; +struct MessageString; +struct RpcParameters; +struct Rpcs; +} // namespace policy_table_interface_base +} // namespace rpc + +namespace rpc { +namespace policy_table_interface_base { + +// According to HMI API +#define ODO_MAX 17000000 + +typedef Array<String<1, 255>, 0, 255> Strings; + +typedef Array<Enum<AppHMIType>, 0, 255> AppHMITypes; + +typedef Array<Enum<HmiLevel>, 0, 4> HmiLevels; + +typedef Array<Enum<Parameter>, 0, 100> Parameters; + +typedef Map<RpcParameters, 0, 50> Rpc; + +typedef Array<String<10, 65535>, 1, 3> URL; + +typedef Map<URL, 1, 255> URLList; + +typedef Map<URLList, 1, 255> ServiceEndpoints; + +typedef uint8_t NumberOfNotificationsType; +typedef Map<Integer<NumberOfNotificationsType, 0, 255>, 0, 6> + NumberOfNotificationsPerMinute; + +typedef Array<Integer<uint16_t, 1, 1000>, 0, 10> SecondsBetweenRetries; + +typedef Map<MessageString, 0, 600> Languages; + +typedef Map<MessageLanguages, 0, 255> Messages; + +typedef Map<AppLevel, 0, 255> AppLevels; + +typedef Map<Boolean, 0, 255> ConsentGroups; + +typedef Map<ConsentRecords, 0, 1000> UserConsentRecords; + +typedef Map<Stringifyable<Nullable<ApplicationParams> >, 1, 1000> + ApplicationPolicies; + +typedef Map<Rpcs, 1, 255> FunctionalGroupings; + +typedef Map<DeviceParams, 0, 255> DeviceData; + +typedef Array<Enum<RequestType>, 0, 255> RequestsTypeArray; + +struct RequestTypes : public RequestsTypeArray { + RequestTypes(); + explicit RequestTypes(Json::Value* value); + explicit RequestTypes(const Json::Value* value); + + void CleanUp(); + + bool is_valid() const OVERRIDE; + bool is_omitted() const; + bool is_empty() const; + bool is_cleaned_up() const; + + private: + bool is_cleaned_up_; +}; + +struct PolicyBase : CompositeType { + public: + Strings groups; + Optional<Strings> preconsented_groups; + Enum<Priority> priority; + Enum<HmiLevel> default_hmi; + Boolean keep_context; + Boolean steal_focus; + + public: + PolicyBase(); + PolicyBase(const Strings& groups, + Priority priority, + HmiLevel default_hmi, + bool keep_context, + bool steal_focus); + virtual ~PolicyBase(); + explicit PolicyBase(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct DevicePolicy : PolicyBase { + public: + DevicePolicy(); + DevicePolicy(const Strings& groups, + Priority priority, + HmiLevel default_hmi, + bool keep_context, + bool steal_focus); + ~DevicePolicy(); + explicit DevicePolicy(const Json::Value* value__); +}; + +struct ApplicationParams : PolicyBase { + public: + Optional<Strings> nicknames; + Optional<AppHMITypes> AppHMIType; + Optional<RequestTypes> RequestType; + Optional<Integer<uint16_t, 0, 65225> > memory_kb; + Optional<Integer<uint32_t, 0, UINT_MAX> > heart_beat_timeout_ms; + + public: + ApplicationParams(); + ApplicationParams(const Strings& groups, + Priority priority, + HmiLevel default_hmi, + bool keep_context, + bool steal_focus); + ~ApplicationParams(); + explicit ApplicationParams(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct ApplicationPoliciesSection : CompositeType { + public: + mutable ApplicationPolicies apps; + DevicePolicy device; + + public: + ApplicationPoliciesSection(); + ApplicationPoliciesSection(const ApplicationPolicies& apps, + const DevicePolicy& device); + ~ApplicationPoliciesSection(); + explicit ApplicationPoliciesSection(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct RpcParameters : CompositeType { + public: + HmiLevels hmi_levels; + Optional<Parameters> parameters; + + public: + RpcParameters(); + explicit RpcParameters(const HmiLevels& hmi_levels); + ~RpcParameters(); + explicit RpcParameters(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct Rpcs : CompositeType { + public: + Optional<String<1, 255> > user_consent_prompt; + Nullable<Rpc> rpcs; + + public: + Rpcs(); + explicit Rpcs(const Rpc& rpcs); + ~Rpcs(); + explicit Rpcs(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct ModuleConfig : CompositeType { + public: + Integer<uint8_t, 0, 255> exchange_after_x_ignition_cycles; + Integer<int64_t, 0, 4294967296ll> exchange_after_x_kilometers; + Integer<uint8_t, 0, 255> exchange_after_x_days; + Integer<uint16_t, 0, 65535> timeout_after_x_seconds; + SecondsBetweenRetries seconds_between_retries; + ServiceEndpoints endpoints; + NumberOfNotificationsPerMinute notifications_per_minute_by_priority; + Optional<String<0, 100> > vehicle_make; + Optional<String<0, 100> > vehicle_model; + Optional<String<0, 4> > vehicle_year; + Optional<String<0, 10> > preloaded_date; + Optional<String<0, 65535> > certificate; + Optional<Boolean> preloaded_pt; + + public: + ModuleConfig(); + ModuleConfig(uint8_t exchange_after_x_ignition_cycles, + int64_t exchange_after_x_kilometers, + uint8_t exchange_after_x_days, + uint16_t timeout_after_x_seconds, + const SecondsBetweenRetries& seconds_between_retries, + const ServiceEndpoints& endpoints, + const NumberOfNotificationsPerMinute& + notifications_per_minute_by_priority); + ~ModuleConfig(); + explicit ModuleConfig(const Json::Value* value__); + void SafeCopyFrom(const ModuleConfig& from); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct MessageString : CompositeType { + public: + Optional<String<1, 65535> > line1; + Optional<String<1, 65535> > line2; + Optional<String<1, 65535> > tts; + Optional<String<1, 65535> > label; + Optional<String<1, 65535> > textBody; + + public: + MessageString(); + ~MessageString(); + explicit MessageString(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct MessageLanguages : CompositeType { + public: + Languages languages; + + public: + MessageLanguages(); + explicit MessageLanguages(const Languages& languages); + ~MessageLanguages(); + explicit MessageLanguages(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; + static const std::string kMandatoryLanguage_; +}; + +struct ConsumerFriendlyMessages : CompositeType { + public: + String<1, 100> version; + Optional<Messages> messages; + + public: + ConsumerFriendlyMessages(); + explicit ConsumerFriendlyMessages(const std::string& version); + ~ConsumerFriendlyMessages(); + explicit ConsumerFriendlyMessages(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct ModuleMeta : CompositeType { + public: + Optional<String<0, 250> > ccpu_version; + Optional<String<0, 250> > language; + Optional<String<0, 250> > wers_country_code; + Optional<Integer<uint32_t, 0, ODO_MAX> > pt_exchanged_at_odometer_x; + Optional<Integer<uint16_t, 0, 65535> > pt_exchanged_x_days_after_epoch; + Optional<Integer<uint16_t, 0, 65535> > ignition_cycles_since_last_exchange; + Optional<String<0, 250> > vin; + + public: + ModuleMeta(); + ~ModuleMeta(); + explicit ModuleMeta(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct AppLevel : CompositeType { + public: + Integer<uint16_t, 0, 65535> minutes_in_hmi_full; + String<1, 10> app_registration_language_gui; + String<0, 10> app_registration_language_vui; + Integer<uint16_t, 0, 65535> minutes_in_hmi_limited; + Integer<uint16_t, 0, 65535> minutes_in_hmi_background; + Integer<uint16_t, 0, 65535> minutes_in_hmi_none; + Integer<uint16_t, 0, 65535> count_of_user_selections; + Integer<uint16_t, 0, 65535> count_of_rejections_sync_out_of_memory; + Integer<uint16_t, 0, 65535> count_of_rejections_nickname_mismatch; + Integer<uint16_t, 0, 65535> count_of_rejections_duplicate_name; + Integer<uint16_t, 0, 65535> count_of_rejected_rpc_calls; + Integer<uint16_t, 0, 65535> count_of_rpcs_sent_in_hmi_none; + Integer<uint16_t, 0, 65535> count_of_removals_for_bad_behavior; + Integer<uint16_t, 0, 65535> count_of_tls_errors; + Integer<uint16_t, 0, 65535> count_of_run_attempts_while_revoked; + + public: + AppLevel(); + AppLevel(uint16_t minutes_in_hmi_full, + const std::string& app_registration_language_gui, + const std::string& app_registration_language_vui, + uint16_t minutes_in_hmi_limited, + uint16_t minutes_in_hmi_background, + uint16_t minutes_in_hmi_none, + uint16_t count_of_user_selections, + uint16_t count_of_rejections_sync_out_of_memory, + uint16_t count_of_rejections_nickname_mismatch, + uint16_t count_of_rejections_duplicate_name, + uint16_t count_of_rejected_rpc_calls, + uint16_t count_of_rpcs_sent_in_hmi_none, + uint16_t count_of_removals_for_bad_behavior, + uint16_t count_of_tls_errors, + uint16_t count_of_run_attempts_while_revoked); + ~AppLevel(); + explicit AppLevel(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct UsageAndErrorCounts : CompositeType { + public: + Optional<Integer<uint16_t, 0, 65535> > count_of_iap_buffer_full; + Optional<Integer<uint16_t, 0, 65535> > count_sync_out_of_memory; + Optional<Integer<uint16_t, 0, 65535> > count_of_sync_reboots; + Optional<AppLevels> app_level; + + public: + UsageAndErrorCounts(); + ~UsageAndErrorCounts(); + explicit UsageAndErrorCounts(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct ConsentRecords : CompositeType { + public: + Optional<ConsentGroups> consent_groups; + Optional<Enum<Input> > input; + Optional<String<1, 255> > time_stamp; + + public: + ConsentRecords(); + ~ConsentRecords(); + explicit ConsentRecords(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct DeviceParams : CompositeType { + public: + Optional<String<0, 255> > hardware; + Optional<Nullable<String<0, 255> > > firmware_rev; + Optional<String<0, 255> > os; + Optional<String<0, 255> > os_version; + Optional<Nullable<String<0, 255> > > carrier; + Optional<UserConsentRecords> user_consent_records; + Optional<Integer<uint8_t, 0, 255> > max_number_rfcom_ports; + Optional<String<0, 255> > connection_type; + + public: + DeviceParams(); + ~DeviceParams(); + explicit DeviceParams(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct PolicyTable : CompositeType { + public: + ApplicationPoliciesSection app_policies_section; + FunctionalGroupings functional_groupings; + Optional<ConsumerFriendlyMessages> consumer_friendly_messages; + ModuleConfig module_config; + Optional<ModuleMeta> module_meta; + Optional<UsageAndErrorCounts> usage_and_error_counts; + Optional<DeviceData> device_data; + + public: + PolicyTable(); + PolicyTable(const ApplicationPoliciesSection& app_policies_section, + const FunctionalGroupings& functional_groupings, + const ConsumerFriendlyMessages& consumer_friendly_messages, + const ModuleConfig& module_config); + ~PolicyTable(); + explicit PolicyTable(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; + +struct Table : CompositeType { + public: + PolicyTable policy_table; + + public: + Table(); + explicit Table(const PolicyTable& policy_table); + ~Table(); + explicit Table(const Json::Value* value__); + Json::Value ToJsonValue() const; + bool is_valid() const; + bool is_initialized() const; + bool struct_empty() const; + void ReportErrors(rpc::ValidationReport* report__) const; + virtual void SetPolicyTableType(PolicyTableType pt_type); + + private: + bool Validate() const; +}; +} // namespace policy_table_interface_base +} // namespace rpc + +#endif // SRC_COMPONENTS_POLICY_INCLUDE_POLICY_POLICY_TABLE_TYPES_H_ diff --git a/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml new file mode 100644 index 0000000000..91518f8f6e --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_table_interface_ext.xml @@ -0,0 +1,284 @@ +<?xml version="1.0" standalone="no"?> +<?xml-stylesheet type="text/xml" href="protocol2html.xsl"?> + +<interface name="policy table interface base" version="0.0" + date="2014-01-23"> + + <!-- Common parameters start --> + <enum name="Priority"> + <element name="EMERGENCY" /> + <element name="NAVIGATION" /> + <element name="VOICECOM" /> + <element name="COMMUNICATION" /> + <element name="NORMAL" /> + <element name="NONE" /> + </enum> + + <enum name="HmiLevel"> + <element name="BACKGROUND" /> + <element name="FULL" /> + <element name="LIMITED" /> + <element name="NONE" /> + </enum> + + <enum name="Parameter"> + <element name="gps" /> + <element name="speed" /> + <element name="engineTorque" /> + <element name="externalTemperature" /> + <element name="fuelLevel" /> + <element name="fuelLevel_State" /> + <element name="headLampStatus" /> + <element name="instantFuelConsumption" /> + <element name="odometer" /> + <element name="tirePressure" /> + <element name="wiperStatus" /> + <element name="vin" /> + <element name="accPedalPosition" /> + <element name="beltStatus" /> + <element name="driverBraking" /> + <element name="prndl" /> + <element name="rpm" /> + <element name="steeringWheelAngle" /> + <element name="myKey" /> + <element name="airbagStatus" /> + <element name="bodyInformation" /> + <element name="clusterModeStatus" /> + <element name="deviceStatus" /> + <element name="emergencyEvent" /> + <element name="eCallInfo" /> + <element name="abs_State" /> + <element name="turnSignal" /> + <element name="fuelRange" /> + <element name="tirePressureValue" /> + <element name="tpms" /> + </enum> + + <enum name="AppHMIType"> + <element name="DEFAULT" /> + <element name="COMMUNICATION" /> + <element name="MEDIA" /> + <element name="MESSAGING" /> + <element name="NAVIGATION" /> + <element name="INFORMATION" /> + <element name="SOCIAL" /> + <element name="BACKGROUND_PROCESS" /> + <element name="TESTING" /> + <element name="SYSTEM" /> + </enum> + <!-- Common parameters end --> + + <!-- app_policies section start --> + + <typedef name="Strings" type="String" maxlength="255" array="true" + maxsize="255" /> + + <typedef name="AppHMITypes" type="AppHMIType" array="true" + maxsize="255" /> + + <struct name="ApplicationParams"> + <param name="groups" type="Strings" /> + <param name="nicknames" type="Strings" mandatory="false" /> + <param name="preconsented_groups" type="Strings" mandatory="false" /> + <param name="AppHMIType" type="AppHMITypes" mandatory="false" /> + <param name="priority" type="Priority" /> + <param name="default_hmi" type="HmiLevel" /> + <param name="keep_context" type="Boolean" /> + <param name="steal_focus" type="Boolean" /> + <param name="memory_kb" type="Integer" minvalue="1" maxvalue="65225" mandatory="false"/> + <param name="watchdog_timer_ms" type="Integer" minvalue="1" + maxvalue="65225" mandatory="false"/> + <param name="certificate" type="String" minlength="0" maxlength="255" + mandatory="false" /> + </struct> + + <typedef name="HmiLevels" type="HmiLevel" array="true" + maxsize="4" /> + <typedef name="Parameters" type="Parameter" array="true" + maxsize="24" /> + + <struct name="RpcParameters"> + <!-- maxsizes are equal to number of currently known elements of + given type --> + <param name="hmi_levels" type="HmiLevels" /> + <param name="parameters" type="Parameters" mandatory="false" /> + </struct> + + <!-- maxsizes are equal to number of currently known elements of given + type --> + <typedef name="Rpc" type="RpcParameters" map="true" maxsize="50" null_values_allowed="true" /> + + <struct name="Rpcs"> + <param name="user_consent_prompt" type="String" minlegth="1" + maxlength="255" mandatory="false"/> + <param name="rpcs" type="Rpc" null_values_allowed="true"/> + </struct> + <!-- app_policies section end --> + + <!-- module_config section start --> + <!-- minlenght="10" since minimum expected is "http://a.b" --> + <typedef name="URL" type="String" minlength="10" maxlength="255" + array="true" minsize="1" maxsize="255" /> + + <typedef name="URLList" type="URL" map="true" minsize="1" + maxsize="255" /> + + <!-- max number of services is limited to 255 according to protocol specification --> + <typedef name="ServiceEndpoints" type="URLList" map="true" + minsize="1" maxsize="255" /> + + <typedef name="NumberOfNotificationsPerMinute" type="Integer" + map="true" maxsize="6" minvalue="0" maxvalue="255" /> + + <typedef name="SecondsBetweenRetries" type="Integer" array="true" + maxsize="10" minvalue="1" maxvalue="1000" /> + + <struct name="ModuleConfig"> + <param name="device_certificates" type="String" minlength="1" maxlength="100" mandatory="false" map="true" minsize="1" maxsize="255" /> + <param name="preloaded_pt" type="Boolean" mandatory="false" /> + <param name="exchange_after_x_ignition_cycles" type="Integer" + maxvalue="255" /> + <param name="exchange_after_x_kilometers" type="Integer" + maxvalue="4294967296" /> + <param name="exchange_after_x_days" type="Integer" + maxvalue="255" /> + <param name="timeout_after_x_seconds" type="Integer" + maxvalue="65535" /> + <param name="seconds_between_retries" type="SecondsBetweenRetries" /> + <param name="endpoints" type="ServiceEndpoints" /> + <param name="notifications_per_minute_by_priority" type="NumberOfNotificationsPerMinute" /> + <param name="vehicle_make" type="String" maxlength="100" + mandatory="false" /> + <param name="vehicle_model" type="String" maxlength="100" + mandatory="false" /> + <param name="vehicle_year" type="String" minlength="4" maxlength="4" + mandatory="false" /> + </struct> + <!-- module_config section end --> + + <!-- consumer_friendly_messages section start --> + <struct name="MessageString"> + <param name="line1" type="String" maxlength="255" + mandatory="false" /> + <param name="line2" type="String" maxlength="255" + mandatory="false" /> + <param name="tts" type="String" maxlength="65535" mandatory="false" /> + <param name="label" type="String" maxlength="255" + mandatory="false" /> + <param name="textBody" type="String" maxlength="500" + mandatory="false" /> + </struct> + + <typedef name="Languages" map="true" type="MessageString" + maxsize="500" mandatory="false" /> + + <struct name="MessageLanguages"> + <param name="languages" type="Languages" /> + </struct> + + <typedef name="Messages" map="true" type="MessageLanguages" + maxsize="255" /> + + <struct name="ConsumerFriendlyMessages"> + <param name="version" type="String" maxlength="100" /> + <param name="messages" type="Messages" mandatory="false" /> + </struct> + <!-- consumer_friendly_messages section end --> + + <!-- module_meta section start --> + <struct name="ModuleMeta"> + <param name="ccpu_version" type="String" maxlength="250" mandatory="false"/> + <param name="language" type="String" maxlength="250" mandatory="false"/> + <param name="wers_country_code" type="String" maxlength="250" mandatory="false"/> + <param name="pt_exchanged_at_odometer_x" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/> + <param name="pt_exchanged_x_days_after_epoch" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/> + <param name="ignition_cycles_since_last_exchange" type="Integer" minvalue="0" maxvalue="65535" mandatory="false"/> + <param name="vin" type="String" maxlength="250" mandatory="false"/> + </struct> + <!-- module_meta section end --> + + <!-- usage_and_error_counts section start --> + <struct name="AppLevel"> + <param name="minutes_in_hmi_full" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="app_registration_language_gui" type="String" minlength="1" maxlength="10" /> + <param name="app_registration_language_vui" type="String" minlength="1" maxlength="10" /> + <param name="count_of_rfcom_limit_reached" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="minutes_in_hmi_limited" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="minutes_in_hmi_background" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="minutes_in_hmi_none" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_user_selections" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_rejections_sync_out_of_memory" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_rejections_nickname_mismatch" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_rejections_duplicate_name" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_rejected_rpc_calls" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_rpcs_sent_in_hmi_none" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_removals_for_bad_behavior" type="Integer" minvalue="0" maxvalue="65535" /> + <param name="count_of_run_attempts_while_revoked" type="Integer" minvalue="0" maxvalue="65535" /> + </struct> + + <typedef name="AppLevels" type="AppLevel" map="true" + maxsize="255" /> + + <struct name="UsageAndErrorCounts"> + <param name="count_of_iap_buffer_full" type="Integer" minvalue="0" maxvalue="65535" mandatory="false" /> + <param name="count_sync_out_of_memory" type="Integer" minvalue="0" maxvalue="65535" mandatory="false" /> + <param name="count_of_sync_reboots" type="Integer" minvalue="0" maxvalue="65535" mandatory="false" /> + <param name="app_level" type="AppLevels" mandatory="false" /> + </struct> + <!-- usage_and_error_counts section end --> + + <!-- device_data section start --> + <enum name="Input" scope="internal"> + <element name="GUI" /> + <element name="VUI" /> + </enum> + + <typedef name="ConsentGroups" scope="internal" type="Boolean" map="true" maxsize="255" mandatory="false"/> + + <struct name="ConsentRecords" scope="internal"> + <param name="consent_groups" type="ConsentGroups" mandatory="false"/> + <param name="input" type="Input" mandatory="false" /> + <param name="time_stamp" type="String" maxlength="255" mandatory="false" /> + </struct> + + <typedef name="UserConsentRecords" scope="internal" map="true" type="ConsentRecords" minsize="0" maxsize="1000"/> + + <struct name="DeviceParams" scope="internal"> + <param name="hardware" type="String" maxlength="255" mandatory="false"/> + <param name="firmware_rev" type="String" maxlength="255" nullable="true" mandatory="false"/> + <param name="os" type="String" maxlength="255" mandatory="false"/> + <param name="os_version" type="String" maxlength="255" mandatory="false"/> + <param name="carrier" type="String" maxlength="255" nullable="true" mandatory="false"/> + <param name="user_consent_records" type="UserConsentRecords" mandatory="false"/> + <param name="max_number_rfcom_ports" type="Integer" maxvalue="255" mandatory="false"/> + </struct> + <!-- device_data section end --> + + <!-- policy_table section start --> + <typedef name="ApplicationPolicies" map="true" type="ApplicationParams" + null_values_allowed="true" minsize="1" maxsize="1000" /> + + <typedef name="FunctionalGroupings" map="true" type="Rpcs" + minsize="1" maxsize="255" /> + + <typedef name="DeviceData" map="true" type="DeviceParams" + maxsize="255" /> + + <struct name="PolicyTable"> + <!-- maxsize for app_policies can be changed, if necessary --> + <param name="app_policies" type="ApplicationPolicies" /> + <param name="functional_groupings" type="FunctionalGroupings" /> + <param name="consumer_friendly_messages" type="ConsumerFriendlyMessages" /> + <param name="module_config" type="ModuleConfig" /> + <param name="module_meta" type="ModuleMeta" mandatory="false"/> + <param name="usage_and_error_counts" type="UsageAndErrorCounts" mandatory="false" /> + <param name="device_data" type="DeviceData" mandatory="false" /> + </struct> + <!-- policy_table section end --> + + <!-- Root element --> + <struct name="Table"> + <param name="policy_table" type="PolicyTable" /> + </struct> + +</interface> diff --git a/src/components/policy/policy_external/include/policy/policy_types.h b/src/components/policy/policy_external/include/policy/policy_types.h new file mode 100644 index 0000000000..e0f7d89ae9 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/policy_types.h @@ -0,0 +1,369 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TYPES_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TYPES_H_ + +#include <algorithm> +#include <string> +#include <vector> +#include <map> +#include <set> +#include "utils/shared_ptr.h" +#include "utils/helpers.h" +namespace policy { + +// TODO(PV): specify errors +enum PolicyErrorEnum {}; + +const std::string kDefaultDeviceMacAddress = "00:00:00:00:00:00"; +const std::string kDefaultDeviceName = "MyDevice"; +const std::string kDefaultDeviceConnectionType = "UNKNOWN"; + +/** + * @brief Constants for special ids in application policies section of + * policy table + */ +const std::string kPreDataConsentId = "pre_DataConsent"; +const std::string kDefaultId = "default"; +const std::string kDeviceId = "device"; + +/* + *@brief Policy Services specifies Users of Updates + * received from cloud through mobile device + */ +enum PolicyServiceTypes { SERVICE_NONE = 0, IVSU = 0x04, POLICY = 0x07 }; + +/* + * @brief Status of policy table update + */ +enum PolicyTableStatus { + StatusUpToDate = 0, + StatusUpdatePending, + StatusUpdateRequired, + StatusUnknown +}; + +// Code generator uses String class name, so this typedef was renamed to PTSring +typedef std::string PTString; +typedef std::vector<uint8_t> BinaryMessage; +typedef utils::SharedPtr<BinaryMessage> BinaryMessageSptr; + +typedef std::string HMILevel; +typedef std::string Parameter; +typedef std::string RpcName; +typedef std::set<std::string> RPCParams; + +typedef std::map<std::string, std::set<policy::HMILevel> > HMIPermissions; +struct ParameterPermissions + : std::map<std::string, std::set<policy::Parameter> > { + ParameterPermissions() + : any_parameter_allowed(false) + , any_parameter_disallowed_by_user(false) + , any_parameter_disallowed_by_policy(false) {} + bool any_parameter_allowed; + bool any_parameter_disallowed_by_user; + bool any_parameter_disallowed_by_policy; +}; + +struct RpcPermissions { + HMIPermissions hmi_permissions; + ParameterPermissions parameter_permissions; +}; + +typedef std::map<RpcName, RpcPermissions> Permissions; + +/** + * @brief Typedef for use with AllowApp request/notification + */ +typedef std::vector<std::string> PermissionsList; + +/** + * @brief Typedef for getting initial application data, e.g. nickname list + */ +typedef std::vector<std::string> StringArray; + +enum PermitResult { kRpcAllowed = 0, kRpcDisallowed, kRpcUserDisallowed }; + +/** + * @struct Stores result of check: + * if HMI Level was allowed for RPC to work in + * and list of parameters allowed for RPC if specified in PT. + */ +struct CheckPermissionResult { + CheckPermissionResult() : hmi_level_permitted(kRpcDisallowed) {} + + PermitResult hmi_level_permitted; + RPCParams list_of_allowed_params; + RPCParams list_of_disallowed_params; + RPCParams list_of_undefined_params; + + bool HasParameter(const PTString& parameter) { + const bool is_allowed = + helpers::in_range(list_of_allowed_params, parameter); + const bool is_disallowed = + helpers::in_range(list_of_disallowed_params, parameter); + const bool is_undefined = + helpers::in_range(list_of_undefined_params, parameter); + + return is_allowed || is_disallowed || is_undefined; + } + + bool DisallowedInclude(const RPCParams& parameters) { + if (parameters.empty()) { + return false; + } + return std::includes(list_of_disallowed_params.begin(), + list_of_disallowed_params.end(), + parameters.begin(), + parameters.end()); + } + + bool IsAnyAllowed(const RPCParams& parameters) { + if (parameters.empty()) { + return true; + } + return list_of_allowed_params.end() != + std::find_first_of(list_of_allowed_params.begin(), + list_of_allowed_params.end(), + parameters.begin(), + parameters.end()); + } +}; + +/** + @struct Holds Url string and optional policy app id. + */ +struct EndpointData { + explicit EndpointData(const std::string& url_string = "") + : app_id("default") { + if (false == url_string.empty()) { + url.push_back(url_string); + } + } + std::vector<std::string> url; + std::string app_id; +}; + +typedef std::vector<EndpointData> EndpointUrls; + +/** + * @brief Struct contains device data to be used for dialogs, generation of IDs + */ +struct DeviceParams { + DeviceParams() + : device_name(kDefaultDeviceName) + , device_mac_address(kDefaultDeviceMacAddress) + , device_connection_type(kDefaultDeviceConnectionType) + , device_handle(0) {} + + std::string device_name; + std::string device_mac_address; + std::string device_connection_type; + uint32_t device_handle; +}; + +/** + * @brief User consent for device data usage + */ +enum DeviceConsent { + kDeviceAllowed = 0, + kDeviceDisallowed, + kDeviceHasNoConsent +}; + +/** + * @brief Struct contains parameters, which can be received during application + * registration and should be stored in policy table + */ +struct DeviceInfo { + DeviceInfo() : max_number_rfcom_ports(0) {} + + std::string hardware; + std::string firmware_rev; + std::string os; + std::string os_ver; + std::string carrier; + uint32_t max_number_rfcom_ports; + std::string connection_type; + + void AdoptDeviceType(const std::string& deviceType) { + connection_type = "USB_serial_number"; + using namespace helpers; + static const std::string bluetooth("BLUETOOTH"); + static const std::string wifi("WIFI"); + if (Compare<std::string, EQ, ONE>(deviceType, bluetooth, wifi)) { + connection_type.assign("BTMAC"); + } + } +}; + +/** + * @brief User consent for functional group + */ +enum GroupConsent { kGroupAllowed = 0, kGroupDisallowed, kGroupUndefined }; + +/** + * @brief Contains user permission for RPC functional group with specific name + * and id from DB + */ +struct FunctionalGroupPermission { + FunctionalGroupPermission() : group_id(0), state(kGroupUndefined) {} + + bool operator==(const FunctionalGroupPermission& rhs) { + if (this->group_id == rhs.group_id && + this->group_alias == rhs.group_alias && + this->group_name == rhs.group_name) { + return true; + } + return false; + } + + std::string group_alias; + std::string group_name; + int32_t group_id; + GroupConsent state; +}; + +/** + * @brief Stores data to be sent to HMI on application permissions change + */ +struct AppPermissions { + AppPermissions(const std::string& app_id) + : application_id(app_id) + , isAppPermissionsRevoked(false) + , appRevoked(false) + , appPermissionsConsentNeeded(false) + , appUnauthorized(false) + , requestTypeChanged(false) {} + + std::string application_id; + bool isAppPermissionsRevoked; + std::vector<policy::FunctionalGroupPermission> appRevokedPermissions; + bool appRevoked; + bool appPermissionsConsentNeeded; + bool appUnauthorized; + bool isSDLAllowed; + std::string priority; + DeviceParams deviceInfo; + bool requestTypeChanged; + std::vector<std::string> requestType; +}; + +/** + * @brief Contains parameters for user-defined consent for appication + * functional groups on given device + */ +struct PermissionConsent { + std::string device_id; + std::string policy_app_id; + std::vector<FunctionalGroupPermission> group_permissions; + std::string consent_source; +}; + +/** + * @brief Contain data for GetUserFriendyMessage response + */ +struct UserFriendlyMessage { + std::string message_code; + std::string tts; + std::string label; + std::string line1; + std::string line2; + std::string text_body; +}; + +/** + * @brief Types of functional groups in policy table + */ +enum GroupType { + kTypeDefault = 0, // groups assigned to 'default' permissions section + kTypeAllowed, // groups allowed by user for specific application + kTypeDisallowed, // groups disallowed by user for specific application + kTypeUnconsented, // groups disallowed by default but consent may be changed + // by user + kTypePreconsented, // groups allowed for specific application without + // user consent by default (could be changed by user) + kTypeGeneral, // groups assigned to specific application + kTypePreDataConsented, // groups assigned to 'pre_DataConsent' permissions + // section + kTypeDevice // groups assigned to 'device' permissions section +}; + +/** + * @brief Array of functional group id from DB + */ +typedef std::vector<int32_t> FunctionalGroupIDs; + +/** + * @brief Array of functional group ids sorted by types + */ +typedef std::map<GroupType, FunctionalGroupIDs> FunctionalIdType; + +/** + * @brief Array of functional group ids binded to user_consent_prompt (e.g. + * VehicleData) and group name (e.g. VehicleData-4) + */ +typedef std::map<uint32_t, std::pair<std::string, std::string> > + FunctionalGroupNames; + +/** + * @brief Array of device ids, which are an identifiers in policy table + */ +typedef std::vector<std::string> DeviceIds; + +/** + * @brief Counters that calculated on receiving of succesful update + */ +enum Counters { KILOMETERS, DAYS_AFTER_EPOCH }; + +/** + * @struct Vehicle information + */ +struct VehicleInfo { + std::string vehicle_make; + std::string vehicle_model; + std::string vehicle_year; +}; + +/** + * @brief The MetaInfo information + */ +struct MetaInfo { + std::string ccpu_version; + std::string wers_country_code; + std::string language; +}; + +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_POLICY_TYPES_H_ diff --git a/src/components/policy/policy_external/include/policy/pt_ext_representation.h b/src/components/policy/policy_external/include/policy/pt_ext_representation.h new file mode 100644 index 0000000000..ca3d45e946 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/pt_ext_representation.h @@ -0,0 +1,333 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_PT_EXT_REPRESENTATION_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_PT_EXT_REPRESENTATION_H_ + +#include "policy/pt_representation.h" + +namespace policy { + +enum StatisticsType { + S_NONE = 0, + S_IAP_BUFFER_FULL, + S_SYNC_OUT_OF_MEMORY, + S_SYNC_REBOOTS, + S_MINS_HMI_FULL, + S_MINS_HMI_LIMITED, + S_MINS_HMI_BACKGROUND, + S_MINS_HMI_NONE, + S_RFCOM_LIMIT_REACHED, + S_USER_SELECTIONS, + S_REJECTIONS_SYNC_OUT_OF_MEMORY, + S_REJECTIONS_NICKNAME_MISMATCH, + S_REJECTIONS_DUPLICATE_NAME, + S_REJECTED_RPC_CALLS, + S_RPCS_IN_HMI_NONE, + S_REMOVALS_MISBEHAVED, + S_RUN_ATTEMPTS_WHILE_REVOKED +}; + +enum LanguageType { L_NONE = 0, L_GUI, L_VUI }; + +class PTExtRepresentation : public virtual PTRepresentation { + public: + virtual ~PTExtRepresentation() {} + + /** + * @brief Is application allowed to send notifications while in + * Backgound or limited mode. + * @param app_id Application id + * @return bool Allowed/disallowed. + */ + virtual bool CanAppKeepContext(const std::string& app_id) = 0; + + /** + * @brief Is application allowed to move foreground at will? + * @param app_id Application id + * @return bool Allowed/disallowed. + */ + virtual bool CanAppStealFocus(const std::string& app_id) = 0; + + /** + * @brief Get default_hmi for given application + * @param policy_app_id Unique application id + * @param default_hmi Default HMI level for application or empty, if value was + * not set + * @return true, if succedeed, otherwise - false + */ + virtual bool GetDefaultHMI(const std::string& policy_app_id, + std::string* default_hmi) = 0; + + /** + * @brief Reset user consent for device data and applications permissions + * @return + */ + virtual bool ResetUserConsent() = 0; + + /** + * @brief Reset user consent for device data + * @return + */ + virtual bool ResetDeviceConsents() = 0; + + /** + * @brief Reset user consent for applications permissions + * @return + */ + virtual bool ResetAppConsents() = 0; + + /** + * @brief Get user permissions for device data usage + * @param device_id Generated or obtained id of device + * @param consented_groups Groups consented by user + * @param disallowed_groups Groups not consented by user + * @return true, if query was successfull, otherwise - false + */ + virtual bool GetUserPermissionsForDevice( + const std::string& device_id, + StringArray* consented_groups = NULL, + StringArray* disallowed_groups = NULL) = 0; + + /** + * @brief Gets list of groups permissions from policy table + * @param device_id Unique device id, which hosts specific application + * @param policy_app_id Unique application id + * @param group_types Group list sorted by permission status + * @return true, if query was successfull, otherwise - false + */ + virtual bool GetPermissionsForApp(const std::string& device_id, + const std::string& policy_app_id, + FunctionalIdType* group_types) = 0; + + /** + * @brief Get device groups and preconsented groups from policies section + * @param groups List of groups to be consented for device usage + * @param preconsented_groups List of preconsented groups for device usage + * @return true, if query was successful, otherwise - false + */ + virtual bool GetDeviceGroupsFromPolicies( + policy_table::Strings* groups = NULL, + policy_table::Strings* preconsented_groups = NULL) = 0; + + /** + * @brief Record information about mobile device in Policy Table. + * @param device_id Generated or obtained id of device + * @return bool Success of operation + */ + virtual bool SetDeviceData(const std::string& device_id, + const std::string& hardware = "", + const std::string& firmware = "", + const std::string& os = "", + const std::string& os_version = "", + const std::string& carrier = "", + const uint32_t number_of_ports = 0, + const std::string& connection_type = "") = 0; + + /** + * @brief Sets user consent for particular mobile device, + * i.e. to use device for exchanging of Policy Table. + * @return bool Success of operation + */ + virtual bool SetUserPermissionsForDevice( + const std::string& device_id, + const StringArray& consented_groups = StringArray(), + const StringArray& disallowed_gropus = StringArray()) = 0; + + /** + * @brief Update Application Policies as reaction + * on User allowing/disallowing device this app is running on. + */ + virtual bool ReactOnUserDevConsentForApp(const std::string& app_id, + bool is_device_allowed) = 0; + + /** + * @brief Set user consent on functional groups + * @param permissions User consent on functional group + * @return true, if operation succedeed, otherwise - false + */ + virtual bool SetUserPermissionsForApp( + const PermissionConsent& permissions) = 0; + + /** + * @brief Counter for statistics information: adds 1 to existing number. + * @param type Type of statistics (errors, mins in mode etc) + * @return bool Success of operation + */ + virtual bool IncreaseStatisticsData(StatisticsType type) = 0; + + /** + * @brief Records information about what language + * application tried to register with. + * @param app_id Id of application + * @param type - language for UI/VR + * @param language Language + * @return bool Success of operation + */ + virtual bool SetAppRegistrationLanguage(const std::string& app_id, + LanguageType type, + const std::string& language) = 0; + + /** + * @brief Records information about head unit system to PT + * @return bool Success of operation + */ + virtual bool SetMetaInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language) = 0; + + /** + * @brief Checks, if specific head unit is present in PT + * @return boot Suceess, if present, otherwise - false + */ + virtual bool IsMetaInfoPresent() = 0; + + /** + * @brief Kms pass since last successfull PT update + */ + virtual int GetKmFromSuccessfulExchange() = 0; + + /** + * @brief Days pass since last successfull PT update + */ + virtual int GetDayFromScsExchange() = 0; + + /** + * @brief Ignition cycles pass since last successfull PT update + */ + virtual int GetIgnitionsFromScsExchange() = 0; + + /** + * @brief Set current system language + * @param language System language + * @return true, if succedeed, otherwise - false + */ + virtual bool SetSystemLanguage(const std::string& language) = 0; + + /** + * Increments global counter + * @param type type of counter + */ + virtual void Increment(const std::string& type) const = 0; + + /** + * Increments counter of application + * @param app_id id application + * @param type type of counter + */ + virtual void Increment(const std::string& app_id, + const std::string& type) const = 0; + + /** + * Sets value of application information + * @param app_id id application + * @param type type of information + * @param value value of information + */ + virtual void Set(const std::string& app_id, + const std::string& type, + const std::string& value) const = 0; + + /** + * Adds value to stopwatch of application + * @param app_id id application + * @param type type of stopwatch + * @param seconds value for adding in seconds + */ + virtual void Add(const std::string& app_id, + const std::string& type, + int seconds) const = 0; + + virtual bool CountUnconsentedGroups(const std::string& policy_app_id, + const std::string& device_id, + int* result) const = 0; + + /** + * @brief Gets functional group names and user_consent_prompts, if any + * @param Array to be filled with group ids, names and functional prompts + * @return true, if succeeded, otherwise - false + */ + // TODO(AOleynik): Possibly, we can get rid of this method. Check this. + virtual bool GetFunctionalGroupNames(policy::FunctionalGroupNames& names) = 0; + + /** + * @brief Set app policy to pre_DataConsented policy + * @param app_id Policy ID of application to be changed + * @return true, if succeeded, otherwise - false + */ + virtual bool SetPredataPolicy(const std::string& app_id) = 0; + + /** + * @brief Updates application policy to either pre_DataConsented or not + * @param app_id Policy Id of application to be checked + * @param is_pre_data True of False to setting app policy to be + * pre_DataConsented + * @return true, if succeeded, otherwise - false + */ + virtual bool SetIsPredata(const std::string& app_id, bool is_pre_data) = 0; + + /** + * @brief Removes unpaired devices + * @return true if success + */ + virtual bool CleanupUnpairedDevices(const DeviceIds& device_ids) const = 0; + + /** + * Sets flag of unpaired device + * @param device_id Unique device id + * @param unpaired True, if unpaired, otherwise - false + * @return true if success + */ + virtual bool SetUnpairedDevice(const std::string& device_id, + bool unpaired) const = 0; + + /** + * Gets list of unpaired devices + * @param device_ids output list + * @return true if success + */ + virtual bool UnpairedDevicesList(DeviceIds* device_ids) const = 0; + + /** + * @brief Remove application consent for particular group + * @param policy_app_id Unique application id + * @param functional_group_name Functional group name, which consents should + * be removed + * @return true, in case of success, otherwise - false + */ + virtual bool RemoveAppConsentForGroup( + const std::string& policy_app_id, + const std::string& functional_group_name) const = 0; +}; +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_PT_EXT_REPRESENTATION_H_ diff --git a/src/components/policy/policy_external/include/policy/pt_representation.h b/src/components/policy/policy_external/include/policy/pt_representation.h new file mode 100644 index 0000000000..66a9218771 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/pt_representation.h @@ -0,0 +1,328 @@ +/* + Copyright (c) 2015, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_PT_REPRESENTATION_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_PT_REPRESENTATION_H_ + +#include <vector> +#include <string> +#include "policy/policy_types.h" +#include "policy/policy_table/types.h" +#include "policy/policy_settings.h" + +namespace policy_table = rpc::policy_table_interface_base; + +namespace policy { + +enum InitResult { NONE = 0, EXISTS, SUCCESS, FAIL }; + +class PTRepresentation { + public: + virtual ~PTRepresentation() {} + + /** + * @brief Check if specified RPC for specified application + * has permission to be executed in specified HMI Level + * and also its permitted params. + * @param app_id Id of application provided during registration + * @param hmi_level Current HMI Level of application + * @param rpc Name of RPC + * @params CheckPermissionResult containing flag if HMI Level is allowed + * and list of allowed params. + */ + virtual void CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result) = 0; + + /** + * @brief Returns true if Policy Table was not updated yet + * from preloaded pt file. + */ + virtual bool IsPTPreloaded() = 0; + + /** + * @brief GetLockScreenIcon allows to obtain lock screen icon url; + * + * @return url which point to the resourse where lock screen icon could be + *obtained. + */ + virtual std::string GetLockScreenIconUrl() const = 0; + + /** + * @brief Re-creates schema in DB, drops all data + * @return true, if succedeed, otherwise - false + */ + virtual bool RefreshDB() = 0; + /** + * Gets number of ignition cycles before next update policy table + * @return number of ignition cycles + */ + virtual int IgnitionCyclesBeforeExchange() = 0; + + /** + * Gets value in kilometers before next update policy table + * @param current value in kilometers from the odometers + * @return value in kilometers + */ + virtual int KilometersBeforeExchange(int current) = 0; + + /** + * @brief Sets kilometers and days after epoch, that passed for recieved + * successful PT UPdate + */ + virtual bool SetCountersPassedForSuccessfulUpdate(int kilometers, + int days_after_epoch) = 0; + + /** + * Gets value in days before next update policy table + * @param current value in days after epoch + * @return value in days + */ + virtual int DaysBeforeExchange(uint16_t current) = 0; + + /** + * @brief Increment number of ignition cycles since last exchange by 1 + */ + virtual void IncrementIgnitionCycles() = 0; + + /** + * @brief Reset number of ignition cycles since last exchange to 0 + */ + virtual void ResetIgnitionCycles() = 0; + + /** + * @brief Returns timeout to wait for a response of PT update + * @return value in seconds + */ + virtual int TimeoutResponse() = 0; + + /** + * @brief Returns number of seconds between each try of sending PTS + * @param seconds Return value: array of 5 elements + * @return bool Success of operation + */ + virtual bool SecondsBetweenRetries(std::vector<int>* seconds) = 0; + + /** + * @brief Get information about vehicle + */ + virtual const VehicleInfo GetVehicleInfo() const = 0; + + /** + * @brief Allows to update 'vin' field in module_meta table. + * + * @param new 'vin' value. + * + * @return true in case when data has been successfully updated, + * false otherwise. + */ + virtual bool SetVINValue(const std::string& value) = 0; + + /** + * @brief Get message text for displaying/pronouncing for user + * dependent on language and context. + * @param msg_codes Context of message (Driver distraction, Grant permission + * etc) + * @param language Language of the message + * @return Array of appropriate messages parameters + */ + virtual std::vector<UserFriendlyMessage> GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, + const std::string& language) = 0; + + /** + * @brief Get list of URL to send PTS to + * @param service_type If URLs for specific service are preset, + * return them otherwise default URLs. + */ + virtual EndpointUrls GetUpdateUrls(int service_type) = 0; + + /** + * @brief Get allowed number of notifications + * depending on application priority. + * @param priority Priority of application + */ + virtual int GetNotificationsNumber(const std::string& priority) = 0; + + /** + * @brief Get priority for given application + * @param policy_app_id Unique application id + * @param priority Priority for application or empty, if value was not set + * @return true, if succedeed, otherwise - false + */ + virtual bool GetPriority(const std::string& policy_app_id, + std::string* priority) = 0; + + /** + * @brief Initialized Policy Table (load) + * @return bool Success of operation + */ + virtual InitResult Init(const PolicySettings* settings) = 0; + + /** + * @brief Close policy table + * @return bool Success of operation + */ + virtual bool Close() = 0; + + /** + * @brief Removes policy table content. + * @return bool Success of operation + */ + virtual bool Clear() = 0; + + /** + * Drops policy table (schema and content) + * @return true if successfully + */ + virtual bool Drop() = 0; + + /** + * @brief Get snapshot of Policy Table + * including app_policies, functional_groups, + * device_info, statistics, excluding user messages + * @return Generated structure for obtaining Json string. + */ + virtual utils::SharedPtr<policy_table::Table> GenerateSnapshot() const = 0; + + virtual bool Save(const policy_table::Table& table) = 0; + + /** + * Gets flag updateRequired + * @return true if update is required + */ + virtual bool UpdateRequired() const = 0; + + /** + * Saves flag updateRequired + */ + virtual void SaveUpdateRequired(bool value) = 0; + + /* + Retrieves data from app_policies about app on its registration: + app_id - id of registered app; all outputs are filled in only if not null + output: nicknames Synonyms for application + output: app_types Section on HMI where app can appear (Navigation, Phone etc) + */ + virtual bool GetInitialAppData(const std::string& app_id, + StringArray* nicknames = NULL, + StringArray* app_types = NULL) = 0; + + /** + * Checks if the application is revoked + * @param app_id application id + * @return true if application is revoked + */ + virtual bool IsApplicationRevoked(const std::string& app_id) const = 0; + + /** + * @brief Get functional groupings from DB + * @param groups Known functional groupings + * @return true, if succeeded, otherwise - false + */ + virtual bool GetFunctionalGroupings( + policy_table::FunctionalGroupings& groups) = 0; + + /** + * Checks if the application is represented in policy table + * @param app_id application id + * @return true if application is represented in policy table + */ + virtual bool IsApplicationRepresented(const std::string& app_id) const = 0; + + /** + * Checks if the application has default policy + * @param app_id application id + * @return true if application has default policy + */ + virtual bool IsDefaultPolicy(const std::string& app_id) const = 0; + + /** + * Checks if the application has pre_data policy + * @param app_id application id + * @return true if application has pre_data policy + */ + virtual bool IsPredataPolicy(const std::string& app_id) const = 0; + + /** + * Sets default policy for application + * @param app_id application id + * @return true if success + */ + virtual bool SetDefaultPolicy(const std::string& app_id) = 0; + + /** + * @brief SaveApplicationCustomData allows to save specific data to database. + * This data is only for internal use. + * @param app_id the application id for which the data will be saved. + * @param is_revoked parameter to save. + * @param is_default parameter to save. + * @param is_predata parameter to save. + */ + virtual bool SaveApplicationCustomData(const std::string& app_id, + bool is_revoked, + bool is_default, + bool is_predata) = 0; + + virtual void WriteDb() = 0; + + /** + * @brief RemoveDB allows to remove the database. + * It will either remove or do nothing in case file not exists or any other + * troubles are happens during this operation. + */ + virtual void RemoveDB() const = 0; + + /** + * @brief Checks if DB version is actual to current schema + * @return true if actual, otherwise - false + */ + virtual bool IsDBVersionActual() const = 0; + + /** + * @brief Updates DB version according to current schema + * @return true if success, otherwise - false + */ + virtual bool UpdateDBVersion() const = 0; + + protected: + const PolicySettings& get_settings() const { + DCHECK(settings_); + return *settings_; + } + const PolicySettings* settings_; +}; + +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_PT_REPRESENTATION_H_ diff --git a/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h b/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h new file mode 100644 index 0000000000..96406feaf1 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/sql_pt_ext_queries.h @@ -0,0 +1,97 @@ +/* + Copyright (c) 2013, " Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, " with or without + modification, " are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, " this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, " + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, " INCLUDING, " BUT NOT LIMITED TO, " THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, " INDIRECT, " INCIDENTAL, " SPECIAL, " EXEMPLARY, " OR + CONSEQUENTIAL DAMAGES (INCLUDING, " BUT NOT LIMITED TO, " PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, " DATA, " OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, " WHETHER IN + CONTRACT, " STRICT LIABILITY, " OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, " EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_EXT_QUERIES_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_EXT_QUERIES_H_ + +#include <string> + +namespace policy { +namespace sql_pt_ext { + +extern const std::string kSelectKeepContext; +extern const std::string kSelectStealFocus; +extern const std::string kResetDeviceConsents; +extern const std::string kResetAppConsents; +extern const std::string kCountDeviceConsentGroup; +extern const std::string kCountDevice; +extern const std::string kSelectDeviceConsentedGroup; +extern const std::string kUpdateDeviceConsentedGroup; +extern const std::string kUpdateDevice; +extern const std::string kInsertDeviceConsentedGroup; +extern const std::string kInsertDevice; +extern const std::string kSelectDeviceData; +extern const std::string kSelectConsentGroup; +extern const std::string kInsertPreconsentedGroups; +extern const std::string kSelectPreconsentedGroups; +extern const std::string kDeletePreconsentedGroups; +extern const std::string kSelectUsageAndErrorCount; +extern const std::string kSelectAppLevels; +extern const std::string kUpdateGlobalCounters; +extern const std::string kInsertDeviceData; +extern const std::string kDeleteDeviceData; +extern const std::string kInsertConsentGroups; +extern const std::string kCountUnconsentedGroups; +extern const std::string kSelectModuleMeta; +extern const std::string kUpdateMetaParams; +extern const std::string kUpdateModuleMetaVinParam; +extern const std::string kSaveModuleMeta; +extern const std::string kSelectMetaParams; +extern const std::string kCountAppLevel; +extern const std::string kUpdateGroupPermissions; +extern const std::string kSelectDefaultHmi; +extern const std::string kInsertApplication; +extern const std::string kSelectFriendlyMsg; +extern const std::string kCollectFriendlyMsg; +extern const std::string kSelectAppGroupsId; +extern const std::string kSelectConsentedGroupsId; +extern const std::string kCountAppConsents; +extern const std::string kSelectPreconsentedGroupsId; +extern const std::string kSelectFunctionalGroupNames; +extern const std::string kSelectAppPolicies; +extern const std::string kUpdateMetaLanguage; +extern const std::string kDeleteDeviceConsent; +extern const std::string kDeleteAppGroupConsent; +extern const std::string kSelectGroupId; +extern const std::string kSelectApplicationIsPreData; +extern const std::string kUpdateIsPredata; +extern const std::string kHasAppPreloadedGroups; +extern const std::string kUpdateUnpairedDevice; +extern const std::string kSelectUnpairedDevices; +extern const std::string kHasMsgLanguageCode; +extern const std::string kDeletePreconsentedGroupsByApplicationId; +extern const std::string kDeleteAppConsent; + +} // namespace sql_pt_ext +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_EXT_QUERIES_H_ diff --git a/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h b/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h new file mode 100644 index 0000000000..99fe099a59 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/sql_pt_ext_representation.h @@ -0,0 +1,207 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_EXT_REPRESENTATION_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_EXT_REPRESENTATION_H_ + +#include <string> +#include "policy/sql_pt_representation.h" +#include "policy/pt_ext_representation.h" + +namespace policy { + +class SQLPTExtRepresentation : public SQLPTRepresentation, + public PTExtRepresentation { + public: + SQLPTExtRepresentation(); + explicit SQLPTExtRepresentation(bool in_memory); + bool CanAppKeepContext(const std::string& app_id); + bool CanAppStealFocus(const std::string& app_id); + bool GetDefaultHMI(const std::string& policy_app_id, + std::string* default_hmi); + bool ResetUserConsent(); + bool ResetDeviceConsents(); + bool ResetAppConsents(); + bool GetUserPermissionsForDevice(const std::string& device_id, + StringArray* consented_groups = NULL, + StringArray* disallowed_groups = NULL); + + bool GetPermissionsForApp(const std::string& device_id, + const std::string& policy_app_id, + FunctionalIdType* group_types); + + bool GetDeviceGroupsFromPolicies( + policy_table::Strings* groups = NULL, + policy_table::Strings* preconsented_groups = NULL); + bool SetDeviceData(const std::string& device_id, + const std::string& hardware = "", + const std::string& firmware = "", + const std::string& os = "", + const std::string& os_version = "", + const std::string& carrier = "", + const uint32_t number_of_ports = 0, + const std::string& connection_type = ""); + bool SetUserPermissionsForDevice( + const std::string& device_id, + const StringArray& consented_groups = StringArray(), + const StringArray& disallowed_groups = StringArray()); + + bool ReactOnUserDevConsentForApp(const std::string& app_id, + bool is_device_allowed); + + bool SetUserPermissionsForApp(const PermissionConsent& permissions); + + std::vector<UserFriendlyMessage> GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, const std::string& language); + + bool IncreaseStatisticsData(StatisticsType type) { + return true; + } + bool SetAppRegistrationLanguage(const std::string& app_id, + LanguageType type, + const std::string& language) { + return true; + } + + bool SetMetaInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language); + + bool IsMetaInfoPresent(); + + bool SetSystemLanguage(const std::string& language); + + int GetKmFromSuccessfulExchange() { + return true; + } + int GetDayFromScsExchange() { + return true; + } + int GetIgnitionsFromScsExchange() { + return true; + } + + bool GetFunctionalGroupNames(FunctionalGroupNames& names); + bool CleanupUnpairedDevices(const DeviceIds& device_ids) const; + + void Increment(const std::string& type) const; + void Increment(const std::string& app_id, const std::string& type) const; + void Set(const std::string& app_id, + const std::string& type, + const std::string& value) const; + void Add(const std::string& app_id, + const std::string& type, + int seconds) const; + bool SetDefaultPolicy(const std::string& app_id); + bool SetPredataPolicy(const std::string& app_id); + bool SetIsPredata(const std::string& app_id, bool is_pre_data); + bool IsPredataPolicy(const std::string& app_id) const; + bool SetUnpairedDevice(const std::string& device_id, bool unpaired) const; + bool UnpairedDevicesList(DeviceIds* device_ids) const; + bool RemoveAppConsentForGroup(const std::string& policy_app_id, + const std::string& functional_group_name) const; + + virtual bool SetVINValue(const std::string& value); + + private: + void GatherModuleMeta(policy_table::ModuleMeta* meta) const; + void GatherPreconsentedGroup(const std::string& app_id, + policy_table::Strings* groups) const; + bool GatherUsageAndErrorCounts( + policy_table::UsageAndErrorCounts* counts) const; + bool GatherAppLevels(policy_table::AppLevels* apps) const; + void GatherDeviceData(policy_table::DeviceData* data) const; + void GatherConsentGroup(const std::string& device_id, + policy_table::UserConsentRecords* records) const; + bool GatherApplicationPoliciesSection( + policy_table::ApplicationPoliciesSection* policies) const; + bool SaveDeviceData(const policy_table::DeviceData& devices); + bool GatherConsumerFriendlyMessages( + policy_table::ConsumerFriendlyMessages* messages) const; + bool SaveConsentGroup(const std::string& device_id, + const policy_table::UserConsentRecords& records); + bool SaveApplicationPoliciesSection( + const policy_table::ApplicationPoliciesSection& policies); + bool SaveSpecificAppPolicy( + const policy_table::ApplicationPolicies::value_type& app); + bool SaveDevicePolicy(const policy_table::DevicePolicy& device); + bool SavePreconsentedGroup(const std::string& app_id, + const policy_table::Strings& groups); + bool SaveMessageString(const std::string& type, + const std::string& lang, + const policy_table::MessageString& strings); + + virtual bool SaveUsageAndErrorCounts( + const policy_table::UsageAndErrorCounts& counts); + + virtual bool SaveModuleMeta(const policy_table::ModuleMeta& meta); + + bool SaveAppCounters(const policy_table::AppLevels& app_levels); + + bool SaveGlobalCounters(const policy_table::UsageAndErrorCounts& counts); + + bool IsExistAppLevel(const std::string& app_id) const; + + bool GetAllAppGroups(const std::string& policy_app_id, + FunctionalGroupIDs& all_groups); + + bool GetConsentedGroups(const std::string& policy_app_id, + const std::string& device_id, + FunctionalGroupIDs& allowed_groups, + FunctionalGroupIDs& disallowed_groups); + + bool GetPreconsentedGroups(const std::string& policy_app_id, + FunctionalGroupIDs& preconsented_groups); + + void FillFunctionalGroupPermissions( + FunctionalGroupIDs& ids, + FunctionalGroupNames& names, + GroupConsent state, + std::vector<FunctionalGroupPermission>& permissions); + bool CountUnconsentedGroups(const std::string& policy_app_id, + const std::string& device_id, + int* result) const; + + /** + * @brief Checks, if there is message present with requested language in PT + * @param message Message name + * @param language Required message language + * @return True, if message with requested language is present, otherwise - + * false + */ + bool IsMsgLanguagePresent(const std::string& message, + const std::string& language); +}; + +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_EXT_REPRESENTATION_H_ diff --git a/src/components/policy/policy_external/include/policy/sql_pt_queries.h b/src/components/policy/policy_external/include/policy/sql_pt_queries.h new file mode 100644 index 0000000000..a0ff71ba13 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/sql_pt_queries.h @@ -0,0 +1,121 @@ +/* + Copyright (c) 2013, " Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, " with or without + modification, " are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, " this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, " + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, " INCLUDING, " BUT NOT LIMITED TO, " THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, " INDIRECT, " INCIDENTAL, " SPECIAL, " EXEMPLARY, " OR + CONSEQUENTIAL DAMAGES (INCLUDING, " BUT NOT LIMITED TO, " PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, " DATA, " OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, " WHETHER IN + CONTRACT, " STRICT LIABILITY, " OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, " EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_QUERIES_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_QUERIES_H_ + +#include <string> + +namespace policy { +namespace sql_pt { + +extern const std::string kSelectPriority; +extern const std::string kCreateSchema; +extern const std::string kDropSchema; +extern const std::string kDeleteData; +extern const std::string kCheckPgNumber; +extern const std::string kCheckDBIntegrity; +extern const std::string kSelectRpc; +extern const std::string kSelectPreloaded; +extern const std::string kIsFirstRun; +extern const std::string kSetNotFirstRun; +extern const std::string kSelectEndpoint; +extern const std::string kSelectLockScreenIcon; +extern const std::string kSelectModuleConfig; +extern const std::string kSelectEndpoints; +extern const std::string kSelectNotificationsPerMin; +extern const std::string kSelectNotificationsPerPriority; +extern const std::string kSelectAppLevels; +extern const std::string kSelectDeviceData; +extern const std::string kSelectFunctionalGroups; +extern const std::string kSelectAllRpcs; +extern const std::string kSelectUserMsgsVersion; +extern const std::string kSelectAppPolicies; +extern const std::string kSelectAppGroups; +extern const std::string kSelectNicknames; +extern const std::string kSelectAppTypes; +extern const std::string kSelectRequestTypes; +extern const std::string kSelectSecondsBetweenRetries; +extern const std::string kSelectIgnitionCycles; +extern const std::string kSelectKilometers; +extern const std::string kSelectDays; +extern const std::string kSelectTimeoutResponse; +extern const std::string kInsertFunctionalGroup; +extern const std::string kInsertRpc; +extern const std::string kInsertRpcWithParameter; +extern const std::string kInsertApplication; +extern const std::string kInsertAppGroup; +extern const std::string kInsertNickname; +extern const std::string kInsertAppType; +extern const std::string kInsertRequestType; +extern const std::string kInsertMessageType; +extern const std::string kInsertLanguage; +extern const std::string kInsertMessageString; +extern const std::string kUpdateVersion; +extern const std::string kUpdateModuleConfig; +extern const std::string kInsertEndpoint; +extern const std::string kInsertSecondsBetweenRetry; +extern const std::string kInsertNotificationsByPriority; +extern const std::string kInsertDeviceData; +extern const std::string kInsertAppLevel; +extern const std::string kDeleteSecondsBetweenRetries; +extern const std::string kDeleteEndpoint; +extern const std::string kDeleteAppLevel; +extern const std::string kDeleteMessageString; +extern const std::string kDeleteFunctionalGroup; +extern const std::string kDeleteRpc; +extern const std::string kDeleteAppGroup; +extern const std::string kDeleteApplication; +extern const std::string kDeleteRequestType; +extern const std::string kDeleteDevice; +extern const std::string kIncrementIgnitionCycles; +extern const std::string kResetIgnitionCycles; +extern const std::string kUpdateFlagUpdateRequired; +extern const std::string kSelectFlagUpdateRequired; +extern const std::string kUpdateCountersSuccessfulUpdate; +extern const std::string kSelectApplicationRevoked; +extern const std::string kUpdateApplicationCustomData; +extern const std::string kSelectApplicationRepresented; +extern const std::string kSelectApplicationIsDefault; +extern const std::string kUpdateIsDefault; +extern const std::string kInsertInitData; +extern const std::string kDeleteAppGroupByApplicationId; +extern const std::string kInsertApplicationFull; +extern const std::string kDeletePreconsentedGroupsByApplicationId; +extern const std::string kSelectApplicationFull; +extern const std::string kUpdatePreloaded; +extern const std::string kSelectDBVersion; +extern const std::string kUpdateDBVersion; +} // namespace sql_pt +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_QUERIES_H_ diff --git a/src/components/policy/policy_external/include/policy/sql_pt_representation.h b/src/components/policy/policy_external/include/policy/sql_pt_representation.h new file mode 100644 index 0000000000..a2999b4bf5 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/sql_pt_representation.h @@ -0,0 +1,204 @@ +/* + Copyright (c) 2015, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_REPRESENTATION_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_REPRESENTATION_H_ + +#include <string> +#include <vector> +#include "policy/pt_representation.h" +#include "rpc_base/rpc_base.h" +#include "policy/policy_table/types.h" + +namespace policy_table = rpc::policy_table_interface_base; + +namespace utils { +namespace dbms { +class SQLDatabase; +} // namespace dbms +} // namespace utils + +namespace policy { + +class SQLPTRepresentation : public virtual PTRepresentation { + public: + SQLPTRepresentation(); + explicit SQLPTRepresentation(bool in_memory); + ~SQLPTRepresentation(); + virtual void CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result); + + virtual bool IsPTPreloaded(); + virtual int IgnitionCyclesBeforeExchange(); + virtual int KilometersBeforeExchange(int current); + virtual bool SetCountersPassedForSuccessfulUpdate(int kilometers, + int days_after_epoch); + virtual int DaysBeforeExchange(uint16_t current); + virtual void IncrementIgnitionCycles(); + virtual void ResetIgnitionCycles(); + virtual int TimeoutResponse(); + virtual bool SecondsBetweenRetries(std::vector<int>* seconds); + virtual bool RefreshDB(); + virtual const VehicleInfo GetVehicleInfo() const; + + virtual std::vector<UserFriendlyMessage> GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, const std::string& language); + + virtual EndpointUrls GetUpdateUrls(int service_type); + + virtual int GetNotificationsNumber(const std::string& priority); + virtual bool GetPriority(const std::string& policy_app_id, + std::string* priority); + InitResult Init(const PolicySettings* settings); + bool Close(); + bool Clear(); + bool Drop(); + virtual void WriteDb(); + virtual utils::SharedPtr<policy_table::Table> GenerateSnapshot() const; + virtual bool Save(const policy_table::Table& table); + bool GetInitialAppData(const std::string& app_id, + StringArray* nicknames = NULL, + StringArray* app_hmi_types = NULL); + bool GetFunctionalGroupings(policy_table::FunctionalGroupings& groups); + +#ifdef BUILD_TESTS + uint32_t open_counter() { + return open_counter_; + } +#endif // BUILD_TESTS + protected: + virtual void GatherModuleMeta(policy_table::ModuleMeta* meta) const; + virtual void GatherModuleConfig(policy_table::ModuleConfig* config) const; + virtual bool GatherUsageAndErrorCounts( + policy_table::UsageAndErrorCounts* counts) const; + virtual void GatherDeviceData(policy_table::DeviceData* data) const; + virtual bool GatherFunctionalGroupings( + policy_table::FunctionalGroupings* groups) const; + virtual bool GatherConsumerFriendlyMessages( + policy_table::ConsumerFriendlyMessages* messages) const; + virtual bool GatherApplicationPoliciesSection( + policy_table::ApplicationPoliciesSection* policies) const; + + bool GatherAppGroup(const std::string& app_id, + policy_table::Strings* app_groups) const; + bool GatherAppType(const std::string& app_id, + policy_table::AppHMITypes* app_types) const; + bool GatherRequestType(const std::string& app_id, + policy_table::RequestTypes* request_types) const; + bool GatherNickName(const std::string& app_id, + policy_table::Strings* nicknames) const; + + virtual bool SaveApplicationCustomData(const std::string& app_id, + bool is_revoked, + bool is_default, + bool is_predata); + + virtual bool SaveModuleMeta(const policy_table::ModuleMeta& meta); + virtual bool SaveModuleConfig(const policy_table::ModuleConfig& config); + virtual bool SaveUsageAndErrorCounts( + const policy_table::UsageAndErrorCounts& counts); + virtual bool SaveDeviceData(const policy_table::DeviceData& devices); + virtual bool SaveFunctionalGroupings( + const policy_table::FunctionalGroupings& groups); + virtual bool SaveConsumerFriendlyMessages( + const policy_table::ConsumerFriendlyMessages& messages); + virtual bool SaveApplicationPoliciesSection( + const policy_table::ApplicationPoliciesSection& policies); + virtual bool SaveSpecificAppPolicy( + const policy_table::ApplicationPolicies::value_type& app); + virtual bool SaveDevicePolicy(const policy_table::DevicePolicy& device); + + virtual bool SaveMessageString(const std::string& type, + const std::string& lang, + const policy_table::MessageString& strings); + + bool SaveAppGroup(const std::string& app_id, + const policy_table::Strings& app_groups); + bool SaveNickname(const std::string& app_id, + const policy_table::Strings& nicknames); + bool SaveAppType(const std::string& app_id, + const policy_table::AppHMITypes& types); + bool SaveRequestType(const std::string& app_id, + const policy_table::RequestTypes& types); + + public: + virtual std::string GetLockScreenIconUrl() const; + bool UpdateRequired() const; + void SaveUpdateRequired(bool value); + + bool IsApplicationRepresented(const std::string& app_id) const; + bool CopyApplication(const std::string& source, + const std::string& destination); + + bool IsApplicationRevoked(const std::string& app_id) const; + virtual bool IsDefaultPolicy(const std::string& app_id) const; + virtual bool IsPredataPolicy(const std::string& app_id) const; + virtual bool SetDefaultPolicy(const std::string& app_id); + virtual void SetPreloaded(bool value); + + virtual bool SetVINValue(const std::string& value); + + virtual utils::dbms::SQLDatabase* db() const; + virtual bool SetIsDefault(const std::string& app_id, bool is_default) const; + + void RemoveDB() const OVERRIDE; + virtual bool IsDBVersionActual() const OVERRIDE; + virtual bool UpdateDBVersion() const OVERRIDE; + + private: + utils::dbms::SQLDatabase* db_; + +#ifdef BUILD_TESTS + uint32_t open_counter_; +#endif // BUILD_TESTS + + /** + * @brief Calculates DB version from current schema + * @return version + */ + const int32_t GetDBVersion() const; + bool SaveRpcs(int64_t group_id, const policy_table::Rpc& rpcs); + bool SaveServiceEndpoints(const policy_table::ServiceEndpoints& endpoints); + bool SaveSecondsBetweenRetries( + const policy_table::SecondsBetweenRetries& seconds); + bool SaveNumberOfNotificationsPerMinute( + const policy_table::NumberOfNotificationsPerMinute& notifications); + bool SaveMessageType(const std::string& type); + bool SaveLanguage(const std::string& code); + + bool is_in_memory; +}; +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_PT_REPRESENTATION_H_ diff --git a/src/components/policy/policy_external/include/policy/sql_wrapper.h b/src/components/policy/policy_external/include/policy/sql_wrapper.h new file mode 100644 index 0000000000..87fe1404a7 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/sql_wrapper.h @@ -0,0 +1,45 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_WRAPPER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_WRAPPER_H_ + +#if __QNX__ +#include "utils/qdb_wrapper/sql_database_impl.h" +#include "utils/qdb_wrapper/sql_query.h" +#else // __QNX__ +// TODO it can be error root cause AHrytsesevich +#include "utils/sqlite_wrapper/sql_database.h" +#include "utils/sqlite_wrapper/sql_query.h" +#endif // __QNX__ + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_SQL_WRAPPER_H_ diff --git a/src/components/policy/policy_external/include/policy/status.h b/src/components/policy/policy_external/include/policy/status.h new file mode 100644 index 0000000000..f578db0311 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/status.h @@ -0,0 +1,194 @@ +/* + Copyright (c) 2016, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_STATUS_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_STATUS_H_ + +#include <string> +#include "policy/policy_types.h" +#include "utils/macro.h" + +namespace policy { + +/** + * @brief The UpdateEvent enum defines system events which can change update + * status + */ +enum UpdateEvent { + kOnNewAppRegistered, + kOnValidUpdateReceived, + kOnWrongUpdateReceived, + kOnUpdateSentOut, + kOnUpdateTimeout, + kOnResetPolicyTableRequireUpdate, + kOnResetPolicyTableNoUpdate, + kScheduleUpdate, + kOnResetRetrySequence +}; + +const std::string kUpToDate = "UP_TO_DATE"; +const std::string kUpdateNeeded = "UPDATE_NEEDED"; +const std::string kUpdating = "UPDATING"; + +class UpdateStatusManager; + +/** + * @brief The Status class defines base implementation of update status + */ +class Status { + public: + /** + * @brief Constructor + */ + Status(const std::string& string_status, + const policy::PolicyTableStatus enum_status); + + /** + * @brief Destructor + */ + virtual ~Status(); + + /** + * @brief Process event by setting next status in case event can affect + * current status or ignores the event + * @param manager Status manager pointer + * @param event Event which needs to be processed + */ + virtual void ProcessEvent(UpdateStatusManager* manager, + UpdateEvent event) = 0; + + /** + * @brief Return current status as string value + * @return Status as string + */ + const std::string get_status_string() const; + + /** + * @brief Return status as enum value + * @return Status as enum value + */ + PolicyTableStatus get_status() const; + + /** + * @brief Check whether update is required in terms of status + * @return True if update is required, otherwise - false + */ + virtual bool IsUpdateRequired() const; + + /** + * @brief Check whether update is pending in terms of status + * @return True if update is pending, otherwise - false + */ + virtual bool IsUpdatePending() const; + + private: + const std::string string_status_; + const PolicyTableStatus enum_status_; +}; + +/** + * @brief The UpToDateStatus class represents 'up-to-date' status + */ +class UpToDateStatus : public Status { + public: + /** + * @brief Constructor + */ + UpToDateStatus(); + + /** + * @brief Process event by setting next status in case event can affect + * current status or ignores the event + * @param manager Status manager pointer + * @param event Event which needs to be processed + */ + void ProcessEvent(UpdateStatusManager* manager, UpdateEvent event) FINAL; +}; + +/** + * @brief The UpdateNeededStatus class represents 'update needed' status + */ +class UpdateNeededStatus : public Status { + public: + /** + * @brief Constructor + */ + UpdateNeededStatus(); + + /** + * @brief Process event by setting next status in case event can affect + * current status or ignores the event + * @param manager Status manager pointer + * @param event Event which needs to be processed + */ + void ProcessEvent(UpdateStatusManager* manager, UpdateEvent event) FINAL; + + /** + * @brief Check whether update is required in terms of status + * @return True if update is required, otherwise - false + */ + bool IsUpdateRequired() const FINAL; +}; + +/** + * @brief The UpdatingStatus class represents 'updating' status + */ +class UpdatingStatus : public Status { + public: + /** + * @brief Constructor + */ + UpdatingStatus(); + + /** + * @brief Process event by setting next status in case event can affect + * current status or ignores the event + * @param manager Status manager pointer + * @param event Event which needs to be processed + */ + void ProcessEvent(UpdateStatusManager* manager, UpdateEvent event) FINAL; + + /** + * @brief Check whether update is required in terms of status + * @return True if update is required, otherwise - false + */ + bool IsUpdateRequired() const FINAL; + + /** + * @brief Check whether update is pending in terms of status + * @return True if update is pending, otherwise - false + */ + bool IsUpdatePending() const FINAL; +}; +} + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_STATUS_H_ diff --git a/src/components/policy/policy_external/include/policy/update_status_manager.h b/src/components/policy/policy_external/include/policy/update_status_manager.h new file mode 100644 index 0000000000..c04c513479 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/update_status_manager.h @@ -0,0 +1,232 @@ +/* + Copyright (c) 2017, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_UPDATE_STATUS_MANAGER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_UPDATE_STATUS_MANAGER_H_ + +#include "policy/policy_types.h" +#include "utils/lock.h" +#include "utils/threads/thread.h" +#include "utils/threads/thread_delegate.h" +#include "utils/conditional_variable.h" +#include "utils/lock.h" +#include "utils/logger.h" +#include "utils/macro.h" +#include "policy/status.h" + +namespace policy { + +class PolicyListener; + +class UpdateStatusManager { + public: + /** + * @brief Constructor + */ + UpdateStatusManager(); + + ~UpdateStatusManager(); + + /** + * @brief Process event by current status implementations + * @param event Event + */ + void ProcessEvent(UpdateEvent event); + + /** + * @brief Set next status during event processing + * @param status Status shared pointer + */ + void SetNextStatus(utils::SharedPtr<Status> status); + + /** + * @brief Set postponed status (will be set after next status) during event + * processing + * @param status Status shared pointer + */ + void SetPostponedStatus(utils::SharedPtr<Status> status); + + /** + * @brief Sets listener pointer + * @param listener Pointer to policy listener implementation + */ + void set_listener(PolicyListener* listener); + + /** + * @brief Update status hanlder for PTS sending out + * @param update_timeout Timeout for waiting of incoming PTU + */ + void OnUpdateSentOut(uint32_t update_timeout); + + /** + * @brief Update status handler for PTU waiting timeout + */ + void OnUpdateTimeoutOccurs(); + + /** + * @brief Update status handler for valid PTU receiving + */ + void OnValidUpdateReceived(); + + /** + * @brief Update status handler for wrong PTU receiving + */ + void OnWrongUpdateReceived(); + + /** + * @brief Update status handler for reset PT to default state + * @param is_update_required Update necessity flag + */ + void OnResetDefaultPT(bool is_update_required); + + /** + * @brief Update status handler for restarting retry sequence + */ + void OnResetRetrySequence(); + + /** + * @brief Update status handler on new application registering + */ + void OnNewApplicationAdded(const DeviceConsent consent); + + /** + * @brief Update status handler for policy initialization + * @param is_update_required Update necessity flag + */ + void OnPolicyInit(bool is_update_required); + + /** + * @brief In case application from non-consented device has been registered + * before and and no updated happened then triggers status change + */ + void OnDeviceConsented(); + + /** + * @brief IsUpdateRequired allows to distiguish if update is required + * + * @return true if update required. + */ + bool IsUpdateRequired() const; + + /** + * @brief IsUpdatePending allows to distinguish if update is in pending mode. + * + * @return true if update is in pending mode. + */ + bool IsUpdatePending() const; + + /** + * @brief ScheduleUpdate allows to schedule next update. + * It will change state to Update_Needed, that's is. + */ + void ScheduleUpdate(); + + /** + * @brief StringifiedUpdateStatus allows to obtain update status as a string. + * + * @return stringified update status. + */ + std::string StringifiedUpdateStatus() const; + + /** + * @brief Status handler on applications search started + */ + void OnAppsSearchStarted(); + + /** + * @brief Status handler on applications search completed + */ + void OnAppsSearchCompleted(); + + /** + * @brief Returns status is application search in progress + * @return true, if in progress, otherwise - false + */ + bool IsAppsSearchInProgress(); + +#ifdef BUILD_TESTS + PolicyTableStatus GetLastUpdateStatus() const { + return current_status_->get_status(); + } +#endif // BUILD_TESTS + + private: + /** + * @brief Does statuses transitions after event handling and notifies the + * system + */ + void DoTransition(); + + private: + PolicyListener* listener_; + + /** + * @brief Current update status + */ + utils::SharedPtr<Status> current_status_; + + /** + * @brief Next status after current to be set + */ + utils::SharedPtr<Status> next_status_; + + /** + * @brief Status to be set after 'next' status + */ + utils::SharedPtr<Status> postponed_status_; + sync_primitives::Lock status_lock_; + + bool apps_search_in_progress_; + bool app_registered_from_non_consented_device_; + sync_primitives::Lock apps_search_in_progress_lock_; + + class UpdateThreadDelegate : public threads::ThreadDelegate { + public: + UpdateThreadDelegate(UpdateStatusManager* update_status_manager); + ~UpdateThreadDelegate(); + virtual void threadMain(); + virtual void exitThreadMain(); + void updateTimeOut(const uint32_t timeout_ms); + + volatile uint32_t timeout_; + volatile bool stop_flag_; + sync_primitives::Lock state_lock_; + sync_primitives::ConditionalVariable termination_condition_; + UpdateStatusManager* update_status_manager_; + }; + + UpdateThreadDelegate* update_status_thread_delegate_; + threads::Thread* thread_; +}; +} + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_UPDATE_STATUS_MANAGER_H_ diff --git a/src/components/policy/policy_external/include/policy/usage_statistics/counter.h b/src/components/policy/policy_external/include/policy/usage_statistics/counter.h new file mode 100644 index 0000000000..adaef0eb28 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/usage_statistics/counter.h @@ -0,0 +1,108 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_USAGE_STATISTICS_COUNTER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_USAGE_STATISTICS_COUNTER_H_ + +#include <ctime> +#include "policy/usage_statistics/statistics_manager.h" +#include "policy/usage_statistics/app_stopwatch.h" +#include "utils/shared_ptr.h" +#include "utils/timer.h" +#include "utils/macro.h" + +namespace usage_statistics { + +using timer::Timer; + +class GlobalCounter { + public: + GlobalCounter(utils::SharedPtr<StatisticsManager> statistics_manager, + GlobalCounterId counter_type); + void operator++() const; + + private: + GlobalCounterId counter_type_; + utils::SharedPtr<StatisticsManager> statistics_manager_; +}; + +class AppCounter { + public: + AppCounter(utils::SharedPtr<StatisticsManager> statistics_manager, + const std::string& app_id, + AppCounterId counter_type); + void operator++() const; + + private: + std::string app_id_; + AppCounterId counter_type_; + utils::SharedPtr<StatisticsManager> statistics_manager_; +}; + +class AppInfo { + public: + AppInfo(utils::SharedPtr<StatisticsManager> statistics_manager, + const std::string& app_id, + AppInfoId info_type); + void Update(const std::string& new_info) const; + + private: + std::string app_id_; + AppInfoId info_type_; + utils::SharedPtr<StatisticsManager> statistics_manager_; +}; + +class AppStopwatchImpl : public AppStopwatch { + public: + AppStopwatchImpl(utils::SharedPtr<StatisticsManager> statistics_manager, + const std::string& app_id); + AppStopwatchImpl(utils::SharedPtr<StatisticsManager> statistics_manager, + const std::string& app_id, + std::uint32_t timeout); + ~AppStopwatchImpl(); + void Start(AppStopwatchId stopwatch_type) OVERRIDE; + void Switch(AppStopwatchId stopwatch_type) OVERRIDE; + void WriteTime() OVERRIDE; + + private: + // Fields + std::string app_id_; + AppStopwatchId stopwatch_type_; + utils::SharedPtr<StatisticsManager> statistics_manager_; + timer::Timer timer_; + const std::uint32_t time_out_; + DISALLOW_COPY_AND_ASSIGN(AppStopwatchImpl); +}; + +} // namespace usage_statistics + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_USAGE_STATISTICS_COUNTER_H_ diff --git a/src/components/policy/policy_external/include/policy/user_consent_manager.h b/src/components/policy/policy_external/include/policy/user_consent_manager.h new file mode 100644 index 0000000000..0f242738b6 --- /dev/null +++ b/src/components/policy/policy_external/include/policy/user_consent_manager.h @@ -0,0 +1,44 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_USER_CONSENT_MANAGER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_USER_CONSENT_MANAGER_H_ + +namespace policy { +class UserConsentManager { + public: + UserConsentManager() {} + ~UserConsentManager() {} +}; +} // namespace policy + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_INCLUDE_POLICY_USER_CONSENT_MANAGER_H_ diff --git a/src/components/policy/policy_external/specification.txt b/src/components/policy/policy_external/specification.txt new file mode 100644 index 0000000000..b00a2932e0 --- /dev/null +++ b/src/components/policy/policy_external/specification.txt @@ -0,0 +1 @@ +https://adc.luxoft.com/confluence/display/APPLINK/Policy+Manager+Specification diff --git a/src/components/policy/policy_external/src/cache_manager.cc b/src/components/policy/policy_external/src/cache_manager.cc new file mode 100644 index 0000000000..85c9519a06 --- /dev/null +++ b/src/components/policy/policy_external/src/cache_manager.cc @@ -0,0 +1,2289 @@ +/* + * Copyright (c) 2014, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "policy/cache_manager.h" + +#include <algorithm> +#include <functional> +#include <ctime> +#include <cmath> + +#include "utils/file_system.h" +#include "json/reader.h" +#include "json/features.h" +#include "json/writer.h" +#include "utils/logger.h" +#include "utils/date_time.h" +#include "utils/gen_hash.h" +#include "utils/threads/thread.h" +#include "utils/threads/thread_delegate.h" +#include "rpc_base/rpc_base.h" +#include "policy/policy_table/enums.h" +#include "policy/policy_helper.h" +#include "policy/sql_pt_ext_representation.h" + +namespace policy_table = rpc::policy_table_interface_base; + +namespace policy { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +#define CACHE_MANAGER_CHECK(return_value) \ + { \ + if (!pt_) { \ + LOG4CXX_WARN(logger_, "The cache manager is not initialized"); \ + return return_value; \ + } \ + } + +#define CACHE_MANAGER_CHECK_VOID() \ + { \ + if (!pt_) { \ + LOG4CXX_WARN(logger_, "The cache manager is not initialized"); \ + return; \ + } \ + } + +struct LanguageFinder { + explicit LanguageFinder(const std::string& language) : language_(language) {} + bool operator()(const policy_table::Languages::value_type& lang) const { + return !strcasecmp(language_.c_str(), lang.first.c_str()); + } + + private: + const std::string& language_; +}; + +policy_table::MessageString FindLanguage( + const policy_table::MessageLanguages& msg_languages, + const std::string& lang) { + LanguageFinder finder(lang); + policy_table::Languages::const_iterator it = std::find_if( + msg_languages.languages.begin(), msg_languages.languages.end(), finder); + return (msg_languages.languages.end() == it) ? policy_table::MessageString() + : it->second; +} + +CacheManager::CacheManager() + : CacheManagerInterface() + , pt_(new policy_table::Table) + , backup_(new SQLPTExtRepresentation()) + , update_required(false) { + InitBackupThread(); +} + +CacheManager::CacheManager(bool in_memory) + : CacheManagerInterface() + , pt_(new policy_table::Table) + , backup_(new SQLPTExtRepresentation(in_memory)) + , update_required(false) { + InitBackupThread(); +} + +CacheManager::~CacheManager() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(backuper_locker_); + backup_thread_->join(); + delete backup_thread_->delegate(); + threads::DeleteThread(backup_thread_); +} + +bool CacheManager::CanAppKeepContext(const std::string& app_id) const { + CACHE_MANAGER_CHECK(false); + bool result = false; + if (kDeviceId == app_id) { + result = pt_->policy_table.app_policies_section.device.keep_context; + } else if (IsApplicationRepresented(app_id)) { + result = pt_->policy_table.app_policies_section.apps[app_id].keep_context; + } + return result; +} + +uint32_t CacheManager::HeartBeatTimeout(const std::string& app_id) const { + CACHE_MANAGER_CHECK(0); + uint32_t result = 0; + if (!IsApplicationRepresented(app_id)) { + return result; + } + + const policy_table::ApplicationPolicies::mapped_type& app = + pt_->policy_table.app_policies_section.apps[app_id]; + if (app.heart_beat_timeout_ms.is_initialized()) { + result = *(app.heart_beat_timeout_ms); + } + + return result; +} + +bool CacheManager::CanAppStealFocus(const std::string& app_id) const { + CACHE_MANAGER_CHECK(false); + bool result = false; + if (kDeviceId == app_id) { + result = pt_->policy_table.app_policies_section.device.steal_focus; + } else if (IsApplicationRepresented(app_id)) { + result = pt_->policy_table.app_policies_section.apps[app_id].steal_focus; + } + return result; +} + +bool CacheManager::GetDefaultHMI(const std::string& app_id, + std::string& default_hmi) const { + CACHE_MANAGER_CHECK(false); + bool result = false; + default_hmi.clear(); + if (kDeviceId == app_id) { + default_hmi = EnumToJsonString( + pt_->policy_table.app_policies_section.device.default_hmi); + } else if (IsApplicationRepresented(app_id)) { + default_hmi = EnumToJsonString( + pt_->policy_table.app_policies_section.apps[app_id].default_hmi); + } + result = !default_hmi.empty(); + + return result; +} + +bool CacheManager::ResetUserConsent() { + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock lock(cache_lock_); + policy_table::DeviceData::iterator iter = + pt_->policy_table.device_data->begin(); + policy_table::DeviceData::iterator iter_end = + pt_->policy_table.device_data->end(); + + for (; iter != iter_end; ++iter) { + iter->second.user_consent_records->clear(); + } + return true; +} + +bool CacheManager::GetUserPermissionsForDevice( + const std::string& device_id, + StringArray& consented_groups, + StringArray& disallowed_groups) const { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + policy_table::DeviceData& device_data = *pt_->policy_table.device_data; + if (device_data.end() == device_data.find(device_id)) { + LOG4CXX_ERROR(logger_, + "Device with " << device_id << "was not found in PT"); + return false; + } + const policy_table::DeviceParams& params = device_data[device_id]; + const policy_table::UserConsentRecords& ucr = *(params.user_consent_records); + policy_table::UserConsentRecords::const_iterator iter = ucr.begin(); + policy_table::UserConsentRecords::const_iterator iter_end = ucr.end(); + + for (; iter != iter_end; ++iter) { + policy_table::ConsentGroups::const_iterator con_iter; + policy_table::ConsentGroups::const_iterator con_iter_end; + + con_iter = (*iter).second.consent_groups->begin(); + con_iter_end = (*iter).second.consent_groups->end(); + for (; con_iter != con_iter_end; ++con_iter) { + if (true == (*con_iter).second) { + consented_groups.push_back((*con_iter).first); + } else { + disallowed_groups.push_back((*con_iter).first); + } + } + } + return true; +} + +void CacheManager::GetAllAppGroups(const std::string& app_id, + FunctionalGroupIDs& all_group_ids) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + if (kDeviceId == app_id) { + policy_table::DevicePolicy& device = + pt_->policy_table.app_policies_section.device; + + policy_table::Strings::const_iterator iter = device.groups.begin(); + policy_table::Strings::const_iterator iter_end = device.groups.end(); + + for (; iter != iter_end; ++iter) { + const uint32_t group_id = + static_cast<uint32_t>((utils::Djb2HashFromString(*iter))); + all_group_ids.push_back(group_id); + } + + return; + } + + policy_table::ApplicationPolicies::const_iterator app_params_iter = + pt_->policy_table.app_policies_section.apps.find(app_id); + + if (pt_->policy_table.app_policies_section.apps.end() != app_params_iter) { + policy_table::Strings::const_iterator iter = + (*app_params_iter).second.groups.begin(); + policy_table::Strings::const_iterator iter_end = + (*app_params_iter).second.groups.end(); + + for (; iter != iter_end; ++iter) { + const uint32_t group_id = + static_cast<uint32_t>((utils::Djb2HashFromString(*iter))); + all_group_ids.push_back(group_id); + } + } +} + +void CacheManager::GetPreConsentedGroups( + const std::string& app_id, FunctionalGroupIDs& preconsented_groups) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + if (kDeviceId == app_id) { + policy_table::DevicePolicy& device = + pt_->policy_table.app_policies_section.device; + + policy_table::Strings::const_iterator iter = + device.preconsented_groups->begin(); + policy_table::Strings::const_iterator iter_end = + device.preconsented_groups->end(); + + for (; iter != iter_end; ++iter) { + const uint32_t group_id = + static_cast<uint32_t>((utils::Djb2HashFromString(*iter))); + preconsented_groups.push_back(group_id); + } + + return; + } + + policy_table::ApplicationPolicies::const_iterator app_param_iter = + pt_->policy_table.app_policies_section.apps.find(app_id); + if (pt_->policy_table.app_policies_section.apps.end() != app_param_iter) { + policy_table::Strings::const_iterator iter = + (*app_param_iter).second.preconsented_groups->begin(); + policy_table::Strings::const_iterator iter_end = + (*app_param_iter).second.preconsented_groups->end(); + for (; iter != iter_end; ++iter) { + const int32_t group_id = utils::Djb2HashFromString(*iter); + + preconsented_groups.push_back(group_id); + } + } +} + +void CacheManager::GetConsentedGroups(const std::string& device_id, + const std::string& app_id, + FunctionalGroupIDs& allowed_groups, + FunctionalGroupIDs& disallowed_groups) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + policy_table::DeviceData::iterator dev_params_iter = + pt_->policy_table.device_data->find(device_id); + + if (pt_->policy_table.device_data->end() != dev_params_iter) { + const policy_table::DeviceParams& dev_par = (*dev_params_iter).second; + + policy_table::UserConsentRecords::const_iterator iter = + dev_par.user_consent_records->find(app_id); + + if (dev_par.user_consent_records->end() != iter) { + policy_table::ConsentGroups::const_iterator consent_iter = + (*iter).second.consent_groups->begin(); + policy_table::ConsentGroups::const_iterator consent_iter_end = + (*iter).second.consent_groups->end(); + + for (; consent_iter != consent_iter_end; ++consent_iter) { + const int32_t group_id = + utils::Djb2HashFromString((*consent_iter).first); + + if (true == (*consent_iter).second) { + allowed_groups.push_back(group_id); + } else { + disallowed_groups.push_back(group_id); + } + } + } + } +} + +void CacheManager::GetUnconsentedGroups( + const std::string& device_id, + const std::string& policy_app_id, + FunctionalGroupIDs& unconsented_groups) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + + if (!IsApplicationRepresented(policy_app_id)) { + LOG4CXX_WARN(logger_, + "The application with app_id: " << policy_app_id + << " is not reresented"); + return; + } + + policy_table::Strings::iterator iter_groups; + policy_table::Strings::iterator iter_groups_end; + if (kDeviceId == policy_app_id) { + iter_groups = pt_->policy_table.app_policies_section.device.groups.begin(); + iter_groups_end = + pt_->policy_table.app_policies_section.device.groups.end(); + } else { + iter_groups = pt_->policy_table.app_policies_section.apps[policy_app_id] + .groups.begin(); + iter_groups_end = + pt_->policy_table.app_policies_section.apps[policy_app_id].groups.end(); + } + + for (; iter_groups != iter_groups_end; ++iter_groups) { + // Try to find app-specific group in common groups list; + policy_table::FunctionalGroupings::const_iterator func_groups = + pt_->policy_table.functional_groupings.find(*iter_groups); + if (pt_->policy_table.functional_groupings.end() != func_groups) { + // Check if groups have user consents field. + if (func_groups->second.user_consent_prompt.is_initialized()) { + // Try to find certain group among already consented groups. + policy_table::DeviceData::const_iterator device_iter = + pt_->policy_table.device_data->find(device_id); + if (pt_->policy_table.device_data->end() != device_iter) { + policy_table::UserConsentRecords::const_iterator ucr_iter = + device_iter->second.user_consent_records->find(policy_app_id); + if (device_iter->second.user_consent_records->end() != ucr_iter) { + if ((*ucr_iter).second.consent_groups->end() == + (*ucr_iter).second.consent_groups->find(*iter_groups)) { + unconsented_groups.push_back( + utils::Djb2HashFromString(*iter_groups)); + } + } else { + unconsented_groups.push_back( + utils::Djb2HashFromString(*iter_groups)); + } + } + } + } + } +} + +void CacheManager::RemoveAppConsentForGroup(const std::string& app_id, + const std::string& group_name) { + CACHE_MANAGER_CHECK_VOID(); + policy_table::DeviceData::iterator device_iter = + pt_->policy_table.device_data->begin(); + policy_table::DeviceData::iterator device_iter_end = + pt_->policy_table.device_data->end(); + + policy_table::UserConsentRecords::iterator ucr_iter; + for (; device_iter != device_iter_end; ++device_iter) { + ucr_iter = device_iter->second.user_consent_records->find(app_id); + if (device_iter->second.user_consent_records->end() != ucr_iter) { + ucr_iter->second.consent_groups->erase(group_name); + } + } +} + +using rpc::policy_table_interface_base::RequestTypes; +using rpc::policy_table_interface_base::RequestType; + +void CacheManager::ProcessUpdate( + const policy_table::ApplicationPolicies::const_iterator + initial_policy_iter) { + using namespace policy; + const RequestTypes& new_request_types = + *(initial_policy_iter->second.RequestType); + + const std::string& app_id = initial_policy_iter->first; + RequestTypes merged_pt_request_types; + + if (app_id == kDefaultId || app_id == kPreDataConsentId) { + if (new_request_types.is_omitted()) { + LOG4CXX_INFO(logger_, + "Application " << app_id + << " has omitted RequestTypes." + " Previous values will be kept."); + return; + } + if (new_request_types.empty()) { + if (new_request_types.is_cleaned_up()) { + LOG4CXX_INFO(logger_, + "Application " << app_id + << " has cleaned up all values." + " Previous values will be kept."); + return; + } + LOG4CXX_INFO(logger_, + "Application " << app_id + << " has empty RequestTypes." + " Any parameter will be allowed."); + } + merged_pt_request_types = new_request_types; + } else { + merged_pt_request_types = new_request_types; + } + pt_->policy_table.app_policies_section.apps[app_id] = + initial_policy_iter->second; + *(pt_->policy_table.app_policies_section.apps[app_id].RequestType) = + merged_pt_request_types; +} + +bool CacheManager::ApplyUpdate(const policy_table::Table& update_pt) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock auto_lock(cache_lock_); + pt_->policy_table.functional_groupings = + update_pt.policy_table.functional_groupings; + + policy_table::ApplicationPolicies::const_iterator iter = + update_pt.policy_table.app_policies_section.apps.begin(); + policy_table::ApplicationPolicies::const_iterator iter_end = + update_pt.policy_table.app_policies_section.apps.end(); + + for (; iter != iter_end; ++iter) { + if (iter->second.is_null()) { + pt_->policy_table.app_policies_section.apps[iter->first] = + policy_table::ApplicationParams(); + pt_->policy_table.app_policies_section.apps[iter->first].set_to_null(); + pt_->policy_table.app_policies_section.apps[iter->first].set_to_string( + ""); + } else if (policy::kDefaultId == (iter->second).get_string()) { + policy_table::ApplicationPolicies::const_iterator iter_default = + update_pt.policy_table.app_policies_section.apps.find(kDefaultId); + if (update_pt.policy_table.app_policies_section.apps.end() == + iter_default) { + LOG4CXX_ERROR(logger_, "The default section was not found in PTU"); + continue; + } + ProcessUpdate(iter_default); + } else { + ProcessUpdate(iter); + } + } + + pt_->policy_table.app_policies_section.device = + update_pt.policy_table.app_policies_section.device; + + pt_->policy_table.module_config.SafeCopyFrom( + update_pt.policy_table.module_config); + + pt_->policy_table.consumer_friendly_messages.assign_if_valid( + update_pt.policy_table.consumer_friendly_messages); + + ResetCalculatedPermissions(); + Backup(); + + if (*pt_->policy_table.module_config.preloaded_pt && update_pt.is_valid()) { + *pt_->policy_table.module_config.preloaded_pt = false; + } + + return true; +} + +void CacheManager::GetHMIAppTypeAfterUpdate( + std::map<std::string, StringArray>& app_hmi_types) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + policy_table::ApplicationPolicies::const_iterator policy_iter_begin = + pt_->policy_table.app_policies_section.apps.begin(); + policy_table::ApplicationPolicies::const_iterator policy_iter_end = + pt_->policy_table.app_policies_section.apps.end(); + std::vector<std::string> transform_app_hmi_types; + for (; policy_iter_begin != policy_iter_end; ++policy_iter_begin) { + const policy_table::ApplicationParams& app_params = + (*policy_iter_begin).second; + if (app_params.AppHMIType.is_initialized()) { + if (!(transform_app_hmi_types.empty())) { + transform_app_hmi_types.clear(); + } + std::transform(app_params.AppHMIType->begin(), + app_params.AppHMIType->end(), + std::back_inserter(transform_app_hmi_types), + AppHMITypeToString()); + app_hmi_types[(*policy_iter_begin).first] = transform_app_hmi_types; + } + } +} + +bool CacheManager::AppHasHMIType(const std::string& application_id, + policy_table::AppHMIType hmi_type) const { + const policy_table::ApplicationPolicies& policies = + pt_->policy_table.app_policies_section.apps; + + policy_table::ApplicationPolicies::const_iterator policy_iter = + policies.find(application_id); + + if (policy_iter == policies.end()) { + return false; + } + + if (policy_iter->second.AppHMIType.is_initialized()) { + return helpers::in_range(*(policy_iter->second.AppHMIType), + rpc::Enum<policy_table::AppHMIType>(hmi_type)); + } + + return false; +} + +void CacheManager::Backup() { + sync_primitives::AutoLock lock(backuper_locker_); + DCHECK(backuper_); + backuper_->DoBackup(); +} + +std::string CacheManager::currentDateTime() { + time_t now = time(0); + struct tm tstruct; + char buf[80]; + tstruct = *localtime(&now); + // ISO_8601 format is expected, e.g. “2000-01-01T12:18:53Z” + strftime(buf, sizeof(buf), "%Y-%m-%dT%XZ", &tstruct); + return buf; +} + +bool CacheManager::GetPermissionsForApp(const std::string& device_id, + const std::string& app_id, + FunctionalIdType& group_types) { + LOG4CXX_AUTO_TRACE(logger_); + GetAllAppGroups(app_id, group_types[kTypeGeneral]); + GetAllAppGroups(kDefaultId, group_types[kTypeDefault]); + GetAllAppGroups(kPreDataConsentId, group_types[kTypePreDataConsented]); + GetPreConsentedGroups(app_id, group_types[kTypePreconsented]); + + GetConsentedGroups(device_id, + app_id, + group_types[kTypeAllowed], + group_types[kTypeDisallowed]); + + GetUnconsentedGroups(device_id, app_id, group_types[kTypeUnconsented]); + + GetAllAppGroups(kDeviceId, group_types[kTypeDevice]); + return true; +} + +bool CacheManager::GetDeviceGroupsFromPolicies( + policy_table::Strings& groups, + policy_table::Strings& preconsented_groups) const { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + groups = pt_->policy_table.app_policies_section.device.groups; + preconsented_groups = + *(pt_->policy_table.app_policies_section.device).preconsented_groups; + return true; +} + +bool CacheManager::IsDeviceConsentCached(const std::string& device_id) const { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock lock(cached_device_permissions_lock_); + CachedDevicePermissions::const_iterator cached_dev_consent_iter; + cached_dev_consent_iter = cached_device_permissions_.find(device_id); + return cached_dev_consent_iter != cached_device_permissions_.end(); +} + +DeviceConsent CacheManager::GetCachedDeviceConsent( + const std::string& device_id) const { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(cached_device_permissions_lock_); + DeviceConsent result = kDeviceHasNoConsent; + CACHE_MANAGER_CHECK(result); + CachedDevicePermissions::const_iterator cached_dev_consent_iter; + cached_dev_consent_iter = cached_device_permissions_.find(device_id); + if (cached_dev_consent_iter != cached_device_permissions_.end()) { + return cached_dev_consent_iter->second; + } + return result; +} + +void CacheManager::SaveDeviceConsentToCache(const std::string& device_id, + const bool is_allowed) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock lock(cached_device_permissions_lock_); + DeviceConsent result = is_allowed ? kDeviceAllowed : kDeviceDisallowed; + cached_device_permissions_[device_id] = result; +} + +bool CacheManager::GetPermissionsList(StringArray& perm_list) const { + // Get device permission groups from app_policies section, which hadn't been + // preconsented + policy_table::Strings groups; + policy_table::Strings preconsented_groups; + if (!GetDeviceGroupsFromPolicies(groups, preconsented_groups)) { + LOG4CXX_WARN(logger_, "Can't get device groups from policies."); + return false; + } + + std::for_each(groups.begin(), + groups.end(), + FunctionalGroupInserter(preconsented_groups, perm_list)); + return true; +} + +bool CacheManager::HasDeviceSpecifiedConsent(const std::string& device_id, + const bool is_allowed) const { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Device :" << device_id); + const DeviceConsent current_consent = GetDeviceConsent(device_id); + const bool is_current_device_allowed = + DeviceConsent::kDeviceAllowed == current_consent ? true : false; + + if (DeviceConsent::kDeviceHasNoConsent == current_consent || + is_current_device_allowed != is_allowed) { + return false; + } + const std::string consent = is_allowed ? "allowed" : "disallowed"; + LOG4CXX_INFO(logger_, + "DeviceGetDeviceGroupsFromPolicies is already " << consent + << "."); + return true; +} + +void CacheManager::SetDeviceConsent(const std::string& device_id, + const bool is_allowed) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + if (HasDeviceSpecifiedConsent(device_id, is_allowed)) { + return; + } + ResetCalculatedPermissionsForDevice(device_id); + // Remove unpaired mark, if device re-paired and re-consented again + if (is_allowed) { + SetUnpairedDevice(device_id, false); + } + + StringArray list_of_permissions; + if (!GetPermissionsList(list_of_permissions) || list_of_permissions.empty()) { + LOG4CXX_WARN(logger_, "List of permissions can't be received or empty"); + return; + } + + StringArray consented_groups; + StringArray disallowed_groups; + + // Supposed only one group for device date consent + if (is_allowed) { + consented_groups = list_of_permissions; + } else { + disallowed_groups = list_of_permissions; + } + + if (!SetUserPermissionsForDevice( + device_id, consented_groups, disallowed_groups)) { + LOG4CXX_WARN(logger_, "Can't set user consent for device"); + return; + } + SaveDeviceConsentToCache(device_id, is_allowed); +} + +DeviceConsent CacheManager::GetDeviceConsent( + const std::string& device_id) const { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(kDeviceHasNoConsent); + if (IsDeviceConsentCached(device_id)) { + return GetCachedDeviceConsent(device_id); + } + StringArray list_of_permissions; + if (!GetPermissionsList(list_of_permissions)) { + return kDeviceDisallowed; + } + + // Check device permission groups for user consent in device_data + // section + if (list_of_permissions.empty()) { + return kDeviceAllowed; + } + StringArray consented_groups; + StringArray disallowed_groups; + if (!GetUserPermissionsForDevice( + device_id, consented_groups, disallowed_groups)) { + return kDeviceDisallowed; + } + + if (consented_groups.empty() && disallowed_groups.empty()) { + return kDeviceHasNoConsent; + } + + std::sort(list_of_permissions.begin(), list_of_permissions.end()); + std::sort(consented_groups.begin(), consented_groups.end()); + + StringArray to_be_consented_by_user; + std::set_difference(list_of_permissions.begin(), + list_of_permissions.end(), + consented_groups.begin(), + consented_groups.end(), + std::back_inserter(to_be_consented_by_user)); + if (to_be_consented_by_user.empty()) { + return kDeviceAllowed; + } + return kDeviceDisallowed; +} + +bool CacheManager::AddDevice(const std::string& device_id, + const std::string& connection_type) { + LOG4CXX_AUTO_TRACE(logger_); + + sync_primitives::AutoLock auto_lock(cache_lock_); + CACHE_MANAGER_CHECK(false); + policy_table::DeviceParams& params = + (*(pt_->policy_table.device_data))[device_id]; + *params.connection_type = connection_type; + + // We have to set preloaded flag as false in policy table on adding new + // information (SDLAQ-CRS-2365). It can happens only after device addition. + *pt_->policy_table.module_config.preloaded_pt = false; + + Backup(); + return true; +} + +bool CacheManager::SetDeviceData(const std::string& device_id, + const std::string& hardware, + const std::string& firmware, + const std::string& os, + const std::string& os_version, + const std::string& carrier, + const uint32_t number_of_ports, + const std::string& connection_type) { + LOG4CXX_AUTO_TRACE(logger_); + + sync_primitives::AutoLock auto_lock(cache_lock_); + CACHE_MANAGER_CHECK(false); + + if (pt_->policy_table.device_data->end() == + pt_->policy_table.device_data->find(device_id)) { + LOG4CXX_ERROR(logger_, "Unable to find mobile device: " << device_id); + return false; + } + + policy_table::DeviceParams& params = + (*(pt_->policy_table.device_data))[device_id]; + *params.hardware = hardware; + *params.firmware_rev = firmware; + *params.os = os; + *params.os_version = os_version; + *params.carrier = carrier; + *params.max_number_rfcom_ports = number_of_ports; + *params.connection_type = connection_type; + + Backup(); + return true; +} + +bool CacheManager::SetUserPermissionsForDevice( + const std::string& device_id, + const StringArray& consented_groups, + const StringArray& disallowed_groups) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(cache_lock_); + CACHE_MANAGER_CHECK(false); + policy_table::DeviceParams& params = + (*pt_->policy_table.device_data)[device_id]; + policy_table::UserConsentRecords& ucr = *(params.user_consent_records); + + StringArray::const_iterator consent_iter_end = consented_groups.end(); + StringArray::const_iterator consent_iter = consented_groups.begin(); + StringArray::const_iterator un_consent_iter_end = disallowed_groups.end(); + StringArray::const_iterator un_consent_iter = disallowed_groups.begin(); + + for (; consent_iter != consent_iter_end; ++consent_iter) { + (*ucr[kDeviceId].consent_groups)[*consent_iter] = true; + } + + for (; un_consent_iter != un_consent_iter_end; ++un_consent_iter) { + (*ucr[kDeviceId].consent_groups)[*un_consent_iter] = false; + } + + policy_table::UserConsentRecords::iterator ucr_iter = ucr.begin(); + policy_table::UserConsentRecords::iterator ucr_iter_end = ucr.end(); + // TODO(AGaliuzov): Get this info from external data + for (; ucr_iter != ucr_iter_end; ++ucr_iter) { + *ucr_iter->second.input = policy_table::Input::I_GUI; + *ucr_iter->second.time_stamp = currentDateTime(); + } + Backup(); + return true; +} + +bool CacheManager::ReactOnUserDevConsentForApp(const std::string& app_id, + bool is_device_allowed) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + bool result = true; + if (is_device_allowed) { + // If app has pre_DataConsented groups it should be 'promoted' to default + if (IsPredataPolicy(app_id)) { + result = SetDefaultPolicy(app_id); + } + } else { + SetIsPredata(app_id); + } + Backup(); + return result; +} + +void CacheManager::GetGroupNameByHashID(const int32_t group_id, + std::string& group_name) { + CACHE_MANAGER_CHECK_VOID(); + policy_table::FunctionalGroupings::const_iterator fg_iter = + pt_->policy_table.functional_groupings.begin(); + policy_table::FunctionalGroupings::const_iterator fg_iter_end = + pt_->policy_table.functional_groupings.end(); + + for (; fg_iter != fg_iter_end; ++fg_iter) { + const int32_t id = utils::Djb2HashFromString((*fg_iter).first); + if (group_id == id) { + group_name = (*fg_iter).first; + } + } +} + +bool CacheManager::SetUserPermissionsForApp( + const PermissionConsent& permissions) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(cache_lock_); + CACHE_MANAGER_CHECK(false); + std::vector<FunctionalGroupPermission>::const_iterator iter = + permissions.group_permissions.begin(); + std::vector<FunctionalGroupPermission>::const_iterator iter_end = + permissions.group_permissions.end(); + + std::string group_name; + for (; iter != iter_end; ++iter) { + if (policy::kGroupUndefined != (*iter).state) { + policy_table::DeviceParams& params = + (*pt_->policy_table.device_data)[permissions.device_id]; + rpc::policy_table_interface_base::ConsentRecords& ucr = + (*params.user_consent_records)[permissions.policy_app_id]; + + GetGroupNameByHashID((*iter).group_id, group_name); + + (*ucr.consent_groups)[group_name] = + ((*iter).state == policy::kGroupAllowed); + *ucr.input = policy_table::Input::I_GUI; + *ucr.time_stamp = currentDateTime(); + } + } + Backup(); + return true; +} + +bool CacheManager::UpdateRequired() const { + return update_required; +} + +void CacheManager::SaveUpdateRequired(bool status) { + update_required = status; + Backup(); +} + +bool CacheManager::IsApplicationRevoked(const std::string& app_id) const { + CACHE_MANAGER_CHECK(false); + if (!IsApplicationRepresented(app_id)) { + return false; + } + const bool is_revoked = + pt_->policy_table.app_policies_section.apps[app_id].is_null(); + return is_revoked; +} + +void CacheManager::CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + + if (!IsApplicationRepresented(app_id)) { + LOG4CXX_ERROR( + logger_, "Application id " << app_id << " was not found in policy DB."); + return; + } + + policy_table::Strings::const_iterator app_groups_iter = + pt_->policy_table.app_policies_section.apps[app_id].groups.begin(); + + policy_table::Strings::const_iterator app_groups_iter_end = + pt_->policy_table.app_policies_section.apps[app_id].groups.end(); + + policy_table::FunctionalGroupings::const_iterator concrete_group; + + for (; app_groups_iter != app_groups_iter_end; ++app_groups_iter) { + concrete_group = + pt_->policy_table.functional_groupings.find(*app_groups_iter); + if (pt_->policy_table.functional_groupings.end() != concrete_group) { + const policy_table::Rpcs& rpcs = concrete_group->second; + + policy_table::Rpc::const_iterator rpc_iter = rpcs.rpcs.find(rpc); + if (rpcs.rpcs.end() != rpc_iter) { + policy_table::RpcParameters rpc_param = rpc_iter->second; + + policy_table::HmiLevel hmi_level_e; + policy_table::EnumFromJsonString(hmi_level, &hmi_level_e); + + policy_table::HmiLevels::const_iterator hmi_iter = + std::find(rpc_param.hmi_levels.begin(), + rpc_param.hmi_levels.end(), + hmi_level_e); + + if (rpc_param.hmi_levels.end() != hmi_iter) { + result.hmi_level_permitted = PermitResult::kRpcAllowed; + + policy_table::Parameters::const_iterator params_iter = + rpc_param.parameters->begin(); + policy_table::Parameters::const_iterator params_iter_end = + rpc_param.parameters->end(); + + for (; params_iter != params_iter_end; ++params_iter) { + result.list_of_allowed_params.insert( + policy_table::EnumToJsonString(*params_iter)); + } + } + } + } + } +} + +bool CacheManager::IsPTPreloaded() { + CACHE_MANAGER_CHECK(false); + return *pt_->policy_table.module_config.preloaded_pt; +} + +int CacheManager::IgnitionCyclesBeforeExchange() { + CACHE_MANAGER_CHECK(0); + const uint8_t limit = std::max( + static_cast<int>( + pt_->policy_table.module_config.exchange_after_x_ignition_cycles), + 0); + LOG4CXX_DEBUG( + logger_, + "IgnitionCyclesBeforeExchange limit:" << static_cast<int>(limit)); + uint8_t current = 0; + + const int last_exch = static_cast<int>( + *pt_->policy_table.module_meta->ignition_cycles_since_last_exchange); + current = std::max(last_exch, 0); + LOG4CXX_DEBUG( + logger_, + "IgnitionCyclesBeforeExchange current:" << static_cast<int>(current)); + + return std::max(limit - current, 0); +} + +int CacheManager::KilometersBeforeExchange(int current) { + CACHE_MANAGER_CHECK(0); + const int limit = + std::max(static_cast<int>( + pt_->policy_table.module_config.exchange_after_x_kilometers), + 0); + LOG4CXX_DEBUG(logger_, "KilometersBeforeExchange limit:" << limit); + int last = 0; + + const int odo_val = static_cast<int>( + *pt_->policy_table.module_meta->pt_exchanged_at_odometer_x); + last = std::max(odo_val, 0); + LOG4CXX_DEBUG(logger_, "KilometersBeforeExchange last:" << last); + + const int actual = std::max((current - last), 0); + LOG4CXX_DEBUG(logger_, "KilometersBeforeExchange actual:" << actual); + return std::max(limit - actual, 0); +} + +bool CacheManager::SetCountersPassedForSuccessfulUpdate( + policy::Counters counter, int value) { + CACHE_MANAGER_CHECK(false); + switch (counter) { + case KILOMETERS: + *pt_->policy_table.module_meta->pt_exchanged_at_odometer_x = value; + LOG4CXX_DEBUG(logger_, + "SetCountersPassedForSuccessfulUpdate km:" << value); + break; + case DAYS_AFTER_EPOCH: + *pt_->policy_table.module_meta->pt_exchanged_x_days_after_epoch = value; + LOG4CXX_DEBUG( + logger_, + "SetCountersPassedForSuccessfulUpdate days after epoch:" << value); + break; + default: + LOG4CXX_ERROR(logger_, + "Unknown counter was requested to set: " << counter); + return false; + } + + Backup(); + return true; +} + +int CacheManager::DaysBeforeExchange(uint16_t current) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(0); + const uint8_t limit = pt_->policy_table.module_config.exchange_after_x_days; + LOG4CXX_DEBUG(logger_, + "Exchange after: " << static_cast<int>(limit) << " days"); + + const uint16_t days_after_epoch = + (*pt_->policy_table.module_meta->pt_exchanged_x_days_after_epoch); + LOG4CXX_DEBUG(logger_, "Epoch since last update: " << days_after_epoch); + + const uint16_t actual = + std::max(static_cast<uint16_t>(current - days_after_epoch), uint16_t(0)); + LOG4CXX_DEBUG(logger_, "The days since last update: " << actual); + + return std::max(limit - actual, 0); +} + +void CacheManager::IncrementIgnitionCycles() { + CACHE_MANAGER_CHECK_VOID(); + const int ign_val = static_cast<int>( + *pt_->policy_table.module_meta->ignition_cycles_since_last_exchange); + (*pt_->policy_table.module_meta->ignition_cycles_since_last_exchange) = + ign_val + 1; + LOG4CXX_DEBUG(logger_, "IncrementIgnitionCycles ignitions:" << ign_val); + Backup(); +} + +void CacheManager::ResetIgnitionCycles() { + CACHE_MANAGER_CHECK_VOID(); + (*pt_->policy_table.module_meta->ignition_cycles_since_last_exchange) = 0; + Backup(); +} + +int CacheManager::TimeoutResponse() { + CACHE_MANAGER_CHECK(0); + return pt_->policy_table.module_config.timeout_after_x_seconds * + date_time::DateTime::MILLISECONDS_IN_SECOND; +} + +bool CacheManager::SecondsBetweenRetries(std::vector<int>& seconds) { + CACHE_MANAGER_CHECK(false); + rpc::policy_table_interface_base::SecondsBetweenRetries::iterator iter = + pt_->policy_table.module_config.seconds_between_retries.begin(); + rpc::policy_table_interface_base::SecondsBetweenRetries::iterator iter_end = + pt_->policy_table.module_config.seconds_between_retries.end(); + + const std::size_t size = + pt_->policy_table.module_config.seconds_between_retries.size(); + seconds.reserve(size); + for (; iter != iter_end; ++iter) { + seconds.push_back(*iter); + } + return true; +} + +const policy::VehicleInfo CacheManager::GetVehicleInfo() const { + CACHE_MANAGER_CHECK(VehicleInfo()); + policy_table::ModuleConfig& module_config = pt_->policy_table.module_config; + VehicleInfo vehicle_info; + vehicle_info.vehicle_make = *module_config.vehicle_make; + vehicle_info.vehicle_model = *module_config.vehicle_model; + vehicle_info.vehicle_year = *module_config.vehicle_year; + LOG4CXX_DEBUG( + logger_, + "Vehicle info (make, model, year):" << vehicle_info.vehicle_make << "," + << vehicle_info.vehicle_model << "," + << vehicle_info.vehicle_year); + return vehicle_info; +} + +std::vector<UserFriendlyMessage> CacheManager::GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, + const std::string& language, + const std::string& active_hmi_language) { + LOG4CXX_AUTO_TRACE(logger_); + std::vector<UserFriendlyMessage> result; + CACHE_MANAGER_CHECK(result); + + std::vector<std::string>::const_iterator it = msg_codes.begin(); + std::vector<std::string>::const_iterator it_end = msg_codes.end(); + for (; it != it_end; ++it) { + policy_table::MessageLanguages msg_languages = + (*pt_->policy_table.consumer_friendly_messages->messages)[*it]; + + // If message has no records with required language, fallback language + // should be used instead. + policy_table::MessageString message_string = + FindLanguage(msg_languages, language); + + if (!message_string.is_valid()) { + LOG4CXX_WARN(logger_, + "Language " + << language + << " haven't been found for message code: " << *it); + policy_table::MessageString active_hmi_language_message_string = + FindLanguage(msg_languages, active_hmi_language); + if (!active_hmi_language_message_string.is_valid()) { + LOG4CXX_WARN(logger_, + "Active hmi language " + << active_hmi_language + << " haven't been found for message code: " << *it); + + policy_table::MessageString fallback_message_string = + FindLanguage(msg_languages, "en-us"); + if (!fallback_message_string.is_valid()) { + LOG4CXX_ERROR(logger_, + "No fallback language found for message code: " << *it); + continue; + } + message_string = fallback_message_string; + } + message_string = active_hmi_language_message_string; + } + + UserFriendlyMessage msg; + msg.message_code = *it; + msg.tts = *message_string.tts; + msg.label = *message_string.label; + msg.line1 = *message_string.line1; + msg.line2 = *message_string.line2; + msg.text_body = *message_string.textBody; + + result.push_back(msg); + } + return result; +} + +void CacheManager::GetUpdateUrls(const uint32_t service_type, + EndpointUrls& out_end_points) { + std::stringstream service_type_stream; + service_type_stream << (service_type <= 9 ? "0x0" : "0x") << service_type; + + const std::string service_type_str = service_type_stream.str(); + GetUpdateUrls(service_type_str, out_end_points); +} + +void CacheManager::GetUpdateUrls(const std::string& service_type, + EndpointUrls& out_end_points) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + + LOG4CXX_DEBUG(logger_, "Search service value is: " << service_type); + + policy_table::ServiceEndpoints::const_iterator iter = + pt_->policy_table.module_config.endpoints.find(service_type); + + if (pt_->policy_table.module_config.endpoints.end() != iter) { + policy_table::URLList::const_iterator url_list_iter = + (*iter).second.begin(); + policy_table::URLList::const_iterator url_list_iter_end = + (*iter).second.end(); + for (; url_list_iter != url_list_iter_end; ++url_list_iter) { + EndpointData data; + data.app_id = (*url_list_iter).first; + std::copy((*url_list_iter).second.begin(), + (*url_list_iter).second.end(), + std::back_inserter(data.url)); + + out_end_points.push_back(data); + } + } +} + +std::string CacheManager::GetLockScreenIconUrl() const { + if (backup_) { + return backup_->GetLockScreenIconUrl(); + } + return std::string(""); +} + +rpc::policy_table_interface_base::NumberOfNotificationsType +CacheManager::GetNotificationsNumber(const std::string& priority) { + CACHE_MANAGER_CHECK(0); + typedef rpc::policy_table_interface_base::NumberOfNotificationsPerMinute NNPM; + + const NNPM& nnpm = + pt_->policy_table.module_config.notifications_per_minute_by_priority; + + NNPM::const_iterator priority_iter = nnpm.find(priority); + + const uint32_t result = + (nnpm.end() != priority_iter ? (*priority_iter).second : 0); + return result; +} + +bool CacheManager::GetPriority(const std::string& policy_app_id, + std::string& priority) const { + CACHE_MANAGER_CHECK(false); + if (kDeviceId == policy_app_id) { + priority = EnumToJsonString( + pt_->policy_table.app_policies_section.device.priority); + return true; + } + + const policy_table::ApplicationPolicies& policies = + pt_->policy_table.app_policies_section.apps; + + policy_table::ApplicationPolicies::const_iterator policy_iter = + policies.find(policy_app_id); + const bool app_id_exists = policies.end() != policy_iter; + if (app_id_exists) { + priority = EnumToJsonString((*policy_iter).second.priority); + } + + return app_id_exists; +} + +void CacheManager::CheckSnapshotInitialization() { + CACHE_MANAGER_CHECK_VOID(); + if (!snapshot_) { + LOG4CXX_ERROR(logger_, "Snapshot pointer is not initialized"); + return; + } + + *(snapshot_->policy_table.module_config.preloaded_pt) = false; + + // SDL must not send certificate in snapshot + snapshot_->policy_table.module_config.certificate = + rpc::Optional<rpc::String<0, 65535> >(); + + snapshot_->policy_table.consumer_friendly_messages->messages = + rpc::Optional<policy_table::Messages>(); + + rpc::Optional<policy_table::ModuleMeta>& module_meta = + snapshot_->policy_table.module_meta; + if (!module_meta->pt_exchanged_at_odometer_x->is_initialized()) { + *(module_meta->pt_exchanged_at_odometer_x) = 0; + } + if (!module_meta->ignition_cycles_since_last_exchange->is_initialized()) { + *(module_meta->ignition_cycles_since_last_exchange) = 0; + } + + if (!module_meta->pt_exchanged_x_days_after_epoch->is_initialized()) { + *(module_meta->pt_exchanged_x_days_after_epoch) = 0; + } + + rpc::Optional<policy_table::UsageAndErrorCounts>& usage_and_error_counts = + snapshot_->policy_table.usage_and_error_counts; + if (!usage_and_error_counts->count_of_iap_buffer_full->is_initialized()) { + *(usage_and_error_counts->count_of_iap_buffer_full) = 0; + } + + if (!usage_and_error_counts->count_of_sync_reboots->is_initialized()) { + *(usage_and_error_counts->count_of_sync_reboots) = 0; + } + + if (!usage_and_error_counts->count_sync_out_of_memory->is_initialized()) { + *(usage_and_error_counts->count_sync_out_of_memory) = 0; + } + + if (usage_and_error_counts->app_level->is_initialized()) { + policy_table::AppLevels::iterator it = + usage_and_error_counts->app_level->begin(); + policy_table::AppLevels::const_iterator it_end = + usage_and_error_counts->app_level->end(); + for (; it != it_end; ++it) { + if (!(*it).second.minutes_in_hmi_full.is_initialized()) { + (*it).second.minutes_in_hmi_full = 0; + } + + if (!(*it).second.app_registration_language_gui.is_initialized()) { + (*it).second.app_registration_language_gui = "unknown"; + } + + if (!(*it).second.app_registration_language_vui.is_initialized()) { + (*it).second.app_registration_language_vui = "unknown"; + } + + if (!(*it).second.minutes_in_hmi_limited.is_initialized()) { + (*it).second.minutes_in_hmi_limited = 0; + } + + if (!(*it).second.minutes_in_hmi_background.is_initialized()) { + (*it).second.minutes_in_hmi_background = 0; + } + + if (!(*it).second.minutes_in_hmi_none.is_initialized()) { + (*it).second.minutes_in_hmi_none = 0; + } + + if (!(*it).second.count_of_user_selections.is_initialized()) { + (*it).second.count_of_user_selections = 0; + } + + if (!(*it) + .second.count_of_rejections_sync_out_of_memory + .is_initialized()) { + (*it).second.count_of_rejections_sync_out_of_memory = 0; + } + + if (!(*it) + .second.count_of_rejections_nickname_mismatch.is_initialized()) { + (*it).second.count_of_rejections_nickname_mismatch = 0; + } + + if (!(*it).second.count_of_rejections_duplicate_name.is_initialized()) { + (*it).second.count_of_rejections_duplicate_name = 0; + } + + if (!(*it).second.count_of_rejected_rpc_calls.is_initialized()) { + (*it).second.count_of_rejected_rpc_calls = 0; + } + + if (!(*it).second.count_of_rpcs_sent_in_hmi_none.is_initialized()) { + (*it).second.count_of_rpcs_sent_in_hmi_none = 0; + } + + if (!(*it).second.count_of_removals_for_bad_behavior.is_initialized()) { + (*it).second.count_of_removals_for_bad_behavior = 0; + } + + if (!(*it).second.count_of_tls_errors.is_initialized()) { + (*it).second.count_of_tls_errors = 0; + } + + if (!(*it).second.count_of_run_attempts_while_revoked.is_initialized()) { + (*it).second.count_of_run_attempts_while_revoked = 0; + } + } + } +} + +void CacheManager::PersistData() { + LOG4CXX_AUTO_TRACE(logger_); + if (backup_.valid()) { + if (pt_.valid()) { + cache_lock_.Acquire(); + policy_table::Table copy_pt(*pt_); + cache_lock_.Release(); + + backup_->Save(copy_pt); + backup_->SaveUpdateRequired(update_required); + + policy_table::ApplicationPolicies::const_iterator app_policy_iter = + copy_pt.policy_table.app_policies_section.apps.begin(); + policy_table::ApplicationPolicies::const_iterator app_policy_iter_end = + copy_pt.policy_table.app_policies_section.apps.end(); + + bool is_revoked = false; + + for (; app_policy_iter != app_policy_iter_end; ++app_policy_iter) { + const std::string app_id = (*app_policy_iter).first; + + if (IsApplicationRepresented(app_id)) { + is_revoked = + copy_pt.policy_table.app_policies_section.apps[app_id].is_null(); + } + + const bool kIsDefaultPolicy = + IsApplicationRepresented(app_id) && + policy::kDefaultId == + copy_pt.policy_table.app_policies_section.apps[app_id] + .get_string(); + + // TODO(AOleynik): Remove this field from DB + const bool kIsPredataPolicy = + IsApplicationRepresented(app_id) && + policy::kPreDataConsentId == + copy_pt.policy_table.app_policies_section.apps[app_id] + .get_string(); + + backup_->SaveApplicationCustomData( + app_id, is_revoked, kIsDefaultPolicy, kIsPredataPolicy); + is_revoked = false; + } + + // In case of extended policy the meta info should be backuped as well. + if (ex_backup_.valid()) { + ex_backup_->SetMetaInfo( + *(*copy_pt.policy_table.module_meta).ccpu_version, + *(*copy_pt.policy_table.module_meta).wers_country_code, + *(*copy_pt.policy_table.module_meta).language); + ex_backup_->SetVINValue(*(*copy_pt.policy_table.module_meta).vin); + + // Save unpaired flag for devices + policy_table::DeviceData::const_iterator it_device = + copy_pt.policy_table.device_data->begin(); + policy_table::DeviceData::const_iterator it_end_device = + copy_pt.policy_table.device_data->end(); + +#ifdef ENABLE_LOG + policy_table::DeviceData& device_data = + *copy_pt.policy_table.device_data; + LOG4CXX_DEBUG(logger_, "Device_data size is: " << device_data.size()); +#endif // ENABLE_LOG + for (; it_device != it_end_device; ++it_device) { + if (is_unpaired_.end() != is_unpaired_.find(it_device->first)) { + ex_backup_->SetUnpairedDevice(it_device->first, true); + } else { + ex_backup_->SetUnpairedDevice(it_device->first, false); + } + } + LOG4CXX_DEBUG(logger_, "Device_data size is: " << device_data.size()); + } + backup_->WriteDb(); + } + } +} + +void CacheManager::ResetCalculatedPermissions() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(calculated_permissions_lock_); + calculated_permissions_.clear(); +} + +void CacheManager::ResetCalculatedPermissionsForDevice( + const std::string& device_id) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(calculated_permissions_lock_); + calculated_permissions_.erase(device_id); +} + +void CacheManager::AddCalculatedPermissions(const std::string& device_id, + const std::string& policy_app_id, + const Permissions& permissions) { + LOG4CXX_DEBUG(logger_, + "AddCalculatedPermissions for device: " + << device_id << " and app: " << policy_app_id); + sync_primitives::AutoLock lock(calculated_permissions_lock_); + calculated_permissions_[device_id][policy_app_id] = permissions; +} + +bool CacheManager::IsPermissionsCalculated(const std::string& device_id, + const std::string& policy_app_id, + Permissions& permission) { + LOG4CXX_DEBUG(logger_, + "IsPermissionsCalculated for device: " + << device_id << " and app: " << policy_app_id); + sync_primitives::AutoLock lock(calculated_permissions_lock_); + CalculatedPermissions::const_iterator it = + calculated_permissions_.find(device_id); + + if (calculated_permissions_.end() == it) { + return false; + } + + AppCalculatedPermissions::const_iterator app_it = + (*it).second.find(policy_app_id); + if ((*it).second.end() == app_it) { + return false; + } else { + permission = (*app_it).second; + return true; + } + return false; +} + +utils::SharedPtr<policy_table::Table> CacheManager::GenerateSnapshot() { + CACHE_MANAGER_CHECK(snapshot_); + sync_primitives::AutoLock lock(cache_lock_); + snapshot_ = new policy_table::Table(); + snapshot_->policy_table = pt_->policy_table; + + snapshot_->SetPolicyTableType(policy_table::PT_SNAPSHOT); + + CheckSnapshotInitialization(); + return snapshot_; +} + +bool CacheManager::GetInitialAppData(const std::string& app_id, + StringArray& nicknames, + StringArray& app_hmi_types) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + policy_table::ApplicationPolicies::const_iterator policy_iter = + pt_->policy_table.app_policies_section.apps.find(app_id); + + if (pt_->policy_table.app_policies_section.apps.end() != policy_iter) { + const policy_table::ApplicationParams& app_params = (*policy_iter).second; + + std::copy(app_params.nicknames->begin(), + app_params.nicknames->end(), + std::back_inserter(nicknames)); + + std::transform(app_params.AppHMIType->begin(), + app_params.AppHMIType->end(), + std::back_inserter(app_hmi_types), + AppHMITypeToString()); + } + return true; +} + +bool CacheManager::GetFunctionalGroupings( + policy_table::FunctionalGroupings& groups) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + const policy_table::FunctionalGroupings& f_groupings = + pt_->policy_table.functional_groupings; + + groups.insert(f_groupings.begin(), f_groupings.end()); + return true; +} + +int CacheManager::CountUnconsentedGroups(const std::string& policy_app_id, + const std::string& device_id) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + LOG4CXX_DEBUG(logger_, "Application id: " << policy_app_id); + int result = 0; + if (kDeviceId != policy_app_id && !IsApplicationRepresented(policy_app_id)) { + return 0; + } else if (IsDefaultPolicy(policy_app_id)) { + return 0; + } else if (IsPredataPolicy(policy_app_id)) { + return 0; + } + + policy_table::FunctionalGroupings::const_iterator groups_iter_end = + pt_->policy_table.functional_groupings.end(); + + policy_table::ApplicationPoliciesSection& app_policies_section = + pt_->policy_table.app_policies_section; + + policy_table::Strings::iterator app_groups; + policy_table::Strings::iterator app_groups_end = app_groups; + policy_table::Strings::iterator app_pre_groups; + policy_table::Strings::iterator app_pre_groups_end = app_pre_groups; + + if (kDeviceId == policy_app_id) { + app_groups = app_policies_section.device.groups.begin(); + + app_groups_end = app_policies_section.device.groups.end(); + + app_pre_groups = app_policies_section.device.preconsented_groups->begin(); + + app_pre_groups_end = app_policies_section.device.preconsented_groups->end(); + } else { + app_groups = app_policies_section.apps[policy_app_id].groups.begin(); + + app_groups_end = app_policies_section.apps[policy_app_id].groups.end(); + + app_pre_groups = + app_policies_section.apps[policy_app_id].preconsented_groups->begin(); + + app_pre_groups_end = + app_policies_section.apps[policy_app_id].preconsented_groups->end(); + } + + policy_table::Strings groups_to_be_consented; + policy_table::FunctionalGroupings::iterator current_groups_iter; + for (; app_groups != app_groups_end; ++app_groups) { + current_groups_iter = + pt_->policy_table.functional_groupings.find(*app_groups); + + if (groups_iter_end != current_groups_iter) { + if (current_groups_iter->second.user_consent_prompt.is_initialized()) { + // Check if groups which requires user consent prompt + // not included in "preconsented_groups" section + if (app_pre_groups_end == + std::find(app_pre_groups, app_pre_groups_end, *app_groups)) { + groups_to_be_consented.push_back(*app_groups); + } + } + } + } + + if (groups_to_be_consented.empty()) { + return 0; + } + + // If there is no device record, all groups with consents should be consented + if (pt_->policy_table.device_data->end() == + pt_->policy_table.device_data->find(device_id)) { + return groups_to_be_consented.size(); + } + + policy_table::DeviceParams& params = + (*pt_->policy_table.device_data)[device_id]; + + policy_table::UserConsentRecords& ucr = *(params.user_consent_records); + + // If there is no application record, all groups with consents should be + // consented + if (ucr.end() == ucr.find(policy_app_id)) { + return groups_to_be_consented.size(); + } + + policy_table::ConsentRecords& cgr = ucr[policy_app_id]; + + policy_table::Strings::const_iterator to_consent_it = + groups_to_be_consented.begin(); + + for (; to_consent_it != groups_to_be_consented.end(); ++to_consent_it) { + policy_table::ConsentGroups::const_iterator already_consented_iter = + cgr.consent_groups->find(*to_consent_it); + if (already_consented_iter == cgr.consent_groups->end()) { + ++result; + } + } + + return result; +} + +bool CacheManager::SetMetaInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language) { + CACHE_MANAGER_CHECK(false); + *pt_->policy_table.module_meta->ccpu_version = ccpu_version; + *pt_->policy_table.module_meta->wers_country_code = wers_country_code; + *pt_->policy_table.module_meta->language = language; + + // We have to set preloaded flag as false in policy table on any response + // of GetSystemInfo (SDLAQ-CRS-2365) + *pt_->policy_table.module_config.preloaded_pt = false; + + Backup(); + return true; +} + +bool CacheManager::IsMetaInfoPresent() const { + CACHE_MANAGER_CHECK(false); + bool result = true; + result = NULL != pt_->policy_table.module_meta->ccpu_version && + NULL != pt_->policy_table.module_meta->wers_country_code && + NULL != pt_->policy_table.module_meta->language; + return result; +} + +bool CacheManager::SetSystemLanguage(const std::string& language) { + CACHE_MANAGER_CHECK(false); + *pt_->policy_table.module_meta->language = language; + Backup(); + return true; +} + +bool CacheManager::GetFunctionalGroupNames(FunctionalGroupNames& names) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK(false); + rpc::policy_table_interface_base::FunctionalGroupings::iterator iter = + pt_->policy_table.functional_groupings.begin(); + rpc::policy_table_interface_base::FunctionalGroupings::iterator iter_end = + pt_->policy_table.functional_groupings.end(); + + for (; iter != iter_end; ++iter) { + const int32_t id = utils::Djb2HashFromString((*iter).first); + std::pair<std::string, std::string> value = + std::make_pair(*(*iter).second.user_consent_prompt, (*iter).first); + + names.insert( + std::pair<uint32_t, std::pair<std::string, std::string> >(id, value)); + } + return true; +} + +bool CacheManager::CleanupUnpairedDevices() { + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock lock(cache_lock_); + sync_primitives::AutoLock lock_unpaired(unpaired_lock_); + UnpairedDevices::iterator iter = is_unpaired_.begin(); + UnpairedDevices::const_iterator iter_end = is_unpaired_.end(); + LOG4CXX_DEBUG(logger_, "Is_unpaired size is: " << is_unpaired_.size()); + for (; iter != iter_end; ++iter) { + // Delete device + if (!pt_->policy_table.device_data.is_initialized()) { + LOG4CXX_ERROR(logger_, "Device_data section is not initialized."); + return false; + } + policy_table::DeviceData& device_data = *pt_->policy_table.device_data; + policy_table::DeviceData::iterator it_device = device_data.find(*iter); + if (device_data.end() == it_device) { + LOG4CXX_INFO(logger_, + "No device id " + << *iter << " had been found in device_data section."); + return false; + } + + LOG4CXX_DEBUG(logger_, "Device_data size is: " << device_data.size()); + device_data.erase(it_device); + LOG4CXX_INFO(logger_, + "Device id " << *iter + << " had been deleted from device_data section."); + LOG4CXX_DEBUG(logger_, "Device_data size is: " << device_data.size()); + } + is_unpaired_.clear(); + Backup(); + return true; +} + +void CacheManager::Increment(usage_statistics::GlobalCounterId type) { + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock lock(cache_lock_); + switch (type) { + case usage_statistics::IAP_BUFFER_FULL: + ++(*pt_->policy_table.usage_and_error_counts->count_of_iap_buffer_full); + break; + case usage_statistics::SYNC_OUT_OF_MEMORY: + ++(*pt_->policy_table.usage_and_error_counts->count_sync_out_of_memory); + break; + case usage_statistics::SYNC_REBOOTS: + ++(*pt_->policy_table.usage_and_error_counts->count_of_sync_reboots); + break; + default: + LOG4CXX_WARN(logger_, "Type global counter is unknown"); + return; + } + Backup(); +} + +void CacheManager::Increment(const std::string& app_id, + usage_statistics::AppCounterId type) { + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock lock(cache_lock_); + switch (type) { + case usage_statistics::USER_SELECTIONS: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_user_selections; + break; + case usage_statistics::REJECTIONS_SYNC_OUT_OF_MEMORY: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_rejections_sync_out_of_memory; + break; + case usage_statistics::REJECTIONS_NICKNAME_MISMATCH: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_rejections_nickname_mismatch; + break; + case usage_statistics::REJECTIONS_DUPLICATE_NAME: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_rejections_duplicate_name; + break; + case usage_statistics::REJECTED_RPC_CALLS: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_rejected_rpc_calls; + break; + case usage_statistics::RPCS_IN_HMI_NONE: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_rpcs_sent_in_hmi_none; + break; + case usage_statistics::REMOVALS_MISBEHAVED: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_removals_for_bad_behavior; + break; + case usage_statistics::RUN_ATTEMPTS_WHILE_REVOKED: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_run_attempts_while_revoked; + break; + case usage_statistics::COUNT_OF_TLS_ERRORS: + ++(*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .count_of_tls_errors; + break; + default: + LOG4CXX_WARN(logger_, "Type app counter is unknown"); + return; + } + Backup(); +} + +void CacheManager::Set(const std::string& app_id, + usage_statistics::AppInfoId type, + const std::string& value) { + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock lock(cache_lock_); + switch (type) { + case usage_statistics::LANGUAGE_GUI: + (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .app_registration_language_gui = value; + break; + case usage_statistics::LANGUAGE_VUI: + (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .app_registration_language_vui = value; + break; + default: + LOG4CXX_WARN(logger_, "Type app info is unknown"); + return; + } + Backup(); +} + +void CacheManager::Add(const std::string& app_id, + usage_statistics::AppStopwatchId type, + int seconds) { + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock lock(cache_lock_); + const int minutes = ConvertSecondsToMinute(seconds); + switch (type) { + case usage_statistics::SECONDS_HMI_FULL: + (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .minutes_in_hmi_full += minutes; + break; + case usage_statistics::SECONDS_HMI_LIMITED: + (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .minutes_in_hmi_limited += minutes; + break; + case usage_statistics::SECONDS_HMI_BACKGROUND: + (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .minutes_in_hmi_background += minutes; + break; + case usage_statistics::SECONDS_HMI_NONE: + (*pt_->policy_table.usage_and_error_counts->app_level)[app_id] + .minutes_in_hmi_none += minutes; + break; + default: + LOG4CXX_WARN(logger_, "Type app stopwatch is unknown"); + return; + } + Backup(); +} + +long CacheManager::ConvertSecondsToMinute(int seconds) { + const float seconds_in_minute = 60.0; + return std::round(seconds / seconds_in_minute); +} + +bool CacheManager::SetDefaultPolicy(const std::string& app_id) { + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock lock(cache_lock_); + policy_table::ApplicationPolicies::const_iterator iter = + pt_->policy_table.app_policies_section.apps.find(kDefaultId); + if (pt_->policy_table.app_policies_section.apps.end() != iter) { + pt_->policy_table.app_policies_section.apps[app_id] = + pt_->policy_table.app_policies_section.apps[kDefaultId]; + + SetIsDefault(app_id); + } + Backup(); + return true; +} + +bool CacheManager::IsDefaultPolicy(const std::string& app_id) const { + CACHE_MANAGER_CHECK(false); + const bool result = + IsApplicationRepresented(app_id) && + policy::kDefaultId == + pt_->policy_table.app_policies_section.apps[app_id].get_string(); + + return result; +} + +bool CacheManager::SetIsDefault(const std::string& app_id) { + CACHE_MANAGER_CHECK(false); + + if (IsApplicationRepresented(app_id)) { + pt_->policy_table.app_policies_section.apps[app_id].set_to_string( + kDefaultId); + } + return true; +} + +bool policy::CacheManager::SetIsPredata(const std::string& app_id) { + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock lock(cache_lock_); + if (IsApplicationRepresented(app_id)) { + pt_->policy_table.app_policies_section.apps[app_id].set_to_string( + kPreDataConsentId); + } + + return true; +} + +bool CacheManager::SetPredataPolicy(const std::string& app_id) { + CACHE_MANAGER_CHECK(false); + sync_primitives::AutoLock lock(cache_lock_); + policy_table::ApplicationPolicies::const_iterator iter = + pt_->policy_table.app_policies_section.apps.find(kPreDataConsentId); + + if (pt_->policy_table.app_policies_section.apps.end() == iter) { + LOG4CXX_ERROR(logger_, + "Could not set " << kPreDataConsentId + << " permissions for app " << app_id); + return false; + } + + pt_->policy_table.app_policies_section.apps[app_id] = + pt_->policy_table.app_policies_section.apps[kPreDataConsentId]; + + pt_->policy_table.app_policies_section.apps[app_id].set_to_string( + kPreDataConsentId); + + Backup(); + return true; +} + +bool CacheManager::IsPredataPolicy(const std::string& app_id) const { + if (!IsApplicationRepresented(app_id)) { + return false; + } + return kPreDataConsentId == + pt_->policy_table.app_policies_section.apps[app_id].get_string(); +} + +bool CacheManager::SetUnpairedDevice(const std::string& device_id, + bool unpaired) { + const bool result = pt_->policy_table.device_data->end() != + pt_->policy_table.device_data->find(device_id); + if (!result) { + LOG4CXX_DEBUG(logger_, + "Couldn't set unpaired flag for device id " + << device_id << " , since it wasn't found."); + return false; + } + + sync_primitives::AutoLock lock(unpaired_lock_); + if (unpaired) { + is_unpaired_.insert(device_id); + LOG4CXX_DEBUG(logger_, "Unpaired flag was set for device id " << device_id); + } else { + is_unpaired_.erase(device_id); + LOG4CXX_DEBUG(logger_, + "Unpaired flag was removed for device id " << device_id); + } + return result; +} + +bool CacheManager::SetVINValue(const std::string& value) { + CACHE_MANAGER_CHECK(false); + cache_lock_.Acquire(); + *pt_->policy_table.module_meta->vin = value; + cache_lock_.Release(); + Backup(); + return true; +} + +bool CacheManager::IsApplicationRepresented(const std::string& app_id) const { + CACHE_MANAGER_CHECK(false); + policy_table::ApplicationPolicies::const_iterator iter = + pt_->policy_table.app_policies_section.apps.find(app_id); + return pt_->policy_table.app_policies_section.apps.end() != iter; +} + +bool CacheManager::Init(const std::string& file_name, + const PolicySettings* settings) { + LOG4CXX_AUTO_TRACE(logger_); + settings_ = settings; + InitResult init_result = backup_->Init(settings); + ex_backup_ = utils::SharedPtr<PTRepresentation>::dynamic_pointer_cast< + PTExtRepresentation>(backup_); + + bool result = true; + switch (init_result) { + case InitResult::EXISTS: { + LOG4CXX_INFO(logger_, "Policy Table exists, was loaded correctly."); + result = LoadFromBackup(); + if (result) { + if (!backup_->IsDBVersionActual()) { + if (!backup_->RefreshDB()) { + return false; + } + backup_->UpdateDBVersion(); + Backup(); + } + MergePreloadPT(file_name); + } + } break; + case InitResult::SUCCESS: { + LOG4CXX_INFO(logger_, "Policy Table was inited successfully"); + result = LoadFromFile(file_name, *pt_); + utils::SharedPtr<policy_table::Table> snapshot = GenerateSnapshot(); + + result &= snapshot->is_valid(); + LOG4CXX_DEBUG(logger_, + "Check if snapshot valid: " << std::boolalpha << result); + + if (result) { + backup_->UpdateDBVersion(); + Backup(); + *pt_->policy_table.module_config.preloaded_pt = true; + } else { + rpc::ValidationReport report("policy_table"); + snapshot->ReportErrors(&report); + ex_backup_->RemoveDB(); + } + } break; + default: { + result = false; + LOG4CXX_ERROR(logger_, "Failed to init policy table."); + } break; + } + + return result; +} + +void CacheManager::FillDeviceSpecificData() { + DeviceIds unpaired_ids; + ex_backup_->UnpairedDevicesList(&unpaired_ids); + sync_primitives::AutoLock lock(unpaired_lock_); + is_unpaired_.clear(); + for (DeviceIds::const_iterator ids_iter = unpaired_ids.begin(); + ids_iter != unpaired_ids.end(); + ++ids_iter) { + is_unpaired_.insert(*ids_iter); + } +} + +bool CacheManager::LoadFromBackup() { + sync_primitives::AutoLock lock(cache_lock_); + pt_ = backup_->GenerateSnapshot(); + update_required = backup_->UpdateRequired(); + + FillDeviceSpecificData(); + + return true; +} + +bool CacheManager::LoadFromFile(const std::string& file_name, + policy_table::Table& table) { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Loading policy table from file " << file_name); + BinaryMessage json_string; + if (!file_system::ReadBinaryFile(file_name, json_string)) { + LOG4CXX_FATAL(logger_, "Failed to read policy table source file."); + return false; + } + + Json::Value value; + Json::Reader reader(Json::Features::strictMode()); + std::string json(json_string.begin(), json_string.end()); + if (!reader.parse(json.c_str(), value)) { + LOG4CXX_FATAL( + logger_, + "Preloaded PT is corrupted: " << reader.getFormattedErrorMessages()); + return false; + } + + LOG4CXX_DEBUG(logger_, + "Start verification of policy table loaded from file."); + + table = policy_table::Table(&value); + +#ifdef ENABLE_LOG + Json::StyledWriter s_writer; + LOG4CXX_DEBUG( + logger_, + "Policy table content loaded:" << s_writer.write(table.ToJsonValue())); +#endif // ENABLE_LOG + + if (!table.is_valid()) { + rpc::ValidationReport report("policy_table"); + table.ReportErrors(&report); + LOG4CXX_FATAL(logger_, + "Parsed table is not valid " << rpc::PrettyFormat(report)); + return false; + } + return true; +} + +bool CacheManager::ResetPT(const std::string& file_name) { + LOG4CXX_AUTO_TRACE(logger_); + is_unpaired_.clear(); + if (!backup_->RefreshDB()) { + LOG4CXX_ERROR(logger_, "Can't re-create policy database. Reset failed."); + return false; + } + sync_primitives::AutoLock lock(cache_lock_); + pt_.reset(new policy_table::Table()); + const bool result = LoadFromFile(file_name, *pt_); + if (result) { + Backup(); + *pt_->policy_table.module_config.preloaded_pt = true; + } + return result; +} + +void CacheManager::GetAppRequestTypes( + const std::string& policy_app_id, + std::vector<std::string>& request_types) const { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + if (kDeviceId == policy_app_id) { + LOG4CXX_DEBUG(logger_, + "Request types not applicable for app_id " << kDeviceId); + return; + } + policy_table::ApplicationPolicies::iterator policy_iter = + pt_->policy_table.app_policies_section.apps.find(policy_app_id); + if (pt_->policy_table.app_policies_section.apps.end() == policy_iter) { + LOG4CXX_DEBUG(logger_, + "Can't find request types for app_id " << policy_app_id); + return; + } + if (policy_iter->second.RequestType.is_initialized()) { + policy_table::RequestTypes::iterator it_request_type = + policy_iter->second.RequestType->begin(); + for (; it_request_type != policy_iter->second.RequestType->end(); + ++it_request_type) { + request_types.push_back(EnumToJsonString(*it_request_type)); + } + } + return; +} + +const MetaInfo CacheManager::GetMetaInfo() const { + LOG4CXX_AUTO_TRACE(logger_); + MetaInfo meta_info; + meta_info.ccpu_version = *pt_->policy_table.module_meta->ccpu_version; + meta_info.wers_country_code = + *pt_->policy_table.module_meta->wers_country_code; + meta_info.language = *pt_->policy_table.module_meta->language; + return meta_info; +} + +std::string CacheManager::GetCertificate() const { + CACHE_MANAGER_CHECK(std::string("")); + if (pt_->policy_table.module_config.certificate.is_initialized()) { + return *pt_->policy_table.module_config.certificate; + } + return std::string(""); +} + +void CacheManager::SetDecryptedCertificate(const std::string& certificate) { + LOG4CXX_AUTO_TRACE(logger_); + CACHE_MANAGER_CHECK_VOID(); + sync_primitives::AutoLock auto_lock(cache_lock_); + *pt_->policy_table.module_config.certificate = certificate; + Backup(); +} + +void CacheManager::MergePreloadPT(const std::string& file_name) { + LOG4CXX_AUTO_TRACE(logger_); + policy_table::Table table; + if (!LoadFromFile(file_name, table)) { + LOG4CXX_DEBUG(logger_, "Unable to load preloaded PT."); + return; + } + + sync_primitives::AutoLock lock(cache_lock_); + policy_table::PolicyTable& current = pt_->policy_table; + policy_table::PolicyTable& new_table = table.policy_table; + const std::string date_current = *current.module_config.preloaded_date; + const std::string date_new = *new_table.module_config.preloaded_date; + if (date_current != date_new) { + MergeMC(new_table, current); + MergeFG(new_table, current); + MergeAP(new_table, current); + MergeCFM(new_table, current); + Backup(); + } +} + +void CacheManager::MergeMC(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt) { + LOG4CXX_AUTO_TRACE(logger_); + policy_table::ModuleConfig copy(pt.module_config); + + pt.module_config = new_pt.module_config; + pt.module_config.vehicle_make = copy.vehicle_make; + pt.module_config.vehicle_year = copy.vehicle_year; + pt.module_config.vehicle_model = copy.vehicle_model; +} + +void CacheManager::MergeFG(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt) { + LOG4CXX_AUTO_TRACE(logger_); + policy_table::FunctionalGroupings::const_iterator it = + new_pt.functional_groupings.begin(); + + for (; it != new_pt.functional_groupings.end(); ++it) { + LOG4CXX_DEBUG(logger_, "Merge functional group: " << it->first); + pt.functional_groupings[it->first] = it->second; + } +} + +void CacheManager::MergeAP(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt) { + LOG4CXX_AUTO_TRACE(logger_); + pt.app_policies_section.device = const_cast<policy_table::PolicyTable&>( + new_pt).app_policies_section.device; + + pt.app_policies_section.apps[kDefaultId] = + const_cast<policy_table::PolicyTable&>(new_pt) + .app_policies_section.apps[kDefaultId]; + + pt.app_policies_section.apps[kPreDataConsentId] = + const_cast<policy_table::PolicyTable&>(new_pt) + .app_policies_section.apps[kPreDataConsentId]; +} + +void CacheManager::MergeCFM(const policy_table::PolicyTable& new_pt, + policy_table::PolicyTable& pt) { + LOG4CXX_AUTO_TRACE(logger_); + if (new_pt.consumer_friendly_messages.is_initialized()) { + if (!pt.consumer_friendly_messages.is_initialized()) { + pt.consumer_friendly_messages = new_pt.consumer_friendly_messages; + } else { + policy_table::Messages::const_iterator it = + new_pt.consumer_friendly_messages->messages->begin(); + + pt.consumer_friendly_messages->version = + new_pt.consumer_friendly_messages->version; + for (; it != new_pt.consumer_friendly_messages->messages->end(); ++it) { + LOG4CXX_DEBUG(logger_, "Merge CFM: " << it->first); + if (!(pt.consumer_friendly_messages->messages.is_initialized())) { + LOG4CXX_DEBUG(logger_, "CFM not initialized."); + } + (*pt.consumer_friendly_messages->messages)[it->first] = it->second; + } + } + } +} + +void CacheManager::InitBackupThread() { + LOG4CXX_AUTO_TRACE(logger_); + backuper_ = new BackgroundBackuper(this); + backup_thread_ = threads::CreateThread("Backup thread", backuper_); + backup_thread_->start(); +} + +const PolicySettings& CacheManager::get_settings() const { + DCHECK(settings_); + + return *settings_; +} + +CacheManager::BackgroundBackuper::BackgroundBackuper( + CacheManager* cache_manager) + : cache_manager_(cache_manager) + , stop_flag_(false) + , new_data_available_(false) { + LOG4CXX_AUTO_TRACE(logger_); +} + +CacheManager::BackgroundBackuper::~BackgroundBackuper() { + LOG4CXX_AUTO_TRACE(logger_); +} + +void CacheManager::BackgroundBackuper::InternalBackup() { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK(cache_manager_); + + while (new_data_available_) { + new_data_available_ = false; + LOG4CXX_DEBUG(logger_, "DoBackup"); + cache_manager_->PersistData(); + } +} + +void CacheManager::BackgroundBackuper::threadMain() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(need_backup_lock_); + while (!stop_flag_) { + need_backup_lock_.Release(); + InternalBackup(); + need_backup_lock_.Acquire(); + if (new_data_available_ || stop_flag_) { + continue; + } + LOG4CXX_DEBUG(logger_, "Wait for a next backup"); + backup_notifier_.Wait(need_backup_lock_); + } +} + +void CacheManager::BackgroundBackuper::exitThreadMain() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(need_backup_lock_); + stop_flag_ = true; + backup_notifier_.NotifyOne(); +} + +void CacheManager::BackgroundBackuper::DoBackup() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(need_backup_lock_); + new_data_available_ = true; + backup_notifier_.NotifyOne(); +} + +} // namespace policy diff --git a/src/components/policy/policy_external/src/policy_helper.cc b/src/components/policy/policy_external/src/policy_helper.cc new file mode 100644 index 0000000000..a477ca55d2 --- /dev/null +++ b/src/components/policy/policy_external/src/policy_helper.cc @@ -0,0 +1,896 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include <algorithm> +#include <sstream> +#include <string.h> +#include "utils/logger.h" +#include "utils/custom_string.h" +#include "policy/policy_helper.h" +#include "policy/policy_manager_impl.h" + +namespace policy { + +namespace custom_str = utils::custom_string; + +namespace { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +bool Compare(const StringsValueType& first, const StringsValueType& second) { + const std::string& first_str = first; + const std::string& second_str = second; + return (strcasecmp(first_str.c_str(), second_str.c_str()) < 0); +} + +struct CheckGroupName { + explicit CheckGroupName(const policy::StringsValueType& value) + : value_(value) {} + + bool operator()(const FunctionalGroupNames::value_type& value) const { + return value.second.second == std::string(value_); + } + + private: + const policy::StringsValueType& value_; +}; + +struct CopyAttributes { + CopyAttributes(const FunctionalGroupNames& groups_attributes, + std::vector<FunctionalGroupPermission>& groups_permissions) + : groups_attributes_(groups_attributes) + , groups_permissions_(groups_permissions) {} + + bool operator()(const policy::StringsValueType& value) { + CheckGroupName checker(value); + FunctionalGroupNames::const_iterator it = std::find_if( + groups_attributes_.begin(), groups_attributes_.end(), checker); + if (groups_attributes_.end() == it) { + return false; + } + FunctionalGroupPermission group; + group.group_name = it->second.second; + group.group_alias = it->second.first; + group.group_id = it->first; + groups_permissions_.push_back(group); + return true; + } + + private: + const FunctionalGroupNames& groups_attributes_; + std::vector<FunctionalGroupPermission>& groups_permissions_; +}; +} // namespace + +CompareGroupName::CompareGroupName(const StringsValueType& group_name) + : group_name_(group_name) {} + +bool CompareGroupName::operator()( + const StringsValueType& group_name_to_compare) const { + const std::string gn_ = group_name_; + const std::string gn_compare = group_name_to_compare; + return !(strcasecmp(gn_.c_str(), gn_compare.c_str())); +} + +bool operator!=(const policy_table::ApplicationParams& first, + const policy_table::ApplicationParams& second) { + if (first.groups.size() != second.groups.size()) { + return true; + } + StringsConstItr it_first = first.groups.begin(); + StringsConstItr it_first_end = first.groups.end(); + StringsConstItr it_second = second.groups.begin(); + StringsConstItr it_second_end = second.groups.end(); + for (; it_first != it_first_end; ++it_first) { + CompareGroupName gp(*it_first); + StringsConstItr it = std::find_if(it_second, it_second_end, gp); + if (it_first_end == it) { + return true; + } + } + return false; +} + +CheckAppPolicy::CheckAppPolicy( + PolicyManagerImpl* pm, + const utils::SharedPtr<policy_table::Table> update, + const utils::SharedPtr<policy_table::Table> snapshot) + : pm_(pm), update_(update), snapshot_(snapshot) {} + +bool policy::CheckAppPolicy::HasRevokedGroups( + const policy::AppPoliciesValueType& app_policy, + policy_table::Strings* revoked_groups) const { + AppPoliciesConstItr it = + snapshot_->policy_table.app_policies_section.apps.find(app_policy.first); + + policy_table::Strings groups_new = app_policy.second.groups; + std::sort(groups_new.begin(), groups_new.end(), Compare); + + policy_table::Strings groups_curr = (*it).second.groups; + std::sort(groups_curr.begin(), groups_curr.end(), Compare); + + StringsConstItr it_groups_new = groups_new.begin(); + StringsConstItr it_groups_new_end = groups_new.end(); + + StringsConstItr it_groups_curr = groups_curr.begin(); + StringsConstItr it_groups_curr_end = groups_curr.end(); + + policy_table::Strings revoked_group_list; + std::set_difference(it_groups_curr, + it_groups_curr_end, + it_groups_new, + it_groups_new_end, + std::back_inserter(revoked_group_list), + Compare); + + // Remove groups which are not required user consent + policy_table::Strings::iterator it_revoked = revoked_group_list.begin(); + for (; revoked_group_list.end() != it_revoked;) { + if (!IsConsentRequired(app_policy.first, std::string(*it_revoked))) { + revoked_group_list.erase(it_revoked); + it_revoked = revoked_group_list.begin(); + } else { + ++it_revoked; + } + } + + if (revoked_groups) { + *revoked_groups = revoked_group_list; + } + + return !revoked_group_list.empty(); +} + +bool policy::CheckAppPolicy::HasNewGroups( + const policy::AppPoliciesValueType& app_policy, + policy_table::Strings* new_groups) const { + AppPoliciesConstItr it = + snapshot_->policy_table.app_policies_section.apps.find(app_policy.first); + + policy_table::Strings groups_new = app_policy.second.groups; + std::sort(groups_new.begin(), groups_new.end(), Compare); + + policy_table::Strings groups_curr = (*it).second.groups; + std::sort(groups_curr.begin(), groups_curr.end(), Compare); + + StringsConstItr it_groups_new = groups_new.begin(); + StringsConstItr it_groups_new_end = groups_new.end(); + + StringsConstItr it_groups_curr = groups_curr.begin(); + StringsConstItr it_groups_curr_end = groups_curr.end(); + + policy_table::Strings new_group_list; + std::set_difference(it_groups_new, + it_groups_new_end, + it_groups_curr, + it_groups_curr_end, + std::back_inserter(new_group_list), + Compare); + + if (new_groups) { + *new_groups = new_group_list; + } + + return !new_group_list.empty(); +} + +bool policy::CheckAppPolicy::HasConsentNeededGroups( + const policy::AppPoliciesValueType& app_policy) const { + policy_table::Strings new_groups; + if (!HasNewGroups(app_policy, &new_groups)) { + return false; + } + + StringsConstItr it_new = new_groups.begin(); + StringsConstItr it_new_end = new_groups.end(); + for (; it_new != it_new_end; ++it_new) { + if (IsConsentRequired(app_policy.first, *it_new)) { + return true; + } + } + + return false; +} + +std::vector<FunctionalGroupPermission> policy::CheckAppPolicy::GetRevokedGroups( + const policy::AppPoliciesValueType& app_policy) const { + policy_table::Strings revoked_groups_names; + if (!HasRevokedGroups(app_policy, &revoked_groups_names)) { + return std::vector<FunctionalGroupPermission>(); + } + + FunctionalGroupNames groups_attributes; + if (!pm_->cache_->GetFunctionalGroupNames(groups_attributes)) { + LOG4CXX_WARN(logger_, "Can't get functional group names"); + return std::vector<FunctionalGroupPermission>(); + } + + std::vector<FunctionalGroupPermission> revoked_groups_permissions; + CopyAttributes copier(groups_attributes, revoked_groups_permissions); + std::for_each( + revoked_groups_names.begin(), revoked_groups_names.end(), copier); + + return revoked_groups_permissions; +} + +void policy::CheckAppPolicy::RemoveRevokedConsents( + const AppPoliciesValueType& app_policy, + const std::vector<FunctionalGroupPermission>& revoked_groups) const { + std::vector<policy::FunctionalGroupPermission>::const_iterator it = + revoked_groups.begin(); + std::vector<policy::FunctionalGroupPermission>::const_iterator it_end = + revoked_groups.end(); + for (; it != it_end; ++it) { + pm_->RemoveAppConsentForGroup(app_policy.first, it->group_name); + } +} + +bool CheckAppPolicy::IsKnownAppication( + const std::string& application_id) const { + const policy_table::ApplicationPolicies& current_policies = + snapshot_->policy_table.app_policies_section.apps; + + return !(current_policies.end() == current_policies.find(application_id)); +} + +void policy::CheckAppPolicy::NotifySystem( + const policy::AppPoliciesValueType& app_policy) const { + pm_->listener()->OnPendingPermissionChange(app_policy.first); +} + +void CheckAppPolicy::SendPermissionsToApp( + const AppPoliciesValueType& app_policy) const { + const std::string app_id = app_policy.first; + + const std::string device_id = pm_->GetCurrentDeviceId(app_id); + if (device_id.empty()) { + LOG4CXX_WARN(logger_, + "Couldn't find device info for application id: " << app_id); + return; + } + std::vector<FunctionalGroupPermission> group_permissons; + pm_->GetPermissionsForApp(device_id, app_id, group_permissons); + + Permissions notification_data; + pm_->PrepareNotificationData(update_->policy_table.functional_groupings, + app_policy.second.groups, + group_permissons, + notification_data); + + LOG4CXX_INFO(logger_, "Send notification for application_id: " << app_id); + pm_->listener()->OnPermissionsUpdated( + app_id, + notification_data, + policy_table::EnumToJsonString(app_policy.second.default_hmi)); +} + +bool CheckAppPolicy::IsAppRevoked( + const AppPoliciesValueType& app_policy) const { + LOG4CXX_AUTO_TRACE(logger_); + // Application params are not initialized = application revoked + // i.e. "123":null + return app_policy.second.is_null(); +} + +bool CheckAppPolicy::NicknamesMatch( + const AppPoliciesValueType& app_policy) const { + const std::string& app_id = app_policy.first; + const custom_str::CustomString app_name = pm_->listener()->GetAppName(app_id); + if (!app_name.empty() && app_policy.second.nicknames && + !app_policy.second.nicknames->empty()) { + for (policy_table::Strings::const_iterator it = + app_policy.second.nicknames->begin(); + app_policy.second.nicknames->end() != it; + ++it) { + std::string temp = *it; + if (app_name.CompareIgnoreCase(temp.c_str())) { + return true; + } + } + return false; + } + return true; +} + +bool CheckAppPolicy::operator()(const AppPoliciesValueType& app_policy) { + const std::string app_id = app_policy.first; + + if (!IsKnownAppication(app_id)) { + LOG4CXX_WARN(logger_, + "Application:" << app_id << " is not present in snapshot."); + return true; + } + + if (!IsPredefinedApp(app_policy) && IsAppRevoked(app_policy)) { + SetPendingPermissions(app_policy, RESULT_APP_REVOKED); + NotifySystem(app_policy); + return true; + } + + if (!IsPredefinedApp(app_policy) && !NicknamesMatch(app_policy)) { + SetPendingPermissions(app_policy, RESULT_NICKNAME_MISMATCH); + NotifySystem(app_policy); + return true; + } + + PermissionsCheckResult result = CheckPermissionsChanges(app_policy); + + if (!IsPredefinedApp(app_policy) && IsRequestTypeChanged(app_policy)) { + SetPendingPermissions(app_policy, RESULT_REQUEST_TYPE_CHANGED); + NotifySystem(app_policy); + } + + if (RESULT_NO_CHANGES == result) { + LOG4CXX_INFO(logger_, + "Permissions for application:" << app_id + << " wasn't changed."); + return true; + } + + LOG4CXX_INFO(logger_, + "Permissions for application:" << app_id + << " have been changed."); + + if (!IsPredefinedApp(app_policy) && RESULT_CONSENT_NOT_REQIURED != result) { + SetPendingPermissions(app_policy, result); + NotifySystem(app_policy); + } + + // Don't sent notification for predefined apps (e.g. default, device etc.) + if (!IsPredefinedApp(app_policy)) { + SendPermissionsToApp(app_policy); + } + return true; +} + +void policy::CheckAppPolicy::SetPendingPermissions( + const AppPoliciesValueType& app_policy, + PermissionsCheckResult result) const { + using namespace rpc::policy_table_interface_base; + const std::string app_id = app_policy.first; + AppPermissions permissions_diff(app_id); + + const std::string priority = + policy_table::EnumToJsonString(app_policy.second.priority); + const std::string current_prio = EnumToJsonString( + snapshot_->policy_table.app_policies_section.apps[app_id].priority); + + bool need_send_priority = (current_prio != priority); + + switch (result) { + case RESULT_APP_REVOKED: + need_send_priority = false; + permissions_diff.appRevoked = true; + break; + case RESULT_NICKNAME_MISMATCH: + need_send_priority = false; + permissions_diff.appUnauthorized = true; + break; + case RESULT_PERMISSIONS_REVOKED: + permissions_diff.priority = priority; + permissions_diff.isAppPermissionsRevoked = true; + permissions_diff.appRevokedPermissions = GetRevokedGroups(app_policy); + RemoveRevokedConsents(app_policy, permissions_diff.appRevokedPermissions); + break; + case RESULT_CONSENT_NEEDED: + permissions_diff.priority = priority; + permissions_diff.appPermissionsConsentNeeded = true; + break; + case RESULT_PERMISSIONS_REVOKED_AND_CONSENT_NEEDED: + permissions_diff.priority = priority; + permissions_diff.isAppPermissionsRevoked = true; + permissions_diff.appPermissionsConsentNeeded = true; + permissions_diff.appRevokedPermissions = GetRevokedGroups(app_policy); + RemoveRevokedConsents(app_policy, permissions_diff.appRevokedPermissions); + break; + case RESULT_REQUEST_TYPE_CHANGED: + permissions_diff.requestTypeChanged = true; + { + // Getting RequestTypes from PTU (not from cache) + policy_table::RequestTypes::const_iterator it_request_type = + app_policy.second.RequestType->begin(); + for (; app_policy.second.RequestType->end() != it_request_type; + ++it_request_type) { + permissions_diff.requestType.push_back( + EnumToJsonString(*it_request_type)); + } + } + + break; + default: + return; + } + + if (need_send_priority) { + permissions_diff.priority = priority; + } + + pm_->app_permissions_diff_lock_.Acquire(); + pm_->app_permissions_diff_.insert(std::make_pair(app_id, permissions_diff)); + pm_->app_permissions_diff_lock_.Release(); +} + +policy::CheckAppPolicy::PermissionsCheckResult +policy::CheckAppPolicy::CheckPermissionsChanges( + const policy::AppPoliciesValueType& app_policy) const { + bool has_revoked_groups = HasRevokedGroups(app_policy); + + bool has_consent_needed_groups = HasConsentNeededGroups(app_policy); + + bool has_new_groups = HasNewGroups(app_policy); + + if (has_revoked_groups && has_consent_needed_groups) { + return RESULT_PERMISSIONS_REVOKED_AND_CONSENT_NEEDED; + } else if (has_revoked_groups) { + return RESULT_PERMISSIONS_REVOKED; + } else if (has_consent_needed_groups) { + return RESULT_CONSENT_NEEDED; + } else if (has_new_groups) { + return RESULT_CONSENT_NOT_REQIURED; + } + + return RESULT_NO_CHANGES; +} + +bool CheckAppPolicy::IsConsentRequired(const std::string& app_id, + const std::string& group_name) const { + const policy_table::FunctionalGroupings& functional_groupings = + snapshot_->policy_table.functional_groupings; + + FuncGroupConstItr it = functional_groupings.find(group_name); + + if (functional_groupings.end() == it) { + return false; + } + + bool is_preconsented = false; + policy_table::Strings::value_type str(group_name); + policy_table::Strings::iterator pre_begin = + update_->policy_table.app_policies_section.apps[app_id] + .preconsented_groups->begin(); + policy_table::Strings::iterator pre_end = + update_->policy_table.app_policies_section.apps[app_id] + .preconsented_groups->end(); + + policy_table::Strings::iterator it2 = std::find(pre_begin, pre_end, str); + + is_preconsented = pre_end != it2; + + return it->second.user_consent_prompt.is_initialized() && !is_preconsented; +} + +bool CheckAppPolicy::IsRequestTypeChanged( + const AppPoliciesValueType& app_policy) const { + policy::AppPoliciesConstItr it = + snapshot_->policy_table.app_policies_section.apps.find(app_policy.first); + if (it == snapshot_->policy_table.app_policies_section.apps.end()) { + if (!app_policy.second.RequestType->empty()) { + return true; + } + return false; + } + if (it->second.RequestType->size() != app_policy.second.RequestType->size()) { + return true; + } + policy_table::RequestTypes diff; + std::set_difference(it->second.RequestType->begin(), + it->second.RequestType->end(), + app_policy.second.RequestType->begin(), + app_policy.second.RequestType->end(), + std::back_inserter(diff)); + return diff.size(); +} + +FillNotificationData::FillNotificationData(Permissions& data, + GroupConsent group_state, + GroupConsent undefined_group_consent, + bool does_require_user_consent) + : data_(data), does_require_user_consent_(does_require_user_consent) { + switch (group_state) { + case kGroupAllowed: + current_key_ = kAllowedKey; + break; + case kGroupUndefined: + if (kGroupUndefined == undefined_group_consent) { + current_key_ = kUndefinedKey; + break; + } + current_key_ = kGroupAllowed == undefined_group_consent + ? kAllowedKey + : kUserDisallowedKey; + break; + default: + current_key_ = kUserDisallowedKey; + break; + } +} + +bool FillNotificationData::operator()(const RpcValueType& rpc) { + Permissions::iterator it = data_.find(rpc.first); + // If rpc is present already - update its permissions + if (data_.end() != it) { + UpdateHMILevels(rpc.second.hmi_levels, (*it).second.hmi_permissions); + UpdateParameters(*rpc.second.parameters, + (*it).second.parameter_permissions); + ExcludeSame(it->second); + } else { + // Init mandatory keys, since they should be present irrespectively of + // values presence + InitRpcKeys(rpc.first); + // If rpc is not present - add its permissions + UpdateHMILevels(rpc.second.hmi_levels, data_[rpc.first].hmi_permissions); + UpdateParameters(*rpc.second.parameters, + data_[rpc.first].parameter_permissions); + } + return true; +} + +void FillNotificationData::UpdateHMILevels( + const policy_table::HmiLevels& in_hmi, HMIPermissions& out_hmi) { + HMILevelsConstItr it_hmi_levels = in_hmi.begin(); + HMILevelsConstItr it_hmi_levels_end = in_hmi.end(); + + for (; it_hmi_levels != it_hmi_levels_end; ++it_hmi_levels) { + out_hmi[current_key_].insert( + policy_table::EnumToJsonString(*it_hmi_levels)); + } +} + +void FillNotificationData::UpdateParameters( + const policy_table::Parameters& in_parameters, + ParameterPermissions& out_parameter) { + ParametersConstItr it_parameters = in_parameters.begin(); + ParametersConstItr it_parameters_end = in_parameters.end(); + + // Due to APPLINK-24201 SDL must consider cases when 'parameters' section is + // not present for RPC or present, but is empty. + + // If 'parameters' section is like: 'parameters' : [] + if (in_parameters.is_initialized() && in_parameters.empty()) { + if (!does_require_user_consent_) { + out_parameter.any_parameter_disallowed_by_policy = true; + } + if (does_require_user_consent_ && kAllowedKey == current_key_) { + out_parameter.any_parameter_disallowed_by_user = true; + } + } + + // If 'parameters' section is omitted + if (!in_parameters.is_initialized()) { + if (!does_require_user_consent_) { + out_parameter.any_parameter_allowed = true; + } + if (does_require_user_consent_ && kAllowedKey == current_key_) { + out_parameter.any_parameter_allowed = true; + } + } + + for (; it_parameters != it_parameters_end; ++it_parameters) { + out_parameter[current_key_].insert( + policy_table::EnumToJsonString(*it_parameters)); + } +} + +void FillNotificationData::ExcludeSame(RpcPermissions& rpc) { + HMIPermissions& rpc_hmi_permissions = rpc.hmi_permissions; + HMIPermissions::const_iterator it_hmi_allowed = + rpc.hmi_permissions.find(kAllowedKey); + HMIPermissions::const_iterator it_hmi_undefined = + rpc.hmi_permissions.find(kUndefinedKey); + HMIPermissions::const_iterator it_hmi_user_disallowed = + rpc.hmi_permissions.find(kUserDisallowedKey); + + // There is different logic of processing RPCs with and w/o 'parameters' + if (RpcParametersEmpty(rpc)) { + // First, remove disallowed from other types + if (rpc_hmi_permissions.end() != it_hmi_user_disallowed) { + if (rpc_hmi_permissions.end() != it_hmi_allowed) { + ExcludeSameHMILevels(rpc_hmi_permissions[kAllowedKey], + rpc_hmi_permissions[kUserDisallowedKey]); + } + if (rpc_hmi_permissions.end() != it_hmi_undefined) { + ExcludeSameHMILevels(rpc_hmi_permissions[kUndefinedKey], + rpc_hmi_permissions[kUserDisallowedKey]); + } + } + + // Then, remove undefined from allowed + if (rpc_hmi_permissions.end() != it_hmi_undefined) { + if (rpc_hmi_permissions.end() != it_hmi_allowed) { + ExcludeSameHMILevels(rpc_hmi_permissions[kAllowedKey], + rpc_hmi_permissions[kUndefinedKey]); + } + } + + return; + } + + ParameterPermissions& rpc_parameter_permissions = rpc.parameter_permissions; + ParameterPermissions::const_iterator it_parameter_allowed = + rpc.parameter_permissions.find(kAllowedKey); + ParameterPermissions::const_iterator it_parameter_undefined = + rpc.parameter_permissions.find(kUndefinedKey); + ParameterPermissions::const_iterator it_parameter_user_disallowed = + rpc.parameter_permissions.find(kUserDisallowedKey); + + // First, removing allowed HMI levels from other types, permissions will be + // dependent on parameters instead of HMI levels since w/o parameters RPC + // won't passed to HMI + if (rpc_hmi_permissions.end() != it_hmi_allowed) { + if (rpc_hmi_permissions.end() != it_hmi_user_disallowed) { + ExcludeSameHMILevels(rpc_hmi_permissions[kUserDisallowedKey], + rpc_hmi_permissions[kAllowedKey]); + } + if (rpc.hmi_permissions.end() != it_hmi_undefined) { + ExcludeSameHMILevels(rpc_hmi_permissions[kUndefinedKey], + rpc_hmi_permissions[kAllowedKey]); + } + } + + // Removing disallowed parameters from allowed and undefined (by user consent) + if (rpc_parameter_permissions.end() != it_parameter_user_disallowed) { + if (rpc_parameter_permissions.end() != it_parameter_allowed) { + ExcludeSameParameters(rpc_parameter_permissions[kAllowedKey], + rpc_parameter_permissions[kUserDisallowedKey]); + } + if (rpc_parameter_permissions.end() != it_parameter_undefined) { + ExcludeSameParameters(rpc_parameter_permissions[kUndefinedKey], + rpc_parameter_permissions[kUserDisallowedKey]); + } + } + + // Removing undefined (by user consent) parameters from allowed + if (rpc_parameter_permissions.end() != it_parameter_undefined) { + if (rpc_parameter_permissions.end() != it_parameter_allowed) { + ExcludeSameParameters(rpc_parameter_permissions[kAllowedKey], + rpc_parameter_permissions[kUndefinedKey]); + } + } +} + +void FillNotificationData::ExcludeSameHMILevels( + std::set<HMILevel>& source, const std::set<HMILevel>& target) { + std::set<HMILevel> diff_hmi; + + std::set_difference(source.begin(), + source.end(), + target.begin(), + target.end(), + std::inserter(diff_hmi, diff_hmi.begin())); + + source = diff_hmi; +} + +void FillNotificationData::ExcludeSameParameters( + std::set<Parameter>& source, const std::set<Parameter>& target) { + std::set<Parameter> diff_parameter; + + std::set_difference(source.begin(), + source.end(), + target.begin(), + target.end(), + std::inserter(diff_parameter, diff_parameter.begin())); + + source = diff_parameter; +} + +void FillNotificationData::InitRpcKeys(const std::string& rpc_name) { + data_[rpc_name].hmi_permissions[kAllowedKey]; + data_[rpc_name].hmi_permissions[kUserDisallowedKey]; + data_[rpc_name].parameter_permissions[kAllowedKey]; + data_[rpc_name].parameter_permissions[kUserDisallowedKey]; +} + +bool FillNotificationData::RpcParametersEmpty(RpcPermissions& rpc) { + const bool no_allowed_parameters = + IsSectionEmpty(rpc.parameter_permissions, kAllowedKey); + const bool no_user_disallowed_parameters = + IsSectionEmpty(rpc.parameter_permissions, kUserDisallowedKey); + const bool no_undefined_parameters = + IsSectionEmpty(rpc.parameter_permissions, kUndefinedKey); + + return no_allowed_parameters && no_undefined_parameters && + no_user_disallowed_parameters; +} + +bool FillNotificationData::IsSectionEmpty(ParameterPermissions& permissions, + const std::string& section) { + ParameterPermissions::const_iterator it_section = permissions.find(section); + ParameterPermissions::const_iterator end = permissions.end(); + if (end != it_section) { + return permissions[section].empty(); + } + return true; +} + +ProcessFunctionalGroup::ProcessFunctionalGroup( + const policy_table::FunctionalGroupings& fg, + const std::vector<FunctionalGroupPermission>& group_permissions, + Permissions& data, + GroupConsent undefined_group_consent) + : fg_(fg) + , group_permissions_(group_permissions) + , data_(data) + , undefined_group_consent_(undefined_group_consent) {} + +bool ProcessFunctionalGroup::operator()(const StringsValueType& group_name) { + const std::string group_name_str = group_name; + FuncGroupConstItr it = fg_.find(group_name_str); + const bool does_require_user_consent = + it->second.user_consent_prompt.is_initialized(); + + if (fg_.end() != it) { + const policy_table::Rpc& rpcs = (*it).second.rpcs; + FillNotificationData filler(data_, + GetGroupState(group_name_str), + undefined_group_consent_, + does_require_user_consent); + std::for_each(rpcs.begin(), rpcs.end(), filler); + } + return true; +} + +GroupConsent ProcessFunctionalGroup::GetGroupState( + const std::string& group_name) { + std::vector<FunctionalGroupPermission>::const_iterator it = + group_permissions_.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_end = + group_permissions_.end(); + for (; it != it_end; ++it) { + if (group_name == (*it).group_name) { + return (*it).state; + } + } + return kGroupUndefined; +} + +FunctionalGroupInserter::FunctionalGroupInserter( + const policy_table::Strings& preconsented_groups, PermissionsList& list) + : list_(list), preconsented_(preconsented_groups) {} + +void FunctionalGroupInserter::operator()(const StringsValueType& group_name) { + CompareGroupName name(group_name); + if (std::find_if(preconsented_.begin(), preconsented_.end(), name) == + preconsented_.end()) { + list_.push_back(group_name); + } +} + +void FillFunctionalGroupPermissions( + FunctionalGroupIDs& ids, + FunctionalGroupNames& names, + GroupConsent state, + std::vector<FunctionalGroupPermission>& permissions) { + LOG4CXX_INFO(logger_, "FillFunctionalGroupPermissions"); + FunctionalGroupIDs::const_iterator it = ids.begin(); + FunctionalGroupIDs::const_iterator it_end = ids.end(); + for (; it != it_end; ++it) { + FunctionalGroupPermission current_group; + current_group.group_id = *it; + current_group.group_alias = names[*it].first; + current_group.group_name = names[*it].second; + current_group.state = state; + permissions.push_back(current_group); + } +} + +bool IsPredefinedApp(const AppPoliciesValueType& app) { + return app.first == kDefaultId || app.first == kPreDataConsentId || + app.first == kDeviceId; +} + +FunctionalGroupIDs ExcludeSame(const FunctionalGroupIDs& from, + const FunctionalGroupIDs& what) { + LOG4CXX_INFO(logger_, "Exclude same groups"); + FunctionalGroupIDs from_copy(from); + FunctionalGroupIDs what_copy(what); + + std::sort(from_copy.begin(), from_copy.end()); + std::sort(what_copy.begin(), what_copy.end()); + + FunctionalGroupIDs no_same; + std::set_difference(from_copy.begin(), + from_copy.end(), + what_copy.begin(), + what_copy.end(), + std::back_inserter(no_same)); + + no_same.resize(std::distance(no_same.begin(), + std::unique(no_same.begin(), no_same.end()))); + + return no_same; +} + +FunctionalGroupIDs Merge(const FunctionalGroupIDs& first, + const FunctionalGroupIDs& second) { + LOG4CXX_INFO(logger_, "Merge groups"); + FunctionalGroupIDs first_copy(first); + FunctionalGroupIDs second_copy(second); + + std::sort(first_copy.begin(), first_copy.end()); + std::sort(second_copy.begin(), second_copy.end()); + + FunctionalGroupIDs merged; + std::set_union(first_copy.begin(), + first_copy.end(), + second_copy.begin(), + second_copy.end(), + std::back_inserter(merged)); + + merged.resize( + std::distance(merged.begin(), std::unique(merged.begin(), merged.end()))); + + return merged; +} + +FunctionalGroupIDs FindSame(const FunctionalGroupIDs& first, + const FunctionalGroupIDs& second) { + LOG4CXX_INFO(logger_, "Find same groups"); + FunctionalGroupIDs first_copy(first); + FunctionalGroupIDs second_copy(second); + + std::sort(first_copy.begin(), first_copy.end()); + std::sort(second_copy.begin(), second_copy.end()); + + FunctionalGroupIDs same; + std::set_intersection(first_copy.begin(), + first_copy.end(), + second_copy.begin(), + second_copy.end(), + std::back_inserter(same)); + + same.resize( + std::distance(same.begin(), std::unique(same.begin(), same.end()))); + + return same; +} + +bool UnwrapAppPolicies(policy_table::ApplicationPolicies& app_policies) { + policy_table::ApplicationPolicies::iterator it_default = + app_policies.find(kDefaultId); + if (app_policies.end() == it_default) { + LOG4CXX_ERROR(logger_, "No default application policy found in PTU."); + return false; + } + + policy_table::ApplicationPolicies::iterator it = app_policies.begin(); + for (; app_policies.end() != it; ++it) { + // Set default policies for app, if there is record like "123":"default" + if (kDefaultId.compare((*it).second.get_string()) == 0) { + (*it).second = (*it_default).second; + it->second.set_to_string(kDefaultId); + } + } + + return true; +} +} diff --git a/src/components/policy/policy_external/src/policy_manager_impl.cc b/src/components/policy/policy_external/src/policy_manager_impl.cc new file mode 100644 index 0000000000..88d810ecc2 --- /dev/null +++ b/src/components/policy/policy_external/src/policy_manager_impl.cc @@ -0,0 +1,1341 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +#include "policy/policy_manager_impl.h" + +#include <algorithm> +#include <set> +#include <queue> +#include <iterator> +#include <limits> +#include "json/reader.h" +#include "json/writer.h" +#include "policy/policy_table.h" +#include "policy/pt_representation.h" +#include "policy/policy_helper.h" +#include "utils/file_system.h" +#include "utils/logger.h" +#include "utils/date_time.h" +#include "policy/cache_manager.h" +#include "policy/update_status_manager.h" +#include "config_profile/profile.h" +#include "utils/make_shared.h" + +policy::PolicyManager* CreateManager() { + return new policy::PolicyManagerImpl(); +} +void DeleteManager(policy::PolicyManager* pm) { + delete pm; +} + +namespace policy { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +PolicyManagerImpl::PolicyManagerImpl() + : PolicyManager() + , listener_(NULL) + , cache_(new CacheManager) + , retry_sequence_timeout_(60) + , retry_sequence_index_(0) + , ignition_check(true) {} + +PolicyManagerImpl::PolicyManagerImpl(bool in_memory) + : PolicyManager() + , listener_(NULL) + , cache_(new CacheManager(in_memory)) + , retry_sequence_timeout_(60) + , retry_sequence_index_(0) + , ignition_check(true) {} + +void PolicyManagerImpl::set_listener(PolicyListener* listener) { + listener_ = listener; + update_status_manager_.set_listener(listener); +} + +utils::SharedPtr<policy_table::Table> PolicyManagerImpl::Parse( + const BinaryMessage& pt_content) { + std::string json(pt_content.begin(), pt_content.end()); + Json::Value value; + Json::Reader reader; + if (reader.parse(json.c_str(), value)) { + return new policy_table::Table(&value); + } else { + return utils::SharedPtr<policy_table::Table>(); + } +} + +void PolicyManagerImpl::CheckTriggers() { + LOG4CXX_AUTO_TRACE(logger_); + const bool exceed_ignition_cycles = ExceededIgnitionCycles(); + const bool exceed_days = ExceededDays(); + + LOG4CXX_DEBUG( + logger_, + "\nDays exceeded: " << std::boolalpha << exceed_days + << "\nIgnition cycles exceeded: " << std::boolalpha + << exceed_ignition_cycles); + + if (exceed_ignition_cycles || exceed_days) { + update_status_manager_.ScheduleUpdate(); + } +} + +bool PolicyManagerImpl::LoadPT(const std::string& file, + const BinaryMessage& pt_content) { + LOG4CXX_INFO(logger_, "LoadPT of size " << pt_content.size()); + + // Parse message into table struct + utils::SharedPtr<policy_table::Table> pt_update = Parse(pt_content); + if (!pt_update) { + LOG4CXX_WARN(logger_, "Parsed table pointer is NULL."); + update_status_manager_.OnWrongUpdateReceived(); + return false; + } + + file_system::DeleteFile(file); + + if (!IsPTValid(pt_update, policy_table::PT_UPDATE)) { + update_status_manager_.OnWrongUpdateReceived(); + return false; + } + + update_status_manager_.OnValidUpdateReceived(); + cache_->SaveUpdateRequired(false); + + { + sync_primitives::AutoLock lock(apps_registration_lock_); + + // Get current DB data, since it could be updated during awaiting of PTU + utils::SharedPtr<policy_table::Table> policy_table_snapshot = + cache_->GenerateSnapshot(); + if (!policy_table_snapshot) { + LOG4CXX_ERROR(logger_, "Failed to create snapshot of policy table"); + return false; + } + + // Checking of difference between PTU and current policy state + // Must to be done before PTU applying since it is possible, that functional + // groups, which had been present before are absent in PTU and will be + // removed after update. So in case of revoked groups system has to know + // names and ids of revoked groups before they will be removed. + CheckPermissionsChanges(pt_update, policy_table_snapshot); + + // Replace current data with updated + if (!cache_->ApplyUpdate(*pt_update)) { + LOG4CXX_WARN(logger_, "Unsuccessful save of updated policy table."); + return false; + } + + listener_->OnCertificateUpdated( + *(pt_update->policy_table.module_config.certificate)); + + std::map<std::string, StringArray> app_hmi_types; + cache_->GetHMIAppTypeAfterUpdate(app_hmi_types); + if (!app_hmi_types.empty()) { + LOG4CXX_INFO(logger_, "app_hmi_types is full calling OnUpdateHMIAppType"); + listener_->OnUpdateHMIAppType(app_hmi_types); + } else { + LOG4CXX_INFO(logger_, "app_hmi_types empty"); + } + } + + // If there was a user request for policy table update, it should be started + // right after current update is finished + if (update_status_manager_.IsUpdateRequired()) { + StartPTExchange(); + return true; + } + + RefreshRetrySequence(); + return true; +} + +std::string PolicyManagerImpl::GetLockScreenIconUrl() const { + return cache_->GetLockScreenIconUrl(); +} + +void PolicyManagerImpl::CheckPermissionsChanges( + const utils::SharedPtr<policy_table::Table> pt_update, + const utils::SharedPtr<policy_table::Table> snapshot) { + LOG4CXX_INFO(logger_, "Checking incoming permissions."); + + // Replace predefined policies with its actual setting, e.g. "123":"default" + // to actual values of default section + UnwrapAppPolicies(pt_update->policy_table.app_policies_section.apps); + + std::for_each(pt_update->policy_table.app_policies_section.apps.begin(), + pt_update->policy_table.app_policies_section.apps.end(), + CheckAppPolicy(this, pt_update, snapshot)); +} + +void PolicyManagerImpl::PrepareNotificationData( + const policy_table::FunctionalGroupings& groups, + const policy_table::Strings& group_names, + const std::vector<FunctionalGroupPermission>& group_permission, + Permissions& notification_data) { + LOG4CXX_INFO(logger_, "Preparing data for notification."); + ProcessFunctionalGroup processor(groups, group_permission, notification_data); + std::for_each(group_names.begin(), group_names.end(), processor); +} + +void PolicyManagerImpl::GetUpdateUrls(const std::string& service_type, + EndpointUrls& out_end_points) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->GetUpdateUrls(service_type, out_end_points); +} +void PolicyManagerImpl::GetUpdateUrls(const uint32_t service_type, + EndpointUrls& out_end_points) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->GetUpdateUrls(service_type, out_end_points); +} + +void PolicyManagerImpl::RequestPTUpdate() { + LOG4CXX_AUTO_TRACE(logger_); + utils::SharedPtr<policy_table::Table> policy_table_snapshot = + cache_->GenerateSnapshot(); + if (!policy_table_snapshot) { + LOG4CXX_ERROR(logger_, "Failed to create snapshot of policy table"); + return; + } + + if (IsPTValid(policy_table_snapshot, policy_table::PT_SNAPSHOT)) { + Json::Value value = policy_table_snapshot->ToJsonValue(); + Json::FastWriter writer; + std::string message_string = writer.write(value); + + LOG4CXX_DEBUG(logger_, "Snapshot contents is : " << message_string); + + BinaryMessage update(message_string.begin(), message_string.end()); + + listener_->OnSnapshotCreated( + update, RetrySequenceDelaysSeconds(), TimeoutExchangeMSec()); + } else { + LOG4CXX_ERROR(logger_, "Invalid Policy table snapshot - PTUpdate failed"); + } +} + +void PolicyManagerImpl::StartPTExchange() { + LOG4CXX_AUTO_TRACE(logger_); + + if (ignition_check) { + CheckTriggers(); + ignition_check = false; + } + + if (update_status_manager_.IsAppsSearchInProgress() && + update_status_manager_.IsUpdateRequired()) { + LOG4CXX_INFO(logger_, + "Starting exchange skipped, since applications " + "search is in progress."); + return; + } + + if (update_status_manager_.IsUpdatePending()) { + update_status_manager_.ScheduleUpdate(); + LOG4CXX_INFO(logger_, + "Starting exchange skipped, since another exchange " + "is in progress."); + return; + } + LOG4CXX_INFO(logger_, "Policy want to call RequestPTUpdate"); + if (listener_ && listener_->CanUpdate()) { + LOG4CXX_INFO(logger_, "Listener CanUpdate"); + if (update_status_manager_.IsUpdateRequired()) { + LOG4CXX_INFO(logger_, "IsUpdateRequired"); + RequestPTUpdate(); + } + } +} + +void PolicyManagerImpl::OnAppsSearchStarted() { + LOG4CXX_AUTO_TRACE(logger_); + update_status_manager_.OnAppsSearchStarted(); +} + +void PolicyManagerImpl::OnAppsSearchCompleted() { + LOG4CXX_AUTO_TRACE(logger_); + update_status_manager_.OnAppsSearchCompleted(); + if (update_status_manager_.IsUpdateRequired()) { + StartPTExchange(); + } +} + +const std::vector<std::string> PolicyManagerImpl::GetAppRequestTypes( + const std::string policy_app_id) const { + std::vector<std::string> request_types; + if (kDeviceDisallowed == + cache_->GetDeviceConsent(GetCurrentDeviceId(policy_app_id))) { + cache_->GetAppRequestTypes(kPreDataConsentId, request_types); + } else { + cache_->GetAppRequestTypes(policy_app_id, request_types); + } + return request_types; +} + +const VehicleInfo PolicyManagerImpl::GetVehicleInfo() const { + return cache_->GetVehicleInfo(); +} + +void PolicyManagerImpl::CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + const RPCParams& rpc_params, + CheckPermissionResult& result) { + LOG4CXX_INFO(logger_, + "CheckPermissions for " << app_id << " and rpc " << rpc + << " for " << hmi_level << " level."); + + const std::string device_id = GetCurrentDeviceId(app_id); + + Permissions rpc_permissions; + + // Check, if there are calculated permission present in cache + if (!cache_->IsPermissionsCalculated(device_id, app_id, rpc_permissions)) { + LOG4CXX_DEBUG(logger_, + "IsPermissionsCalculated for device: " + << device_id << " and app: " << app_id + << " returns false"); + // Get actual application group permission according to user consents + std::vector<FunctionalGroupPermission> app_group_permissions; + GetPermissionsForApp(device_id, app_id, app_group_permissions); + + // Fill struct with known groups RPCs + policy_table::FunctionalGroupings functional_groupings; + cache_->GetFunctionalGroupings(functional_groupings); + + std::vector<FunctionalGroupPermission>::const_iterator it = + app_group_permissions.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_end = + app_group_permissions.end(); + policy_table::Strings app_groups; + for (; it != it_end; ++it) { + app_groups.push_back((*it).group_name); + } + + // Undefined groups (without user consent) disallowed by default, since + // OnPermissionsChange notification has no "undefined" section + // For RPC permission checking undefinded group will be treated as separate + // type + ProcessFunctionalGroup processor(functional_groupings, + app_group_permissions, + rpc_permissions, + GroupConsent::kGroupUndefined); + std::for_each(app_groups.begin(), app_groups.end(), processor); + + cache_->AddCalculatedPermissions(device_id, app_id, rpc_permissions); + } else { + LOG4CXX_DEBUG(logger_, + "IsPermissionsCalculated for device: " + << device_id << " and app: " << app_id + << " returns true"); + } + + const bool known_rpc = rpc_permissions.end() != rpc_permissions.find(rpc); + LOG4CXX_INFO(logger_, "Is known rpc " << known_rpc); + if (!known_rpc) { + // RPC not found in list == disallowed by backend + result.hmi_level_permitted = kRpcDisallowed; + return; + } + + // Check HMI level + if (rpc_permissions[rpc].hmi_permissions[kAllowedKey].end() != + rpc_permissions[rpc].hmi_permissions[kAllowedKey].find(hmi_level)) { + // RPC found in allowed == allowed by backend and user + result.hmi_level_permitted = kRpcAllowed; + } else if (rpc_permissions[rpc].hmi_permissions[kUndefinedKey].end() != + rpc_permissions[rpc].hmi_permissions[kUndefinedKey].find( + hmi_level)) { + // RPC found in undefined == allowed by backend, but not consented yet by + // user + result.hmi_level_permitted = kRpcDisallowed; + } else if (rpc_permissions[rpc].hmi_permissions[kUserDisallowedKey].end() != + rpc_permissions[rpc].hmi_permissions[kUserDisallowedKey].find( + hmi_level)) { + // RPC found in allowed == allowed by backend, but disallowed by user + result.hmi_level_permitted = kRpcUserDisallowed; + } else { + LOG4CXX_DEBUG(logger_, + "HMI level " << hmi_level << " wasn't found " + << " for rpc " << rpc << " and appID " + << app_id); + return; + } + + if (kRpcAllowed != result.hmi_level_permitted) { + LOG4CXX_DEBUG(logger_, "RPC is not allowed. Stop parameters processing."); + result.list_of_allowed_params = + rpc_permissions[rpc].parameter_permissions[kAllowedKey]; + + result.list_of_disallowed_params = + rpc_permissions[rpc].parameter_permissions[kUserDisallowedKey]; + + result.list_of_undefined_params = + rpc_permissions[rpc].parameter_permissions[kUndefinedKey]; + return; + } + + // Considered that items disallowed by user take priority over system (policy) + // permissions, so that flag is processed first + if (rpc_permissions[rpc] + .parameter_permissions.any_parameter_disallowed_by_user) { + LOG4CXX_DEBUG(logger_, "All parameters are disallowed by user."); + result.list_of_disallowed_params = rpc_params; + result.hmi_level_permitted = kRpcUserDisallowed; + return; + } + + if (rpc_permissions[rpc] + .parameter_permissions.any_parameter_disallowed_by_policy) { + LOG4CXX_DEBUG(logger_, "All parameters are disallowed by policy."); + result.list_of_undefined_params = rpc_params; + result.hmi_level_permitted = kRpcDisallowed; + return; + } + + if (rpc_permissions[rpc].parameter_permissions.any_parameter_allowed) { + LOG4CXX_DEBUG(logger_, "All parameters are allowed."); + result.list_of_allowed_params = rpc_params; + return; + } + + result.list_of_allowed_params = + rpc_permissions[rpc].parameter_permissions[kAllowedKey]; + + result.list_of_disallowed_params = + rpc_permissions[rpc].parameter_permissions[kUserDisallowedKey]; + + result.list_of_undefined_params = + rpc_permissions[rpc].parameter_permissions[kUndefinedKey]; + + // In case of some parameters of RPC are missing in current policy table + // they will be considered as disallowed by policy itself, not by user. + // Undefined parameters contain parameters present in policy table, but which + // have not been allowed or disallowed explicitly by user, so missing params + // are being added to undefined. + RPCParams::const_iterator parameter = rpc_params.begin(); + RPCParams::const_iterator end = rpc_params.end(); + for (; end != parameter; ++parameter) { + if (!result.HasParameter(*parameter)) { + LOG4CXX_DEBUG(logger_, + "Parameter " << *parameter << " is unknown." + " Adding to undefined list."); + result.list_of_undefined_params.insert(*parameter); + } + } + + if (result.DisallowedInclude(rpc_params)) { + LOG4CXX_DEBUG(logger_, "All parameters are disallowed."); + result.hmi_level_permitted = kRpcUserDisallowed; + } else if (!result.IsAnyAllowed(rpc_params)) { + LOG4CXX_DEBUG(logger_, "There are no parameters allowed."); + result.hmi_level_permitted = kRpcDisallowed; + } + + if (cache_->IsApplicationRevoked(app_id)) { + // SDL must be able to notify mobile side with its status after app has + // been revoked by backend + if ("OnHMIStatus" == rpc && "NONE" == hmi_level) { + result.hmi_level_permitted = kRpcAllowed; + } else { + result.hmi_level_permitted = kRpcDisallowed; + } + return; + } +} + +bool PolicyManagerImpl::ResetUserConsent() { + bool result = true; + result = cache_->ResetUserConsent(); + + return result; +} + +void PolicyManagerImpl::SendNotificationOnPermissionsUpdated( + const std::string& application_id) { + LOG4CXX_AUTO_TRACE(logger_); + const std::string device_id = GetCurrentDeviceId(application_id); + if (device_id.empty()) { + LOG4CXX_WARN(logger_, + "Couldn't find device info for application id " + "'" << application_id << "'"); + return; + } + + std::vector<FunctionalGroupPermission> app_group_permissions; + GetPermissionsForApp(device_id, application_id, app_group_permissions); + + policy_table::FunctionalGroupings functional_groupings; + cache_->GetFunctionalGroupings(functional_groupings); + + policy_table::Strings app_groups; + std::vector<FunctionalGroupPermission>::const_iterator it = + app_group_permissions.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_end = + app_group_permissions.end(); + for (; it != it_end; ++it) { + app_groups.push_back((*it).group_name); + } + + Permissions notification_data; + PrepareNotificationData(functional_groupings, + app_groups, + app_group_permissions, + notification_data); + + LOG4CXX_INFO(logger_, + "Send notification for application_id:" << application_id); + + std::string default_hmi; + GetDefaultHmi(application_id, &default_hmi); + + listener()->OnPermissionsUpdated( + application_id, notification_data, default_hmi); +} + +bool PolicyManagerImpl::CleanupUnpairedDevices() { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->CleanupUnpairedDevices(); +} + +DeviceConsent PolicyManagerImpl::GetUserConsentForDevice( + const std::string& device_id) const { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->GetDeviceConsent(device_id); +} + +void PolicyManagerImpl::SetUserConsentForDevice(const std::string& device_id, + const bool is_allowed) { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Device :" << device_id); + cache_->SetDeviceConsent(device_id, is_allowed); + if (listener_) { + listener_->OnDeviceConsentChanged(device_id, is_allowed); + } else { + LOG4CXX_WARN(logger_, + "Event listener is not initialized. " + "Can't call OnDeviceConsentChanged"); + } + if (is_allowed) { + update_status_manager_.OnDeviceConsented(); + } + StartPTExchange(); +} + +bool PolicyManagerImpl::ReactOnUserDevConsentForApp( + const std::string& app_id, const bool is_device_allowed) { + std::vector<std::string> current_request_types = GetAppRequestTypes(app_id); + std::string current_priority, new_priority; + GetPriority(app_id, ¤t_priority); + + bool result = cache_->ReactOnUserDevConsentForApp(app_id, is_device_allowed); + + std::vector<std::string> new_request_types = GetAppRequestTypes(app_id); + GetPriority(app_id, &new_priority); + std::sort(current_request_types.begin(), current_request_types.end()); + std::sort(new_request_types.begin(), new_request_types.end()); + + std::vector<std::string> diff; + std::set_symmetric_difference(current_request_types.begin(), + current_request_types.end(), + new_request_types.begin(), + new_request_types.end(), + std::back_inserter(diff)); + + AppPermissions permissions(app_id); + + if (!diff.empty()) { + permissions.requestType = new_request_types; + permissions.requestTypeChanged = true; + } + + if ((!current_priority.empty()) && (!new_priority.empty()) && + (current_priority != new_priority)) { + permissions.priority = new_priority; + } + + if (permissions.requestTypeChanged || (!permissions.priority.empty())) { + listener_->SendOnAppPermissionsChanged(permissions, app_id); + } + return result; +} + +bool PolicyManagerImpl::GetInitialAppData(const std::string& application_id, + StringArray* nicknames, + StringArray* app_hmi_types) { + LOG4CXX_AUTO_TRACE(logger_); + const bool result = nicknames && app_hmi_types; + if (result) { + cache_->GetInitialAppData(application_id, *nicknames, *app_hmi_types); + } + return result; +} + +void PolicyManagerImpl::AddDevice(const std::string& device_id, + const std::string& connection_type) { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Device: " << device_id); + if (!cache_->AddDevice(device_id, connection_type)) { + LOG4CXX_WARN(logger_, "Can't add device."); + } +} + +void PolicyManagerImpl::SetDeviceInfo(const std::string& device_id, + const DeviceInfo& device_info) { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Device :" << device_id); + if (!cache_->SetDeviceData(device_id, + device_info.hardware, + device_info.firmware_rev, + device_info.os, + device_info.os_ver, + device_info.carrier, + device_info.max_number_rfcom_ports, + device_info.connection_type)) { + LOG4CXX_WARN(logger_, "Can't set device data."); + } +} + +PermissionConsent PolicyManagerImpl::EnsureCorrectPermissionConsent( + const PermissionConsent& permissions_to_check) { + std::vector<FunctionalGroupPermission> current_user_consents; + GetUserConsentForApp(permissions_to_check.device_id, + permissions_to_check.policy_app_id, + current_user_consents); + + PermissionConsent permissions_to_set; + permissions_to_set.device_id = permissions_to_check.device_id; + permissions_to_set.policy_app_id = permissions_to_check.policy_app_id; + permissions_to_set.consent_source = permissions_to_check.consent_source; + + std::vector<FunctionalGroupPermission>::const_iterator it = + permissions_to_check.group_permissions.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_end = + permissions_to_check.group_permissions.end(); + + for (; it != it_end; ++it) { + std::vector<FunctionalGroupPermission>::const_iterator it_curr = + current_user_consents.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_curr_end = + current_user_consents.end(); + + for (; it_curr != it_curr_end; ++it_curr) { + if (it->group_alias == it_curr->group_alias && + it->group_id == it_curr->group_id) { + permissions_to_set.group_permissions.push_back(*it); + } + } + } + + return permissions_to_set; +} + +void PolicyManagerImpl::CheckPendingPermissionsChanges( + const std::string& policy_app_id, + const std::vector<FunctionalGroupPermission>& current_permissions) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(app_permissions_diff_lock_); + std::map<std::string, AppPermissions>::iterator it_pending = + app_permissions_diff_.find(policy_app_id); + if (app_permissions_diff_.end() == it_pending) { + LOG4CXX_WARN( + logger_, + "No pending permissions had been found for appID: " << policy_app_id); + return; + } + + LOG4CXX_DEBUG( + logger_, + "Pending permissions had been found for appID: " << policy_app_id); + + // Change appPermissionsConsentNeeded depending on unconsented groups + // presence + std::vector<policy::FunctionalGroupPermission>::const_iterator it_groups = + current_permissions.begin(); + std::vector<policy::FunctionalGroupPermission>::const_iterator it_end_groups = + current_permissions.end(); + + for (; it_groups != it_end_groups; ++it_groups) { + if (policy::kGroupUndefined == it_groups->state) { + LOG4CXX_DEBUG( + logger_, + "Unconsented groups still present for appID: " << policy_app_id); + it_pending->second.appPermissionsConsentNeeded = true; + return; + } + } + + LOG4CXX_DEBUG( + logger_, + "Unconsented groups not present anymore for appID: " << policy_app_id); + it_pending->second.appPermissionsConsentNeeded = false; + return; +} + +void PolicyManagerImpl::SetUserConsentForApp( + const PermissionConsent& permissions) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->ResetCalculatedPermissions(); + PermissionConsent verified_permissions = + EnsureCorrectPermissionConsent(permissions); + + if (!cache_->SetUserPermissionsForApp(verified_permissions)) { + LOG4CXX_WARN(logger_, "Can't set user permissions for application."); + } + + // Send OnPermissionChange notification, since consents were changed + std::vector<FunctionalGroupPermission> app_group_permissons; + GetPermissionsForApp(verified_permissions.device_id, + verified_permissions.policy_app_id, + app_group_permissons); + + // Change pending permissions isConsentNeeded state, if no unconsented + // groups left + CheckPendingPermissionsChanges(permissions.policy_app_id, + app_group_permissons); + + // Get current functional groups from DB with RPC permissions + policy_table::FunctionalGroupings functional_groups; + cache_->GetFunctionalGroupings(functional_groups); + + // Get list of groups assigned to application + policy_table::Strings app_groups; + std::vector<FunctionalGroupPermission>::const_iterator it = + app_group_permissons.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_end = + app_group_permissons.end(); + for (; it != it_end; ++it) { + app_groups.push_back((*it).group_name); + } + + // Fill notification data according to group permissions + Permissions notification_data; + PrepareNotificationData( + functional_groups, app_groups, app_group_permissons, notification_data); + + listener()->OnPermissionsUpdated(verified_permissions.policy_app_id, + notification_data); +} + +bool PolicyManagerImpl::GetDefaultHmi(const std::string& policy_app_id, + std::string* default_hmi) const { + LOG4CXX_AUTO_TRACE(logger_); + const std::string device_id = GetCurrentDeviceId(policy_app_id); + DeviceConsent device_consent = GetUserConsentForDevice(device_id); + const std::string app_id = policy::kDeviceAllowed != device_consent + ? kPreDataConsentId + : policy_app_id; + return cache_->GetDefaultHMI(app_id, *default_hmi); +} + +bool PolicyManagerImpl::GetPriority(const std::string& policy_app_id, + std::string* priority) const { + LOG4CXX_AUTO_TRACE(logger_); + if (!priority) { + LOG4CXX_WARN(logger_, "Input priority parameter is null."); + return false; + } + + return cache_->GetPriority(policy_app_id, *priority); +} + +std::vector<UserFriendlyMessage> PolicyManagerImpl::GetUserFriendlyMessages( + const std::vector<std::string>& message_code, + const std::string& language, + const std::string& active_hmi_language) { + return cache_->GetUserFriendlyMsg( + message_code, language, active_hmi_language); +} + +void PolicyManagerImpl::GetUserConsentForApp( + const std::string& device_id, + const std::string& policy_app_id, + std::vector<FunctionalGroupPermission>& permissions) { + LOG4CXX_AUTO_TRACE(logger_); + + FunctionalIdType group_types; + if (!cache_->GetPermissionsForApp(device_id, policy_app_id, group_types)) { + LOG4CXX_WARN(logger_, + "Can't get user permissions for app " << policy_app_id); + return; + } + + // Functional groups w/o alias ("user_consent_prompt") considered as + // automatically allowed and it could not be changed by user + FunctionalGroupNames group_names; + if (!cache_->GetFunctionalGroupNames(group_names)) { + LOG4CXX_WARN(logger_, "Can't get functional group names"); + return; + } + + FunctionalGroupNames::const_iterator it = group_names.begin(); + FunctionalGroupNames::const_iterator it_end = group_names.end(); + FunctionalGroupIDs auto_allowed_groups; + for (; it != it_end; ++it) { + if (it->second.first.empty()) { + auto_allowed_groups.push_back(it->first); + } + } + + FunctionalGroupIDs all_groups = group_types[kTypeGeneral]; + FunctionalGroupIDs preconsented_groups = group_types[kTypePreconsented]; + FunctionalGroupIDs consent_allowed_groups = group_types[kTypeAllowed]; + FunctionalGroupIDs consent_disallowed_groups = group_types[kTypeDisallowed]; + FunctionalGroupIDs default_groups = group_types[kTypeDefault]; + FunctionalGroupIDs predataconsented_groups = + group_types[kTypePreDataConsented]; + FunctionalGroupIDs device_groups = group_types[kTypeDevice]; + + // Sorting groups by consent + FunctionalGroupIDs preconsented_wo_auto = + ExcludeSame(preconsented_groups, auto_allowed_groups); + + FunctionalGroupIDs preconsented_wo_disallowed_auto = + ExcludeSame(preconsented_wo_auto, consent_disallowed_groups); + + FunctionalGroupIDs allowed_groups = + Merge(consent_allowed_groups, preconsented_wo_disallowed_auto); + + FunctionalGroupIDs merged_stage_1 = + Merge(default_groups, predataconsented_groups); + + FunctionalGroupIDs merged_stage_2 = Merge(merged_stage_1, device_groups); + + FunctionalGroupIDs merged_stage_3 = + Merge(merged_stage_2, auto_allowed_groups); + + FunctionalGroupIDs excluded_stage_1 = ExcludeSame(all_groups, merged_stage_3); + + FunctionalGroupIDs excluded_stage_2 = + ExcludeSame(excluded_stage_1, consent_disallowed_groups); + + FunctionalGroupIDs undefined_consent = + ExcludeSame(excluded_stage_2, allowed_groups); + + // Fill result + FillFunctionalGroupPermissions( + undefined_consent, group_names, kGroupUndefined, permissions); + FillFunctionalGroupPermissions( + allowed_groups, group_names, kGroupAllowed, permissions); + FillFunctionalGroupPermissions( + consent_disallowed_groups, group_names, kGroupDisallowed, permissions); +} + +void PolicyManagerImpl::GetPermissionsForApp( + const std::string& device_id, + const std::string& policy_app_id, + std::vector<FunctionalGroupPermission>& permissions) { + LOG4CXX_AUTO_TRACE(logger_); + std::string app_id_to_check = policy_app_id; + + bool allowed_by_default = false; + if (cache_->IsDefaultPolicy(policy_app_id)) { + app_id_to_check = kDefaultId; + allowed_by_default = true; + } else if (cache_->IsPredataPolicy(policy_app_id) || + policy::kDeviceDisallowed == GetUserConsentForDevice(device_id)) { + app_id_to_check = kPreDataConsentId; + allowed_by_default = true; + } + + FunctionalIdType group_types; + if (!cache_->GetPermissionsForApp(device_id, app_id_to_check, group_types)) { + LOG4CXX_WARN(logger_, + "Can't get user permissions for app " << policy_app_id); + return; + } + + // Functional groups w/o alias ("user_consent_prompt") considered as + // automatically allowed and it could not be changed by user + FunctionalGroupNames group_names; + if (!cache_->GetFunctionalGroupNames(group_names)) { + LOG4CXX_WARN(logger_, "Can't get functional group names"); + return; + } + + // The "default" and "pre_DataConsent" are auto-allowed groups + // So, check if application in the one of these mode. + if (allowed_by_default) { + LOG4CXX_INFO(logger_, "Get auto allowed groups"); + GroupType type = + (kDefaultId == app_id_to_check ? kTypeDefault : kTypePreDataConsented); + + FillFunctionalGroupPermissions( + group_types[type], group_names, kGroupAllowed, permissions); + } else { + // The code bellow allows to process application which + // has specific permissions(not default and pre_DataConsent). + + // All groups for specific application + FunctionalGroupIDs all_groups = group_types[kTypeGeneral]; + + // Groups assigned by the user for specific application + FunctionalGroupIDs allowed_groups = group_types[kTypeAllowed]; + + // Groups disallowed by the user for specific application + FunctionalGroupIDs common_disallowed = group_types[kTypeDisallowed]; + + // Groups that allowed by default but can be changed by the user + FunctionalGroupIDs preconsented_groups = group_types[kTypePreconsented]; + + // Groups which has user consent promt but there is no any consnets now. + FunctionalGroupIDs unconsented_groups = group_types[kTypeUnconsented]; + + // Pull common groups from allowed and preconsented parts. + FunctionalGroupIDs allowed_preconsented = + Merge(allowed_groups, preconsented_groups); + + // Get all groups that we suppose are allowed. + FunctionalGroupIDs all_allowed = Merge(allowed_preconsented, all_groups); + + // In case when same groups exists in disallowed and allowed tables, + // disallowed one have priority over allowed. So we have to remove + // all disallowed groups from allowed table. + FunctionalGroupIDs common_allowed = + ExcludeSame(all_allowed, common_disallowed); + FunctionalGroupIDs consent_disallowed = + ExcludeSame(unconsented_groups, preconsented_groups); + + // Disallowed groups are contain all directly disallowed, + // plus unconsented minus preconsented. + FunctionalGroupIDs all_disallowed = + Merge(common_disallowed, consent_disallowed); + + // Fill result + FillFunctionalGroupPermissions( + consent_disallowed, group_names, kGroupUndefined, permissions); + FillFunctionalGroupPermissions( + common_allowed, group_names, kGroupAllowed, permissions); + FillFunctionalGroupPermissions( + all_disallowed, group_names, kGroupDisallowed, permissions); + } + return; +} + +std::string& PolicyManagerImpl::GetCurrentDeviceId( + const std::string& policy_app_id) const { + LOG4CXX_INFO(logger_, "GetDeviceInfo"); + last_device_id_ = listener()->OnCurrentDeviceIdUpdateRequired(policy_app_id); + return last_device_id_; +} + +void PolicyManagerImpl::SetSystemLanguage(const std::string& language) { + cache_->SetSystemLanguage(language); +} + +void PolicyManagerImpl::SetSystemInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->SetMetaInfo(ccpu_version, wers_country_code, language); +} + +void PolicyManagerImpl::OnSystemReady() { + // Update policy table for the first time with system information + if (!cache_->IsMetaInfoPresent()) { + listener()->OnSystemInfoUpdateRequired(); + } +} + +uint32_t PolicyManagerImpl::GetNotificationsNumber( + const std::string& priority) const { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->GetNotificationsNumber(priority); +} + +bool PolicyManagerImpl::ExceededIgnitionCycles() { + return 0 == cache_->IgnitionCyclesBeforeExchange(); +} + +bool PolicyManagerImpl::IsPTValid( + utils::SharedPtr<policy_table::Table> policy_table, + policy_table::PolicyTableType type) const { + policy_table->SetPolicyTableType(type); + if (!policy_table->is_valid()) { + LOG4CXX_ERROR(logger_, "Policy table is not valid."); + rpc::ValidationReport report("policy_table"); + policy_table->ReportErrors(&report); + LOG4CXX_DEBUG(logger_, "Errors: " << rpc::PrettyFormat(report)); + return false; + } + return true; +} + +const PolicySettings& PolicyManagerImpl::get_settings() const { + DCHECK(settings_); + return *settings_; +} + +bool PolicyManagerImpl::ExceededDays() { + LOG4CXX_AUTO_TRACE(logger_); + + TimevalStruct current_time = date_time::DateTime::getCurrentTime(); + const int kSecondsInDay = 60 * 60 * 24; + const int days = current_time.tv_sec / kSecondsInDay; + + DCHECK(std::numeric_limits<uint16_t>::max() >= days); + + if (std::numeric_limits<uint16_t>::max() <= days) { + LOG4CXX_WARN(logger_, "The days since epoch exceeds maximum value."); + return false; + } + return 0 == cache_->DaysBeforeExchange(static_cast<uint16_t>(days)); +} + +void PolicyManagerImpl::KmsChanged(int kilometers) { + LOG4CXX_AUTO_TRACE(logger_); + if (0 == cache_->KilometersBeforeExchange(kilometers)) { + LOG4CXX_INFO(logger_, "Enough kilometers passed to send for PT update."); + update_status_manager_.ScheduleUpdate(); + StartPTExchange(); + PTUpdatedAt(KILOMETERS, kilometers); + } +} + +void PolicyManagerImpl::IncrementIgnitionCycles() { + cache_->IncrementIgnitionCycles(); +} + +std::string PolicyManagerImpl::ForcePTExchange() { + update_status_manager_.ScheduleUpdate(); + StartPTExchange(); + return update_status_manager_.StringifiedUpdateStatus(); +} + +std::string PolicyManagerImpl::GetPolicyTableStatus() const { + return update_status_manager_.StringifiedUpdateStatus(); +} + +int PolicyManagerImpl::NextRetryTimeout() { + sync_primitives::AutoLock auto_lock(retry_sequence_lock_); + LOG4CXX_DEBUG(logger_, "Index: " << retry_sequence_index_); + int next = 0; + if (!retry_sequence_seconds_.empty() && + retry_sequence_index_ < retry_sequence_seconds_.size()) { + next = retry_sequence_seconds_[retry_sequence_index_]; + ++retry_sequence_index_; + } + return next; +} + +void PolicyManagerImpl::RefreshRetrySequence() { + sync_primitives::AutoLock auto_lock(retry_sequence_lock_); + retry_sequence_timeout_ = cache_->TimeoutResponse(); + retry_sequence_seconds_.clear(); + cache_->SecondsBetweenRetries(retry_sequence_seconds_); +} + +void PolicyManagerImpl::ResetRetrySequence() { + sync_primitives::AutoLock auto_lock(retry_sequence_lock_); + retry_sequence_index_ = 0; + update_status_manager_.OnResetRetrySequence(); +} + +uint32_t PolicyManagerImpl::TimeoutExchangeMSec() { + return retry_sequence_timeout_; +} + +const std::vector<int> PolicyManagerImpl::RetrySequenceDelaysSeconds() { + sync_primitives::AutoLock auto_lock(retry_sequence_lock_); + return retry_sequence_seconds_; +} + +void PolicyManagerImpl::OnExceededTimeout() { + update_status_manager_.OnUpdateTimeoutOccurs(); +} + +void PolicyManagerImpl::OnUpdateStarted() { + uint32_t update_timeout = TimeoutExchangeMSec(); + LOG4CXX_DEBUG(logger_, + "Update timeout will be set to (milisec): " << update_timeout); + update_status_manager_.OnUpdateSentOut(update_timeout); + cache_->SaveUpdateRequired(true); +} + +void PolicyManagerImpl::PTUpdatedAt(Counters counter, int value) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->SetCountersPassedForSuccessfulUpdate(counter, value); + cache_->ResetIgnitionCycles(); +} + +void PolicyManagerImpl::Increment(usage_statistics::GlobalCounterId type) { + LOG4CXX_INFO(logger_, "Increment without app id"); + cache_->Increment(type); +} + +void PolicyManagerImpl::Increment(const std::string& app_id, + usage_statistics::AppCounterId type) { + LOG4CXX_DEBUG(logger_, "Increment " << app_id << " AppCounter: " << type); + cache_->Increment(app_id, type); +} + +void PolicyManagerImpl::Set(const std::string& app_id, + usage_statistics::AppInfoId type, + const std::string& value) { + LOG4CXX_INFO(logger_, "Set " << app_id); + cache_->Set(app_id, type, value); +} + +void PolicyManagerImpl::Add(const std::string& app_id, + usage_statistics::AppStopwatchId type, + int32_t timespan_seconds) { + LOG4CXX_INFO(logger_, "Add " << app_id); + cache_->Add(app_id, type, timespan_seconds); +} + +bool PolicyManagerImpl::IsApplicationRevoked(const std::string& app_id) const { + return cache_->IsApplicationRevoked(app_id); +} + +bool PolicyManagerImpl::IsConsentNeeded(const std::string& app_id) { + LOG4CXX_AUTO_TRACE(logger_); + const std::string device_id = GetCurrentDeviceId(app_id); + int count = cache_->CountUnconsentedGroups(app_id, device_id); + LOG4CXX_DEBUG(logger_, "There are: " << count << " unconsented groups."); + return count != 0; +} + +void PolicyManagerImpl::SetVINValue(const std::string& value) { + cache_->SetVINValue(value); +} + +AppPermissions PolicyManagerImpl::GetAppPermissionsChanges( + const std::string& policy_app_id) { + typedef std::map<std::string, AppPermissions>::iterator PermissionsIt; + PermissionsIt app_id_diff = app_permissions_diff_.find(policy_app_id); + AppPermissions permissions(policy_app_id); + if (app_permissions_diff_.end() != app_id_diff) { + permissions = app_id_diff->second; + } else { + permissions.appPermissionsConsentNeeded = IsConsentNeeded(policy_app_id); + permissions.appRevoked = IsApplicationRevoked(policy_app_id); + GetPriority(permissions.application_id, &permissions.priority); + } + return permissions; +} + +void PolicyManagerImpl::RemovePendingPermissionChanges( + const std::string& app_id) { + app_permissions_diff_.erase(app_id); +} + +bool PolicyManagerImpl::CanAppKeepContext(const std::string& app_id) const { + return cache_->CanAppKeepContext(app_id); +} + +bool PolicyManagerImpl::CanAppStealFocus(const std::string& app_id) const { + return cache_->CanAppStealFocus(app_id); +} + +void PolicyManagerImpl::MarkUnpairedDevice(const std::string& device_id) { + if (!cache_->SetUnpairedDevice(device_id)) { + LOG4CXX_DEBUG(logger_, "Could not set unpaired flag for " << device_id); + return; + } + SetUserConsentForDevice(device_id, false); +} + +void PolicyManagerImpl::OnAppRegisteredOnMobile( + const std::string& application_id) { + StartPTExchange(); + SendNotificationOnPermissionsUpdated(application_id); +} + +const MetaInfo PolicyManagerImpl::GetMetaInfo() const { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->GetMetaInfo(); +} + +std::string PolicyManagerImpl::RetrieveCertificate() const { + LOG4CXX_AUTO_TRACE(logger_); + return cache_->GetCertificate(); +} + +bool PolicyManagerImpl::HasCertificate() const { + return !cache_->GetCertificate().empty(); +} + +void PolicyManagerImpl::SetDecryptedCertificate( + const std::string& certificate) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->SetDecryptedCertificate(certificate); +} + +/** + * @brief The CallStatusChange class notify update manager aboun new application + */ +class CallStatusChange : public utils::Callable { + public: + CallStatusChange(UpdateStatusManager& upd_manager, + const DeviceConsent& device_consent) + : upd_manager_(upd_manager), device_consent_(device_consent) {} + + // Callable interface + void operator()() const { + upd_manager_.OnNewApplicationAdded(device_consent_); + } + + private: + UpdateStatusManager& upd_manager_; + const DeviceConsent device_consent_; +}; + +StatusNotifier PolicyManagerImpl::AddApplication( + const std::string& application_id) { + LOG4CXX_AUTO_TRACE(logger_); + const std::string device_id = GetCurrentDeviceId(application_id); + DeviceConsent device_consent = GetUserConsentForDevice(device_id); + sync_primitives::AutoLock lock(apps_registration_lock_); + + if (IsNewApplication(application_id)) { + AddNewApplication(application_id, device_consent); + return utils::MakeShared<CallStatusChange>(update_status_manager_, + device_consent); + } else { + PromoteExistedApplication(application_id, device_consent); + return utils::MakeShared<utils::CallNothing>(); + } +} + +void PolicyManagerImpl::RemoveAppConsentForGroup( + const std::string& app_id, const std::string& group_name) { + cache_->RemoveAppConsentForGroup(app_id, group_name); +} + +bool PolicyManagerImpl::IsPredataPolicy( + const std::string& policy_app_id) const { + LOG4CXX_INFO(logger_, "IsPredataApp"); + return cache_->IsPredataPolicy(policy_app_id); +} + +void PolicyManagerImpl::AddNewApplication(const std::string& application_id, + DeviceConsent device_consent) { + LOG4CXX_AUTO_TRACE(logger_); + + if (kDeviceHasNoConsent == device_consent || + kDeviceDisallowed == device_consent) { + LOG4CXX_INFO(logger_, + "Setting " + << policy::kPreDataConsentId + << " permissions for application id: " << application_id); + cache_->SetPredataPolicy(application_id); + } else { + LOG4CXX_INFO(logger_, + "Setting " + << policy::kDefaultId + << " permissions for application id: " << application_id); + cache_->SetDefaultPolicy(application_id); + } +} + +void PolicyManagerImpl::PromoteExistedApplication( + const std::string& application_id, DeviceConsent device_consent) { + // If device consent changed to allowed during application being + // disconnected, app permissions should be changed also + if (kDeviceAllowed == device_consent && + cache_->IsPredataPolicy(application_id)) { + cache_->SetDefaultPolicy(application_id); + } + if (HasCertificate()) { + LOG4CXX_DEBUG(logger_, "Certificate exits, no update required."); + return; + } + + if (cache_->AppHasHMIType(application_id, policy_table::AHT_NAVIGATION)) { + update_status_manager_.ScheduleUpdate(); + } +} + +bool PolicyManagerImpl::IsNewApplication( + const std::string& application_id) const { + return false == cache_->IsApplicationRepresented(application_id); +} + +bool PolicyManagerImpl::ResetPT(const std::string& file_name) { + LOG4CXX_AUTO_TRACE(logger_); + cache_->ResetCalculatedPermissions(); + const bool result = cache_->ResetPT(file_name); + if (result) { + RefreshRetrySequence(); + } + return result; +} + +bool PolicyManagerImpl::CheckAppStorageFolder() const { + LOG4CXX_AUTO_TRACE(logger_); + const std::string app_storage_folder = get_settings().app_storage_folder(); + LOG4CXX_DEBUG(logger_, "AppStorageFolder " << app_storage_folder); + if (!file_system::DirectoryExists(app_storage_folder)) { + LOG4CXX_WARN(logger_, + "Storage directory doesn't exist " << app_storage_folder); + return false; + } + if (!(file_system::IsWritingAllowed(app_storage_folder) && + file_system::IsReadingAllowed(app_storage_folder))) { + LOG4CXX_WARN(logger_, + "Storage directory doesn't have read/write permissions " + << app_storage_folder); + return false; + } + return true; +} + +bool PolicyManagerImpl::InitPT(const std::string& file_name, + const PolicySettings* settings) { + LOG4CXX_AUTO_TRACE(logger_); + settings_ = settings; + if (!CheckAppStorageFolder()) { + LOG4CXX_ERROR(logger_, "Can not read/write into AppStorageFolder"); + return false; + } + const bool ret = cache_->Init(file_name, settings); + if (ret) { + RefreshRetrySequence(); + update_status_manager_.OnPolicyInit(cache_->UpdateRequired()); + } + return ret; +} + +uint32_t PolicyManagerImpl::HeartBeatTimeout(const std::string& app_id) const { + return cache_->HeartBeatTimeout(app_id); +} + +void PolicyManagerImpl::SaveUpdateStatusRequired(bool is_update_needed) { + cache_->SaveUpdateRequired(is_update_needed); +} + +void PolicyManagerImpl::set_cache_manager( + CacheManagerInterface* cache_manager) { + cache_ = cache_manager; +} + +} // namespace policy diff --git a/src/components/policy/policy_external/src/policy_table.cc b/src/components/policy/policy_external/src/policy_table.cc new file mode 100644 index 0000000000..7a63fac50d --- /dev/null +++ b/src/components/policy/policy_external/src/policy_table.cc @@ -0,0 +1,52 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "policy/policy_table.h" + +#include "policy/sql_pt_ext_representation.h" + +#include "utils/logger.h" + +namespace policy { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +PolicyTable::PolicyTable() : pt_data_(new SQLPTExtRepresentation()) {} + +PolicyTable::PolicyTable(utils::SharedPtr<PTRepresentation> pt_data) + : pt_data_(pt_data) {} + +PolicyTable::~PolicyTable() { + LOG4CXX_INFO(logger_, "Destroying policy table."); +} + +} // namespace policy diff --git a/src/components/policy/policy_external/src/policy_table/enums.cc b/src/components/policy/policy_external/src/policy_table/enums.cc new file mode 100644 index 0000000000..e70167c94b --- /dev/null +++ b/src/components/policy/policy_external/src/policy_table/enums.cc @@ -0,0 +1,723 @@ +// This file is generated, do not edit +#include "policy/policy_table/enums.h" + +namespace rpc { +namespace policy_table_interface_base { +bool IsValidEnum(Priority val) { + switch (val) { + case P_EMERGENCY: + return true; + case P_NAVIGATION: + return true; + case P_VOICECOM: + return true; + case P_COMMUNICATION: + return true; + case P_NORMAL: + return true; + case P_NONE: + return true; + default: + return false; + } +} +const char* EnumToJsonString(Priority val) { + switch (val) { + case P_EMERGENCY: + return "EMERGENCY"; + case P_NAVIGATION: + return "NAVIGATION"; + case P_VOICECOM: + return "VOICECOM"; + case P_COMMUNICATION: + return "COMMUNICATION"; + case P_NORMAL: + return "NORMAL"; + case P_NONE: + return "NONE"; + default: + return ""; + } +} +bool EnumFromJsonString(const std::string& literal, Priority* result) { + if ("EMERGENCY" == literal) { + *result = P_EMERGENCY; + return true; + } else if ("NAVIGATION" == literal) { + *result = P_NAVIGATION; + return true; + } else if ("VOICECOM" == literal) { + *result = P_VOICECOM; + return true; + } else if ("COMMUNICATION" == literal) { + *result = P_COMMUNICATION; + return true; + } else if ("NORMAL" == literal) { + *result = P_NORMAL; + return true; + } else if ("NONE" == literal) { + *result = P_NONE; + return true; + } else { + return false; + } +} + +bool IsValidEnum(HmiLevel val) { + switch (val) { + case HL_BACKGROUND: + return true; + case HL_FULL: + return true; + case HL_LIMITED: + return true; + case HL_NONE: + return true; + default: + return false; + } +} +const char* EnumToJsonString(HmiLevel val) { + switch (val) { + case HL_BACKGROUND: + return "BACKGROUND"; + case HL_FULL: + return "FULL"; + case HL_LIMITED: + return "LIMITED"; + case HL_NONE: + return "NONE"; + default: + return ""; + } +} +bool EnumFromJsonString(const std::string& literal, HmiLevel* result) { + if ("BACKGROUND" == literal) { + *result = HL_BACKGROUND; + return true; + } else if ("FULL" == literal) { + *result = HL_FULL; + return true; + } else if ("LIMITED" == literal) { + *result = HL_LIMITED; + return true; + } else if ("NONE" == literal) { + *result = HL_NONE; + return true; + } else { + return false; + } +} + +bool IsValidEnum(Parameter val) { + switch (val) { + case P_GPS: + return true; + case P_SPEED: + return true; + case P_ENGINETORQUE: + return true; + case P_EXTERNALTEMPERATURE: + return true; + case P_FUELLEVEL: + return true; + case P_FUELLEVEL_STATE: + return true; + case P_HEADLAMPSTATUS: + return true; + case P_INSTANTFUELCONSUMPTION: + return true; + case P_ODOMETER: + return true; + case P_TIREPRESSURE: + return true; + case P_WIPERSTATUS: + return true; + case P_VIN: + return true; + case P_ACCPEDALPOSITION: + return true; + case P_BELTSTATUS: + return true; + case P_DRIVERBRAKING: + return true; + case P_PRNDL: + return true; + case P_RPM: + return true; + case P_STEERINGWHEELANGLE: + return true; + case P_MYKEY: + return true; + case P_AIRBAGSTATUS: + return true; + case P_BODYINFORMATION: + return true; + case P_CLUSTERMODESTATUS: + return true; + case P_DEVICESTATUS: + return true; + case P_EMERGENCYEVENT: + return true; + case P_ECALLINFO: + return true; + case P_ABS_STATE: + return true; + case P_TURN_SIGNAL: + return true; + case P_FUEL_RANGE: + return true; + case P_TIRE_PRESSURE_VALUE: + return true; + case P_TPMS: + return true; + case P_LONGTITUDE_DEGREES: + return true; + case P_LATITUDE_DEGREES: + return true; + case P_LOCATION_NAME: + return true; + case P_LOCATION_DESCRIPTION: + return true; + case P_ADDRESS_LINES: + return true; + case P_PHONE_NUMBER: + return true; + case P_LOCATION_IMAGE: + return true; + case P_DELIVERY_MODE: + return true; + case P_TIMESTAMP: + return true; + case P_ADDRESS: + return true; + case P_EMPTY: + return true; + default: + return false; + } +} + +const char* EnumToJsonString(Parameter val) { + switch (val) { + case P_GPS: + return "gps"; + case P_SPEED: + return "speed"; + case P_ENGINETORQUE: + return "engineTorque"; + case P_EXTERNALTEMPERATURE: + return "externalTemperature"; + case P_FUELLEVEL: + return "fuelLevel"; + case P_FUELLEVEL_STATE: + return "fuelLevel_State"; + case P_HEADLAMPSTATUS: + return "headLampStatus"; + case P_INSTANTFUELCONSUMPTION: + return "instantFuelConsumption"; + case P_ODOMETER: + return "odometer"; + case P_TIREPRESSURE: + return "tirePressure"; + case P_WIPERSTATUS: + return "wiperStatus"; + case P_VIN: + return "vin"; + case P_ACCPEDALPOSITION: + return "accPedalPosition"; + case P_BELTSTATUS: + return "beltStatus"; + case P_DRIVERBRAKING: + return "driverBraking"; + case P_PRNDL: + return "prndl"; + case P_RPM: + return "rpm"; + case P_STEERINGWHEELANGLE: + return "steeringWheelAngle"; + case P_MYKEY: + return "myKey"; + case P_AIRBAGSTATUS: + return "airbagStatus"; + case P_BODYINFORMATION: + return "bodyInformation"; + case P_CLUSTERMODESTATUS: + return "clusterModeStatus"; + case P_DEVICESTATUS: + return "deviceStatus"; + case P_EMERGENCYEVENT: + return "emergencyEvent"; + case P_ECALLINFO: + return "eCallInfo"; + case P_ABS_STATE: + return "abs_State"; + case P_TURN_SIGNAL: + return "turnSignal"; + case P_FUEL_RANGE: + return "fuelRange"; + case P_TIRE_PRESSURE_VALUE: + return "tirePressureValue"; + case P_TPMS: + return "tpms"; + case P_LONGTITUDE_DEGREES: + return "longitudeDegrees"; + case P_LATITUDE_DEGREES: + return "latitudeDegrees"; + case P_LOCATION_NAME: + return "locationName"; + case P_LOCATION_DESCRIPTION: + return "locationDescription"; + case P_ADDRESS_LINES: + return "addressLines"; + case P_PHONE_NUMBER: + return "phoneNumber"; + case P_LOCATION_IMAGE: + return "locationImage"; + case P_DELIVERY_MODE: + return "deliveryMode"; + case P_TIMESTAMP: + return "timeStamp"; + case P_ADDRESS: + return "address"; + case P_EMPTY: + return "EMPTY"; + default: + return ""; + } +} + +bool EnumFromJsonString(const std::string& literal, Parameter* result) { + if ("gps" == literal) { + *result = P_GPS; + return true; + } else if ("speed" == literal) { + *result = P_SPEED; + return true; + } else if ("engineTorque" == literal) { + *result = P_ENGINETORQUE; + return true; + } else if ("externalTemperature" == literal) { + *result = P_EXTERNALTEMPERATURE; + return true; + } else if ("fuelLevel" == literal) { + *result = P_FUELLEVEL; + return true; + } else if ("fuelLevel_State" == literal) { + *result = P_FUELLEVEL_STATE; + return true; + } else if ("headLampStatus" == literal) { + *result = P_HEADLAMPSTATUS; + return true; + } else if ("instantFuelConsumption" == literal) { + *result = P_INSTANTFUELCONSUMPTION; + return true; + } else if ("odometer" == literal) { + *result = P_ODOMETER; + return true; + } else if ("tirePressure" == literal) { + *result = P_TIREPRESSURE; + return true; + } else if ("wiperStatus" == literal) { + *result = P_WIPERSTATUS; + return true; + } else if ("vin" == literal) { + *result = P_VIN; + return true; + } else if ("accPedalPosition" == literal) { + *result = P_ACCPEDALPOSITION; + return true; + } else if ("beltStatus" == literal) { + *result = P_BELTSTATUS; + return true; + } else if ("driverBraking" == literal) { + *result = P_DRIVERBRAKING; + return true; + } else if ("prndl" == literal) { + *result = P_PRNDL; + return true; + } else if ("rpm" == literal) { + *result = P_RPM; + return true; + } else if ("steeringWheelAngle" == literal) { + *result = P_STEERINGWHEELANGLE; + return true; + } else if ("myKey" == literal) { + *result = P_MYKEY; + return true; + } else if ("airbagStatus" == literal) { + *result = P_AIRBAGSTATUS; + return true; + } else if ("bodyInformation" == literal) { + *result = P_BODYINFORMATION; + return true; + } else if ("clusterModeStatus" == literal) { + *result = P_CLUSTERMODESTATUS; + return true; + } else if ("deviceStatus" == literal) { + *result = P_DEVICESTATUS; + return true; + } else if ("emergencyEvent" == literal) { + *result = P_EMERGENCYEVENT; + return true; + } else if ("eCallInfo" == literal) { + *result = P_ECALLINFO; + return true; + } else if ("abs_State" == literal) { + *result = P_ABS_STATE; + return true; + } else if ("turnSignal" == literal) { + *result = P_TURN_SIGNAL; + return true; + } else if ("fuelRange" == literal) { + *result = P_FUEL_RANGE; + return true; + } else if ("tirePressureValue" == literal) { + *result = P_TIRE_PRESSURE_VALUE; + return true; + } else if ("tpms" == literal) { + *result = P_TPMS; + return true; + } else if ("longitudeDegrees" == literal) { + *result = P_LONGTITUDE_DEGREES; + return true; + } else if ("latitudeDegrees" == literal) { + *result = P_LATITUDE_DEGREES; + return true; + } else if ("locationName" == literal) { + *result = P_LOCATION_NAME; + return true; + } else if ("locationDescription" == literal) { + *result = P_LOCATION_DESCRIPTION; + return true; + } else if ("addressLines" == literal) { + *result = P_ADDRESS_LINES; + return true; + } else if ("phoneNumber" == literal) { + *result = P_PHONE_NUMBER; + return true; + } else if ("locationImage" == literal) { + *result = P_LOCATION_IMAGE; + return true; + } else if ("deliveryMode" == literal) { + *result = P_DELIVERY_MODE; + return true; + } else if ("timeStamp" == literal) { + *result = P_TIMESTAMP; + return true; + } else if ("address" == literal) { + *result = P_ADDRESS; + return true; + } else if ("EMPTY" == literal) { + *result = P_EMPTY; + return true; + } else { + return false; + } +} + +bool IsValidEnum(AppHMIType val) { + switch (val) { + case AHT_DEFAULT: + return true; + case AHT_COMMUNICATION: + return true; + case AHT_MEDIA: + return true; + case AHT_MESSAGING: + return true; + case AHT_NAVIGATION: + return true; + case AHT_INFORMATION: + return true; + case AHT_SOCIAL: + return true; + case AHT_BACKGROUND_PROCESS: + return true; + case AHT_TESTING: + return true; + case AHT_SYSTEM: + return true; + default: + return false; + } +} +const char* EnumToJsonString(AppHMIType val) { + switch (val) { + case AHT_DEFAULT: + return "DEFAULT"; + case AHT_COMMUNICATION: + return "COMMUNICATION"; + case AHT_MEDIA: + return "MEDIA"; + case AHT_MESSAGING: + return "MESSAGING"; + case AHT_NAVIGATION: + return "NAVIGATION"; + case AHT_INFORMATION: + return "INFORMATION"; + case AHT_SOCIAL: + return "SOCIAL"; + case AHT_BACKGROUND_PROCESS: + return "BACKGROUND_PROCESS"; + case AHT_TESTING: + return "TESTING"; + case AHT_SYSTEM: + return "SYSTEM"; + default: + return ""; + } +} +bool EnumFromJsonString(const std::string& literal, AppHMIType* result) { + if ("DEFAULT" == literal) { + *result = AHT_DEFAULT; + return true; + } else if ("COMMUNICATION" == literal) { + *result = AHT_COMMUNICATION; + return true; + } else if ("MEDIA" == literal) { + *result = AHT_MEDIA; + return true; + } else if ("MESSAGING" == literal) { + *result = AHT_MESSAGING; + return true; + } else if ("NAVIGATION" == literal) { + *result = AHT_NAVIGATION; + return true; + } else if ("INFORMATION" == literal) { + *result = AHT_INFORMATION; + return true; + } else if ("SOCIAL" == literal) { + *result = AHT_SOCIAL; + return true; + } else if ("BACKGROUND_PROCESS" == literal) { + *result = AHT_BACKGROUND_PROCESS; + return true; + } else if ("TESTING" == literal) { + *result = AHT_TESTING; + return true; + } else if ("SYSTEM" == literal) { + *result = AHT_SYSTEM; + return true; + } else { + return false; + } +} + +bool IsValidEnum(Input val) { + switch (val) { + case I_GUI: + return true; + case I_VUI: + return true; + default: + return false; + } +} +const char* EnumToJsonString(Input val) { + switch (val) { + case I_GUI: + return "GUI"; + case I_VUI: + return "VUI"; + default: + return ""; + } +} +bool EnumFromJsonString(const std::string& literal, Input* result) { + if ("GUI" == literal) { + *result = I_GUI; + return true; + } else if ("VUI" == literal) { + *result = I_VUI; + return true; + } else { + return false; + } +} + +bool IsValidEnum(RequestType val) { + switch (val) { + case RT_HTTP: + return true; + case RT_FILE_RESUME: + return true; + case RT_AUTH_REQUEST: + return true; + case RT_AUTH_CHALLENGE: + return true; + case RT_AUTH_ACK: + return true; + case RT_PROPRIETARY: + return true; + case RT_QUERY_APPS: + return true; + case RT_LAUNCH_APP: + return true; + case RT_LOCK_SCREEN_ICON_URL: + return true; + case RT_TRAFFIC_MESSAGE_CHANNEL: + return true; + case RT_DRIVER_PROFILE: + return true; + case RT_VOICE_SEARCH: + return true; + case RT_NAVIGATION: + return true; + case RT_PHONE: + return true; + case RT_CLIMATE: + return true; + case RT_SETTINGS: + return true; + case RT_VEHICLE_DIAGNOSTICS: + return true; + case RT_EMERGENCY: + return true; + case RT_MEDIA: + return true; + case RT_FOTA: + return true; + default: + return false; + } +} + +const char* EnumToJsonString(RequestType val) { + switch (val) { + case RT_HTTP: + return "HTTP"; + case RT_FILE_RESUME: + return "FILE_RESUME"; + case RT_AUTH_REQUEST: + return "AUTH_REQUEST"; + case RT_AUTH_CHALLENGE: + return "AUTH_CHALLENGE"; + case RT_AUTH_ACK: + return "AUTH_ACK"; + case RT_PROPRIETARY: + return "PROPRIETARY"; + case RT_QUERY_APPS: + return "QUERY_APPS"; + case RT_LAUNCH_APP: + return "LAUNCH_APP"; + case RT_LOCK_SCREEN_ICON_URL: + return "LOCK_SCREEN_ICON_URL"; + case RT_TRAFFIC_MESSAGE_CHANNEL: + return "TRAFFIC_MESSAGE_CHANNEL"; + case RT_DRIVER_PROFILE: + return "DRIVER_PROFILE"; + case RT_VOICE_SEARCH: + return "VOICE_SEARCH"; + case RT_NAVIGATION: + return "NAVIGATION"; + case RT_PHONE: + return "PHONE"; + case RT_CLIMATE: + return "CLIMATE"; + case RT_SETTINGS: + return "SETTINGS"; + case RT_VEHICLE_DIAGNOSTICS: + return "VEHICLE_DIAGNOSTICS"; + case RT_EMERGENCY: + return "EMERGENCY"; + case RT_MEDIA: + return "MEDIA"; + case RT_FOTA: + return "FOTA"; + default: + return ""; + } +} + +bool EnumFromJsonString(const std::string& literal, RequestType* result) { + if ("HTTP" == literal) { + *result = RT_HTTP; + return true; + } + if ("FILE_RESUME" == literal) { + *result = RT_FILE_RESUME; + return true; + } + if ("AUTH_REQUEST" == literal) { + *result = RT_AUTH_REQUEST; + return true; + } + if ("AUTH_CHALLENGE" == literal) { + *result = RT_AUTH_CHALLENGE; + return true; + } + if ("AUTH_ACK" == literal) { + *result = RT_AUTH_ACK; + return true; + } + if ("PROPRIETARY" == literal) { + *result = RT_PROPRIETARY; + return true; + } + if ("QUERY_APPS" == literal) { + *result = RT_QUERY_APPS; + return true; + } + if ("LAUNCH_APP" == literal) { + *result = RT_LAUNCH_APP; + return true; + } + if ("LOCK_SCREEN_ICON_URL" == literal) { + *result = RT_LOCK_SCREEN_ICON_URL; + return true; + } + if ("TRAFFIC_MESSAGE_CHANNEL" == literal) { + *result = RT_TRAFFIC_MESSAGE_CHANNEL; + return true; + } + if ("DRIVER_PROFILE" == literal) { + *result = RT_DRIVER_PROFILE; + return true; + } + if ("VOICE_SEARCH" == literal) { + *result = RT_VOICE_SEARCH; + return true; + } + if ("NAVIGATION" == literal) { + *result = RT_NAVIGATION; + return true; + } + if ("PHONE" == literal) { + *result = RT_PHONE; + return true; + } + if ("CLIMATE" == literal) { + *result = RT_CLIMATE; + return true; + } + if ("SETTINGS" == literal) { + *result = RT_SETTINGS; + return true; + } + if ("VEHICLE_DIAGNOSTICS" == literal) { + *result = RT_VEHICLE_DIAGNOSTICS; + return true; + } + if ("EMERGENCY" == literal) { + *result = RT_EMERGENCY; + return true; + } + if ("MEDIA" == literal) { + *result = RT_MEDIA; + return true; + } + if ("FOTA" == literal) { + *result = RT_FOTA; + return true; + } else { + return false; + } +} + +const std::string kDefaultApp = "default"; +const std::string kPreDataConsentApp = "pre_DataConsent"; +const std::string kDeviceApp = "device"; + +} // namespace policy_table_interface_base +} // namespace rpc diff --git a/src/components/policy/policy_external/src/policy_table/types.cc b/src/components/policy/policy_external/src/policy_table/types.cc new file mode 100644 index 0000000000..ade76399fc --- /dev/null +++ b/src/components/policy/policy_external/src/policy_table/types.cc @@ -0,0 +1,2027 @@ +#include <algorithm> +#include "policy/policy_table/types.h" +#include "rpc_base/rpc_base_json_inl.h" + +namespace rpc { +namespace policy_table_interface_base { + +std::string PolicyTableTypeToString(const PolicyTableType pt_type) { + switch (pt_type) { + case PT_PRELOADED: { + return "PT_PRELOADED"; + } + case PT_UPDATE: { + return "PT_UPDATE"; + } + case PT_SNAPSHOT: { + return "PT_SNAPSHOT"; + } + default: { return "INVALID_PT_TYPE"; } + } +} + +// PolicyBase methods +PolicyBase::PolicyBase() : CompositeType(kUninitialized) {} + +PolicyBase::PolicyBase(const Strings& groups, + Priority priority, + HmiLevel default_hmi, + bool keep_context, + bool steal_focus) + : CompositeType(kUninitialized) + , groups(groups) + , priority(priority) + , default_hmi(default_hmi) + , keep_context(keep_context) + , steal_focus(steal_focus) {} + +PolicyBase::~PolicyBase() {} + +PolicyBase::PolicyBase(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , groups(impl::ValueMember(value__, "groups")) + , preconsented_groups(impl::ValueMember(value__, "preconsented_groups")) + , priority(impl::ValueMember(value__, "priority")) + , default_hmi(impl::ValueMember(value__, "default_hmi")) + , keep_context(impl::ValueMember(value__, "keep_context")) + , steal_focus(impl::ValueMember(value__, "steal_focus")) {} + +Json::Value PolicyBase::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("groups", groups, &result__); + impl::WriteJsonField("preconsented_groups", preconsented_groups, &result__); + impl::WriteJsonField("priority", priority, &result__); + impl::WriteJsonField("default_hmi", default_hmi, &result__); + impl::WriteJsonField("keep_context", keep_context, &result__); + impl::WriteJsonField("steal_focus", steal_focus, &result__); + return result__; +} + +bool PolicyBase::is_valid() const { + if (!groups.is_valid()) { + return false; + } + if (!preconsented_groups.is_valid()) { + return false; + } + if (!priority.is_valid()) { + return false; + } + if (!default_hmi.is_valid()) { + return false; + } + if (!keep_context.is_valid()) { + return false; + } + if (!steal_focus.is_valid()) { + return false; + } + return Validate(); +} + +bool PolicyBase::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool PolicyBase::struct_empty() const { + if (groups.is_initialized()) { + return false; + } + if (preconsented_groups.is_initialized()) { + return false; + } + if (priority.is_initialized()) { + return false; + } + if (default_hmi.is_initialized()) { + return false; + } + if (keep_context.is_initialized()) { + return false; + } + if (steal_focus.is_initialized()) { + return false; + } + return true; +} + +void PolicyBase::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!groups.is_valid()) { + groups.ReportErrors(&report__->ReportSubobject("groups")); + } + if (!preconsented_groups.is_valid()) { + preconsented_groups.ReportErrors( + &report__->ReportSubobject("preconsented_groups")); + } + if (!priority.is_valid()) { + priority.ReportErrors(&report__->ReportSubobject("priority")); + } + if (!default_hmi.is_valid()) { + default_hmi.ReportErrors(&report__->ReportSubobject("default_hmi")); + } + if (!keep_context.is_valid()) { + keep_context.ReportErrors(&report__->ReportSubobject("keep_context")); + } + if (!steal_focus.is_valid()) { + steal_focus.ReportErrors(&report__->ReportSubobject("steal_focus")); + } +} + +void PolicyBase::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + groups.SetPolicyTableType(pt_type); + priority.SetPolicyTableType(pt_type); +} + +// DevicePolicy methods +DevicePolicy::DevicePolicy() : PolicyBase() {} + +DevicePolicy::DevicePolicy(const Strings& groups, + Priority priority, + HmiLevel default_hmi, + bool keep_context, + bool steal_focus) + : PolicyBase(groups, priority, default_hmi, keep_context, steal_focus) {} + +DevicePolicy::~DevicePolicy() {} + +DevicePolicy::DevicePolicy(const Json::Value* value__) : PolicyBase(value__) {} + +// AppPoliciesSection methods +ApplicationPoliciesSection::ApplicationPoliciesSection() + : CompositeType(kUninitialized) {} + +ApplicationPoliciesSection::ApplicationPoliciesSection( + const ApplicationPolicies& apps, const DevicePolicy& device) + : CompositeType(kUninitialized), apps(apps), device(device) {} + +ApplicationPoliciesSection::~ApplicationPoliciesSection() {} + +ApplicationPoliciesSection::ApplicationPoliciesSection( + const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , apps(value__) + , device(impl::ValueMember(value__, "device")) { + // Since "device" is moved to separate struct, we have to delete it from + // parsed apps to avoid validation issues due to possible wrong params in + // device section + apps.erase("device"); +} + +Json::Value ApplicationPoliciesSection::ToJsonValue() const { + Json::Value result__(Json::objectValue); + result__ = apps.ToJsonValue(); + impl::WriteJsonField("device", device, &result__); + return result__; +} + +bool ApplicationPoliciesSection::is_valid() const { + if (!device.is_valid()) { + return false; + } + if (!apps.is_valid()) { + return false; + } + return Validate(); +} + +bool ApplicationPoliciesSection::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool ApplicationPoliciesSection::struct_empty() const { + if (device.is_initialized()) { + return false; + } + if (apps.is_initialized()) { + return false; + } + return true; +} + +void ApplicationPoliciesSection::ReportErrors( + rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!device.is_valid()) { + device.ReportErrors(&report__->ReportSubobject("device")); + } + if (!apps.is_valid()) { + apps.ReportErrors(&report__->ReportSubobject("apps")); + } +} + +void ApplicationPoliciesSection::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + device.SetPolicyTableType(pt_type); + apps.SetPolicyTableType(pt_type); +} + +// ApplicationParams methods +ApplicationParams::ApplicationParams() : PolicyBase() {} + +ApplicationParams::ApplicationParams(const Strings& groups, + Priority priority, + HmiLevel default_hmi, + bool keep_context, + bool steal_focus) + : PolicyBase(groups, priority, default_hmi, keep_context, steal_focus) {} + +ApplicationParams::~ApplicationParams() {} + +ApplicationParams::ApplicationParams(const Json::Value* value__) + : PolicyBase(value__) + , nicknames(impl::ValueMember(value__, "nicknames")) + , AppHMIType(impl::ValueMember(value__, "AppHMIType")) + , RequestType(impl::ValueMember(value__, "RequestType")) + , memory_kb(impl::ValueMember(value__, "memory_kb"), 0) + , heart_beat_timeout_ms( + impl::ValueMember(value__, "heart_beat_timeout_ms")) {} + +Json::Value ApplicationParams::ToJsonValue() const { + Json::Value result__(PolicyBase::ToJsonValue()); + impl::WriteJsonField("nicknames", nicknames, &result__); + impl::WriteJsonField("AppHMIType", AppHMIType, &result__); + impl::WriteJsonField("RequestType", RequestType, &result__); + impl::WriteJsonField("memory_kb", memory_kb, &result__); + impl::WriteJsonField( + "heart_beat_timeout_ms", heart_beat_timeout_ms, &result__); + return result__; +} + +bool ApplicationParams::is_valid() const { + // RequestType is not validated since there is high-level validation logic, + // which takes into account information not available here. + if (!PolicyBase::is_valid()) { + return false; + } + if (!nicknames.is_valid()) { + return false; + } + if (!AppHMIType.is_valid()) { + return false; + } + if (!memory_kb.is_valid()) { + return false; + } + if (!heart_beat_timeout_ms.is_valid()) { + return false; + } + + return Validate(); +} + +bool ApplicationParams::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool ApplicationParams::struct_empty() const { + if (!PolicyBase::is_initialized()) { + return false; + } + if (nicknames.is_initialized()) { + return false; + } + if (AppHMIType.is_initialized()) { + return false; + } + if (RequestType.is_initialized()) { + return false; + } + if (memory_kb.is_initialized()) { + return false; + } + if (heart_beat_timeout_ms.is_initialized()) { + return false; + } + return true; +} + +void ApplicationParams::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!groups.is_valid()) { + groups.ReportErrors(&report__->ReportSubobject("groups")); + } + if (!nicknames.is_valid()) { + nicknames.ReportErrors(&report__->ReportSubobject("nicknames")); + } + if (!preconsented_groups.is_valid()) { + preconsented_groups.ReportErrors( + &report__->ReportSubobject("preconsented_groups")); + } + if (!AppHMIType.is_valid()) { + AppHMIType.ReportErrors(&report__->ReportSubobject("AppHMIType")); + } + if (!RequestType.is_valid()) { + RequestType.ReportErrors(&report__->ReportSubobject("RequestType")); + } + if (!priority.is_valid()) { + priority.ReportErrors(&report__->ReportSubobject("priority")); + } + if (!default_hmi.is_valid()) { + default_hmi.ReportErrors(&report__->ReportSubobject("default_hmi")); + } + if (!keep_context.is_valid()) { + keep_context.ReportErrors(&report__->ReportSubobject("keep_context")); + } + if (!steal_focus.is_valid()) { + steal_focus.ReportErrors(&report__->ReportSubobject("steal_focus")); + } + if (!memory_kb.is_valid()) { + memory_kb.ReportErrors(&report__->ReportSubobject("memory_kb")); + } + if (!heart_beat_timeout_ms.is_valid()) { + heart_beat_timeout_ms.ReportErrors( + &report__->ReportSubobject("heart_beat_timeout_ms")); + } +} + +void ApplicationParams::SetPolicyTableType(PolicyTableType pt_type) { + PolicyBase::SetPolicyTableType(pt_type); + AppHMIType.SetPolicyTableType(pt_type); + RequestType.SetPolicyTableType(pt_type); + memory_kb.SetPolicyTableType(pt_type); + heart_beat_timeout_ms.SetPolicyTableType(pt_type); +} + +// RpcParameters methods +RpcParameters::RpcParameters() : CompositeType(kUninitialized) {} + +RpcParameters::RpcParameters(const HmiLevels& hmi_levels) + : CompositeType(kUninitialized), hmi_levels(hmi_levels) {} + +RpcParameters::~RpcParameters() {} + +RpcParameters::RpcParameters(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , hmi_levels(impl::ValueMember(value__, "hmi_levels")) + , parameters(impl::ValueMember(value__, "parameters")) {} + +Json::Value RpcParameters::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("hmi_levels", hmi_levels, &result__); + impl::WriteJsonField("parameters", parameters, &result__); + return result__; +} + +bool RpcParameters::is_valid() const { + if (!hmi_levels.is_valid()) { + return false; + } + if (!parameters.is_valid()) { + return false; + } + return Validate(); +} + +bool RpcParameters::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool RpcParameters::struct_empty() const { + if (hmi_levels.is_initialized()) { + return false; + } + if (parameters.is_initialized()) { + return false; + } + return true; +} + +void RpcParameters::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!hmi_levels.is_valid()) { + hmi_levels.ReportErrors(&report__->ReportSubobject("hmi_levels")); + } + if (!parameters.is_valid()) { + parameters.ReportErrors(&report__->ReportSubobject("parameters")); + } +} + +void RpcParameters::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + hmi_levels.SetPolicyTableType(pt_type); + parameters.SetPolicyTableType(pt_type); +} + +// Rpcs methods +Rpcs::Rpcs() : CompositeType(kUninitialized) {} + +Rpcs::Rpcs(const Rpc& rpcs) : CompositeType(kUninitialized), rpcs(rpcs) {} + +Rpcs::~Rpcs() {} + +Rpcs::Rpcs(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , user_consent_prompt(impl::ValueMember(value__, "user_consent_prompt")) + , rpcs(impl::ValueMember(value__, "rpcs")) {} + +Json::Value Rpcs::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("user_consent_prompt", user_consent_prompt, &result__); + impl::WriteJsonField("rpcs", rpcs, &result__); + return result__; +} + +bool Rpcs::is_valid() const { + if (!user_consent_prompt.is_valid()) { + return false; + } + if (!rpcs.is_valid()) { + return false; + } + return Validate(); +} + +bool Rpcs::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool Rpcs::struct_empty() const { + if (user_consent_prompt.is_initialized()) { + return false; + } + if (rpcs.is_initialized()) { + return false; + } + + return true; +} + +void Rpcs::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!user_consent_prompt.is_valid()) { + user_consent_prompt.ReportErrors( + &report__->ReportSubobject("user_consent_prompt")); + } + if (!rpcs.is_valid()) { + rpcs.ReportErrors(&report__->ReportSubobject("rpcs")); + } +} + +void Rpcs::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + user_consent_prompt.SetPolicyTableType(pt_type); + rpcs.SetPolicyTableType(pt_type); +} + +// ModuleConfig methods +ModuleConfig::ModuleConfig() : CompositeType(kUninitialized) {} + +ModuleConfig::ModuleConfig( + uint8_t exchange_after_x_ignition_cycles, + int64_t exchange_after_x_kilometers, + uint8_t exchange_after_x_days, + uint16_t timeout_after_x_seconds, + const SecondsBetweenRetries& seconds_between_retries, + const ServiceEndpoints& endpoints, + const NumberOfNotificationsPerMinute& notifications_per_minute_by_priority) + : CompositeType(kUninitialized) + , exchange_after_x_ignition_cycles(exchange_after_x_ignition_cycles) + , exchange_after_x_kilometers(exchange_after_x_kilometers) + , exchange_after_x_days(exchange_after_x_days) + , timeout_after_x_seconds(timeout_after_x_seconds) + , seconds_between_retries(seconds_between_retries) + , endpoints(endpoints) + , notifications_per_minute_by_priority( + notifications_per_minute_by_priority) {} + +ModuleConfig::~ModuleConfig() {} + +ModuleConfig::ModuleConfig(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , exchange_after_x_ignition_cycles( + impl::ValueMember(value__, "exchange_after_x_ignition_cycles")) + , exchange_after_x_kilometers( + impl::ValueMember(value__, "exchange_after_x_kilometers")) + , exchange_after_x_days(impl::ValueMember(value__, "exchange_after_x_days")) + , timeout_after_x_seconds( + impl::ValueMember(value__, "timeout_after_x_seconds")) + , seconds_between_retries( + impl::ValueMember(value__, "seconds_between_retries")) + , endpoints(impl::ValueMember(value__, "endpoints")) + , notifications_per_minute_by_priority( + impl::ValueMember(value__, "notifications_per_minute_by_priority")) + , vehicle_make(impl::ValueMember(value__, "vehicle_make")) + , vehicle_model(impl::ValueMember(value__, "vehicle_model")) + , vehicle_year(impl::ValueMember(value__, "vehicle_year")) + , preloaded_date(impl::ValueMember(value__, "preloaded_date")) + , certificate(impl::ValueMember(value__, "certificate")) + , preloaded_pt(impl::ValueMember(value__, "preloaded_pt")) {} + +void ModuleConfig::SafeCopyFrom(const ModuleConfig& from) { + exchange_after_x_days = from.exchange_after_x_days; + exchange_after_x_kilometers = from.exchange_after_x_kilometers; + exchange_after_x_days = from.exchange_after_x_days; + exchange_after_x_ignition_cycles = from.exchange_after_x_ignition_cycles; + timeout_after_x_seconds = from.timeout_after_x_seconds; + seconds_between_retries = from.seconds_between_retries; + endpoints = from.endpoints; + notifications_per_minute_by_priority = + from.notifications_per_minute_by_priority; + + certificate.assign_if_valid(from.certificate); + vehicle_make.assign_if_valid(from.vehicle_make); + vehicle_model.assign_if_valid(from.vehicle_model); + vehicle_year.assign_if_valid(from.vehicle_year); +} + +Json::Value ModuleConfig::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("certificate", certificate, &result__); + impl::WriteJsonField("preloaded_pt", preloaded_pt, &result__); + impl::WriteJsonField("exchange_after_x_ignition_cycles", + exchange_after_x_ignition_cycles, + &result__); + impl::WriteJsonField( + "exchange_after_x_kilometers", exchange_after_x_kilometers, &result__); + impl::WriteJsonField( + "exchange_after_x_days", exchange_after_x_days, &result__); + impl::WriteJsonField( + "timeout_after_x_seconds", timeout_after_x_seconds, &result__); + impl::WriteJsonField( + "seconds_between_retries", seconds_between_retries, &result__); + impl::WriteJsonField("endpoints", endpoints, &result__); + impl::WriteJsonField("notifications_per_minute_by_priority", + notifications_per_minute_by_priority, + &result__); + impl::WriteJsonField("vehicle_make", vehicle_make, &result__); + impl::WriteJsonField("vehicle_model", vehicle_model, &result__); + impl::WriteJsonField("vehicle_year", vehicle_year, &result__); + impl::WriteJsonField("certificate", certificate, &result__); + impl::WriteJsonField("preloaded_date", preloaded_date, &result__); + return result__; +} + +bool ModuleConfig::is_valid() const { + if (!certificate.is_valid()) { + return false; + } + if (!preloaded_pt.is_valid()) { + return false; + } + if (!exchange_after_x_ignition_cycles.is_valid()) { + return false; + } + if (!exchange_after_x_kilometers.is_valid()) { + return false; + } + if (!exchange_after_x_days.is_valid()) { + return false; + } + if (!timeout_after_x_seconds.is_valid()) { + return false; + } + if (!seconds_between_retries.is_valid()) { + return false; + } + if (!endpoints.is_valid()) { + return false; + } + if (!notifications_per_minute_by_priority.is_valid()) { + return false; + } + if (!vehicle_make.is_valid()) { + return false; + } + if (!vehicle_model.is_valid()) { + return false; + } + if (!vehicle_year.is_valid()) { + return false; + } + if (!certificate.is_valid()) { + return false; + } + if (!preloaded_date.is_valid()) { + return false; + } + return Validate(); +} + +bool ModuleConfig::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool ModuleConfig::struct_empty() const { + if (certificate.is_initialized()) { + return false; + } + if (preloaded_pt.is_initialized()) { + return false; + } + + if (exchange_after_x_ignition_cycles.is_initialized()) { + return false; + } + if (exchange_after_x_kilometers.is_initialized()) { + return false; + } + + if (exchange_after_x_days.is_initialized()) { + return false; + } + if (timeout_after_x_seconds.is_initialized()) { + return false; + } + + if (seconds_between_retries.is_initialized()) { + return false; + } + if (endpoints.is_initialized()) { + return false; + } + + if (notifications_per_minute_by_priority.is_initialized()) { + return false; + } + if (vehicle_make.is_initialized()) { + return false; + } + + if (vehicle_model.is_initialized()) { + return false; + } + if (vehicle_year.is_initialized()) { + return false; + } + + return true; +} + +void ModuleConfig::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!certificate.is_valid()) { + certificate.ReportErrors(&report__->ReportSubobject("certificate")); + } + if (!preloaded_pt.is_valid()) { + preloaded_pt.ReportErrors(&report__->ReportSubobject("preloaded_pt")); + } + if (!exchange_after_x_ignition_cycles.is_valid()) { + exchange_after_x_ignition_cycles.ReportErrors( + &report__->ReportSubobject("exchange_after_x_ignition_cycles")); + } + if (!exchange_after_x_kilometers.is_valid()) { + exchange_after_x_kilometers.ReportErrors( + &report__->ReportSubobject("exchange_after_x_kilometers")); + } + if (!exchange_after_x_days.is_valid()) { + exchange_after_x_days.ReportErrors( + &report__->ReportSubobject("exchange_after_x_days")); + } + if (!timeout_after_x_seconds.is_valid()) { + timeout_after_x_seconds.ReportErrors( + &report__->ReportSubobject("timeout_after_x_seconds")); + } + if (!seconds_between_retries.is_valid()) { + seconds_between_retries.ReportErrors( + &report__->ReportSubobject("seconds_between_retries")); + } + if (!endpoints.is_valid()) { + endpoints.ReportErrors(&report__->ReportSubobject("endpoints")); + } + if (!notifications_per_minute_by_priority.is_valid()) { + notifications_per_minute_by_priority.ReportErrors( + &report__->ReportSubobject("notifications_per_minute_by_priority")); + } + if (!vehicle_make.is_valid()) { + vehicle_make.ReportErrors(&report__->ReportSubobject("vehicle_make")); + } + if (!vehicle_model.is_valid()) { + vehicle_model.ReportErrors(&report__->ReportSubobject("vehicle_model")); + } + if (!vehicle_year.is_valid()) { + vehicle_year.ReportErrors(&report__->ReportSubobject("vehicle_year")); + } + + const std::string validation_info = + omitted_validation_info + PolicyTableTypeToString(GetPolicyTableType()); + + switch (GetPolicyTableType()) { + case PT_PRELOADED: { + if (vehicle_make.is_initialized()) { + rpc::ValidationReport& vehicle_make_omitted_field_report = + report__->ReportSubobject("vehicle_make"); + vehicle_make_omitted_field_report.set_validation_info(validation_info); + } + if (vehicle_year.is_initialized()) { + rpc::ValidationReport& vehicle_year_omitted_field_report = + report__->ReportSubobject("vehicle_year"); + vehicle_year_omitted_field_report.set_validation_info(validation_info); + } + if (vehicle_model.is_initialized()) { + rpc::ValidationReport& vehicle_model_omitted_field_report = + report__->ReportSubobject("vehicle_model"); + vehicle_model_omitted_field_report.set_validation_info(validation_info); + } + + break; + } + case PT_UPDATE: { + if (preloaded_pt.is_initialized()) { + rpc::ValidationReport& preloaded_pt_omitted_field_report = + report__->ReportSubobject("preloaded_pt"); + preloaded_pt_omitted_field_report.set_validation_info(validation_info); + } + if (preloaded_date.is_initialized()) { + rpc::ValidationReport& preloaded_pt_omitted_field_report = + report__->ReportSubobject("preloaded_date"); + preloaded_pt_omitted_field_report.set_validation_info(validation_info); + } + break; + } + default: + break; + } +} + +void ModuleConfig::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + certificate.SetPolicyTableType(pt_type); + preloaded_pt.SetPolicyTableType(pt_type); + exchange_after_x_ignition_cycles.SetPolicyTableType(pt_type); + exchange_after_x_kilometers.SetPolicyTableType(pt_type); + exchange_after_x_days.SetPolicyTableType(pt_type); + timeout_after_x_seconds.SetPolicyTableType(pt_type); + seconds_between_retries.SetPolicyTableType(pt_type); + endpoints.SetPolicyTableType(pt_type); + notifications_per_minute_by_priority.SetPolicyTableType(pt_type); + vehicle_make.SetPolicyTableType(pt_type); + vehicle_model.SetPolicyTableType(pt_type); + vehicle_year.SetPolicyTableType(pt_type); +} + +// MessageString methods +MessageString::MessageString() : CompositeType(kUninitialized) {} + +MessageString::~MessageString() {} + +MessageString::MessageString(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , line1(impl::ValueMember(value__, "line1")) + , line2(impl::ValueMember(value__, "line2")) + , tts(impl::ValueMember(value__, "tts")) + , label(impl::ValueMember(value__, "label")) + , textBody(impl::ValueMember(value__, "textBody")) {} + +Json::Value MessageString::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("line1", line1, &result__); + impl::WriteJsonField("line2", line2, &result__); + impl::WriteJsonField("tts", tts, &result__); + impl::WriteJsonField("label", label, &result__); + impl::WriteJsonField("textBody", textBody, &result__); + return result__; +} + +bool MessageString::is_valid() const { + if (struct_empty()) { + return initialization_state__ == kInitialized && Validate(); + } + if (!line1.is_valid()) { + return false; + } + if (!line2.is_valid()) { + return false; + } + if (!tts.is_valid()) { + return false; + } + if (!label.is_valid()) { + return false; + } + if (!textBody.is_valid()) { + return false; + } + return Validate(); +} + +bool MessageString::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool MessageString::struct_empty() const { + if (line1.is_initialized()) { + return false; + } + if (line2.is_initialized()) { + return false; + } + + if (tts.is_initialized()) { + return false; + } + if (label.is_initialized()) { + return false; + } + + if (textBody.is_initialized()) { + return false; + } + return true; +} + +void MessageString::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!line1.is_valid()) { + line1.ReportErrors(&report__->ReportSubobject("line1")); + } + if (!line2.is_valid()) { + line2.ReportErrors(&report__->ReportSubobject("line2")); + } + if (!tts.is_valid()) { + tts.ReportErrors(&report__->ReportSubobject("tts")); + } + if (!label.is_valid()) { + label.ReportErrors(&report__->ReportSubobject("label")); + } + if (!textBody.is_valid()) { + textBody.ReportErrors(&report__->ReportSubobject("textBody")); + } +} + +void MessageString::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + line1.SetPolicyTableType(pt_type); + line2.SetPolicyTableType(pt_type); + tts.SetPolicyTableType(pt_type); + label.SetPolicyTableType(pt_type); + textBody.SetPolicyTableType(pt_type); +} + +// MessageLanguages methods +const std::string MessageLanguages::kMandatoryLanguage_("en-us"); + +MessageLanguages::MessageLanguages() : CompositeType(kUninitialized) {} + +MessageLanguages::MessageLanguages(const Languages& languages) + : CompositeType(kUninitialized), languages(languages) {} + +MessageLanguages::~MessageLanguages() {} + +MessageLanguages::MessageLanguages(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , languages(impl::ValueMember(value__, "languages")) {} + +Json::Value MessageLanguages::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("languages", languages, &result__); + return result__; +} + +bool MessageLanguages::is_valid() const { + if (!languages.is_valid()) { + return false; + } + // Each RPC must have message in english + if (languages.end() == languages.find(kMandatoryLanguage_)) { + return false; + } + return Validate(); +} + +bool MessageLanguages::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool MessageLanguages::struct_empty() const { + if (languages.is_initialized()) { + return false; + } + return true; +} + +void MessageLanguages::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (PT_SNAPSHOT == GetPolicyTableType()) { + if (languages.is_initialized()) { + std::string validation_info = + omitted_validation_info + + PolicyTableTypeToString(GetPolicyTableType()); + report__->ReportSubobject("languages") + .set_validation_info(validation_info); + } + } + if (!languages.is_valid()) { + languages.ReportErrors(&report__->ReportSubobject("languages")); + } + if (languages.end() == languages.find(kMandatoryLanguage_)) { + report__->set_validation_info("no mandatory language '" + + kMandatoryLanguage_ + "' is present"); + } +} + +void MessageLanguages::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + languages.SetPolicyTableType(pt_type); +} + +// ConsumerFriendlyMessages methods +ConsumerFriendlyMessages::ConsumerFriendlyMessages() + : CompositeType(kUninitialized) {} + +ConsumerFriendlyMessages::ConsumerFriendlyMessages(const std::string& version) + : CompositeType(kUninitialized), version(version) {} + +ConsumerFriendlyMessages::~ConsumerFriendlyMessages() {} + +ConsumerFriendlyMessages::ConsumerFriendlyMessages(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , version(impl::ValueMember(value__, "version")) + , messages(impl::ValueMember(value__, "messages")) {} + +Json::Value ConsumerFriendlyMessages::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("version", version, &result__); + // According to requirements, it is not necessary to provide this to PTS + // impl::WriteJsonField("messages", messages, &result__); + return result__; +} + +bool ConsumerFriendlyMessages::is_valid() const { + if (!version.is_valid()) { + return false; + } + if (!messages.is_valid()) { + return false; + } + return Validate(); +} + +bool ConsumerFriendlyMessages::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool ConsumerFriendlyMessages::struct_empty() const { + if (version.is_initialized()) { + return false; + } + if (messages.is_initialized()) { + return false; + } + + return true; +} + +void ConsumerFriendlyMessages::ReportErrors( + rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (PT_SNAPSHOT == GetPolicyTableType()) { + if (messages.is_initialized()) { + std::string validation_info = + omitted_validation_info + + PolicyTableTypeToString(GetPolicyTableType()); + report__->ReportSubobject("messages") + .set_validation_info(validation_info); + } + } + if (!version.is_valid()) { + version.ReportErrors(&report__->ReportSubobject("version")); + } + if (!messages.is_valid()) { + messages.ReportErrors(&report__->ReportSubobject("messages")); + } +} + +void ConsumerFriendlyMessages::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + version.SetPolicyTableType(pt_type); + messages.SetPolicyTableType(pt_type); +} + +// ModuleMeta methods +ModuleMeta::ModuleMeta() : CompositeType(kUninitialized) {} + +ModuleMeta::~ModuleMeta() {} + +ModuleMeta::ModuleMeta(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , ccpu_version(impl::ValueMember(value__, "ccpu_version")) + , language(impl::ValueMember(value__, "language")) + , wers_country_code(impl::ValueMember(value__, "wers_country_code")) + , pt_exchanged_at_odometer_x( + impl::ValueMember(value__, "pt_exchanged_at_odometer_x")) + , pt_exchanged_x_days_after_epoch( + impl::ValueMember(value__, "pt_exchanged_x_days_after_epoch")) + , ignition_cycles_since_last_exchange( + impl::ValueMember(value__, "ignition_cycles_since_last_exchange")) + , vin(impl::ValueMember(value__, "vin")) {} + +Json::Value ModuleMeta::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("ccpu_version", ccpu_version, &result__); + impl::WriteJsonField("language", language, &result__); + impl::WriteJsonField("wers_country_code", wers_country_code, &result__); + impl::WriteJsonField( + "pt_exchanged_at_odometer_x", pt_exchanged_at_odometer_x, &result__); + impl::WriteJsonField("pt_exchanged_x_days_after_epoch", + pt_exchanged_x_days_after_epoch, + &result__); + impl::WriteJsonField("ignition_cycles_since_last_exchange", + ignition_cycles_since_last_exchange, + &result__); + impl::WriteJsonField("vin", vin, &result__); + return result__; +} + +bool ModuleMeta::is_valid() const { + if (struct_empty()) { + return initialization_state__ == kInitialized && Validate(); + } + if (!ccpu_version.is_valid()) { + return false; + } + if (!language.is_valid()) { + return false; + } + if (!wers_country_code.is_valid()) { + return false; + } + if (!pt_exchanged_at_odometer_x.is_valid()) { + return false; + } + if (!pt_exchanged_x_days_after_epoch.is_valid()) { + return false; + } + if (!ignition_cycles_since_last_exchange.is_valid()) { + return false; + } + if (!vin.is_valid()) { + return false; + } + return Validate(); +} + +bool ModuleMeta::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool ModuleMeta::struct_empty() const { + if (ccpu_version.is_initialized()) { + return false; + } + if (language.is_initialized()) { + return false; + } + + if (wers_country_code.is_initialized()) { + return false; + } + if (pt_exchanged_at_odometer_x.is_initialized()) { + return false; + } + + if (pt_exchanged_x_days_after_epoch.is_initialized()) { + return false; + } + if (ignition_cycles_since_last_exchange.is_initialized()) { + return false; + } + + if (vin.is_initialized()) { + return false; + } + return true; +} + +void ModuleMeta::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!ccpu_version.is_valid()) { + ccpu_version.ReportErrors(&report__->ReportSubobject("ccpu_version")); + } + if (!language.is_valid()) { + language.ReportErrors(&report__->ReportSubobject("language")); + } + if (!wers_country_code.is_valid()) { + wers_country_code.ReportErrors( + &report__->ReportSubobject("wers_country_code")); + } + if (!pt_exchanged_at_odometer_x.is_valid()) { + pt_exchanged_at_odometer_x.ReportErrors( + &report__->ReportSubobject("pt_exchanged_at_odometer_x")); + } + if (!pt_exchanged_x_days_after_epoch.is_valid()) { + pt_exchanged_x_days_after_epoch.ReportErrors( + &report__->ReportSubobject("pt_exchanged_x_days_after_epoch")); + } + if (!ignition_cycles_since_last_exchange.is_valid()) { + ignition_cycles_since_last_exchange.ReportErrors( + &report__->ReportSubobject("ignition_cycles_since_last_exchange")); + } + if (!vin.is_valid()) { + vin.ReportErrors(&report__->ReportSubobject("vin")); + } + if (GetPolicyTableType() == PT_UPDATE || + GetPolicyTableType() == PT_PRELOADED) { + std::string validation_info = + omitted_validation_info + PolicyTableTypeToString(GetPolicyTableType()); + report__->set_validation_info(validation_info.c_str()); + } +} + +void ModuleMeta::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + ccpu_version.SetPolicyTableType(pt_type); + language.SetPolicyTableType(pt_type); + wers_country_code.SetPolicyTableType(pt_type); + pt_exchanged_at_odometer_x.SetPolicyTableType(pt_type); + pt_exchanged_x_days_after_epoch.SetPolicyTableType(pt_type); + ignition_cycles_since_last_exchange.SetPolicyTableType(pt_type); + vin.SetPolicyTableType(pt_type); +} + +// AppLevel methods +AppLevel::AppLevel() : CompositeType(kUninitialized) {} + +AppLevel::AppLevel(uint16_t minutes_in_hmi_full, + const std::string& app_registration_language_gui, + const std::string& app_registration_language_vui, + uint16_t minutes_in_hmi_limited, + uint16_t minutes_in_hmi_background, + uint16_t minutes_in_hmi_none, + uint16_t count_of_user_selections, + uint16_t count_of_rejections_sync_out_of_memory, + uint16_t count_of_rejections_nickname_mismatch, + uint16_t count_of_rejections_duplicate_name, + uint16_t count_of_rejected_rpc_calls, + uint16_t count_of_rpcs_sent_in_hmi_none, + uint16_t count_of_removals_for_bad_behavior, + uint16_t count_of_tls_errors, + uint16_t count_of_run_attempts_while_revoked) + : CompositeType(kUninitialized) + , minutes_in_hmi_full(minutes_in_hmi_full) + , app_registration_language_gui(app_registration_language_gui) + , app_registration_language_vui(app_registration_language_vui) + , minutes_in_hmi_limited(minutes_in_hmi_limited) + , minutes_in_hmi_background(minutes_in_hmi_background) + , minutes_in_hmi_none(minutes_in_hmi_none) + , count_of_user_selections(count_of_user_selections) + , count_of_rejections_sync_out_of_memory( + count_of_rejections_sync_out_of_memory) + , count_of_rejections_nickname_mismatch( + count_of_rejections_nickname_mismatch) + , count_of_rejections_duplicate_name(count_of_rejections_duplicate_name) + , count_of_rejected_rpc_calls(count_of_rejected_rpc_calls) + , count_of_rpcs_sent_in_hmi_none(count_of_rpcs_sent_in_hmi_none) + , count_of_removals_for_bad_behavior(count_of_removals_for_bad_behavior) + , count_of_tls_errors(count_of_tls_errors) + , count_of_run_attempts_while_revoked(count_of_run_attempts_while_revoked) { +} + +AppLevel::~AppLevel() {} + +AppLevel::AppLevel(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , minutes_in_hmi_full(impl::ValueMember(value__, "minutes_in_hmi_full")) + , app_registration_language_gui( + impl::ValueMember(value__, "app_registration_language_gui")) + , app_registration_language_vui( + impl::ValueMember(value__, "app_registration_language_vui")) + , minutes_in_hmi_limited( + impl::ValueMember(value__, "minutes_in_hmi_limited")) + , minutes_in_hmi_background( + impl::ValueMember(value__, "minutes_in_hmi_background")) + , minutes_in_hmi_none(impl::ValueMember(value__, "minutes_in_hmi_none")) + , count_of_user_selections( + impl::ValueMember(value__, "count_of_user_selections")) + , count_of_rejections_sync_out_of_memory( + impl::ValueMember(value__, "count_of_rejections_sync_out_of_memory")) + , count_of_rejections_nickname_mismatch( + impl::ValueMember(value__, "count_of_rejections_nickname_mismatch")) + , count_of_rejections_duplicate_name( + impl::ValueMember(value__, "count_of_rejections_duplicate_name")) + , count_of_rejected_rpc_calls( + impl::ValueMember(value__, "count_of_rejected_rpc_calls")) + , count_of_rpcs_sent_in_hmi_none( + impl::ValueMember(value__, "count_of_rpcs_sent_in_hmi_none")) + , count_of_removals_for_bad_behavior( + impl::ValueMember(value__, "count_of_removals_for_bad_behavior")) + , count_of_tls_errors(impl::ValueMember(value__, "count_of_tls_errors")) + , count_of_run_attempts_while_revoked( + impl::ValueMember(value__, "count_of_run_attempts_while_revoked")) {} + +Json::Value AppLevel::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("minutes_in_hmi_full", minutes_in_hmi_full, &result__); + impl::WriteJsonField("app_registration_language_gui", + app_registration_language_gui, + &result__); + impl::WriteJsonField("app_registration_language_vui", + app_registration_language_vui, + &result__); + impl::WriteJsonField( + "minutes_in_hmi_limited", minutes_in_hmi_limited, &result__); + impl::WriteJsonField( + "minutes_in_hmi_background", minutes_in_hmi_background, &result__); + impl::WriteJsonField("minutes_in_hmi_none", minutes_in_hmi_none, &result__); + impl::WriteJsonField( + "count_of_user_selections", count_of_user_selections, &result__); + impl::WriteJsonField("count_of_rejections_sync_out_of_memory", + count_of_rejections_sync_out_of_memory, + &result__); + impl::WriteJsonField("count_of_rejections_nickname_mismatch", + count_of_rejections_nickname_mismatch, + &result__); + impl::WriteJsonField("count_of_rejections_duplicate_name", + count_of_rejections_duplicate_name, + &result__); + impl::WriteJsonField( + "count_of_rejected_rpc_calls", count_of_rejected_rpc_calls, &result__); + impl::WriteJsonField("count_of_rpcs_sent_in_hmi_none", + count_of_rpcs_sent_in_hmi_none, + &result__); + impl::WriteJsonField("count_of_removals_for_bad_behavior", + count_of_removals_for_bad_behavior, + &result__); + impl::WriteJsonField("count_of_TLS_errors", count_of_tls_errors, &result__); + impl::WriteJsonField("count_of_run_attempts_while_revoked", + count_of_run_attempts_while_revoked, + &result__); + return result__; +} + +bool AppLevel::is_valid() const { + if (!minutes_in_hmi_full.is_valid()) { + return false; + } + if (!app_registration_language_gui.is_valid()) { + return false; + } + if (!app_registration_language_vui.is_valid()) { + return false; + } + if (!minutes_in_hmi_limited.is_valid()) { + return false; + } + if (!minutes_in_hmi_background.is_valid()) { + return false; + } + if (!minutes_in_hmi_none.is_valid()) { + return false; + } + if (!count_of_user_selections.is_valid()) { + return false; + } + if (!count_of_rejections_sync_out_of_memory.is_valid()) { + return false; + } + if (!count_of_rejections_nickname_mismatch.is_valid()) { + return false; + } + if (!count_of_rejections_duplicate_name.is_valid()) { + return false; + } + if (!count_of_rejected_rpc_calls.is_valid()) { + return false; + } + if (!count_of_rpcs_sent_in_hmi_none.is_valid()) { + return false; + } + if (!count_of_removals_for_bad_behavior.is_valid()) { + return false; + } + if (!count_of_tls_errors.is_valid()) { + return false; + } + if (!count_of_run_attempts_while_revoked.is_valid()) { + return false; + } + return Validate(); +} + +bool AppLevel::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool AppLevel::struct_empty() const { + if (minutes_in_hmi_full.is_initialized()) { + return false; + } + if (app_registration_language_gui.is_initialized()) { + return false; + } + + if (app_registration_language_vui.is_initialized()) { + return false; + } + + if (minutes_in_hmi_limited.is_initialized()) { + return false; + } + if (minutes_in_hmi_background.is_initialized()) { + return false; + } + + if (minutes_in_hmi_none.is_initialized()) { + return false; + } + if (count_of_user_selections.is_initialized()) { + return false; + } + + if (count_of_rejections_sync_out_of_memory.is_initialized()) { + return false; + } + if (count_of_rejections_nickname_mismatch.is_initialized()) { + return false; + } + + if (count_of_rejections_duplicate_name.is_initialized()) { + return false; + } + if (count_of_rejected_rpc_calls.is_initialized()) { + return false; + } + + if (count_of_rpcs_sent_in_hmi_none.is_initialized()) { + return false; + } + if (count_of_removals_for_bad_behavior.is_initialized()) { + return false; + } + if (count_of_tls_errors.is_initialized()) { + return false; + } + if (count_of_run_attempts_while_revoked.is_initialized()) { + return false; + } + return true; +} + +void AppLevel::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!minutes_in_hmi_full.is_valid()) { + minutes_in_hmi_full.ReportErrors( + &report__->ReportSubobject("minutes_in_hmi_full")); + } + if (!app_registration_language_gui.is_valid()) { + app_registration_language_gui.ReportErrors( + &report__->ReportSubobject("app_registration_language_gui")); + } + if (!app_registration_language_vui.is_valid()) { + app_registration_language_vui.ReportErrors( + &report__->ReportSubobject("app_registration_language_vui")); + } + if (!minutes_in_hmi_limited.is_valid()) { + minutes_in_hmi_limited.ReportErrors( + &report__->ReportSubobject("minutes_in_hmi_limited")); + } + if (!minutes_in_hmi_background.is_valid()) { + minutes_in_hmi_background.ReportErrors( + &report__->ReportSubobject("minutes_in_hmi_background")); + } + if (!minutes_in_hmi_none.is_valid()) { + minutes_in_hmi_none.ReportErrors( + &report__->ReportSubobject("minutes_in_hmi_none")); + } + if (!count_of_user_selections.is_valid()) { + count_of_user_selections.ReportErrors( + &report__->ReportSubobject("count_of_user_selections")); + } + if (!count_of_rejections_sync_out_of_memory.is_valid()) { + count_of_rejections_sync_out_of_memory.ReportErrors( + &report__->ReportSubobject("count_of_rejections_sync_out_of_memory")); + } + if (!count_of_rejections_nickname_mismatch.is_valid()) { + count_of_rejections_nickname_mismatch.ReportErrors( + &report__->ReportSubobject("count_of_rejections_nickname_mismatch")); + } + if (!count_of_rejections_duplicate_name.is_valid()) { + count_of_rejections_duplicate_name.ReportErrors( + &report__->ReportSubobject("count_of_rejections_duplicate_name")); + } + if (!count_of_rejected_rpc_calls.is_valid()) { + count_of_rejected_rpc_calls.ReportErrors( + &report__->ReportSubobject("count_of_rejected_rpc_calls")); + } + if (!count_of_rpcs_sent_in_hmi_none.is_valid()) { + count_of_rpcs_sent_in_hmi_none.ReportErrors( + &report__->ReportSubobject("count_of_rpcs_sent_in_hmi_none")); + } + if (!count_of_removals_for_bad_behavior.is_valid()) { + count_of_removals_for_bad_behavior.ReportErrors( + &report__->ReportSubobject("count_of_removals_for_bad_behavior")); + } + if (!count_of_run_attempts_while_revoked.is_valid()) { + count_of_run_attempts_while_revoked.ReportErrors( + &report__->ReportSubobject("count_of_run_attempts_while_revoked")); + } + if (PT_PRELOADED == GetPolicyTableType() || + PT_UPDATE == GetPolicyTableType()) { + std::string validation_info = + omitted_validation_info + PolicyTableTypeToString(GetPolicyTableType()); + report__->set_validation_info(validation_info); + } +} + +void AppLevel::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + app_registration_language_gui.SetPolicyTableType(pt_type); + app_registration_language_vui.SetPolicyTableType(pt_type); + minutes_in_hmi_limited.SetPolicyTableType(pt_type); + minutes_in_hmi_full.SetPolicyTableType(pt_type); + minutes_in_hmi_background.SetPolicyTableType(pt_type); + minutes_in_hmi_none.SetPolicyTableType(pt_type); + count_of_user_selections.SetPolicyTableType(pt_type); + count_of_rejections_sync_out_of_memory.SetPolicyTableType(pt_type); + count_of_rejections_nickname_mismatch.SetPolicyTableType(pt_type); + count_of_rejections_duplicate_name.SetPolicyTableType(pt_type); + count_of_rejected_rpc_calls.SetPolicyTableType(pt_type); + count_of_rpcs_sent_in_hmi_none.SetPolicyTableType(pt_type); + count_of_removals_for_bad_behavior.SetPolicyTableType(pt_type); + count_of_run_attempts_while_revoked.SetPolicyTableType(pt_type); +} + +// UsageAndErrorCounts methods +UsageAndErrorCounts::UsageAndErrorCounts() : CompositeType(kUninitialized) {} + +UsageAndErrorCounts::~UsageAndErrorCounts() {} + +UsageAndErrorCounts::UsageAndErrorCounts(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , count_of_iap_buffer_full( + impl::ValueMember(value__, "count_of_iap_buffer_full")) + , count_sync_out_of_memory( + impl::ValueMember(value__, "count_sync_out_of_memory")) + , count_of_sync_reboots(impl::ValueMember(value__, "count_of_sync_reboots")) + , app_level(impl::ValueMember(value__, "app_level")) {} + +Json::Value UsageAndErrorCounts::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField( + "count_of_iap_buffer_full", count_of_iap_buffer_full, &result__); + impl::WriteJsonField( + "count_sync_out_of_memory", count_sync_out_of_memory, &result__); + impl::WriteJsonField( + "count_of_sync_reboots", count_of_sync_reboots, &result__); + impl::WriteJsonField("app_level", app_level, &result__); + return result__; +} + +bool UsageAndErrorCounts::is_valid() const { + if (struct_empty()) { + return initialization_state__ == kInitialized && Validate(); + } + if (!count_of_iap_buffer_full.is_valid()) { + return false; + } + if (!count_sync_out_of_memory.is_valid()) { + return false; + } + if (!count_of_sync_reboots.is_valid()) { + return false; + } + if (!app_level.is_valid()) { + return false; + } + return Validate(); +} + +bool UsageAndErrorCounts::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool UsageAndErrorCounts::struct_empty() const { + if (count_of_iap_buffer_full.is_initialized()) { + return false; + } + if (count_sync_out_of_memory.is_initialized()) { + return false; + } + + if (count_of_sync_reboots.is_initialized()) { + return false; + } + if (app_level.is_initialized()) { + return false; + } + + return true; +} + +void UsageAndErrorCounts::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (PT_PRELOADED == GetPolicyTableType() || + PT_UPDATE == GetPolicyTableType()) { + std::string validation_info = + omitted_validation_info + PolicyTableTypeToString(GetPolicyTableType()); + report__->set_validation_info(validation_info); + } + if (!count_of_iap_buffer_full.is_valid()) { + count_of_iap_buffer_full.ReportErrors( + &report__->ReportSubobject("count_of_iap_buffer_full")); + } + if (!count_sync_out_of_memory.is_valid()) { + count_sync_out_of_memory.ReportErrors( + &report__->ReportSubobject("count_sync_out_of_memory")); + } + if (!count_of_sync_reboots.is_valid()) { + count_of_sync_reboots.ReportErrors( + &report__->ReportSubobject("count_of_sync_reboots")); + } + if (!app_level.is_valid()) { + app_level.ReportErrors(&report__->ReportSubobject("app_level")); + } +} + +void UsageAndErrorCounts::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + count_of_iap_buffer_full.SetPolicyTableType(pt_type); + count_sync_out_of_memory.SetPolicyTableType(pt_type); + count_of_sync_reboots.SetPolicyTableType(pt_type); + app_level.SetPolicyTableType(pt_type); +} + +// ConsentRecords methods +ConsentRecords::ConsentRecords() : CompositeType(kUninitialized) {} + +ConsentRecords::~ConsentRecords() {} + +ConsentRecords::ConsentRecords(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , consent_groups(impl::ValueMember(value__, "consent_groups")) + , input(impl::ValueMember(value__, "input")) + , time_stamp(impl::ValueMember(value__, "time_stamp")) {} + +Json::Value ConsentRecords::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("consent_groups", consent_groups, &result__); + impl::WriteJsonField("input", input, &result__); + impl::WriteJsonField("time_stamp", time_stamp, &result__); + return result__; +} + +bool ConsentRecords::is_valid() const { + if (struct_empty()) { + return initialization_state__ == kInitialized && Validate(); + } + if (!consent_groups.is_valid()) { + return false; + } + if (!input.is_valid()) { + return false; + } + if (!time_stamp.is_valid()) { + return false; + } + return Validate(); +} + +bool ConsentRecords::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool ConsentRecords::struct_empty() const { + if (consent_groups.is_initialized()) { + return false; + } + if (input.is_initialized()) { + return false; + } + + if (time_stamp.is_initialized()) { + return false; + } + return true; +} + +void ConsentRecords::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!consent_groups.is_valid()) { + consent_groups.ReportErrors(&report__->ReportSubobject("consent_groups")); + } + if (!input.is_valid()) { + input.ReportErrors(&report__->ReportSubobject("input")); + } + if (!time_stamp.is_valid()) { + time_stamp.ReportErrors(&report__->ReportSubobject("time_stamp")); + } +} + +void ConsentRecords::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + consent_groups.SetPolicyTableType(pt_type); + input.SetPolicyTableType(pt_type); + time_stamp.SetPolicyTableType(pt_type); +} + +// DeviceParams methods +DeviceParams::DeviceParams() : CompositeType(kUninitialized) {} + +DeviceParams::~DeviceParams() {} + +DeviceParams::DeviceParams(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , hardware(impl::ValueMember(value__, "hardware")) + , firmware_rev(impl::ValueMember(value__, "firmware_rev")) + , os(impl::ValueMember(value__, "os")) + , os_version(impl::ValueMember(value__, "os_version")) + , carrier(impl::ValueMember(value__, "carrier")) + , user_consent_records(impl::ValueMember(value__, "user_consent_records")) + , max_number_rfcom_ports( + impl::ValueMember(value__, "max_number_rfcom_ports")) + , connection_type(impl::ValueMember(value__, "connection_type")) {} + +Json::Value DeviceParams::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("hardware", hardware, &result__); + impl::WriteJsonField("firmware_rev", firmware_rev, &result__); + impl::WriteJsonField("os", os, &result__); + impl::WriteJsonField("os_version", os_version, &result__); + impl::WriteJsonField("carrier", carrier, &result__); + impl::WriteJsonField("user_consent_records", user_consent_records, &result__); + impl::WriteJsonField( + "max_number_rfcom_ports", max_number_rfcom_ports, &result__); + impl::WriteJsonField("connection_type", connection_type, &result__); + return result__; +} + +bool DeviceParams::is_valid() const { + if (struct_empty()) { + return initialization_state__ == kInitialized && Validate(); + } + if (!hardware.is_valid()) { + return false; + } + if (!firmware_rev.is_valid()) { + return false; + } + if (!os.is_valid()) { + return false; + } + if (!os_version.is_valid()) { + return false; + } + if (!carrier.is_valid()) { + return false; + } + if (!user_consent_records.is_valid()) { + return false; + } + if (!max_number_rfcom_ports.is_valid()) { + return false; + } + if (!connection_type.is_valid()) { + return false; + } + return Validate(); +} + +bool DeviceParams::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool DeviceParams::struct_empty() const { + if (hardware.is_initialized()) { + return false; + } + if (firmware_rev.is_initialized()) { + return false; + } + + if (os.is_initialized()) { + return false; + } + if (os_version.is_initialized()) { + return false; + } + + if (carrier.is_initialized()) { + return false; + } + if (user_consent_records.is_initialized()) { + return false; + } + + if (max_number_rfcom_ports.is_initialized()) { + return false; + } + + if (connection_type.is_initialized()) { + return false; + } + return true; +} + +void DeviceParams::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!hardware.is_valid()) { + hardware.ReportErrors(&report__->ReportSubobject("hardware")); + } + if (!firmware_rev.is_valid()) { + firmware_rev.ReportErrors(&report__->ReportSubobject("firmware_rev")); + } + if (!os.is_valid()) { + os.ReportErrors(&report__->ReportSubobject("os")); + } + if (!os_version.is_valid()) { + os_version.ReportErrors(&report__->ReportSubobject("os_version")); + } + if (!carrier.is_valid()) { + carrier.ReportErrors(&report__->ReportSubobject("carrier")); + } + if (!user_consent_records.is_valid()) { + user_consent_records.ReportErrors( + &report__->ReportSubobject("user_consent_records")); + } + if (!max_number_rfcom_ports.is_valid()) { + max_number_rfcom_ports.ReportErrors( + &report__->ReportSubobject("max_number_rfcom_ports")); + } + if (!connection_type.is_valid()) { + connection_type.ReportErrors(&report__->ReportSubobject("connection_type")); + } +} + +void DeviceParams::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + hardware.SetPolicyTableType(pt_type); + firmware_rev.SetPolicyTableType(pt_type); + os.SetPolicyTableType(pt_type); + os_version.SetPolicyTableType(pt_type); + carrier.SetPolicyTableType(pt_type); + user_consent_records.SetPolicyTableType(pt_type); + max_number_rfcom_ports.SetPolicyTableType(pt_type); + connection_type.SetPolicyTableType(pt_type); +} + +// PolicyTable methods +PolicyTable::PolicyTable() : CompositeType(kUninitialized) {} + +PolicyTable::PolicyTable( + const ApplicationPoliciesSection& app_policies_section, + const FunctionalGroupings& functional_groupings, + const ConsumerFriendlyMessages& consumer_friendly_messages, + const ModuleConfig& module_config) + : CompositeType(kUninitialized) + , app_policies_section(app_policies_section) + , functional_groupings(functional_groupings) + , consumer_friendly_messages(consumer_friendly_messages) + , module_config(module_config) {} + +PolicyTable::~PolicyTable() {} + +PolicyTable::PolicyTable(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , app_policies_section(impl::ValueMember(value__, "app_policies")) + , functional_groupings(impl::ValueMember(value__, "functional_groupings")) + , consumer_friendly_messages( + impl::ValueMember(value__, "consumer_friendly_messages")) + , module_config(impl::ValueMember(value__, "module_config")) + , module_meta(impl::ValueMember(value__, "module_meta")) + , usage_and_error_counts( + impl::ValueMember(value__, "usage_and_error_counts")) + , device_data(impl::ValueMember(value__, "device_data")) {} + +Json::Value PolicyTable::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("app_policies", app_policies_section, &result__); + impl::WriteJsonField("functional_groupings", functional_groupings, &result__); + impl::WriteJsonField( + "consumer_friendly_messages", consumer_friendly_messages, &result__); + impl::WriteJsonField("module_config", module_config, &result__); + impl::WriteJsonField("module_meta", module_meta, &result__); + impl::WriteJsonField( + "usage_and_error_counts", usage_and_error_counts, &result__); + impl::WriteJsonField("device_data", device_data, &result__); + return result__; +} + +bool PolicyTable::is_valid() const { + if (!app_policies_section.is_valid()) { + return false; + } + if (!functional_groupings.is_valid()) { + return false; + } + if (!consumer_friendly_messages.is_valid()) { + return false; + } + if (!module_config.is_valid()) { + return false; + } + if (!module_meta.is_valid()) { + return false; + } + if (!usage_and_error_counts.is_valid()) { + return false; + } + if (!device_data.is_valid()) { + return false; + } + return Validate(); +} + +bool PolicyTable::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool PolicyTable::struct_empty() const { + if (app_policies_section.is_initialized()) { + return false; + } + if (functional_groupings.is_initialized()) { + return false; + } + + if (consumer_friendly_messages.is_initialized()) { + return false; + } + if (module_config.is_initialized()) { + return false; + } + + if (module_meta.is_initialized()) { + return false; + } + if (usage_and_error_counts.is_initialized()) { + return false; + } + + if (device_data.is_initialized()) { + return false; + } + return true; +} + +void PolicyTable::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (PT_PRELOADED == GetPolicyTableType() || + PT_UPDATE == GetPolicyTableType()) { + std::string validation_info = + omitted_validation_info + PolicyTableTypeToString(GetPolicyTableType()); + + if (device_data.is_initialized()) { + report__->ReportSubobject("device_data") + .set_validation_info(validation_info); + } + } + if (!app_policies_section.is_valid()) { + app_policies_section.ReportErrors( + &report__->ReportSubobject("app_policies")); + } + if (!functional_groupings.is_valid()) { + functional_groupings.ReportErrors( + &report__->ReportSubobject("functional_groupings")); + } + if (!consumer_friendly_messages.is_valid()) { + consumer_friendly_messages.ReportErrors( + &report__->ReportSubobject("consumer_friendly_messages")); + } + if (!module_config.is_valid()) { + module_config.ReportErrors(&report__->ReportSubobject("module_config")); + } + if (!module_meta.is_valid()) { + module_meta.ReportErrors(&report__->ReportSubobject("module_meta")); + } + if (!usage_and_error_counts.is_valid()) { + usage_and_error_counts.ReportErrors( + &report__->ReportSubobject("usage_and_error_counts")); + } + if (!device_data.is_valid()) { + device_data.ReportErrors(&report__->ReportSubobject("device_data")); + } +} + +void PolicyTable::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + app_policies_section.SetPolicyTableType(pt_type); + functional_groupings.SetPolicyTableType(pt_type); + consumer_friendly_messages.SetPolicyTableType(pt_type); + module_config.SetPolicyTableType(pt_type); + module_meta.SetPolicyTableType(pt_type); + usage_and_error_counts.SetPolicyTableType(pt_type); + device_data.SetPolicyTableType(pt_type); +} + +// Table methods +Table::Table() : CompositeType(kUninitialized) {} + +Table::Table(const PolicyTable& policy_table) + : CompositeType(kUninitialized), policy_table(policy_table) {} + +Table::~Table() {} + +Table::Table(const Json::Value* value__) + : CompositeType(InitHelper(value__, &Json::Value::isObject)) + , policy_table(impl::ValueMember(value__, "policy_table")) {} + +Json::Value Table::ToJsonValue() const { + Json::Value result__(Json::objectValue); + impl::WriteJsonField("policy_table", policy_table, &result__); + return result__; +} + +bool Table::is_valid() const { + if (!policy_table.is_valid()) { + return false; + } + return Validate(); +} + +bool Table::is_initialized() const { + return (initialization_state__ != kUninitialized) || (!struct_empty()); +} + +bool Table::struct_empty() const { + if (policy_table.is_initialized()) { + return false; + } + return true; +} + +void Table::ReportErrors(rpc::ValidationReport* report__) const { + if (struct_empty()) { + rpc::CompositeType::ReportErrors(report__); + } + if (!policy_table.is_valid()) { + policy_table.ReportErrors(&report__->ReportSubobject("policy_table")); + } +} + +void Table::SetPolicyTableType(PolicyTableType pt_type) { + CompositeType::SetPolicyTableType(pt_type); + policy_table.SetPolicyTableType(pt_type); +} + +RequestTypes::RequestTypes() : RequestsTypeArray(), is_cleaned_up_(false) {} + +RequestTypes::RequestTypes(Json::Value* value) + : RequestsTypeArray(value), is_cleaned_up_(false) {} + +RequestTypes::RequestTypes(const Json::Value* value) + : RequestsTypeArray(value), is_cleaned_up_(false) {} + +void RequestTypes::CleanUp() { + if (!this->size()) { + return; + } + this->erase( + std::remove_if( + this->begin(), + this->end(), + std::not1(std::mem_fun_ref(&RequestTypes::value_type::is_valid))), + this->end()); + + is_cleaned_up_ = !this->size(); +} + +bool RequestTypes::is_valid() const { + // Array size must be within allowed range + if (!Range<size_t>(0, 255).Includes(this->size())) { + return false; + } + RequestTypes::const_iterator it = std::find_if( + this->begin(), + this->end(), + std::not1(std::mem_fun_ref(&RequestTypes::value_type::is_valid))); + if (this->end() != it) { + return false; + } + return true; +} + +bool RequestTypes::is_omitted() const { + return this->empty() && !this->is_initialized(); +} + +bool RequestTypes::is_empty() const { + return this->empty() && this->is_initialized(); +} + +bool RequestTypes::is_cleaned_up() const { + return is_cleaned_up_; +} + +} // namespace policy_table_interface_base +} // namespace rpc diff --git a/src/components/policy/policy_external/src/policy_table/validation.cc b/src/components/policy/policy_external/src/policy_table/validation.cc new file mode 100644 index 0000000000..8852070a91 --- /dev/null +++ b/src/components/policy/policy_external/src/policy_table/validation.cc @@ -0,0 +1,231 @@ +#include <iostream> +#include <algorithm> +#include "policy/policy_table/types.h" +#include "utils/logger.h" +#include "utils/helpers.h" + +namespace { +bool IsPredefinedApplication(const std::string& app_id) { + using namespace rpc::policy_table_interface_base; + return kPreDataConsentApp == app_id || kDefaultApp == app_id; +} +} + +namespace rpc { +namespace policy_table_interface_base { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +bool VerifyPredefinedApp(ApplicationPolicies::value_type& app_policies) { + const std::string& app_id = app_policies.first; + if (!IsPredefinedApplication(app_id)) { + return true; + } + + RequestTypes& predefined_request_types = *app_policies.second.RequestType; + + if (!predefined_request_types.is_valid()) { + LOG4CXX_WARN(logger_, + app_id << " policy invalid RequestTypes will be cleaned."); + predefined_request_types.CleanUp(); + if (PT_PRELOADED == app_policies.second.GetPolicyTableType() && + predefined_request_types.is_cleaned_up()) { + LOG4CXX_ERROR( + logger_, + app_id << " policy RequestTypes is empty after clean-up. Exiting."); + return false; + } + + LOG4CXX_WARN(logger_, app_id << " request types have cleaned up."); + } + return true; +} + +bool PolicyBase::Validate() const { + return true; +} +bool ApplicationPoliciesSection::Validate() const { + ApplicationPolicies::iterator it_default_policy = apps.find(kDefaultApp); + ApplicationPolicies::iterator it_pre_data_policy = + apps.find(kPreDataConsentApp); + + // Default and PreData policies are mandatory + if (apps.end() == it_default_policy || apps.end() == it_pre_data_policy) { + LOG4CXX_ERROR(logger_, "Default or preData policy is not present."); + return false; + } + + // Device policy is mandatory + if (!device.is_initialized()) { + LOG4CXX_ERROR(logger_, "Device policy is not present."); + return false; + } + + PolicyTableType pt_type = GetPolicyTableType(); + if (PT_PRELOADED != pt_type && PT_UPDATE != pt_type) { + return true; + } + + if (!VerifyPredefinedApp(*it_default_policy)) { + return false; + } + + if (!VerifyPredefinedApp(*it_pre_data_policy)) { + return false; + } + + ApplicationPolicies::iterator iter = apps.begin(); + ApplicationPolicies::iterator end_iter = apps.end(); + + while (iter != end_iter) { + const std::string app_id = iter->first; + if (IsPredefinedApplication(app_id)) { + ++iter; + continue; + } + + RequestTypes& app_request_types = *iter->second.RequestType; + + if (app_request_types.is_omitted()) { + LOG4CXX_WARN(logger_, + "RequestTypes omitted for " + << app_id << " Will be replaced with default."); + app_request_types = *apps[kDefaultApp].RequestType; + ++iter; + continue; + } + + if (!app_request_types.is_valid()) { + LOG4CXX_WARN(logger_, + "Invalid RequestTypes for " << app_id + << " Will be cleaned up."); + app_request_types.CleanUp(); + if (app_request_types.is_cleaned_up()) { + if (PT_PRELOADED == pt_type) { + LOG4CXX_ERROR(logger_, + "RequestTypes empty after clean-up for " + << app_id << " Exiting."); + return false; + } + + LOG4CXX_WARN(logger_, + "RequestTypes empty after clean-up for " + << app_id << " Will be replaced with default."); + + app_request_types = *apps[kDefaultApp].RequestType; + } + + LOG4CXX_DEBUG(logger_, "Clean up for " << app_id << " is done."); + + ++iter; + continue; + } + + if (app_request_types.is_empty()) { + LOG4CXX_WARN(logger_, "RequestTypes is empty for " << app_id); + } + + ++iter; + } + + return true; +} +bool ApplicationParams::Validate() const { + if (is_initialized()) { + if (preconsented_groups.is_initialized()) { + const Strings& all = groups; + const Strings& preconsented = *preconsented_groups; + if (preconsented.size() > all.size()) { + return false; + } + } + } + return true; +} +bool RpcParameters::Validate() const { + return true; +} +bool Rpcs::Validate() const { + return true; +} +bool ModuleConfig::Validate() const { + switch (GetPolicyTableType()) { + case PT_PRELOADED: { + if (helpers::Compare<bool, helpers::EQ, helpers::ONE>( + true, + vehicle_make.is_initialized(), + vehicle_year.is_initialized(), + vehicle_model.is_initialized())) { + return false; + } + break; + } + case PT_UPDATE: { + if (preloaded_pt->is_initialized()) { + return false; + } + if (preloaded_date->is_initialized()) { + return false; + } + break; + } + default: + break; + } + return true; +} + +bool MessageString::Validate() const { + return true; +} +bool MessageLanguages::Validate() const { + if (PT_SNAPSHOT == GetPolicyTableType()) { + return false; + } + return true; +} +bool ConsumerFriendlyMessages::Validate() const { + return true; +} +bool ModuleMeta::Validate() const { + if (GetPolicyTableType() == PT_UPDATE || + GetPolicyTableType() == PT_PRELOADED) { + return false; + } + return true; +} +bool AppLevel::Validate() const { + if (PT_PRELOADED == GetPolicyTableType() || + PT_UPDATE == GetPolicyTableType()) { + return false; + } + return true; +} +bool UsageAndErrorCounts::Validate() const { + if (PT_PRELOADED == GetPolicyTableType() || + PT_UPDATE == GetPolicyTableType()) { + return false; + } + return true; +} +bool ConsentRecords::Validate() const { + return true; +} +bool DeviceParams::Validate() const { + return true; +} +bool PolicyTable::Validate() const { + if (PT_PRELOADED == GetPolicyTableType() || + PT_UPDATE == GetPolicyTableType()) { + if (device_data.is_initialized()) { + return false; + } + } + return true; +} + +bool Table::Validate() const { + return true; +} +} // namespace policy_table_interface_base +} // namespace rpc diff --git a/src/components/policy/policy_external/src/sql_pt_ext_queries.cc b/src/components/policy/policy_external/src/sql_pt_ext_queries.cc new file mode 100644 index 0000000000..4a69aaf44f --- /dev/null +++ b/src/components/policy/policy_external/src/sql_pt_ext_queries.cc @@ -0,0 +1,267 @@ +/* + Copyright (c) 2013, " Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, " with or without + modification, " are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, " this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, " + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, " INCLUDING, " BUT NOT LIMITED TO, " THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, " INDIRECT, " INCIDENTAL, " SPECIAL, " EXEMPLARY, " OR + CONSEQUENTIAL DAMAGES (INCLUDING, " BUT NOT LIMITED TO, " PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, " DATA, " OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, " WHETHER IN + CONTRACT, " STRICT LIABILITY, " OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, " EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "policy/sql_pt_ext_queries.h" + +namespace policy { +namespace sql_pt_ext { + +const std::string kSelectKeepContext = + "SELECT `keep_context` FROM `application` WHERE `id` = ? LIMIT 1"; + +const std::string kSelectStealFocus = + "SELECT `steal_focus` FROM `application` WHERE `id` = ? LIMIT 1"; + +const std::string kSelectDefaultHmi = + "SELECT `default_hmi` FROM `application` WHERE `id` = ? LIMIT 1"; + +const std::string kResetDeviceConsents = "DELETE FROM `device_consent_group`"; + +const std::string kResetAppConsents = "DELETE FROM `consent_group`"; + +const std::string kCountDeviceConsentGroup = + "SELECT COUNT (`device_id`) " + "FROM `device_consent_group` WHERE `device_id` = ?"; + +const std::string kCountDevice = + "SELECT COUNT (`id`) " + "FROM `device` WHERE `id` = ?"; + +const std::string kSelectDeviceConsentedGroup = + "SELECT * FROM `device_consent_group` WHERE `device_id` = ?"; + +const std::string kUpdateDeviceConsentedGroup = + "UPDATE `device_consent_group` SET `is_consented` = ?, `input` = ? WHERE " + "(`device_id` = ? AND `functional_group_id` = ?)"; + +const std::string kUpdateDevice = + "UPDATE `device` SET `hardware` = ?, `firmware_rev` = ?, `os` = ?, " + "`os_version` = ?, `carrier` = ?, `max_number_rfcom_ports` = ?, " + " `connection_type` = ? WHERE `id` = ? "; + +const std::string kInsertDeviceConsentedGroup = + "INSERT OR REPLACE INTO `device_consent_group` " + "(`device_id`, `functional_group_id`, `is_consented`, `input`, " + "`time_stamp`) " + "VALUES (?,?,?,?,?)"; + +const std::string kInsertDevice = + "INSERT OR IGNORE INTO `device` " + "(`id`, `hardware`, `firmware_rev`, `os`, `os_version`, `carrier`," + "`max_number_rfcom_ports`, `connection_type`) " + "VALUES (?,?,?,?,?,?,?,?)"; + +const std::string kSelectDeviceData = "SELECT * FROM `device`"; + +const std::string kSelectConsentGroup = + "SELECT * FROM `consent_group` WHERE `device_id` = ? "; + +const std::string kInsertPreconsentedGroups = + "INSERT INTO `preconsented_group` (`application_id`, `functional_group_id`)" + " SELECT ?, `id` FROM `functional_group` WHERE `name` = ? LIMIT 1"; + +const std::string kSelectPreconsentedGroups = + "SELECT `f`.`name` FROM `preconsented_group` AS `p`" + " LEFT JOIN `functional_group` AS `f` " + " ON (`f`.`id` = `p`.`functional_group_id`)" + " WHERE `p`.`application_id` = ?"; + +const std::string kDeletePreconsentedGroups = + "DELETE FROM `preconsented_group`"; + +const std::string kSelectUsageAndErrorCount = + "SELECT `count_of_iap_buffer_full`, `count_sync_out_of_memory`, " + " `count_of_sync_reboots` " + "FROM `usage_and_error_count` LIMIT 1"; + +const std::string kSelectAppLevels = + "SELECT `application_id`, `minutes_in_hmi_full`, `minutes_in_hmi_limited`, " + " `minutes_in_hmi_background`, `minutes_in_hmi_none`, " + " `count_of_user_selections`, " + " `count_of_rejections_sync_out_of_memory`, " + " `count_of_rejections_nickname_mismatch`, " + " `count_of_rejections_duplicate_name`, " + " `count_of_rejected_rpcs_calls`, " + " `count_of_rpcs_sent_in_hmi_none`, " + " `count_of_removals_for_bad_behavior`, " + " `count_of_run_attempts_while_revoked`, " + " `app_registration_language_gui`, " + " `app_registration_language_vui`, " + " `count_of_tls_errors` " + "FROM `app_level`"; + +const std::string kUpdateGlobalCounters = + "UPDATE `usage_and_error_count` SET " + "`count_of_iap_buffer_full` = ?, " + "`count_sync_out_of_memory` = ?, " + "`count_of_sync_reboots` = ? "; + +const std::string kInsertDeviceData = + "INSERT OR IGNORE INTO `device` " + "(`id`, `hardware`, `firmware_rev`, `os`, `os_version`, `carrier`, " + "`max_number_rfcom_ports`,`connection_type`) VALUES (?,?,?,?,?,?,?,?) "; + +const std::string kInsertConsentGroups = + "INSERT OR REPLACE INTO `consent_group` " + "(`device_id`, `application_id`, `functional_group_id`, `is_consented`, " + "`input`, `time_stamp`) " + "VALUES (?,?,?,?,?,?)"; + +const std::string kDeleteAppGroupConsent = + "DELETE FROM `consent_group` WHERE " + "`application_id` = ? AND `functional_group_id` = ? "; + +const std::string kSelectGroupId = + "SELECT `id` FROM `functional_group` WHERE `name` = ? "; + +const std::string kCountUnconsentedGroups = + "SELECT COUNT(`a`.`functional_group_id`) FROM `app_group` AS `a` " + " WHERE `a`.`application_id` = ? AND NOT EXISTS " + " (SELECT NULL FROM `preconsented_group` AS `p` WHERE " + " (`p`.`functional_group_id` = `a`.`functional_group_id` AND " + " `p`.`application_id` = `a`.`application_id`)) " + " AND NOT EXISTS (SELECT NULL FROM `consent_group` AS `c` " + " WHERE (`c`.`application_id` = `a`.`application_id` " + " AND `c`.`functional_group_id` = `a`.`functional_group_id` " + " AND `c`.`device_id` = ?)) AND NOT EXISTS " + " (SELECT NULL FROM `app_group` AS `def` WHERE " + " (`def`.`application_id` = ? OR " + " `def`.`application_id` = ?) " + " AND `def`.`functional_group_id` = `a`.`functional_group_id`)" + " AND NOT EXISTS (SELECT NULL FROM `functional_group` AS `f` " + " WHERE (`a`.`functional_group_id` = `f`.`id`" + " AND`f`.`user_consent_prompt` IS NULL))"; + +const std::string kSelectModuleMeta = "SELECT* FROM `module_meta`"; + +const std::string kUpdateMetaParams = + "UPDATE `module_meta` SET " + "`ccpu_version` = ?, `wers_country_code` = ?, `language` = ? "; + +const std::string kUpdateModuleMetaVinParam = + "UPDATE `module_meta` SET `vin` = ? "; + +const std::string kSaveModuleMeta = + "UPDATE `module_meta` SET `ccpu_version` = ?, `language` = ?," + "`wers_country_code` = ?, `pt_exchanged_at_odometer_x` = ?," + "`pt_exchanged_x_days_after_epoch` = ?," + "`ignition_cycles_since_last_exchange` = ?, `vin` = ?"; + +const std::string kSelectMetaParams = + "SELECT `ccpu_version`, " + "`wers_country_code`, `language` from `module_meta`"; + +const std::string kUpdateMetaLanguage = + "UPDATE `module_meta` SET `language` = ? "; + +const std::string kCountAppLevel = + "SELECT COUNT(`application_id`) FROM `app_level`" + " WHERE `application_id` = ? "; + +const std::string kUpdateGroupPermissions = + "UPDATE `consent_group` " + "SET `is_consented` = ?, `input` = ? " + "WHERE(`application_id` = ? AND `functional_group_id` = ? AND `device_id` " + "= ?) "; + +const std::string kInsertApplication = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, `steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( ?, ?, ?, ?, ?, ?, ?, ?) "; + +const std::string kCollectFriendlyMsg = "SELECT * FROM `message`"; + +const std::string kSelectFriendlyMsg = + "SELECT `tts`, `label`, `line1`, `line2`, `textBody` FROM `message` " + "WHERE `message_type_name` = ? AND `language_code` = ? LIMIT 1"; + +const std::string kSelectAppGroupsId = + "SELECT `functional_group_id` " + "FROM `app_group` WHERE `application_id` = ? "; + +const std::string kSelectConsentedGroupsId = + "SELECT `functional_group_id`, `is_consented` " + "FROM `consent_group` WHERE(`application_id` = ? AND `device_id` = ?) "; + +const std::string kCountAppConsents = + "SELECT COUNT(*) from `consent_group`" + "WHERE(`device_id` = ? AND `application_id` = ? AND " + "`functional_group_id` = ?) "; + +const std::string kSelectPreconsentedGroupsId = + "SELECT `functional_group_id` " + "FROM `preconsented_group` WHERE `application_id` = ? "; + +const std::string kSelectAppPolicies = + "SELECT `id`, `priority_value`, `default_hmi`, `keep_context`, " + "`steal_focus`, " + " `memory_kb`, `heart_beat_timeout_ms` FROM `application`"; + +const std::string kSelectFunctionalGroupNames = + "SELECT `id`, `user_consent_prompt`, `name`" + " FROM `functional_group`"; + +const std::string kDeleteDeviceConsent = + "DELETE FROM `device_consent_group` " + "WHERE `device_id` = ? "; + +const std::string kDeleteAppConsent = + "DELETE FROM `consent_group` " + "WHERE `device_id` = ? "; + +const std::string kSelectApplicationIsPreData = + "SELECT `is_predata` FROM `application` WHERE `id` = ? "; + +const std::string kUpdateIsPredata = + "UPDATE `application` SET `is_predata` = ? WHERE `id` = ? "; + +const std::string kHasAppPreloadedGroups = + "SELECT COUNT(`a1`.`functional_group_id`) FROM `app_group` " + " AS `a1` JOIN `app_group` AS `a2` " + " ON `a1`.`functional_group_id` = `a2`.`functional_group_id` " + " WHERE `a1`.`application_id` = ? AND `a2`.`application_id` = ? "; + +const std::string kUpdateUnpairedDevice = + "UPDATE `device` SET `unpaired` = ? WHERE `id` = ? "; + +const std::string kSelectUnpairedDevices = + "SELECT `id` FROM `device` WHERE `unpaired` = 1"; + +const std::string kHasMsgLanguageCode = + "SELECT COUNT (`id`) FROM message " + "WHERE `message_type_name` = ? AND `language_code` = ? "; + +const std::string kDeletePreconsentedGroupsByApplicationId = + "DELETE FROM `preconsented_group` WHERE `application_id` = ?"; + +} // namespace sql_pt_ext +} // namespace policy diff --git a/src/components/policy/policy_external/src/sql_pt_ext_representation.cc b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc new file mode 100644 index 0000000000..dda00af168 --- /dev/null +++ b/src/components/policy/policy_external/src/sql_pt_ext_representation.cc @@ -0,0 +1,1806 @@ +/* + Copyright (c) 2015, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +#include <algorithm> +#include <utility> +#include "utils/logger.h" +#include "policy/sql_pt_ext_representation.h" +#include "policy/sql_wrapper.h" +#include "policy/sql_pt_queries.h" +#include "policy/sql_pt_ext_queries.h" +#include "policy/policy_helper.h" +#include "policy/cache_manager.h" + +namespace policy { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +SQLPTExtRepresentation::SQLPTExtRepresentation() {} +SQLPTExtRepresentation::SQLPTExtRepresentation(bool in_memory) + : SQLPTRepresentation(in_memory) {} + +bool SQLPTExtRepresentation::CanAppKeepContext(const std::string& app_id) { + utils::dbms::SQLQuery query(db()); + if (query.Prepare(sql_pt_ext::kSelectKeepContext)) { + query.Bind(0, app_id); + if (query.Exec()) { + return query.GetBoolean(0); + } + } + return false; +} + +bool SQLPTExtRepresentation::CanAppStealFocus(const std::string& app_id) { + utils::dbms::SQLQuery query(db()); + if (query.Prepare(sql_pt_ext::kSelectStealFocus)) { + query.Bind(0, app_id); + if (query.Exec()) { + return query.GetBoolean(0); + } + } + return false; +} + +bool SQLPTExtRepresentation::ResetUserConsent() { + return ResetDeviceConsents() && ResetAppConsents(); +} + +bool SQLPTExtRepresentation::ResetDeviceConsents() { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kResetDeviceConsents)) { + LOG4CXX_WARN(logger_, "Incorrect delete statement from device_consents."); + return false; + } + return query.Exec(); +} + +bool SQLPTExtRepresentation::ResetAppConsents() { + return utils::dbms::SQLQuery(db()).Exec(sql_pt_ext::kResetAppConsents); +} + +bool SQLPTExtRepresentation::GetUserPermissionsForDevice( + const std::string& device_id, + StringArray* consented_groups, + StringArray* disallowed_groups) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectDeviceConsentedGroup)) { + LOG4CXX_WARN(logger_, "Incorrect select from device consented groups"); + return false; + } + query.Bind(0, device_id); + while (query.Next()) { + if (query.GetBoolean(2)) { + if (!consented_groups) { + continue; + } + consented_groups->push_back(query.GetString(1)); + } else { + if (!disallowed_groups) { + continue; + } + disallowed_groups->push_back(query.GetString(1)); + } + } + + return true; +} + +bool SQLPTExtRepresentation::GetPermissionsForApp( + const std::string& device_id, + const std::string& policy_app_id, + FunctionalIdType* group_types) { + LOG4CXX_AUTO_TRACE(logger_); + if (!group_types) { + LOG4CXX_WARN(logger_, "Input parameter for group types is null."); + return false; + } + // Get all app groups for specified device and application + FunctionalGroupIDs all_groups; + if (!GetAllAppGroups(policy_app_id, all_groups)) { + return false; + } + // Get preconsented group + FunctionalGroupIDs preconsented_groups; + if (!GetPreconsentedGroups(policy_app_id, preconsented_groups)) { + return false; + } + // Get consented (allowed/disallowed) groups + FunctionalGroupIDs allowed_groups; + FunctionalGroupIDs disallowed_groups; + if (!GetConsentedGroups( + policy_app_id, device_id, allowed_groups, disallowed_groups)) { + return false; + } + // Get all default groups + FunctionalGroupIDs default_groups; + if (!GetAllAppGroups(kDefaultId, default_groups)) { + return false; + } + + // Get all pre_DataConsent groups + FunctionalGroupIDs predataconsented_groups; + if (!GetAllAppGroups(kPreDataConsentId, predataconsented_groups)) { + return false; + } + + // Get all device groups + FunctionalGroupIDs device_groups; + if (!GetAllAppGroups(kDeviceId, device_groups)) { + return false; + } + + (*group_types)[kTypeDefault] = default_groups; + (*group_types)[kTypeAllowed] = allowed_groups; + (*group_types)[kTypeDisallowed] = disallowed_groups; + (*group_types)[kTypePreconsented] = preconsented_groups; + (*group_types)[kTypeGeneral] = all_groups; + (*group_types)[kTypePreDataConsented] = predataconsented_groups; + (*group_types)[kTypeDevice] = device_groups; + + return true; +} + +bool SQLPTExtRepresentation::GetDeviceGroupsFromPolicies( + policy_table::Strings* groups, policy_table::Strings* preconsented_groups) { + LOG4CXX_AUTO_TRACE(logger_); + if (groups) { + GatherAppGroup(kDeviceId, groups); + } + if (preconsented_groups) { + GatherPreconsentedGroup(kDeviceId, preconsented_groups); + } + return true; +} + +bool SQLPTExtRepresentation::SetDeviceData(const std::string& device_id, + const std::string& hardware, + const std::string& firmware, + const std::string& os, + const std::string& os_version, + const std::string& carrier, + const uint32_t number_of_ports, + const std::string& connection_type) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery count_query(db()); + if (!count_query.Prepare(sql_pt_ext::kCountDevice)) { + LOG4CXX_WARN(logger_, "Incorrect statement for count of device."); + return false; + } + + count_query.Bind(0, device_id); + + if (!count_query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect count of device."); + return false; + } + + bool update = count_query.GetInteger(0); + + // Update old value + if (update) { + utils::dbms::SQLQuery update_query(db()); + if (!update_query.Prepare(sql_pt_ext::kUpdateDevice)) { + LOG4CXX_WARN(logger_, "Incorrect statement for udpate device."); + return false; + } + + update_query.Bind(0, hardware); + update_query.Bind(1, firmware); + update_query.Bind(2, os); + update_query.Bind(3, os_version); + update_query.Bind(4, carrier); + update_query.Bind(5, static_cast<int>(number_of_ports)); + update_query.Bind(6, device_id); + update_query.Bind(7, connection_type); + + if (!update_query.Exec() || !update_query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect update for device."); + return false; + } + + return true; + } + + // Insert new data + utils::dbms::SQLQuery insert_query(db()); + if (!insert_query.Prepare(sql_pt_ext::kInsertDevice)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for device."); + return false; + } + + insert_query.Bind(0, device_id); + insert_query.Bind(1, hardware); + insert_query.Bind(2, firmware); + insert_query.Bind(3, os); + insert_query.Bind(4, os_version); + insert_query.Bind(5, carrier); + insert_query.Bind(6, static_cast<int>(number_of_ports)); + insert_query.Bind(7, connection_type); + + if (!insert_query.Exec() || !insert_query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert to device."); + return false; + } + + SetPreloaded(false); + + return true; +} + +bool SQLPTExtRepresentation::SetUserPermissionsForDevice( + const std::string& device_id, + const StringArray& consented_groups, + const StringArray& disallowed_groups) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery count_query(db()); + if (!count_query.Prepare(sql_pt_ext::kCountDeviceConsentGroup)) { + LOG4CXX_WARN(logger_, "Incorrect count of device consented groups"); + return false; + } + + count_query.Bind(0, device_id); + + if (!count_query.Exec()) { + LOG4CXX_WARN(logger_, "Failed count of device consented groups"); + return false; + } + + bool update = count_query.GetInteger(0); + + // TODO(AOleynik): Split to several methods? + utils::dbms::SQLQuery query(db()); + // Update old values + if (update) { + if (!query.Prepare(sql_pt_ext::kUpdateDeviceConsentedGroup)) { + LOG4CXX_WARN( + logger_, + "Incorrect statement for updating consented groups on device"); + return false; + } + + StringArray::const_iterator it_consented_groups = consented_groups.begin(); + StringArray::const_iterator it_consented_groups_end = + consented_groups.end(); + for (; it_consented_groups != it_consented_groups_end; + ++it_consented_groups) { + query.Bind(0, true); + query.Bind(1, std::string("GUI")); + query.Bind(2, device_id); + query.Bind(3, *it_consented_groups); + // TODO(AOleynik): Get this info from external data + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Failed update of device allowed consented groups."); + return false; + } + } + + StringArray::const_iterator it_disallowed_groups = + disallowed_groups.begin(); + StringArray::const_iterator it_disallowed_groups_end = + disallowed_groups.end(); + for (; it_disallowed_groups != it_disallowed_groups_end; + ++it_disallowed_groups) { + query.Bind(0, false); + query.Bind(1); + query.Bind(2, device_id); + query.Bind(3, *it_disallowed_groups); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Failed update of device disallowed consented groups."); + return false; + } + } + + return true; + } + + // Insert new values + if (!query.Prepare(sql_pt_ext::kInsertDeviceConsentedGroup)) { + LOG4CXX_WARN(logger_, + "Incorrect statement of inserting to device consented groups"); + return false; + } + + StringArray::const_iterator it_consented_groups = consented_groups.begin(); + StringArray::const_iterator it_consented_groups_end = consented_groups.end(); + for (; it_consented_groups != it_consented_groups_end; + ++it_consented_groups) { + query.Bind(0, device_id); + query.Bind(1, *it_consented_groups); + query.Bind(2, true); + // TODO(AOleynik): Get this info from external data + query.Bind(3, std::string("GUI")); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Failed insert to device allowed consented groups."); + return false; + } + } + + StringArray::const_iterator it_disallowed_groups = disallowed_groups.begin(); + StringArray::const_iterator it_disallowed_groups_end = + disallowed_groups.end(); + for (; it_disallowed_groups != it_disallowed_groups_end; + ++it_disallowed_groups) { + query.Bind(0, device_id); + query.Bind(1, *it_disallowed_groups); + query.Bind(2, false); + query.Bind(3); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Failed insert to device disallowed consented groups."); + return false; + } + } + + return true; +} + +bool SQLPTExtRepresentation::ReactOnUserDevConsentForApp( + const std::string& app_id, bool is_device_allowed) { + bool result = true; + if (is_device_allowed) { + // If app has pre_DataConsented groups it should be 'promoted' to default + // If app has only pre_DataConsented flag it should be only set to false and + // all groups get restored automatically + if (IsPredataPolicy(app_id)) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kHasAppPreloadedGroups)) { + LOG4CXX_WARN(logger_, + "Incorrect statement for has app preloaded groups"); + return false; + } + query.Bind(0, app_id); + query.Bind(1, kPreDataConsentId); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, + "Incorrect select for app has predataconsted groups"); + return false; + } + if (query.GetInteger(0) > 0) { + result = result && SetDefaultPolicy(app_id); + } else { + result = result && SetIsPredata(app_id, false); + } + } + } else { + // If app has default groups change them to pre_DataConsented + // If app has 'normal' groups leave them as is and set + // pre_DataConsented flag to true. + if (IsDefaultPolicy(app_id)) { + result = result && SetPredataPolicy(app_id); + } else { + result = result && SetIsPredata(app_id, true); + } + } + return result; +} + +bool SQLPTExtRepresentation::SetUserPermissionsForApp( + const PermissionConsent& permissions) { + LOG4CXX_AUTO_TRACE(logger_); + // TODO(AOleynik): Handle situation, when no application was specified, i.e. + // general permissions were set + std::vector<FunctionalGroupPermission>::const_iterator it = + permissions.group_permissions.begin(); + std::vector<FunctionalGroupPermission>::const_iterator it_end = + permissions.group_permissions.end(); + + utils::dbms::SQLQuery query(db()); + for (; it != it_end; ++it) { + utils::dbms::SQLQuery counter(db()); + if (!counter.Prepare(sql_pt_ext::kCountAppConsents)) { + LOG4CXX_WARN(logger_, "Incorrect statement for consent group count."); + return false; + } + + counter.Bind(0, permissions.device_id); + counter.Bind(1, permissions.policy_app_id); + counter.Bind(2, static_cast<int>((*it).group_id)); + if (!counter.Exec()) { + LOG4CXX_WARN(logger_, "Incorrent count on consent groups."); + return false; + } + + bool update_required = counter.GetInteger(0); + + // Update already present consent record + if (update_required) { + if (!query.Prepare(sql_pt_ext::kUpdateGroupPermissions)) { + LOG4CXX_WARN(logger_, "Incorrect statement for update consent groups."); + return false; + } + + // Skip consent saving, if user didn't choose any state + if (policy::kGroupUndefined == (*it).state) { + continue; + } + query.Bind(0, (*it).state == kGroupAllowed ? 1 : 0); + query.Bind(1, permissions.consent_source); + query.Bind(2, permissions.policy_app_id); + query.Bind(3, static_cast<int>((*it).group_id)); + query.Bind(4, permissions.device_id); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Incorrect update on user defined permissions " + "for app groups."); + return false; + } + continue; + } + + // Insert new consent record + if (!query.Prepare(sql_pt_ext::kInsertConsentGroups)) { + LOG4CXX_WARN(logger_, + "Incorrect statement for update app group permissions."); + return false; + } + + // Skip consent saving, if user didn't choose any state + if (policy::kGroupUndefined == (*it).state) { + continue; + } + query.Bind(0, permissions.device_id); + query.Bind(1, permissions.policy_app_id); + query.Bind(2, static_cast<int>((*it).group_id)); + query.Bind(3, (*it).state == kGroupAllowed ? 1 : 0); + query.Bind(4, permissions.consent_source); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Incorrect insert to user defined permissions " + "for app groups."); + return false; + } + continue; + } + return true; +} + +std::vector<UserFriendlyMessage> SQLPTExtRepresentation::GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, const std::string& language) { + utils::dbms::SQLQuery query(db()); + std::vector<UserFriendlyMessage> result; + if (!query.Prepare(sql_pt_ext::kSelectFriendlyMsg)) { + LOG4CXX_WARN(logger_, "Incorrect statement for select friendly messages."); + return result; + } + + const std::string fallback_language = "en-us"; + std::vector<std::string>::const_iterator it = msg_codes.begin(); + std::vector<std::string>::const_iterator it_end = msg_codes.end(); + for (; it != it_end; ++it) { + std::string msg_language = language; + // If message has no records with required language, fallback language + // should be used instead. + if (!IsMsgLanguagePresent((*it), language)) { + msg_language = fallback_language; + } + query.Bind(0, *it); + query.Bind(1, msg_language); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect select from friendly messages."); + return result; + } + + UserFriendlyMessage msg; + + msg.message_code = *it; + msg.tts = query.GetString(0); + msg.label = query.GetString(1); + msg.line1 = query.GetString(2); + msg.line2 = query.GetString(3); + msg.text_body = query.GetString(4); + + result.push_back(msg); + + if (!query.Reset()) { + LOG4CXX_WARN(logger_, + "Failed reset statement for selecting friendly " + "messages."); + return result; + } + } + + return result; +} + +bool SQLPTExtRepresentation::GatherConsumerFriendlyMessages( + policy_table::ConsumerFriendlyMessages* messages) const { + if (NULL == messages) { + LOG4CXX_ERROR(logger_, "NULL pointer has been passed to fill"); + return false; + } + + if (!SQLPTRepresentation::GatherConsumerFriendlyMessages(messages)) { + return false; + } + + utils::dbms::SQLQuery query(db()); + bool result = query.Prepare(sql_pt_ext::kCollectFriendlyMsg); + + if (result) { + while (query.Next()) { + UserFriendlyMessage msg; + + msg.tts = query.GetString(1); + msg.label = query.GetString(2); + msg.line1 = query.GetString(3); + msg.line2 = query.GetString(4); + msg.text_body = query.GetString(5); + msg.message_code = query.GetString(7); + + std::string language = query.GetString(6); + + *(*messages->messages)[msg.message_code].languages[language].tts = + msg.tts; + *(*messages->messages)[msg.message_code].languages[language].label = + msg.label; + *(*messages->messages)[msg.message_code].languages[language].line1 = + msg.line1; + *(*messages->messages)[msg.message_code].languages[language].line2 = + msg.line2; + *(*messages->messages)[msg.message_code].languages[language].textBody = + msg.text_body; + } + } else { + LOG4CXX_WARN(logger_, "Incorrect statement for select friendly messages."); + } + return result; +} + +bool SQLPTExtRepresentation::SetMetaInfo(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateMetaParams)) { + LOG4CXX_WARN(logger_, "Incorrect statement for insert to module meta."); + return false; + } + + query.Bind(0, ccpu_version); + query.Bind(1, wers_country_code); + query.Bind(2, language); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert to module meta."); + return false; + } + return true; +} + +bool SQLPTExtRepresentation::IsMetaInfoPresent() { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectMetaParams)) { + LOG4CXX_WARN(logger_, "Incorrect statement for selecting meta info."); + return false; + } + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect select from module meta."); + return false; + } + + return !query.IsNull(0) && !query.IsNull(1) && !query.IsNull(2); +} + +bool SQLPTExtRepresentation::SetSystemLanguage(const std::string& language) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateMetaLanguage)) { + LOG4CXX_WARN(logger_, "Incorrect statement for update meta language."); + return false; + } + + query.Bind(0, language); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect update for meta language."); + return false; + } + + return true; +} + +bool SQLPTExtRepresentation::SaveApplicationPoliciesSection( + const policy_table::ApplicationPoliciesSection& policies) { + LOG4CXX_INFO(logger_, "SaveApplicationPolicies ext"); + utils::dbms::SQLQuery query_delete(db()); + if (!query_delete.Exec(sql_pt::kDeleteAppGroup)) { + LOG4CXX_WARN(logger_, "Incorrect delete from app_group."); + return false; + } + + utils::dbms::SQLQuery query_delete_preconsented(db()); + if (!query_delete_preconsented.Exec(sql_pt_ext::kDeletePreconsentedGroups)) { + LOG4CXX_WARN(logger_, "Incorrect delete from preconsented_group."); + return false; + } + + if (!query_delete.Exec(sql_pt::kDeleteApplication)) { + LOG4CXX_WARN(logger_, "Incorrect delete from application."); + return false; + } + + if (!query_delete.Exec(sql_pt::kDeleteRequestType)) { + LOG4CXX_WARN(logger_, "Incorrect delete from request type."); + return false; + } + + // First, all predefined apps (e.g. default, pre_DataConsent) should be saved, + // otherwise another app with the predefined permissions can get incorrect + // permissions + policy_table::ApplicationPolicies::const_iterator it_default = + policies.apps.find(kDefaultId); + if (policies.apps.end() != it_default) { + if (!SaveSpecificAppPolicy(*it_default)) { + return false; + } + } + policy_table::ApplicationPolicies::const_iterator it_pre_data_consent = + policies.apps.find(kPreDataConsentId); + if (policies.apps.end() != it_pre_data_consent) { + if (!SaveSpecificAppPolicy(*it_pre_data_consent)) { + return false; + } + } + + if (!SaveDevicePolicy(policies.device)) { + return false; + } + + policy_table::ApplicationPolicies::const_iterator it; + for (it = policies.apps.begin(); it != policies.apps.end(); ++it) { + // Skip saving of predefined app, since they should be saved before + if (IsPredefinedApp(*it)) { + continue; + } + if (!SaveSpecificAppPolicy(*it)) { + return false; + } + } + + return true; +} + +bool SQLPTExtRepresentation::SaveSpecificAppPolicy( + const policy_table::ApplicationPolicies::value_type& app) { + if (app.second.is_string()) { + if (kDefaultId.compare(app.second.get_string()) == 0) { + if (!SetDefaultPolicy(app.first)) { + return false; + } + if (!SaveRequestType(app.first, *app.second.RequestType)) { + return false; + } + } else if (kPreDataConsentId.compare(app.second.get_string()) == 0) { + if (!SetPredataPolicy(app.first)) { + return false; + } + if (!SaveRequestType(app.first, *app.second.RequestType)) { + return false; + } + } + + // Stop saving other params, since predefined permissions already set + return true; + } + + SetIsDefault(app.first, false); + SetIsPredata(app.first, false); + + utils::dbms::SQLQuery app_query(db()); + if (!app_query.Prepare(sql_pt_ext::kInsertApplication)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement into application."); + return false; + } + + app_query.Bind(0, app.first); + app_query.Bind(1, app.second.keep_context); + app_query.Bind(2, app.second.steal_focus); + app_query.Bind( + 3, std::string(policy_table::EnumToJsonString(app.second.default_hmi))); + app_query.Bind( + 4, std::string(policy_table::EnumToJsonString(app.second.priority))); + app_query.Bind(5, app.second.is_null()); + app_query.Bind(6, *app.second.memory_kb); + app_query.Bind(7, static_cast<int64_t>(*app.second.heart_beat_timeout_ms)); + + if (!app_query.Exec() || !app_query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into application."); + return false; + } + + if (!SaveAppGroup(app.first, app.second.groups)) { + return false; + } + if (!SaveNickname(app.first, *app.second.nicknames)) { + return false; + } + if (!SaveAppType(app.first, *app.second.AppHMIType)) { + return false; + } + if (!SavePreconsentedGroup(app.first, *app.second.preconsented_groups)) { + return false; + } + + if (!SaveRequestType(app.first, *app.second.RequestType)) { + return false; + } + + return true; +} + +bool policy::SQLPTExtRepresentation::SaveDevicePolicy( + const policy_table::DevicePolicy& device) { + utils::dbms::SQLQuery app_query(db()); + if (!app_query.Prepare(sql_pt_ext::kInsertApplication)) { + LOG4CXX_WARN(logger_, + "Incorrect insert statement into application (device)."); + return false; + } + app_query.Bind(0, kDeviceId); + app_query.Bind(1, device.keep_context); + app_query.Bind(2, device.steal_focus); + app_query.Bind( + 3, std::string(policy_table::EnumToJsonString(device.default_hmi))); + app_query.Bind(4, + std::string(policy_table::EnumToJsonString(device.priority))); + app_query.Bind(5, false); + app_query.Bind(6, 0); + app_query.Bind(7, 0); + + if (!app_query.Exec() || !app_query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into application."); + return false; + } + + if (!SaveAppGroup(kDeviceId, device.groups)) { + return false; + } + if (!SavePreconsentedGroup(kDeviceId, *device.preconsented_groups)) { + return false; + } + + return true; +} + +bool SQLPTExtRepresentation::GatherApplicationPoliciesSection( + policy_table::ApplicationPoliciesSection* policies) const { + LOG4CXX_INFO(logger_, "Gather applications policies"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectAppPolicies)) { + LOG4CXX_WARN(logger_, "Incorrect select from app_policies"); + return false; + } + + while (query.Next()) { + rpc::Nullable<policy_table::ApplicationParams> params; + const std::string& app_id = query.GetString(0); + if (IsApplicationRevoked(app_id)) { + params.set_to_null(); + (*policies).apps[app_id] = params; + continue; + } + if (IsDefaultPolicy(app_id)) { + (*policies).apps[app_id].set_to_string(kDefaultId); + } + if (IsPredataPolicy(app_id)) { + (*policies).apps[app_id].set_to_string(kPreDataConsentId); + } + if (kDeviceId == app_id) { + policy_table::DevicePolicy device_policy; + policy_table::Priority priority; + policy_table::EnumFromJsonString(query.GetString(1), &priority); + device_policy.priority = priority; + policy_table::HmiLevel hmi; + policy_table::EnumFromJsonString(query.GetString(2), &hmi); + device_policy.default_hmi = hmi; + device_policy.keep_context = query.GetBoolean(3); + device_policy.steal_focus = query.GetBoolean(4); + if (!GatherAppGroup(app_id, &device_policy.groups)) { + return false; + } + GatherPreconsentedGroup(app_id, &*device_policy.preconsented_groups); + (*policies).device = device_policy; + continue; + } + policy_table::Priority priority; + policy_table::EnumFromJsonString(query.GetString(1), &priority); + params.priority = priority; + policy_table::HmiLevel hmi; + policy_table::EnumFromJsonString(query.GetString(2), &hmi); + params.default_hmi = hmi; + params.keep_context = query.GetBoolean(3); + params.steal_focus = query.GetBoolean(4); + *params.memory_kb = query.GetInteger(5); + *params.heart_beat_timeout_ms = query.GetUInteger(6); + + if (!GatherAppGroup(app_id, ¶ms.groups)) { + return false; + } + if (!GatherNickName(app_id, &*params.nicknames)) { + return false; + } + if (!GatherAppType(app_id, &*params.AppHMIType)) { + return false; + } + if (!GatherRequestType(app_id, &*params.RequestType)) { + return false; + } + GatherPreconsentedGroup(app_id, &*params.preconsented_groups); + (*policies).apps[app_id] = params; + } + return true; +} + +void SQLPTExtRepresentation::GatherPreconsentedGroup( + const std::string& app_id, policy_table::Strings* groups) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectPreconsentedGroups)) { + LOG4CXX_WARN(logger_, "Incorrect select from preconsented group"); + return; + } + + query.Bind(0, app_id); + while (query.Next()) { + groups->push_back(query.GetString(0)); + } +} + +bool SQLPTExtRepresentation::GatherUsageAndErrorCounts( + policy_table::UsageAndErrorCounts* counts) const { + LOG4CXX_INFO(logger_, "Gather Usage and Error Counts."); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectUsageAndErrorCount) || !query.Exec()) { + LOG4CXX_INFO(logger_, "Failed select from user_and_error_count"); + return false; + } + + *counts->count_of_iap_buffer_full = query.GetInteger(0); + *counts->count_sync_out_of_memory = query.GetInteger(1); + *counts->count_of_sync_reboots = query.GetInteger(2); + + return GatherAppLevels(&*counts->app_level); +} + +bool SQLPTExtRepresentation::GatherAppLevels( + policy_table::AppLevels* apps) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectAppLevels)) { + LOG4CXX_INFO(logger_, + "Failed select from app_level. SQLError = " + << query.LastError().text()); + return false; + } + while (query.Next()) { + policy_table::AppLevel level; + // value of time fields database is seconds + level.minutes_in_hmi_full = query.GetInteger(1); + level.minutes_in_hmi_limited = query.GetInteger(2); + level.minutes_in_hmi_background = query.GetInteger(3); + level.minutes_in_hmi_none = query.GetInteger(4); + level.count_of_user_selections = query.GetInteger(5); + level.count_of_rejections_sync_out_of_memory = query.GetInteger(6); + level.count_of_rejections_nickname_mismatch = query.GetInteger(7); + level.count_of_rejections_duplicate_name = query.GetInteger(8); + level.count_of_rejected_rpc_calls = query.GetInteger(9); + level.count_of_rpcs_sent_in_hmi_none = query.GetInteger(10); + level.count_of_removals_for_bad_behavior = query.GetInteger(11); + level.count_of_run_attempts_while_revoked = query.GetInteger(12); + level.app_registration_language_gui = query.GetString(13); + level.app_registration_language_vui = query.GetString(14); + level.count_of_tls_errors = query.GetInteger(15); + (*apps)[query.GetString(0)] = level; + } + + return true; +} + +void SQLPTExtRepresentation::GatherDeviceData( + policy_table::DeviceData* data) const { + LOG4CXX_INFO(logger_, "Gather device data."); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectDeviceData)) { + LOG4CXX_WARN(logger_, "Incorrect select statement for device data."); + return; + } + data->mark_initialized(); + while (query.Next()) { + policy_table::DeviceParams* specific_device = &(*data)[query.GetString(0)]; + *specific_device->hardware = query.GetString(1); + *specific_device->firmware_rev = query.GetString(2); + *specific_device->os = query.GetString(3); + *specific_device->os_version = query.GetString(4); + *specific_device->carrier = query.GetString(5); + *specific_device->max_number_rfcom_ports = query.GetInteger(6); + + // TODO(IKozyrenko): Check logic if optional container is missing + GatherConsentGroup(query.GetString(0), + &(*specific_device->user_consent_records)); + } +} + +void SQLPTExtRepresentation::GatherConsentGroup( + const std::string& device_id, + policy_table::UserConsentRecords* records) const { + LOG4CXX_INFO(logger_, "Gather consent records."); + utils::dbms::SQLQuery query(db()); + // Fill data for device + if (!query.Prepare(sql_pt_ext::kSelectDeviceConsentedGroup)) { + LOG4CXX_WARN(logger_, + "Incorrect select statement for device consented groups."); + return; + } + + query.Bind(0, device_id); + + // Fill device_data -> user_consent_records -> "device" + while (query.Next()) { + policy_table::ConsentRecords* device_consent_records = + &(*records)[kDeviceId]; + // TODO(IKozyrenko): Check logic if optional container is missing + policy_table::ConsentGroups& consent_groups = + *device_consent_records->consent_groups; + consent_groups[query.GetString(1)] = query.GetBoolean(2); + policy_table::Input input; + policy_table::EnumFromJsonString(query.GetString(3), &input); + *device_consent_records->input = input; + *device_consent_records->time_stamp = query.GetString(4); + } + + if (!query.Reset()) { + return; + } + + // Fill data for applications + if (!query.Prepare(sql_pt_ext::kSelectConsentGroup)) { + LOG4CXX_WARN(logger_, + "Incorrect select statement for app consented groups."); + return; + } + + query.Bind(0, device_id); + + // Fill device_data -> user_consent_records -> <app_id> + while (query.Next()) { + policy_table::ConsentRecords* app_consent_records = + &(*records)[query.GetString(1)]; + // TODO(IKozyrenko): Check logic if optional container is missing + policy_table::ConsentGroups& consent_groups = + *app_consent_records->consent_groups; + + consent_groups[query.GetString(2)] = query.GetBoolean(3); + policy_table::Input input; + policy_table::EnumFromJsonString(query.GetString(4), &input); + *app_consent_records->input = input; + *app_consent_records->time_stamp = query.GetString(5); + } +} + +bool SQLPTExtRepresentation::SaveDeviceData( + const policy_table::DeviceData& devices) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery drop_device_query(db()); + const std::string drop_device = "DELETE FROM `device`"; + if (!drop_device_query.Exec(drop_device)) { + LOG4CXX_WARN(logger_, "Could not clear device table."); + return false; + } + + utils::dbms::SQLQuery drop_device_consents_query(db()); + const std::string drop_device_consents = "DELETE FROM `device_consent_group`"; + if (!drop_device_consents_query.Exec(drop_device_consents)) { + LOG4CXX_WARN(logger_, "Could not clear device consents."); + return false; + } + + utils::dbms::SQLQuery drop_user_consents_query(db()); + const std::string drop_user_consents = "DELETE FROM `consent_group`"; + if (!drop_user_consents_query.Exec(drop_user_consents)) { + LOG4CXX_WARN(logger_, "Could not clear user consents."); + return false; + } + + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kInsertDeviceData)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for device data."); + return false; + } + + policy_table::DeviceData::const_iterator it = devices.begin(); + policy_table::DeviceData::const_iterator it_end = devices.end(); + for (; it != it_end; ++it) { + query.Bind(0, it->first); + query.Bind(1, *(it->second.hardware)); + query.Bind(2, *(it->second.firmware_rev)); + query.Bind(3, *(it->second.os)); + query.Bind(4, *(it->second.os_version)); + query.Bind(5, *(it->second.carrier)); + query.Bind(6, *(it->second.max_number_rfcom_ports)); + query.Bind(7, *(it->second.connection_type)); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into device data."); + return false; + } + + // TODO(IKozyrenko): Check logic if optional container is missing + if (!SaveConsentGroup(it->first, *it->second.user_consent_records)) { + return false; + } + } + + return true; +} + +bool SQLPTExtRepresentation::SaveConsentGroup( + const std::string& device_id, + const policy_table::UserConsentRecords& records) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + + policy_table::UserConsentRecords::const_iterator it = records.begin(); + policy_table::UserConsentRecords::const_iterator it_end = records.end(); + for (; it != it_end; ++it) { + // TODO(IKozyrenko): Check logic if optional container is missing + policy_table::ConsentGroups::const_iterator it_groups = + it->second.consent_groups->begin(); + policy_table::ConsentGroups::const_iterator it_groups_end = + it->second.consent_groups->end(); + for (; it_groups != it_groups_end; ++it_groups) { + if (kDeviceId == it->first) { + if (!query.Prepare(sql_pt_ext::kInsertDeviceConsentedGroup)) { + LOG4CXX_WARN(logger_, + "Incorrect insert statement for device consent group."); + return false; + } + query.Bind(0, device_id); + query.Bind(1, it_groups->first); + query.Bind(2, it_groups->second); + query.Bind( + 3, + std::string(policy_table::EnumToJsonString(*(it->second.input)))); + query.Bind(4, std::string(*(it->second.time_stamp))); + LOG4CXX_INFO(logger_, + "Device:" + << "time stamp " + << std::string(*(it->second.time_stamp)) << " group " + << it_groups->first << " consent " + << it_groups->second); + } else { + if (!query.Prepare(sql_pt_ext::kInsertConsentGroups)) { + LOG4CXX_WARN(logger_, + "Incorrect insert statement for consent group."); + return false; + } + query.Bind(0, device_id); + query.Bind(1, it->first); + query.Bind(2, it_groups->first); + query.Bind(3, it_groups->second); + query.Bind( + 4, + std::string(policy_table::EnumToJsonString(*(it->second.input)))); + query.Bind(5, std::string(*(it->second.time_stamp))); + LOG4CXX_INFO(logger_, + "Device:" + << "time stamp " + << std::string(*(it->second.time_stamp)) << " group " + << it_groups->first << " consent " + << it_groups->second); + } + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into consent group."); + return false; + } + } + } + + return true; +} + +bool SQLPTExtRepresentation::SavePreconsentedGroup( + const std::string& app_id, const policy_table::Strings& groups) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kInsertPreconsentedGroups)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for preconsented groups"); + return false; + } + + policy_table::Strings::const_iterator it; + for (it = groups.begin(); it != groups.end(); ++it) { + query.Bind(0, app_id); + query.Bind(1, *it); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into preconsented groups."); + return false; + } + } + + return true; +} + +void SQLPTExtRepresentation::GatherModuleMeta( + policy_table::ModuleMeta* meta) const { + LOG4CXX_INFO(logger_, "Gather Module Meta Info"); + utils::dbms::SQLQuery query(db()); + if (query.Prepare(sql_pt_ext::kSelectModuleMeta) && query.Next()) { + *meta->ccpu_version = query.GetString(0); + *meta->language = query.GetString(1); + *meta->wers_country_code = query.GetString(2); + *meta->pt_exchanged_at_odometer_x = query.GetInteger(3); + *meta->pt_exchanged_x_days_after_epoch = query.GetInteger(4); + *meta->ignition_cycles_since_last_exchange = query.GetInteger(5); + *meta->vin = query.GetString(6); + } +} + +void SQLPTExtRepresentation::Increment(const std::string& type) const { + utils::dbms::SQLQuery query(db()); + std::string update_counter = + "UPDATE `usage_and_error_count` SET `" + type + "` = `" + type + "` + 1"; + if (!query.Exec(update_counter)) { + LOG4CXX_INFO(logger_, "Failed updating global counter"); + } +} + +bool SQLPTExtRepresentation::IsExistAppLevel(const std::string& app_id) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kCountAppLevel)) { + LOG4CXX_INFO(logger_, "Incorrect statement of count app_level"); + return false; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Failed count app_level"); + return false; + } + return query.GetInteger(0) > 0; +} + +bool SQLPTExtRepresentation::GetAllAppGroups(const std::string& policy_app_id, + FunctionalGroupIDs& all_groups) { + LOG4CXX_INFO(logger_, "GetAllAppGroups for '" << policy_app_id << "'"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectAppGroupsId)) { + LOG4CXX_WARN(logger_, "Incorrect statement for select app groups id."); + return false; + } + + query.Bind(0, policy_app_id); + + while (query.Next()) { + all_groups.push_back(query.GetInteger(0)); + } + + return true; +} + +bool SQLPTExtRepresentation::GetConsentedGroups( + const std::string& policy_app_id, + const std::string& device_id, + FunctionalGroupIDs& allowed_groups, + FunctionalGroupIDs& disallowed_groups) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectConsentedGroupsId)) { + LOG4CXX_WARN(logger_, "Incorrect statement for select consent groups id."); + return false; + } + + query.Bind(0, policy_app_id); + query.Bind(1, device_id); + + while (query.Next()) { + if (query.GetBoolean(1)) { + allowed_groups.push_back(query.GetInteger(0)); + } else { + disallowed_groups.push_back(query.GetInteger(0)); + } + } + + return true; +} + +bool SQLPTExtRepresentation::GetPreconsentedGroups( + const std::string& policy_app_id, FunctionalGroupIDs& preconsented_groups) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectPreconsentedGroupsId)) { + LOG4CXX_WARN(logger_, + "Incorrect statement for select preconsented groups id."); + return false; + } + + query.Bind(0, policy_app_id); + + while (query.Next()) { + preconsented_groups.push_back(query.GetInteger(0)); + } + + return true; +} + +bool SQLPTExtRepresentation::GetFunctionalGroupNames( + FunctionalGroupNames& names) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectFunctionalGroupNames)) { + LOG4CXX_WARN(logger_, + "Incorrect statement for select functional groups names."); + return false; + } + + while (query.Next()) { + // Some of functional grous doesn't have filled user_consent_prompt + if (query.IsNull(1)) { + names[query.GetInteger(0)] = + std::make_pair<std::string, std::string>("", query.GetString(2)); + } else { + names[query.GetInteger(0)] = std::make_pair<std::string, std::string>( + query.GetString(1), query.GetString(2)); + } + } + + return true; +} + +void SQLPTExtRepresentation::FillFunctionalGroupPermissions( + FunctionalGroupIDs& ids, + FunctionalGroupNames& names, + GroupConsent state, + std::vector<FunctionalGroupPermission>& permissions) { + FunctionalGroupIDs::const_iterator it = ids.begin(); + FunctionalGroupIDs::const_iterator it_end = ids.end(); + for (; it != it_end; ++it) { + FunctionalGroupPermission current_group; + current_group.group_id = *it; + current_group.group_alias = names[*it].first; + current_group.group_name = names[*it].second; + current_group.state = state; + permissions.push_back(current_group); + } +} + +void SQLPTExtRepresentation::Increment(const std::string& app_id, + const std::string& type) const { + utils::dbms::SQLQuery query(db()); + std::string sql_counter; + if (IsExistAppLevel(app_id)) { + // update + sql_counter = "UPDATE `app_level` SET `" + type + "` = `" + type + + "` + 1 WHERE `application_id` = ?"; + } else { + // insert + sql_counter = "INSERT INTO `app_level` (`application_id`, `" + type + + "`) " + "VALUES (?, 1)"; + } + if (!query.Prepare(sql_counter)) { + LOG4CXX_INFO(logger_, "Incorrect statement of update app counter"); + return; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Failed updating app counter"); + } +} + +void SQLPTExtRepresentation::Set(const std::string& app_id, + const std::string& type, + const std::string& value) const { + utils::dbms::SQLQuery query(db()); + std::string sql_info; + if (IsExistAppLevel(app_id)) { + // update + sql_info = "UPDATE `app_level` SET `" + type + + "` = ? " + "WHERE `application_id` = ?"; + } else { + // insert + sql_info = "INSERT INTO `app_level` (`" + type + + "`, `application_id`) " + "VALUES (?, ?)"; + } + if (!query.Prepare(sql_info)) { + LOG4CXX_INFO(logger_, "Incorrect statement of update app info"); + return; + } + query.Bind(0, value); + query.Bind(1, app_id); + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Failed updating app info"); + } +} + +void SQLPTExtRepresentation::Add(const std::string& app_id, + const std::string& type, + int seconds) const { + utils::dbms::SQLQuery query(db()); + std::string sql_stopwatch; + if (IsExistAppLevel(app_id)) { + // update + sql_stopwatch = "UPDATE `app_level` SET `" + type + "` = `" + type + + "` + ? WHERE `application_id` = ?"; + } else { + // insert + sql_stopwatch = "INSERT INTO `app_level` (`" + type + + "`, `application_id`) " + "VALUES (?, ?)"; + } + if (!query.Prepare(sql_stopwatch)) { + LOG4CXX_INFO(logger_, "Incorrect statement of update app stopwatch"); + return; + } + query.Bind(0, seconds); + query.Bind(1, app_id); + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Failed updating app stopwatch"); + } +} + +bool SQLPTExtRepresentation::GetDefaultHMI(const std::string& policy_app_id, + std::string* default_hmi) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectDefaultHmi)) { + LOG4CXX_INFO(logger_, "Incorrect statement for default hmi."); + return false; + } + + query.Bind(0, policy_app_id); + + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Error during default hmi getting."); + return false; + } + + if (query.IsNull(0)) { + default_hmi->clear(); + return true; + } + + default_hmi->assign(query.GetString(0)); + + return true; +} + +bool SQLPTExtRepresentation::CountUnconsentedGroups( + const std::string& policy_app_id, + const std::string& device_id, + int* result) const { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kCountUnconsentedGroups)) { + LOG4CXX_WARN(logger_, "Incorrect select for unconsented groups."); + return false; + } + + query.Bind(0, policy_app_id); + query.Bind(1, device_id); + query.Bind(2, kDefaultId); + query.Bind(3, kPreDataConsentId); + + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Error during executing unconsented groups."); + return false; + } + *result = query.GetInteger(0); + return true; +} + +bool SQLPTExtRepresentation::IsMsgLanguagePresent(const std::string& message, + const std::string& language) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kHasMsgLanguageCode)) { + LOG4CXX_WARN(logger_, "Incorrect statement for message language check."); + return false; + } + + query.Bind(0, message); + query.Bind(1, language); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed to check message language code."); + return false; + } + + return query.GetInteger(0) != 0; +} + +bool SQLPTExtRepresentation::SaveMessageString( + const std::string& type, + const std::string& lang, + const policy_table::MessageString& strings) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertMessageString)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for message."); + return false; + } + + query.Bind(0, *strings.tts); + query.Bind(1, *strings.label); + query.Bind(2, *strings.line1); + query.Bind(3, *strings.line2); + query.Bind(4, lang); + query.Bind(5, type); + query.Bind(6, *strings.textBody); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into message."); + return false; + } + + return true; +} + +bool SQLPTExtRepresentation::SaveUsageAndErrorCounts( + const policy_table::UsageAndErrorCounts& counts) { + return SaveAppCounters(*counts.app_level) && SaveGlobalCounters(counts); +} + +bool SQLPTExtRepresentation::SaveModuleMeta( + const policy_table::ModuleMeta& meta) { + utils::dbms::SQLQuery query(db()); + + if (!query.Prepare(sql_pt_ext::kSaveModuleMeta)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for module_meta."); + return false; + } + const int64_t odometer = *(meta.pt_exchanged_at_odometer_x); + + query.Bind(0, *(meta.ccpu_version)); + query.Bind(1, *(meta.language)); + query.Bind(2, *(meta.wers_country_code)); + query.Bind(3, odometer); + query.Bind(4, *(meta.pt_exchanged_x_days_after_epoch)); + query.Bind(5, *(meta.ignition_cycles_since_last_exchange)); + query.Bind(6, *(meta.vin)); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect update for module_meta."); + return false; + } + + return true; +} + +bool SQLPTExtRepresentation::SaveAppCounters( + const rpc::policy_table_interface_base::AppLevels& app_levels) { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteAppLevel)) { + LOG4CXX_WARN(logger_, "Incorrect delete from app level."); + return false; + } + if (!query.Prepare(sql_pt::kInsertAppLevel)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for app level."); + return false; + } + + policy_table::AppLevels::const_iterator it; + for (it = app_levels.begin(); it != app_levels.end(); ++it) { + query.Bind(0, it->first); + query.Bind(1, it->second.minutes_in_hmi_full); + query.Bind(2, it->second.minutes_in_hmi_limited); + query.Bind(3, it->second.minutes_in_hmi_background); + query.Bind(4, it->second.minutes_in_hmi_none); + query.Bind(5, it->second.count_of_user_selections); + query.Bind(6, it->second.count_of_rejections_sync_out_of_memory); + query.Bind(7, it->second.count_of_rejections_nickname_mismatch); + query.Bind(8, it->second.count_of_rejections_duplicate_name); + query.Bind(9, it->second.count_of_rejected_rpc_calls); + query.Bind(10, it->second.count_of_rpcs_sent_in_hmi_none); + query.Bind(11, it->second.count_of_removals_for_bad_behavior); + query.Bind(12, it->second.count_of_run_attempts_while_revoked); + query.Bind(13, it->second.app_registration_language_gui); + query.Bind(14, it->second.app_registration_language_vui); + query.Bind(15, it->second.count_of_tls_errors); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into app level."); + return false; + } + } + return true; +} + +bool SQLPTExtRepresentation::SaveGlobalCounters( + const rpc::policy_table_interface_base::UsageAndErrorCounts& counts) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateGlobalCounters)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for global counters."); + return false; + } + + query.Bind(0, *counts.count_of_iap_buffer_full); + query.Bind(1, *counts.count_sync_out_of_memory); + query.Bind(2, *counts.count_of_sync_reboots); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect insert into global counters."); + return false; + } + + return true; +} + +bool SQLPTExtRepresentation::CleanupUnpairedDevices( + const DeviceIds& device_ids) const { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery delete_device_query(db()); + if (!delete_device_query.Prepare(sql_pt::kDeleteDevice)) { + LOG4CXX_WARN(logger_, "Incorrect statement for device delete."); + return true; + } + + utils::dbms::SQLQuery delete_device_consent_query(db()); + if (!delete_device_consent_query.Prepare(sql_pt_ext::kDeleteDeviceConsent)) { + LOG4CXX_WARN(logger_, "Incorrect statement for delete device consent."); + return false; + } + + utils::dbms::SQLQuery delete_app_consent_query(db()); + if (!delete_app_consent_query.Prepare(sql_pt_ext::kDeleteAppConsent)) { + LOG4CXX_WARN(logger_, "Incorrect statement for delete app consent."); + return false; + } + + DeviceIds::const_iterator it = device_ids.begin(); + DeviceIds::const_iterator it_end = device_ids.end(); + for (; it != it_end; ++it) { + delete_device_query.Bind(0, (*it)); + if (!delete_device_query.Exec() || !delete_device_query.Reset()) { + LOG4CXX_WARN(logger_, "Failed to delete from device"); + return false; + } + + delete_device_consent_query.Bind(0, (*it)); + if (!delete_device_consent_query.Exec() || + !delete_device_consent_query.Reset()) { + LOG4CXX_WARN(logger_, "Failed to delete from device consent."); + return false; + } + + delete_app_consent_query.Bind(0, (*it)); + if (!delete_app_consent_query.Exec() || !delete_app_consent_query.Reset()) { + LOG4CXX_WARN(logger_, "Failed to delete from app consent."); + return false; + } + } + return true; +} + +bool SQLPTExtRepresentation::SetDefaultPolicy(const std::string& app_id) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kDeleteAppGroupByApplicationId)) { + LOG4CXX_ERROR(logger_, "Incorrect statement to delete from app_group."); + return false; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_ERROR(logger_, "Failed deleting from app_group."); + return false; + } + + if (!query.Prepare(sql_pt_ext::kDeletePreconsentedGroupsByApplicationId)) { + LOG4CXX_ERROR(logger_, "Incorrect statement to delete from app_group."); + return false; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_ERROR(logger_, "Failed deleting from app_group."); + return false; + } + + if (!CopyApplication(kDefaultId, app_id)) { + return false; + } + + SetPreloaded(false); + + policy_table::Strings default_groups; + policy_table::Strings default_preconsented_groups; + GatherAppGroup(kDefaultId, &default_groups); + GatherPreconsentedGroup(kDefaultId, &default_preconsented_groups); + if (SaveAppGroup(app_id, default_groups) && + SavePreconsentedGroup(app_id, default_preconsented_groups)) { + return SetIsDefault(app_id, true) && SetIsPredata(app_id, false); + } + + return false; +} + +bool SQLPTExtRepresentation::SetPredataPolicy(const std::string& app_id) { + LOG4CXX_INFO(logger_, + "SQLPTExtRepresentation::SetPredataPolicy for " << app_id); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kDeleteAppGroupByApplicationId)) { + LOG4CXX_ERROR(logger_, "Incorrect statement to delete from app_group."); + return false; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_ERROR(logger_, "Failed deleting from app_group."); + return false; + } + + if (!query.Prepare(sql_pt_ext::kDeletePreconsentedGroupsByApplicationId)) { + LOG4CXX_ERROR(logger_, "Incorrect statement to delete from app_group."); + return false; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_ERROR(logger_, "Failed deleting from app_group."); + return false; + } + + if (!CopyApplication(kPreDataConsentId, app_id)) { + return false; + } + + SetPreloaded(false); + + policy_table::Strings predataconsent_groups; + policy_table::Strings predataconsent_preconsented_groups; + GatherAppGroup(kPreDataConsentId, &predataconsent_groups); + GatherPreconsentedGroup(kPreDataConsentId, &predataconsent_groups); + if (SaveAppGroup(app_id, predataconsent_groups) && + SavePreconsentedGroup(app_id, predataconsent_groups)) { + return SetIsDefault(app_id, false) && SetIsPredata(app_id, true); + } + return false; +} + +bool SQLPTExtRepresentation::IsPredataPolicy(const std::string& app_id) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectApplicationIsPreData)) { + LOG4CXX_WARN(logger_, "Incorrect select application is pre_dataConsented"); + return false; + } + + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed select application is pre_dataConsented"); + return false; + } + return query.IsNull(0) ? false : query.GetBoolean(0); +} + +bool SQLPTExtRepresentation::SetIsPredata(const std::string& app_id, + bool is_pre_data) { + LOG4CXX_TRACE(logger_, "Set flag is_predata of application"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateIsPredata)) { + LOG4CXX_WARN(logger_, "Incorect statement for updating is_predata"); + return false; + } + + query.Bind(0, is_pre_data); + query.Bind(1, app_id); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed update is_predata"); + return false; + } + return true; +} + +bool SQLPTExtRepresentation::SetUnpairedDevice(const std::string& device_id, + bool unpaired) const { + LOG4CXX_TRACE(logger_, "Set unpaired device: " << device_id); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateUnpairedDevice)) { + LOG4CXX_WARN(logger_, "Incorect statement for updating unpaired device"); + return false; + } + + query.Bind(0, unpaired); + query.Bind(1, device_id); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed update unpaired device"); + return false; + } + return true; +} + +bool SQLPTExtRepresentation::UnpairedDevicesList(DeviceIds* device_ids) const { + LOG4CXX_TRACE(logger_, "Get list of unpaired devices"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kSelectUnpairedDevices)) { + LOG4CXX_WARN(logger_, "Incorect statement for selecting unpaired devices"); + return false; + } + + while (query.Next()) { + device_ids->push_back(query.GetString(0)); + } + return true; +} + +bool SQLPTExtRepresentation::SetVINValue(const std::string& value) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kUpdateModuleMetaVinParam)) { + LOG4CXX_WARN(logger_, "Incorect statement for updating module_meta params"); + return false; + } + + query.Bind(0, value); + const bool result = query.Exec(); + + if (!result) { + LOG4CXX_WARN(logger_, "Failed update module_meta"); + } + return result; +} + +bool SQLPTExtRepresentation::RemoveAppConsentForGroup( + const std::string& policy_app_id, + const std::string& functional_group_name) const { + utils::dbms::SQLQuery query_group_id(db()); + if (!query_group_id.Prepare(sql_pt_ext::kSelectGroupId)) { + LOG4CXX_WARN(logger_, "Incorect statement for select group name."); + return false; + } + + query_group_id.Bind(0, functional_group_name); + + if (!query_group_id.Exec()) { + LOG4CXX_WARN(logger_, "Failed to select group id."); + return false; + } + + const int id = query_group_id.GetInteger(0); + + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt_ext::kDeleteAppGroupConsent)) { + LOG4CXX_WARN(logger_, "Incorect statement for remove app consent."); + return false; + } + + query.Bind(0, policy_app_id); + query.Bind(1, id); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed to remove app consent."); + return false; + } + + return true; +} + +} // namespace policy diff --git a/src/components/policy/policy_external/src/sql_pt_queries.cc b/src/components/policy/policy_external/src/sql_pt_queries.cc new file mode 100644 index 0000000000..f40b31f83a --- /dev/null +++ b/src/components/policy/policy_external/src/sql_pt_queries.cc @@ -0,0 +1,714 @@ +/* + Copyright (c) 2015, " Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, " with or without + modification, " are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, " this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, " + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, " INCLUDING, " BUT NOT LIMITED TO, " THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, " INDIRECT, " INCIDENTAL, " SPECIAL, " EXEMPLARY, " OR + CONSEQUENTIAL DAMAGES (INCLUDING, " BUT NOT LIMITED TO, " PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, " DATA, " OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, " WHETHER IN + CONTRACT, " STRICT LIABILITY, " OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, " EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "policy/sql_pt_queries.h" + +namespace policy { +namespace sql_pt { + +const std::string kSelectPriority = + "SELECT `priority_value` FROM `application` WHERE `id` = ? LIMIT 1"; +const std::string kCreateSchema = + "BEGIN; " + "CREATE TABLE IF NOT EXISTS `device`( " + " `id` VARCHAR(100) PRIMARY KEY NOT NULL, " + " `hardware` VARCHAR(45), " + " `firmware_rev` VARCHAR(45), " + " `os` VARCHAR(45), " + " `os_version` VARCHAR(45), " + " `carrier` VARCHAR(45), " + " `max_number_rfcom_ports` INTEGER," + " `connection_type` VARCHAR(45), " + " `unpaired` BOOL " + "); " + "CREATE TABLE IF NOT EXISTS `usage_and_error_count`( " + " `count_of_iap_buffer_full` INTEGER, " + " `count_sync_out_of_memory` INTEGER, " + " `count_of_sync_reboots` INTEGER " + "); " + "CREATE TABLE IF NOT EXISTS `module_meta`( " + " `ccpu_version` VARCHAR(45), " + " `language` VARCHAR(45), " + " `wers_country_code` VARCHAR(45), " + " `pt_exchanged_at_odometer_x` INTEGER NOT NULL DEFAULT 0, " + " `pt_exchanged_x_days_after_epoch` INTEGER NOT NULL DEFAULT 0, " + " `ignition_cycles_since_last_exchange` INTEGER NOT NULL DEFAULT 0, " + " `vin` VARCHAR(45)," + " `flag_update_required` BOOL NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `module_config`( " + " `preloaded_pt` BOOL NOT NULL, " + " `is_first_run` BOOL NOT NULL, " + " `exchange_after_x_ignition_cycles` INTEGER NOT NULL, " + " `exchange_after_x_kilometers` INTEGER NOT NULL, " + " `exchange_after_x_days` INTEGER NOT NULL, " + " `timeout_after_x_seconds` INTEGER NOT NULL, " + " `vehicle_make` VARCHAR(45), " + " `vehicle_model` VARCHAR(45), " + " `vehicle_year` VARCHAR(4), " + " `preloaded_date` VARCHAR (10), " + " `certificate` VARCHAR (45) " + "); " + "CREATE TABLE IF NOT EXISTS `functional_group`( " + " `id` INTEGER PRIMARY KEY NOT NULL, " + " `user_consent_prompt` TEXT, " + " `name` VARCHAR(100) NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `priority`( " + " `value` VARCHAR(45) PRIMARY KEY NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `hmi_level`( " + " `value` VARCHAR(45) PRIMARY KEY NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `notifications_by_priority`( " + " `priority_value` VARCHAR(45) PRIMARY KEY NOT NULL, " + " `value` INTEGER NOT NULL, " + " CONSTRAINT `fk_notifications_by_priority_priority1` " + " FOREIGN KEY(`priority_value`) " + " REFERENCES `priority`(`value`) " + "); " + "CREATE INDEX IF NOT EXISTS " + "`notifications_by_priority.fk_notifications_by_priority_priority1_idx` " + " ON `notifications_by_priority`(`priority_value`); " + "CREATE TABLE IF NOT EXISTS `language`( " + " `code` VARCHAR(25) PRIMARY KEY NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `message_type`( " + " `name` VARCHAR(45) PRIMARY KEY NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `version`( " + " `number` VARCHAR(45) NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `rpc`( " + " `id` INTEGER PRIMARY KEY NOT NULL, " + " `name` VARCHAR(45) NOT NULL, " + " `parameter` VARCHAR(45), " + " `hmi_level_value` VARCHAR(45) NOT NULL, " + " `functional_group_id` INTEGER NOT NULL, " + " CONSTRAINT `fk_rpc_hmi_level1` " + " FOREIGN KEY(`hmi_level_value`) " + " REFERENCES `hmi_level`(`value`), " + " CONSTRAINT `fk_rpc_functional_group1` " + " FOREIGN KEY(`functional_group_id`) " + " REFERENCES `functional_group`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS `rpc.fk_rpc_hmi_level1_idx` " + " ON `rpc`(`hmi_level_value`); " + "CREATE INDEX IF NOT EXISTS `rpc.fk_rpc_functional_group1_idx` " + " ON `rpc`(`functional_group_id`); " + "CREATE INDEX `rpc.select_rpc_name_hmi_level` " + " ON `rpc`(`name`,`hmi_level_value`);" + "CREATE TABLE IF NOT EXISTS `application`( " + " `id` VARCHAR(45) PRIMARY KEY NOT NULL, " + " `keep_context` BOOLEAN, " + " `steal_focus` BOOLEAN, " + " `default_hmi` VARCHAR(45), " + " `priority_value` VARCHAR(45), " + " `is_revoked` BOOLEAN, " + " `is_default` BOOLEAN, " + " `is_predata` BOOLEAN, " + " `memory_kb` INTEGER NOT NULL, " + " `heart_beat_timeout_ms` INTEGER NOT NULL, " + " CONSTRAINT `fk_application_hmi_level1` " + " FOREIGN KEY(`default_hmi`) " + " REFERENCES `hmi_level`(`value`), " + " CONSTRAINT `fk_application_priorities1` " + " FOREIGN KEY(`priority_value`) " + " REFERENCES `priority`(`value`) " + "); " + "CREATE INDEX IF NOT EXISTS `application.fk_application_hmi_level1_idx` " + " ON `application`(`default_hmi`); " + "CREATE INDEX IF NOT EXISTS `application.fk_application_priorities1_idx` " + " ON `application`(`priority_value`); " + "CREATE TABLE IF NOT EXISTS `app_group`( " + " `application_id` VARCHAR(45) NOT NULL, " + " `functional_group_id` INTEGER NOT NULL, " + " PRIMARY KEY(`application_id`,`functional_group_id`), " + " CONSTRAINT `fk_application_has_functional_group_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`), " + " CONSTRAINT `fk_application_has_functional_group_functional_group1` " + " FOREIGN KEY(`functional_group_id`) " + " REFERENCES `functional_group`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS " + "`app_group.fk_application_has_functional_group_functional_group1_idx` " + " ON `app_group`(`functional_group_id`); " + "CREATE INDEX IF NOT EXISTS " + "`app_group.fk_application_has_functional_group_application1_idx` " + " ON `app_group`(`application_id`); " + "CREATE TABLE IF NOT EXISTS `preconsented_group`( " + " `application_id` VARCHAR(45) NOT NULL, " + " `functional_group_id` INTEGER NOT NULL, " + " PRIMARY KEY(`application_id`,`functional_group_id`), " + " CONSTRAINT `fk_application_has_functional_group_application2` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`), " + " CONSTRAINT `fk_application_has_functional_group_functional_group2` " + " FOREIGN KEY(`functional_group_id`) " + " REFERENCES `functional_group`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS " + "`preconsented_group.fk_application_has_functional_group_functional_group2_" + "idx` " + " ON `preconsented_group`(`functional_group_id`); " + "CREATE INDEX IF NOT EXISTS " + "`preconsented_group.fk_application_has_functional_group_application2_idx` " + " ON `preconsented_group`(`application_id`); " + "CREATE TABLE IF NOT EXISTS `seconds_between_retry`( " + " `index` INTEGER PRIMARY KEY NOT NULL, " + " `value` INTEGER NOT NULL " + "); " + "CREATE TABLE IF NOT EXISTS `device_consent_group`( " + " `device_id` VARCHAR(100) NOT NULL, " + " `functional_group_id` INTEGER NOT NULL, " + " `is_consented` BOOL NOT NULL, " + " `input` VARCHAR(45), " + " `time_stamp` VARCHAR(45), " + " PRIMARY KEY(`device_id`,`functional_group_id`), " + " CONSTRAINT `fk_device_has_functional_group_device1` " + " FOREIGN KEY(`device_id`) " + " REFERENCES `device`(`id`), " + " CONSTRAINT `fk_device_has_functional_group_functional_group1` " + " FOREIGN KEY(`functional_group_id`) " + " REFERENCES `functional_group`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS " + "`device_consent_group.fk_device_has_functional_group_functional_group1_" + "idx` " + " ON `device_consent_group`(`functional_group_id`); " + "CREATE INDEX IF NOT EXISTS " + "`device_consent_group.fk_device_has_functional_group_device1_idx` " + " ON `device_consent_group`(`device_id`); " + "CREATE TABLE IF NOT EXISTS `app_level`( " + " `application_id` VARCHAR(45) PRIMARY KEY NOT NULL, " + " `minutes_in_hmi_full` INTEGER DEFAULT 0, " + " `minutes_in_hmi_limited` INTEGER DEFAULT 0, " + " `minutes_in_hmi_background` INTEGER DEFAULT 0, " + " `minutes_in_hmi_none` INTEGER DEFAULT 0, " + " `count_of_user_selections` INTEGER DEFAULT 0, " + " `count_of_rejections_sync_out_of_memory` INTEGER DEFAULT 0, " + " `count_of_rejections_nickname_mismatch` INTEGER DEFAULT 0, " + " `count_of_rejections_duplicate_name` INTEGER DEFAULT 0, " + " `count_of_rejected_rpcs_calls` INTEGER DEFAULT 0, " + " `count_of_rpcs_sent_in_hmi_none` INTEGER DEFAULT 0, " + " `count_of_removals_for_bad_behavior` INTEGER DEFAULT 0, " + " `count_of_run_attempts_while_revoked` INTEGER DEFAULT 0, " + " `count_of_tls_errors` INTEGER DEFAULT 0, " + " `app_registration_language_gui` VARCHAR(25), " + " `app_registration_language_vui` VARCHAR(25), " + " CONSTRAINT `fk_app_levels_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`), " + " CONSTRAINT `fk_app_level_language1` " + " FOREIGN KEY(`app_registration_language_gui`) " + " REFERENCES `language`(`code`), " + " CONSTRAINT `fk_app_level_language2` " + " FOREIGN KEY(`app_registration_language_vui`) " + " REFERENCES `language`(`code`) " + "); " + "CREATE INDEX IF NOT EXISTS `app_level.fk_app_levels_application1_idx` " + " ON `app_level`(`application_id`); " + "CREATE INDEX IF NOT EXISTS `app_level.fk_app_level_language1_idx` " + " ON `app_level`(`app_registration_language_gui`); " + "CREATE INDEX IF NOT EXISTS `app_level.fk_app_level_language2_idx` " + " ON `app_level`(`app_registration_language_vui`); " + "CREATE TABLE IF NOT EXISTS `nickname`( " + " `name` VARCHAR(100) NOT NULL, " + " `application_id` VARCHAR(45) NOT NULL, " + " PRIMARY KEY(`name`,`application_id`), " + " CONSTRAINT `fk_nickname_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS `nickname.fk_nickname_application1_idx` " + " ON `nickname`(`application_id`); " + "CREATE TABLE IF NOT EXISTS `app_type`( " + " `name` VARCHAR(50) NOT NULL, " + " `application_id` VARCHAR(45) NOT NULL, " + " PRIMARY KEY(`name`,`application_id`), " + " CONSTRAINT `fk_app_type_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`) " + "); " + "CREATE TABLE IF NOT EXISTS `request_type`( " + " `request_type` VARCHAR(50) NOT NULL, " + " `application_id` VARCHAR(45) NOT NULL, " + " PRIMARY KEY(`request_type`,`application_id`), " + " CONSTRAINT `fk_app_type_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS `app_type.fk_app_type_application1_idx` " + " ON `app_type`(`application_id`); " + "CREATE TABLE IF NOT EXISTS `consent_group`( " + " `device_id` VARCHAR(100) NOT NULL, " + " `application_id` VARCHAR(45) NOT NULL, " + " `functional_group_id` INTEGER NOT NULL, " + " `is_consented` BOOL NOT NULL, " + " `input` VARCHAR(45), " + " `time_stamp` VARCHAR(45), " + " PRIMARY KEY(`application_id`,`functional_group_id`,`device_id`), " + " CONSTRAINT `fk_consent_group_device1` " + " FOREIGN KEY(`device_id`) " + " REFERENCES `device`(`id`), " + " CONSTRAINT `fk_consent_group_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`), " + " CONSTRAINT `fk_consent_group_functional_group1` " + " FOREIGN KEY(`functional_group_id`) " + " REFERENCES `functional_group`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS " + "`consent_group.fk_consent_group_device1_idx` " + " ON `device_consent_group`(`device_id`); " + "CREATE INDEX IF NOT EXISTS " + "`consent_group.fk_consent_group_functional_group1_idx` " + " ON `consent_group`(`functional_group_id`); " + "CREATE TABLE IF NOT EXISTS `endpoint`( " + " `service` INTEGER NOT NULL, " + " `url` VARCHAR(100) NOT NULL, " + " `application_id` VARCHAR(45) NOT NULL, " + " CONSTRAINT `fk_endpoint_application1` " + " FOREIGN KEY(`application_id`) " + " REFERENCES `application`(`id`) " + "); " + "CREATE INDEX IF NOT EXISTS `endpoint.fk_endpoint_application1_idx` " + " ON `endpoint`(`application_id`); " + "CREATE TABLE IF NOT EXISTS `message`( " + " `id` INTEGER PRIMARY KEY NOT NULL, " + " `tts` TEXT, " + " `label` TEXT, " + " `line1` TEXT, " + " `line2` TEXT, " + " `textBody` TEXT, " + " `language_code` VARCHAR(25) NOT NULL, " + " `message_type_name` VARCHAR(45) NOT NULL, " + " CONSTRAINT `fk_messages_languages1` " + " FOREIGN KEY(`language_code`) " + " REFERENCES `language`(`code`), " + " CONSTRAINT `fk_message_consumer_friendly_messages1` " + " FOREIGN KEY(`message_type_name`) " + " REFERENCES `message_type`(`name`) " + "); " + "CREATE INDEX IF NOT EXISTS `message.fk_messages_languages1_idx` " + " ON `message`(`language_code`);" + "CREATE INDEX IF NOT EXISTS " + "`message.fk_message_consumer_friendly_messages1_idx` " + " ON `message`(`message_type_name`);" + "CREATE TABLE IF NOT EXISTS `_internal_data`( " + " `db_version_hash` INTEGER " + " ); " + "COMMIT;"; + +const std::string kInsertInitData = + "INSERT OR IGNORE INTO `usage_and_error_count` ( " + " `count_of_iap_buffer_full`, `count_sync_out_of_memory`, " + " `count_of_sync_reboots`) VALUES (0, 0, 0); " + "INSERT OR IGNORE INTO `module_meta` (`pt_exchanged_at_odometer_x`, " + " `pt_exchanged_x_days_after_epoch`, " + "`ignition_cycles_since_last_exchange`," + " `flag_update_required`) " + " VALUES (0, 0, 0, 0); " + "INSERT OR IGNORE INTO `module_config` (`preloaded_pt`, `is_first_run`," + " `exchange_after_x_ignition_cycles`, `exchange_after_x_kilometers`, " + " `exchange_after_x_days`, `timeout_after_x_seconds`) " + " VALUES(1, 0, 0, 0, 0, 0); " + "INSERT OR IGNORE INTO `priority`(`value`) VALUES ('EMERGENCY'); " + "INSERT OR IGNORE INTO `priority`(`value`) VALUES ('NAVIGATION'); " + "INSERT OR IGNORE INTO `priority`(`value`) VALUES ('VOICECOMMUNICATION'); " + "INSERT OR IGNORE INTO `priority`(`value`) VALUES ('COMMUNICATION'); " + "INSERT OR IGNORE INTO `priority`(`value`) VALUES ('NORMAL'); " + "INSERT OR IGNORE INTO `priority`(`value`) VALUES ('NONE'); " + "INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('FULL'); " + "INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('LIMITED'); " + "INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('BACKGROUND'); " + "INSERT OR IGNORE INTO `hmi_level`(`value`) VALUES ('NONE'); " + "INSERT OR IGNORE INTO `version` (`number`) VALUES('0'); " + "INSERT OR IGNORE INTO `_internal_data` (`db_version_hash`) VALUES(0); " + ""; + +const std::string kDropSchema = + "BEGIN; " + "DROP INDEX IF EXISTS `message.fk_messages_languages1_idx`; " + "DROP INDEX IF EXISTS " + "`message.fk_message_consumer_friendly_messages1_idx`; " + "DROP TABLE IF EXISTS `message`; " + "DROP INDEX IF EXISTS `endpoint.fk_endpoint_application1_idx`; " + "DROP TABLE IF EXISTS `endpoint`; " + "DROP INDEX IF EXISTS `consent_group.fk_consent_group_device1_idx`; " + "DROP INDEX IF EXISTS " + "`consent_group.fk_consent_group_functional_group1_idx`; " + "DROP TABLE IF EXISTS `consent_group`; " + "DROP INDEX IF EXISTS `app_type.fk_app_type_application1_idx`; " + "DROP TABLE IF EXISTS `app_type`; " + "DROP TABLE IF EXISTS `request_type`; " + "DROP INDEX IF EXISTS `nickname.fk_nickname_application1_idx`; " + "DROP TABLE IF EXISTS `nickname`; " + "DROP INDEX IF EXISTS `app_level.fk_app_level_language2_idx`; " + "DROP INDEX IF EXISTS `app_level.fk_app_level_language1_idx`; " + "DROP INDEX IF EXISTS `app_level.fk_app_levels_application1_idx`; " + "DROP TABLE IF EXISTS `app_level`; " + "DROP INDEX IF EXISTS " + "`device_consent_group.fk_device_has_functional_group_device1_idx`; " + "DROP INDEX IF EXISTS " + "`device_consent_group.fk_device_has_functional_group_functional_group1_" + "idx`; " + "DROP TABLE IF EXISTS `device_consent_group`; " + "DROP TABLE IF EXISTS `seconds_between_retry`; " + "DROP INDEX IF EXISTS " + "`preconsented_group.fk_application_has_functional_group_application2_idx`;" + " " + "DROP INDEX IF EXISTS " + "`preconsented_group.fk_application_has_functional_group_functional_group2_" + "idx`; " + "DROP TABLE IF EXISTS `preconsented_group`; " + "DROP INDEX IF EXISTS " + "`app_group.fk_application_has_functional_group_application1_idx`; " + "DROP INDEX IF EXISTS " + "`app_group.fk_application_has_functional_group_functional_group1_idx`; " + "DROP TABLE IF EXISTS `app_group`; " + "DROP INDEX IF EXISTS `application.fk_application_priorities1_idx`; " + "DROP INDEX IF EXISTS `application.fk_application_hmi_level1_idx`; " + "DROP TABLE IF EXISTS `application`; " + "DROP INDEX IF EXISTS `rpc.select_rpc_name_hmi_level`; " + "DROP INDEX IF EXISTS `rpc.fk_rpc_functional_group1_idx`; " + "DROP INDEX IF EXISTS `rpc.fk_rpc_hmi_level1_idx`; " + "DROP TABLE IF EXISTS `rpc`; " + "DROP TABLE IF EXISTS `version`; " + "DROP TABLE IF EXISTS `message_type`; " + "DROP TABLE IF EXISTS `language`; " + "DROP INDEX IF EXISTS " + "`notifications_by_priority.fk_notifications_by_priority_priority1_idx`; " + "DROP TABLE IF EXISTS `notifications_by_priority`; " + "DROP TABLE IF EXISTS `hmi_level`; " + "DROP TABLE IF EXISTS `priority`; " + "DROP TABLE IF EXISTS `functional_group`; " + "DROP TABLE IF EXISTS `module_config`; " + "DROP TABLE IF EXISTS `module_meta`; " + "DROP TABLE IF EXISTS `usage_and_error_count`; " + "DROP TABLE IF EXISTS `device`; " + "DROP TABLE IF EXISTS `_internal_data`; " + "COMMIT; " + "VACUUM;"; + +const std::string kDeleteData = + "BEGIN; " + "DELETE FROM `message`; " + "DELETE FROM `endpoint`; " + "DELETE FROM `consent_group`; " + "DELETE FROM `app_type`; " + "DELETE FROM `nickname`; " + "DELETE FROM `app_level`; " + "DELETE FROM `device_consent_group`; " + "DELETE FROM `seconds_between_retry`; " + "DELETE FROM `preconsented_group`; " + "DELETE FROM `app_group`; " + "DELETE FROM `application`; " + "DELETE FROM `rpc`; " + "DELETE FROM `version`; " + "DELETE FROM `message_type`; " + "DELETE FROM `language`; " + "DELETE FROM `notifications_by_priority`; " + "DELETE FROM `hmi_level`; " + "DELETE FROM `priority`; " + "DELETE FROM `functional_group`; " + "DELETE FROM `module_config`; " + "DELETE FROM `module_meta`; " + "DELETE FROM `usage_and_error_count`; " + "DELETE FROM `device`; " + "DELETE FROM `request_type`; " + "COMMIT; " + "VACUUM;"; + +const std::string kCheckDBIntegrity = "PRAGMA integrity_check"; + +const std::string kCheckPgNumber = "PRAGMA page_count"; + +const std::string kSelectLockScreenIcon = + "SELECT `url` FROM `endpoint` WHERE `service` = ? AND `application_id` = ?"; + +const std::string kSelectRpc = + "SELECT DISTINCT `rpc`.`parameter` FROM `rpc` " + " JOIN `app_group` AS `g` ON (`g`.`functional_group_id` = " + "`rpc`.`functional_group_id` " + " AND (`g`.`application_id` = ?)) " + "WHERE `rpc`.`hmi_level_value` = ? AND `rpc`.`name` = ?"; + +const std::string kSelectPreloaded = + "SELECT `preloaded_pt` FROM `module_config` " + "WHERE `preloaded_pt` = 1 LIMIT 1"; + +const std::string kUpdatePreloaded = + "UPDATE `module_config` SET `preloaded_pt` = ?"; + +const std::string kIsFirstRun = "SELECT `is_first_run` FROM `module_config` "; + +const std::string kSetNotFirstRun = + "UPDATE `module_config` SET `is_first_run`= 0 "; + +const std::string kSelectEndpoint = + "SELECT `url`, `application_id` FROM `endpoint` WHERE `service` = ? "; + +const std::string kInsertFunctionalGroup = + "INSERT INTO `functional_group` (`id`, `name`, `user_consent_prompt`) " + " VALUES (?, ?, ?)"; + +const std::string kInsertRpc = + "INSERT INTO `rpc` (`name`, `hmi_level_value`, `functional_group_id`) " + " VALUES (?, ?, ?)"; + +const std::string kInsertRpcWithParameter = + "INSERT INTO `rpc` (`name`, `hmi_level_value`, `parameter`, " + "`functional_group_id`) " + " VALUES (?, ?, ?, ?)"; + +const std::string kInsertApplication = + "INSERT OR IGNORE INTO `application` (`id`, `priority_value`, " + "`is_revoked`, `memory_kb`," + " `heart_beat_timeout_ms`) VALUES (?,?,?,?,?)"; + +const std::string kInsertAppGroup = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`)" + " SELECT ?, `id` FROM `functional_group` WHERE `name` = ? LIMIT 1"; + +const std::string kInsertNickname = + "INSERT OR IGNORE INTO `nickname` (`application_id`, `name`) VALUES (?, ?)"; + +const std::string kInsertAppType = + "INSERT OR IGNORE INTO `app_type` (`application_id`, `name`) VALUES (?, ?)"; + +const std::string kInsertRequestType = + "INSERT OR IGNORE INTO `request_type` (`application_id`, `request_type`) " + "VALUES (?, ?)"; + +const std::string kUpdateVersion = "UPDATE `version` SET `number`= ?"; + +const std::string kInsertMessageType = + "INSERT OR IGNORE INTO `message_type` (`name`) VALUES (?)"; + +const std::string kInsertLanguage = + "INSERT OR IGNORE INTO `language` (`code`) VALUES (?)"; + +const std::string kInsertMessageString = + "INSERT INTO `message` (`tts`, `label`, `line1`, `line2`, `language_code`, " + " `message_type_name`, `textBody`) VALUES (?, ?, ?, ?, ?, ?, ?)"; + +const std::string kUpdateModuleConfig = + "UPDATE `module_config` SET `preloaded_pt` = ?, " + " `exchange_after_x_ignition_cycles` = ?," + " `exchange_after_x_kilometers` = ?, `exchange_after_x_days` = ?, " + " `timeout_after_x_seconds` = ?, `vehicle_make` = ?, " + " `vehicle_model` = ?, `vehicle_year` = ?, `preloaded_date` = ?, " + "`certificate` = ?"; + +const std::string kInsertEndpoint = + "INSERT INTO `endpoint` (`service`, `url`, `application_id`) " + " VALUES (?, ?, ?)"; + +const std::string kInsertSecondsBetweenRetry = + "INSERT INTO `seconds_between_retry` (`index`, `value`) VALUES (?, ?)"; + +const std::string kInsertNotificationsByPriority = + "INSERT OR REPLACE INTO `notifications_by_priority` (`priority_value`, " + "`value`) " + " VALUES (?, ?)"; + +const std::string kInsertDeviceData = + "INSERT OR IGNORE INTO `device` (`id`) VALUES (?)"; + +const std::string kInsertAppLevel = + "INSERT INTO `app_level` (`application_id`, `minutes_in_hmi_full`," + "`minutes_in_hmi_limited` ,`minutes_in_hmi_background`," + "`minutes_in_hmi_none`,`count_of_user_selections`," + "`count_of_rejections_sync_out_of_memory`," + "`count_of_rejections_nickname_mismatch`," + "`count_of_rejections_duplicate_name`,`count_of_rejected_rpcs_calls`," + "`count_of_rpcs_sent_in_hmi_none`,`count_of_removals_for_bad_behavior`," + "`count_of_run_attempts_while_revoked`,`app_registration_language_gui`," + "`app_registration_language_vui`, `count_of_tls_errors`) " + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + +const std::string kDeleteSecondsBetweenRetries = + "DELETE FROM `seconds_between_retry`"; + +const std::string kDeleteEndpoint = "DELETE FROM `endpoint`"; + +const std::string kDeleteAppLevel = "DELETE FROM `app_level`"; + +const std::string kDeleteMessageString = "DELETE FROM `message`"; + +const std::string kDeleteFunctionalGroup = "DELETE FROM `functional_group`"; + +const std::string kDeleteRpc = "DELETE FROM `rpc`"; + +const std::string kDeleteAppGroup = "DELETE FROM `app_group`"; + +const std::string kSelectModuleConfig = + "SELECT `preloaded_pt`, `exchange_after_x_ignition_cycles`, " + " `exchange_after_x_kilometers`, `exchange_after_x_days`, " + " `timeout_after_x_seconds`, `vehicle_make`," + " `vehicle_model`, `vehicle_year`, `preloaded_date`, `certificate` " + " FROM `module_config`"; + +const std::string kSelectEndpoints = + "SELECT `url`, `service`, `application_id` FROM `endpoint` "; + +const std::string kSelectNotificationsPerMin = + "SELECT `priority_value`, `value` FROM notifications_by_priority"; + +const std::string kSelectNotificationsPerPriority = + "SELECT `value` FROM notifications_by_priority WHERE `priority_value` = ? "; + +const std::string kSelectAppLevels = "SELECT `application_id` FROM `app_level`"; + +const std::string kSelectDeviceData = "SELECT * FROM `device`"; + +const std::string kSelectFunctionalGroups = + "SELECT `id`,`name`, `user_consent_prompt` " + "FROM `functional_group`"; + +const std::string kSelectAllRpcs = + "SELECT `name`, `hmi_level_value`, `parameter` " + "FROM `rpc` WHERE `functional_group_id` = ? "; + +const std::string kSelectUserMsgsVersion = + "SELECT DISTINCT `number` FROM `version`"; + +const std::string kSelectAppPolicies = + "SELECT `id`, `priority_value`, `memory_kb`, " + " `heart_beat_timeout_ms` FROM `application`"; + +const std::string kSelectAppGroups = + "SELECT `f`.`name` FROM `app_group` AS `a`" + " LEFT JOIN `functional_group` AS `f` " + " ON (`f`.`id` = `a`.`functional_group_id`)" + " WHERE `a`.`application_id` = ?"; + +const std::string kSelectNicknames = + "SELECT DISTINCT `name` FROM `nickname` " + "WHERE `application_id` = ?"; + +const std::string kSelectAppTypes = + "SELECT DISTINCT `name` FROM `app_type` " + "WHERE `application_id` = ?"; + +const std::string kSelectRequestTypes = + "SELECT DISTINCT `request_type` FROM `request_type` WHERE `application_id` " + "= ?"; + +const std::string kSelectSecondsBetweenRetries = + "SELECT `value` FROM `seconds_between_retry` ORDER BY `index`"; + +const std::string kSelectIgnitionCycles = + "SELECT `c`.`exchange_after_x_ignition_cycles`, " + " `m`.`ignition_cycles_since_last_exchange` " + " FROM `module_config` AS `c`, `module_meta` AS `m` " + "LIMIT 1"; + +const std::string kSelectKilometers = + "SELECT `c`.`exchange_after_x_kilometers`, " + " `m`.`pt_exchanged_at_odometer_x` " + " FROM `module_config` AS `c`, `module_meta` AS `m` " + "LIMIT 1"; + +const std::string kSelectDays = + "SELECT `c`.`exchange_after_x_days`, " + " `m`.`pt_exchanged_x_days_after_epoch` " + " FROM `module_config` AS `c`, `module_meta` AS `m` " + "LIMIT 1"; + +const std::string kIncrementIgnitionCycles = + "UPDATE `module_meta` SET `ignition_cycles_since_last_exchange` = 1 + " + " `ignition_cycles_since_last_exchange`"; + +const std::string kResetIgnitionCycles = + "UPDATE `module_meta` SET `ignition_cycles_since_last_exchange` = 0"; + +const std::string kSelectTimeoutResponse = + "SELECT `timeout_after_x_seconds` FROM `module_config` LIMIT 1"; + +const std::string kUpdateFlagUpdateRequired = + "UPDATE `module_meta` SET `flag_update_required` = ?"; + +const std::string kSelectFlagUpdateRequired = + "SELECT `flag_update_required` FROM `module_meta` LIMIT 1"; + +const std::string kUpdateCountersSuccessfulUpdate = + "UPDATE `module_meta` SET `pt_exchanged_at_odometer_x` = ?," + "`pt_exchanged_x_days_after_epoch` = ?"; + +const std::string kDeleteApplication = "DELETE FROM `application`"; + +const std::string kDeleteRequestType = "DELETE FROM `request_type`"; + +const std::string kSelectApplicationRevoked = + "SELECT `is_revoked` FROM `application` WHERE `id` = ?"; + +const std::string kUpdateApplicationCustomData = + "UPDATE `application` SET `is_revoked` = ?, `is_default` = ?," + "`is_predata` = ? WHERE `id` = ?"; + +const std::string kSelectApplicationRepresented = + "SELECT COUNT(`id`) FROM `application` WHERE `id` = ?"; + +const std::string kSelectApplicationIsDefault = + "SELECT `is_default` FROM `application` WHERE `id` = ?"; + +const std::string kUpdateIsDefault = + "UPDATE `application` SET `is_default` = ? WHERE `id` = ?"; + +const std::string kDeleteDevice = "DELETE FROM `device` WHERE `id` = ?"; + +const std::string kDeleteAppGroupByApplicationId = + "DELETE FROM `app_group` WHERE `application_id` = ?"; + +const std::string kInsertApplicationFull = + "INSERT OR IGNORE INTO `application` (`id`, `keep_context`, `steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, " + " `memory_kb`, `heart_beat_timeout_ms`) " + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + +const std::string kSelectApplicationFull = + "SELECT `keep_context`, `steal_focus`, `default_hmi`, `priority_value`, " + " `is_revoked`, `is_default`, `is_predata`, `memory_kb`," + " `heart_beat_timeout_ms` FROM `application` WHERE `id` = ?"; + +const std::string kSelectDBVersion = + "SELECT `db_version_hash` from `_internal_data`"; + +const std::string kUpdateDBVersion = + "UPDATE `_internal_data` SET `db_version_hash` = ? "; + +} // namespace sql_pt +} // namespace policy diff --git a/src/components/policy/policy_external/src/sql_pt_representation.cc b/src/components/policy/policy_external/src/sql_pt_representation.cc new file mode 100644 index 0000000000..1e02685805 --- /dev/null +++ b/src/components/policy/policy_external/src/sql_pt_representation.cc @@ -0,0 +1,1744 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sstream> +#include <stdlib.h> +#include <stdint.h> +#include <errno.h> +#include <unistd.h> + +#include "utils/logger.h" +#include "utils/date_time.h" +#include "utils/sqlite_wrapper/sql_database.h" +#include "utils/file_system.h" +#include "utils/gen_hash.h" +#include "policy/sql_pt_representation.h" +#include "policy/sql_wrapper.h" +#include "policy/sql_pt_queries.h" +#include "policy/policy_helper.h" +#include "policy/cache_manager.h" +#include "config_profile/profile.h" + +namespace policy { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +namespace { +template <typename T, typename K> +void InsertUnique(K value, T* array) { + uint32_t i = 0; + for (; i < array->size() && array->at(i) != value; ++i) { + continue; + } + if (array->size() == i) { + array->push_back(value); + } +} + +#ifdef CUSTOMER_PASA +const char* kDatabaseName = "policy.db"; +#else // CUSTOMER_PASA +const char* kDatabaseName = "policy"; +#endif // CUSTOMER_PASA +} // namespace + +SQLPTRepresentation::SQLPTRepresentation() + : db_(new utils::dbms::SQLDatabase(kDatabaseName)) { + is_in_memory = false; +} + +SQLPTRepresentation::SQLPTRepresentation(bool in_memory) { + is_in_memory = in_memory; +#ifdef __QNX__ + db_ = new utils::dbms::SQLDatabase(kDatabaseName); +#else // __QNX__ + if (in_memory) { + db_ = new utils::dbms::SQLDatabase(); + } else { + db_ = new utils::dbms::SQLDatabase(kDatabaseName); + } +#endif // __QNX__ +} + +SQLPTRepresentation::~SQLPTRepresentation() { + db_->Close(); + delete db_; +} + +std::string SQLPTRepresentation::GetLockScreenIconUrl() const { + utils::dbms::SQLQuery query(db()); + std::string ret; + if (query.Prepare(sql_pt::kSelectLockScreenIcon)) { + query.Bind(0, std::string("lock_screen_icon_url")); + query.Bind(1, std::string("default")); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect select from notifications by priority."); + return ret; + } + + if (!query.IsNull(0)) { + ret = query.GetString(0); + } + + } else { + LOG4CXX_WARN(logger_, "Invalid select endpoints statement."); + } + return ret; +} + +void SQLPTRepresentation::CheckPermissions(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result) { + utils::dbms::SQLQuery query(db()); + + if (!query.Prepare(sql_pt::kSelectRpc)) { + LOG4CXX_WARN(logger_, + "Incorrect select statement from rpcs" + << query.LastError().text()); + return; + } + query.Bind(0, app_id); + query.Bind(1, hmi_level); + query.Bind(2, rpc); + + bool ret = query.Next(); + result.hmi_level_permitted = ret ? kRpcAllowed : kRpcDisallowed; + LOG4CXX_INFO(logger_, + "Level is " << (result.hmi_level_permitted == kRpcAllowed + ? "permitted" + : "not permitted")); + std::string parameter; + while (ret) { + if (!query.IsNull(0)) { + parameter = query.GetString(0); + result.list_of_allowed_params.insert(parameter); + } + ret = query.Next(); + } +} + +bool SQLPTRepresentation::IsPTPreloaded() { + utils::dbms::SQLQuery query(db()); + return query.Prepare(sql_pt::kSelectPreloaded) && query.Next(); +} + +int SQLPTRepresentation::IgnitionCyclesBeforeExchange() { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectIgnitionCycles) || !query.Exec()) { + LOG4CXX_WARN(logger_, "Can not select ignition cycles"); + return 0; + } + int limit = query.GetInteger(0); + int current = query.GetInteger(1); + + if (limit < 0 || current < 0 || current > limit) { + return 0; + } + + return limit - current; +} + +int SQLPTRepresentation::KilometersBeforeExchange(int current) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectKilometers) || !query.Exec()) { + LOG4CXX_WARN(logger_, "Can not select kilometers"); + return 0; + } + int limit = query.GetInteger(0); + int last = query.GetInteger(1); + + if (limit < 0 || last < 0 || current < 0 || current < last || + limit < (current - last)) { + return 0; + } + + return limit - (current - last); +} + +bool SQLPTRepresentation::SetCountersPassedForSuccessfulUpdate( + int kilometers, int days_after_epoch) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdateCountersSuccessfulUpdate)) { + LOG4CXX_WARN(logger_, + "Wrong update query for counters on successful update."); + return false; + } + query.Bind(0, kilometers); + query.Bind(1, days_after_epoch); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed to update counters on successful update."); + return false; + } + return true; +} + +int SQLPTRepresentation::DaysBeforeExchange(uint16_t current) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectDays) || !query.Exec()) { + LOG4CXX_WARN(logger_, "Can not select days"); + return 0; + } + int limit = query.GetInteger(0); + int last = query.GetInteger(1); + + if (0 == last) { + return limit; + } + + if (limit < 0 || last < 0 || current < 0 || current < last || + limit < (current - last)) { + return 0; + } + + return limit - (current - last); +} + +int SQLPTRepresentation::TimeoutResponse() { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectTimeoutResponse) || !query.Exec()) { + LOG4CXX_INFO(logger_, "Can not select timeout response for retry sequence"); + const int defaultTimeout = 30 * date_time::DateTime::MILLISECONDS_IN_SECOND; + return defaultTimeout; + } + return query.GetInteger(0) * date_time::DateTime::MILLISECONDS_IN_SECOND; +} + +bool SQLPTRepresentation::SecondsBetweenRetries(std::vector<int>* seconds) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectSecondsBetweenRetries)) { + LOG4CXX_INFO(logger_, + "Incorrect select statement from seconds between retries"); + return false; + } + while (query.Next()) { + seconds->push_back(query.GetInteger(0)); + } + return true; +} + +std::vector<UserFriendlyMessage> SQLPTRepresentation::GetUserFriendlyMsg( + const std::vector<std::string>& msg_codes, const std::string& language) { + std::vector<UserFriendlyMessage> result; + std::vector<std::string>::const_iterator it = msg_codes.begin(); + std::vector<std::string>::const_iterator it_end = msg_codes.end(); + for (; it != it_end; ++it) { + UserFriendlyMessage msg; + msg.message_code = *it; + result.push_back(msg); + } + return result; +} + +EndpointUrls SQLPTRepresentation::GetUpdateUrls(int service_type) { + LOG4CXX_INFO(logger_, + "SQLPTRepresentation::GetUpdateUrls for " << service_type); + utils::dbms::SQLQuery query(db()); + EndpointUrls ret; + if (query.Prepare(sql_pt::kSelectEndpoint)) { + query.Bind(0, service_type); + while (query.Next()) { + EndpointData data; + + data.url.push_back(query.GetString(0)); + if (!query.IsNull(1)) { + data.app_id = query.GetString(1); + } + ret.push_back(data); + } + } else { + LOG4CXX_WARN(logger_, "Invalid select endpoints statement."); + } + return ret; +} + +int SQLPTRepresentation::GetNotificationsNumber(const std::string& priority) { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectNotificationsPerPriority)) { + LOG4CXX_WARN(logger_, + "Incorrect select statement for priority " + "notification number."); + return 0; + } + query.Bind(0, priority); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect select from notifications by priority."); + return 0; + } + + if (!query.IsNull(0)) { + return query.GetInteger(0); + } + + return 0; +} + +bool SQLPTRepresentation::GetPriority(const std::string& policy_app_id, + std::string* priority) { + LOG4CXX_AUTO_TRACE(logger_); + if (NULL == priority) { + LOG4CXX_WARN(logger_, "Input priority parameter is null."); + return false; + } + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectPriority)) { + LOG4CXX_INFO(logger_, "Incorrect statement for priority."); + return false; + } + + query.Bind(0, policy_app_id); + + if (!query.Exec()) { + LOG4CXX_INFO(logger_, "Error during select priority."); + return false; + } + + if (query.IsNull(0)) { + priority->clear(); + return true; + } + + priority->assign(query.GetString(0)); + + return true; +} + +InitResult SQLPTRepresentation::Init(const PolicySettings* settings) { + settings_ = settings; + LOG4CXX_AUTO_TRACE(logger_); +#ifdef BUILD_TESTS + open_counter_ = 0; +#endif // BUILD_TESTS +#ifndef __QNX__ + if (!is_in_memory) { + const std::string& path = get_settings().app_storage_folder(); + if (!path.empty()) { + db_->set_path(path + "/"); + } + } +#endif // __QNX__ + if (!db_->Open()) { + LOG4CXX_ERROR(logger_, "Failed opening database."); + LOG4CXX_INFO(logger_, "Starting opening retries."); + const uint16_t attempts = get_settings().attempts_to_open_policy_db(); + LOG4CXX_DEBUG(logger_, "Total attempts number is: " << attempts); + bool is_opened = false; + const uint16_t open_attempt_timeout_ms = + get_settings().open_attempt_timeout_ms(); + const useconds_t sleep_interval_mcsec = open_attempt_timeout_ms * 1000; + LOG4CXX_DEBUG(logger_, + "Open attempt timeout(ms) is: " << open_attempt_timeout_ms); + for (int i = 0; i < attempts; ++i) { + usleep(sleep_interval_mcsec); + LOG4CXX_INFO(logger_, "Attempt: " << i + 1); +#ifdef BUILD_TESTS + ++open_counter_; +#endif // BUILD_TESTS + if (db_->Open()) { + LOG4CXX_INFO(logger_, "Database opened."); + is_opened = true; + break; + } + } + if (!is_opened) { + LOG4CXX_ERROR(logger_, + "Open retry sequence failed. Tried " + << attempts << " attempts with " + << open_attempt_timeout_ms + << " open timeout(ms) for each."); + return InitResult::FAIL; + } + } +#ifndef __QNX__ + if (!db_->IsReadWrite()) { + LOG4CXX_ERROR(logger_, "There are no read/write permissions for database"); + return InitResult::FAIL; + } + +#endif // __QNX__ + utils::dbms::SQLQuery check_pages(db()); + if (!check_pages.Prepare(sql_pt::kCheckPgNumber) || !check_pages.Next()) { + LOG4CXX_WARN(logger_, "Incorrect pragma for page counting."); + } else { + if (0 < check_pages.GetInteger(0)) { + utils::dbms::SQLQuery db_check(db()); + if (!db_check.Prepare(sql_pt::kCheckDBIntegrity)) { + LOG4CXX_WARN(logger_, "Incorrect pragma for integrity check."); + } else { + while (db_check.Next()) { + if (db_check.GetString(0).compare("ok") == 0) { + utils::dbms::SQLQuery check_first_run(db()); + if (check_first_run.Prepare(sql_pt::kIsFirstRun) && + check_first_run.Next()) { + LOG4CXX_INFO(logger_, + "Selecting is first run " + << check_first_run.GetBoolean(0)); + if (check_first_run.GetBoolean(0)) { + utils::dbms::SQLQuery set_not_first_run(db()); + set_not_first_run.Exec(sql_pt::kSetNotFirstRun); + return InitResult::SUCCESS; + } + } else { + LOG4CXX_WARN(logger_, "Incorrect select is first run"); + } + return InitResult::EXISTS; + } else { + LOG4CXX_ERROR(logger_, + "Existing policy table representation is invlaid."); + // TODO(PV): add handle + return InitResult::FAIL; + } + } + } + } + } + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kCreateSchema)) { + LOG4CXX_ERROR( + logger_, + "Failed creating schema of database: " << query.LastError().text()); + return InitResult::FAIL; + } + if (!query.Exec(sql_pt::kInsertInitData)) { + LOG4CXX_ERROR( + logger_, + "Failed insert init data to database: " << query.LastError().text()); + return InitResult::FAIL; + } + return InitResult::SUCCESS; +} + +bool SQLPTRepresentation::Close() { + db_->Close(); + return db_->LastError().number() == utils::dbms::OK; +} + +const VehicleInfo SQLPTRepresentation::GetVehicleInfo() const { + policy_table::ModuleConfig module_config; + GatherModuleConfig(&module_config); + VehicleInfo vehicle_info; + vehicle_info.vehicle_make = *module_config.vehicle_make; + vehicle_info.vehicle_model = *module_config.vehicle_model; + vehicle_info.vehicle_year = *module_config.vehicle_year; + return vehicle_info; +} + +bool SQLPTRepresentation::Drop() { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDropSchema)) { + LOG4CXX_WARN(logger_, + "Failed dropping database: " << query.LastError().text()); + return false; + } + return true; +} + +void SQLPTRepresentation::WriteDb() { + db_->Backup(); +} + +bool SQLPTRepresentation::Clear() { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteData)) { + LOG4CXX_ERROR(logger_, + "Failed clearing database: " << query.LastError().text()); + return false; + } + if (!query.Exec(sql_pt::kInsertInitData)) { + LOG4CXX_ERROR( + logger_, + "Failed insert init data to database: " << query.LastError().text()); + return false; + } + return true; +} + +bool SQLPTRepresentation::RefreshDB() { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDropSchema)) { + LOG4CXX_WARN(logger_, + "Failed dropping database: " << query.LastError().text()); + return false; + } + if (!query.Exec(sql_pt::kCreateSchema)) { + LOG4CXX_ERROR( + logger_, + "Failed creating schema of database: " << query.LastError().text()); + return false; + } + if (!query.Exec(sql_pt::kInsertInitData)) { + LOG4CXX_ERROR( + logger_, + "Failed insert init data to database: " << query.LastError().text()); + return false; + } + return true; +} + +utils::SharedPtr<policy_table::Table> SQLPTRepresentation::GenerateSnapshot() + const { + LOG4CXX_AUTO_TRACE(logger_); + utils::SharedPtr<policy_table::Table> table = new policy_table::Table(); + GatherModuleMeta(&*table->policy_table.module_meta); + GatherModuleConfig(&table->policy_table.module_config); + GatherUsageAndErrorCounts(&*table->policy_table.usage_and_error_counts); + GatherDeviceData(&*table->policy_table.device_data); + GatherFunctionalGroupings(&table->policy_table.functional_groupings); + GatherConsumerFriendlyMessages( + &*table->policy_table.consumer_friendly_messages); + GatherApplicationPoliciesSection(&table->policy_table.app_policies_section); + return table; +} + +void SQLPTRepresentation::GatherModuleMeta( + policy_table::ModuleMeta* meta) const { + LOG4CXX_INFO(logger_, "Gather Module Meta Info"); + meta->mark_initialized(); + // Section Module Meta is empty for SDL specific +} + +void SQLPTRepresentation::GatherModuleConfig( + policy_table::ModuleConfig* config) const { + LOG4CXX_INFO(logger_, "Gather Configuration Info"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectModuleConfig) || !query.Next()) { + LOG4CXX_WARN(logger_, "Incorrect select statement for module config"); + } else { + *config->preloaded_pt = query.GetBoolean(0); + config->exchange_after_x_ignition_cycles = query.GetInteger(1); + config->exchange_after_x_kilometers = query.GetInteger(2); + config->exchange_after_x_days = query.GetInteger(3); + config->timeout_after_x_seconds = query.GetInteger(4); + *config->vehicle_make = query.GetString(5); + *config->vehicle_model = query.GetString(6); + *config->vehicle_year = query.GetString(7); + *config->preloaded_date = query.GetString(8); + *config->certificate = query.GetString(9); + } + + utils::dbms::SQLQuery endpoints(db()); + if (!endpoints.Prepare(sql_pt::kSelectEndpoints)) { + LOG4CXX_WARN(logger_, "Incorrect select statement for endpoints"); + } else { + while (endpoints.Next()) { + std::stringstream stream; + stream << "0x0" << endpoints.GetInteger(1); + config->endpoints[stream.str()][endpoints.GetString(2)].push_back( + endpoints.GetString(0)); + } + } + + utils::dbms::SQLQuery notifications(db()); + if (!notifications.Prepare(sql_pt::kSelectNotificationsPerMin)) { + LOG4CXX_WARN(logger_, "Incorrect select statement for notifications"); + } else { + while (notifications.Next()) { + config->notifications_per_minute_by_priority[notifications.GetString(0)] = + notifications.GetInteger(1); + } + } + utils::dbms::SQLQuery seconds(db()); + if (!seconds.Prepare(sql_pt::kSelectSecondsBetweenRetries)) { + LOG4CXX_INFO(logger_, + "Incorrect select statement from seconds between retries"); + } else { + while (seconds.Next()) { + config->seconds_between_retries.push_back(seconds.GetInteger(0)); + } + } +} + +bool SQLPTRepresentation::GatherUsageAndErrorCounts( + policy_table::UsageAndErrorCounts* counts) const { + LOG4CXX_INFO(logger_, "Gather Usage and Error Counts."); + utils::dbms::SQLQuery query(db()); + if (query.Prepare(sql_pt::kSelectAppLevels)) { + policy_table::AppLevel app_level_empty; + app_level_empty.mark_initialized(); + while (query.Next()) { + (*counts->app_level)[query.GetString(0)] = app_level_empty; + } + } + return true; +} + +void SQLPTRepresentation::GatherDeviceData( + policy_table::DeviceData* data) const { + LOG4CXX_INFO(logger_, "Gather device data."); + data->mark_initialized(); + + utils::dbms::SQLQuery query(db()); + if (query.Prepare(sql_pt::kSelectDeviceData)) { + policy_table::DeviceParams device_data_empty; + device_data_empty.mark_initialized(); + while (query.Next()) { + (*data)[query.GetString(0)] = device_data_empty; + } + } +} + +bool SQLPTRepresentation::GatherFunctionalGroupings( + policy_table::FunctionalGroupings* groups) const { + LOG4CXX_INFO(logger_, "Gather Functional Groupings info"); + utils::dbms::SQLQuery func_group(db()); + if (!func_group.Prepare(sql_pt::kSelectFunctionalGroups)) { + LOG4CXX_WARN(logger_, "Incorrect select from functional_groupings"); + return false; + } + utils::dbms::SQLQuery rpcs(db()); + if (!rpcs.Prepare(sql_pt::kSelectAllRpcs)) { + LOG4CXX_WARN(logger_, "Incorrect select all from rpc"); + return false; + } + + while (func_group.Next()) { + policy_table::Rpcs rpcs_tbl; + if (!func_group.IsNull(2)) { + *rpcs_tbl.user_consent_prompt = func_group.GetString(2); + } + int func_id = func_group.GetInteger(0); + rpcs.Bind(0, func_id); + while (rpcs.Next()) { + if (!rpcs.IsNull(1)) { + policy_table::HmiLevel level; + if (policy_table::EnumFromJsonString(rpcs.GetString(1), &level)) { + InsertUnique(level, &rpcs_tbl.rpcs[rpcs.GetString(0)].hmi_levels); + } + } + if (!rpcs.IsNull(2)) { + policy_table::Parameter param; + if (policy_table::EnumFromJsonString(rpcs.GetString(2), ¶m)) { + // EMPTY is a special mark to specify that 'parameters' section is + // present, but has no parameters. It is not valid parameter value. + if (policy_table::P_EMPTY == param) { + (*rpcs_tbl.rpcs[rpcs.GetString(0)].parameters).mark_initialized(); + continue; + } + InsertUnique(param, &(*rpcs_tbl.rpcs[rpcs.GetString(0)].parameters)); + } + } + } + if (!rpcs_tbl.rpcs.is_initialized()) { + rpcs_tbl.rpcs.set_to_null(); + } + rpcs.Reset(); + (*groups)[func_group.GetString(1)] = rpcs_tbl; + } + return true; +} + +bool SQLPTRepresentation::GatherConsumerFriendlyMessages( + policy_table::ConsumerFriendlyMessages* messages) const { + LOG4CXX_INFO(logger_, "Gather Consumer Friendly Messages"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectUserMsgsVersion) || !query.Next()) { + LOG4CXX_WARN(logger_, "Incorrect select from consumer_friendly_messages"); + return false; + } + messages->version = query.GetString(0); + return true; +} + +bool SQLPTRepresentation::GatherApplicationPoliciesSection( + policy_table::ApplicationPoliciesSection* policies) const { + LOG4CXX_INFO(logger_, "Gather applications policies"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectAppPolicies)) { + LOG4CXX_WARN(logger_, "Incorrect select from app_policies"); + return false; + } + + while (query.Next()) { + rpc::Nullable<policy_table::ApplicationParams> params; + const std::string& app_id = query.GetString(0); + if (IsApplicationRevoked(app_id)) { + params.set_to_null(); + (*policies).apps[app_id] = params; + continue; + } + if (IsDefaultPolicy(app_id)) { + (*policies).apps[app_id].set_to_string(kDefaultId); + } + if (IsPredataPolicy(app_id)) { + (*policies).apps[app_id].set_to_string(kPreDataConsentId); + } + if (kDeviceId == app_id) { + // Priority is only SDL-specific item for device + policy_table::Priority priority; + policy_table::EnumFromJsonString(query.GetString(1), &priority); + (*policies).device.priority = priority; + continue; + } + policy_table::Priority priority; + policy_table::EnumFromJsonString(query.GetString(1), &priority); + params.priority = priority; + + *params.memory_kb = query.GetInteger(2); + *params.heart_beat_timeout_ms = query.GetUInteger(3); + + if (!GatherAppGroup(app_id, ¶ms.groups)) { + return false; + } + if (!GatherNickName(app_id, &*params.nicknames)) { + return false; + } + if (!GatherAppType(app_id, &*params.AppHMIType)) { + return false; + } + if (!GatherRequestType(app_id, &*params.RequestType)) { + return false; + } + + (*policies).apps[app_id] = params; + } + return true; +} + +bool SQLPTRepresentation::Save(const policy_table::Table& table) { + LOG4CXX_AUTO_TRACE(logger_); + db_->BeginTransaction(); + if (!SaveFunctionalGroupings(table.policy_table.functional_groupings)) { + db_->RollbackTransaction(); + return false; + } + if (!SaveApplicationPoliciesSection( + table.policy_table.app_policies_section)) { + db_->RollbackTransaction(); + return false; + } + if (!SaveModuleConfig(table.policy_table.module_config)) { + db_->RollbackTransaction(); + return false; + } + if (!SaveConsumerFriendlyMessages( + *table.policy_table.consumer_friendly_messages)) { + db_->RollbackTransaction(); + return false; + } + + if (!SaveDeviceData(*table.policy_table.device_data)) { + db_->RollbackTransaction(); + return false; + } + if (!SaveUsageAndErrorCounts(*table.policy_table.usage_and_error_counts)) { + db_->RollbackTransaction(); + return false; + } + if (!SaveModuleMeta(*table.policy_table.module_meta)) { + db_->RollbackTransaction(); + return false; + } + db_->CommitTransaction(); + return true; +} + +bool SQLPTRepresentation::SaveFunctionalGroupings( + const policy_table::FunctionalGroupings& groups) { + utils::dbms::SQLQuery query_delete(db()); + if (!query_delete.Exec(sql_pt::kDeleteRpc)) { + LOG4CXX_WARN(logger_, "Incorrect delete from rpc."); + return false; + } + + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteFunctionalGroup)) { + LOG4CXX_WARN(logger_, "Incorrect delete from seconds between retries."); + return false; + } + if (!query.Prepare(sql_pt::kInsertFunctionalGroup)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for functional groups"); + return false; + } + + policy_table::FunctionalGroupings::const_iterator it; + + for (it = groups.begin(); it != groups.end(); ++it) { + // Since we uses this id in other tables, we have to be sure + // that id for certain group will be same in case when + // we drop records from the table and add them again. + // That's why we use hash as a primary key insted of + // simple auto incremental index. + const long int id = abs(utils::Djb2HashFromString(it->first)); + // SQLite's Bind doesn support 'long' type + // So we need to explicitly cast it to int64_t + // to avoid ambiguity. + query.Bind(0, static_cast<int64_t>(id)); + query.Bind(1, it->first); + it->second.user_consent_prompt.is_initialized() + ? query.Bind(2, *(it->second.user_consent_prompt)) + : query.Bind(2); + + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into functional groups"); + return false; + } + + if (!SaveRpcs(query.LastInsertId(), it->second.rpcs)) { + return false; + } + } + return true; +} + +bool SQLPTRepresentation::SaveRpcs(int64_t group_id, + const policy_table::Rpc& rpcs) { + utils::dbms::SQLQuery query(db()); + utils::dbms::SQLQuery query_parameter(db()); + if (!query.Prepare(sql_pt::kInsertRpc) || + !query_parameter.Prepare(sql_pt::kInsertRpcWithParameter)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for rpc"); + return false; + } + + policy_table::Rpc::const_iterator it; + for (it = rpcs.begin(); it != rpcs.end(); ++it) { + const policy_table::HmiLevels& hmi_levels = it->second.hmi_levels; + // TODO(IKozyrenko): Check logic if optional container is missing + const policy_table::Parameters& parameters = *it->second.parameters; + policy_table::HmiLevels::const_iterator hmi_it; + policy_table::Parameters::const_iterator ps_it; + for (hmi_it = hmi_levels.begin(); hmi_it != hmi_levels.end(); ++hmi_it) { + if (!parameters.empty()) { + for (ps_it = parameters.begin(); ps_it != parameters.end(); ++ps_it) { + query_parameter.Bind(0, it->first); + query_parameter.Bind( + 1, std::string(policy_table::EnumToJsonString(*hmi_it))); + query_parameter.Bind( + 2, std::string(policy_table::EnumToJsonString(*ps_it))); + query_parameter.Bind(3, group_id); + if (!query_parameter.Exec() || !query_parameter.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into rpc with parameter"); + return false; + } + } + } else if (parameters.is_initialized()) { + query_parameter.Bind(0, it->first); + query_parameter.Bind( + 1, std::string(policy_table::EnumToJsonString(*hmi_it))); + query_parameter.Bind( + 2, + std::string(policy_table::EnumToJsonString(policy_table::P_EMPTY))); + query_parameter.Bind(3, group_id); + if (!query_parameter.Exec() || !query_parameter.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into rpc with parameter"); + return false; + } + } else { + query.Bind(0, it->first); + query.Bind(1, std::string(policy_table::EnumToJsonString(*hmi_it))); + query.Bind(2, group_id); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into rpc"); + return false; + } + } + } + } + + return true; +} + +bool SQLPTRepresentation::SaveApplicationPoliciesSection( + const policy_table::ApplicationPoliciesSection& policies) { + utils::dbms::SQLQuery query_delete(db()); + if (!query_delete.Exec(sql_pt::kDeleteAppGroup)) { + LOG4CXX_WARN(logger_, "Incorrect delete from app_group."); + return false; + } + if (!query_delete.Exec(sql_pt::kDeleteApplication)) { + LOG4CXX_WARN(logger_, "Incorrect delete from application."); + return false; + } + + if (!query_delete.Exec(sql_pt::kDeleteRequestType)) { + LOG4CXX_WARN(logger_, "Incorrect delete from request type."); + return false; + } + + // All predefined apps (e.g. default, pre_DataConsent) should be saved first, + // otherwise another app with the predefined permissions can get incorrect + // permissions + policy_table::ApplicationPolicies::const_iterator it_default = + policies.apps.find(kDefaultId); + if (policies.apps.end() != it_default) { + if (!SaveSpecificAppPolicy(*it_default)) { + return false; + } + } + policy_table::ApplicationPolicies::const_iterator it_pre_data_consented = + policies.apps.find(kPreDataConsentId); + if (policies.apps.end() != it_pre_data_consented) { + if (!SaveSpecificAppPolicy(*it_pre_data_consented)) { + return false; + } + } + + if (!SaveDevicePolicy(policies.device)) { + return false; + } + + policy_table::ApplicationPolicies::const_iterator it; + for (it = policies.apps.begin(); it != policies.apps.end(); ++it) { + // Skip saving of predefined app, since they should be saved before + if (IsPredefinedApp(*it)) { + continue; + } + if (!SaveSpecificAppPolicy(*it)) { + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveSpecificAppPolicy( + const policy_table::ApplicationPolicies::value_type& app) { + utils::dbms::SQLQuery app_query(db()); + if (!app_query.Prepare(sql_pt::kInsertApplication)) { + LOG4CXX_WARN(logger_, + "Incorrect insert statement into application (device)."); + return false; + } + + app_query.Bind(0, app.first); + app_query.Bind( + 1, std::string(policy_table::EnumToJsonString(app.second.priority))); + app_query.Bind(2, app.second.is_null()); + app_query.Bind(3, *app.second.memory_kb); + app_query.Bind(4, static_cast<int64_t>(*app.second.heart_beat_timeout_ms)); + + if (!app_query.Exec() || !app_query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into application."); + return false; + } + + if (app.second.is_string()) { + if (kDefaultId.compare(app.second.get_string()) == 0) { + if (!SetDefaultPolicy(app.first)) { + return false; + } + // Stop saving other params, since predefined permissions already set + return true; + } + } + + if (!SaveAppGroup(app.first, app.second.groups)) { + return false; + } + if (!SaveNickname(app.first, *app.second.nicknames)) { + return false; + } + if (!SaveAppType(app.first, *app.second.AppHMIType)) { + return false; + } + + if (!SaveRequestType(app.first, *app.second.RequestType)) { + return false; + } + + return true; +} + +bool policy::SQLPTRepresentation::SaveDevicePolicy( + const policy_table::DevicePolicy& device) { + utils::dbms::SQLQuery app_query(db()); + if (!app_query.Prepare(sql_pt::kInsertApplication)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement into application."); + return false; + } + + app_query.Bind(0, kDeviceId); + app_query.Bind(1, + std::string(policy_table::EnumToJsonString(device.priority))); + app_query.Bind(2, false); + app_query.Bind(3, 0); + app_query.Bind(4, 0); + app_query.Bind(5); + + if (!app_query.Exec() || !app_query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into application."); + return false; + } + + if (!SaveAppGroup(kDeviceId, device.groups)) { + return false; + } + + return true; +} + +bool SQLPTRepresentation::SaveAppGroup( + const std::string& app_id, const policy_table::Strings& app_groups) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertAppGroup)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for app group"); + return false; + } + LOG4CXX_INFO(logger_, "SaveAppGroup"); + policy_table::Strings::const_iterator it; + for (it = app_groups.begin(); it != app_groups.end(); ++it) { + std::string ssss = *it; + LOG4CXX_INFO(logger_, "Group: " << ssss); + query.Bind(0, app_id); + query.Bind(1, *it); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, + "Incorrect insert into app group." + << query.LastError().text()); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveNickname(const std::string& app_id, + const policy_table::Strings& nicknames) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertNickname)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for nickname"); + return false; + } + + policy_table::Strings::const_iterator it; + for (it = nicknames.begin(); it != nicknames.end(); ++it) { + query.Bind(0, app_id); + query.Bind(1, *it); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into nickname."); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveAppType(const std::string& app_id, + const policy_table::AppHMITypes& types) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertAppType)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for app type"); + return false; + } + + policy_table::AppHMITypes::const_iterator it; + for (it = types.begin(); it != types.end(); ++it) { + query.Bind(0, app_id); + query.Bind(1, std::string(policy_table::EnumToJsonString(*it))); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into app type."); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveRequestType( + const std::string& app_id, const policy_table::RequestTypes& types) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertRequestType)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for request types."); + return false; + } + + policy_table::RequestTypes::const_iterator it; + for (it = types.begin(); it != types.end(); ++it) { + query.Bind(0, app_id); + query.Bind(1, std::string(policy_table::EnumToJsonString(*it))); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into request types."); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveModuleMeta(const policy_table::ModuleMeta& meta) { + // Section Module Meta is empty for SDL specific + return true; +} + +bool SQLPTRepresentation::SaveModuleConfig( + const policy_table::ModuleConfig& config) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdateModuleConfig)) { + LOG4CXX_WARN(logger_, "Incorrect update statement for module config"); + return false; + } + + bool is_preloaded = + config.preloaded_pt.is_initialized() && *config.preloaded_pt; + + query.Bind(0, is_preloaded); + query.Bind(1, config.exchange_after_x_ignition_cycles); + query.Bind(2, config.exchange_after_x_kilometers); + query.Bind(3, config.exchange_after_x_days); + query.Bind(4, config.timeout_after_x_seconds); + config.vehicle_make.is_initialized() ? query.Bind(5, *(config.vehicle_make)) + : query.Bind(5); + config.vehicle_model.is_initialized() ? query.Bind(6, *(config.vehicle_model)) + : query.Bind(6); + config.vehicle_year.is_initialized() ? query.Bind(7, *(config.vehicle_year)) + : query.Bind(7); + config.preloaded_date.is_initialized() + ? query.Bind(8, *(config.preloaded_date)) + : query.Bind(8); + config.certificate.is_initialized() ? query.Bind(9, *(config.certificate)) + : query.Bind(9); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect update module config"); + return false; + } + + if (!SaveSecondsBetweenRetries(config.seconds_between_retries)) { + return false; + } + + if (!SaveNumberOfNotificationsPerMinute( + config.notifications_per_minute_by_priority)) { + return false; + } + + if (!SaveServiceEndpoints(config.endpoints)) { + return false; + } + + return true; +} + +bool SQLPTRepresentation::SaveServiceEndpoints( + const policy_table::ServiceEndpoints& endpoints) { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteEndpoint)) { + LOG4CXX_WARN(logger_, "Incorrect delete from endpoint."); + return false; + } + + if (!query.Prepare(sql_pt::kInsertEndpoint)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for endpoint"); + return false; + } + + policy_table::ServiceEndpoints::const_iterator it; + for (it = endpoints.begin(); it != endpoints.end(); ++it) { + const policy_table::URLList& apps = it->second; + policy_table::URLList::const_iterator app_it; + for (app_it = apps.begin(); app_it != apps.end(); ++app_it) { + const policy_table::URL& urls = app_it->second; + policy_table::URL::const_iterator url_it; + for (url_it = urls.begin(); url_it != urls.end(); ++url_it) { + std::stringstream temp_stream(it->first); + int service; + temp_stream.seekg(3); + temp_stream >> service; + query.Bind(0, service); + query.Bind(1, *url_it); + query.Bind(2, app_it->first); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into endpoint"); + return false; + } + } + } + } + + return true; +} + +bool SQLPTRepresentation::SaveConsumerFriendlyMessages( + const policy_table::ConsumerFriendlyMessages& messages) { + LOG4CXX_AUTO_TRACE(logger_); + + // According CRS-2419 If there is no “consumer_friendly_messages” key, + // the current local consumer_friendly_messages section shall be maintained in + // the policy table. So it won't be changed/updated + if (messages.messages.is_initialized()) { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteMessageString)) { + LOG4CXX_WARN(logger_, "Incorrect delete from message."); + return false; + } + + if (query.Prepare(sql_pt::kUpdateVersion)) { + query.Bind(0, messages.version); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect update into version."); + return false; + } + } else { + LOG4CXX_WARN(logger_, "Incorrect update statement for version."); + return false; + } + + policy_table::Messages::const_iterator it; + // TODO(IKozyrenko): Check logic if optional container is missing + for (it = messages.messages->begin(); it != messages.messages->end(); + ++it) { + if (!SaveMessageType(it->first)) { + return false; + } + const policy_table::Languages& langs = it->second.languages; + policy_table::Languages::const_iterator lang_it; + for (lang_it = langs.begin(); lang_it != langs.end(); ++lang_it) { + if (!SaveLanguage(lang_it->first)) { + return false; + } + if (!SaveMessageString(it->first, lang_it->first, lang_it->second)) { + return false; + } + } + } + } else { + LOG4CXX_INFO(logger_, "Messages list is empty"); + } + + return true; +} + +bool SQLPTRepresentation::SaveMessageType(const std::string& type) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertMessageType)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for message type."); + return false; + } + + query.Bind(0, type); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect insert into message type."); + return false; + } + + return true; +} + +bool SQLPTRepresentation::SaveLanguage(const std::string& code) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertLanguage)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for language."); + return false; + } + + query.Bind(0, code); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect insert into language."); + return false; + } + + return true; +} + +bool SQLPTRepresentation::SaveMessageString( + const std::string& type, + const std::string& lang, + const policy_table::MessageString& strings) { + // Section is empty for SDL specific + return true; +} + +bool SQLPTRepresentation::SaveSecondsBetweenRetries( + const policy_table::SecondsBetweenRetries& seconds) { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteSecondsBetweenRetries)) { + LOG4CXX_WARN(logger_, "Incorrect delete from seconds between retries."); + return false; + } + if (!query.Prepare(sql_pt::kInsertSecondsBetweenRetry)) { + LOG4CXX_WARN(logger_, + "Incorrect insert statement for seconds between retries."); + return false; + } + + for (uint32_t i = 0; i < seconds.size(); ++i) { + query.Bind(0, static_cast<int>(i)); + query.Bind(1, seconds[i]); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into seconds between retries."); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveNumberOfNotificationsPerMinute( + const policy_table::NumberOfNotificationsPerMinute& notifications) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertNotificationsByPriority)) { + LOG4CXX_WARN(logger_, + "Incorrect insert statement for notifications by priority."); + return false; + } + + policy_table::NumberOfNotificationsPerMinute::const_iterator it; + for (it = notifications.begin(); it != notifications.end(); ++it) { + query.Bind(0, it->first); + query.Bind(1, it->second); + if (!query.Exec() || !query.Reset()) { + LOG4CXX_WARN(logger_, "Incorrect insert into notifications by priority."); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveDeviceData( + const policy_table::DeviceData& devices) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertDeviceData)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for device data."); + return false; + } + + policy_table::DeviceData::const_iterator it; + for (it = devices.begin(); it != devices.end(); ++it) { + query.Bind(0, it->first); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect insert into device data."); + return false; + } + } + + return true; +} + +bool SQLPTRepresentation::SaveUsageAndErrorCounts( + const policy_table::UsageAndErrorCounts& counts) { + const_cast<policy_table::UsageAndErrorCounts&>(counts).mark_initialized(); + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kDeleteAppLevel)) { + LOG4CXX_WARN(logger_, "Incorrect delete from app level."); + return false; + } + if (!query.Prepare(sql_pt::kInsertAppLevel)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement for app level."); + return false; + } + + policy_table::AppLevels::const_iterator it; + const policy_table::AppLevels& app_levels = *counts.app_level; + const_cast<policy_table::AppLevels&>(*counts.app_level).mark_initialized(); + for (it = app_levels.begin(); it != app_levels.end(); ++it) { + query.Bind(0, it->first); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Incorrect insert into app level."); + return false; + } + } + return true; +} + +void SQLPTRepresentation::IncrementIgnitionCycles() { + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kIncrementIgnitionCycles)) { + LOG4CXX_WARN(logger_, "Failed incrementing ignition cycles"); + } +} + +void SQLPTRepresentation::ResetIgnitionCycles() { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Exec(sql_pt::kResetIgnitionCycles)) { + LOG4CXX_WARN(logger_, "Failed to reset ignition cycles number."); + } +} + +bool SQLPTRepresentation::UpdateRequired() const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectFlagUpdateRequired) || !query.Exec()) { + LOG4CXX_WARN(logger_, + "Failed select update required flag from module meta"); + return false; + } + return query.GetBoolean(0); +} + +void SQLPTRepresentation::SaveUpdateRequired(bool value) { + utils::dbms::SQLQuery query(db()); + // TODO(AOleynik): Quick fix, will be reworked + if (!query.Prepare(/*sql_pt::kUpdateFlagUpdateRequired*/ + "UPDATE `module_meta` SET `flag_update_required` = ?")) { + LOG4CXX_WARN(logger_, + "Incorrect update into module meta (update_required): " + << strerror(errno)); + return; + } + query.Bind(0, value); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed update module meta (update_required)"); + } +} + +bool SQLPTRepresentation::GetInitialAppData(const std::string& app_id, + StringArray* nicknames, + StringArray* app_types) { + LOG4CXX_INFO(logger_, "Getting initial application data."); + utils::dbms::SQLQuery app_names(db()); + if (!app_names.Prepare(sql_pt::kSelectNicknames)) { + LOG4CXX_WARN(logger_, "Incorrect select from app nicknames"); + return false; + } + utils::dbms::SQLQuery app_hmi_types(db()); + if (!app_hmi_types.Prepare(sql_pt::kSelectAppTypes)) { + LOG4CXX_WARN(logger_, "Incorrect select from app types"); + return false; + } + app_names.Bind(0, app_id); + while (app_names.Next()) { + nicknames->push_back(app_names.GetString(0)); + } + app_names.Reset(); + app_hmi_types.Bind(0, app_id); + while (app_hmi_types.Next()) { + app_types->push_back(app_hmi_types.GetString(0)); + } + app_hmi_types.Reset(); + return true; +} + +bool SQLPTRepresentation::GetFunctionalGroupings( + policy_table::FunctionalGroupings& groups) { + LOG4CXX_AUTO_TRACE(logger_); + return GatherFunctionalGroupings(&groups); +} + +bool SQLPTRepresentation::GatherAppType( + const std::string& app_id, policy_table::AppHMITypes* app_types) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectAppTypes)) { + LOG4CXX_WARN(logger_, "Incorrect select from app types"); + return false; + } + + query.Bind(0, app_id); + while (query.Next()) { + policy_table::AppHMIType type; + if (!policy_table::EnumFromJsonString(query.GetString(0), &type)) { + return false; + } + app_types->push_back(type); + } + return true; +} + +bool SQLPTRepresentation::GatherRequestType( + const std::string& app_id, + policy_table::RequestTypes* request_types) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectRequestTypes)) { + LOG4CXX_WARN(logger_, "Incorrect select from request types."); + return false; + } + + query.Bind(0, app_id); + while (query.Next()) { + policy_table::RequestType type; + if (!policy_table::EnumFromJsonString(query.GetString(0), &type)) { + return false; + } + request_types->push_back(type); + } + return true; +} + +bool SQLPTRepresentation::GatherNickName( + const std::string& app_id, policy_table::Strings* nicknames) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectNicknames)) { + LOG4CXX_WARN(logger_, "Incorrect select from app nicknames"); + return false; + } + + query.Bind(0, app_id); + while (query.Next()) { + nicknames->push_back(query.GetString(0)); + } + return true; +} + +bool SQLPTRepresentation::GatherAppGroup( + const std::string& app_id, policy_table::Strings* app_groups) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectAppGroups)) { + LOG4CXX_WARN(logger_, "Incorrect select from app groups"); + return false; + } + + query.Bind(0, app_id); + while (query.Next()) { + app_groups->push_back(query.GetString(0)); + } + return true; +} + +bool SQLPTRepresentation::SaveApplicationCustomData(const std::string& app_id, + bool is_revoked, + bool is_default, + bool is_predata) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdateApplicationCustomData)) { + LOG4CXX_WARN(logger_, "Incorrect update in application"); + return false; + } + + query.Bind(0, is_revoked); + query.Bind(1, is_default); + query.Bind(2, is_predata); + query.Bind(3, app_id); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed update in application"); + return false; + } + + return true; +} + +bool SQLPTRepresentation::IsApplicationRevoked( + const std::string& app_id) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectApplicationRevoked)) { + LOG4CXX_WARN(logger_, "Incorrect select from is_revoked of application"); + } + + query.Bind(0, app_id); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed select is_revoked of application"); + return false; + } + return query.IsNull(0) ? false : query.GetBoolean(0); +} +bool SQLPTRepresentation::IsApplicationRepresented( + const std::string& app_id) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectApplicationRepresented)) { + LOG4CXX_WARN(logger_, "Incorrect select application by id"); + return false; + } + + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed select application by id"); + return false; + } + return query.GetInteger(0) != 0; +} + +bool SQLPTRepresentation::IsDefaultPolicy(const std::string& app_id) const { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectApplicationIsDefault)) { + LOG4CXX_WARN(logger_, "Incorrect select application by id"); + return false; + } + + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed select application by id"); + return false; + } + return query.IsNull(0) ? false : query.GetBoolean(0); +} + +bool SQLPTRepresentation::IsPredataPolicy(const std::string& app_id) const { + return false; +} + +bool SQLPTRepresentation::SetDefaultPolicy(const std::string& app_id) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kDeleteAppGroupByApplicationId)) { + LOG4CXX_ERROR(logger_, "Incorrect statement to delete from app_group."); + return false; + } + query.Bind(0, app_id); + if (!query.Exec()) { + LOG4CXX_ERROR(logger_, "Failed deleting from app_group."); + return false; + } + + if (!CopyApplication(kDefaultId, app_id)) { + return false; + } + + SetPreloaded(false); + + policy_table::Strings default_groups; + if (GatherAppGroup(kDefaultId, &default_groups) && + SaveAppGroup(app_id, default_groups)) { + return SetIsDefault(app_id, true); + } + return false; +} + +bool SQLPTRepresentation::SetIsDefault(const std::string& app_id, + bool is_default) const { + LOG4CXX_TRACE(logger_, "Set flag is_default of application"); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdateIsDefault)) { + LOG4CXX_WARN(logger_, "Incorect statement for updating is_default"); + return false; + } + + query.Bind(0, is_default); + query.Bind(1, app_id); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed update is_default"); + return false; + } + return true; +} + +void SQLPTRepresentation::RemoveDB() const { + file_system::DeleteFile(db_->get_path()); +} + +bool SQLPTRepresentation::IsDBVersionActual() const { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kSelectDBVersion) || !query.Exec()) { + LOG4CXX_ERROR(logger_, + "Failed to get DB version: " << query.LastError().text()); + return false; + } + + const int32_t saved_db_version = query.GetInteger(0); + const int32_t current_db_version = GetDBVersion(); + LOG4CXX_DEBUG(logger_, + "Saved DB version is: " << saved_db_version + << ". Current DB vesion is: " + << current_db_version); + + return current_db_version == saved_db_version; +} + +bool SQLPTRepresentation::UpdateDBVersion() const { + LOG4CXX_AUTO_TRACE(logger_); + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdateDBVersion)) { + LOG4CXX_ERROR(logger_, + "Incorrect DB version query: " << query.LastError().text()); + return false; + } + + const int32_t db_version = GetDBVersion(); + LOG4CXX_DEBUG(logger_, "DB version will be updated to: " << db_version); + query.Bind(0, db_version); + + if (!query.Exec()) { + LOG4CXX_ERROR(logger_, + "DB version getting failed: " << query.LastError().text()); + return false; + } + + return true; +} + +const int32_t SQLPTRepresentation::GetDBVersion() const { + return utils::Djb2HashFromString(sql_pt::kCreateSchema); +} + +utils::dbms::SQLDatabase* SQLPTRepresentation::db() const { +#ifdef __QNX__ + utils::dbms::SQLDatabase* db = new utils::dbms::SQLDatabase(kDatabaseName); + db->Open(); + return db; +#else + return db_; +#endif // __QNX__ +} + +bool SQLPTRepresentation::CopyApplication(const std::string& source, + const std::string& destination) { + utils::dbms::SQLQuery source_app(db()); + if (!source_app.Prepare(sql_pt::kSelectApplicationFull)) { + LOG4CXX_WARN(logger_, "Incorrect select statement from application."); + return false; + } + source_app.Bind(0, source); + if (!source_app.Exec()) { + LOG4CXX_WARN(logger_, "Failed selecting from application."); + return false; + } + + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kInsertApplicationFull)) { + LOG4CXX_WARN(logger_, "Incorrect insert statement into application."); + return false; + } + query.Bind(0, destination); + source_app.IsNull(0) ? query.Bind(1) + : query.Bind(1, source_app.GetBoolean(0)); + source_app.IsNull(1) ? query.Bind(2) + : query.Bind(2, source_app.GetBoolean(1)); + source_app.IsNull(2) ? query.Bind(3) : query.Bind(3, source_app.GetString(2)); + source_app.IsNull(3) ? query.Bind(4) : query.Bind(4, source_app.GetString(3)); + source_app.IsNull(4) ? query.Bind(5) + : query.Bind(5, source_app.GetBoolean(4)); + source_app.IsNull(5) ? query.Bind(6) + : query.Bind(6, source_app.GetBoolean(5)); + source_app.IsNull(6) ? query.Bind(7) + : query.Bind(7, source_app.GetBoolean(6)); + query.Bind(8, source_app.GetInteger(7)); + query.Bind(9, source_app.GetInteger(8)); + + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed inserting into application."); + return false; + } + return true; +} + +void SQLPTRepresentation::SetPreloaded(bool value) { + utils::dbms::SQLQuery query(db()); + if (!query.Prepare(sql_pt::kUpdatePreloaded)) { + LOG4CXX_WARN(logger_, "Incorrect statement of updating preloaded."); + return; + } + + query.Bind(0, value); + if (!query.Exec()) { + LOG4CXX_WARN(logger_, "Failed updating preloaded."); + return; + } +} + +bool SQLPTRepresentation::SetVINValue(const std::string& value) { + return true; +} + +} // namespace policy diff --git a/src/components/policy/policy_external/src/status.cc b/src/components/policy/policy_external/src/status.cc new file mode 100644 index 0000000000..cfb76fea63 --- /dev/null +++ b/src/components/policy/policy_external/src/status.cc @@ -0,0 +1,137 @@ +/* + Copyright (c) 2016, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "policy/status.h" +#include "policy/update_status_manager.h" +#include "utils/make_shared.h" + +policy::UpToDateStatus::UpToDateStatus() + : Status(kUpToDate, policy::PolicyTableStatus::StatusUpToDate) {} + +void policy::UpToDateStatus::ProcessEvent(UpdateStatusManager* manager, + policy::UpdateEvent event) { + switch (event) { + case kOnNewAppRegistered: + case kOnResetPolicyTableRequireUpdate: + case kScheduleUpdate: + case kOnResetRetrySequence: + manager->SetNextStatus(utils::MakeShared<UpdateNeededStatus>()); + break; + default: + break; + } +} + +policy::UpdateNeededStatus::UpdateNeededStatus() + : Status(kUpdateNeeded, policy::PolicyTableStatus::StatusUpdateRequired) {} + +void policy::UpdateNeededStatus::ProcessEvent( + policy::UpdateStatusManager* manager, policy::UpdateEvent event) { + switch (event) { + case kOnUpdateSentOut: + manager->SetNextStatus(utils::MakeShared<UpdatingStatus>()); + break; + case kOnResetPolicyTableRequireUpdate: + manager->SetNextStatus(utils::MakeShared<UpToDateStatus>()); + manager->SetPostponedStatus(utils::MakeShared<UpdateNeededStatus>()); + break; + case kOnResetPolicyTableNoUpdate: + manager->SetNextStatus(utils::MakeShared<UpToDateStatus>()); + break; + default: + break; + } +} + +bool policy::UpdateNeededStatus::IsUpdateRequired() const { + return true; +} + +policy::UpdatingStatus::UpdatingStatus() + : Status(kUpdating, policy::PolicyTableStatus::StatusUpdatePending) {} + +void policy::UpdatingStatus::ProcessEvent(policy::UpdateStatusManager* manager, + policy::UpdateEvent event) { + switch (event) { + case kOnValidUpdateReceived: + case kOnResetPolicyTableNoUpdate: + manager->SetNextStatus(utils::MakeShared<UpToDateStatus>()); + break; + case kOnNewAppRegistered: + manager->SetPostponedStatus(utils::MakeShared<UpdateNeededStatus>()); + break; + case kOnWrongUpdateReceived: + case kOnUpdateTimeout: + manager->SetNextStatus(utils::MakeShared<UpdateNeededStatus>()); + break; + case kOnResetPolicyTableRequireUpdate: + manager->SetNextStatus(utils::MakeShared<UpToDateStatus>()); + manager->SetPostponedStatus(utils::MakeShared<UpdateNeededStatus>()); + break; + case kScheduleUpdate: + case kOnResetRetrySequence: + manager->SetPostponedStatus(utils::MakeShared<UpdateNeededStatus>()); + break; + default: + break; + } +} + +bool policy::UpdatingStatus::IsUpdatePending() const { + return true; +} + +bool policy::UpdatingStatus::IsUpdateRequired() const { + return true; +} + +policy::Status::Status(const std::string& string_status, + const policy::PolicyTableStatus enum_status) + : string_status_(string_status), enum_status_(enum_status) {} + +policy::Status::~Status() {} + +const std::string policy::Status::get_status_string() const { + return string_status_; +} + +policy::PolicyTableStatus policy::Status::get_status() const { + return enum_status_; +} + +bool policy::Status::IsUpdateRequired() const { + return false; +} + +bool policy::Status::IsUpdatePending() const { + return false; +} diff --git a/src/components/policy/policy_external/src/update_status_manager.cc b/src/components/policy/policy_external/src/update_status_manager.cc new file mode 100644 index 0000000000..a1f177c4bc --- /dev/null +++ b/src/components/policy/policy_external/src/update_status_manager.cc @@ -0,0 +1,251 @@ +/* + Copyright (c) 2014, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "policy/update_status_manager.h" +#include "policy/policy_listener.h" +#include "utils/logger.h" +#include "utils/make_shared.h" + +namespace policy { + +CREATE_LOGGERPTR_GLOBAL(logger_, "Policy") + +UpdateStatusManager::UpdateStatusManager() + : listener_(NULL) + , current_status_(utils::MakeShared<UpToDateStatus>()) + , apps_search_in_progress_(false) + , app_registered_from_non_consented_device_(true) { + update_status_thread_delegate_ = new UpdateThreadDelegate(this); + thread_ = threads::CreateThread("UpdateStatusThread", + update_status_thread_delegate_); + thread_->start(); +} + +UpdateStatusManager::~UpdateStatusManager() { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK(update_status_thread_delegate_); + DCHECK(thread_); + thread_->join(); + delete update_status_thread_delegate_; + threads::DeleteThread(thread_); +} + +void UpdateStatusManager::ProcessEvent(UpdateEvent event) { + sync_primitives::AutoLock lock(status_lock_); + current_status_->ProcessEvent(this, event); + DoTransition(); +} + +void UpdateStatusManager::SetNextStatus(utils::SharedPtr<Status> status) { + next_status_ = status; +} + +void UpdateStatusManager::SetPostponedStatus(utils::SharedPtr<Status> status) { + postponed_status_ = status; +} + +void UpdateStatusManager::set_listener(PolicyListener* listener) { + listener_ = listener; +} + +void UpdateStatusManager::OnUpdateSentOut(uint32_t update_timeout) { + LOG4CXX_AUTO_TRACE(logger_); + DCHECK(update_status_thread_delegate_); + update_status_thread_delegate_->updateTimeOut(update_timeout); + ProcessEvent(kOnUpdateSentOut); +} + +void UpdateStatusManager::OnUpdateTimeoutOccurs() { + LOG4CXX_AUTO_TRACE(logger_); + ProcessEvent(kOnUpdateTimeout); + DCHECK(update_status_thread_delegate_); + update_status_thread_delegate_->updateTimeOut(0); // Stop Timer +} + +void UpdateStatusManager::OnValidUpdateReceived() { + LOG4CXX_AUTO_TRACE(logger_); + update_status_thread_delegate_->updateTimeOut(0); // Stop Timer + ProcessEvent(kOnValidUpdateReceived); +} + +void UpdateStatusManager::OnWrongUpdateReceived() { + LOG4CXX_AUTO_TRACE(logger_); + update_status_thread_delegate_->updateTimeOut(0); // Stop Timer + ProcessEvent(kOnWrongUpdateReceived); +} + +void UpdateStatusManager::OnResetDefaultPT(bool is_update_required) { + LOG4CXX_AUTO_TRACE(logger_); + if (is_update_required) { + ProcessEvent(kOnResetPolicyTableRequireUpdate); + return; + } + ProcessEvent(kOnResetPolicyTableNoUpdate); +} + +void UpdateStatusManager::OnResetRetrySequence() { + LOG4CXX_AUTO_TRACE(logger_); + ProcessEvent(kOnResetRetrySequence); +} + +void UpdateStatusManager::OnNewApplicationAdded(const DeviceConsent consent) { + LOG4CXX_AUTO_TRACE(logger_); + if (kDeviceAllowed != consent) { + app_registered_from_non_consented_device_ = true; + return; + } + app_registered_from_non_consented_device_ = false; + ProcessEvent(kOnNewAppRegistered); +} + +void UpdateStatusManager::OnPolicyInit(bool is_update_required) { + LOG4CXX_AUTO_TRACE(logger_); + if (is_update_required) { + current_status_.reset(new UpToDateStatus()); + ProcessEvent(kScheduleUpdate); + } +} + +void UpdateStatusManager::OnDeviceConsented() { + LOG4CXX_AUTO_TRACE(logger_); + if (app_registered_from_non_consented_device_) { + ProcessEvent(kOnNewAppRegistered); + } +} + +bool UpdateStatusManager::IsUpdateRequired() const { + return current_status_->IsUpdateRequired(); +} + +bool UpdateStatusManager::IsUpdatePending() const { + return current_status_->IsUpdatePending(); +} + +void UpdateStatusManager::ScheduleUpdate() { + ProcessEvent(kScheduleUpdate); +} + +std::string UpdateStatusManager::StringifiedUpdateStatus() const { + return current_status_->get_status_string(); +} + +void policy::UpdateStatusManager::OnAppsSearchStarted() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(apps_search_in_progress_lock_); + apps_search_in_progress_ = true; +} + +void policy::UpdateStatusManager::OnAppsSearchCompleted() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(apps_search_in_progress_lock_); + apps_search_in_progress_ = false; +} + +bool policy::UpdateStatusManager::IsAppsSearchInProgress() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(apps_search_in_progress_lock_); + return apps_search_in_progress_; +} + +void UpdateStatusManager::DoTransition() { + DCHECK_OR_RETURN_VOID(listener_); + if (!next_status_) { + return; + } + + current_status_ = next_status_; + next_status_.reset(); + listener_->OnUpdateStatusChanged(current_status_->get_status_string()); + + if (!postponed_status_) { + return; + } + + current_status_ = postponed_status_; + listener_->OnUpdateStatusChanged(current_status_->get_status_string()); + postponed_status_.reset(); +} + +UpdateStatusManager::UpdateThreadDelegate::UpdateThreadDelegate( + UpdateStatusManager* update_status_manager) + : timeout_(0) + , stop_flag_(false) + , state_lock_(true) + , update_status_manager_(update_status_manager) { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Create UpdateThreadDelegate"); +} + +UpdateStatusManager::UpdateThreadDelegate::~UpdateThreadDelegate() { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "Delete UpdateThreadDelegate"); +} + +void UpdateStatusManager::UpdateThreadDelegate::threadMain() { + LOG4CXX_AUTO_TRACE(logger_); + LOG4CXX_DEBUG(logger_, "UpdateStatusManager thread started (started normal)"); + sync_primitives::AutoLock auto_lock(state_lock_); + while (false == stop_flag_) { + if (timeout_ > 0) { + LOG4CXX_DEBUG(logger_, "Timeout is greater then 0"); + sync_primitives::ConditionalVariable::WaitStatus wait_status = + termination_condition_.WaitFor(auto_lock, timeout_); + if (sync_primitives::ConditionalVariable::kTimeout == wait_status) { + if (update_status_manager_) { + update_status_manager_->OnUpdateTimeoutOccurs(); + } + } + } else { + // Time is not active, wait until timeout will be set, + // or UpdateStatusManager will be deleted + termination_condition_.Wait(auto_lock); + } + } +} + +void UpdateStatusManager::UpdateThreadDelegate::exitThreadMain() { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(state_lock_); + stop_flag_ = true; + LOG4CXX_DEBUG(logger_, "before notify"); + termination_condition_.NotifyOne(); +} + +void UpdateStatusManager::UpdateThreadDelegate::updateTimeOut( + const uint32_t timeout_ms) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock auto_lock(state_lock_); + timeout_ = timeout_ms; + termination_condition_.NotifyOne(); +} + +} // namespace policy diff --git a/src/components/policy/policy_external/src/usage_statistics/counter.cc b/src/components/policy/policy_external/src/usage_statistics/counter.cc new file mode 100644 index 0000000000..661ea29704 --- /dev/null +++ b/src/components/policy/policy_external/src/usage_statistics/counter.cc @@ -0,0 +1,126 @@ +/* + Copyright (c) 2013, Ford Motor Company + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following + disclaimer in the documentation and/or other materials provided with the + distribution. + + Neither the name of the Ford Motor Company nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_INCLUDE_POLICY_STATISTICS_MANAGER_H_ +#define SRC_COMPONENTS_POLICY_INCLUDE_POLICY_STATISTICS_MANAGER_H_ + +#include <cassert> +#include "policy/usage_statistics/counter.h" +#include "utils/date_time.h" +#include "utils/make_shared.h" +#include "utils/timer_task_impl.h" + +namespace usage_statistics { + +GlobalCounter::GlobalCounter( + utils::SharedPtr<usage_statistics::StatisticsManager> statistics_manager, + GlobalCounterId counter_type) + : counter_type_(counter_type), statistics_manager_(statistics_manager) {} + +void GlobalCounter::operator++() const { + if (statistics_manager_) { + statistics_manager_->Increment(counter_type_); + } +} + +AppCounter::AppCounter( + utils::SharedPtr<usage_statistics::StatisticsManager> statistics_manager, + const std::string& app_id, + AppCounterId counter_type) + : app_id_(app_id) + , counter_type_(counter_type) + , statistics_manager_(statistics_manager) {} + +void AppCounter::operator++() const { + if (statistics_manager_) { + statistics_manager_->Increment(app_id_, counter_type_); + } +} + +AppInfo::AppInfo( + utils::SharedPtr<usage_statistics::StatisticsManager> statistics_manager, + const std::string& app_id, + AppInfoId info_type) + : app_id_(app_id) + , info_type_(info_type) + , statistics_manager_(statistics_manager) {} + +void AppInfo::Update(const std::string& new_info) const { + if (statistics_manager_) { + statistics_manager_->Set(app_id_, info_type_, new_info); + } +} + +AppStopwatchImpl::AppStopwatchImpl( + utils::SharedPtr<usage_statistics::StatisticsManager> statistics_manager, + const std::string& app_id) + : app_id_(app_id) + , stopwatch_type_(SECONDS_HMI_NONE) + , statistics_manager_(statistics_manager) + , timer_("HMI levels timer", + new timer::TimerTaskImpl<AppStopwatchImpl>( + this, &AppStopwatchImpl::WriteTime)) + , time_out_(60) {} + +AppStopwatchImpl::AppStopwatchImpl( + utils::SharedPtr<StatisticsManager> statistics_manager, + const std::string& app_id, + uint32_t timeout) + : app_id_(app_id) + , stopwatch_type_(SECONDS_HMI_NONE) + , statistics_manager_(statistics_manager) + , timer_("HMI levels timer", + new timer::TimerTaskImpl<AppStopwatchImpl>( + this, &AppStopwatchImpl::WriteTime)) + , time_out_(timeout) {} + +AppStopwatchImpl::~AppStopwatchImpl() {} + +void AppStopwatchImpl::Start(AppStopwatchId stopwatch_type) { + stopwatch_type_ = stopwatch_type; + timer_.Start(time_out_ * date_time::DateTime::MILLISECONDS_IN_SECOND, + timer::kPeriodic); +} + +void AppStopwatchImpl::Switch(AppStopwatchId stopwatch_type) { + Start(stopwatch_type); +} + +void AppStopwatchImpl::WriteTime() { + if (statistics_manager_) { + statistics_manager_->Add(app_id_, stopwatch_type_, time_out_); + } +} + +} // namespace usage_statistics + +#endif // SRC_COMPONENTS_POLICY_INCLUDE_POLICY_STATISTICS_MANAGER_H_ diff --git a/src/components/policy/policy_external/test/CMakeLists.txt b/src/components/policy/policy_external/test/CMakeLists.txt new file mode 100644 index 0000000000..8b77c90dd2 --- /dev/null +++ b/src/components/policy/policy_external/test/CMakeLists.txt @@ -0,0 +1,63 @@ +# Copyright (c) 2015, Ford Motor Company +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following +# disclaimer in the documentation and/or other materials provided with the +# distribution. +# +# Neither the name of the Ford Motor Company nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +include_directories( + include + ${GMOCK_INCLUDE_DIRECTORY} + ${JSONCPP_INCLUDE_DIRECTORY} + ${POLICY_PATH}/include + ${COMPONENTS_DIR}/rpc_base/include + ${COMPONENTS_DIR}/config_profile/include + ${COMPONENTS_DIR}/utils/include/ + ${POLICY_MOCK_INCLUDE_PATH} +) + +set(testLibraries + gmock + Utils + Policy + UsageStatistics + ConfigProfile +) + +file (GLOB POLICY_TEST_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/policy_manager_impl_test_base.cc + *.cc) + +# Unbuildable +list (REMOVE_ITEM POLICY_TEST_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/policy_manager_impl_stress_test.cc) + +create_test("policy_test" "${POLICY_TEST_SOURCES}" "${testLibraries}") + +#Additional test files (json) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/json) +file(GLOB JSON_TEST_FILES json/*.json) +file(COPY ${JSON_TEST_FILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/json) diff --git a/src/components/policy/policy_external/test/counter_test.cc b/src/components/policy/policy_external/test/counter_test.cc new file mode 100644 index 0000000000..90f247de31 --- /dev/null +++ b/src/components/policy/policy_external/test/counter_test.cc @@ -0,0 +1,183 @@ +/* Copyright (c) 2015, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "gtest/gtest.h" +#include "policy/usage_statistics/mock_statistics_manager.h" +#include "policy/usage_statistics/counter.h" + +using ::testing::StrictMock; +using ::testing::InSequence; + +namespace test { +namespace components { +namespace usage_statistics_test { + +using namespace usage_statistics; + +TEST( + StatisticsManagerIncrementMethod1Arg, + GlobalCounterOverloadedIncrement_CallONCE_StatisticsManagerIncrementCalledONCE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + GlobalCounter reboots_counter(msm, SYNC_REBOOTS); + + // Assert + EXPECT_CALL(*msm, Increment(SYNC_REBOOTS)); + + // Act + ++reboots_counter; +} + +TEST( + StatisticsManagerIncrementMethod1Arg, + GlobalCounterOverloadedIncrement_CallTWICE_StatisticsManagerIncrementCalledTWICE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + GlobalCounter reboots_counter(msm, SYNC_REBOOTS); + + // Assert + EXPECT_CALL(*msm, Increment(SYNC_REBOOTS)).Times(2); + + // Act + ++reboots_counter; + ++reboots_counter; +} + +TEST( + StatisticsManagerIncrementMethod2Args, + AppCounterOverloadedIncrement_CallONCE_StatisticsManagerIncrementCalledONCE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + AppCounter user_selections_counter(msm, "HelloApp", USER_SELECTIONS); + + // Assert + EXPECT_CALL(*msm, Increment("HelloApp", USER_SELECTIONS)); + + // Act + ++user_selections_counter; +} + +TEST( + StatisticsManagerIncrementMethod2Args, + AppCounterOverloadedIncrement_CallTWICE_StatisticsManagerIncrementCalledTWICE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + AppCounter user_selections_counter(msm, "HelloApp", USER_SELECTIONS); + + // Assert + EXPECT_CALL(*msm, Increment("HelloApp", USER_SELECTIONS)).Times(2); + + // Act + ++user_selections_counter; + ++user_selections_counter; +} +//--- +TEST(StatisticsManagerSetMethod, + AppInfoUpdateMethod_CallONCE_StatisticsManagerSetMethodCalledONCE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + AppInfo gui_language_info(msm, "HelloApp", LANGUAGE_GUI); + + // Assert + EXPECT_CALL(*msm, Set("HelloApp", LANGUAGE_GUI, "Klingon")); + + // Act + gui_language_info.Update("Klingon"); +} + +TEST(StatisticsManagerSetMethod, + AppInfoUpdateMethod_CallTWICE_StatisticsManagerSetMethodCalledTWICE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + AppInfo gui_language_info(msm, "HelloApp", LANGUAGE_GUI); + + // Assert + EXPECT_CALL(*msm, Set("HelloApp", LANGUAGE_GUI, "Klingon")); + EXPECT_CALL(*msm, Set("HelloApp", LANGUAGE_GUI, "UA")); + + // Act + gui_language_info.Update("Klingon"); + gui_language_info.Update("UA"); +} + +TEST(StatisticsManagerAddMethod, + AppStopwatchStartMethod_CallONCE_StatisticsManagerAddMethodCalledONCE) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + const std::uint32_t time_out = 1; + AppStopwatchImpl hmi_full_stopwatch(msm, "HelloApp", time_out); + + hmi_full_stopwatch.Start(SECONDS_HMI_FULL); + // Assert + EXPECT_CALL(*msm, Add("HelloApp", SECONDS_HMI_FULL, time_out)); + + // Act + hmi_full_stopwatch.WriteTime(); +} + +TEST(StatisticsManagerAddMethod, + AppStopwatchSwitchMethod_Call_StatisticsManagerAddMethodCalled) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + AppStopwatchImpl hmi_full_stopwatch(msm, "HelloApp"); + hmi_full_stopwatch.Start(SECONDS_HMI_FULL); + + hmi_full_stopwatch.Switch(SECONDS_HMI_FULL); + // Assert + EXPECT_CALL(*msm, Add("HelloApp", SECONDS_HMI_FULL, 60)); + + // Act + hmi_full_stopwatch.WriteTime(); +} + +TEST( + StatisticsManagerAddMethod, + AppStopwatchSwitchMethod_CallAnd1SecSleepAfter_StatisticsManagerAddMethodCalledWith1SecTimespan) { + // Arrange + MockStatisticsManager* msm = new StrictMock<MockStatisticsManager>(); + const std::uint32_t time_out = 1; + AppStopwatchImpl hmi_full_stopwatch(msm, "HelloApp", time_out); + + // Act + hmi_full_stopwatch.Start(SECONDS_HMI_NONE); + // Assert + EXPECT_CALL(*msm, Add("HelloApp", SECONDS_HMI_NONE, time_out)); + // Act + hmi_full_stopwatch.WriteTime(); + + hmi_full_stopwatch.Switch(SECONDS_HMI_BACKGROUND); + // Assert + EXPECT_CALL(*msm, Add("HelloApp", SECONDS_HMI_BACKGROUND, time_out)); + // Act + hmi_full_stopwatch.WriteTime(); +} +} // namespace usage_statistics +} // components +} // namespace test diff --git a/src/components/policy/policy_external/test/generated_code_test.cc b/src/components/policy/policy_external/test/generated_code_test.cc new file mode 100644 index 0000000000..2704f03c6a --- /dev/null +++ b/src/components/policy/policy_external/test/generated_code_test.cc @@ -0,0 +1,140 @@ +/* Copyright (c) 2013, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <fstream> + +#include "gtest/gtest.h" + +#include "json/reader.h" +#include "json/value.h" +#include "policy/policy_table/enums.h" +#include "policy/policy_table/types.h" +#include "rpc_base/gtest_support.h" +#include "rpc_base/rpc_base.h" + +using rpc::Integer; +using rpc::policy_table_interface_base::Table; + +namespace test { +namespace components { +namespace policy_test { + +TEST(PolicyGeneratedCodeTest, TestValidPTPreloadJsonIsValid) { + std::ifstream json_file("json/sdl_preloaded_pt.json"); + ASSERT_TRUE(json_file.is_open()); + Json::Value valid_table; + Json::Reader reader; + ASSERT_TRUE(reader.parse(json_file, valid_table)); + Table table(&valid_table); + table.SetPolicyTableType(rpc::policy_table_interface_base::PT_PRELOADED); + ASSERT_RPCTYPE_VALID(table); +} + +TEST(PolicyGeneratedCodeTest, TestValidPTUpdateJsonIsValid) { + std::ifstream json_file("json/valid_sdl_pt_update.json"); + ASSERT_TRUE(json_file.is_open()); + Json::Value valid_table; + Json::Reader reader; + ASSERT_TRUE(reader.parse(json_file, valid_table)); + Table table(&valid_table); + table.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + ASSERT_RPCTYPE_VALID(table); +} + +TEST(PolicyGeneratedCodeTest, IntegerLimitsTest) { + const int32_t min_value = -5; + const int32_t max_value = 5; + + Integer<int32_t, min_value, max_value> value; + EXPECT_FALSE(value.is_valid()); + + value = min_value; + EXPECT_TRUE(value.is_valid()); + + value = max_value; + EXPECT_TRUE(value.is_valid()); + + value = min_value + max_value; + EXPECT_TRUE(value.is_valid()); + + value = min_value - 1; + EXPECT_FALSE(value.is_valid()); + + value = max_value + 1; + EXPECT_FALSE(value.is_valid()); +} + +TEST(PolicyGeneratedCodeTest, IntegerConstructionAndAssignmentTest) { + const int32_t min_value = -5; + const int32_t max_value = 5; + + const Json::Value json_null = Json::Value(Json::nullValue); + Integer<int32_t, min_value, max_value> value_from_json_null(&json_null); + EXPECT_FALSE(value_from_json_null.is_valid()); + + const Json::Value json_string = Json::Value("string"); + Integer<int32_t, min_value, max_value> value_from_json_string(&json_string); + EXPECT_FALSE(value_from_json_string.is_valid()); + + const Json::Value json_float = Json::Value(10.5); + Integer<int32_t, min_value, max_value> value_from_json_float(&json_float); + EXPECT_FALSE(value_from_json_float.is_valid()); + + const Json::Value json_int_in_range = Json::Value(4); + Integer<int32_t, min_value, max_value> value_from_json_int_in_range( + &json_int_in_range); + EXPECT_TRUE(value_from_json_int_in_range.is_valid()); + + const Json::Value json_int_out_of_range = Json::Value(9); + Integer<int32_t, min_value, max_value> value_from_json_int_out_of_range( + &json_int_out_of_range); + EXPECT_FALSE(value_from_json_int_out_of_range.is_valid()); + + const Json::Value json_zero = Json::Value(0); + Integer<int32_t, min_value, max_value> value_from_json_zero(&json_zero); + EXPECT_TRUE(value_from_json_zero.is_valid()); + + Integer<int32_t, min_value, max_value> invalid_value(&json_string); + EXPECT_FALSE(invalid_value.is_valid()); + Integer<int32_t, min_value, max_value> reassigned_value = invalid_value; + EXPECT_FALSE(reassigned_value.is_valid()); + + Integer<int32_t, min_value, max_value> another_invalid_value(&json_string); + EXPECT_FALSE(another_invalid_value.is_valid()); + Integer<int32_t, min_value, max_value> valid_value(0); + EXPECT_TRUE(valid_value.is_valid()); + valid_value = another_invalid_value; + EXPECT_FALSE(valid_value.is_valid()); +} + +} // namespace policy_test +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/include/policy/driver_dbms.h b/src/components/policy/policy_external/test/include/policy/driver_dbms.h new file mode 100644 index 0000000000..e438c87b03 --- /dev/null +++ b/src/components/policy/policy_external/test/include/policy/driver_dbms.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_DRIVER_DBMS_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_DRIVER_DBMS_H_ + +#ifdef __QNX__ +#include <qdb/qdb.h> +#else // __QNX__ +#include <sqlite3.h> +#endif // __QNX__ + +namespace test { +namespace components { +namespace policy_test { + +#ifdef __QNX__ +class DBMS { + public: + explicit DBMS(std::string db_name) : db_name_(db_name), conn_(0) {} + ~DBMS() { + Close(); + } + bool Open() { + conn_ = qdb_connect(db_name_.c_str(), 0); + return conn_ != NULL; + } + void Close() { + qdb_disconnect(conn_); + } + bool Exec(const char* query) { + return -1 != qdb_statement(conn_, query); + } + int FetchOneInt(const char* query) { + int stmt = qdb_stmt_init(conn_, query, strlen(query) + 1); + qdb_stmt_exec(conn_, stmt, NULL, 0); + qdb_result_t* res = qdb_getresult(conn_); + void* ret = qdb_cell(res, 0, 0); + int value = 0; + if (ret) { + value = *static_cast<int*>(ret); + } + qdb_stmt_free(conn_, stmt); + return value; + } + double FetchOneDouble(const char* query) { + int stmt = qdb_stmt_init(conn_, query, strlen(query) + 1); + qdb_stmt_exec(conn_, stmt, NULL, 0); + qdb_result_t* res = qdb_getresult(conn_); + void* ret = qdb_cell(res, 0, 0); + double value = 0.0; + if (ret) { + value = *static_cast<double*>(ret); + } + qdb_stmt_free(conn_, stmt); + + return value; + } + std::string FetchOneString(const char* query) { + int stmt = qdb_stmt_init(conn_, query, strlen(query) + 1); + qdb_stmt_exec(conn_, stmt, NULL, 0); + qdb_result_t* res = qdb_getresult(conn_); + void* ret = qdb_cell(res, 0, 0); + std::string value = ""; + if (ret) { + value = std::string(static_cast<const char*>(ret)); + } + qdb_stmt_free(conn_, stmt); + + return value; + } + + private: + std::string db_name_; + qdb_hdl_t* conn_; +}; + +#else // __QNX__ +class DBMS { + public: + explicit DBMS(std::string file_name) : file_name_(file_name), conn_(0) {} + ~DBMS() { + Close(); + } + bool Open() { + return SQLITE_OK == sqlite3_open(file_name_.c_str(), &conn_); + } + void Close() { + sqlite3_close(conn_); + remove(file_name_.c_str()); + } + bool Exec(const char* query) { + return SQLITE_OK == sqlite3_exec(conn_, query, NULL, NULL, NULL); + } + int FetchOneInt(const char* query) { + sqlite3_stmt* statement; + sqlite3_prepare(conn_, query, -1, &statement, NULL); + sqlite3_step(statement); + int value = sqlite3_column_int(statement, 0); + sqlite3_finalize(statement); + return value; + } + double FethcOneDouble(const char* query) { + sqlite3_stmt* statement; + sqlite3_prepare(conn_, query, -1, &statement, NULL); + sqlite3_step(statement); + double value = sqlite3_column_double(statement, 0); + sqlite3_finalize(statement); + return value; + } + std::string FetchOneString(const char* query) { + sqlite3_stmt* statement; + sqlite3_prepare(conn_, query, -1, &statement, NULL); + sqlite3_step(statement); + const unsigned char* txt = sqlite3_column_text(statement, 0); + std::string value = std::string(reinterpret_cast<const char*>(txt)); + sqlite3_finalize(statement); + return value; + } + + private: + std::string file_name_; + sqlite3* conn_; +}; +#endif // __QNX__ + +} // namespace policy_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_DRIVER_DBMS_H_ diff --git a/src/components/policy/policy_external/test/include/policy/mock_cache_manager.h b/src/components/policy/policy_external/test/include/policy/mock_cache_manager.h new file mode 100644 index 0000000000..7d37260ef7 --- /dev/null +++ b/src/components/policy/policy_external/test/include/policy/mock_cache_manager.h @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_CACHE_MANAGER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_CACHE_MANAGER_H_ + +#include <string> +#include <vector> + +#include "gmock/gmock.h" + +#include "policy/cache_manager_interface.h" + +namespace policy_table = rpc::policy_table_interface_base; + +using namespace ::policy; + +namespace test { +namespace components { +namespace policy_test { + +class MockCacheManagerInterface : public ::policy::CacheManagerInterface { + public: + MOCK_METHOD4(CheckPermissions, + void(const PTString& app_id, + const PTString& hmi_level, + const PTString& rpc, + CheckPermissionResult& result)); + MOCK_METHOD0(IsPTPreloaded, bool()); + MOCK_METHOD0(IgnitionCyclesBeforeExchange, int()); + MOCK_METHOD1(KilometersBeforeExchange, int(int current)); + MOCK_CONST_METHOD1(GetPermissionsList, bool(StringArray& perm_list)); + MOCK_METHOD2(SetCountersPassedForSuccessfulUpdate, + bool(Counters counter, int value)); + MOCK_METHOD1(DaysBeforeExchange, int(uint16_t current)); + MOCK_METHOD0(IncrementIgnitionCycles, void()); + + MOCK_METHOD2(SaveDeviceConsentToCache, + void(const std::string& device_id, const bool is_allowed)); + + MOCK_METHOD1(ResetCalculatedPermissionsForDevice, + void(const std::string& device_id)); + MOCK_METHOD0(ResetIgnitionCycles, void()); + MOCK_METHOD0(TimeoutResponse, int()); + MOCK_METHOD1(SecondsBetweenRetries, bool(std::vector<int>& seconds)); + MOCK_CONST_METHOD1(IsDeviceConsentCached, bool(const std::string& device_id)); + MOCK_CONST_METHOD0(GetVehicleInfo, const VehicleInfo()); + MOCK_CONST_METHOD1(GetDeviceConsent, + DeviceConsent(const std::string& device_id)); + MOCK_METHOD2(SetDeviceConsent, + void(const std::string& device_id, bool is_allowed)); + + MOCK_CONST_METHOD2(HasDeviceSpecifiedConsent, + bool(const std::string& device_id, const bool is_allowed)); + MOCK_CONST_METHOD1(GetCachedDeviceConsent, + DeviceConsent(const std::string& device_id)); + MOCK_METHOD1(SetVINValue, bool(const std::string& value)); + MOCK_METHOD3(GetUserFriendlyMsg, + std::vector<UserFriendlyMessage>( + const std::vector<std::string>& msg_codes, + const std::string& language, + const std::string& active_hmi_language)); + MOCK_METHOD2(GetUpdateUrls, + void(const std::string& service_type, + EndpointUrls& out_end_points)); + MOCK_METHOD2(GetUpdateUrls, + void(const uint32_t service_type, EndpointUrls& out_end_points)); + MOCK_CONST_METHOD0(GetLockScreenIconUrl, std::string()); + MOCK_METHOD1( + GetNotificationsNumber, + policy_table::NumberOfNotificationsType(const std::string& priority)); + MOCK_CONST_METHOD2(GetPriority, + bool(const std::string& policy_app_id, + std::string& priority)); + MOCK_METHOD2(Init, + bool(const std::string& file_name, + const PolicySettings* settings)); + MOCK_METHOD0(GenerateSnapshot, utils::SharedPtr<policy_table::Table>()); + MOCK_METHOD1(ApplyUpdate, bool(const policy_table::Table& update_pt)); + MOCK_METHOD1(Save, bool(const policy_table::Table& table)); + MOCK_CONST_METHOD0(UpdateRequired, bool()); + MOCK_METHOD1(SaveUpdateRequired, void(bool status)); + MOCK_METHOD3(GetInitialAppData, + bool(const std::string& app_id, + StringArray& nicknames, + StringArray& app_hmi_types)); + MOCK_CONST_METHOD1(IsApplicationRevoked, bool(const std::string& app_id)); + MOCK_METHOD1(GetFunctionalGroupings, + bool(policy_table::FunctionalGroupings& groups)); + MOCK_CONST_METHOD1(IsApplicationRepresented, bool(const std::string& app_id)); + MOCK_CONST_METHOD1(IsDefaultPolicy, bool(const std::string& app_id)); + MOCK_METHOD1(SetIsDefault, bool(const std::string& app_id)); + MOCK_METHOD1(SetIsPredata, bool(const std::string& app_id)); + MOCK_CONST_METHOD1(IsPredataPolicy, bool(const std::string& app_id)); + MOCK_METHOD1(SetDefaultPolicy, bool(const std::string& app_id)); + MOCK_CONST_METHOD1(CanAppKeepContext, bool(const std::string& app_id)); + MOCK_CONST_METHOD1(CanAppStealFocus, bool(const std::string& app_id)); + MOCK_CONST_METHOD2(GetDefaultHMI, + bool(const std::string& app_id, std::string& default_hmi)); + MOCK_METHOD0(ResetUserConsent, bool()); + MOCK_CONST_METHOD3(GetUserPermissionsForDevice, + bool(const std::string& device_id, + StringArray& consented_groups, + StringArray& disallowed_groups)); + MOCK_METHOD3(GetPermissionsForApp, + bool(const std::string& device_id, + const std::string& app_id, + FunctionalIdType& group_types)); + MOCK_CONST_METHOD2( + GetDeviceGroupsFromPolicies, + bool(rpc::policy_table_interface_base::Strings& groups, + rpc::policy_table_interface_base::Strings& preconsented_groups)); + MOCK_METHOD2(AddDevice, + bool(const std::string& device_id, + const std::string& connection_type)); + MOCK_METHOD8(SetDeviceData, + bool(const std::string& device_id, + const std::string& hardware, + const std::string& firmware, + const std::string& os, + const std::string& os_version, + const std::string& carrier, + const uint32_t number_of_ports, + const std::string& connection_type)); + MOCK_METHOD3(SetUserPermissionsForDevice, + bool(const std::string& device_id, + const StringArray& consented_groups, + const StringArray& disallowed_groups)); + MOCK_METHOD2(ReactOnUserDevConsentForApp, + bool(const std::string& app_id, bool is_device_allowed)); + MOCK_METHOD1(SetUserPermissionsForApp, + bool(const PermissionConsent& permissions)); + MOCK_METHOD3(SetMetaInfo, + bool(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& language)); + MOCK_CONST_METHOD0(IsMetaInfoPresent, bool()); + MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language)); + MOCK_METHOD1(Increment, void(usage_statistics::GlobalCounterId type)); + MOCK_METHOD2(Increment, + void(const std::string& app_id, + usage_statistics::AppCounterId type)); + MOCK_METHOD3(Set, + void(const std::string& app_id, + usage_statistics::AppInfoId type, + const std::string& value)); + MOCK_METHOD3(Add, + void(const std::string& app_id, + usage_statistics::AppStopwatchId type, + int seconds)); + MOCK_METHOD2(CountUnconsentedGroups, + int(const std::string& policy_app_id, + const std::string& device_id)); + MOCK_METHOD1(GetFunctionalGroupNames, bool(FunctionalGroupNames& names)); + MOCK_METHOD2(GetAllAppGroups, + void(const std::string& app_id, + FunctionalGroupIDs& all_group_ids)); + MOCK_METHOD2(GetPreConsentedGroups, + void(const std::string& app_id, + FunctionalGroupIDs& preconsented_groups)); + MOCK_METHOD4(GetConsentedGroups, + void(const std::string& device_id, + const std::string& app_id, + FunctionalGroupIDs& allowed_groups, + FunctionalGroupIDs& disallowed_groups)); + MOCK_METHOD3(GetUnconsentedGroups, + void(const std::string& device_id, + const std::string& policy_app_id, + FunctionalGroupIDs& unconsented_groups)); + MOCK_METHOD2(RemoveAppConsentForGroup, + void(const std::string& app_id, const std::string& group_name)); + MOCK_METHOD1(SetPredataPolicy, bool(const std::string& app_id)); + MOCK_METHOD0(CleanupUnpairedDevices, bool()); + MOCK_METHOD2(SetUnpairedDevice, + bool(const std::string& device_id, bool unpaired)); + MOCK_METHOD1(UnpairedDevicesList, bool(DeviceIds& device_ids)); + MOCK_METHOD1(ResetPT, bool(const std::string& file_name)); + MOCK_METHOD0(LoadFromBackup, bool()); + MOCK_METHOD2(LoadFromFile, + bool(const std::string& file_name, policy_table::Table&)); + MOCK_METHOD0(Backup, void()); + MOCK_CONST_METHOD1(HeartBeatTimeout, uint32_t(const std::string& app_id)); + MOCK_CONST_METHOD2(GetAppRequestTypes, + void(const std::string& policy_app_id, + std::vector<std::string>& request_types)); + MOCK_METHOD1(GetHMIAppTypeAfterUpdate, + void(std::map<std::string, StringArray>& app_hmi_types)); + + MOCK_CONST_METHOD2(AppHasHMIType, + bool(const std::string& application_id, + policy_table::AppHMIType hmi_type)); + + MOCK_METHOD0(ResetCalculatedPermissions, void()); + MOCK_METHOD3(AddCalculatedPermissions, + void(const std::string& device_id, + const std::string& policy_app_id, + const policy::Permissions& permissions)); + MOCK_METHOD3(IsPermissionsCalculated, + bool(const std::string& device_id, + const std::string& policy_app_id, + policy::Permissions& permission)); + MOCK_CONST_METHOD0(GetPT, utils::SharedPtr<policy_table::Table>()); + MOCK_CONST_METHOD0(GetMetaInfo, const MetaInfo()); + MOCK_CONST_METHOD0(GetCertificate, std::string()); + MOCK_METHOD1(SetDecryptedCertificate, void(const std::string&)); + MOCK_METHOD1(set_settings, void(const PolicySettings* settings)); +}; + +} // namespace policy_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_CACHE_MANAGER_H_ diff --git a/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h b/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h new file mode 100644 index 0000000000..2dda69bd73 --- /dev/null +++ b/src/components/policy/policy_external/test/include/policy/mock_pt_ext_representation.h @@ -0,0 +1,146 @@ +/* Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_PT_EXT_REPRESENTATION_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_PT_EXT_REPRESENTATION_H_ + +#include <string> +#include <vector> + +#include "gmock/gmock.h" + +#include "policy/pt_ext_representation.h" +#include "rpc_base/rpc_base.h" +#include "policy/policy_table/types.h" +#include "mock_pt_representation.h" + +namespace policy_table = ::rpc::policy_table_interface_base; + +using namespace ::policy; + +namespace test { +namespace components { +namespace policy_test { + +class MockPTExtRepresentation : public MockPTRepresentation, + public PTExtRepresentation { + public: + MOCK_METHOD1(CanAppKeepContext, bool(const std::string& app_id)); + MOCK_METHOD1(CanAppStealFocus, bool(const std::string& app_id)); + MOCK_METHOD2(GetDefaultHMI, + bool(const std::string& app_id, std::string* default_hmi)); + MOCK_METHOD0(ResetUserConsent, bool()); + MOCK_METHOD0(ResetDeviceConsents, bool()); + MOCK_METHOD0(ResetAppConsents, bool()); + MOCK_METHOD3(GetUserPermissionsForDevice, + bool(const std::string&, StringArray*, StringArray*)); + MOCK_METHOD3(GetPermissionsForApp, + bool(const std::string&, + const std::string&, + FunctionalIdType* group_types)); + MOCK_METHOD2(GetDeviceGroupsFromPolicies, + bool(policy_table::Strings*, policy_table::Strings*)); + MOCK_METHOD2( + GetUserFriendlyMsg, + std::vector<UserFriendlyMessage>(const std::vector<std::string>& msg_code, + const std::string& language)); + MOCK_METHOD8(SetDeviceData, + bool(const std::string& device_id, + const std::string& hardware, + const std::string& firmware, + const std::string& os, + const std::string& os_version, + const std::string& carrier, + const uint32_t number_of_ports, + const std::string& connection_type)); + MOCK_METHOD6(SetDeviceData, + bool(const std::string&, + const std::string&, + const std::string&, + const std::string&, + const std::string&, + const std::string&)); + MOCK_METHOD2(SetMaxNumberPorts, + bool(const std::string& device_id, + unsigned int number_of_ports)); + MOCK_METHOD3(SetUserPermissionsForDevice, + bool(const std::string&, + const StringArray&, + const StringArray&)); + MOCK_METHOD1(SetUserPermissionsForApp, bool(const PermissionConsent&)); + MOCK_METHOD1(IncreaseStatisticsData, bool(StatisticsType type)); + MOCK_METHOD3(SetAppRegistrationLanguage, + bool(const std::string& app_id, + LanguageType type, + const std::string& language)); + MOCK_METHOD3(SetMetaInfo, + bool(const std::string& ccpu_version, + const std::string& wers_country_code, + const std::string& vin)); + MOCK_METHOD0(IsMetaInfoPresent, bool()); + MOCK_METHOD1(SetSystemLanguage, bool(const std::string& language)); + MOCK_METHOD0(GetKmFromSuccessfulExchange, int()); + MOCK_METHOD0(GetDayFromScsExchange, int()); + MOCK_METHOD0(GetIgnitionsFromScsExchange, int()); + MOCK_CONST_METHOD1(Increment, void(const std::string& type)); + MOCK_CONST_METHOD2(Increment, + void(const std::string& app_id, const std::string& type)); + MOCK_CONST_METHOD3(Set, + void(const std::string& app_id, + const std::string& type, + const std::string& value)); + MOCK_CONST_METHOD3(Add, + void(const std::string& app_id, + const std::string& type, + int seconds)); + MOCK_CONST_METHOD3(CountUnconsentedGroups, + bool(const std::string& app_id, + const std::string& device_id, + int* count)); + MOCK_METHOD1(GetFunctionalGroupNames, bool(FunctionalGroupNames& names)); + MOCK_CONST_METHOD1(CleanupUnpairedDevices, bool(const DeviceIds& device_ids)); + MOCK_METHOD2(ReactOnUserDevConsentForApp, + bool(const std::string& app_id, bool is_device_allowed)); + MOCK_METHOD1(SetPredataPolicy, bool(const std::string& app_id)); + MOCK_METHOD2(SetIsPredata, bool(const std::string& app_id, bool is_predata)); + MOCK_CONST_METHOD2(SetUnpairedDevice, + bool(const std::string& device_id, bool unpaired)); + MOCK_CONST_METHOD1(UnpairedDevicesList, bool(DeviceIds* device_ids)); + MOCK_CONST_METHOD2(RemoveAppConsentForGroup, + bool(const std::string& policy_app_id, + const std::string& functional_group)); +}; + +} // namespace policy_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_PT_EXT_REPRESENTATION_H_ diff --git a/src/components/policy/policy_external/test/include/policy/mock_pt_representation.h b/src/components/policy/policy_external/test/include/policy/mock_pt_representation.h new file mode 100644 index 0000000000..995c63ed20 --- /dev/null +++ b/src/components/policy/policy_external/test/include/policy/mock_pt_representation.h @@ -0,0 +1,109 @@ +/* Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_PT_REPRESENTATION_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_PT_REPRESENTATION_H_ + +#include <string> +#include <vector> + +#include "gmock/gmock.h" + +#include "policy/pt_representation.h" +#include "rpc_base/rpc_base.h" +#include "policy/policy_table/types.h" + +namespace policy_table = ::rpc::policy_table_interface_base; + +namespace test { +namespace components { +namespace policy_test { + +class MockPTRepresentation : virtual public ::policy::PTRepresentation { + public: + MOCK_METHOD4(CheckPermissions, + void(const ::policy::PTString& app_id, + const ::policy::PTString& hmi_level, + const ::policy::PTString& rpc, + ::policy::CheckPermissionResult& result)); + MOCK_METHOD0(IsPTPreloaded, bool()); + MOCK_METHOD0(IgnitionCyclesBeforeExchange, int()); + MOCK_METHOD1(KilometersBeforeExchange, int(int current)); + MOCK_METHOD2(SetCountersPassedForSuccessfulUpdate, + bool(int kilometers, int days_after_epoch)); + MOCK_METHOD1(DaysBeforeExchange, int(uint16_t current)); + MOCK_METHOD0(IncrementIgnitionCycles, void()); + MOCK_METHOD0(ResetIgnitionCycles, void()); + MOCK_METHOD0(TimeoutResponse, int()); + MOCK_METHOD1(SecondsBetweenRetries, bool(std::vector<int>* seconds)); + MOCK_METHOD2(GetPriority, + bool(const std::string& app_id, std::string* priority)); + MOCK_CONST_METHOD0(GetVehicleInfo, const ::policy::VehicleInfo()); + MOCK_METHOD1(SetVINValue, bool(const std::string& value)); + MOCK_METHOD2(GetUserFriendlyMsg, + std::vector< ::policy::UserFriendlyMessage>( + const std::vector<std::string>& msg_code, + const std::string& language)); + MOCK_METHOD2(GetUpdateUrls, void(int service_type, ::policy::EndpointUrls&)); + MOCK_METHOD1(GetNotificationsNumber, int(const std::string& priority)); + MOCK_METHOD0(Init, ::policy::InitResult()); + MOCK_METHOD0(Close, bool()); + MOCK_METHOD0(Clear, bool()); + MOCK_METHOD0(Drop, bool()); + MOCK_CONST_METHOD0(GenerateSnapshot, utils::SharedPtr<policy_table::Table>()); + MOCK_METHOD1(Save, bool(const policy_table::Table& table)); + MOCK_CONST_METHOD0(UpdateRequired, bool()); + MOCK_METHOD1(SaveUpdateRequired, void(bool value)); + MOCK_METHOD3(GetInitialAppData, + bool(const std::string& app_id, + ::policy::StringArray* nicknames, + ::policy::StringArray* app_types)); + + MOCK_METHOD4(SaveApplicationCustomData, + bool(const std::string& app_id, + bool is_revoked, + bool is_default, + bool is_predata)); + + MOCK_CONST_METHOD1(IsApplicationRevoked, bool(const std::string& app_id)); + MOCK_METHOD1(GetFunctionalGroupings, + bool(policy_table::FunctionalGroupings& groups)); + MOCK_CONST_METHOD1(IsApplicationRepresented, bool(const std::string& app_id)); + MOCK_CONST_METHOD1(IsDefaultPolicy, bool(const std::string& app_id)); + MOCK_METHOD1(SetDefaultPolicy, bool(const std::string& app_id)); + MOCK_CONST_METHOD1(IsPredataPolicy, bool(const std::string& app_id)); +}; + +} // namespace policy_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_PT_REPRESENTATION_H_ diff --git a/src/components/policy/policy_external/test/include/policy/mock_update_status_manager.h b/src/components/policy/policy_external/test/include/policy/mock_update_status_manager.h new file mode 100644 index 0000000000..a1c808d23a --- /dev/null +++ b/src/components/policy/policy_external/test/include/policy/mock_update_status_manager.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_UPDATE_STATUS_MANAGER_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_UPDATE_STATUS_MANAGER_H_ + +#include "gmock/gmock.h" + +#include "policy/update_status_manager.h" + +namespace test { +namespace components { +namespace policy_test { + +class MockUpdateStatusManager : public ::policy::UpdateStatusManager { + public: + MOCK_METHOD1(set_listener, void(PolicyListener* listener)); + MOCK_METHOD1(OnUpdateSentOut, void(uint32_t update_timeout)); + MOCK_METHOD0(OnUpdateTimeoutOccurs, void()); + MOCK_METHOD0(OnValidUpdateReceived, void()); + MOCK_METHOD0(OnWrongUpdateReceived, void()); + MOCK_METHOD1(OnResetDefaultPT, void(bool is_update_required)); + MOCK_METHOD0(OnResetRetrySequence, void()); + MOCK_METHOD1(OnNewApplicationAdded, void(const DeviceConsent)); + MOCK_METHOD1(OnPolicyInit, void(bool is_update_required)); + MOCK_METHOD0(GetUpdateStatus, PolicyTableStatus()); +}; + +} // namespace policy_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_MOCK_UPDATE_STATUS_MANAGER_H_ diff --git a/src/components/policy/policy_external/test/include/policy/policy_manager_impl_test_base.h b/src/components/policy/policy_external/test/include/policy/policy_manager_impl_test_base.h new file mode 100644 index 0000000000..e0fc308cbc --- /dev/null +++ b/src/components/policy/policy_external/test/include/policy/policy_manager_impl_test_base.h @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_POLICY_MANAGER_IMPL_TEST_BASE_H_ +#define SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_POLICY_MANAGER_IMPL_TEST_BASE_H_ + +#include <string> +#include <vector> + +#include "gtest/gtest.h" + +#include "policy/policy_manager_impl.h" + +#include "policy/mock_cache_manager.h" +#include "policy/mock_update_status_manager.h" +#include "policy/mock_policy_listener.h" +#include "policy/mock_policy_settings.h" + +namespace test { +namespace components { +namespace policy_test { + +using ::testing::NiceMock; +using ::policy::PolicyManagerImpl; + +typedef std::multimap<std::string, policy_table::Rpcs&> + UserConsentPromptToRpcsConnections; + +typedef utils::SharedPtr<policy_table::Table> PolicyTableSPtr; + +namespace { +const std::string kSdlPreloadedPtJson = "json/sdl_preloaded_pt.json"; +const std::string kSdlPreloadedPtJson2 = "json/sdl_preloaded_pt1.json"; +const std::string kFilePtUpdateJson = "json/file_pt_update.json"; +const std::string kHmiLevelFull = "FULL"; +const std::string kHmiLevelLimited = "LIMITED"; +const std::string kHmiLevelBackground = "BACKGROUND"; +const std::string kHmiLevelNone = "None"; + +const std::string kPtuJson = "json/PTU.json"; +const std::string kPtu3Json = "json/PTU3.json"; +const std::string kValidSdlPtUpdateJson = "json/valid_sdl_pt_update.json"; +const std::string kPtuRequestTypeJson = "json/ptu_requestType.json"; +const std::string kPtu2RequestTypeJson = "json/ptu2_requestType.json"; +} // namespace + +struct StringsForUpdate { + std::string new_field_value_; + std::string new_field_name_; + std::string new_date_; +}; + +char GenRandomChar(char range_from, char range_to); +struct StringsForUpdate CreateNewRandomData(StringsForUpdate& str); +void CheckIsParamInList(const ::policy::RPCParams& list, + const std::string& parameter); +Json::Value createPTforLoad(); +void InsertRpcParametersInList(::policy::RPCParams& input_params); + +template <typename T> +void SortAndCheckEquality(std::vector<T> first, std::vector<T> second) { + ASSERT_EQ(first.size(), second.size()); + std::sort(first.begin(), first.end()); + std::sort(second.begin(), second.end()); + + EXPECT_TRUE(std::equal(first.begin(), first.end(), second.begin())); +} + +template <typename T> +std::string NumberToString(T Number) { + std::ostringstream ss; + ss << Number; + return ss.str(); +} + +class PolicyManagerImplTest : public ::testing::Test { + public: + PolicyManagerImplTest(); + + protected: + const std::string unpaired_device_id_; + + PolicyManagerImpl* manager_; + MockCacheManagerInterface* cache_manager_; + MockUpdateStatusManager update_manager_; + NiceMock<MockPolicyListener> listener_; + + void SetUp() OVERRIDE; + + void TearDown() OVERRIDE; + + ::testing::AssertionResult IsValid(const policy_table::Table& table); +}; + +class PolicyManagerImplTest2 : public ::testing::Test { + public: + PolicyManagerImplTest2(); + + protected: + const std::string app_id_1_; + const std::string app_id_2_; + const std::string app_id_3_; + const std::string device_id_1_; + const std::string device_id_2_; + const std::string application_id_; + const std::string app_storage_folder_; + const std::string preloadet_pt_filename_; + const bool in_memory_; + + PolicyManagerImpl* manager_; + NiceMock<MockPolicyListener> listener_; + ::policy::StringArray hmi_level_; + ::policy::StringArray pt_request_types_; + size_t ptu_request_types_size_; + uint32_t index_; + Json::Value ptu_request_types_; + NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; + + void SetUp() OVERRIDE; + + ::policy::StringArray JsonToVectorString( + const Json::Value& PTU_request_types); + + const Json::Value GetPTU(const std::string& file_name); + + void CreateLocalPT(const std::string& file_name); + + void AddRTtoPT(const std::string& update_file_name, + const std::string& section_name, + const uint32_t rt_number, + const uint32_t invalid_rt_number); + + void AddRTtoAppSectionPT(const std::string& update_file_name, + const std::string& section_name, + const uint32_t rt_number, + const uint32_t invalid_rt_number); + + std::vector<policy_table::RequestType> PushRequestTypesToContainer( + const ::policy::StringArray& temp_result); + + void CheckResultForValidRT(); + + void CheckResultForInvalidRT(); + + void FillMultimapFromFunctionalGroupings( + UserConsentPromptToRpcsConnections& input_multimap, + policy_table::FunctionalGroupings& fg_table); + + void GetFunctionalGroupingsFromManager( + policy_table::FunctionalGroupings& input_functional_groupings); + + void TearDown() OVERRIDE; + + void ResetOutputList(::policy::CheckPermissionResult& output); + // To avoid duplicate test with different json files + void CheckPermissions_AllParamsAllowed_CheckRpcsInDiffLvls( + const std::string& update_file); + + // To avoid duplicates in tests + void CheckRpcPermissions(const std::string& rpc_name, + const PermitResult& expected_permission); + + // To avoid duplicate arrange of test + void AddSetDeviceData(); + + // Load Json File and set it as PTU + void LoadPTUFromJsonFile(const std::string& update_file); +}; + +class PolicyManagerImplTest_RequestTypes : public ::testing::Test { + public: + PolicyManagerImplTest_RequestTypes(); + + protected: + const ::policy::StringArray kJsonFiles; + const std::string kAppId; + const std::string kDefaultAppId; + const std::string app_storage_folder_; + const std::string preloadet_pt_filename_; + + utils::SharedPtr<PolicyManagerImpl> policy_manager_impl_sptr_; + NiceMock<MockPolicyListener> listener_; + NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; + + void SetUp() OVERRIDE; + + const Json::Value GetPTU(const std::string& file_name); + + void RefreshPT(const std::string& preloaded_pt_file, + const std::string& update_pt_file); + + PolicyTableSPtr GetPolicyTableSnapshot(); + + policy_table::RequestTypes GetRequestTypesForApplication( + const std::string& app_id); + + void CompareAppRequestTypesWithDefault(const std::string& app_id, + const std::string& ptu_file); + + policy_table::RequestTypes CreateDefaultAppPTURequestValues(); + + policy_table::RequestTypes CreateDefaultAppDatabaseRequestValues(); + + policy_table::RequestTypes CreatePreDataConsentAppPTURequestValues(); + + void CompareRequestTypesContainers( + const policy_table::RequestTypes& expected_data, + const policy_table::RequestTypes& received_data); + + void TearDown() OVERRIDE; +}; + +} // namespace policy_test +} // namespace components +} // namespace test + +#endif // SRC_COMPONENTS_POLICY_POLICY_EXTERNAL_TEST_INCLUDE_POLICY_POLICY_MANAGER_IMPL_TEST_BASE_H_ diff --git a/src/components/policy/policy_external/test/json/PTU.json b/src/components/policy/policy_external/test/json/PTU.json new file mode 100644 index 0000000000..7316c7539d --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU.json @@ -0,0 +1,2153 @@ +{ + "policy_table": { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "1234": "default", + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + } + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU2.json b/src/components/policy/policy_external/test/json/PTU2.json new file mode 100644 index 0000000000..c1a6bccb68 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU2.json @@ -0,0 +1,2152 @@ +{ + "policy_table": { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ], + "RequestType": [] + }, + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + } + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU3.json b/src/components/policy/policy_external/test/json/PTU3.json new file mode 100644 index 0000000000..56939a789a --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU3.json @@ -0,0 +1,2154 @@ +{ + "policy_table": { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "1234": "default", + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY", + "INVALID_REQUEST_TYPE" + ] + } + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_default_app.json b/src/components/policy/policy_external/test/json/PTU_default_app.json new file mode 100644 index 0000000000..833d46316a --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_default_app.json @@ -0,0 +1,319 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY", + "LOCK_SCREEN_ICON_URL" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_default_app_app_invalid_values_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_default_app_app_invalid_values_RequestType_array.json new file mode 100644 index 0000000000..1e5b1c46a4 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_default_app_app_invalid_values_RequestType_array.json @@ -0,0 +1,317 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "IVSU", + "BREAK_STUFF" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_default_app_empty_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_default_app_empty_RequestType_array.json new file mode 100644 index 0000000000..76365ee4bb --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_default_app_empty_RequestType_array.json @@ -0,0 +1,314 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_default_app_omitted_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_default_app_omitted_RequestType_array.json new file mode 100644 index 0000000000..b380fa2de5 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_default_app_omitted_RequestType_array.json @@ -0,0 +1,313 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_default_app_one_invalid_value_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_default_app_one_invalid_value_RequestType_array.json new file mode 100644 index 0000000000..b8793b6cdc --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_default_app_one_invalid_value_RequestType_array.json @@ -0,0 +1,320 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "IVSU", + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY", + "LOCK_SCREEN_ICON_URL" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_functional_grouping.json b/src/components/policy/policy_external/test/json/PTU_functional_grouping.json new file mode 100644 index 0000000000..5a8837c0bc --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_functional_grouping.json @@ -0,0 +1,11 @@ +"Added-Group-1": { + "rpcs": { + "AddedFunction1": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }
\ No newline at end of file diff --git a/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app.json b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app.json new file mode 100644 index 0000000000..833d46316a --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app.json @@ -0,0 +1,319 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY", + "LOCK_SCREEN_ICON_URL" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_empty_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_empty_RequestType_array.json new file mode 100644 index 0000000000..8a183b45d5 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_empty_RequestType_array.json @@ -0,0 +1,314 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY", + "LOCK_SCREEN_ICON_URL" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_invalid_values_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_invalid_values_RequestType_array.json new file mode 100644 index 0000000000..6ffc42c3e4 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_invalid_values_RequestType_array.json @@ -0,0 +1,315 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "IVSU", + "BREAK_STUFF" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "IVSU", + "BREAK_STUFF" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_omitted_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_omitted_RequestType_array.json new file mode 100644 index 0000000000..24d0871d18 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_omitted_RequestType_array.json @@ -0,0 +1,307 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_one_invalid_value_RequestType_array.json b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_one_invalid_value_RequestType_array.json new file mode 100644 index 0000000000..b674913268 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_pre_data_consent_app_one_invalid_value_RequestType_array.json @@ -0,0 +1,320 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY", + "LOCK_SCREEN_ICON_URL" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "IVSU", + "FILE_RESUME", + "AUTH_REQUEST", + "AUTH_CHALLENGE", + "AUTH_ACK" + ] + } + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_with_empty_requestType_array.json b/src/components/policy/policy_external/test/json/PTU_with_empty_requestType_array.json new file mode 100644 index 0000000000..7e0836a805 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_with_empty_requestType_array.json @@ -0,0 +1,1727 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "HTTP", + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_with_invalid_requestType_between_correct.json b/src/components/policy/policy_external/test/json/PTU_with_invalid_requestType_between_correct.json new file mode 100644 index 0000000000..a056c3ce9c --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_with_invalid_requestType_between_correct.json @@ -0,0 +1,1730 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "HTTP", + "IVSU", + "LAUNCH_APP", + "PROPRIETARY" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "HTTP", + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_with_one_invalid_requestType.json b/src/components/policy/policy_external/test/json/PTU_with_one_invalid_requestType.json new file mode 100644 index 0000000000..c7e0a727fe --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_with_one_invalid_requestType.json @@ -0,0 +1,1727 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000, + "RequestType" : [ "IVSU" ] + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "HTTP", + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/PTU_without_requestType_field.json b/src/components/policy/policy_external/test/json/PTU_without_requestType_field.json new file mode 100644 index 0000000000..a96ef74bd1 --- /dev/null +++ b/src/components/policy/policy_external/test/json/PTU_without_requestType_field.json @@ -0,0 +1,1726 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester", "tester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000 + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false, + "RequestType": [ + "HTTP", + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "heart_beat_timeout_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/preloadedPT_with_invalid_default_reqestType_between_valid.json b/src/components/policy/policy_external/test/json/preloadedPT_with_invalid_default_reqestType_between_valid.json new file mode 100644 index 0000000000..4c1bf19005 --- /dev/null +++ b/src/components/policy/policy_external/test/json/preloadedPT_with_invalid_default_reqestType_between_valid.json @@ -0,0 +1,1944 @@ + { + "policy_table": { + "module_config": { + "preloaded_pt": true, + "preloaded_date": "2015-02-12", + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 70, + "seconds_between_retries": [1, + 5, + 25, + 125, + 625], + "endpoints": { + "0x07": { + "default": ["http://policies.telematics.ford.com/api/policies"] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "AddSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Alert": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EndAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GenericResponse": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnButtonEvent": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnButtonPress": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnDriverDistraction": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PerformAudioPassThru": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PerformInteraction": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ResetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ScrollableMessage": { + "hmi_levels": ["FULL"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SetMediaClockTimer": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "Show": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Slider": { + "hmi_levels": ["FULL"] + }, + "Speak": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "SubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnsubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": ["BACKGROUND"] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GetDTCs": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ReadDID": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ShowConstantTBT": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "UpdateTurnList": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["Base-4"], + "RequestType": [ + "QUERY_APPS", + "IVSU", + "PROPRIETARY" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["DataConsent-2"] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["BaseBeforeDataConsent"], + "RequestType": ["HTTP"] + } + } + } + } diff --git a/src/components/policy/policy_external/test/json/preloadedPT_with_invalid_default_requestType.json b/src/components/policy/policy_external/test/json/preloadedPT_with_invalid_default_requestType.json new file mode 100644 index 0000000000..02801cc976 --- /dev/null +++ b/src/components/policy/policy_external/test/json/preloadedPT_with_invalid_default_requestType.json @@ -0,0 +1,1942 @@ + { + "policy_table": { + "module_config": { + "preloaded_pt": true, + "preloaded_date": "2015-02-12", + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 70, + "seconds_between_retries": [1, + 5, + 25, + 125, + 625], + "endpoints": { + "0x07": { + "default": ["http://policies.telematics.ford.com/api/policies"] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "AddSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Alert": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EndAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GenericResponse": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnButtonEvent": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnButtonPress": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnDriverDistraction": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PerformAudioPassThru": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PerformInteraction": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ResetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ScrollableMessage": { + "hmi_levels": ["FULL"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SetMediaClockTimer": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "Show": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Slider": { + "hmi_levels": ["FULL"] + }, + "Speak": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "SubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnsubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": ["BACKGROUND"] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GetDTCs": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ReadDID": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ShowConstantTBT": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "UpdateTurnList": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["Base-4"], + "RequestType": [ + "IVSU" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["DataConsent-2"] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["BaseBeforeDataConsent"], + "RequestType": ["HTTP"] + } + } + } + } diff --git a/src/components/policy/policy_external/test/json/preloadedPT_with_several_invalid_default_requestTypes.json b/src/components/policy/policy_external/test/json/preloadedPT_with_several_invalid_default_requestTypes.json new file mode 100644 index 0000000000..a9abeea5a2 --- /dev/null +++ b/src/components/policy/policy_external/test/json/preloadedPT_with_several_invalid_default_requestTypes.json @@ -0,0 +1,1943 @@ + { + "policy_table": { + "module_config": { + "preloaded_pt": true, + "preloaded_date": "2015-02-12", + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 70, + "seconds_between_retries": [1, + 5, + 25, + 125, + 625], + "endpoints": { + "0x07": { + "default": ["http://policies.telematics.ford.com/api/policies"] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "AddSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Alert": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EndAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GenericResponse": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnButtonEvent": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnButtonPress": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnDriverDistraction": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PerformAudioPassThru": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PerformInteraction": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ResetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ScrollableMessage": { + "hmi_levels": ["FULL"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SetMediaClockTimer": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "Show": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Slider": { + "hmi_levels": ["FULL"] + }, + "Speak": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "SubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnsubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": ["BACKGROUND"] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GetDTCs": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ReadDID": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ShowConstantTBT": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "UpdateTurnList": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["Base-4"], + "RequestType": [ + "IVSU1", + "IVSU2" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["DataConsent-2"] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["BaseBeforeDataConsent"], + "RequestType": ["HTTP"] + } + } + } + } diff --git a/src/components/policy/policy_external/test/json/ptu2_requestType.json b/src/components/policy/policy_external/test/json/ptu2_requestType.json new file mode 100644 index 0000000000..899e58a68d --- /dev/null +++ b/src/components/policy/policy_external/test/json/ptu2_requestType.json @@ -0,0 +1,2615 @@ +{ + "policy_table" : { + "module_config": { + "preloaded_date": "2015-12-02", + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + }, + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED", + "BACKGROUND" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED", + "BACKGROUND" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL", + "LIMITED", + "BACKGROUND" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Base-6": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnTBTClientState": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.021", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. \n\nSi presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. \n\nLas actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. \n\nPresione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements.\r\n\r\nVeuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "EMERGENCY", + "default_hmi": "LIMITED", + "groups": [ + "Base-4" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ], + "preconsented_groups": [ + "BaseBeforeDataConsent" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "584421907": { + "keep_context" : false, + "steal_focus" : false, + "priority" + : "NONE", + "default_hmi" + : "NONE", + "groups" : + ["BaseBeforeDataConsent"], + "RequestType" :[ + "TRAFFIC_MESSAGE_CHANNEL", + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + } + } + } +} diff --git a/src/components/policy/policy_external/test/json/ptu_requestType.json b/src/components/policy/policy_external/test/json/ptu_requestType.json new file mode 100644 index 0000000000..a1f085ac74 --- /dev/null +++ b/src/components/policy/policy_external/test/json/ptu_requestType.json @@ -0,0 +1,2605 @@ +{ + "policy_table": { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + }, + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED", + "BACKGROUND" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED", + "BACKGROUND" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL", + "LIMITED", + "BACKGROUND" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Base-6": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnTBTClientState": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "FULL" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.021", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. \n\nSi presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. \n\nLas actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. \n\nPresione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements.\r\n\r\nVeuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "584421907": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ], + "RequestType": [ + "PROPRIETARY" + ] + }, + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ], + "RequestType": [ + "PROPRIETARY" + ] + } + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_preloaded_pt.json b/src/components/policy/policy_external/test/json/sdl_preloaded_pt.json new file mode 100644 index 0000000000..d6f34c12fc --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_preloaded_pt.json @@ -0,0 +1,1944 @@ + { + "policy_table": { + "module_config": { + "preloaded_pt": true, + "preloaded_date": "2015-02-12", + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 30, + "timeout_after_x_seconds": 70, + "seconds_between_retries": [1, + 5, + 25, + 125, + 625], + "endpoints": { + "0x07": { + "default": ["http://policies.telematics.ford.com/api/policies"] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "AddSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Alert": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "DeleteSubMenu": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EndAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GenericResponse": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAudioPassThru": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnButtonEvent": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnButtonPress": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "OnCommand": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnDriverDistraction": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PerformAudioPassThru": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PerformInteraction": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ResetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ScrollableMessage": { + "hmi_levels": ["FULL"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetGlobalProperties": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SetMediaClockTimer": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "Show": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "Slider": { + "hmi_levels": ["FULL"] + }, + "Speak": { + "hmi_levels": ["FULL", + "LIMITED"] + }, + "SubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnsubscribeButton": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["gps", + "speed"] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": ["BACKGROUND"] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle"] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus"] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "GetDTCs": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ReadDID": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "OnVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "SubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + }, + "UnsubscribeVehicleData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"], + "parameters": ["airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent"] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "ShowConstantTBT": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + }, + "UpdateTurnList": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED"] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "DeleteFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "EncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "ListFiles": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnEncodedSyncPData": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHashChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnHMIStatus": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnLanguageChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnPermissionsChange": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "OnSystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "PutFile": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "RegisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetAppIcon": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SetDisplayLayout": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "SystemRequest": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + }, + "UnregisterAppInterface": { + "hmi_levels": ["BACKGROUND", + "FULL", + "LIMITED", + "NONE"] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.019", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. \n\nIf you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%’s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar. \n\n Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?" + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with AppLink. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible" + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\n\nTo use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S.\n\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Para usar aplicaciones móviles con SYNC, este debe comunicarse con Ford al menos una vez al mes a través del plan de datos de su dispositivo móvil. Pueden aplicar tarifas normales. SYNC enviará su VIN y el número de módulo de SYNC a Ford de Estados Unidos de América. Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario. /r Presione Sí para permitir y No para denegar." + }, + "fr-ca": { + "textBody": "Pour utiliser AppLink, SYNC devra communiquer avec Ford au moins une fois par mois en utilisant le forfait de données de votre appareil mobile. Les tarifs réguliers peuvent s’appliquer. SYNC enverra votre NIV et le numéro de votre module SYNC à Ford États-Unis. Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements. /r Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. See your Owner Guide for more information." + }, + "es-en": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?" + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push" + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app authorization information for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo" + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus.", + "label": "Renseignements du véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["Base-4"], + "RequestType": [ + "QUERY_APPS", + "LAUNCH_APP", + "PROPRIETARY" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["DataConsent-2"] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": ["BaseBeforeDataConsent"], + "RequestType": ["HTTP"] + } + } + } + } diff --git a/src/components/policy/policy_external/test/json/sdl_preloaded_pt1.json b/src/components/policy/policy_external/test/json/sdl_preloaded_pt1.json new file mode 100644 index 0000000000..78c5f873d9 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_preloaded_pt1.json @@ -0,0 +1,2413 @@ + +{ + "policy_table" : + { + "app_policies" : + { + "default" : + { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : + { + "default_hmi" : "NONE", + "groups" : [ "DataConsent-2" ], + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : + { + "default_hmi" : "BACKGROUND", + "groups" : [ "BaseBeforeDataConsent" ], + "keep_context" : false, + "priority" : "EMERGENCY", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : + { + "messages" : + { + "AppPermissions" : + { + "languages" : + { + "de-de" : + { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : + { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : + { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "textBody" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu.", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : + { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : + { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "textBody" : "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent.", + "tts" : "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny." + }, + "es-en" : + { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "textBody" : "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior.", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : + { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : + { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "textBody" : "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior.", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : + { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "textBody" : "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens.", + "tts" : "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : + { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : + { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : + { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : + { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : + { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : + { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : + { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : + { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : + { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : + { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : + { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : + { + "languages" : + { + "de-de" : + { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : + { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : + { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : + { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : + { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : + { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : + { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : + { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : + { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : + { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : + { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : + { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : + { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : + { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : + { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : + { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : + { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : + { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : + { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : + { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : + { + "languages" : + { + "de-de" : + { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : + { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : + { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : + { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : + { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : + { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : + { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : + { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : + { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : + { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : + { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : + { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : + { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : + { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : + { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : + { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : + { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : + { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : + { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : + { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : + { + "languages" : + { + "de-de" : + { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : + { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : + { + "line1" : "not authorized", + "textBody" : "This version of %appName% is not authorized and will not work with SYNC.", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : + { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : + { + "line1" : "Not Authorized", + "textBody" : "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%.", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : + { + "line1" : "no autorizada", + "textBody" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : + { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : + { + "line1" : "no autorizada", + "textBody" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : + { + "line1" : "non autorisée", + "textBody" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : + { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : + { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : + { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : + { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : + { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : + { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : + { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : + { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : + { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : + { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : + { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : + { + "languages" : + { + "de-de" : + { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : + { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : + { + "line1" : "not supported", + "textBody" : "This version of %appName% is not supported by SYNC.", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : + { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : + { + "line1" : "Not Supported", + "textBody" : "Your version of %appName% is not supported by SYNC.", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : + { + "line1" : "no compatible", + "textBody" : "Esta versión de %appName% no es compatible con SYNC.", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : + { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : + { + "line1" : "no compatible", + "textBody" : "Esta versión de %appName% no es compatible con SYNC.", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : + { + "line1" : "incompatible", + "textBody" : "Cette version de %appName% n’est pas prise en charge par SYNC.", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : + { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : + { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : + { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : + { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : + { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : + { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : + { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : + { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : + { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : + { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : + { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : + { + "languages" : + { + "en-gb" : + { + "textBody" : "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us" : + { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "textBody" : "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx" : + { + "textBody" : "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca" : + { + "textBody" : "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp" : + { + "languages" : + { + "en-us" : + { + "textBody" : "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx" : + { + "textBody" : "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca" : + { + "textBody" : "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps" : + { + "languages" : + { + "de-de" : + { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : + { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : + { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "textBody" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : + { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : + { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "textBody" : "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel.", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : + { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "textBody" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : + { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : + { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "textBody" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : + { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "textBody" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : + { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : + { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : + { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : + { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : + { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : + { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : + { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : + { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : + { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : + { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : + { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : + { + "languages" : + { + "de-de" : + { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : + { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : + { + "label" : "Driving characteristics", + "textBody" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : + { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : + { + "label" : "Driving Characteristics", + "textBody" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en" : + { + "label" : "Características del manejo", + "textBody" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : + { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : + { + "label" : "Características del manejo", + "textBody" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca" : + { + "label" : "Caractéristiques de conduite", + "textBody" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr" : + { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : + { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : + { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : + { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : + { + "label" : "Características de condução", + "line1" : "Caract. Condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : + { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : + { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : + { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : + { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : + { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : + { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : + { + "languages" : + { + "de-de" : + { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : + { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : + { + "label" : "GPS and speed", + "textBody" : "An app can access vehicle GPS and speed.", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : + { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : + { + "label" : "GPS and Speed", + "textBody" : "An app can access vehicle GPS and speed.", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : + { + "label" : "GPS y velocidad", + "textBody" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : + { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : + { + "label" : "GPS y velocidad", + "textBody" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : + { + "label" : "GPS et Vitesse", + "textBody" : "Une application peut accéder au GPS et à la vitesse du véhicule.", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : + { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : + { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : + { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : + { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : + { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : + { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : + { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : + { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : + { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : + { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : + { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : + { + "languages" : + { + "de-de" : + { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : + { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : + { + "label" : "Push notifications", + "textBody" : "An app can send notifications when running in the background.", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : + { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : + { + "label" : "Push Notifications", + "textBody" : "An app can send notifications when running in the background.", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : + { + "label" : "Notificaciones tipo Push", + "textBody" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : + { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : + { + "label" : "Notificaciones tipo Push", + "textBody" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : + { + "label" : "Notifications Instantanées", + "textBody" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : + { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : + { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : + { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : + { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : + { + "label" : "Notificações Push", + "line1" : "Notificações", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : + { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : + { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : + { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : + { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : + { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : + { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingAppPermissions" : + { + "languages" : + { + "en-us" : + { + "textBody" : "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx" : + { + "textBody" : "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca" : + { + "textBody" : "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates" : + { + "languages" : + { + "de-de" : + { + "line1" : "Updates deakt." + }, + "en-au" : + { + "line1" : "Disable updates" + }, + "en-gb" : + { + "line1" : "Disable updates" + }, + "en-ie" : + { + "line1" : "Disable updates" + }, + "en-us" : + { + "line1" : "Disable Updates", + "textBody" : "Disable Updates" + }, + "es-en" : + { + "line1" : "Deshab. actual.", + "textBody" : "Deshab. actual." + }, + "es-es" : + { + "line1" : "Desact. actual." + }, + "es-mx" : + { + "line1" : "Deshab. actual.", + "textBody" : "Deshab. actual." + }, + "fr-ca" : + { + "line1" : "Désactiver MAJ", + "textBody" : "Désactiver MAJ" + }, + "fr-fr" : + { + "line1" : "Désactiver màj" + }, + "it-it" : + { + "line1" : "Disabilita agg." + }, + "nl-nl" : + { + "line1" : "Upd. uitschak." + }, + "pl-pl" : + { + "line1" : "Wyłącz aktual." + }, + "pt-br" : + { + "line1" : "Desat. atualiz." + }, + "pt-pt" : + { + "line1" : "Desact. actualiz." + }, + "ru-ru" : + { + "line1" : "Откл. обновл." + }, + "sv-se" : + { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : + { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : + { + "line1" : "禁用更新" + }, + "zh-tw" : + { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : + { + "languages" : + { + "de-de" : + { + "line1" : "Apps aktivieren" + }, + "en-au" : + { + "line1" : "Enable Apps" + }, + "en-gb" : + { + "line1" : "Enable Apps" + }, + "en-ie" : + { + "line1" : "Enable Apps" + }, + "en-us" : + { + "line1" : "Enable Apps" + }, + "es-en" : + { + "line1" : "Hab. aplic." + }, + "es-es" : + { + "line1" : "Activar apl." + }, + "es-mx" : + { + "line1" : "Hab. aplic." + }, + "fr-ca" : + { + "line1" : "Activer app.", + "textBody" : "Activer app." + }, + "fr-fr" : + { + "line1" : "Activer app." + }, + "it-it" : + { + "line1" : "Abilita app" + }, + "nl-nl" : + { + "line1" : "Apps inschak." + }, + "pl-pl" : + { + "line1" : "Włącz aplikacje" + }, + "pt-br" : + { + "line1" : "Ativar aplic." + }, + "pt-pt" : + { + "line1" : "Activar actualiz." + }, + "ru-ru" : + { + "line1" : "Вкл. прилож." + }, + "sv-se" : + { + "line1" : "Aktivera appar" + }, + "tr-tr" : + { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : + { + "line1" : "启用应用程序" + }, + "zh-tw" : + { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : + { + "languages" : + { + "de-de" : + { + "line1" : "Update anford." + }, + "en-au" : + { + "line1" : "Request update" + }, + "en-gb" : + { + "line1" : "Request update" + }, + "en-ie" : + { + "line1" : "Request update" + }, + "en-us" : + { + "line1" : "Request Update", + "textBody" : "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en" : + { + "line1" : "Solicit. actualiz.", + "textBody" : "Solicit. actualiz." + }, + "es-es" : + { + "line1" : "Solicitar actual." + }, + "es-mx" : + { + "line1" : "Solicit. actualiz.", + "textBody" : "Solicit. actualiz." + }, + "fr-ca" : + { + "line1" : "Demander MAJ", + "textBody" : "Demander MAJ" + }, + "fr-fr" : + { + "line1" : "Demander màj" + }, + "it-it" : + { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : + { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : + { + "line1" : "Zażądaj aktual." + }, + "pt-br" : + { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : + { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : + { + "line1" : "Запрос на обн." + }, + "sv-se" : + { + "line1" : "Begär uppdat." + }, + "tr-tr" : + { + "line1" : "Güncelleme iste" + }, + "zh-cn" : + { + "line1" : "请求更新" + }, + "zh-tw" : + { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : + { + "languages" : + { + "de-de" : + { + "line1" : "Update benötigt" + }, + "en-au" : + { + "line1" : "Update needed" + }, + "en-gb" : + { + "line1" : "Update needed", + "textBody" : "Update needed" + }, + "en-ie" : + { + "line1" : "Update needed" + }, + "en-us" : + { + "line1" : "Update Needed", + "textBody" : "Update Needed" + }, + "es-en" : + { + "line1" : "Actualiz. neces.", + "textBody" : "Actualiz. neces." + }, + "es-es" : + { + "line1" : "Actu. necesaria" + }, + "es-mx" : + { + "line1" : "Actualiz. neces.", + "textBody" : "Actualiz. neces." + }, + "fr-ca" : + { + "line1" : "Màj requise", + "textBody" : "Màj requise" + }, + "fr-fr" : + { + "line1" : "Mise à jour requise" + }, + "it-it" : + { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : + { + "line1" : "Update nodig" + }, + "pl-pl" : + { + "line1" : "Potrzeba aktual." + }, + "pt-br" : + { + "line1" : "Atualiz. necess." + }, + "pt-pt" : + { + "line1" : "Actual. necess." + }, + "ru-ru" : + { + "line1" : "Необх. обновл." + }, + "sv-se" : + { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : + { + "line1" : "Güncellenmeli" + }, + "zh-cn" : + { + "line1" : "需要进行更新" + }, + "zh-tw" : + { + "line1" : "需更新" + } + } + }, + "StatusPending" : + { + "languages" : + { + "de-de" : + { + "line1" : "Aktualisieren..." + }, + "en-au" : + { + "line1" : "Updating..." + }, + "en-gb" : + { + "line1" : "Updating...", + "textBody" : "Updating..." + }, + "en-ie" : + { + "line1" : "Updating..." + }, + "en-us" : + { + "line1" : "Updating...", + "textBody" : "Updating..." + }, + "es-en" : + { + "line1" : "Actualizando...", + "textBody" : "Actualizando..." + }, + "es-es" : + { + "line1" : "Actualizando..." + }, + "es-mx" : + { + "line1" : "Actualizando...", + "textBody" : "Actualizando..." + }, + "fr-ca" : + { + "line1" : "MAJ en cours...", + "textBody" : "MAJ en cours..." + }, + "fr-fr" : + { + "line1" : "Màj en cours..." + }, + "it-it" : + { + "line1" : "Aggiornamento" + }, + "nl-nl" : + { + "line1" : "Updaten..." + }, + "pl-pl" : + { + "line1" : "Aktualizowanie" + }, + "pt-br" : + { + "line1" : "Atualizando..." + }, + "pt-pt" : + { + "line1" : "A actualizar..." + }, + "ru-ru" : + { + "line1" : "Обновление..." + }, + "sv-se" : + { + "line1" : "Uppdaterar..." + }, + "tr-tr" : + { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : + { + "line1" : "正在更新......" + }, + "zh-tw" : + { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : + { + "languages" : + { + "de-de" : + { + "line1" : "Aktuelle Version" + }, + "en-au" : + { + "line1" : "Up-to-date" + }, + "en-gb" : + { + "line1" : "Up-to-date", + "textBody" : "Up-to-date" + }, + "en-ie" : + { + "line1" : "Up-to-date" + }, + "en-us" : + { + "line1" : "Up-To-Date", + "textBody" : "Up-To-Date" + }, + "es-en" : + { + "line1" : "Actualizado", + "textBody" : "Actualizado" + }, + "es-es" : + { + "line1" : "Actualizada" + }, + "es-mx" : + { + "line1" : "Actualizado", + "textBody" : "Actualizado" + }, + "fr-ca" : + { + "line1" : "Déjà à jour", + "textBody" : "Déjà à jour" + }, + "fr-fr" : + { + "line1" : "Déjà à jour" + }, + "it-it" : + { + "line1" : "più recente" + }, + "nl-nl" : + { + "line1" : "Up-to-date" + }, + "pl-pl" : + { + "line1" : "Aktualne" + }, + "pt-br" : + { + "line1" : "Atualizado" + }, + "pt-pt" : + { + "line1" : "Actualizado" + }, + "ru-ru" : + { + "line1" : "Обновлено" + }, + "sv-se" : + { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : + { + "line1" : "Güncel" + }, + "zh-cn" : + { + "line1" : "最新更新" + }, + "zh-tw" : + { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : + { + "languages" : + { + "de-de" : + { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : + { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : + { + "label" : "Vehicle information", + "textBody" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie" : + { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : + { + "label" : "Vehicle Information", + "textBody" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en" : + { + "label" : "Información del vehículo", + "textBody" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : + { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : + { + "label" : "Información del Vehículo", + "textBody" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca" : + { + "label" : "Renseignements du Véhicule", + "textBody" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr" : + { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : + { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : + { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : + { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : + { + "label" : "Informações sobre o veículo", + "line1" : "Inform. Veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : + { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : + { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : + { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : + { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : + { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : + { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.023" + }, + "functional_groupings" : + { + "BackgroundAPT" : + { + "rpcs" : + { + "EndAudioPassThru" : + { + "hmi_levels" : [ "BACKGROUND" ] + }, + "OnAudioPassThru" : + { + "hmi_levels" : [ "BACKGROUND" ] + }, + "PerformAudioPassThru" : + { + "hmi_levels" : [ "BACKGROUND" ] + } + } + }, + "Base-4" : + { + "rpcs" : + { + "AddCommand" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : + { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonPress" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnCommand" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHashChange" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSystemRequest" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PerformAudioPassThru" : + { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : + { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ScrollableMessage" : + { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetMediaClockTimer" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Show" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : + { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : + { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SystemRequest" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "BaseBeforeDataConsent" : + { + "rpcs" : + { + "ChangeRegistration" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EncodedSyncPData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ListFiles" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnEncodedSyncPData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHashChange" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSystemRequest" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetAppIcon" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SystemRequest" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + }, + "DataConsent-2" : + { + "rpcs" : null, + "user_consent_prompt" : "DataConsent" + }, + "DiagnosticMessageOnly" : + { + "rpcs" : + { + "DiagnosticMessage" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DialNumberOnly" : + { + "rpcs" : + { + "DialNumber" : + { + "hmi_levels" : [ "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : + { + "rpcs" : + { + "GetVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : + { + "rpcs" : + { + "GetVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "airbagStatus", "clusterModeStatus", "eCallInfo", "emergencyEvent" ] + }, + "OnVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "airbagStatus", "clusterModeStatus", "eCallInfo", "emergencyEvent" ] + }, + "SubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "airbagStatus", "clusterModeStatus", "eCallInfo", "emergencyEvent" ] + }, + "UnsubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "airbagStatus", "clusterModeStatus", "eCallInfo", "emergencyEvent" ] + } + } + }, + "Location-1" : + { + "rpcs" : + { + "GetVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : + { + "rpcs" : + { + "AlertManeuver" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : + { + "rpcs" : + { + "Alert" : + { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "Notifications-45" : + { + "rpcs" : + { + "MWTAA" : + { + "hmi_levels" : [ "LIMITED" ] + } + }, + "user_consent_prompt" : "Notifications-45" + }, + "Notifications-73" : + { + "rpcs" : + { + "STEHV" : + { + "hmi_levels" : [ "FULL" ] + } + }, + "user_consent_prompt" : "Notifications-73" + }, + "OnKeyboardInputOnlyGroup" : + { + "rpcs" : + { + "OnKeyboardInput" : + { + "hmi_levels" : [ "FULL" ] + } + } + }, + "OnTouchEventOnlyGroup" : + { + "rpcs" : + { + "OnTouchEvent" : + { + "hmi_levels" : [ "FULL" ] + } + } + }, + "PropriataryData-1" : + { + "rpcs" : + { + "DiagnosticMessage" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "PropriataryData-2" : + { + "rpcs" : + { + "DiagnosticMessage" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "ProprietaryData-3" : + { + "rpcs" : + { + "GetDTCs" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "SendLocation" : + { + "rpcs" : + { + "SendLocation" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "SendLocationOnly" : + { + "rpcs" : + { + "SendLocation" : + { + "hmi_levels" : [ "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : + { + "rpcs" : + { + "GetVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : + { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : + [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + } + }, + "module_config" : + { + "endpoints" : + { + "0x04" : + { + "default" : [ "http://ivsu.software.ford.com/api/getsoftwareupdates" ] + }, + "0x07" : + { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 20, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : + { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOM" : 20 + }, + "preloaded_date" : "2012-12-15", + "preloaded_pt" : true, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60 + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_preloaded_pt_send_location.json b/src/components/policy/policy_external/test/json/sdl_preloaded_pt_send_location.json new file mode 100644 index 0000000000..49f9a1da3a --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_preloaded_pt_send_location.json @@ -0,0 +1,2321 @@ +{ + "policy_table": { + "module_config": { + "preloaded_pt": true, + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + } + } + } +}
\ No newline at end of file diff --git a/src/components/policy/policy_external/test/json/sdl_pt_first_update.json b/src/components/policy/policy_external/test/json/sdl_pt_first_update.json new file mode 100644 index 0000000000..e6817da0d3 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_pt_first_update.json @@ -0,0 +1,1744 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000 + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "watchdog_timer_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "Notifications-2" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "FULL" ] + } + }, + "user_consent_prompt" : "Old_Notifications" + }, + "Notifications-3" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "LIMITED" ] + } + }, + "user_consent_prompt" : "Old_Notifications" + }, + "Notifications-4" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "NONE" ] + } + }, + "user_consent_prompt" : "New_Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_pt_second_update.json b/src/components/policy/policy_external/test/json/sdl_pt_second_update.json new file mode 100644 index 0000000000..d5f5f480f3 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_pt_second_update.json @@ -0,0 +1,1744 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000 + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "watchdog_timer_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "Notifications-2" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "FULL" ] + } + }, + "user_consent_prompt" : "Old_Notifications" + }, + "Notifications-3" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "LIMITED" ] + } + }, + "user_consent_prompt" : "New_Notifications" + }, + "Notifications-4" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "NONE" ] + } + }, + "user_consent_prompt" : "New_Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_pt_update.json b/src/components/policy/policy_external/test/json/sdl_pt_update.json new file mode 100644 index 0000000000..5047d832dd --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_pt_update.json @@ -0,0 +1,1728 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000 + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "watchdog_timer_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "Notifications2" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "FULL" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_have_params.json b/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_have_params.json new file mode 100644 index 0000000000..18b0a09040 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_have_params.json @@ -0,0 +1,2340 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "longitudeDegrees", + "latitudeDegrees", + "locationDescription", + "phoneNumber" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ], + "parameters": [ + "locationName", + "locationImage", + "deliveryMode" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation", "SendLocationOnly" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_no_params_in1.json b/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_no_params_in1.json new file mode 100644 index 0000000000..3530c01388 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_no_params_in1.json @@ -0,0 +1,2342 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "longitudeDegrees", + "latitudeDegrees", + "locationName", + "locationDescription", + "addressLines", + "phoneNumber", + "locationImage", + "deliveryMode", + "timeStamp", + "address" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ], + "parameters": [] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation", "SendLocationOnly" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_no_params_in1_omitted_in2.json b/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_no_params_in1_omitted_in2.json new file mode 100644 index 0000000000..e169aea24a --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_2_groups_no_params_in1_omitted_in2.json @@ -0,0 +1,2330 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ], + "parameters": [] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation", "SendLocationOnly" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_send_location.json b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location.json new file mode 100644 index 0000000000..df45a0be61 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location.json @@ -0,0 +1,2329 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_all_params.json b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_all_params.json new file mode 100644 index 0000000000..c471d6ec97 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_all_params.json @@ -0,0 +1,2341 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "longitudeDegrees", + "latitudeDegrees", + "locationName", + "locationDescription", + "addressLines", + "phoneNumber", + "locationImage", + "deliveryMode", + "timeStamp", + "address" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_no_params.json b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_no_params.json new file mode 100644 index 0000000000..29781d211c --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_no_params.json @@ -0,0 +1,2330 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_some_params.json b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_some_params.json new file mode 100644 index 0000000000..91be06a561 --- /dev/null +++ b/src/components/policy/policy_external/test/json/sdl_update_pt_send_location_some_params.json @@ -0,0 +1,2335 @@ +{ + "policy_table" : { + "module_config": { + "exchange_after_x_ignition_cycles": 100, + "exchange_after_x_kilometers": 1800, + "exchange_after_x_days": 20, + "timeout_after_x_seconds": 60, + "seconds_between_retries": [ + 1, + 5, + 25, + 125, + 625 + ], + "endpoints": { + "0x04": { + "default": [ + "http://ivsu.software.ford.com/api/getsoftwareupdates" + ] + }, + "0x07": { + "default": [ + "http://policies.telematics.ford.com/api/policies" + ] + } + }, + "notifications_per_minute_by_priority": { + "EMERGENCY": 60, + "NAVIGATION": 15, + "VOICECOM": 20, + "COMMUNICATION": 6, + "NORMAL": 4, + "NONE": 0 + } + }, + "functional_groupings": { + "Base-4": { + "rpcs": { + "AddCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "AddSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Alert": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "CreateInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteInteractionChoiceSet": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "DeleteSubMenu": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GenericResponse": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonEvent": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnButtonPress": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnCommand": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnDriverDistraction": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PerformInteraction": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ScrollableMessage": { + "hmi_levels": [ + "FULL" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetMediaClockTimer": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Show": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "Slider": { + "hmi_levels": [ + "FULL" + ] + }, + "Speak": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + }, + "SubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnsubscribeButton": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "Location-1": { + "user_consent_prompt": "Location", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "gps", + "speed" + ] + } + } + }, + "Notifications": { + "user_consent_prompt": "Notifications", + "rpcs": { + "Alert": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DrivingCharacteristics-3": { + "user_consent_prompt": "DrivingCharacteristics", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + } + }, + "VehicleInfo-3": { + "user_consent_prompt": "VehicleInfo", + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "bodyInformation", + "deviceStatus", + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + } + }, + "Emergency-1": { + "rpcs": { + "GetVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "airbagStatus", + "clusterModeStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Navigation-1": { + "rpcs": { + "AlertManeuver": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ShowConstantTBT": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "UpdateTurnList": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "PropriataryData-1": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "ProprietaryData-3": { + "rpcs": { + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DataConsent-2": { + "user_consent_prompt": "DataConsent", + "rpcs": null + }, + "PropriataryData-2": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "GetDTCs": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + }, + "ReadDID": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "DiagnosticMessageOnly": { + "rpcs": { + "DiagnosticMessage": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ] + } + } + }, + "OnKeyboardInputOnlyGroup": { + "rpcs": { + "OnKeyboardInput": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "OnTouchEventOnlyGroup": { + "rpcs": { + "OnTouchEvent": { + "hmi_levels": [ + "FULL" + ] + } + } + }, + "BaseBeforeDataConsent": { + "rpcs": { + "ChangeRegistration": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "DeleteFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "EncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ListFiles": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnAppInterfaceUnregistered": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnEncodedSyncPData": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHashChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnHMIStatus": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnLanguageChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnPermissionsChange": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "OnSystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "PutFile": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "RegisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "ResetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetAppIcon": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetDisplayLayout": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SetGlobalProperties": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "SystemRequest": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + }, + "UnregisterAppInterface": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED", + "NONE" + ] + } + } + }, + "SendLocation": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "BACKGROUND", + "FULL", + "LIMITED" + ], + "parameters": [ + "longitudeDegrees", + "latitudeDegrees", + "locationDescription", + "phoneNumber" + ] + } + } + }, + "BackgroundAPT": { + "rpcs": { + "EndAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "OnAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + }, + "PerformAudioPassThru": { + "hmi_levels": [ + "BACKGROUND" + ] + } + } + }, + "DialNumberOnly": { + "rpcs": { + "DialNumber": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + }, + "SendLocationOnly": { + "rpcs": { + "SendLocation": { + "hmi_levels": [ + "FULL", + "LIMITED" + ] + } + } + } + }, + "consumer_friendly_messages": { + "version": "001.001.023", + "messages": { + "AppPermissions": { + "languages": { + "de-de": { + "tts": "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab.", + "line1": "Zugriffsanfrage(n)", + "line2": "erlauben?" + }, + "en-au": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-gb": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?", + "textBody": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%`s use of your data. You can change these permissions and hear detailed descriptions in the mobile apps settings menu." + }, + "en-ie": { + "tts": "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny.", + "line1": "Grant requested", + "line2": "permission(s)?" + }, + "en-us": { + "tts": "%appName% is requesting permission to use the following: %functionalGroupLabels%.\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. Please press yes to allow or no to deny.", + "line1": "Grant Requested", + "line2": "Permission(s)?", + "textBody": "The %appName% App is requesting permission to use the following: %functionalGroupLabels%.\r\n\r\nTo disable or change these settings at any time visit the SYNC mobile apps settings menu. See App terms of service and privacy policies. Ford is not responsible for App functionality. Avoid distractions and use voice controls where available. I agree and consent." + }, + "es-en": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "es-es": { + "tts": "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar.", + "line1": "¿Conceder permisos", + "line2": "solicitados?" + }, + "es-mx": { + "tts": "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar.", + "line1": "¿Otorgar permiso(s)", + "line2": "solicitado(s)?", + "textBody": "La App %appName% solicita permiso para usar: %functionalGroupLabels%. \r\n\r\nPara desactivar o cambiar la configuración, acceda al menú de SYNC® de configuración de apps. Consulte términos de servicio y políticas de privacidad de la App. Ford no es responsable de la funcionalidad de la App. Evite distracciones y use los controles de voz cuando estén disponibles. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "tts": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)", + "textBody": "L’application %appName% demande la permission d’utiliser : %functionalGroupLabels%. \r\n\r\nPour désactiver ou modifier ces réglages de données à tout moment, consultez le menu de réglages des applications mobiles SYNC. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application. Ford n’est pas responsable de la fonctionnalité de l’application. Évitez les distractions et utilisez les commandes vocales lorsqu’elles sont disponibles. J’accepte et je consens." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser.", + "line1": "Accorder permission(s)", + "line2": "demandée(s)" + }, + "it-it": { + "tts": "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare.", + "line1": "Concedi autorizzaz.", + "line2": "richiesta(e)?" + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren.", + "line1": "Aangevraagde", + "line2": "permissie(s) verlenen?" + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania.", + "line1": "Udzielić żądanych", + "line2": "pozwoleń?" + }, + "pt-br": { + "tts": "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar.", + "line1": "Conceder permissão", + "line2": "solicitada?" + }, + "pt-pt": { + "tts": "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar.", + "line1": "Conceder permiss.", + "line2": "solicitada(s)?" + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны.", + "line1": "Предост. заправш.", + "line2": "разрешения?" + }, + "sv-se": { + "tts": "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka.", + "line1": "Vill du ge", + "line2": "tillstånd?" + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın.", + "line1": "İstenen izinler", + "line2": "verilsin mi?" + }, + "zh-cn": { + "tts": "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。", + "line1": "是否允许请求的", + "line2": "权限?" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。", + "line1": "允許", + "line2": "授權請求?" + } + } + }, + "AppPermissionsHelp": { + "languages": { + "de-de": { + "tts": "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us": { + "tts": "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es": { + "tts": "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx": { + "tts": "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr": { + "tts": "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it": { + "tts": "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl": { + "tts": "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl": { + "tts": "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br": { + "tts": "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt": { + "tts": "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru": { + "tts": "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se": { + "tts": "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr": { + "tts": "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn": { + "tts": "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw": { + "tts": "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked": { + "languages": { + "de-de": { + "tts": "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us": { + "tts": "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx": { + "tts": "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr": { + "tts": "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it": { + "tts": "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl": { + "tts": "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl": { + "tts": "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br": { + "tts": "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt": { + "tts": "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru": { + "tts": "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se": { + "tts": "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr": { + "tts": "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn": { + "tts": "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw": { + "tts": "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren.", + "line1": "nicht autorisiert" + }, + "en-au": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-gb": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized", + "textBody": "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "not authorized" + }, + "en-us": { + "tts": "This version of %appName% is not authorized and will not work with SYNC.", + "line1": "Not Authorized", + "textBody": "This version of %appName% is no longer authorized to work with Mobile Apps. Please update to the latest version of %appName%." + }, + "es-en": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no está autorizada y no funcionará con SYNC.", + "line1": "No autorizada" + }, + "es-mx": { + "tts": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC.", + "line1": "no autorizada", + "textBody": "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée", + "textBody": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC.", + "line1": "non autorisée" + }, + "it-it": { + "tts": "Questa versione di %appName% non è autorizzata e non funziona con il SYNC.", + "line1": "non autorizzata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC.", + "line1": "niet geautoriseerd" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC.", + "line1": "brak autoryzacji" + }, + "pt-br": { + "tts": "Esta versão do %appName% não tem autorização e não funcionará com o SYNC.", + "line1": "não autorizado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não está autorizada e não funcionará com o SYNC.", + "line1": "não autorizada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не авторизирована и не будет работать с SYNC.", + "line1": "не авторизировано" + }, + "sv-se": { + "tts": "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC.", + "line1": "är ej godkänd" + }, + "tr-tr": { + "tts": "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz.", + "line1": "için izin yok" + }, + "zh-cn": { + "tts": "此版本的%appName% 未得到授权,无法在SYNC上使用。", + "line1": "未得到授权" + }, + "zh-tw": { + "tts": "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。", + "line1": "無授權" + } + } + }, + "AppUnsupported": { + "languages": { + "de-de": { + "tts": "Diese Version von %appName% wird von SYNC nicht unterstützt.", + "line1": "nicht unterstützt" + }, + "en-au": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-gb": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported", + "textBody": "This version of %appName% is not supported by SYNC." + }, + "en-ie": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "not supported" + }, + "en-us": { + "tts": "This version of %appName% is not supported by SYNC.", + "line1": "Not Supported", + "textBody": "Your version of %appName% is not supported by SYNC." + }, + "es-en": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "No compatible" + }, + "es-mx": { + "tts": "Esta versión de %appName% no es compatible con SYNC.", + "line1": "no compatible", + "textBody": "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible", + "textBody": "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr": { + "tts": "Cette version de %appName% n’est pas prise en charge par SYNC.", + "line1": "incompatible" + }, + "it-it": { + "tts": "Questa versione di %appName% non è supportata dal SYNC.", + "line1": "non supportata" + }, + "nl-nl": { + "tts": "Deze versie van %appName% wordt niet ondersteund door SYNC.", + "line1": "niet ondersteund" + }, + "pl-pl": { + "tts": "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC.", + "line1": "aplikacja nie obsług." + }, + "pt-br": { + "tts": "Esta versão do %appName% não é suportada pelo SYNC.", + "line1": "não suportado" + }, + "pt-pt": { + "tts": "Esta versão de %appName% não é suportado pelo SYNC.", + "line1": "não suportada" + }, + "ru-ru": { + "tts": "Эта версия %appName% не поддерживается SYNC.", + "line1": "не поддерживается" + }, + "sv-se": { + "tts": "SYNC har inte stöd för den här versionen av %appName%.", + "line1": "stöds ej" + }, + "tr-tr": { + "tts": "Bu %appName% sürümü SYNC tarafından desteklenmiyor.", + "line1": "desteklenmiyor" + }, + "zh-cn": { + "tts": "SYNC不支持此版本的%appName%。", + "line1": "不受支持" + }, + "zh-tw": { + "tts": "SYNC 不支援此版本的%appName% 。", + "line1": "不支援" + } + } + }, + "DataConsent": { + "languages": { + "en-gb": { + "textBody": "Would you like to enable Mobile Apps on SYNC? To use Mobile Apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device’s data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. \r\n\r\nUpdates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC Settings menu. See your Owner Guide for more information." + }, + "en-us": { + "line1": "Enable Mobile Apps", + "line2": "on SYNC? (Uses Data)", + "textBody": "Would you like to enable Mobile Apps on SYNC?\r\n\r\nIf you enable the use of mobile apps from your mobile device on SYNC, you agree that SYNC can periodically use your device’s data plan to send and receive data that keeps your settings current and enables app functionality. Data sent to Ford U.S. includes your VIN and SYNC module number. Standard rates may apply.\r\n\r\nTo change settings or turn off later, visit the SYNC mobile apps settings menu. See Owner Guide for more information. I agree and consent." + }, + "es-mx": { + "textBody": "Si permite el uso de apps de su móvil vía SYNC®, acepta que SYNC® puede utilizar el plan de datos de su equipo para enviar y recibir info para actualizar su configuración y permitir la funcionalidad de la app. Datos enviados a Ford US incluyen VIN y # de módulo de SYNC®. Cargos a su plan de datos pueden aplicar. \r\n\r\nPara cambiar la config. de SYNC® o apagarlo, acceda a Menú de configuración de apps. Vea la Guía del Propietario para más info. Estoy de acuerdo y acepto lo anterior." + }, + "fr-ca": { + "textBody": "Si vous activez les applications mobiles sur SYNC, vous acceptez que SYNC utilise votre forfait de données afin de maintenir vos réglages à jour et assurer la pleine fonctionnalité. Parmi les données envoyées à Ford US, notons le NIV et le numéro de module SYNC. Des frais de base peuvent s’appliquer. \r\n\r\nPour modifier les réglages ou désactiver les applications, consultez le menu des réglages des applications de SYNC. Voir le Manuel du propriétaire. J’accepte et je consens." + } + } + }, + "DataConsentHelp": { + "languages": { + "en-us": { + "textBody": "By enabling mobile apps, you consent to allowing SYNC to communicate with Ford at least once per month using your mobile device’s data plan. Disabling will stop all data usage, but you will not be able to use mobile apps on SYNC. See your Owner Guide for more information." + }, + "es-mx": { + "textBody": "Las actualizaciones tienen el tamaño aproximado de un mensaje de correo electrónico, y la frecuencia de las actualizaciones depende del uso de su vehículo y de si se encuentran nuevas aplicaciones en su dispositivo. Para obtener más información, consulte la Guía del propietario." + }, + "fr-ca": { + "textBody": "Les mises à jour ont la taille d’un courriel et la fréquence des mises à jour dépend de l’utilisation de votre véhicule et si une nouvelle application se trouve sur votre appareil. Consultez le Guide de l’utilisateur pour obtenir d’autres renseignements." + } + } + }, + "DisableApps": { + "languages": { + "de-de": { + "tts": "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen.", + "line1": "Auto-Update", + "line2": "und Mobile Apps deaktivieren" + }, + "en-au": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-gb": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?", + "textBody": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie": { + "tts": "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel.", + "line1": "Disable auto-updates", + "line2": "and Mobile Apps?" + }, + "en-us": { + "tts": "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel.", + "line1": "Disable Auto-Updates", + "line2": "and Mobile Apps?", + "textBody": "If you disable, you will not be able to use any mobile apps with SYNC and your vehicle will stop receiving mobile app permission updates via your device`s data plan. Please press yes to disable mobile apps or no to cancel." + }, + "es-en": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es": { + "tts": "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar.", + "line1": "¿Desact. actual. auto", + "line2": "y apl. móviles?" + }, + "es-mx": { + "tts": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar.", + "line1": "¿Deshab. actualiz.", + "line2": "autom. y aplic. móv.?", + "textBody": "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?", + "textBody": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr": { + "tts": "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler.", + "line1": "Désactiver màj autom.", + "line2": "et app. mobiles?" + }, + "it-it": { + "tts": "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare.", + "line1": "Disabilitare agg. aut.", + "line2": "e app mobili?" + }, + "nl-nl": { + "tts": "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren.", + "line1": "Auto-updates en mob.", + "line2": "apps uitschakelen?" + }, + "pl-pl": { + "tts": "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować.", + "line1": "Wył. automat. aktual.", + "line2": "i aplikacje mobilne?" + }, + "pt-br": { + "tts": "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar.", + "line1": "Desativar atualizações", + "line2": "autom. e aplicativos?" + }, + "pt-pt": { + "tts": "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar.", + "line1": "Desact. actual. autom.", + "line2": "e aplicações móveis?" + }, + "ru-ru": { + "tts": "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены.", + "line1": "Откл. автообновления", + "line2": "и мобил. прилож.?" + }, + "sv-se": { + "tts": "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta.", + "line1": "Avaktiverar autouppdat.", + "line2": "och mobilappar?" + }, + "tr-tr": { + "tts": "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın.", + "line1": "Oto. güncelleme ve", + "line2": "mobil uygul. kapat?" + }, + "zh-cn": { + "tts": "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。", + "line1": "是否禁用自动更新和", + "line2": "移动应用程序?" + }, + "zh-tw": { + "tts": "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。", + "line1": "停用自動更新", + "line2": "和行動應用程式?" + } + } + }, + "DrivingCharacteristics": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus.", + "label": "Fahreigenschaften" + }, + "en-au": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-gb": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics", + "textBody": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie": { + "tts": "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status.", + "label": "Driving characteristics" + }, + "en-us": { + "tts": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM.", + "label": "Driving Characteristics", + "textBody": "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status, Gear Position, RPM." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es": { + "tts": "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad.", + "label": "Características de conducción" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio.", + "label": "Características del manejo", + "textBody": "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad, RPM del motor, y Posición del cambio." + }, + "fr-ca": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage.", + "label": "Caractéristiques de conduite", + "textBody": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité, régime du moteur, et Position d’embrayage." + }, + "fr-fr": { + "tts": "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité.", + "label": "Caractéristiques de conduite" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza.", + "label": "Caratteristiche di guida" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus.", + "label": "Rijkenmerken" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa.", + "label": "Informacje dotyczące stylu jazdy" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança.", + "label": "Características de condução", + "line1": "Caract. Condução" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança.", + "label": "Características de condução" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности.", + "label": "Характеристики движения" + }, + "sv-se": { + "tts": "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus.", + "label": "Köregenskaper" + }, + "tr-tr": { + "tts": "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu.", + "label": "Sürüş karakteristikleri" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态", + "label": "行驶特性" + }, + "zh-tw": { + "tts": "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態", + "label": "駕駛特性" + } + } + }, + "Location": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs.", + "label": "GPS und Geschwindigkeit" + }, + "en-au": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-gb": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "en-ie": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and speed" + }, + "en-us": { + "tts": "An app can access vehicle GPS and speed.", + "label": "GPS and Speed", + "textBody": "An app can access vehicle GPS and speed." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es": { + "tts": "Una aplicación puede acceder al GPS y la velocidad del vehículo.", + "label": "GPS y velocidad" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo.", + "label": "GPS y velocidad", + "textBody": "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et Vitesse", + "textBody": "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr": { + "tts": "Une application peut accéder au GPS et à la vitesse du véhicule.", + "label": "GPS et vitesse" + }, + "it-it": { + "tts": "Un'app può avere accesso a GPS e velocità del veicolo.", + "label": "GPS e velocità" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot gps en de snelheid van het voertuig.", + "label": "Gps en snelheid" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu.", + "label": "GPS i prędkość" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar o GPS e a velocidade do veículo.", + "label": "GPS e velocidade" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder ao GPS e à velocidade do veículo.", + "label": "GPS e velocidade" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к GPS и скорости автомобиля.", + "label": "GPS и скорость" + }, + "sv-se": { + "tts": "Appen kan komma åt fordonets GPS och hastighetsmätare.", + "label": "GPS och hastighet" + }, + "tr-tr": { + "tts": "Bu uygulama aracın GPS ve hız bilgilerine erişebilir.", + "label": "GPS ve hız" + }, + "zh-cn": { + "tts": "移动应用程序可以访问车辆 GPS 和车速信息。", + "label": "GPS 和车速" + }, + "zh-tw": { + "tts": "應用程式可存取車輛的GPS和速度。", + "label": "GPS和車速" + } + } + }, + "Notifications": { + "languages": { + "de-de": { + "tts": "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden.", + "label": "Push-Benachrichtigungen" + }, + "en-au": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-gb": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications", + "textBody": "An app can send notifications when running in the background." + }, + "en-ie": { + "tts": "An app can send notifications when running in the background.", + "label": "Push notifications" + }, + "en-us": { + "tts": "An app can send notifications when running in the background.", + "label": "Push Notifications", + "textBody": "An app can send notifications when running in the background." + }, + "es-en": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es": { + "tts": "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano.", + "label": "Notificaciones push" + }, + "es-mx": { + "tts": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano.", + "label": "Notificaciones tipo Push", + "textBody": "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications Instantanées", + "textBody": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr": { + "tts": "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan.", + "label": "Notifications push" + }, + "it-it": { + "tts": "Un'app può inviare notifiche se eseguita in background.", + "label": "Notifiche push" + }, + "nl-nl": { + "tts": "Een app kan meldingen versturen als deze op de achtergrond actief is.", + "label": "Push-meldingen" + }, + "pl-pl": { + "tts": "Aplikacja może wysyłać powiadomienia, działając w tle.", + "label": "Powiadomienia Push" + }, + "pt-br": { + "tts": "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano.", + "label": "Notificações Push", + "line1": "Notificações" + }, + "pt-pt": { + "tts": "Uma aplicação consegue enviar notificações quando está activa em segundo plano.", + "label": "Notificações push" + }, + "ru-ru": { + "tts": "Если приложение работает в фоновом режиме, оно может отправлять оповещения.", + "label": "Оповещения о пересылке" + }, + "sv-se": { + "tts": "Appen kan skicka meddelanden när den körs i bakgrunden.", + "label": "Push-notiser" + }, + "tr-tr": { + "tts": "Bir uygulama arka planda çalışırken bildirim gönderebilir.", + "label": "Anlık bildirimleri" + }, + "zh-cn": { + "tts": "移动应用程序在后台运行时可推送通知。", + "label": "推送通知" + }, + "zh-tw": { + "tts": "車輛行進時,應用程式可在背景中傳送通知。", + "label": "傳送通知" + } + } + }, + "SettingAppPermissions": { + "languages": { + "en-us": { + "textBody": "Change %AppName%’s functionality and use of data as described below. See App terms of service and privacy policies." + }, + "es-mx": { + "textBody": "Para cambiar la funcionalidad de %appName% y usar los datos como se describe más adelante. Consulte los términos de servicio y políticas de privacidad de la App." + }, + "fr-ca": { + "textBody": "Pour modifier la fonctionnalité de %appName% et l’usage des données comme décrit ci-dessous. Reportez-vous aux modalités de service et à la politique de confidentialité de l’application." + } + } + }, + "SettingDisableUpdates": { + "languages": { + "de-de": { + "line1": "Updates deakt." + }, + "en-au": { + "line1": "Disable updates" + }, + "en-gb": { + "line1": "Disable updates" + }, + "en-ie": { + "line1": "Disable updates" + }, + "en-us": { + "line1": "Disable Updates", + "textBody": "Disable Updates" + }, + "es-en": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "es-es": { + "line1": "Desact. actual." + }, + "es-mx": { + "line1": "Deshab. actual.", + "textBody": "Deshab. actual." + }, + "fr-ca": { + "line1": "Désactiver MAJ", + "textBody": "Désactiver MAJ" + }, + "fr-fr": { + "line1": "Désactiver màj" + }, + "it-it": { + "line1": "Disabilita agg." + }, + "nl-nl": { + "line1": "Upd. uitschak." + }, + "pl-pl": { + "line1": "Wyłącz aktual." + }, + "pt-br": { + "line1": "Desat. atualiz." + }, + "pt-pt": { + "line1": "Desact. actualiz." + }, + "ru-ru": { + "line1": "Откл. обновл." + }, + "sv-se": { + "line1": "Inaktivera uppd." + }, + "tr-tr": { + "line1": "Güncell. Kapat" + }, + "zh-cn": { + "line1": "禁用更新" + }, + "zh-tw": { + "line1": "停用更新" + } + } + }, + "SettingEnableUpdates": { + "languages": { + "de-de": { + "line1": "Apps aktivieren" + }, + "en-au": { + "line1": "Enable Apps" + }, + "en-gb": { + "line1": "Enable Apps" + }, + "en-ie": { + "line1": "Enable Apps" + }, + "en-us": { + "line1": "Enable Apps" + }, + "es-en": { + "line1": "Hab. aplic." + }, + "es-es": { + "line1": "Activar apl." + }, + "es-mx": { + "line1": "Hab. aplic." + }, + "fr-ca": { + "line1": "Activer app.", + "textBody": "Activer app." + }, + "fr-fr": { + "line1": "Activer app." + }, + "it-it": { + "line1": "Abilita app" + }, + "nl-nl": { + "line1": "Apps inschak." + }, + "pl-pl": { + "line1": "Włącz aplikacje" + }, + "pt-br": { + "line1": "Ativar aplic." + }, + "pt-pt": { + "line1": "Activar actualiz." + }, + "ru-ru": { + "line1": "Вкл. прилож." + }, + "sv-se": { + "line1": "Aktivera appar" + }, + "tr-tr": { + "line1": "Uygulamaları aç" + }, + "zh-cn": { + "line1": "启用应用程序" + }, + "zh-tw": { + "line1": "啟用應用程式" + } + } + }, + "SettingUpdateAuto": { + "languages": { + "de-de": { + "line1": "Update anford." + }, + "en-au": { + "line1": "Request update" + }, + "en-gb": { + "line1": "Request update" + }, + "en-ie": { + "line1": "Request update" + }, + "en-us": { + "line1": "Request Update", + "textBody": "Select `Update now` to receive app permissions for your SYNC-enabled mobile apps. This may enable additional functionality depending on the app and your settings. If your phone has a working data connection, an update should complete in less than 1 minute." + }, + "es-en": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "es-es": { + "line1": "Solicitar actual." + }, + "es-mx": { + "line1": "Solicit. actualiz.", + "textBody": "Solicit. actualiz." + }, + "fr-ca": { + "line1": "Demander MAJ", + "textBody": "Demander MAJ" + }, + "fr-fr": { + "line1": "Demander màj" + }, + "it-it": { + "line1": "Rich. aggiorn." + }, + "nl-nl": { + "line1": "Upd. aanvragen" + }, + "pl-pl": { + "line1": "Zażądaj aktual." + }, + "pt-br": { + "line1": "Solicitar atualiz." + }, + "pt-pt": { + "line1": "Solicit. actualiz." + }, + "ru-ru": { + "line1": "Запрос на обн." + }, + "sv-se": { + "line1": "Begär uppdat." + }, + "tr-tr": { + "line1": "Güncelleme iste" + }, + "zh-cn": { + "line1": "请求更新" + }, + "zh-tw": { + "line1": "請求更新" + } + } + }, + "StatusNeeded": { + "languages": { + "de-de": { + "line1": "Update benötigt" + }, + "en-au": { + "line1": "Update needed" + }, + "en-gb": { + "line1": "Update needed", + "textBody": "Update needed" + }, + "en-ie": { + "line1": "Update needed" + }, + "en-us": { + "line1": "Update Needed", + "textBody": "Update Needed" + }, + "es-en": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "es-es": { + "line1": "Actu. necesaria" + }, + "es-mx": { + "line1": "Actualiz. neces.", + "textBody": "Actualiz. neces." + }, + "fr-ca": { + "line1": "Màj requise", + "textBody": "Màj requise" + }, + "fr-fr": { + "line1": "Mise à jour requise" + }, + "it-it": { + "line1": "Necess. aggiorn." + }, + "nl-nl": { + "line1": "Update nodig" + }, + "pl-pl": { + "line1": "Potrzeba aktual." + }, + "pt-br": { + "line1": "Atualiz. necess." + }, + "pt-pt": { + "line1": "Actual. necess." + }, + "ru-ru": { + "line1": "Необх. обновл." + }, + "sv-se": { + "line1": "Uppdat. krävs" + }, + "tr-tr": { + "line1": "Güncellenmeli" + }, + "zh-cn": { + "line1": "需要进行更新" + }, + "zh-tw": { + "line1": "需更新" + } + } + }, + "StatusPending": { + "languages": { + "de-de": { + "line1": "Aktualisieren..." + }, + "en-au": { + "line1": "Updating..." + }, + "en-gb": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "en-ie": { + "line1": "Updating..." + }, + "en-us": { + "line1": "Updating...", + "textBody": "Updating..." + }, + "es-en": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "es-es": { + "line1": "Actualizando..." + }, + "es-mx": { + "line1": "Actualizando...", + "textBody": "Actualizando..." + }, + "fr-ca": { + "line1": "MAJ en cours...", + "textBody": "MAJ en cours..." + }, + "fr-fr": { + "line1": "Màj en cours..." + }, + "it-it": { + "line1": "Aggiornamento" + }, + "nl-nl": { + "line1": "Updaten..." + }, + "pl-pl": { + "line1": "Aktualizowanie" + }, + "pt-br": { + "line1": "Atualizando..." + }, + "pt-pt": { + "line1": "A actualizar..." + }, + "ru-ru": { + "line1": "Обновление..." + }, + "sv-se": { + "line1": "Uppdaterar..." + }, + "tr-tr": { + "line1": "Güncelleniyor..." + }, + "zh-cn": { + "line1": "正在更新......" + }, + "zh-tw": { + "line1": "更新中..." + } + } + }, + "StatusUpToDate": { + "languages": { + "de-de": { + "line1": "Aktuelle Version" + }, + "en-au": { + "line1": "Up-to-date" + }, + "en-gb": { + "line1": "Up-to-date", + "textBody": "Up-to-date" + }, + "en-ie": { + "line1": "Up-to-date" + }, + "en-us": { + "line1": "Up-To-Date", + "textBody": "Up-To-Date" + }, + "es-en": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "es-es": { + "line1": "Actualizada" + }, + "es-mx": { + "line1": "Actualizado", + "textBody": "Actualizado" + }, + "fr-ca": { + "line1": "Déjà à jour", + "textBody": "Déjà à jour" + }, + "fr-fr": { + "line1": "Déjà à jour" + }, + "it-it": { + "line1": "più recente" + }, + "nl-nl": { + "line1": "Up-to-date" + }, + "pl-pl": { + "line1": "Aktualne" + }, + "pt-br": { + "line1": "Atualizado" + }, + "pt-pt": { + "line1": "Actualizado" + }, + "ru-ru": { + "line1": "Обновлено" + }, + "sv-se": { + "line1": "Uppdat. krävs ej" + }, + "tr-tr": { + "line1": "Güncel" + }, + "zh-cn": { + "line1": "最新更新" + }, + "zh-tw": { + "line1": "更新最新" + } + } + }, + "VehicleInfo": { + "languages": { + "de-de": { + "tts": "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck.", + "label": "Fahrzeuginformationen" + }, + "en-au": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-gb": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure.", + "label": "Vehicle information", + "textBody": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tire pressure." + }, + "en-ie": { + "tts": "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure.", + "label": "Vehicle information" + }, + "en-us": { + "tts": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure.", + "label": "Vehicle Information", + "textBody": "An app can access the following vehicle information: Fuel Level, Fuel Economy, Odometer, VIN, External Temperature, Tire Pressure." + }, + "es-en": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos.", + "label": "Información del vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es": { + "tts": "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos.", + "label": "Información del vehículo" + }, + "es-mx": { + "tts": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos.", + "label": "Información del Vehículo", + "textBody": "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Presión de los neumáticos." + }, + "fr-ca": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus.", + "label": "Renseignements du Véhicule", + "textBody": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Odomètre, NIV, Température extérieure, et Pression des pneus." + }, + "fr-fr": { + "tts": "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus.", + "label": "Renseignements du véhicule" + }, + "it-it": { + "tts": "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici.", + "label": "Informazioni sul veicolo" + }, + "nl-nl": { + "tts": "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning.", + "label": "Voertuiginformatie" + }, + "pl-pl": { + "tts": "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon.", + "label": "Informacje o pojeździe" + }, + "pt-br": { + "tts": "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus.", + "label": "Informações sobre o veículo", + "line1": "Inform. Veículo" + }, + "pt-pt": { + "tts": "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus.", + "label": "Informações do veículo" + }, + "ru-ru": { + "tts": "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин.", + "label": "Информация об автомобиле" + }, + "sv-se": { + "tts": "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck.", + "label": "Fordonsinformation" + }, + "tr-tr": { + "tts": "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı.", + "label": "Araç bilgisi" + }, + "zh-cn": { + "tts": "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压.", + "label": "车辆信息" + }, + "zh-tw": { + "tts": "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓.", + "label": "車輛資訊" + } + } + } + } + }, + "app_policies": { + "default": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "Base-4" + ] + }, + "device": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "DataConsent-2" + ] + }, + "pre_DataConsent": { + "keep_context": false, + "steal_focus": false, + "priority": "NONE", + "default_hmi": "NONE", + "groups": [ + "BaseBeforeDataConsent" + ] + }, + "1234": { + "keep_context": false, + "steal_focus": false, + "priority": "NORMAL", + "default_hmi": "FULL", + "groups": [ + "SendLocation" + ] + }, + } + } +} diff --git a/src/components/policy/policy_external/test/json/valid_sdl_pt_update.json b/src/components/policy/policy_external/test/json/valid_sdl_pt_update.json new file mode 100644 index 0000000000..56c728f104 --- /dev/null +++ b/src/components/policy/policy_external/test/json/valid_sdl_pt_update.json @@ -0,0 +1,1720 @@ +{ + "policy_table" : { + "app_policies" : { + "1766825573" : { + "AppHMIType" : [ "MEDIA" ], + "certificate" : "akdjfhaliuygrglurng", + "default_hmi" : "BACKGROUND", + "groups" : [ + "Notifications", + "Location-1", + "PropriataryData-1", + "Navigation-1", + "Base-4", + "VehicleInfo-3", + "DrivingCharacteristics-3", + "Emergency-1" + ], + "keep_context" : true, + "memory_kb" : 1000, + "nicknames" : [ "SyncProxyTester" ], + "priority" : "EMERGENCY", + "steal_focus" : true, + "heart_beat_timeout_ms": 5000 + }, + "default" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + }, + "device" : { + "default_hmi" : "NONE", + "groups" : [ "Base-4" ], + "memory_kb" : 1000, + "watchdog_timer_ms" : 20000, + "keep_context" : false, + "priority" : "NONE", + "steal_focus" : false + }, + "pre_DataConsent" : { + "default_hmi" : "NONE", + "groups" : [ "pre_Base-1" ], + "keep_context" : false, + "memory_kb" : 1000, + "priority" : "NONE", + "steal_focus" : false + } + }, + "consumer_friendly_messages" : { + "messages" : { + "AppPermissions" : { + "languages" : { + "de-de" : { + "line1" : "Zugriffsanfrage(n)", + "line2" : "erlauben?", + "tts" : "%appName% benötigt die folgenden Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Wenn Sie Ja drücken, erklären Sie sich damit einverstanden, dass %vehicleMake% nicht für Schäden oder Verletzungen der Privatsphäre haftet, die im Zusammenhang mit der Nutzung Ihrer Benutzerdaten durch %appName% entstehen. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-gb" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-ie" : { + "line1" : "Grant requested", + "line2" : "permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press Yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press Yes to allow or No to deny." + }, + "en-us" : { + "line1" : "Grant Requested", + "line2" : "Permission(s)?", + "tts" : "%appName% is requesting the use of the following vehicle information and permissions: %functionalGroupLabels%. If you press yes, you agree that %vehicleMake% will not be liable for any damages or loss of privacy related to %appName%'s use of your data. Please press yes to allow or no to deny." + }, + "es-en" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "es-es" : { + "line1" : "¿Conceder permisos", + "line2" : "solicitados?", + "tts" : "%appName% está solicitando el uso de los siguientes permisos e información del vehículo: %functionalGroupLabels%. Si pulsa sí, acepta que %vehicleMake% no será responsable de los daños o la pérdida de privacidad relacionados con el uso de sus datos por parte de %appName%. Pulse sí para permitir o no para denegar." + }, + "es-mx" : { + "line1" : "¿Otorgar permiso(s)", + "line2" : "solicitado(s)?", + "tts" : "%appName% solicita el uso de la siguiente información y permisos del vehículo: %functionalGroupLabels%. Si presiona Sí, acepta que %vehicleMake% no se hará responsable por los daños o pérdidas de privacidad relacionados con el uso que %appName% haga de sus datos. Presione Sí para permitir y No para denegar." + }, + "fr-ca" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "fr-fr" : { + "line1" : "Accorder permission(s)", + "line2" : "demandée(s)", + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Si vous appuyez sur Oui, vous acceptez que %vehicleMake% ne sera pas responsable des dommages ou des pertes de confidentialité reliées à l’utilisation de vos données par %appName%. Veuillez appuyer sur Oui pour autoriser ou sur Non pour refuser." + }, + "it-it" : { + "line1" : "Concedi autorizzaz.", + "line2" : "richiesta(e)?", + "tts" : "%appName% richiede l'uso delle seguenti informazioni e autorizzazioni sul veicolo: %functionalGroupLabels%. Se si preme Sì, si acconsente che %vehicleMake% non sarà responsabile per danni o perdita di privacy in relazione all'impiego dei dati da parte di %appName%. Premere Sì per consentire e No per negare." + }, + "nl-nl" : { + "line1" : "Aangevraagde", + "line2" : "permissie(s) verlenen?", + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. Als u op Ja drukt, gaat u ermee akkoord dat %vehicleMake% in geen geval aansprakelijk gesteld kan worden voor schade of verlies van privacy als gevolg van het feit dat %appName% gebruik maakt van uw gegevens. Druk op Ja om dit toe te staan of Nee om te weigeren." + }, + "pl-pl" : { + "line1" : "Udzielić żądanych", + "line2" : "pozwoleń?", + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz pozwoleń: %functionalGroupLabels%. Naciśnięcie TAK oznacza zgodę na fakt, iż %vehicleMake% nie będzie ponosić odpowiedzialności za szkody ani utratę prywatności w związku z wykorzystaniem przez %appName% danych, należących do użytkownika. Naciśnij TAK w celu udzielenia zgody lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "line1" : "Conceder permissão", + "line2" : "solicitada?", + "tts" : "%appName% está solicitando o uso das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se pressionar sim, você concorda que a %vehicleMake% não será responsável por danos ou perdas de privacidade relacionados ao uso dos seus dados por %appName%. Pressione sim para permitir ou não para negar." + }, + "pt-pt" : { + "line1" : "Conceder permiss.", + "line2" : "solicitada(s)?", + "tts" : "%appName% está a solicitar a utilização das seguintes informações e permissões do veículo: %functionalGroupLabels%. Se premir “Sim”, concorda que %vehicleMake% não será responsável por quaisquer danos ou perda de privacidade relacionada com a utilização dos seus dados por parte de %appName%. Prima “Sim” para permitir ou “Não” para recusar." + }, + "ru-ru" : { + "line1" : "Предост. заправш.", + "line2" : "разрешения?", + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Нажатием \"\"да\"\", Вы соглашаетесь, что %vehicleMake% не будет нести ответственность за какие-либо убытки или потерю прайвеси, связанные с использованием Ваших данных компанией %appName%. Нажмите \"\"Да\"\", если Вы согласны, или \"\"Нет\"\" - если не согласны." + }, + "sv-se" : { + "line1" : "Vill du ge", + "line2" : "tillstånd?", + "tts" : "%appName% begär att få tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Om du trycker Ja godkänner du att %vehicleMake% ska hållas skadeslös för alla skador som kan uppstå eller eventuella integritetsintrång som uppstår när %appName% använder dina data. Tryck Ja för att godkänna eller Nej för att neka." + }, + "tr-tr" : { + "line1" : "İstenen izinler", + "line2" : "verilsin mi?", + "tts" : "%appName%, şu araç bilgilerini ve izinleri kullanma isteğinde bulunuyor: %functionalGroupLabels%. Evet'e basarsanız, %appName%'in verilerinizi kullanması sonucunda oluşabilecek hasarlardan veya gizlilik kaybından %vehicleMake%'in sorumlu olmayacağını kabul etmiş olacaksınız. Lütfen kabul etmek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否允许请求的", + "line2" : "权限?", + "tts" : "%appName% 正在请求使用下列车辆信息和权限: %functionalGroupLabels%。如果您按“是”,则表示您同意。 %vehicleMake% 将不会对因 %appName% 使用您的数据而引起的任何损毁或隐私损失负责。 请按“是”允许或按“否”拒绝。" + }, + "zh-tw" : { + "line1" : "允許", + "line2" : "授權請求?", + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。按「是」,表示您同意,如因 %appName% 使用您的資料導致任何損害或損失,%vehicleMake% 將不負賠償責任。同意請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsHelp" : { + "languages" : { + "de-de" : { + "tts" : "%appName% fordert folgende Fahrzeuginformationen und Zugriffsberechtigungen: %functionalGroupLabels%. Im Einstellungsmenü der mobilen Apps können Sie diese Berechtigungen ändern und sich detaillierte Beschreibungen anhören. Mit Ja stimmen Sie zu; mit Nein lehnen Sie ab." + }, + "en-au" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-gb" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-ie" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press Yes to grant permissions or No to deny." + }, + "en-us" : { + "tts" : "%appName% is requesting the following vehicle information and permissions: %functionalGroupLabels%. You can change these permissions and hear detailed descriptions in the mobile apps settings menu. Please press yes to grant permissions or no to deny." + }, + "es-en" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "es-es" : { + "tts" : "%appName% está solicitando los siguientes permisos e información del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y escuchar descripciones detalladas en el menú de configuración de la aplicación móvil. Pulse sí para conceder el permiso o no para denegarlo." + }, + "es-mx" : { + "tts" : "%appName% solicita la siguiente información y permisos del vehículo: %functionalGroupLabels%. Puede cambiar estos permisos y consultar descripciones detalladas en el menú de configuración de las aplicaciones móviles. Presione Sí para otorgar permisos y No para denegar." + }, + "fr-ca" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "fr-fr" : { + "tts" : "%appName% demande d’utiliser les informations du véhicule et les permissions suivantes : %functionalGroupLabels%. Vous pouvez modifier ces permissions et entendre les descriptions détaillées dans le menu des réglages des applications mobiles. Veuillez appuyer sur Oui pour accorder les permissions ou sur Non pour refuser." + }, + "it-it" : { + "tts" : "%appName% richiede le seguenti informazioni e autorizzazioni riguardo il veicolo: %functionalGroupLabels%. È possibile modificare tali autorizzazioni e ascoltare descrizioni dettagliate nel menu impostazioni delle app mobili. Premere Sì per concedere le autorizzazioni e No per negarle." + }, + "nl-nl" : { + "tts" : "%appName% vraagt gebruikmaking van de volgende voertuiginformatie en toestemmingen aan: %functionalGroupLabels%. U kunt deze toestemmingen wijzigen en gedetailleerde beschrijvingen beluisteren in het instellingenmenu voor mobiele apps. Druk op Ja om permissies te verlenen of op Nee om te weigeren." + }, + "pl-pl" : { + "tts" : "%appName% wymaga następujących informacji o pojeździe oraz zezwoleń: %functionalGroupLabels%. W menu ustawień aplikacji mobilnych można zmienić owe zezwolenia i usłyszeć ich szczegółowy opis. Naciśnij TAK, aby wyrazić zgodę lub NIE w celu odrzucenia żądania." + }, + "pt-br" : { + "tts" : "%appName% está solicitando as seguintes informações e permissões do veículo: %functionalGroupLabels%. Você pode alterar estas permissões e ouvir descrições detalhadas no menu de configurações de aplicativos móveis. Pressione sim para conceder as permissões ou não para negar." + }, + "pt-pt" : { + "tts" : "%appName% está a solicitar as seguintes informações e permissões do veículo: %functionalGroupLabels%. Pode alterar estas permissões e ouvir descrições detalhadas no menu de definições das aplicações móveis. Prima \"\"Sim\"\" para permitir ou \"\"Não\"\" para recusar." + }, + "ru-ru" : { + "tts" : "%appName% запрашивает следующую информацию об автомобиле и разрешения: %functionalGroupLabels%. Вы можете изменить эти разрешения и прослушать подробные их описания в меню настроек мобильного приложения. Нажмите \"\"да\"\", чтобы предоставить разрешения, или \"\"нет\"\", чтобы не предоставлять." + }, + "sv-se" : { + "tts" : "%appName% begär tillgång till följande fordonsinformation och tillstånd: %functionalGroupLabels%. Du kan ändra tillstånden och höra detaljerade beskrivningar i menyn för mobilappsinställningar. Tryck Ja för att ge tillstånd eller Nej för att neka." + }, + "tr-tr" : { + "tts" : "%appName%, şu araç bilgilerini ve izinleri istiyor: %functionalGroupLabels%. Bu izinleri değiştirebilir ve mobil uygulamalar ayarlar menüsünden ayrıntılı açıklamaları dinleyebilirsiniz. Lütfen izin vermek için Evet'e veya reddetmek için Hayır'a basın." + }, + "zh-cn" : { + "tts" : "%appName% 正在请求下列车辆信息和权限: %functionalGroupLabels%。您可在移动应用程序设置菜单中更改这些权限,并听取详细说明。请按“是”允许权限或按“否”拒绝。" + }, + "zh-tw" : { + "tts" : "%appName% 正請求使用 %functionalGroupLabels% 的車輛資訊和許可。您可在行動應用程式設定清單中更改這些許可,並聆聽詳細說明。給予許可請按「是」,拒絕請按「否」。" + } + } + }, + "AppPermissionsRevoked" : { + "languages" : { + "de-de" : { + "tts" : "Die Autorisierungsdaten der App wurden geändert. %appName% hat keinen Zugriff auf %functionalGroupLabels% mehr. Installieren Sie die neueste Version der App auf Ihrem Gerät.." + }, + "en-au" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-gb" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-ie" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "en-us" : { + "tts" : "App authorizations have changed. %appName% can no longer access %functionalGroupLabels%. Please ensure you have the most recent app version installed on your mobile device." + }, + "es-en" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "es-es" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de que tiene la versión más reciente de la aplicación instalada en su dispositivo móvil." + }, + "es-mx" : { + "tts" : "Las autorizaciones de la aplicación han cambiado. %appName% ya no puede acceder a %functionalGroupLabels%. Asegúrese de haber instalado la versión más reciente de la aplicación en su dispositivo móvil." + }, + "fr-ca" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "fr-fr" : { + "tts" : "Les autorisations pour app ont changé. %appName% ne peut plus accéder à %functionalGroupLabels%. Veuillez vous assurer que la plus récente version de l’application est installée sur votre appareil mobile." + }, + "it-it" : { + "tts" : "Le autorizzazioni dell'app sono cambiate. %appName% non è più in grado di accedere a %functionalGroupLabels%. Assicurarsi di avere la versione più recente dell'app installata sul dispositivo mobile." + }, + "nl-nl" : { + "tts" : "De app-autorisaties zijn gewijzigd. %appName% heeft geen toegang meer tot %functionalGroupLabels%. Zorg ervoor dat u de meest recente app-versie op uw mobiele apparaat geïnstalleerd hebt." + }, + "pl-pl" : { + "tts" : "Dane dostępu aplikacji zostały zmienione. %appName% nie ma już dostępu do %functionalGroupLabels%. Sprawdź, czy na telefonie komórkowym zainstalowano najnowszą wersję aplikacji." + }, + "pt-br" : { + "tts" : "As autorizações dos aplicativos foram alteradas. %appName% não pode mais acessar %functionalGroupLabels%. Certifique-se de que a versão mais recente do aplicativo está instalada no seu dispositivo móvel." + }, + "pt-pt" : { + "tts" : "As autorizações das aplicações mudaram. %appName% já não consegue aceder a %functionalGroupLabels%. Certifique-se de que tem a última versão da aplicação no seu dispositivo móvel." + }, + "ru-ru" : { + "tts" : "Авторизации приложения изменены. %appName% больше не имеет доступа к %functionalGroupLabels%. Убедитесь, что на вашем мобильном устройстве установлена самая новая версия приложения." + }, + "sv-se" : { + "tts" : "Appens behörigheter har ändrats. %appName% har inte längre åtkomst till %functionalGroupLabels%. Kontrollera att du har installerat den senaste versionen av appen på mobilenheten." + }, + "tr-tr" : { + "tts" : "Uygulama yetkileri değişti. %appName% artık %functionalGroupLabels%'e erişemeyecek. Lütfen mobil aygıtınızda en son uygulama sürümünün yüklü olduğundan emin olun." + }, + "zh-cn" : { + "tts" : "应用程序授权已变更。 %appName% 将不能再访问 %functionalGroupLabels%。 请确认您的移动设备上安装的应用程序是最新版本。" + }, + "zh-tw" : { + "tts" : "應用程式授權已改變。%appName% 已無法進入 %functionalGroupLabels%。請確認您的行動裝置上安裝了最新版應用程式。" + } + } + }, + "AppUnauthorized" : { + "languages" : { + "de-de" : { + "line1" : "nicht autorisiert", + "tts" : "Diese Version von %appName% ist nicht autorisiert und wird nicht mit SYNC funktionieren." + }, + "en-au" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-gb" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-ie" : { + "line1" : "not authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "en-us" : { + "line1" : "Not Authorized", + "tts" : "This version of %appName% is not authorized and will not work with SYNC." + }, + "es-en" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "es-es" : { + "line1" : "No autorizada", + "tts" : "Esta versión de %appName% no está autorizada y no funcionará con SYNC." + }, + "es-mx" : { + "line1" : "no autorizada", + "tts" : "Esta versión de %appName% no tiene autorización y no funcionará con SYNC." + }, + "fr-ca" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "fr-fr" : { + "line1" : "non autorisée", + "tts" : "Cette version de %appName% n’est pas autorisée et ne fonctionnera pas avec SYNC." + }, + "it-it" : { + "line1" : "non autorizzata", + "tts" : "Questa versione di %appName% non è autorizzata e non funziona con il SYNC." + }, + "nl-nl" : { + "line1" : "niet geautoriseerd", + "tts" : "Deze versie van %appName% is niet geautoriseerd en werkt niet met SYNC." + }, + "pl-pl" : { + "line1" : "brak autoryzacji", + "tts" : "Niniejsza wersja %appName% nie posiada autoryzacji i nie będzie działać z SYNC." + }, + "pt-br" : { + "line1" : "não autorizado", + "tts" : "Esta versão do %appName% não tem autorização e não funcionará com o SYNC." + }, + "pt-pt" : { + "line1" : "não autorizada", + "tts" : "Esta versão de %appName% não está autorizada e não funcionará com o SYNC." + }, + "ru-ru" : { + "line1" : "не авторизировано", + "tts" : "Эта версия %appName% не авторизирована и не будет работать с SYNC." + }, + "sv-se" : { + "line1" : "är ej godkänd", + "tts" : "Den här versionen av %appName% är inte godkänd och fungerar inte med SYNC." + }, + "tr-tr" : { + "line1" : "için izin yok", + "tts" : "Bu %appName% sürümüne izin verilmediğinden SYNC ile çalışamaz." + }, + "zh-cn" : { + "line1" : "未得到授权", + "tts" : "此版本的%appName% 未得到授权,无法在SYNC上使用。" + }, + "zh-tw" : { + "line1" : "無授權", + "tts" : "%appName% 的版本未獲得授權,將無法透過 SYNC 使用。" + } + } + }, + "AppUnsupported" : { + "languages" : { + "de-de" : { + "line1" : "nicht unterstützt", + "tts" : "Diese Version von %appName% wird von SYNC nicht unterstützt." + }, + "en-au" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-gb" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-ie" : { + "line1" : "not supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "en-us" : { + "line1" : "Not Supported", + "tts" : "This version of %appName% is not supported by SYNC." + }, + "es-en" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-es" : { + "line1" : "No compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "es-mx" : { + "line1" : "no compatible", + "tts" : "Esta versión de %appName% no es compatible con SYNC." + }, + "fr-ca" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "fr-fr" : { + "line1" : "incompatible", + "tts" : "Cette version de %appName% n’est pas prise en charge par SYNC." + }, + "it-it" : { + "line1" : "non supportata", + "tts" : "Questa versione di %appName% non è supportata dal SYNC." + }, + "nl-nl" : { + "line1" : "niet ondersteund", + "tts" : "Deze versie van %appName% wordt niet ondersteund door SYNC." + }, + "pl-pl" : { + "line1" : "aplikacja nie obsług.", + "tts" : "Niniejsza wersja %appName% nie jest obsługiwana przez system SYNC." + }, + "pt-br" : { + "line1" : "não suportado", + "tts" : "Esta versão do %appName% não é suportada pelo SYNC." + }, + "pt-pt" : { + "line1" : "não suportada", + "tts" : "Esta versão de %appName% não é suportado pelo SYNC." + }, + "ru-ru" : { + "line1" : "не поддерживается", + "tts" : "Эта версия %appName% не поддерживается SYNC." + }, + "sv-se" : { + "line1" : "stöds ej", + "tts" : "SYNC har inte stöd för den här versionen av %appName%." + }, + "tr-tr" : { + "line1" : "desteklenmiyor", + "tts" : "Bu %appName% sürümü SYNC tarafından desteklenmiyor." + }, + "zh-cn" : { + "line1" : "不受支持", + "tts" : "SYNC不支持此版本的%appName%。" + }, + "zh-tw" : { + "line1" : "不支援", + "tts" : "SYNC 不支援此版本的%appName% 。" + } + } + }, + "DataConsent" : { + "languages" : { + "en-us" : { + "line1" : "Enable Mobile Apps", + "line2" : "on SYNC? (Uses Data)", + "tts" : "To use mobile apps with SYNC, SYNC will communicate with Ford at least once per month using your mobile device's data plan. Standard rates may apply. SYNC will send your VIN and SYNC module number to Ford U.S. Please press yes or no, or help for more information. " + } + } + }, + "DataConsentHelp" : { + "languages" : { + "en-us" : { + "tts" : "Updates are about the size of an email, and the occurrence of updates depends on your vehicle usage and when a new app is found on your device. To turn on or off, visit the SYNC mobile apps settings menu. See your Owner Guide for more information. " + } + } + }, + "DisableApps" : { + "languages" : { + "de-de" : { + "line1" : "Auto-Update", + "line2" : "und Mobile Apps deaktivieren", + "tts" : "Ausschalten der automatischen Updates führt zum Ausschalten von SYNC mobile Apps. Sie können Ihre mobilen Apps dann nicht mehr mit SYNC nutzen. Bitte drücken Sie Ja zur Bestätigung oder Nein, um abzubrechen." + }, + "en-au" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-gb" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-ie" : { + "line1" : "Disable auto-updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable SYNC mobile apps. You will not be able to use any mobile apps with SYNC. Please press Yes to confirm or No to cancel." + }, + "en-us" : { + "line1" : "Disable Auto-Updates", + "line2" : "and Mobile Apps?", + "tts" : "Disabling automatic updates will also disable sync mobile apps. You will not be able to use any mobile apps with SYNC. Please press yes to confirm or no to cancel." + }, + "es-en" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "es-es" : { + "line1" : "¿Desact. actual. auto", + "line2" : "y apl. móviles?", + "tts" : "Si desactiva las actualizaciones automáticas, también se desactivará la sincronización de las aplicaciones móviles. No podrá utilizar ninguna aplicación móvil con SYNC. Pulse sí para confirmar o no para cancelar." + }, + "es-mx" : { + "line1" : "¿Deshab. actualiz.", + "line2" : "autom. y aplic. móv.?", + "tts" : "Si se desactivan las actualizaciones automáticas, también se desactivarán las aplicaciones móviles de SYNC. No podrá usar ninguna aplicación móvil con SYNC. Presione Sí para confirmar o No para cancelar." + }, + "fr-ca" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "fr-fr" : { + "line1" : "Désactiver màj autom.", + "line2" : "et app. mobiles?", + "tts" : "La désactivation des mises à jour automatiques désactivera aussi les applications mobiles SYNC. Vous ne pourrez pas utiliser d’application mobile avec SYNC. Veuillez appuyer sur Oui pour confirmer ou sur Non pour annuler." + }, + "it-it" : { + "line1" : "Disabilitare agg. aut.", + "line2" : "e app mobili?", + "tts" : "Disabilitando gli aggiornamenti automatici si disattiva anche la sincronizzazione delle app mobili. Non sarà possibile usare app mobili con il SYNC. Premere Sì per confermare e No per cancellare." + }, + "nl-nl" : { + "line1" : "Auto-updates en mob.", + "line2" : "apps uitschakelen?", + "tts" : "Door automatische updates uit te schakelen, schakelt u ook SYNC-mobiele apps uit. U kunt dan geen mobiele apps meer gebruiken met SYNC. Druk op Ja om te bevestigen of op Nee om te annuleren." + }, + "pl-pl" : { + "line1" : "Wył. automat. aktual.", + "line2" : "i aplikacje mobilne?", + "tts" : "Wyłączenie automatycznych aktualizacji spowoduje także wyłączenie aplikacji mobilnych SYNC. Korzystanie z mobilnych aplikacji za pomocą SYNC będzie niemożliwe. Naciśnij TAK, by potwierdzić lub NIE, by anulować." + }, + "pt-br" : { + "line1" : "Desativar atualizações", + "line2" : "autom. e aplicativos?", + "tts" : "Se as atualizações automáticas forem desativadas, os aplicativos também serão desativados. Você não poderá usar nenhum aplicativo com o SYNC. Pressione sim para confirmar ou não para cancelar." + }, + "pt-pt" : { + "line1" : "Desact. actual. autom.", + "line2" : "e aplicações móveis?", + "tts" : "A desactivação das actualizações automáticas desactiva igualmente as aplicações móveis do SYNC. Não poderá utilizar quaisquer aplicações móveis com o SYNC. Prima \"\"Sim\"\" para confirmar ou \"\"Não\"\" para cancelar." + }, + "ru-ru" : { + "line1" : "Откл. автообновления", + "line2" : "и мобил. прилож.?", + "tts" : "При отключении автоматических обновлений также будут отключены мобильные приложения sync. Вы не сможете использовать какие-либо мобильные приложения с SYNC. Нажмите \"\"Да\"\" для подтверждения или \"\"Нет\"\" для отмены." + }, + "sv-se" : { + "line1" : "Avaktiverar autouppdat.", + "line2" : "och mobilappar?", + "tts" : "Om du avaktiverar automatisk uppdatering avaktiverar du även synkning av mobilappar. Du kommer inte längre att kunna använda dina mobilappar med SYNC. Tryck Ja för att bekräfta eller Nej för att avbryta." + }, + "tr-tr" : { + "line1" : "Oto. güncelleme ve", + "line2" : "mobil uygul. kapat?", + "tts" : "Otomatik güncellemeleri devre dışı bırakırsanız sync mobil uygulamalar da devre dışı kalır. SYNC ile mobil uygulama kullanmanız mümkün olmaz. Lütfen onaylamak için Evet'e veya iptal etmek için Hayır'a basın." + }, + "zh-cn" : { + "line1" : "是否禁用自动更新和", + "line2" : "移动应用程序?", + "tts" : "禁用自动更新同时也会禁用SYNC移动应用程序。您将无法在 SYNC 中使用任何移动应用程序。请按“是”确认或按“否”取消。" + }, + "zh-tw" : { + "line1" : "停用自動更新", + "line2" : "和行動應用程式?", + "tts" : "停用自動更新也將停用 sync 行動應用程式。您將無法透過 SYNC 使用任何行動應用程式。確認請按「是」,取消請按「否」。" + } + } + }, + "DrivingCharacteristics" : { + "languages" : { + "de-de" : { + "label" : "Fahreigenschaften", + "tts" : "Eine App hat Zugriff auf die folgenden Fahreigenschaften: Kraftstoffverbrauch, MyKey, Sicherheitsgurtstatus." + }, + "en-au" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-gb" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-ie" : { + "label" : "Driving characteristics", + "tts" : "An app can access the following driving characteristics: Fuel consumption, MyKey, Seat belt status." + }, + "en-us" : { + "label" : "Driving Characteristics", + "tts" : "An app can access the following driving characteristics: Fuel Consumption, MyKey, Seat Belt Status." + }, + "es-en" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "es-es" : { + "label" : "Características de conducción", + "tts" : "Una aplicación puede acceder a las siguientes características de conducción: Consumo de combustible, MyKey, Estado cinturones de seguridad." + }, + "es-mx" : { + "label" : "Características del manejo", + "tts" : "Las aplicaciones pueden acceder a las siguientes características del manejo: Consumo de combustible, MyKey, Estado del cinturón de seguridad." + }, + "fr-ca" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "fr-fr" : { + "label" : "Caractéristiques de conduite", + "tts" : "Une application peut accéder aux caractéristiques de conduite suivantes: Consommation de carburant, MyKey, État des ceintures de sécurité." + }, + "it-it" : { + "label" : "Caratteristiche di guida", + "tts" : "Un'app può avere accesso alle seguenti caratteristiche di guida: Consumo carburante, MyKey, Stato cinture di sicurezza." + }, + "nl-nl" : { + "label" : "Rijkenmerken", + "tts" : "Een app heeft toegang tot de volgende rijkenmerken: Brandstofverbruik, MyKey, Veiligheidsgordelstatus." + }, + "pl-pl" : { + "label" : "Informacje dotyczące stylu jazdy", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji dotyczących jazdy: Zużycie paliwa, MyKey, Stan pasów bezpieczeństwa." + }, + "pt-br" : { + "label" : "Características de condução", + "tts" : "Um aplicativo pode acessar as seguintes características de condução: Consumo de combustível, MyKey, Estado do cinto de segurança." + }, + "pt-pt" : { + "label" : "Características de condução", + "tts" : "Uma aplicação consegue aceder às seguintes informações de condução: Consumo de combustível, MyKey, Estado dos cintos de segurança." + }, + "ru-ru" : { + "label" : "Характеристики движения", + "tts" : "Приложение имеет доступ к следующим характеристикам движения: Расход топлива, MyKey, Состояние ремней безопасности." + }, + "sv-se" : { + "label" : "Köregenskaper", + "tts" : "Appen kan komma åt följande köregenskaper: Bränsleförbrukning, MyKey, Bältesstatus." + }, + "tr-tr" : { + "label" : "Sürüş karakteristikleri", + "tts" : "Bir uygulama şu sürüş karakteristiklerine erişebilir: Yakıt tüketimi, MyKey, Emniyet kemeri durumu." + }, + "zh-cn" : { + "label" : "行驶特性", + "tts" : "移动应用程序可访问下列行驶特性: 油耗, MyKey, 安全带状态" + }, + "zh-tw" : { + "label" : "駕駛特性", + "tts" : "應用程式可存取以下駕駛特性: 油耗, MyKey, 安全帶狀態" + } + } + }, + "Location" : { + "languages" : { + "de-de" : { + "label" : "GPS und Geschwindigkeit", + "tts" : "Eine App hat Zugriff auf die GPS-Daten und die Geschwindigkeit des Fahrzeugs." + }, + "en-au" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-gb" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-ie" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "en-us" : { + "label" : "GPS and speed", + "tts" : "An app can access vehicle GPS and speed." + }, + "es-en" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "es-es" : { + "label" : "GPS y velocidad", + "tts" : "Una aplicación puede acceder al GPS y la velocidad del vehículo." + }, + "es-mx" : { + "label" : "GPS y velocidad", + "tts" : "Las aplicaciones pueden acceder al GPS y a la velocidad del vehículo." + }, + "fr-ca" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "fr-fr" : { + "label" : "GPS et vitesse", + "tts" : "Une application peut accéder au GPS et à la vitesse du véhicule." + }, + "it-it" : { + "label" : "GPS e velocità", + "tts" : "Un'app può avere accesso a GPS e velocità del veicolo." + }, + "nl-nl" : { + "label" : "Gps en snelheid", + "tts" : "Een app heeft toegang tot gps en de snelheid van het voertuig." + }, + "pl-pl" : { + "label" : "GPS i prędkość", + "tts" : "Aplikacja może uzyskać dostęp do modułu GPS i prędkości pojazdu." + }, + "pt-br" : { + "label" : "GPS e velocidade", + "tts" : "Um aplicativo pode acessar o GPS e a velocidade do veículo." + }, + "pt-pt" : { + "label" : "GPS e velocidade", + "tts" : "Uma aplicação consegue aceder ao GPS e à velocidade do veículo." + }, + "ru-ru" : { + "label" : "GPS и скорость", + "tts" : "Приложение имеет доступ к GPS и скорости автомобиля." + }, + "sv-se" : { + "label" : "GPS och hastighet", + "tts" : "Appen kan komma åt fordonets GPS och hastighetsmätare." + }, + "tr-tr" : { + "label" : "GPS ve hız", + "tts" : "Bu uygulama aracın GPS ve hız bilgilerine erişebilir." + }, + "zh-cn" : { + "label" : "GPS 和车速", + "tts" : "移动应用程序可以访问车辆 GPS 和车速信息。" + }, + "zh-tw" : { + "label" : "GPS和車速", + "tts" : "應用程式可存取車輛的GPS和速度。" + } + } + }, + "Notifications" : { + "languages" : { + "de-de" : { + "label" : "Push-Benachrichtigungen", + "tts" : "Läuft die App im Hintergrund, kann Sie Benachrichtigungen senden." + }, + "en-au" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-gb" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-ie" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "en-us" : { + "label" : "Push notifications", + "tts" : "An app can send notifications when running in the background." + }, + "es-en" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "es-es" : { + "label" : "Notificaciones push", + "tts" : "Una aplicación puede enviar notificaciones cuando se está ejecutando en segundo plano." + }, + "es-mx" : { + "label" : "Notificaciones tipo Push", + "tts" : "Las aplicaciones pueden enviar notificaciones cuando se ejecutan en segundo plano." + }, + "fr-ca" : { + "label" : "Notifications instantanées", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "fr-fr" : { + "label" : "Notifications push", + "tts" : "Une application peut envoyer des avis lorsqu’elle fonctionne en arrière-plan." + }, + "it-it" : { + "label" : "Notifiche push", + "tts" : "Un'app può inviare notifiche se eseguita in background." + }, + "nl-nl" : { + "label" : "Push-meldingen", + "tts" : "Een app kan meldingen versturen als deze op de achtergrond actief is." + }, + "pl-pl" : { + "label" : "Powiadomienia Push", + "tts" : "Aplikacja może wysyłać powiadomienia, działając w tle." + }, + "pt-br" : { + "label" : "Notificações Push", + "tts" : "Um aplicativo pode enviar notificações quando estiver sendo executado em segundo plano." + }, + "pt-pt" : { + "label" : "Notificações push", + "tts" : "Uma aplicação consegue enviar notificações quando está activa em segundo plano." + }, + "ru-ru" : { + "label" : "Оповещения о пересылке", + "tts" : "Если приложение работает в фоновом режиме, оно может отправлять оповещения." + }, + "sv-se" : { + "label" : "Push-notiser", + "tts" : "Appen kan skicka meddelanden när den körs i bakgrunden." + }, + "tr-tr" : { + "label" : "Anlık bildirimleri", + "tts" : "Bir uygulama arka planda çalışırken bildirim gönderebilir." + }, + "zh-cn" : { + "label" : "推送通知", + "tts" : "移动应用程序在后台运行时可推送通知。" + }, + "zh-tw" : { + "label" : "傳送通知", + "tts" : "車輛行進時,應用程式可在背景中傳送通知。" + } + } + }, + "SettingDisableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Updates deakt." + }, + "en-au" : { + "line1" : "Disable updates" + }, + "en-gb" : { + "line1" : "Disable updates" + }, + "en-ie" : { + "line1" : "Disable updates" + }, + "en-us" : { + "line1" : "Disable Updates" + }, + "es-en" : { + "line1" : "Deshab. actual." + }, + "es-es" : { + "line1" : "Desact. actual." + }, + "es-mx" : { + "line1" : "Deshab. actual." + }, + "fr-ca" : { + "line1" : "Désactiver MAJ" + }, + "fr-fr" : { + "line1" : "Désactiver màj" + }, + "it-it" : { + "line1" : "Disabilita agg." + }, + "nl-nl" : { + "line1" : "Upd. uitschak." + }, + "pl-pl" : { + "line1" : "Wyłącz aktual." + }, + "pt-br" : { + "line1" : "Desat. atualiz." + }, + "pt-pt" : { + "line1" : "Desact. actualiz." + }, + "ru-ru" : { + "line1" : "Откл. обновл." + }, + "sv-se" : { + "line1" : "Inaktivera uppd." + }, + "tr-tr" : { + "line1" : "Güncell. Kapat" + }, + "zh-cn" : { + "line1" : "禁用更新" + }, + "zh-tw" : { + "line1" : "停用更新" + } + } + }, + "SettingEnableUpdates" : { + "languages" : { + "de-de" : { + "line1" : "Apps aktivieren" + }, + "en-au" : { + "line1" : "Enable Apps" + }, + "en-gb" : { + "line1" : "Enable Apps" + }, + "en-ie" : { + "line1" : "Enable Apps" + }, + "en-us" : { + "line1" : "Enable Apps" + }, + "es-en" : { + "line1" : "Hab. aplic." + }, + "es-es" : { + "line1" : "Activar apl." + }, + "es-mx" : { + "line1" : "Hab. aplic." + }, + "fr-ca" : { + "line1" : "Activer app." + }, + "fr-fr" : { + "line1" : "Activer app." + }, + "it-it" : { + "line1" : "Abilita app" + }, + "nl-nl" : { + "line1" : "Apps inschak." + }, + "pl-pl" : { + "line1" : "Włącz aplikacje" + }, + "pt-br" : { + "line1" : "Ativar aplic." + }, + "pt-pt" : { + "line1" : "Activar actualiz." + }, + "ru-ru" : { + "line1" : "Вкл. прилож." + }, + "sv-se" : { + "line1" : "Aktivera appar" + }, + "tr-tr" : { + "line1" : "Uygulamaları aç" + }, + "zh-cn" : { + "line1" : "启用应用程序" + }, + "zh-tw" : { + "line1" : "啟用應用程式" + } + } + }, + "SettingUpdateAuto" : { + "languages" : { + "de-de" : { + "line1" : "Update anford." + }, + "en-au" : { + "line1" : "Request update" + }, + "en-gb" : { + "line1" : "Request update" + }, + "en-ie" : { + "line1" : "Request update" + }, + "en-us" : { + "line1" : "Request Update" + }, + "es-en" : { + "line1" : "Solicit. actualiz." + }, + "es-es" : { + "line1" : "Solicitar actual." + }, + "es-mx" : { + "line1" : "Solicit. actualiz." + }, + "fr-ca" : { + "line1" : "Demander MAJ" + }, + "fr-fr" : { + "line1" : "Demander màj" + }, + "it-it" : { + "line1" : "Rich. aggiorn." + }, + "nl-nl" : { + "line1" : "Upd. aanvragen" + }, + "pl-pl" : { + "line1" : "Zażądaj aktual." + }, + "pt-br" : { + "line1" : "Solicitar atualiz." + }, + "pt-pt" : { + "line1" : "Solicit. actualiz." + }, + "ru-ru" : { + "line1" : "Запрос на обн." + }, + "sv-se" : { + "line1" : "Begär uppdat." + }, + "tr-tr" : { + "line1" : "Güncelleme iste" + }, + "zh-cn" : { + "line1" : "请求更新" + }, + "zh-tw" : { + "line1" : "請求更新" + } + } + }, + "StatusNeeded" : { + "languages" : { + "de-de" : { + "line1" : "Update benötigt" + }, + "en-au" : { + "line1" : "Update needed" + }, + "en-gb" : { + "line1" : "Update needed" + }, + "en-ie" : { + "line1" : "Update needed" + }, + "en-us" : { + "line1" : "Update Needed" + }, + "es-en" : { + "line1" : "Actualiz. neces." + }, + "es-es" : { + "line1" : "Actu. necesaria" + }, + "es-mx" : { + "line1" : "Actualiz. neces." + }, + "fr-ca" : { + "line1" : "Màj requise" + }, + "fr-fr" : { + "line1" : "Mise à jour requise" + }, + "it-it" : { + "line1" : "Necess. aggiorn." + }, + "nl-nl" : { + "line1" : "Update nodig" + }, + "pl-pl" : { + "line1" : "Potrzeba aktual." + }, + "pt-br" : { + "line1" : "Atualiz. necess." + }, + "pt-pt" : { + "line1" : "Actual. necess." + }, + "ru-ru" : { + "line1" : "Необх. обновл." + }, + "sv-se" : { + "line1" : "Uppdat. krävs" + }, + "tr-tr" : { + "line1" : "Güncellenmeli" + }, + "zh-cn" : { + "line1" : "需要进行更新" + }, + "zh-tw" : { + "line1" : "需更新" + } + } + }, + "StatusPending" : { + "languages" : { + "de-de" : { + "line1" : "Aktualisieren..." + }, + "en-au" : { + "line1" : "Updating..." + }, + "en-gb" : { + "line1" : "Updating..." + }, + "en-ie" : { + "line1" : "Updating..." + }, + "en-us" : { + "line1" : "Updating..." + }, + "es-en" : { + "line1" : "Actualizando..." + }, + "es-es" : { + "line1" : "Actualizando..." + }, + "es-mx" : { + "line1" : "Actualizando..." + }, + "fr-ca" : { + "line1" : "MAJ en cours..." + }, + "fr-fr" : { + "line1" : "Màj en cours..." + }, + "it-it" : { + "line1" : "Aggiornamento" + }, + "nl-nl" : { + "line1" : "Updaten..." + }, + "pl-pl" : { + "line1" : "Aktualizowanie" + }, + "pt-br" : { + "line1" : "Atualizando..." + }, + "pt-pt" : { + "line1" : "A actualizar..." + }, + "ru-ru" : { + "line1" : "Обновление..." + }, + "sv-se" : { + "line1" : "Uppdaterar..." + }, + "tr-tr" : { + "line1" : "Güncelleniyor..." + }, + "zh-cn" : { + "line1" : "正在更新......" + }, + "zh-tw" : { + "line1" : "更新中..." + } + } + }, + "StatusUpToDate" : { + "languages" : { + "de-de" : { + "line1" : "Aktuelle Version" + }, + "en-au" : { + "line1" : "Up-to-date" + }, + "en-gb" : { + "line1" : "Up-to-date" + }, + "en-ie" : { + "line1" : "Up-to-date" + }, + "en-us" : { + "line1" : "Up-To-Date" + }, + "es-en" : { + "line1" : "Actualizado" + }, + "es-es" : { + "line1" : "Actualizada" + }, + "es-mx" : { + "line1" : "Actualizado" + }, + "fr-ca" : { + "line1" : "Déjà à jour" + }, + "fr-fr" : { + "line1" : "Déjà à jour" + }, + "it-it" : { + "line1" : "più recente" + }, + "nl-nl" : { + "line1" : "Up-to-date" + }, + "pl-pl" : { + "line1" : "Aktualne" + }, + "pt-br" : { + "line1" : "Atualizado" + }, + "pt-pt" : { + "line1" : "Actualizado" + }, + "ru-ru" : { + "line1" : "Обновлено" + }, + "sv-se" : { + "line1" : "Uppdat. krävs ej" + }, + "tr-tr" : { + "line1" : "Güncel" + }, + "zh-cn" : { + "line1" : "最新更新" + }, + "zh-tw" : { + "line1" : "更新最新" + } + } + }, + "VehicleInfo" : { + "languages" : { + "de-de" : { + "label" : "Fahrzeuginformationen", + "tts" : "Eine App hat Zugriff auf die folgenden Fahrzeuginformationen: Kraftstoff-Füllstand, Kraftstoffverbrauch, Motordrehzahl, Kilometerzähler, FIN, Außentemperatur, Gangstellung, Reifenluftdruck." + }, + "en-au" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-gb" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-ie" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel level, Fuel economy, Engine RPMs, Odometer, VIN, Outside air temperature, Gear position, Tyre pressure." + }, + "en-us" : { + "label" : "Vehicle information", + "tts" : "An app can access the following vehicle information: Fuel Level, Fuel Economy, Engine RPMs, Odometer, VIN, External Temperature, Gear Position, Tire Pressure." + }, + "es-en" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "es-es" : { + "label" : "Información del vehículo", + "tts" : "Una aplicación puede acceder a la siguiente información del vehículo: Nivel de combustible, Ahorro de combustible, RPM del motor, Cuentakilómetros, VIN, Temperatura aire exterior, Marcha engranada, Presión de neumáticos." + }, + "es-mx" : { + "label" : "Información del vehículo", + "tts" : "Las aplicaciones pueden acceder a la siguiente información del vehículo: Nivel de combustible, Economía de combustible, RPM del motor, Cuentakilómetros, Número de identificación del vehículo, Temperatura externa, Posición del cambio, Presión de los neumáticos." + }, + "fr-ca" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Au régime du moteur, Odomètre, NIV, Température extérieure, Position d’embrayage, Pression des pneus." + }, + "fr-fr" : { + "label" : "Renseignements du véhicule", + "tts" : "Une application peut accéder aux informations suivantes du véhicule: Niveau de carburant, Économie de carburant, Vitesse de moteur, Compteur kilométrique, NIV, Température extérieure, Position de vitesse, Pression des pneus." + }, + "it-it" : { + "label" : "Informazioni sul veicolo", + "tts" : "Un'app può avere accesso alle seguenti informazioni del veicolo: Livello carburante, Consumi carburante, Numero giri motore, Contachilometri, VIN, Temperatura esterna, Posizione marcia, Pressione pneumatici." + }, + "nl-nl" : { + "label" : "Voertuiginformatie", + "tts" : "Een app heeft toegang tot de volgende voertuiginformatie: Brandstofpeil, Brandstofverbruik, Motortoerental, Kilometerteller, VIN, Buitentemperatuur, Versnellingsstand, Bandenspanning." + }, + "pl-pl" : { + "label" : "Informacje o pojeździe", + "tts" : "Aplikacja może uzyskać dostęp do następujących informacji o pojeździe: Poziom paliwa, Zużycie paliwa, Obroty silnika, Licznik przebiegu, Numer VIN, Temperatura zewnętrzna, Aktualny bieg, Ciśnienie opon." + }, + "pt-br" : { + "label" : "Informações sobre o veículo", + "tts" : "Um aplicativo pode acessar as seguintes informações sobre o veículo: Nível de combustível, Economia de combustível, RPM do motor, Hodômetro, VIN, Temperatura externa, Posição das marchas, Pressão dos pneus." + }, + "pt-pt" : { + "label" : "Informações do veículo", + "tts" : "Uma aplicação consegue aceder às seguintes informações do veículo: Nível de combustível, Poupança de combustível, RPM do motor, Conta-quilómetros, VIN, Temperatura exterior, Posição da mudança de velocidade, Pressão dos pneus." + }, + "ru-ru" : { + "label" : "Информация об автомобиле", + "tts" : "Приложение имеет доступ к следующим данным автомобиля: Уровень топлива, Економия топлива, Число оборотов двигателя, Одометр, Номер VIN, Температура за бортом, Положение передачи, Давление шин." + }, + "sv-se" : { + "label" : "Fordonsinformation", + "tts" : "Appen kan komma åt följande fordonsinformation: Bränslenivå, Bränsleekonomi, Motorns varvtal, Vägmätare, VIN, Utetemperatur, Växelläge, Däcktryck." + }, + "tr-tr" : { + "label" : "Araç bilgisi", + "tts" : "Bir uygulama şu araç bilgilerine erişebilir: Yakıt seviyesi, Yakıt ekonomisi, Motor devirleri, Kilometre sayacı, VIN, Dış sıcaklık, Vites konumu, Lastik basıncı." + }, + "zh-cn" : { + "label" : "车辆信息", + "tts" : "移动应用程序可访问下列车辆信息 : 燃油量, 燃油经济性, 发动机转速(RPM), 里程表, VIN, 车外温度, 档位, 胎压." + }, + "zh-tw" : { + "label" : "車輛資訊", + "tts" : "一個應用程式可存取以下車輛資訊 : 燃油存量, 燃油經濟性, 引擎轉速, 里程表, 車輛識別號碼, 車外溫度, 檔位, 胎壓." + } + } + } + }, + "version" : "001.001.015" + }, + "functional_groupings" : { + "Base-4" : { + "rpcs" : { + "AddCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "AddSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Alert" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "CreateInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteCommand" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteInteractionChoiceSet" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "DeleteSubMenu" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "EncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "EndAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAudioPassThru" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnButtonEvent" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnButtonPress" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnCommand" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "OnDriverDistraction" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "OnEncodedSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnHMIStatus" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnSyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnTBTClientState" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "PerformAudioPassThru" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PerformInteraction" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ScrollableMessage" : { + "hmi_levels" : [ "FULL" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetMediaClockTimer" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "Show" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "Slider" : { + "hmi_levels" : [ "FULL" ] + }, + "Speak" : { + "hmi_levels" : [ "FULL", "LIMITED" ] + }, + "SubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SyncPData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "UnsubscribeButton" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "DrivingCharacteristics-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "accPedalPosition", + "beltStatus", + "driverBraking", + "myKey", + "prndl", + "rpm", + "steeringWheelAngle" + ] + } + }, + "user_consent_prompt" : "DrivingCharacteristics" + }, + "Emergency-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "airbagStatus", + "bodyInformation", + "clusterModeStatus", + "deviceStatus", + "eCallInfo", + "emergencyEvent" + ] + } + } + }, + "Location-1" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ "gps", "speed" ] + } + }, + "user_consent_prompt" : "Location" + }, + "Navigation-1" : { + "rpcs" : { + "AlertManeuver" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ShowConstantTBT" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UpdateTurnList" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "Notifications" : { + "rpcs" : { + "Alert" : { + "hmi_levels" : [ "BACKGROUND" ] + } + }, + "user_consent_prompt" : "Notifications" + }, + "PropriataryData-1" : { + "rpcs" : { + "DiagnosticMessage" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "GetDTCs" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ReadDID" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + } + } + }, + "VehicleInfo-3" : { + "rpcs" : { + "GetVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "OnVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "vin", + "wiperStatus" + ] + }, + "SubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + }, + "UnsubscribeVehicleData" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ], + "parameters" : [ + "engineTorque", + "externalTemperature", + "fuelLevel", + "fuelLevel_State", + "headLampStatus", + "instantFuelConsumption", + "odometer", + "tirePressure", + "wiperStatus" + ] + } + }, + "user_consent_prompt" : "VehicleInfo" + }, + "pre_Base-1" : { + "rpcs" : { + "ChangeRegistration" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "DeleteFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "GenericResponse" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "ListFiles" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnAppInterfaceUnregistered" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnLanguageChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "OnPermissionsChange" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "PutFile" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "RegisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "ResetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "SetAppIcon" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetDisplayLayout" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + }, + "SetGlobalProperties" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED" ] + }, + "UnregisterAppInterface" : { + "hmi_levels" : [ "BACKGROUND", "FULL", "LIMITED", "NONE" ] + } + } + } + }, + "module_config" : { + "device_certificates" : { + "HUU40DAS7F970UEI17A73JH32L41K32JH4L1K234H3K4" : "aldhfkahfgkafrblgjr" + }, + "endpoints" : { + "0x07" : { + "default" : [ "http://policies.telematics.ford.com/api/policies" ] + } + }, + "exchange_after_x_days" : 30, + "exchange_after_x_ignition_cycles" : 100, + "exchange_after_x_kilometers" : 1800, + "notifications_per_minute_by_priority" : { + "COMMUNICATION" : 6, + "EMERGENCY" : 60, + "NAVIGATION" : 15, + "NONE" : 0, + "NORMAL" : 4, + "VOICECOMM" : 10 + }, + "seconds_between_retries" : [ 1, 5, 25, 125, 625 ], + "timeout_after_x_seconds" : 60, + "vehicle_make" : "Stark Industries", + "vehicle_model" : "E-Tron", + "vehicle_year" : "1992" + } + } +} diff --git a/src/components/policy/policy_external/test/log4cxx.properties b/src/components/policy/policy_external/test/log4cxx.properties new file mode 100644 index 0000000000..1c09444986 --- /dev/null +++ b/src/components/policy/policy_external/test/log4cxx.properties @@ -0,0 +1,33 @@ +# Only ERROR and FATAL messages are logged to console +log4j.appender.Console=org.apache.log4j.ConsoleAppender +log4j.appender.Console.ImmediateFlush=true +log4j.appender.Console.layout=org.apache.log4j.PatternLayout +log4j.appender.Console.layout.ConversionPattern=%-5p [%d{dd MMM yyyy HH:mm:ss,SSS}][%c] %m%n +log4j.appender.Console.Threshold=ERROR + +# Log for all SQLPTRepresentation messages +log4j.appender.SQLPTRepresentationLogFile=org.apache.log4j.DailyRollingFileAppender +log4j.appender.SQLPTRepresentationLogFile.File=SQLRepresentation.log +log4j.appender.SQLPTRepresentationLogFile.ImmediateFlush=true +log4j.appender.SQLPTRepresentationLogFile.layout=org.apache.log4j.PatternLayout +log4j.appender.SQLPTRepresentationLogFile.layout.ConversionPattern=%-5p [%d{dd MMM yyyy HH:mm:ss,SSS}] :%L %M: %m%n +log4j.appender.SQLPTRepresentationLogFile.Schedule=DAILY +log4j.appender.SQLPTRepresentationLogFile.DatePattern='.' yyyy-MM-dd + +# Log for all PolicyManagerImpl messages +log4j.appender.PolicyManagerImplLogFile=org.apache.log4j.DailyRollingFileAppender +log4j.appender.PolicyManagerImplLogFile.File=PolicyManagerImpl.log +log4j.appender.PolicyManagerImplLogFile.ImmediateFlush=true +log4j.appender.PolicyManagerImplLogFile.layout=org.apache.log4j.PatternLayout +log4j.appender.PolicyManagerImplLogFile.layout.ConversionPattern=%-5p [%d{dd MMM yyyy HH:mm:ss,SSS}] :%L %M: %m%n +log4j.appender.PolicyManagerImplLogFile.Schedule=DAILY +log4j.appender.PolicyManagerImplLogFile.DatePattern='.' yyyy-MM-dd + +# All SmartDeviceLinkCore logs +log4j.rootLogger=ALL, Console + +# SQLPTRepresentation logs +log4j.logger.SQLPTRepresentation=ALL, SQLPTRepresentationLogFile + +# PolicyManagerImpl logs +log4j.logger.PolicyManagerImpl=ALL, PolicyManagerImplLogFile diff --git a/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc new file mode 100644 index 0000000000..cec844fb85 --- /dev/null +++ b/src/components/policy/policy_external/test/policy_manager_impl_ptu_test.cc @@ -0,0 +1,1608 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <fstream> +#include <string> +#include <vector> +#include <stdint.h> + +#include "gtest/gtest.h" + +#include "policy/policy_manager_impl_test_base.h" + +#include "utils/date_time.h" +#include "utils/gen_hash.h" +#include "json/reader.h" + +namespace test { +namespace components { +namespace policy_test { + +using ::testing::_; +using ::testing::Return; +using ::testing::ReturnRef; + +TEST_F(PolicyManagerImplTest, + TiggerPTUForNaviAppInCaseNoCertificateExistsInPolicyTable) { + EXPECT_CALL(*cache_manager_, GetDeviceConsent(_)) + .WillOnce(Return(kDeviceAllowed)); + EXPECT_CALL(*cache_manager_, IsPredataPolicy(_)).WillOnce(Return(false)); + EXPECT_CALL(*cache_manager_, IsApplicationRepresented(_)) + .WillOnce(Return(true)); + EXPECT_CALL(*cache_manager_, GetCertificate()).WillOnce(Return("")); + EXPECT_CALL(*cache_manager_, AppHasHMIType(_, policy_table::AHT_NAVIGATION)) + .WillOnce(Return(true)); + EXPECT_EQ(manager_->GetPolicyTableStatus(), "UP_TO_DATE"); + manager_->AddApplication(kDefaultId); + EXPECT_EQ(manager_->GetPolicyTableStatus(), "UPDATE_NEEDED"); +} + +TEST_F(PolicyManagerImplTest, + TiggerPTUForNaviAppInCaseCertificateExistsInPolicyTable) { + EXPECT_CALL(*cache_manager_, GetDeviceConsent(_)) + .WillOnce(Return(kDeviceAllowed)); + EXPECT_CALL(*cache_manager_, IsPredataPolicy(_)).WillOnce(Return(false)); + EXPECT_CALL(*cache_manager_, IsApplicationRepresented(_)) + .WillOnce(Return(true)); + EXPECT_CALL(*cache_manager_, GetCertificate()) + .WillOnce(Return( + "Any non empty string is ok here, " + "because we check that field is not empty")); + + EXPECT_CALL(*cache_manager_, AppHasHMIType(_, policy_table::AHT_NAVIGATION)) + .Times(0); + manager_->AddApplication(kDefaultId); +} + +TEST_F(PolicyManagerImplTest2, GetNotificationsNumberAfterPTUpdate) { + // Arrange + + Json::Value table = createPTforLoad(); + manager_->ForcePTExchange(); + manager_->OnUpdateStarted(); + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + // Act + std::string json = table.toStyledString(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + EXPECT_CALL(listener_, OnUpdateStatusChanged(_)); + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(manager_->GetCache()->IsPTPreloaded()); + + std::string priority = "emergency"; + uint32_t notif_number = manager_->GetNotificationsNumber(priority); + EXPECT_EQ(1u, notif_number); + + priority = "navigation"; + notif_number = manager_->GetNotificationsNumber(priority); + EXPECT_EQ(2u, notif_number); + + priority = "emergency"; + notif_number = manager_->GetNotificationsNumber(priority); + EXPECT_EQ(1u, notif_number); + + priority = "VOICECOMM"; + notif_number = manager_->GetNotificationsNumber(priority); + EXPECT_EQ(3u, notif_number); + + priority = "normal"; + notif_number = manager_->GetNotificationsNumber(priority); + EXPECT_EQ(5u, notif_number); + + priority = "none"; + notif_number = manager_->GetNotificationsNumber(priority); + EXPECT_EQ(6u, notif_number); +} + +TEST_F(PolicyManagerImplTest2, IsAppRevoked_SetRevokedAppID_ExpectAppRevoked) { + // Arrange + std::ifstream ifile(kValidSdlPtUpdateJson); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open() && reader.parse(ifile, root, true)) { + root["policy_table"]["app_policies"][app_id_1_] = Json::nullValue; + json = root.toStyledString(); + } + ifile.close(); + + ::policy::BinaryMessage msg(json.begin(), json.end()); + ASSERT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(manager_->GetCache()->IsPTPreloaded()); + EXPECT_TRUE(manager_->IsApplicationRevoked(app_id_1_)); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_SetRevokedAppID_ExpectRPCDisallowed) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + cache->AddDevice(device_id_1_, "Bluetooth"); + cache->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth"); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + .WillRepeatedly(Return(device_id_1_)); + manager_->SetUserConsentForDevice(device_id_1_, true); + // Add app from consented device. App will be assigned with default policies + manager_->AddApplication(app_id_1_); + // Check before action + policy_table::RpcParameters rpc_parameters; + rpc_parameters.hmi_levels.push_back(policy_table::HL_FULL); + + policy_table::Rpc rpc; + rpc["Alert"] = rpc_parameters; + + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + + manager_->CheckPermissions( + app_id_1_, kHmiLevelFull, "Alert", input_params, output); + + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + ASSERT_TRUE(output.list_of_allowed_params.empty()); + // Act + std::ifstream ifile(kValidSdlPtUpdateJson); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + EXPECT_TRUE(ifile.is_open()); + EXPECT_TRUE(reader.parse(ifile, root, true)); + root["policy_table"]["app_policies"][app_id_1_] = Json::nullValue; + json = root.toStyledString(); + ifile.close(); + + ::policy::BinaryMessage msg(json.begin(), json.end()); + ASSERT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(cache->IsPTPreloaded()); + + manager_->CheckPermissions( + app_id_1_, kHmiLevelFull, "Alert", input_params, output); + // Check RPC is disallowed + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + ASSERT_TRUE(output.list_of_allowed_params.empty()); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_SetAppIDwithPolicies_ExpectRPCAllowed) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddDevice(device_id_1_, "Bluetooth"); + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + + ASSERT_TRUE(cache->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .WillRepeatedly(Return(device_id_1_)); + manager_->SetUserConsentForDevice(device_id_1_, true); + // Add app from consented device. App will be assigned with default policies + manager_->AddApplication(application_id_); + // Emulate PTU with new policies for app added above + std::ifstream ifile(kValidSdlPtUpdateJson); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open() && reader.parse(ifile, root, true)) { + // Add AppID with policies + root["policy_table"]["app_policies"][application_id_] = + Json::Value(Json::objectValue); + root["policy_table"]["app_policies"][application_id_]["memory_kb"] = + Json::Value(50); + root["policy_table"]["app_policies"][application_id_] + ["heart_beat_timeout_ms"] = Json::Value(100); + root["policy_table"]["app_policies"][application_id_]["AppHMIType"] = + Json::Value(Json::arrayValue); + root["policy_table"]["app_policies"][application_id_]["AppHMIType"][0] = + Json::Value("MEDIA"); + root["policy_table"]["app_policies"][application_id_]["groups"] = + Json::Value(Json::arrayValue); + root["policy_table"]["app_policies"][application_id_]["groups"][0] = + Json::Value("Base-4"); + root["policy_table"]["app_policies"][application_id_]["priority"] = + Json::Value("EMERGENCY"); + root["policy_table"]["app_policies"][application_id_]["default_hmi"] = + Json::Value("FULL"); + root["policy_table"]["app_policies"][application_id_]["keep_context"] = + Json::Value(true); + root["policy_table"]["app_policies"][application_id_]["steal_focus"] = + Json::Value(true); + root["policy_table"]["app_policies"][application_id_]["certificate"] = + Json::Value("sign"); + json = root.toStyledString(); + } + ifile.close(); + + ::policy::BinaryMessage msg(json.begin(), json.end()); + // Load Json to cache + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(cache->IsPTPreloaded()); + + policy_table::RpcParameters rpc_parameters; + rpc_parameters.hmi_levels.push_back(policy_table::HL_FULL); + + policy_table::Rpc rpc; + rpc["Alert"] = rpc_parameters; + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .WillOnce(Return(device_id_1_)); + cache->AddDevice(device_id_1_, "Bluetooth"); + cache->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth"); + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "Alert", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of parameters empty + ASSERT_TRUE(output.list_of_allowed_params.empty()); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_NoParametersInPT_CheckRpcsInDifferentLevels) { + // Arrange + AddSetDeviceData(); + LoadPTUFromJsonFile("json/sdl_update_pt_send_location.json"); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + ASSERT_TRUE(output.list_of_allowed_params.empty()); + + // Reset output + ResetOutputList(output); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + ASSERT_TRUE(output.list_of_allowed_params.empty()); + + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + ASSERT_TRUE(output.list_of_allowed_params.empty()); + + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + // Check RPC is disallowed + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + // Check list of parameters is empty + ASSERT_TRUE(output.list_of_allowed_params.empty()); +} + +TEST_F( + PolicyManagerImplTest2, + CheckPermissions_ParamsNotAllowedInPT_AddAppWithAllParams_CheckRpcsInDiffLvls) { + // Arrange + AddSetDeviceData(); + // File have empty parameters, so they are forbidden + LoadPTUFromJsonFile("json/sdl_update_pt_send_location_no_params.json"); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + InsertRpcParametersInList(input_params); + + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + + // Group which has RPC does not require user consent, so its auto-allowed for + // user. Since RPC 'parameters' section is present, but empty, that means + // 'every parameter is disallowed' in case some parameter(s) will be passed + // it will be considered as disallowed by policy (assumption, will be + // clarified). + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + + // Check list of allowed parameters is empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + ResetOutputList(output); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + + // Check list of allowed parameters is empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + + // Check list of allowed parameters is empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + + // Reset output + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + + // Check lists of parameters are empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + EXPECT_TRUE(output.list_of_undefined_params.empty()); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_SomeParamsAllowedInPT_CheckRpcsInDiffLvls) { + // Arrange + AddSetDeviceData(); + + // File have some parameters, so only "longitudeDegrees", "latitudeDegrees", + //"locationDescription", "phoneNumber" are allowed + LoadPTUFromJsonFile("json/sdl_update_pt_send_location_some_params.json"); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + InsertRpcParametersInList(input_params); + + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + + // Check list of allowed parameters is not empty + ASSERT_FALSE(output.list_of_allowed_params.empty()); + // Check parameters that should be allowed + CheckIsParamInList(output.list_of_allowed_params, "longitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "latitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "locationDescription"); + CheckIsParamInList(output.list_of_allowed_params, "phoneNumber"); + + // Parameters that are missing in application assigned groups are considered + // as disallowed by policy, i.e. w/o defined user consent, so they are put to + // undefined container. + ASSERT_FALSE(output.list_of_undefined_params.empty()); + CheckIsParamInList(output.list_of_undefined_params, "locationName"); + CheckIsParamInList(output.list_of_undefined_params, "addressLines"); + CheckIsParamInList(output.list_of_undefined_params, "locationImage"); + CheckIsParamInList(output.list_of_undefined_params, "deliveryMode"); + CheckIsParamInList(output.list_of_undefined_params, "timeStamp"); + CheckIsParamInList(output.list_of_undefined_params, "address"); + + // Reset output + output.hmi_level_permitted = ::policy::kRpcDisallowed; + output.list_of_allowed_params.clear(); + output.list_of_undefined_params.clear(); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + + // Check list of allowed parameters is not empty + ASSERT_FALSE(output.list_of_allowed_params.empty()); + // Check parameters that should be allowed + CheckIsParamInList(output.list_of_allowed_params, "longitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "latitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "locationDescription"); + CheckIsParamInList(output.list_of_allowed_params, "phoneNumber"); + + ASSERT_FALSE(output.list_of_undefined_params.empty()); + EXPECT_EQ(6u, output.list_of_undefined_params.size()); + // Reset output + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + + // Check parameters that should be allowed + ASSERT_FALSE(output.list_of_allowed_params.empty()); + CheckIsParamInList(output.list_of_allowed_params, "longitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "latitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "locationDescription"); + CheckIsParamInList(output.list_of_allowed_params, "phoneNumber"); + + EXPECT_FALSE(output.list_of_undefined_params.empty()); + // Reset output + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + // Check RPC is disallowed + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + // Check lists of parameters are empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + EXPECT_TRUE(output.list_of_undefined_params.empty()); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_NoParamsInPT_AddAppWithAllParams_CheckRpcsInDiffLvls) { + // File does not have parameters, so they all are permitted + CheckPermissions_AllParamsAllowed_CheckRpcsInDiffLvls( + "json/sdl_update_pt_send_location.json"); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_AllParamsAllowedInPT_CheckRpcsInDiffLvls) { + // File has permissions for all params + CheckPermissions_AllParamsAllowed_CheckRpcsInDiffLvls( + "json/sdl_update_pt_send_location_all_params.json"); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_DiffParamsAllowedInGroups_CheckRpcsInDiffLvls) { + // Arrange + AddSetDeviceData(); + // Load Json to cache + // File have 2 functional groups: SendLocation and SendLocationOnly. + // They have different parameters. + // Allowed both groups of parameters + LoadPTUFromJsonFile("json/sdl_update_pt_2_groups_have_params.json"); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + InsertRpcParametersInList(input_params); + + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of allowed parameters is not empty + EXPECT_FALSE(output.list_of_allowed_params.empty()); + EXPECT_EQ(7u, output.list_of_allowed_params.size()); + // Check parameters that should be allowed + CheckIsParamInList(output.list_of_allowed_params, "longitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "latitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "locationDescription"); + CheckIsParamInList(output.list_of_allowed_params, "phoneNumber"); + CheckIsParamInList(output.list_of_allowed_params, "locationName"); + CheckIsParamInList(output.list_of_allowed_params, "locationImage"); + CheckIsParamInList(output.list_of_allowed_params, "deliveryMode"); + + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + ResetOutputList(output); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of allowed parameters is not empty + EXPECT_FALSE(output.list_of_allowed_params.empty()); + EXPECT_EQ(7u, output.list_of_allowed_params.size()); + // Check parameters that should be allowed + CheckIsParamInList(output.list_of_allowed_params, "longitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "latitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "locationDescription"); + CheckIsParamInList(output.list_of_allowed_params, "phoneNumber"); + CheckIsParamInList(output.list_of_allowed_params, "locationName"); + CheckIsParamInList(output.list_of_allowed_params, "locationImage"); + CheckIsParamInList(output.list_of_allowed_params, "deliveryMode"); + + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of allowed parameters is not empty + EXPECT_FALSE(output.list_of_allowed_params.empty()); + EXPECT_EQ(7u, output.list_of_allowed_params.size()); + // Check parameters that should be allowed + CheckIsParamInList(output.list_of_allowed_params, "longitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "latitudeDegrees"); + CheckIsParamInList(output.list_of_allowed_params, "locationDescription"); + CheckIsParamInList(output.list_of_allowed_params, "phoneNumber"); + CheckIsParamInList(output.list_of_allowed_params, "locationName"); + CheckIsParamInList(output.list_of_allowed_params, "locationImage"); + CheckIsParamInList(output.list_of_allowed_params, "deliveryMode"); + + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + // Reset output + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + // Check RPC is disallowed + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + // Check lists of parameters are empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + EXPECT_TRUE(output.list_of_undefined_params.empty()); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_ParamsAllowedInOneGroup_CheckRpcsInDiffLvls) { + // Load Json to cache + // File have 2 functional groups: SendLocation and SendLocationOnly. + // They have different parameters. One has dissalowed all params, other - + // allowed. + + // Arrange + CreateLocalPT("json/sdl_preloaded_pt_send_location.json"); + manager_->AddDevice(device_id_1_, "Bluetooth"); + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + ASSERT_TRUE(cache->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + // Add app from consented device. App will be assigned with default policies + manager_->AddApplication(application_id_); + + std::ifstream ifile("json/sdl_update_pt_2_groups_no_params_in1.json"); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open()) { + reader.parse(ifile, root, true); + } + json = root.toStyledString(); + ifile.close(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(cache->IsPTPreloaded()); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + InsertRpcParametersInList(input_params); + + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + ResetOutputList(output); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + // Reset output + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); +} + +TEST_F(PolicyManagerImplTest2, + CheckPermissions_ParamOmmittedInOneGroup_CheckRpcsInDiffLvls) { + // Load Json to cache + // File have 2 functional groups: SendLocation and SendLocationOnly. + // They have different parameters. One has dissalowed all params, other - + // omitted. + + // Arrange + CreateLocalPT("json/sdl_preloaded_pt_send_location.json"); + manager_->AddDevice(device_id_1_, "Bluetooth"); + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + ASSERT_TRUE(cache->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + // Add app from consented device. App will be assigned with default policies + manager_->AddApplication(application_id_); + + std::ifstream ifile( + "json/sdl_update_pt_2_groups_no_params_in1_omitted_in2.json"); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open()) { + reader.parse(ifile, root, true); + } + json = root.toStyledString(); + ifile.close(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(cache->IsPTPreloaded()); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + InsertRpcParametersInList(input_params); + + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + ResetOutputList(output); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_undefined_params.size()); + // Reset output + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + EXPECT_TRUE(output.list_of_undefined_params.empty()); +} + +TEST_F(PolicyManagerImplTest, LoadPT_SetInvalidUpdatePT_PTIsNotLoaded) { + // Arrange + manager_->ForcePTExchange(); + manager_->OnUpdateStarted(); + Json::Value table(Json::objectValue); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + + // Assert update is invalid + ASSERT_FALSE(IsValid(update)); + + // Act + std::string json = table.toStyledString(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + + // Assert + EXPECT_CALL(*cache_manager_, GenerateSnapshot()).Times(0); + EXPECT_CALL(*cache_manager_, ApplyUpdate(_)).Times(0); + EXPECT_CALL(listener_, GetAppName(_)).Times(0); + EXPECT_CALL(listener_, OnUpdateStatusChanged(_)).Times(1); + EXPECT_CALL(*cache_manager_, SaveUpdateRequired(false)).Times(0); + EXPECT_CALL(*cache_manager_, TimeoutResponse()).Times(0); + EXPECT_CALL(*cache_manager_, SecondsBetweenRetries(_)).Times(0); + EXPECT_FALSE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_CALL(*cache_manager_, IsPTPreloaded()); + EXPECT_FALSE(manager_->GetCache()->IsPTPreloaded()); +} + +TEST_F( + PolicyManagerImplTest2, + AddApplication_AddExistingApplicationFromDeviceWithoutConsent_ExpectNoUpdateRequired) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + GetPTU(kValidSdlPtUpdateJson); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + // Try to add existing app + manager_->AddApplication(app_id_2_); + // Check no update required + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); +} + +uint32_t GetCurrentDaysCount() { + TimevalStruct current_time = date_time::DateTime::getCurrentTime(); + const uint32_t kSecondsInDay = 60 * 60 * 24; + return current_time.tv_sec / kSecondsInDay; +} + +TEST_F(PolicyManagerImplTest2, + PTUpdatedAt_DaysNotExceedLimit_ExpectNoUpdateRequired) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + const uint32_t days = GetCurrentDaysCount(); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + + GetPTU(kValidSdlPtUpdateJson); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + + manager_->AddApplication(app_id_2_); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; + // Set PT was updated 10 days ago (limit is 30 days for now) + // So no limit exceeded + manager_->PTUpdatedAt(counter, days - 10); + manager_->OnAppRegisteredOnMobile(app_id_2_); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest2, + PTUpdatedAt_DaysExceedLimit_ExpectUpdateRequired) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + const uint32_t days = GetCurrentDaysCount(); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + GetPTU(kValidSdlPtUpdateJson); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + + manager_->AddApplication(app_id_2_); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; + // Set PT was updated 50 days ago (limit is 30 days for now) + manager_->PTUpdatedAt(counter, days - 50); + manager_->OnAppRegisteredOnMobile(app_id_2_); + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); +} + +TEST_F( + PolicyManagerImplTest2, + OnIgnitionCyclesExceeded_SetExceededIgnitionCycles_ExpectUpdateScheduled) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + const uint32_t days = GetCurrentDaysCount(); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + GetPTU(kValidSdlPtUpdateJson); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + // Try to add existing app + manager_->AddApplication(app_id_2_); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + ::policy::Counters counter = ::policy::Counters::DAYS_AFTER_EPOCH; + // Set PT was updated 10 days ago (limit is 30 days for now) + // So no limit exceeded + manager_->PTUpdatedAt(counter, days - 10); + int ign_cycles = (manager_->GetCache())->IgnitionCyclesBeforeExchange(); + // Set ignition cycles to value = 99 (limit is 100 which initiates auto + // PTExchange) + for (int i = 0; i < ign_cycles; ++i) { + manager_->IncrementIgnitionCycles(); + } + manager_->OnAppRegisteredOnMobile(app_id_2_); + // Check update required + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest2, + GetUserConsentForApp_SetUserConsentForApp_ExpectReceivedConsentCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + ::policy::StringArray consented_groups; + ::policy::StringArray disallowed_groups; + consented_groups.push_back(std::string("Notifications")); + consented_groups.push_back(std::string("Notifications")); + (manager_->GetCache()) + ->SetUserPermissionsForDevice( + device_id_2_, consented_groups, disallowed_groups); + manager_->SetUserConsentForDevice(device_id_2_, true); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + GetPTU(kValidSdlPtUpdateJson); + + ::policy::PermissionConsent perm_consent; + perm_consent.device_id = device_id_2_; + perm_consent.policy_app_id = app_id_2_; + perm_consent.consent_source = "VR"; + + ::policy::FunctionalGroupPermission group1_perm; + group1_perm.group_alias = "Notifications"; + group1_perm.group_name = "Notifications"; + group1_perm.group_id = ::utils::Djb2HashFromString("Notifications"); + group1_perm.state = ::policy::GroupConsent::kGroupAllowed; + + std::vector< ::policy::FunctionalGroupPermission> groups_permissions; + groups_permissions.push_back(group1_perm); + perm_consent.group_permissions = groups_permissions; + + manager_->SetUserConsentForApp(perm_consent); + manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; + std::vector< ::policy::FunctionalGroupPermission>::iterator it; + manager_->GetUserConsentForApp( + device_id_2_, app_id_2_, actual_groups_permissions); + uint32_t index = 0; + for (; index < actual_groups_permissions.size(); ++index) { + if (actual_groups_permissions[index].group_id == group1_perm.group_id) { + break; + } + } + // Check + EXPECT_EQ(group1_perm.group_alias, + actual_groups_permissions[index].group_alias); + EXPECT_EQ(group1_perm.group_name, + actual_groups_permissions[index].group_name); + EXPECT_EQ(group1_perm.group_id, actual_groups_permissions[index].group_id); + EXPECT_EQ(group1_perm.state, actual_groups_permissions[index].state); +} + +TEST_F(PolicyManagerImplTest2, + CanAppKeepContext_SetPoliciesForAppUpdated_ExpectAppCanKeepContext) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + GetPTU(kValidSdlPtUpdateJson); + // Check keep context in updated policies for app + EXPECT_TRUE(manager_->CanAppKeepContext(app_id_2_)); +} + +TEST_F(PolicyManagerImplTest2, + CanAppStealFocus_SetPoliciesForAppUpdated_ExpectAppCanStealFocus) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + GetPTU(kValidSdlPtUpdateJson); + // Check keep context in updated policies for app + EXPECT_TRUE(manager_->CanAppKeepContext(app_id_2_)); +} + +TEST_F(PolicyManagerImplTest2, + GetVehicleInfo_SetVehicleInfo_ExpectReceivedInfoCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + GetPTU(kValidSdlPtUpdateJson); + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + policy_table::ModuleConfig& module_config = pt->policy_table.module_config; + ::policy::VehicleInfo vehicle_info = manager_->GetVehicleInfo(); + + EXPECT_EQ(static_cast<std::string>(*module_config.vehicle_make), + vehicle_info.vehicle_make); + EXPECT_EQ(static_cast<std::string>(*module_config.vehicle_model), + vehicle_info.vehicle_model); + EXPECT_EQ(static_cast<std::string>(*module_config.vehicle_year), + vehicle_info.vehicle_year); +} + +TEST_F( + PolicyManagerImplTest2, + GetPermissionsForApp_SetUserConsentForApp_ExpectReceivedPermissionsCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + ::policy::StringArray consented_groups; + ::policy::StringArray disallowed_groups; + consented_groups.push_back(std::string("Notifications")); + (manager_->GetCache()) + ->SetUserPermissionsForDevice( + device_id_2_, consented_groups, disallowed_groups); + manager_->SetUserConsentForDevice(device_id_2_, true); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + + GetPTU(kValidSdlPtUpdateJson); + ::policy::PermissionConsent perm_consent; + perm_consent.device_id = device_id_2_; + perm_consent.policy_app_id = app_id_2_; + perm_consent.consent_source = "VR"; + + ::policy::FunctionalGroupPermission group1_perm; + group1_perm.group_alias = "Notifications"; + group1_perm.group_name = "Notifications"; + group1_perm.group_id = ::utils::Djb2HashFromString("Notifications"); + group1_perm.state = ::policy::GroupConsent::kGroupAllowed; + + std::vector< ::policy::FunctionalGroupPermission> groups_permissions; + groups_permissions.push_back(group1_perm); + perm_consent.group_permissions = groups_permissions; + + manager_->SetUserConsentForApp(perm_consent); + manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; + std::vector< ::policy::FunctionalGroupPermission>::iterator it; + manager_->GetPermissionsForApp( + device_id_2_, app_id_2_, actual_groups_permissions); + uint32_t index = 0; + for (; index < actual_groups_permissions.size(); ++index) { + if (actual_groups_permissions[index].group_id == group1_perm.group_id) { + break; + } + } + // Check + EXPECT_EQ(group1_perm.group_alias, + actual_groups_permissions[index].group_alias); + EXPECT_EQ(group1_perm.group_name, + actual_groups_permissions[index].group_name); + EXPECT_EQ(group1_perm.group_id, actual_groups_permissions[index].group_id); + EXPECT_EQ(group1_perm.state, actual_groups_permissions[index].state); +} + +TEST_F( + PolicyManagerImplTest2, + GetAppRequestTypes_AddApp_UpdateAppPolicies_ExpectReceivedRequestTypesCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + + manager_->AddApplication(app_id_3_); + ::policy::StringArray app_requests = manager_->GetAppRequestTypes(app_id_3_); + EXPECT_EQ(1u, app_requests.size()); + + Json::Value root = GetPTU(kPtuRequestTypeJson); + Json::Value request_Types = Json::Value(Json::arrayValue); + request_Types = + root["policy_table"]["app_policies"][app_id_3_]["RequestType"]; + app_requests = manager_->GetAppRequestTypes(app_id_3_); + EXPECT_EQ(request_Types.size(), app_requests.size()); + // Check nicknames match + for (uint32_t i = 0; i < request_Types.size(); ++i) { + EXPECT_EQ(request_Types[i], app_requests[i]); + } +} + +TEST_F( + PolicyManagerImplTest2, + HertBeatTimeout_AddApp_UpdateAppPolicies_ExpectReceivedHertBeatTimeoutCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + ::policy_table::PolicyTableType type1 = + ::policy_table::PolicyTableType::PT_PRELOADED; + pt->SetPolicyTableType(type1); + if (!pt->is_valid()) { + std::cout << "\nPolicy table is not valid." + << "\n"; + rpc::ValidationReport report("policy_table"); + pt->ReportErrors(&report); + } + // Add new app + manager_->AddApplication(app_id_2_); + uint32_t result = manager_->HeartBeatTimeout(app_id_2_); + // By default hertbeat timeout is 0 + EXPECT_EQ(0u, result); + Json::Value root = GetPTU(kValidSdlPtUpdateJson); + + ::policy_table::PolicyTableType type2 = + ::policy_table::PolicyTableType::PT_UPDATE; + pt->SetPolicyTableType(type2); + if (!pt->is_valid()) { + std::cout << "\nPolicy table is not valid." + << "\n"; + rpc::ValidationReport report("policy_table"); + pt->ReportErrors(&report); + } + + Json::Value heart_beat_timeout = Json::Value(Json::uintValue); + heart_beat_timeout = + root["policy_table"]["app_policies"][app_id_2_]["heart_beat_timeout_ms"]; + result = manager_->HeartBeatTimeout(app_id_2_); + EXPECT_EQ(heart_beat_timeout.asUInt(), result); +} + +TEST_F(PolicyManagerImplTest2, + RemoveAppConsentForGroup_SetUserConsentForApp_ExpectAppConsentDeleted) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + ::policy::StringArray consented_groups; + ::policy::StringArray disallowed_groups; + consented_groups.push_back(std::string("Notifications")); + (manager_->GetCache()) + ->SetUserPermissionsForDevice( + device_id_2_, consented_groups, disallowed_groups); + manager_->SetUserConsentForDevice(device_id_2_, true); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + GetPTU(kValidSdlPtUpdateJson); + + ::policy::PermissionConsent perm_consent; + perm_consent.device_id = device_id_2_; + perm_consent.policy_app_id = app_id_2_; + perm_consent.consent_source = "VR"; + + ::policy::FunctionalGroupPermission group1_perm; + group1_perm.group_alias = "Notifications"; + group1_perm.group_name = "Notifications"; + group1_perm.group_id = ::utils::Djb2HashFromString("Notifications"); + group1_perm.state = ::policy::GroupConsent::kGroupAllowed; + + std::vector< ::policy::FunctionalGroupPermission> groups_permissions; + groups_permissions.push_back(group1_perm); + perm_consent.group_permissions = groups_permissions; + + manager_->SetUserConsentForApp(perm_consent); + manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + std::vector< ::policy::FunctionalGroupPermission> actual_groups_permissions; + std::vector< ::policy::FunctionalGroupPermission>::iterator it; + manager_->GetPermissionsForApp( + device_id_2_, app_id_2_, actual_groups_permissions); + uint32_t index = 0; + for (; index < actual_groups_permissions.size(); ++index) { + if (actual_groups_permissions[index].group_id == group1_perm.group_id) { + break; + } + } + // Check + EXPECT_EQ(group1_perm.group_alias, + actual_groups_permissions[index].group_alias); + EXPECT_EQ(group1_perm.group_name, + actual_groups_permissions[index].group_name); + EXPECT_EQ(group1_perm.group_id, actual_groups_permissions[index].group_id); + EXPECT_EQ(group1_perm.state, actual_groups_permissions[index].state); + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + uint32_t ucr_size = 0; + ::policy_table::DeviceData& device_data = *pt->policy_table.device_data; + ::policy_table::DeviceData::const_iterator dev_data_iter = + device_data.find(device_id_2_); + if (dev_data_iter != device_data.end()) { + const ::policy_table::DeviceParams& dev_params = dev_data_iter->second; + const ::policy_table::UserConsentRecords& ucr = + *(dev_params.user_consent_records); + ucr_size = ucr.size(); + ASSERT_GT(ucr_size, 0u); + ::policy_table::UserConsentRecords::const_iterator ucr_iter = + ucr.find(app_id_2_); + if (ucr_iter != ucr.end()) { + EXPECT_TRUE((*(ucr_iter->second.consent_groups)).find("Notifications") != + (*(ucr_iter->second.consent_groups)).end()); + manager_->RemoveAppConsentForGroup(app_id_2_, "Notifications"); + EXPECT_TRUE((*(ucr_iter->second.consent_groups)).find("Notifications") == + (*(ucr_iter->second.consent_groups)).end()); + } + } +} + +TEST_F(PolicyManagerImplTest2, + SingleInvalidRequestTypeInPTU_ExpectReplaceWithDefaultValues) { + // Arrange + const std::string section_name = app_id_2_; + + // Arrange + CreateLocalPT(preloadet_pt_filename_); + + // Setting device consent to 'true' in order to have defult application + // permissions, request type etc. + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_1_)); + manager_->SetUserConsentForDevice(device_id_1_, true); + + // Add app + manager_->AddApplication(section_name); + EXPECT_CALL(listener_, OnPendingPermissionChange(section_name)).Times(2); + + // PTU has single invalid RequestTypes, which must be dropped and replaced + // with default RT + GetPTU("json/PTU_with_one_invalid_requestType.json"); + + // Get RequestTypes from <app_id> section of app policies after PT update + ::policy::StringArray app_request_types_after = + manager_->GetAppRequestTypes(section_name); + + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(kDefaultId)) + .WillOnce(Return(device_id_1_)); + ::policy::StringArray default_request_types_after = + manager_->GetAppRequestTypes(kDefaultId); + + // Check sizes of Request types of PT and PTU + EXPECT_EQ(4u, app_request_types_after.size()); + + ::policy::AppPermissions permissions = + manager_->GetAppPermissionsChanges(section_name); + EXPECT_TRUE(permissions.requestTypeChanged); + + policy_table::RequestType temp_res1; + std::vector<policy_table::RequestType> result1; + for (uint32_t i = 0; i < app_request_types_after.size(); ++i) { + if (::rpc::policy_table_interface_base::EnumFromJsonString( + app_request_types_after[i], &temp_res1)) { + result1.push_back(temp_res1); + } + } + policy_table::RequestType temp_res2; + std::vector<policy_table::RequestType> result2; + for (size_t i = 0; i < default_request_types_after.size(); ++i) { + if (::rpc::policy_table_interface_base::EnumFromJsonString( + default_request_types_after[i], &temp_res2)) { + result2.push_back(temp_res2); + } + } + ASSERT_EQ(result1.size(), result2.size()); + std::sort(result1.begin(), result1.end()); + std::sort(result2.begin(), result2.end()); + // Checks + EXPECT_TRUE(std::equal(result1.begin(), result1.end(), result2.begin())); +} + +TEST_F(PolicyManagerImplTest2, + InitPT_LoadPT_ExpectIncrementedCountOfSamePrompts) { + // Initializing policy_table + CreateLocalPT(preloadet_pt_filename_); + + policy_table::FunctionalGroupings functional_groupings; + GetFunctionalGroupingsFromManager(functional_groupings); + + UserConsentPromptToRpcsConnections initial_functional_groupings_map; + UserConsentPromptToRpcsConnections updated_functional_groupings_map; + // Filling initial map + FillMultimapFromFunctionalGroupings(initial_functional_groupings_map, + functional_groupings); + + // Updating policy_table + GetPTU("json/sdl_pt_update.json"); + policy_table::FunctionalGroupings updated_functional_groupings; + GetFunctionalGroupingsFromManager(updated_functional_groupings); + // Filling updated map + FillMultimapFromFunctionalGroupings(updated_functional_groupings_map, + updated_functional_groupings); + + // Comparing two multimaps + // (EXPECT increment count of functionalgroups + // under key : user_consent_prompt) + uint32_t count_before_update = + initial_functional_groupings_map.count("Notifications"); + uint32_t count_after_update = + updated_functional_groupings_map.count("Notifications"); + EXPECT_EQ(1u, count_before_update); + EXPECT_EQ(2u, count_after_update); +} + +TEST_F(PolicyManagerImplTest2, + LoadPT_UpdatePT_ChangingCountsOfDifferentUserConsentPrompts) { + // Initializing policy_table + CreateLocalPT(preloadet_pt_filename_); + + // First update of policy table + GetPTU("json/sdl_pt_first_update.json"); + // Geting functional groupings first time + policy_table::FunctionalGroupings first_functional_groupings; + GetFunctionalGroupingsFromManager(first_functional_groupings); + // Filling map first time + UserConsentPromptToRpcsConnections first_update_functional_groupings_map; + FillMultimapFromFunctionalGroupings(first_update_functional_groupings_map, + first_functional_groupings); + + // Second update of policy table + GetPTU("json/sdl_pt_second_update.json"); + // Geting functional groupings second time + policy_table::FunctionalGroupings second_functional_groupings; + GetFunctionalGroupingsFromManager(second_functional_groupings); + // Filling map second time + UserConsentPromptToRpcsConnections second_update_functional_groupings_map; + FillMultimapFromFunctionalGroupings(second_update_functional_groupings_map, + second_functional_groupings); + + // Getting counts before second update + uint32_t first_count_of_old_user_consent_prompt = + first_update_functional_groupings_map.count("Old_Notifications"); + uint32_t first_count_of_new_user_consent_prompt = + first_update_functional_groupings_map.count("New_Notifications"); + + // Getting counts after second update + uint32_t second_count_of_old_user_consent_prompt = + second_update_functional_groupings_map.count("Old_Notifications"); + uint32_t second_count_of_new_user_consent_prompt = + second_update_functional_groupings_map.count("New_Notifications"); + + // Expect decrement count of old user_consent_prormpt + EXPECT_GT(first_count_of_old_user_consent_prompt, + second_count_of_old_user_consent_prompt); + // Expect increment count of new user_consent_prormpt + EXPECT_LT(first_count_of_new_user_consent_prompt, + second_count_of_new_user_consent_prompt); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_PTWithOneInvalidRequestTypeValue_RequestTypeValueEQToDefault) { + // Logic in another function + CompareAppRequestTypesWithDefault(kAppId, kJsonFiles[0]); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_InvalidRequestTypeBetweenCorectValuesInPTU_EraseInvalidValue) { + // Refresh policy table with invalid RequestType in application + RefreshPT(preloadet_pt_filename_, kJsonFiles[1]); + // Correct of Request Types + policy_table::RequestTypes correct_types; + correct_types.push_back(policy_table::RequestType::RT_HTTP); + correct_types.push_back(policy_table::RequestType::RT_LAUNCH_APP); + correct_types.push_back(policy_table::RequestType::RT_PROPRIETARY); + // Get <app_id> Request Types + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(kAppId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F( + PolicyManagerImplTest_RequestTypes, + LoadPT_AppInUpdateFileHaventRequestTypeField_RequestTypeValueEQToDefault) { + // Logic in another function + CompareAppRequestTypesWithDefault(kAppId, kJsonFiles[2]); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_RequestTypeArrayHaveNoOneValues_AvalibleAllRequestTypes) { + // Refresh policy table with invalid RequestType in application + RefreshPT(preloadet_pt_filename_, kJsonFiles[3]); + + // Get <app_id> Request Types + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(kAppId); + + // Expect + const size_t correct_size = 0; + const size_t received_size = received_types.size(); + EXPECT_EQ(correct_size, received_size); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + InitPT_DefaultRequestTypeHaveOneInvalidValue_False) { + // PT have only invalid value in app_policies::default::RequestType + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(app_storage_folder_)); + ASSERT_FALSE( + policy_manager_impl_sptr_->InitPT(kJsonFiles[4], &policy_settings_)); + // Invalid table data with pt_preloaded=true + EXPECT_TRUE(policy_manager_impl_sptr_->GetCache()->IsPTPreloaded()); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + InitPT_DefaultRequestTypeHaveSeveralInvalidValues_False) { + // PT have several only invalid values in app_policies::default::RequestType + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(app_storage_folder_)); + ASSERT_FALSE( + policy_manager_impl_sptr_->InitPT(kJsonFiles[5], &policy_settings_)); + // Invalid table data with pt_preloaded=true + EXPECT_TRUE(policy_manager_impl_sptr_->GetCache()->IsPTPreloaded()); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + InitPT_DefaultRequestTypeHaveInvalidValueBetweenCorrect_True) { + // PT have ["QUERY_APPS", "IVSU", "PROPRIETARY"] + // In app_policies::default::RequestType + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(app_storage_folder_)); + ASSERT_TRUE( + policy_manager_impl_sptr_->InitPT(kJsonFiles[6], &policy_settings_)); + EXPECT_TRUE(policy_manager_impl_sptr_->GetCache()->IsPTPreloaded()); + + // Correct of Request Types + policy_table::RequestTypes correct_types; + correct_types.push_back(policy_table::RequestType::RT_QUERY_APPS); + correct_types.push_back(policy_table::RequestType::RT_PROPRIETARY); + + // Get default Request Types + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(kDefaultAppId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_PTDefaultApp_RequestTypeValueEQToUpdate) { + // Base values of Request Types + policy_table::RequestTypes correct_types = CreateDefaultAppPTURequestValues(); + + // Load valid values for RequestType + RefreshPT(preloadet_pt_filename_, kJsonFiles[7]); + + // Get Request Types for "<default>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kDefaultId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F( + PolicyManagerImplTest_RequestTypes, + LoadPT_PTDefaultAppInvalidRequestTypeValues_RequestTypeValueEQToDatabase) { + // Base values of Request Types + policy_table::RequestTypes correct_types = + CreateDefaultAppDatabaseRequestValues(); + + // Load RequestType with invalid values + RefreshPT(preloadet_pt_filename_, kJsonFiles[8]); + + // Get Request Types for "<default>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kDefaultId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_PTDefaultAppEmptyRequestTypeValues_RequestTypeValueEmpty) { + // Load RequestType with empty values + RefreshPT(preloadet_pt_filename_, kJsonFiles[9]); + + // Get Request Types for "<default>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kDefaultId); + + // Expect + const size_t received_size = received_types.size(); + EXPECT_EQ(0u, received_size); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_PTDefaultAppOmittedRequestType_RequestTypeValueEQToDatabase) { + // Base values of Request Types + policy_table::RequestTypes correct_types = + CreateDefaultAppDatabaseRequestValues(); + + // Load omitted RequestType values + RefreshPT(preloadet_pt_filename_, kJsonFiles[10]); + + // Get Request Types for "<default>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kDefaultId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F( + PolicyManagerImplTest_RequestTypes, + LoadPT_PTDefaultAppOneInvalidRequestTypeValue_RequestTypeValueEQValidPT) { + // Update values of Request Types + policy_table::RequestTypes correct_types = CreateDefaultAppPTURequestValues(); + + // Load RequestType with one invalid value + RefreshPT(preloadet_pt_filename_, kJsonFiles[11]); + + // Get Request Types for "<default>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kDefaultId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_PTPreDataConsentApp_RequestTypeValueEQToUpdate) { + // Update values of Request Types + policy_table::RequestTypes correct_types = + CreatePreDataConsentAppPTURequestValues(); + + // Load valid values for RequestType + RefreshPT(preloadet_pt_filename_, kJsonFiles[12]); + + // Get Request Types for "<pre_DataConsent>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kPreDataConsentId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F( + PolicyManagerImplTest_RequestTypes, + LoadPT_PTPreDataConsentAppInvalidRequestTypeValues_RequestTypeValueEQToDatabase) { + // Update values of Request Types + policy_table::RequestTypes correct_types; + correct_types.push_back(policy_table::RequestType::RT_HTTP); + + // Load RequestType with invalid values + RefreshPT(preloadet_pt_filename_, kJsonFiles[13]); + + // Get Request Types for "<pre_DataConsent>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kPreDataConsentId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F(PolicyManagerImplTest_RequestTypes, + LoadPT_PTPreDataConsentAppEmptyRequestTypeValues_RequestTypeValueEmpty) { + // Load RequestType with empty values + RefreshPT(preloadet_pt_filename_, kJsonFiles[14]); + + // Get Request Types for "<pre_DataConsent>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kPreDataConsentId); + + // Expect + const size_t received_size = received_types.size(); + EXPECT_EQ(0u, received_size); +} + +TEST_F( + PolicyManagerImplTest_RequestTypes, + LoadPT_PTPreDataConsentAppOmittedRequestType_RequestTypeValueEQToDatabase) { + // Base values of Request Types + policy_table::RequestTypes correct_types; + correct_types.push_back(policy_table::RequestType::RT_HTTP); + + // Load omitted RequestType values + RefreshPT(preloadet_pt_filename_, kJsonFiles[15]); + + // Get Request Types for "<pre_DataConsent>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kPreDataConsentId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +TEST_F( + PolicyManagerImplTest_RequestTypes, + LoadPT_PTPreDataConsentAppOneInvalidRequestTypeValue_RequestTypeValueEQValidPT) { + // Update values of Request Types + policy_table::RequestTypes correct_types = + CreatePreDataConsentAppPTURequestValues(); + + // Load RequestType with one invalid value + RefreshPT(preloadet_pt_filename_, kJsonFiles[16]); + + // Get Request Types for "<pre_DataConsent>" + policy_table::RequestTypes received_types = + GetRequestTypesForApplication(policy::kPreDataConsentId); + + CompareRequestTypesContainers(correct_types, received_types); +} + +} // namespace policy +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc new file mode 100644 index 0000000000..54907ef6f2 --- /dev/null +++ b/src/components/policy/policy_external/test/policy_manager_impl_snapshot_test.cc @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <fstream> + +#include "gtest/gtest.h" + +#include "policy/policy_manager_impl_test_base.h" + +#include "json/json.h" + +namespace test { +namespace components { +namespace policy_test { + +using ::testing::Return; + +TEST_F(PolicyManagerImplTest2, UpdatedPreloadedPT_ExpectLPT_IsUpdated) { + // Arrange necessary pre-conditions + StringsForUpdate new_data; + new_data.new_field_name_ = "Notifications-"; + CreateNewRandomData(new_data); + // Create Initial LocalPT from preloadedPT + CreateLocalPT(preloadet_pt_filename_); + // Update preloadedPT + std::ifstream ifile(preloadet_pt_filename_); + Json::Reader reader; + Json::Value root(Json::objectValue); + + if (ifile.is_open() && reader.parse(ifile, root, true)) { + root["policy_table"]["module_config"]["preloaded_date"] = + new_data.new_date_; + Json::Value val(Json::objectValue); + Json::Value val2(Json::arrayValue); + val2[0] = hmi_level_[index_]; + val[new_data.new_field_value_]["hmi_levels"] = val2; + root["policy_table"]["functional_groupings"][new_data + .new_field_name_]["rpcs"] = + val; + root["policy_table"]["functional_groupings"][new_data.new_field_name_] + ["user_consent_prompt"] = new_data.new_field_name_; + } + ifile.close(); + + Json::StyledStreamWriter writer; + std::ofstream ofile(preloadet_pt_filename_); + writer.write(ofile, root); + ofile.flush(); + ofile.close(); + + // Make PolicyManager to update LocalPT + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + EXPECT_TRUE(manager_->InitPT(preloadet_pt_filename_, &policy_settings_)); + EXPECT_TRUE(cache->IsPTPreloaded()); + + // Arrange + utils::SharedPtr<policy_table::Table> table = cache->GenerateSnapshot(); + // Get FunctionalGroupings + policy_table::FunctionalGroupings& fc = + table->policy_table.functional_groupings; + // Get RPCs for new added field in functional_group + policy_table::Rpcs& rpcs = fc[new_data.new_field_name_]; + // Get user consent prompt + const std::string& ucp = *(rpcs.user_consent_prompt); + // Get Rpcs + policy_table::Rpc& rpc = rpcs.rpcs; + // Get RPC's parameters + policy_table::RpcParameters& rpc_param = rpc[new_data.new_field_value_]; + + // Check preloaded date + EXPECT_EQ(static_cast<std::string>( + *(table->policy_table.module_config.preloaded_date)), + new_data.new_date_); + // Check if new field exists in Local PT + EXPECT_TRUE(fc.find(new_data.new_field_name_) != fc.end()); + // Check if user_consent_propmp is correct + EXPECT_EQ(new_data.new_field_name_, ucp); + // Check if new RPC exists + EXPECT_TRUE(rpc.find(new_data.new_field_value_) != rpc.end()); + // Check HMI level of new RPC + EXPECT_EQ(index_, static_cast<uint32_t>(rpc_param.hmi_levels[0])); + // Check if new field matches field added to preloaded PT + EXPECT_EQ(std::string((*(fc.find(new_data.new_field_name_))).first), + new_data.new_field_name_); +} + +TEST_F(PolicyManagerImplTest2, + SetSystemLanguage_ExpectSystemLanguageSetSuccessfully) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->SetSystemLanguage("it-it"); + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + ::policy_table::ModuleMeta& ModuleMeta = *(pt->policy_table.module_meta); + EXPECT_EQ("it-it", static_cast<std::string>(*(ModuleMeta.language))); +} + +TEST_F(PolicyManagerImplTest2, SetVINValue_ExpectVINSetSuccessfully) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + std::string vin_code("1FAPP6242VH100001"); + manager_->SetVINValue(vin_code); + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + ::policy_table::ModuleMeta& ModuleMeta = *(pt->policy_table.module_meta); + EXPECT_EQ(vin_code, static_cast<std::string>(*(ModuleMeta.vin))); +} + +TEST_F(PolicyManagerImplTest2, SetSystemInfo_ExpectSystemInfoSetSuccessfully) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->SetSystemInfo("4.1.3.B_EB355B", "WAEGB", "ru-ru"); + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + utils::SharedPtr<policy_table::Table> pt = cache->GetPT(); + ::policy_table::ModuleMeta& ModuleMeta = *(pt->policy_table.module_meta); + EXPECT_EQ("ru-ru", static_cast<std::string>(*(ModuleMeta.language))); + EXPECT_EQ("4.1.3.B_EB355B", + static_cast<std::string>(*(ModuleMeta.ccpu_version))); + EXPECT_EQ("WAEGB", static_cast<std::string>(*(ModuleMeta.wers_country_code))); + EXPECT_FALSE(cache->IsPTPreloaded()); +} + +TEST_F(PolicyManagerImplTest2, CleanUnpairedDevice_ExpectDevicesDeleted) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Add first device + ::policy::DeviceInfo dev_info1; + dev_info1.hardware = "hardware IPX"; + dev_info1.firmware_rev = "v.8.0.1"; + dev_info1.os = "Android"; + dev_info1.os_ver = "4.4.2"; + dev_info1.carrier = "Life"; + dev_info1.max_number_rfcom_ports = 2; + dev_info1.connection_type = "Bluetooth"; + manager_->AddDevice(device_id_1_, "Bluetooth"); + manager_->SetDeviceInfo(device_id_1_, dev_info1); + + // Add second device + ::policy::DeviceInfo dev_info2; + dev_info2.hardware = "hardware SPX"; + dev_info2.firmware_rev = "v.6.0.1"; + dev_info2.os = "Android"; + dev_info2.os_ver = "4.1.1"; + dev_info2.carrier = "MTS"; + dev_info2.max_number_rfcom_ports = 2; + dev_info2.connection_type = "Bluetooth"; + manager_->AddDevice("ZZZ123456789YYY", "Bluetooth"); + manager_->SetDeviceInfo("ZZZ123456789YYY", dev_info2); + + // Add third device + ::policy::DeviceInfo dev_info3; + dev_info3.hardware = "hardware DNPX"; + dev_info3.firmware_rev = "v.4.0.1"; + dev_info3.os = "Android"; + dev_info3.os_ver = "5.0.1 Lollipop"; + dev_info3.carrier = "Kyivstar"; + dev_info3.max_number_rfcom_ports = 2; + dev_info3.connection_type = "Bluetooth"; + manager_->AddDevice("AAA123456789RRR", "Bluetooth"); + manager_->SetDeviceInfo("AAA123456789RRR", dev_info3); + + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + // Try to find first device in PT + policy_table::DeviceData::const_iterator iter = + (*(pt->policy_table.device_data)).find(device_id_1_); + // Check first device successfully added to PT + ASSERT_TRUE(iter != (*(pt->policy_table.device_data)).end()); + + // Try to find second device in PT + iter = (*(pt->policy_table.device_data)).find("ZZZ123456789YYY"); + // Check second device successfully added to PT + ASSERT_TRUE(iter != (*(pt->policy_table.device_data)).end()); + + // Try to find third device in PT + iter = (*(pt->policy_table.device_data)).find("AAA123456789RRR"); + // Check third device successfully added to PT + ASSERT_TRUE(iter != (*(pt->policy_table.device_data)).end()); + + manager_->MarkUnpairedDevice(device_id_1_); + manager_->MarkUnpairedDevice("ZZZ123456789YYY"); + manager_->MarkUnpairedDevice("AAA123456789RRR"); + manager_->CleanupUnpairedDevices(); + + // Try to find first device in PT + iter = (*(pt->policy_table.device_data)).find(device_id_1_); + // Check first device successfully deleted from PT + ASSERT_TRUE(iter == (*(pt->policy_table.device_data)).end()); + + // Try to find second device in PT + iter = (*(pt->policy_table.device_data)).find("ZZZ123456789YYY"); + // Check second device successfully deleted from PT + ASSERT_TRUE(iter == (*(pt->policy_table.device_data)).end()); + + // Try to find third device in PT + iter = (*(pt->policy_table.device_data)).find("AAA123456789RRR"); + // Check third device successfully deleted from PT + ASSERT_TRUE(iter == (*(pt->policy_table.device_data)).end()); +} + +TEST_F(PolicyManagerImplTest2, + AddValidRequestTypesToPT_default_Section_ExpectRTAdded) { + // Arrange + AddRTtoPT(kPtuJson, policy::kDefaultId, 1u, 0); + CheckResultForValidRT(); +} + +TEST_F(PolicyManagerImplTest2, + AddValidRequestTypeToPT_preDataConsentSection_ExpectRTAdded) { + // Arrange + AddRTtoPT(kPtuJson, policy::kPreDataConsentId, 1u, 0u); + CheckResultForValidRT(); +} + +TEST_F(PolicyManagerImplTest2, + AddInvalidRequestTypeToPT_defaultSection_ExpectIgnored) { + // Arrange + AddRTtoPT(kPtu3Json, policy::kDefaultId, 1u, 0u); + CheckResultForInvalidRT(); +} + +TEST_F(PolicyManagerImplTest2, + AddInvalidRequestTypeToPT_pre_DataConsentSection_ExpectIgnored) { + // Arrange + AddRTtoPT(kPtu3Json, policy::kPreDataConsentId, 1u, 1u); + CheckResultForInvalidRT(); +} + +TEST_F( + PolicyManagerImplTest2, + AddValidRequestTypeToPT_GetNewAppWithSpecificPoliciesViaPTU_ExpectRTAdded) { + const std::string section_name = application_id_; + + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Add app + manager_->AddApplication(section_name); + // Check app gets RequestTypes from pre_DataConsent of app_policies + // section + pt_request_types_ = manager_->GetAppRequestTypes(section_name); + + // Only single item as in pre_DataConsent in preloaded PT + EXPECT_EQ(1u, pt_request_types_.size()); + EXPECT_CALL(listener_, OnPendingPermissionChange(section_name)).Times(1); + + // PTU has RequestTypes as [] - means 'all allowed' + Json::Value root = GetPTU("json/PTU2.json"); + + // Setting device consent to 'true' in order to have appropriate application + // permissions, request type etc. + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .WillRepeatedly(Return(device_id_1_)); + manager_->SetUserConsentForDevice(device_id_1_, true); + + // Get App Request Types from PTU + ptu_request_types_ = + root["policy_table"]["app_policies"][section_name]["RequestType"]; + ptu_request_types_size_ = ptu_request_types_.size(); + + pt_request_types_.clear(); + // Get RequestTypes from <app_id> section of app policies after PT update + pt_request_types_ = manager_->GetAppRequestTypes(section_name); + + // Check sizes of Request types of PT and PTU + ASSERT_EQ(ptu_request_types_size_, pt_request_types_.size()); + + ::policy::AppPermissions permissions = + manager_->GetAppPermissionsChanges(section_name); + EXPECT_TRUE(permissions.requestTypeChanged); + + ::policy::StringArray result; + for (uint32_t i = 0; i < ptu_request_types_size_; ++i) { + result.push_back(ptu_request_types_[i].asString()); + } + std::sort(pt_request_types_.begin(), pt_request_types_.end()); + std::sort(result.begin(), result.end()); + // Checks + ASSERT_EQ(pt_request_types_.size(), result.size()); + EXPECT_TRUE(std::equal( + pt_request_types_.begin(), pt_request_types_.end(), result.begin())); +} + +TEST_F(PolicyManagerImplTest2, AddDevice_RegisterDevice_TRUE) { + const std::string connection_type = "Bluetooth"; + + const bool result = + (manager_->GetCache())->AddDevice(device_id_1_, connection_type); + // Get Policy table + const utils::SharedPtr<policy_table::Table> policy_table = + manager_->GetCache()->GetPT(); + // Get preloaded_pt flag from Policy table + const bool is_preloaded_pt = + *policy_table->policy_table.module_config.preloaded_pt; + // Get connection_type from policy_table + const policy_table::DeviceParams& params = + (*policy_table->policy_table.device_data)[device_id_1_]; + const std::string expected_connection_type = *params.connection_type; + + // Expect + EXPECT_EQ(connection_type, expected_connection_type); + // After adding device preloaded_pt must be false + EXPECT_FALSE(is_preloaded_pt); + EXPECT_TRUE(result); +} + +} // namespace policy +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/policy_manager_impl_stress_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_stress_test.cc new file mode 100644 index 0000000000..2f1cc5a9d3 --- /dev/null +++ b/src/components/policy/policy_external/test/policy_manager_impl_stress_test.cc @@ -0,0 +1,293 @@ +/* Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gtest/gtest.h" +#include <fstream> +#include "mock_policy_listener.h" +#include "policy/policy_manager_impl.h" + +using ::testing::_; +using ::policy::PolicyManagerImpl; +using ::policy::BinaryMessage; +using ::policy::MockPolicyListener; + +namespace test { +namespace components { +namespace policy_test { + +class PolicyManagerImplStressTest : public ::testing::Test { + protected: + static const std::string kNameFile; + static const int kNumberGroups = 3; // 10; + static const int kNumberFuncs = 4; // 100; + static const int kNumberApps = 5; + static const int kNumberAppGroups = 5; + static PolicyManagerImpl* manager; + static MockPolicyListener* mock_listener; + + static void SetUpTestCase(); + static void TearDownTestCase(); + static void CreateTable(std::ofstream& ofs); + static void CreateGroups(std::ofstream& ofs); + static void CreateFuncs(std::ofstream& ofs); + static void CreateApps(std::ofstream& ofs); + static void CreateAppGroups(std::ofstream& ofs); +}; + +const std::string PolicyManagerImplStressTest::kNameFile = + "sdl_preloaded_pt.json"; +PolicyManagerImpl* PolicyManagerImplStressTest::manager = 0; +MockPolicyListener* PolicyManagerImplStressTest::mock_listener = 0; + +void PolicyManagerImplStressTest::SetUpTestCase() { + std::ofstream ofs; + ofs.open(kNameFile.c_str(), std::ofstream::out); + CreateTable(ofs); + ofs.close(); + + manager = new PolicyManagerImpl(); + mock_listener = new MockPolicyListener(); + manager->set_listener(mock_listener); + + ASSERT_TRUE(manager->InitPT(kNameFile)); +} + +void PolicyManagerImplStressTest::TearDownTestCase() { + delete manager; + delete mock_listener; + remove(kNameFile.c_str()); +#ifndef __QNX__ + remove("policy.sqlite"); +#endif // __QNX__ +} + +void PolicyManagerImplStressTest::CreateGroups(std::ofstream& ofs) { + std::stringstream ss; + std::string number; + for (int i = 0; i < kNumberGroups - 1; ++i) { + ss << i << std::endl; + ss >> number; + ofs << "\"Group-" << number << "\":{\n \t\"rpcs\":{\n"; + CreateFuncs(ofs); + ofs << "} },\n"; + } + ss << kNumberGroups - 1 << std::endl; + ss >> number; + ofs << "\"Group-" << number << "\":{\n \t\"rpcs\":{\n"; + CreateFuncs(ofs); + ofs << "} }\n"; +} + +void PolicyManagerImplStressTest::CreateFuncs(std::ofstream& ofs) { + std::string func = + "{\n" + "\t\t\"hmi_levels\":[" + "\"BACKGROUND\"," + "\"FULL\"," + "\"LIMITED\"" + "]" + "}"; + + std::stringstream ss; + std::string number; + for (int i = 0; i < kNumberFuncs - 1; ++i) { + ss << i << std::endl; + ss >> number; + ofs << "\t\"Func-" << number << "\":" << func << ",\n"; + } + ss << kNumberFuncs - 1 << std::endl; + ss >> number; + ofs << "\t\"Func-" << number << "\":" + func; +} + +void PolicyManagerImplStressTest::CreateApps(std::ofstream& ofs) { + ofs << "\"default\":{\n"; + ofs << "\"keep_context\": true,\n" + "\"steal_focus\": true,\n" + "\"priority\": \"NORMAL\",\n" + "\"default_hmi\": \"FULL\",\n"; + ofs << "\"groups\":[" + "\"Group-1\"" + "]" + "},\n"; + + std::stringstream ss; + std::string number; + for (int i = 0; i < kNumberApps - 1; ++i) { + ss << i << std::endl; + ss >> number; + ofs << "\"" << number << "\" : {"; + ofs << "\n\"keep_context\": true,\n" + "\"steal_focus\": true,\n" + "\"priority\": \"NORMAL\",\n" + "\"default_hmi\": \"FULL\",\n"; + + ofs << "\"groups\": "; + CreateAppGroups(ofs); + ofs << "},\n"; + } + ss << kNumberApps - 1 << std::endl; + ss >> number; + ofs << "\"" << number << "\" : {"; + ofs << "\n\"keep_context\": true,\n" + "\"steal_focus\": true,\n" + "\"priority\": \"NORMAL\",\n" + "\"default_hmi\": \"FULL\",\n"; + + ofs << "\"groups\": "; + CreateAppGroups(ofs); + ofs << "}\n"; +} + +void PolicyManagerImplStressTest::CreateAppGroups(std::ofstream& ofs) { + ofs << "["; + + std::stringstream ss; + std::string number; + std::set<int> app_groups; + for (int i = 0; i < kNumberAppGroups; ++i) { + app_groups.insert(rand() % kNumberGroups); + } + + std::set<int>::const_iterator i = app_groups.begin(); + ss << *i << std::endl; + ss >> number; + ofs << "\"Group-" << number << "\""; + ++i; + for (; i != app_groups.end(); ++i) { + ss << *i << std::endl; + ss >> number; + ofs << ",\"Group-" << number << "\""; + } + ofs << "]\n"; +} + +void PolicyManagerImplStressTest::CreateTable(std::ofstream& ofs) { + ofs << "{" + "\"policy_table\":{\n" + "\"module_config\":{\n" + "\t\"preloaded_pt\":true,\n" + "\t\"endpoints\":{\n" + "\t\t\"default\": {\n" + "\t\t\t\"default\":[" + "\"http://sdl.net/api\"" + "]\n" + "\t\t}\n" + "\t},\n" + + "\"notifications_per_minute_by_priority\": {\n" + "\t\"EMERGENCY\": 60,\n" + "\t\"NAVIGATION\": 15,\n" + "\t\"COMMUNICATION\": 6,\n" + "\t\"NORMAL\": 4,\n" + "\t\"NONE\": 0\n" + "},\n" + + "\"exchange_after_x_ignition_cycles\": 40,\n" + "\"exchange_after_x_kilometers\" : 2,\n" + "\"exchange_after_x_days\" : 23,\n" + "\"timeout_after_x_seconds\" : 20,\n" + "\"seconds_between_retries\" : [10, 7, 5, 3, 1]\n" + "}," + "\"consumer_friendly_messages\":{\n" + "\t\"version\":\"001.001.001\",\n" + "\t\"messages\":{} },\n" + "\"functional_groupings\":{\n"; + + CreateGroups(ofs); + + ofs << "}, \"app_policies\":{"; + + CreateApps(ofs); + + ofs << "} } }"; +} + +TEST_F(PolicyManagerImplStressTest, + OneCheck_AppAndFunctuionExisting_RpcAllowed) { + EXPECT_CALL(*mock_listener, OnCurrentDeviceIdUpdateRequired(_)); + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + manager->CheckPermissions("2", "FULL", "Func-1", input_params, output); + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); +} + +TEST_F(PolicyManagerImplStressTest, NoApp_AppDoesNotExisted_RpcDissallowed) { + EXPECT_CALL(*mock_listener, OnCurrentDeviceIdUpdateRequired(_)); + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + manager->CheckPermissions("150", "FULL", "Func-88", input_params, output); + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); +} + +TEST_F(PolicyManagerImplStressTest, NoFunc_FuncDoesNotExisted_RpcDissallowed) { + EXPECT_CALL(*mock_listener, OnCurrentDeviceIdUpdateRequired(_)).Times(1); + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + manager->CheckPermissions("2", "FULL", "Func-400", input_params, output); + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); +} + +TEST_F(PolicyManagerImplStressTest, NoHmi_HMIInLevelNone_RpcDissallowed) { + EXPECT_CALL(*mock_listener, OnCurrentDeviceIdUpdateRequired(_)); + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + manager->CheckPermissions("2", "NONE", "Func-88", input_params, output); + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); +} + +TEST_F(PolicyManagerImplStressTest, + FewChecks_CheckSeveralFunctions_RpcAllowed) { + EXPECT_CALL(*mock_listener, OnCurrentDeviceIdUpdateRequired(_)) + .Times(kNumberFuncs); + const int kNumberOfCheckings = kNumberFuncs; // 100; + std::stringstream ss; + int app, func; + std::string app_number, func_number; + for (int i = 0; i < kNumberOfCheckings; ++i) { + app = rand() % kNumberApps; + func = rand() % kNumberFuncs; + ss << app << std::endl; + ss >> app_number; + ss << func << std::endl; + ss >> func_number; + + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + manager->CheckPermissions( + app_number, "FULL", "Func-" + func_number, input_params, output); + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + } +} + +} // namespace policy_test +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/policy_manager_impl_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_test.cc new file mode 100644 index 0000000000..bc9f5ac8e6 --- /dev/null +++ b/src/components/policy/policy_external/test/policy_manager_impl_test.cc @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <fstream> + +#include "json/reader.h" +#include "gtest/gtest.h" + +#include "policy/policy_manager_impl_test_base.h" +#include "utils/make_shared.h" + +using ::testing::_; +using ::testing::Return; +using ::testing::SetArgReferee; +using ::testing::AtLeast; + +namespace test { +namespace components { +namespace policy_test { + +TEST_F( + PolicyManagerImplTest, + RefreshRetrySequence_SetSecondsBetweenRetries_ExpectRetryTimeoutSequenceWithSameSeconds) { + // Arrange + std::vector<int> seconds; + seconds.push_back(50); + seconds.push_back(100); + seconds.push_back(200); + + // Assert + EXPECT_CALL(*cache_manager_, TimeoutResponse()).WillOnce(Return(60)); + EXPECT_CALL(*cache_manager_, SecondsBetweenRetries(_)) + .WillOnce(DoAll(SetArgReferee<0>(seconds), Return(true))); + + // Act + manager_->RefreshRetrySequence(); + + // Assert + EXPECT_EQ(50, manager_->NextRetryTimeout()); + EXPECT_EQ(100, manager_->NextRetryTimeout()); + EXPECT_EQ(200, manager_->NextRetryTimeout()); + EXPECT_EQ(0, manager_->NextRetryTimeout()); +} + +TEST_F(PolicyManagerImplTest, GetNotificationsNumber) { + std::string priority = "EMERGENCY"; + uint32_t notif_number = 100; + EXPECT_CALL(*cache_manager_, GetNotificationsNumber(priority)) + .WillOnce(Return(notif_number)); + + EXPECT_EQ(notif_number, manager_->GetNotificationsNumber(priority)); +} + +TEST_F(PolicyManagerImplTest, IncrementGlobalCounter) { + // Assert + EXPECT_CALL(*cache_manager_, Increment(usage_statistics::SYNC_REBOOTS)); + manager_->Increment(usage_statistics::SYNC_REBOOTS); +} + +TEST_F(PolicyManagerImplTest, IncrementAppCounter) { + // Assert + EXPECT_CALL(*cache_manager_, + Increment("12345", usage_statistics::USER_SELECTIONS)); + manager_->Increment("12345", usage_statistics::USER_SELECTIONS); +} + +TEST_F(PolicyManagerImplTest, SetAppInfo) { + // Assert + EXPECT_CALL(*cache_manager_, + Set("12345", usage_statistics::LANGUAGE_GUI, "de-de")); + manager_->Set("12345", usage_statistics::LANGUAGE_GUI, "de-de"); +} + +TEST_F(PolicyManagerImplTest, AddAppStopwatch) { + // Assert + EXPECT_CALL(*cache_manager_, + Add("12345", usage_statistics::SECONDS_HMI_FULL, 30)); + manager_->Add("12345", usage_statistics::SECONDS_HMI_FULL, 30); +} + +TEST_F(PolicyManagerImplTest, ResetPT) { + EXPECT_CALL(*cache_manager_, ResetPT("filename")) + .WillOnce(Return(true)) + .WillOnce(Return(false)); + EXPECT_CALL(*cache_manager_, IsPTPreloaded()) + .WillOnce(Return(true)) + .WillOnce(Return(false)); + EXPECT_CALL(*cache_manager_, ResetCalculatedPermissions()).Times(AtLeast(1)); + EXPECT_CALL(*cache_manager_, TimeoutResponse()); + EXPECT_CALL(*cache_manager_, SecondsBetweenRetries(_)); + + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + EXPECT_TRUE(manager_->ResetPT("filename")); + EXPECT_TRUE(cache->IsPTPreloaded()); + EXPECT_FALSE(manager_->ResetPT("filename")); + EXPECT_FALSE(cache->IsPTPreloaded()); +} + +TEST_F(PolicyManagerImplTest, LoadPT_SetPT_PTIsLoaded) { + // Arrange + manager_->ForcePTExchange(); + manager_->OnUpdateStarted(); + Json::Value table = createPTforLoad(); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + + // Assert + ASSERT_TRUE(IsValid(update)); + + EXPECT_CALL(*cache_manager_, GetHMIAppTypeAfterUpdate(_)).Times(AtLeast(1)); + + // Act + std::string json = table.toStyledString(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + + utils::SharedPtr<policy_table::Table> snapshot = + new policy_table::Table(update.policy_table); + // Assert + EXPECT_CALL(*cache_manager_, GenerateSnapshot()).WillOnce(Return(snapshot)); + EXPECT_CALL(*cache_manager_, ApplyUpdate(_)).WillOnce(Return(true)); + EXPECT_CALL(listener_, GetAppName("1234")) + .WillOnce(Return(custom_str::CustomString(""))); + EXPECT_CALL(listener_, OnUpdateStatusChanged(_)); + EXPECT_CALL(*cache_manager_, SaveUpdateRequired(false)); + EXPECT_CALL(*cache_manager_, TimeoutResponse()); + EXPECT_CALL(*cache_manager_, SecondsBetweenRetries(_)); + + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_CALL(*cache_manager_, IsPTPreloaded()); + EXPECT_FALSE(manager_->GetCache()->IsPTPreloaded()); +} + +TEST_F(PolicyManagerImplTest2, + KmsChanged_SetExceededKms_ExpectCorrectSchedule) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ::policy::Counters counter = ::policy::Counters::KILOMETERS; + manager_->PTUpdatedAt(counter, 50000); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + // Set kms changed but not exceed limit + manager_->KmsChanged(51500); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + // Set kms changed and exceed limit + manager_->KmsChanged(52500); + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest2, ForcePTExchange_ExpectUpdateNeeded) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); + // Force OT Exchange + manager_->ForcePTExchange(); + // Check update required + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest2, OnSystemReady) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Check + EXPECT_CALL(listener_, OnSystemInfoUpdateRequired()); + manager_->OnSystemReady(); +} + +TEST_F(PolicyManagerImplTest2, ResetRetrySequence) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->ResetRetrySequence(); + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); + manager_->OnUpdateStarted(); + EXPECT_EQ("UPDATING", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest2, NextRetryTimeout_ExpectTimeoutsFromPT) { + // Arrange + std::ifstream ifile(preloadet_pt_filename_); + Json::Reader reader; + Json::Value root(Json::objectValue); + if (ifile.is_open() && reader.parse(ifile, root, true)) { + Json::Value seconds_between_retries = Json::Value(Json::arrayValue); + seconds_between_retries = + root["policy_table"]["module_config"]["seconds_between_retries"]; + uint32_t size = seconds_between_retries.size(); + CreateLocalPT(preloadet_pt_filename_); + for (uint32_t i = 0; i < size; ++i) { + EXPECT_EQ(seconds_between_retries[i], manager_->NextRetryTimeout()); + } + } +} + +TEST_F(PolicyManagerImplTest2, TimeOutExchange) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Check value taken from PT + EXPECT_EQ(70000u, manager_->TimeoutExchangeMSec()); +} + +TEST_F(PolicyManagerImplTest, + RequestPTUpdate_SetPT_GeneratedSnapshotAndPTUpdate) { + Json::Value table = createPTforLoad(); + utils::SharedPtr<policy_table::Table> p_table = + utils::MakeShared<policy_table::Table>(&table); + ASSERT_TRUE(p_table); + p_table->SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + EXPECT_TRUE(IsValid(*p_table)); + + EXPECT_CALL(listener_, OnSnapshotCreated(_, _, _)); + EXPECT_CALL(*cache_manager_, GenerateSnapshot()).WillOnce(Return(p_table)); + + manager_->RequestPTUpdate(); +} + +TEST_F(PolicyManagerImplTest, RequestPTUpdate_InvalidPT_PTUpdateFail) { + utils::SharedPtr<policy_table::Table> p_table = + utils::MakeShared<policy_table::Table>(); + ASSERT_TRUE(p_table); + EXPECT_FALSE(IsValid(*p_table)); + + EXPECT_CALL(listener_, OnSnapshotCreated(_, _, _)).Times(0); + EXPECT_CALL(*cache_manager_, GenerateSnapshot()).WillOnce(Return(p_table)); + + manager_->RequestPTUpdate(); +} + +TEST_F(PolicyManagerImplTest, RequestPTUpdate_InvalidSnapshot_PTUpdateFail) { + utils::SharedPtr<policy_table::Table> p_table; + EXPECT_FALSE(p_table); + + EXPECT_CALL(listener_, OnSnapshotCreated(_, _, _)).Times(0); + EXPECT_CALL(*cache_manager_, GenerateSnapshot()).WillOnce(Return(p_table)); + + manager_->RequestPTUpdate(); +} + +TEST_F(PolicyManagerImplTest, ResetUserConsent_ResetOnlyOnce) { + EXPECT_CALL(*cache_manager_, ResetUserConsent()) + .WillOnce(Return(true)) + .WillOnce(Return(false)); + + EXPECT_TRUE(manager_->ResetUserConsent()); + EXPECT_FALSE(manager_->ResetUserConsent()); +} + +TEST_F(PolicyManagerImplTest2, GetPolicyTableStatus_ExpectUpToDate) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Check + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest, + SetUpdateStarted_GetPolicyTableStatus_Expect_Updating) { + // Arrange + manager_->ForcePTExchange(); + EXPECT_CALL(*cache_manager_, SaveUpdateRequired(true)); + manager_->OnUpdateStarted(); + // Check + EXPECT_EQ("UPDATING", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest2, + RetrySequenceDelaysSeconds_Expect_CorrectValues) { + // Arrange + std::ifstream ifile(preloadet_pt_filename_); + Json::Reader reader; + Json::Value root(Json::objectValue); + if (ifile.is_open() && reader.parse(ifile, root, true)) { + Json::Value seconds_between_retries = Json::Value(Json::arrayValue); + seconds_between_retries = + root["policy_table"]["module_config"]["seconds_between_retries"]; + uint32_t size = seconds_between_retries.size(); + CreateLocalPT(preloadet_pt_filename_); + std::vector<int> delaySecs = manager_->RetrySequenceDelaysSeconds(); + // Check + ASSERT_EQ(size, delaySecs.size()); + for (uint32_t i = 0; i < size; ++i) { + EXPECT_EQ(seconds_between_retries[i], delaySecs[i]); + } + } +} + +TEST_F(PolicyManagerImplTest2, + OnExceededTimeout_GetPolicyTableStatus_ExpectUpdateNeeded) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->ForcePTExchange(); + manager_->OnExceededTimeout(); + // Check + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); +} + +TEST_F(PolicyManagerImplTest, MarkUnpairedDevice) { + // Assert + EXPECT_CALL(*cache_manager_, SetUnpairedDevice(unpaired_device_id_, true)) + .WillOnce(Return(true)); + EXPECT_CALL(*cache_manager_, SetDeviceConsent(unpaired_device_id_, false)); + EXPECT_CALL(*cache_manager_, + HasDeviceSpecifiedConsent(unpaired_device_id_, false)) + .WillRepeatedly(Return(true)); + EXPECT_CALL(*cache_manager_, IgnitionCyclesBeforeExchange()); + EXPECT_CALL(*cache_manager_, DaysBeforeExchange(_)); + // Act + manager_->MarkUnpairedDevice(unpaired_device_id_); +} + +TEST_F(PolicyManagerImplTest2, GetCurrentDeviceId) { + // Arrange + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)).Times(1); + EXPECT_EQ("", manager_->GetCurrentDeviceId(app_id_2_)); +} + +} // namespace policy +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc b/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc new file mode 100644 index 0000000000..63bcb30374 --- /dev/null +++ b/src/components/policy/policy_external/test/policy_manager_impl_test_base.cc @@ -0,0 +1,710 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <string> +#include <fstream> +#include <stdint.h> +#include <vector> + +#include "policy/policy_manager_impl_test_base.h" + +#include "utils/file_system.h" +#include "utils/make_shared.h" +#include "json/reader.h" + +#include "policy/mock_pt_ext_representation.h" + +namespace test { +namespace components { +namespace policy_test { + +using ::testing::Return; +using ::testing::ReturnRef; +using ::testing::ContainerEq; + +// Help functions +char GenRandomChar(char range_from, char range_to) { + if (range_from > range_to) { + std::swap(range_from, range_to); + } + const int range_size = range_to - range_from; + return rand() % range_size + range_from; +} + +struct StringsForUpdate CreateNewRandomData(StringsForUpdate& str) { + // Generate random date + srand(time(NULL)); + unsigned int day = 1 + rand() % 31; // Day from 1 - 31 + unsigned int month = 1 + rand() % 12; // Month from 1 - 12 + unsigned int year = 1985 + rand() % 31; // Year from 1985 - 2015 + + // Convert date to string + str.new_date_ = NumberToString(year) + '-' + NumberToString(month) + '-' + + NumberToString(day); + + // Create new field + unsigned int number = 1 + rand() % 100; // Number from 1 - 100 + str.new_field_name_ += NumberToString(number); + + for (unsigned int i = 0; i < 5; ++i) { + str.new_field_value_ += GenRandomChar('A', 'Z'); + } + return str; +} + +void CheckIsParamInList(const ::policy::RPCParams& list, + const std::string& parameter) { + EXPECT_TRUE(std::find(list.begin(), list.end(), parameter) != list.end()) + << "Parameter not exists: " << parameter; +} + +Json::Value createPTforLoad() { + const std::string load_table( + "{" + "\"policy_table\": {" + "\"module_config\": {" + "\"exchange_after_x_ignition_cycles\": 10," + "\"exchange_after_x_kilometers\": 100," + "\"exchange_after_x_days\": 5," + "\"timeout_after_x_seconds\": 500," + "\"seconds_between_retries\": [10, 20, 30]," + "\"endpoints\": {" + "\"0x00\": {" + "\"default\": [\"http://ford.com/cloud/default\"]" + "}" + "}," + "\"notifications_per_minute_by_priority\": {" + "\"emergency\": 1," + "\"navigation\": 2," + "\"VOICECOMM\": 3," + "\"communication\": 4," + "\"normal\": 5," + "\"none\": 6" + "}," + "\"vehicle_make\" : \"MakeT\"," + "\"vehicle_model\" : \"ModelT\"," + "\"vehicle_year\": \"2014\"" + "}," + "\"app_policies\": {" + "\"default\": {" + "\"memory_kb\": 50," + "\"heart_beat_timeout_ms\": 100," + "\"groups\": [\"default\"]," + "\"keep_context\": true," + "\"steal_focus\": true," + "\"priority\": \"EMERGENCY\"," + "\"default_hmi\": \"FULL\"," + "\"certificate\": \"sign\"" + "}, " + "\"pre_DataConsent\": {" + "\"memory_kb\": 50," + "\"heart_beat_timeout_ms\": 100," + "\"groups\": [\"default\"]," + "\"keep_context\": true," + "\"steal_focus\": true," + "\"priority\": \"EMERGENCY\"," + "\"default_hmi\": \"FULL\"," + "\"certificate\": \"sign\"" + "}, " + "\"device\": {" + "\"memory_kb\": 50," + "\"heart_beat_timeout_ms\": 100," + "\"groups\": [\"default\"]," + "\"keep_context\": true," + "\"steal_focus\": true," + "\"priority\": \"EMERGENCY\"," + "\"default_hmi\": \"FULL\"," + "\"certificate\": \"sign\"" + "}," + "\"1234\": {" + "\"memory_kb\": 50," + "\"heart_beat_timeout_ms\": 100," + "\"groups\": [\"default\"]," + "\"keep_context\": true," + "\"steal_focus\": true," + "\"priority\": \"EMERGENCY\"," + "\"default_hmi\": \"FULL\"," + "\"certificate\": \"sign\"" + "}" + "}," + "\"consumer_friendly_messages\": {" + "\"version\": \"1.2\"" + "}," + "\"functional_groupings\": {" + "\"default\": {" + "\"rpcs\": {" + "\"Update\": {" + "\"hmi_levels\": [\"FULL\"]," + "\"parameters\" : [\"speed\"]" + "}" + "}" + "}" + "}" + "}" + "}"); + + Json::Value table(Json::objectValue); + Json::Reader reader; + EXPECT_TRUE(reader.parse(load_table, table)); + return table; +} + +void InsertRpcParametersInList(::policy::RPCParams& input_params) { + input_params.insert("longitudeDegrees"); + input_params.insert("latitudeDegrees"); + input_params.insert("locationName"); + input_params.insert("locationDescription"); + input_params.insert("addressLines"); + input_params.insert("phoneNumber"); + input_params.insert("locationImage"); + input_params.insert("deliveryMode"); + input_params.insert("timeStamp"); + input_params.insert("address"); +} +// PolicyManagerImplTest class methods +PolicyManagerImplTest::PolicyManagerImplTest() + : unpaired_device_id_("08-00-27-CE-76-FE") + , manager_(NULL) + , cache_manager_(NULL) {} + +void PolicyManagerImplTest::SetUp() { + manager_ = new PolicyManagerImpl(); + cache_manager_ = new MockCacheManagerInterface(); + manager_->set_cache_manager(cache_manager_); + manager_->set_listener(&listener_); +} + +void PolicyManagerImplTest::TearDown() { + delete manager_; +} + +::testing::AssertionResult PolicyManagerImplTest::IsValid( + const policy_table::Table& table) { + if (table.is_valid()) { + return ::testing::AssertionSuccess(); + } else { + ::rpc::ValidationReport report(" - table"); + table.ReportErrors(&report); + return ::testing::AssertionFailure() << ::rpc::PrettyFormat(report); + } +} + +// PolicyManagerImplTest2 class methods +PolicyManagerImplTest2::PolicyManagerImplTest2() + : app_id_1_("123456789") + , app_id_2_("1766825573") + , app_id_3_("584421907") + , device_id_1_("XXX123456789ZZZ") + , device_id_2_("08-00-27-CE-76-FE") + , application_id_("1234") + , app_storage_folder_("storage1") + , preloadet_pt_filename_(kSdlPreloadedPtJson) + , in_memory_(true) + , manager_(NULL) + , ptu_request_types_size_(0u) + , index_(0u) + , ptu_request_types_(Json::arrayValue) {} + +void PolicyManagerImplTest2::SetUp() { + file_system::CreateDirectory(app_storage_folder_); + + manager_ = new PolicyManagerImpl(in_memory_); + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(app_storage_folder_)); + manager_->set_listener(&listener_); + const char* levels[] = {"BACKGROUND", "FULL", "LIMITED", "NONE"}; + hmi_level_.assign(levels, levels + sizeof(levels) / sizeof(levels[0])); + srand(time(NULL)); + index_ = rand() % 3; +} + +::policy::StringArray PolicyManagerImplTest2::JsonToVectorString( + const Json::Value& PTU_request_types) { + ::policy::StringArray result; + for (uint32_t i = 0; i < PTU_request_types.size(); ++i) { + result.push_back(PTU_request_types[i].asString()); + } + return result; +} + +const Json::Value PolicyManagerImplTest2::GetPTU(const std::string& file_name) { + // Get PTU + std::ifstream ifile(file_name); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open() && reader.parse(ifile, root, true)) { + json = root.toStyledString(); + } + ifile.close(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + // Load Json to cache + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(manager_->GetCache()->IsPTPreloaded()); + return root; +} + +void PolicyManagerImplTest2::CreateLocalPT(const std::string& file_name) { + file_system::remove_directory_content(app_storage_folder_); + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(app_storage_folder_)); + ASSERT_TRUE(manager_->InitPT(file_name, &policy_settings_)); + EXPECT_TRUE(manager_->GetCache()->IsPTPreloaded()); +} + +void PolicyManagerImplTest2::AddRTtoPT(const std::string& update_file_name, + const std::string& section_name, + const uint32_t rt_number, + const uint32_t invalid_rt_number) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Get RequestTypes from section of preloaded_pt app_policies + pt_request_types_ = manager_->GetAppRequestTypes(section_name); + EXPECT_EQ(rt_number, pt_request_types_.size()); + Json::Value root = GetPTU(update_file_name); + // Get Request Types from JSON (PTU) + ptu_request_types_ = + root["policy_table"]["app_policies"][section_name]["RequestType"]; + ptu_request_types_size_ = ptu_request_types_.size(); + pt_request_types_.clear(); + // Get RequestTypes from section of PT app policies after update + pt_request_types_ = manager_->GetAppRequestTypes(section_name); + // Check number of RT in PTU and PT now are equal + ASSERT_EQ(ptu_request_types_size_ - invalid_rt_number, + pt_request_types_.size()); +} + +void PolicyManagerImplTest2::AddRTtoAppSectionPT( + const std::string& update_file_name, + const std::string& section_name, + const uint32_t rt_number, + const uint32_t invalid_rt_number) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + // Add app + manager_->AddApplication(section_name); + // Check app gets RequestTypes from pre_DataConsent of app_policies + // section + pt_request_types_ = manager_->GetAppRequestTypes(section_name); + EXPECT_EQ(rt_number, pt_request_types_.size()); + EXPECT_CALL(listener_, OnPendingPermissionChange(section_name)).Times(1); + Json::Value root = GetPTU(update_file_name); + + // Get App Request Types from PTU + ptu_request_types_ = + root["policy_table"]["app_policies"][section_name]["RequestType"]; + ptu_request_types_size_ = ptu_request_types_.size(); + + pt_request_types_.clear(); + // Get RequestTypes from <app_id> section of app policies after PT update + pt_request_types_ = manager_->GetAppRequestTypes(section_name); + // Check sizes of Request types of PT and PTU + ASSERT_EQ(ptu_request_types_size_ - invalid_rt_number, + pt_request_types_.size()); + + ::policy::AppPermissions permissions = + manager_->GetAppPermissionsChanges(section_name); + EXPECT_TRUE(permissions.requestTypeChanged); +} + +std::vector<policy_table::RequestType> +PolicyManagerImplTest2::PushRequestTypesToContainer( + const ::policy::StringArray& temp_result) { + policy_table::RequestType filtered_result; + std::vector<policy_table::RequestType> final_result; + for (size_t i = 0; i < temp_result.size(); ++i) { + if (policy_table::EnumFromJsonString(temp_result[i], &filtered_result)) { + final_result.push_back(filtered_result); + } + } + return final_result; +} + +void PolicyManagerImplTest2::CheckResultForValidRT() { + // Convert Json Array to ::policy::StringArray + const ::policy::StringArray& result = JsonToVectorString(ptu_request_types_); + // Checks + SortAndCheckEquality(pt_request_types_, result); +} + +void PolicyManagerImplTest2::CheckResultForInvalidRT() { + // Convert Json Array to ::policy::StringArray + const ::policy::StringArray& temp_result = + JsonToVectorString(ptu_request_types_); + const std::vector<policy_table::RequestType>& result1 = + PushRequestTypesToContainer(temp_result); + const std::vector<policy_table::RequestType>& result2 = + PushRequestTypesToContainer(pt_request_types_); + // Checks + SortAndCheckEquality(result1, result2); +} + +void PolicyManagerImplTest2::FillMultimapFromFunctionalGroupings( + UserConsentPromptToRpcsConnections& input_multimap, + policy_table::FunctionalGroupings& fg_table) { + policy_table::FunctionalGroupings::iterator fg_itter = fg_table.begin(); + const policy_table::FunctionalGroupings::iterator fg_itter_end = + fg_table.end(); + for (; fg_itter != fg_itter_end; ++fg_itter) { + // RPCS getting + policy_table::Rpcs& rpcs_ref = fg_itter->second; + // User_consent_prompt getting + rpc::Optional<rpc::String<1, 255> >& optional_ref = + rpcs_ref.user_consent_prompt; + rpc::String<1, 255>& ucp_string = *optional_ref; + const std::string& ucp_std_string = + static_cast<const std::string&>(ucp_string); + // Multimap inserting + input_multimap.insert( + std::pair<std::string, policy_table::Rpcs&>(ucp_std_string, rpcs_ref)); + } +} + +void PolicyManagerImplTest2::GetFunctionalGroupingsFromManager( + policy_table::FunctionalGroupings& input_functional_groupings) { + // Get cache + ::policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + // Get table_snapshot + utils::SharedPtr<policy_table::Table> table = cache->GenerateSnapshot(); + // Set functional groupings from policy table + input_functional_groupings = table->policy_table.functional_groupings; +} + +void PolicyManagerImplTest2::TearDown() { + delete manager_; + file_system::RemoveDirectory(app_storage_folder_, true); +} + +void PolicyManagerImplTest2::ResetOutputList( + ::policy::CheckPermissionResult& output) { + // Reset output + output.hmi_level_permitted = ::policy::kRpcDisallowed; + output.list_of_allowed_params.clear(); + output.list_of_disallowed_params.clear(); + output.list_of_undefined_params.clear(); +} +// To avoid duplicate test with different json files +void PolicyManagerImplTest2:: + CheckPermissions_AllParamsAllowed_CheckRpcsInDiffLvls( + const std::string& update_file) { + // Arrange + CreateLocalPT("json/sdl_preloaded_pt_send_location.json"); + manager_->AddDevice(device_id_1_, "Bluetooth"); + policy::CacheManagerInterfaceSPtr cache = manager_->GetCache(); + ASSERT_TRUE(cache->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + // Add app from consented device. App will be assigned with default policies + manager_->AddApplication(application_id_); + + // Expect all parameters are allowed + std::ifstream ifile(update_file); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open()) { + reader.parse(ifile, root, true); + } + json = root.toStyledString(); + ifile.close(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(cache->IsPTPreloaded()); + + // Will be called each time permissions are checked + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(application_id_)) + .Times(4) + .WillRepeatedly(Return(device_id_1_)); + + // Check RPC in each level + ::policy::RPCParams input_params; + InsertRpcParametersInList(input_params); + + ::policy::CheckPermissionResult output; + // Rpc in FULL level + manager_->CheckPermissions( + application_id_, kHmiLevelFull, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of allowed parameters is not empty + EXPECT_FALSE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_allowed_params.size()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + ResetOutputList(output); + + // Rpc in LIMITED level + manager_->CheckPermissions( + application_id_, kHmiLevelLimited, "SendLocation", input_params, output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of allowed parameters is not empty + EXPECT_FALSE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_allowed_params.size()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + ResetOutputList(output); + + // Rpc in BACKGROUND level + manager_->CheckPermissions(application_id_, + kHmiLevelBackground, + "SendLocation", + input_params, + output); + // Check RPC is allowed + EXPECT_EQ(::policy::kRpcAllowed, output.hmi_level_permitted); + // Check list of allowed parameters is not empty + EXPECT_FALSE(output.list_of_allowed_params.empty()); + EXPECT_EQ(10u, output.list_of_allowed_params.size()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + // Reset output + ResetOutputList(output); + + // Rpc in NONE level + manager_->CheckPermissions( + application_id_, kHmiLevelNone, "SendLocation", input_params, output); + // Check RPC is disallowed + EXPECT_EQ(::policy::kRpcDisallowed, output.hmi_level_permitted); + // Check lists of parameters are empty + EXPECT_TRUE(output.list_of_allowed_params.empty()); + EXPECT_TRUE(output.list_of_disallowed_params.empty()); + EXPECT_TRUE(output.list_of_undefined_params.empty()); +} + +void PolicyManagerImplTest2::CheckRpcPermissions( + const std::string& rpc_name, const PermitResult& expected_permission) { + ::policy::RPCParams input_params; + ::policy::CheckPermissionResult output; + manager_->CheckPermissions( + application_id_, kHmiLevelFull, rpc_name, input_params, output); + EXPECT_EQ(expected_permission, output.hmi_level_permitted); +} + +// To avoid duplicate arrange of test +void PolicyManagerImplTest2::AddSetDeviceData() { + CreateLocalPT("json/sdl_preloaded_pt_send_location.json"); + manager_->AddDevice(device_id_1_, "Bluetooth"); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_1_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + // Add app from consented device. App will be assigned with default policies + manager_->AddApplication(application_id_); + (manager_->GetCache())->AddDevice(device_id_1_, "Bluetooth"); +} + +// Load Json File and set it as PTU +void PolicyManagerImplTest2::LoadPTUFromJsonFile( + const std::string& update_file) { + // Load Json to cache + std::ifstream ifile(update_file); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open()) { + reader.parse(ifile, root, true); + } + json = root.toStyledString(); + ifile.close(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + EXPECT_TRUE(manager_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(manager_->GetCache()->IsPTPreloaded()); +} + +// PolicyManagerImplTest_RequestTypes class methods +PolicyManagerImplTest_RequestTypes::PolicyManagerImplTest_RequestTypes() + : kJsonFiles{"json/PTU_with_one_invalid_requestType.json", + "json/PTU_with_invalid_requestType_between_correct.json", + "json/PTU_without_requestType_field.json", + "json/PTU_with_empty_requestType_array.json", + "json/preloadedPT_with_invalid_default_requestType.json", + "json/preloadedPT_with_several_invalid_default_requestTypes." + "json", + "json/" + "preloadedPT_with_invalid_default_reqestType_between_valid." + "json", + "json/PTU_default_app.json", + "json/" + "PTU_default_app_app_invalid_values_RequestType_array.json", + "json/PTU_default_app_empty_RequestType_array.json", + "json/PTU_default_app_omitted_RequestType_array.json", + "json/" + "PTU_default_app_one_invalid_value_RequestType_array.json", + "json/PTU_pre_data_consent_app.json", + "json/" + "PTU_pre_data_consent_app_invalid_values_RequestType_array." + "json", + "json/PTU_pre_data_consent_app_empty_RequestType_array.json", + "json/" + "PTU_pre_data_consent_app_omitted_RequestType_array.json", + "json/" + "PTU_pre_data_consent_app_one_invalid_value_RequestType_" + "array." + "json"} + , kAppId("1766825573") + , kDefaultAppId(policy::kDefaultId) + , app_storage_folder_("storage3") + , preloadet_pt_filename_(kSdlPreloadedPtJson) {} + +void PolicyManagerImplTest_RequestTypes::SetUp() { + file_system::CreateDirectory(app_storage_folder_); + const bool in_memory = true; + policy_manager_impl_sptr_ = utils::MakeShared<PolicyManagerImpl>(in_memory); + policy_manager_impl_sptr_->set_listener(&listener_); +} + +const Json::Value PolicyManagerImplTest_RequestTypes::GetPTU( + const std::string& file_name) { + // Get PTU + std::ifstream ifile(file_name); + Json::Reader reader; + std::string json; + Json::Value root(Json::objectValue); + if (ifile.is_open() && reader.parse(ifile, root, true)) { + json = root.toStyledString(); + } + ifile.close(); + ::policy::BinaryMessage msg(json.begin(), json.end()); + // Load Json to cache + EXPECT_TRUE(policy_manager_impl_sptr_->LoadPT(kFilePtUpdateJson, msg)); + EXPECT_FALSE(policy_manager_impl_sptr_->GetCache()->IsPTPreloaded()); + return root; +} + +void PolicyManagerImplTest_RequestTypes::RefreshPT( + const std::string& preloaded_pt_file, const std::string& update_pt_file) { + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(app_storage_folder_)); + ASSERT_TRUE( + policy_manager_impl_sptr_->InitPT(preloaded_pt_file, &policy_settings_)) + << "can`t load preloaded file"; + EXPECT_TRUE(policy_manager_impl_sptr_->GetCache()->IsPTPreloaded()); + GetPTU(update_pt_file); +} + +PolicyTableSPtr PolicyManagerImplTest_RequestTypes::GetPolicyTableSnapshot() { + // Get cache + ::policy::CacheManagerInterfaceSPtr cache = + policy_manager_impl_sptr_->GetCache(); + // Get and return table_snapshot + return cache->GenerateSnapshot(); +} + +policy_table::RequestTypes +PolicyManagerImplTest_RequestTypes::GetRequestTypesForApplication( + const std::string& app_id) { + // Get table_snapshot + PolicyTableSPtr table = GetPolicyTableSnapshot(); + // Get request types + policy_table::PolicyTable& pt = table->policy_table; + policy_table::ApplicationPolicies& app_policies = + pt.app_policies_section.apps; + policy_table::ApplicationPolicies::const_iterator app_iter = + app_policies.find(app_id); + + return *(app_iter->second.RequestType); +} + +void PolicyManagerImplTest_RequestTypes::CompareAppRequestTypesWithDefault( + const std::string& app_id, const std::string& ptu_file) { + // Refresh policy table with invalid RequestType in application + RefreshPT(preloadet_pt_filename_, ptu_file); + + // Get <app_id> RequestType array + policy_table::RequestTypes app_request_types = + GetRequestTypesForApplication(app_id); + // Get "default" RequestType array + policy_table::RequestTypes default_request_types = + GetRequestTypesForApplication(policy::kDefaultId); + + // Expect + const size_t app_requests_size = app_request_types.size(); + const size_t default_requests_size = default_request_types.size(); + ASSERT_EQ(default_requests_size, app_requests_size); + EXPECT_THAT(default_request_types, ContainerEq(app_request_types)); +} + +policy_table::RequestTypes +PolicyManagerImplTest_RequestTypes::CreateDefaultAppPTURequestValues() { + policy_table::RequestTypes request_types; + request_types.push_back(policy_table::RequestType::RT_QUERY_APPS); + request_types.push_back(policy_table::RequestType::RT_LAUNCH_APP); + request_types.push_back(policy_table::RequestType::RT_PROPRIETARY); + request_types.push_back(policy_table::RequestType::RT_LOCK_SCREEN_ICON_URL); + return request_types; +} + +policy_table::RequestTypes +PolicyManagerImplTest_RequestTypes::CreateDefaultAppDatabaseRequestValues() { + policy_table::RequestTypes request_types; + request_types.push_back(policy_table::RequestType::RT_QUERY_APPS); + request_types.push_back(policy_table::RequestType::RT_LAUNCH_APP); + request_types.push_back(policy_table::RequestType::RT_PROPRIETARY); + return request_types; +} + +policy_table::RequestTypes +PolicyManagerImplTest_RequestTypes::CreatePreDataConsentAppPTURequestValues() { + policy_table::RequestTypes request_types; + request_types.push_back(policy_table::RequestType::RT_FILE_RESUME); + request_types.push_back(policy_table::RequestType::RT_AUTH_REQUEST); + request_types.push_back(policy_table::RequestType::RT_AUTH_CHALLENGE); + request_types.push_back(policy_table::RequestType::RT_AUTH_ACK); + return request_types; +} + +void PolicyManagerImplTest_RequestTypes::CompareRequestTypesContainers( + const policy_table::RequestTypes& expected_data, + const policy_table::RequestTypes& received_data) { + const size_t received_size = received_data.size(); + const size_t expected_size = expected_data.size(); + ASSERT_EQ(expected_size, received_size); + EXPECT_THAT(expected_data, ContainerEq(received_data)); +} + +void PolicyManagerImplTest_RequestTypes::TearDown() { + file_system::RemoveDirectory(app_storage_folder_, true); +} + +} // namespace policy_test +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc b/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc new file mode 100644 index 0000000000..be266a3a03 --- /dev/null +++ b/src/components/policy/policy_external/test/policy_manager_impl_user_consent_test.cc @@ -0,0 +1,639 @@ +/* + * Copyright (c) 2016, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gtest/gtest.h" + +#include "policy/policy_manager_impl_test_base.h" +#include "utils/date_time.h" + +namespace test { +namespace components { +namespace policy_test { + +using ::testing::_; +using ::testing::Return; + +// Tests that use device without Consent +TEST_F( + PolicyManagerImplTest2, + AddApplication_AddNewApplicationFromDeviceWithConsent_ExpectUpdateRequired) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + .WillOnce(Return(device_id_1_)); + + manager_->SetUserConsentForDevice(device_id_1_, true); + + manager_->AddApplication(app_id_1_); + + EXPECT_EQ("UPDATE_NEEDED", manager_->GetPolicyTableStatus()); +} + +TEST_F( + PolicyManagerImplTest2, + AddApplication_AddNewApplicationFromDeviceWithoutConsent_ExpectUpToDate) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + + // To set UP_TO_DATE before registration + GetPTU(kValidSdlPtUpdateJson); + + const TimevalStruct current_time = date_time::DateTime::getCurrentTime(); + const int kSecondsInDay = 60 * 60 * 24; + const int days_after_epoch = current_time.tv_sec / kSecondsInDay; + + manager_->PTUpdatedAt(DAYS_AFTER_EPOCH, days_after_epoch); + manager_->PTUpdatedAt(KILOMETERS, 1000); + + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_1_)) + .WillOnce(Return(device_id_1_)); + + manager_->SetUserConsentForDevice(device_id_1_, false); + + manager_->AddApplication(app_id_1_); + + EXPECT_EQ("UP_TO_DATE", manager_->GetPolicyTableStatus()); +} + +TEST_F( + PolicyManagerImplTest2, + ReactOnUserDevConsentForApp_AddNewApplicationFromDeviceWithoutConsent_ExpectPreDataConsent) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_1_); + ASSERT_TRUE(manager_->IsPredataPolicy(app_id_1_)); + manager_->ReactOnUserDevConsentForApp(app_id_1_, false); + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_1_)); +} + +// Related to manual test APPLINK-18768 +TEST_F(PolicyManagerImplTest2, + CheckPreDataConsent_AppRegistered_ExpectReceivedRpcPermissionCorrect) { + // Arrange + CreateLocalPT(kSdlPreloadedPtJson2); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + manager_->AddApplication(application_id_); + + // Expect RPCs from pre_dataConsent group are allowed + // Next checks are equal to BaseBeforeDataConsent_APIs.xml checks from task + CheckRpcPermissions("ListFiles", ::policy::kRpcAllowed); + CheckRpcPermissions("PutFile", ::policy::kRpcAllowed); + CheckRpcPermissions("SetAppIcon", ::policy::kRpcAllowed); + CheckRpcPermissions("SetGlobalProperties", ::policy::kRpcAllowed); + CheckRpcPermissions("ResetGlobalProperties", ::policy::kRpcAllowed); + CheckRpcPermissions("SetDisplayLayout", ::policy::kRpcAllowed); + CheckRpcPermissions("ListFiles", ::policy::kRpcAllowed); + CheckRpcPermissions("DeleteFile", ::policy::kRpcAllowed); + + // Next checks are equal to NonBaseBeforeDataConsent_APIs.xml checks from task + CheckRpcPermissions("AddSubMenu", ::policy::kRpcDisallowed); + CheckRpcPermissions("AddCommand", ::policy::kRpcDisallowed); + CheckRpcPermissions("DeleteCommand", ::policy::kRpcDisallowed); + CheckRpcPermissions("DeleteSubMenu", ::policy::kRpcDisallowed); + CheckRpcPermissions("CreateInteractionChoiceSet", ::policy::kRpcDisallowed); + CheckRpcPermissions("PerformInteraction", ::policy::kRpcDisallowed); + CheckRpcPermissions("DeleteInteractionChoiceSet", ::policy::kRpcDisallowed); + CheckRpcPermissions("Alert", ::policy::kRpcDisallowed); + CheckRpcPermissions("Show", ::policy::kRpcDisallowed); + CheckRpcPermissions("Speak", ::policy::kRpcDisallowed); + CheckRpcPermissions("SetMediaClockTimer", ::policy::kRpcDisallowed); + CheckRpcPermissions("SubscribeButton", ::policy::kRpcDisallowed); + CheckRpcPermissions("UnsubscribeButton", ::policy::kRpcDisallowed); + CheckRpcPermissions("PerformAudioPassThru", ::policy::kRpcDisallowed); + CheckRpcPermissions("EndAudioPassThru", ::policy::kRpcDisallowed); + CheckRpcPermissions("SubscribeVehicleData", ::policy::kRpcDisallowed); + CheckRpcPermissions("UnsubscribeVehicleData", ::policy::kRpcDisallowed); + CheckRpcPermissions("GetVehicleData", ::policy::kRpcDisallowed); + CheckRpcPermissions("ReadDID", ::policy::kRpcDisallowed); + CheckRpcPermissions("GetDTCs", ::policy::kRpcDisallowed); + CheckRpcPermissions("ScrollableMessage", ::policy::kRpcDisallowed); + CheckRpcPermissions("Slider", ::policy::kRpcDisallowed); + CheckRpcPermissions("ShowConstantTBT", ::policy::kRpcDisallowed); + CheckRpcPermissions("AlertManeuver", ::policy::kRpcDisallowed); + CheckRpcPermissions("UpdateTurnList", ::policy::kRpcDisallowed); + CheckRpcPermissions("SendLocation", ::policy::kRpcDisallowed); + CheckRpcPermissions("GenericRequest", ::policy::kRpcDisallowed); + CheckRpcPermissions("DialNumber", ::policy::kRpcDisallowed); +} + +// Related to manual tests APPLINK-18763, APPLINK-18764 +TEST_F(PolicyManagerImplTest2, CheckPreDataConsent_GetDefaultHmiLevel_NONE) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + std::string default_hmi; + // Default HMI level is NONE + manager_->GetDefaultHmi(app_id_2_, &default_hmi); + EXPECT_EQ("NONE", default_hmi); + + // Default priority level is NONE + std::string priority1; + EXPECT_TRUE(manager_->GetPriority(app_id_2_, &priority1)); + EXPECT_EQ("NONE", priority1); +} + +// Related to manual tests APPLINK-18763, APPLINK-18764 +TEST_F(PolicyManagerImplTest2, + CheckPreDataConsent_GetDefaultHmiLevel_BACKGROUNG) { + // Arrange + CreateLocalPT(kSdlPreloadedPtJson2); + manager_->AddApplication(app_id_2_); + std::string default_hmi; + // Default HMI level is BACKGROUND + manager_->GetDefaultHmi(app_id_2_, &default_hmi); + EXPECT_EQ("BACKGROUND", default_hmi); + // Default priority level is EMERGENCY + std::string priority1; + EXPECT_TRUE(manager_->GetPriority(app_id_2_, &priority1)); + EXPECT_EQ("EMERGENCY", priority1); +} + +TEST_F( + PolicyManagerImplTest2, + ReactOnUserDevConsentForApp_AddNewApplicationFromDeviceWithConsent_ExpectDefault) { + // Arrange + // RequestTypes for default & preDataConsent are different + CreateLocalPT("json/ptu_requestType.json"); + manager_->AddApplication(app_id_1_); + ASSERT_TRUE(manager_->IsPredataPolicy(app_id_1_)); + manager_->ReactOnUserDevConsentForApp(app_id_1_, true); + EXPECT_FALSE(manager_->IsPredataPolicy(app_id_1_)); + // Expect app_id_1_ has default policy + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_1_)); +} + +TEST_F( + PolicyManagerImplTest2, + ReactOnUserDevConsentForApp_AddNewApplicationFromDeviceWithConsent_ExpectPreDataConsent) { + // Arrange + // RequestTypes for default & preDataConsent are the same + CreateLocalPT(kPtu2RequestTypeJson); + manager_->AddApplication(app_id_1_); + ASSERT_TRUE(manager_->IsPredataPolicy(app_id_1_)); + EXPECT_CALL(listener_, OnPendingPermissionChange(app_id_1_)).Times(0); + manager_->ReactOnUserDevConsentForApp(app_id_1_, true); + EXPECT_FALSE(manager_->IsPredataPolicy(app_id_1_)); + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_1_)); +} + +TEST_F( + PolicyManagerImplTest2, + GetUserConsentForDevice_SetDeviceWithoutConcent_ExpectReceivedConsentCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceHasNoConsent, consent); +} + +TEST_F(PolicyManagerImplTest2, + GetUserConsentForDevice_SetDeviceAllowed_ExpectReceivedConsentCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + manager_->SetUserConsentForDevice(device_id_2_, true); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); +} + +TEST_F( + PolicyManagerImplTest2, + GetUserConsentForDevice_SetDeviceDisallowed_ExpectReceivedConsentCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + manager_->SetUserConsentForDevice(device_id_2_, false); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceDisallowed, consent); +} + +TEST_F(PolicyManagerImplTest2, + GetDefaultHmi_SetDeviceDisallowed_ExpectReceivedHmiCorrect) { + // Arrange + CreateLocalPT(kPtu2RequestTypeJson); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + + manager_->SetUserConsentForDevice(device_id_2_, false); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceDisallowed, consent); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + std::string default_hmi; + manager_->GetDefaultHmi(app_id_2_, &default_hmi); + EXPECT_EQ("NONE", default_hmi); +} + +TEST_F(PolicyManagerImplTest2, + GetDefaultHmi_SetDeviceAllowed_ExpectReceivedHmiCorrect) { + // Arrange + CreateLocalPT(kPtu2RequestTypeJson); + manager_->AddApplication(app_id_2_); + // Check if app has preData policy + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_2_)); + std::string default_hmi1; + manager_->GetDefaultHmi(app_id_2_, &default_hmi1); + EXPECT_EQ("NONE", default_hmi1); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + manager_->SetUserConsentForDevice(device_id_2_, true); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_2_)); + std::string default_hmi2; + manager_->GetDefaultHmi(app_id_2_, &default_hmi2); + EXPECT_EQ("LIMITED", default_hmi2); +} + +TEST_F(PolicyManagerImplTest2, + GetDefaultPriority_SetDeviceAllowed_ExpectReceivedPriorityCorrect) { + // Arrange + CreateLocalPT(kPtu2RequestTypeJson); + manager_->AddApplication(app_id_2_); + // Check if app has preData policy + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_2_)); + std::string priority1; + EXPECT_TRUE(manager_->GetPriority(app_id_2_, &priority1)); + EXPECT_EQ("NONE", priority1); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + manager_->SetUserConsentForDevice(device_id_2_, true); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_2_)); + std::string priority2; + EXPECT_TRUE(manager_->GetPriority(app_id_2_, &priority2)); + EXPECT_EQ("EMERGENCY", priority2); +} + +TEST_F(PolicyManagerImplTest2, + GetUserFirendlyMessages_ExpectReceivedCorrectMessages) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ::policy::StringArray message_code; + message_code.push_back("SettingEnableUpdates"); + message_code.push_back("AppPermissions"); + const std::string language = "en-us"; + const std::string active_hmi_language = language; + std::vector< ::policy::UserFriendlyMessage> result = + manager_->GetUserFriendlyMessages( + message_code, language, active_hmi_language); + uint32_t size = result.size(); + EXPECT_GT(size, 0u); + std::vector< ::policy::UserFriendlyMessage>::iterator result_iter; + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + + policy_table::ConsumerFriendlyMessages& consumer_friendly_messages = + *(pt->policy_table.consumer_friendly_messages); + policy_table::Messages& Messages = *(consumer_friendly_messages.messages); + + policy_table::Messages::const_iterator messages_iter = Messages.begin(); + // Loop until end of messages + for (; messages_iter != Messages.end(); ++messages_iter) { + if (messages_iter->first == "AppPermissions") { + for (result_iter = result.begin(); result_iter != result.end(); + ++result_iter) { + if (result_iter->message_code == "AppPermissions") { + const policy_table::MessageLanguages& MessageLanguages = + messages_iter->second; + const policy_table::Languages& Languages = MessageLanguages.languages; + policy_table::Languages::const_iterator languages_iter = + Languages.find("en-us"); + // If necessary language found + if (languages_iter != Languages.end()) { + const policy_table::MessageString& MessageString = + languages_iter->second; + EXPECT_EQ(static_cast<std::string>(*(MessageString.line1)), + result_iter->line1); + EXPECT_EQ(static_cast<std::string>(*(MessageString.line2)), + result_iter->line2); + EXPECT_EQ(static_cast<std::string>(*(MessageString.tts)), + result_iter->tts); + EXPECT_EQ(static_cast<std::string>(*(MessageString.label)), + result_iter->label); + EXPECT_EQ(static_cast<std::string>(*(MessageString.textBody)), + result_iter->text_body); + } + } + } + } else if (messages_iter->first == "SettingEnableUpdates") { + for (result_iter = result.begin(); result_iter != result.end(); + ++result_iter) { + if (result_iter->message_code == "SettingEnableUpdates") { + const policy_table::MessageLanguages& MessageLanguages = + messages_iter->second; + const policy_table::Languages& Languages = MessageLanguages.languages; + policy_table::Languages::const_iterator languages_iter = + Languages.find("en-us"); + // If necessary language found + if (languages_iter != Languages.end()) { + const policy_table::MessageString& MessageString2 = + languages_iter->second; + EXPECT_EQ(static_cast<std::string>(*(MessageString2.line1)), + result_iter->line1); + } + } + } + } + } +} + +TEST_F(PolicyManagerImplTest2, SetDeviceInfo_ExpectDevInfoAddedToPT) { + // Arrange + ::policy::DeviceInfo dev_info; + utils::SharedPtr<policy_table::Table> pt = (manager_->GetCache())->GetPT(); + dev_info.hardware = "hardware IPX"; + dev_info.firmware_rev = "v.8.0.1"; + dev_info.os = "Android"; + dev_info.os_ver = "4.4.2"; + dev_info.carrier = "Life"; + dev_info.max_number_rfcom_ports = 2; + dev_info.connection_type = "Bluetooth"; + manager_->AddDevice(device_id_1_, "Bluetooth"); + manager_->SetDeviceInfo(device_id_1_, dev_info); + // Find device in PT + policy_table::DeviceData::const_iterator iter = + (*(pt->policy_table.device_data)).find(device_id_1_); + // Checks + ASSERT_TRUE(iter != (*(pt->policy_table.device_data)).end()); + EXPECT_EQ(static_cast<std::string>(*(*iter).second.hardware), + dev_info.hardware); + EXPECT_EQ(static_cast<std::string>(*(*iter).second.firmware_rev), + dev_info.firmware_rev); + EXPECT_EQ(static_cast<std::string>(*(*iter).second.os), dev_info.os); + EXPECT_EQ(static_cast<std::string>(*(*iter).second.os_version), + dev_info.os_ver); + EXPECT_EQ(static_cast<std::string>(*(*iter).second.carrier), + dev_info.carrier); + EXPECT_EQ(static_cast<std::string>(*(*iter).second.connection_type), + dev_info.connection_type); + EXPECT_EQ(static_cast<uint8_t>(*(*iter).second.max_number_rfcom_ports), + dev_info.max_number_rfcom_ports); +} + +TEST_F(PolicyManagerImplTest2, GetInitialAppData_ExpectReceivedConsentCorrect) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + ::policy::StringArray app_nicknames; + ::policy::StringArray app_hmi_types; + manager_->GetInitialAppData(app_id_2_, &app_nicknames, &app_hmi_types); + // Expect Empty nicknames and AppHMITypes + EXPECT_EQ(0u, app_nicknames.size()); + EXPECT_EQ(0u, app_hmi_types.size()); + + Json::Value root = GetPTU(kValidSdlPtUpdateJson); + + Json::Value appHmiTypes = Json::Value(Json::arrayValue); + appHmiTypes = root["policy_table"]["app_policies"][app_id_2_]["AppHMIType"]; + const uint32_t appHmiType_size = appHmiTypes.size(); + + Json::Value appNicknames = Json::Value(Json::arrayValue); + appNicknames = root["policy_table"]["app_policies"][app_id_2_]["nicknames"]; + const uint32_t appNicknames_size = appNicknames.size(); + + ::policy::StringArray app_nicknames1; + ::policy::StringArray app_hmi_types1; + manager_->GetInitialAppData(app_id_2_, &app_nicknames1, &app_hmi_types1); + const uint32_t nick_names_size = app_nicknames1.size(); + const uint32_t app_hmi_types_size = app_hmi_types1.size(); + ASSERT_EQ(appHmiType_size, app_hmi_types_size); + ASSERT_EQ(appNicknames_size, nick_names_size); + ASSERT_GT(nick_names_size, 0u); + ASSERT_GT(app_hmi_types_size, 0u); + // Check nicknames match + for (uint32_t i = 0; i < nick_names_size; ++i) { + EXPECT_EQ(app_nicknames1[i], appNicknames[i].asString()); + } + // Check AppHMITypes match + for (uint32_t i = 0; i < app_hmi_types_size; ++i) { + EXPECT_EQ(app_hmi_types1[i], appHmiTypes[i].asString()); + } +} + +TEST_F( + PolicyManagerImplTest2, + CanAppKeepContext_AddAppFromUnconsentedDevice_ExpectAppCannotKeepContext) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + // Check if app has preData policy + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_2_)); + // Check keep context in preData policy + EXPECT_FALSE(manager_->CanAppKeepContext(app_id_2_)); +} + +TEST_F(PolicyManagerImplTest2, + CanAppKeepContext_AddAppFromConsentedDevice_ExpectAppCannotKeepContext) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + manager_->AddApplication(app_id_2_); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + manager_->SetUserConsentForDevice(device_id_2_, true); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_2_)); + // Check keep context in default policy + EXPECT_FALSE(manager_->CanAppKeepContext(app_id_2_)); +} + +TEST_F(PolicyManagerImplTest2, + CanAppStealFocus_AddAppFromUnconsentedDevice_ExpectAppCannotStealFocus) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + // Check if app has preData policy + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_2_)); + // Check keep context in preData policy + EXPECT_FALSE(manager_->CanAppStealFocus(app_id_2_)); +} + +TEST_F(PolicyManagerImplTest2, + CanAppStealFocus_AddAppFromConsentedDevice_ExpectAppCannotStealFocus) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + manager_->AddApplication(app_id_2_); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + manager_->SetUserConsentForDevice(device_id_2_, true); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_2_)); + // Check keep context in default policy + EXPECT_FALSE(manager_->CanAppStealFocus(app_id_2_)); +} + +TEST_F(PolicyManagerImplTest2, + IsPredataPolicy_SetAppWIthPredataPolicy_ExpectPredataPolicy) { + // Arrange + CreateLocalPT(preloadet_pt_filename_); + manager_->AddApplication(app_id_2_); + // Check if app has preData policy + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_2_)); +} + +TEST_F( + PolicyManagerImplTest2, + SendNotificationOnPermissionsUpdated_SetDeviceAllowed_ExpectNotificationSent) { + // Arrange + CreateLocalPT(kPtu2RequestTypeJson); + manager_->AddApplication(app_id_2_); + // Check if app has preData policy + EXPECT_TRUE(manager_->IsPredataPolicy(app_id_2_)); + std::string default_hmi1; + manager_->GetDefaultHmi(app_id_2_, &default_hmi1); + EXPECT_EQ("NONE", default_hmi1); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillOnce(Return("")); + EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_2_, _, default_hmi1)) + .Times(0); + manager_->SendNotificationOnPermissionsUpdated(app_id_2_); + + ASSERT_TRUE((manager_->GetCache())->AddDevice(device_id_2_, "Bluetooth")); + ASSERT_TRUE((manager_->GetCache()) + ->SetDeviceData(device_id_2_, + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth")); + manager_->SetUserConsentForDevice(device_id_2_, true); + ::policy::DeviceConsent consent = + manager_->GetUserConsentForDevice(device_id_2_); + // Check + EXPECT_EQ(::policy::DeviceConsent::kDeviceAllowed, consent); + EXPECT_CALL(listener_, OnCurrentDeviceIdUpdateRequired(app_id_2_)) + .WillRepeatedly(Return(device_id_2_)); + manager_->AddApplication(app_id_2_); + EXPECT_TRUE((manager_->GetCache())->IsDefaultPolicy(app_id_2_)); + std::string default_hmi2; + manager_->GetDefaultHmi(app_id_2_, &default_hmi2); + EXPECT_EQ("LIMITED", default_hmi2); + EXPECT_CALL(listener_, OnPermissionsUpdated(app_id_2_, _, default_hmi2)); + manager_->SendNotificationOnPermissionsUpdated(app_id_2_); +} + +} // namespace policy +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/shared_library_test.cc b/src/components/policy/policy_external/test/shared_library_test.cc new file mode 100644 index 0000000000..b7183a9085 --- /dev/null +++ b/src/components/policy/policy_external/test/shared_library_test.cc @@ -0,0 +1,76 @@ +/* Copyright (c) 2014, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <dlfcn.h> + +#include "gtest/gtest.h" + +namespace test { +namespace components { +namespace policy_test { + +::testing::AssertionResult IsError(void* error) { + if (error) { + return ::testing::AssertionSuccess() << static_cast<const char*>(error); + } else { + return ::testing::AssertionFailure() << error; + } +} + +TEST(SharedLibraryTest, + FullTest_OpenLibrarySetSymbolCloseLibrary_ExpectActsWithoutErrors) { + // Arrange + const std::string kLib = "../libPolicy.so"; + void* handle = dlopen(kLib.c_str(), RTLD_LAZY); + + // Assert + EXPECT_FALSE(IsError(dlerror())); + ASSERT_TRUE(handle); + + // Act + const std::string kSymbol = "CreateManager"; + void* symbol = dlsym(handle, kSymbol.c_str()); + + // Assert + EXPECT_FALSE(IsError(dlerror())); + EXPECT_TRUE(symbol); + + // Act + int ret = dlclose(handle); + + // Assert + EXPECT_FALSE(ret); + EXPECT_FALSE(IsError(dlerror())); +} + +} // namespace policy_test +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc new file mode 100644 index 0000000000..2f3e7bf000 --- /dev/null +++ b/src/components/policy/policy_external/test/sql_pt_ext_representation_test.cc @@ -0,0 +1,1406 @@ +/* Copyright (c) 2015, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <vector> +#include <map> +#include <algorithm> +#include <utility> +#include <string> +#include <iterator> +#include <iostream> +#include "gtest/gtest.h" +#include "policy/sql_pt_ext_representation.h" +#include "utils/gen_hash.h" +#include "utils/file_system.h" +#include "sqlite_wrapper/sql_query.h" +#include "rpc_base/rpc_base.h" +#include "policy/policy_table/types.h" +#include "policy/mock_policy_settings.h" +#include "utils/shared_ptr.h" +#include "utils/make_shared.h" + +using namespace ::policy; +namespace policy_table = rpc::policy_table_interface_base; +using std::string; +using std::map; +using std::pair; +using std::vector; +using testing::ReturnRef; + +namespace test { +namespace components { +namespace policy_test { + +class SQLPTExtRepresentationTest : public ::testing::Test { + public: + // Collection of pairs of group alias and corresponding group name + typedef vector<pair<string, string> > GroupsAliasNameCollection; + + SQLPTExtRepresentationTest() : reps(0) {} + + protected: + SQLPTExtRepresentation* reps; + policy_handler_test::MockPolicySettings policy_settings_; + static const string kDatabaseName; + PermissionConsent perm_consent; + FunctionalGroupPermission group1_perm; + FunctionalGroupPermission group2_perm; + utils::dbms::SQLQuery* query_wrapper_; + static const bool in_memory_; + const std::string kAppStorageFolder = "storage1"; + + void SetUp() OVERRIDE { + file_system::DeleteFile(kDatabaseName); + reps = new SQLPTExtRepresentation(in_memory_); + ASSERT_TRUE(reps != NULL); + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kAppStorageFolder)); + ASSERT_EQ(SUCCESS, reps->Init(&policy_settings_)); + query_wrapper_ = new utils::dbms::SQLQuery(reps->db()); + ASSERT_TRUE(query_wrapper_ != NULL); + } + + void TearDown() OVERRIDE { + delete query_wrapper_; + EXPECT_TRUE(reps->Drop()); + EXPECT_TRUE(reps->Close()); + delete reps; + } + + void FillGroupPermission( + vector<FunctionalGroupPermission>& groups_permissions, + FunctionalGroupPermission group, + const GroupsAliasNameCollection& groups_names, + GroupConsent state) { + GroupsAliasNameCollection::const_iterator groups_names_it = + groups_names.begin(); + while (groups_names_it != groups_names.end()) { + group.group_alias = groups_names_it->first; + group.group_name = groups_names_it->second; + group.group_id = ::utils::Djb2HashFromString(groups_names_it->second); + group.state = state; + groups_permissions.push_back(group); + ++groups_names_it; + } + } + + void FillPermissionStruct( + const string& dev_id, + const string& app_id, + const string& consent_source, + const GroupsAliasNameCollection& allowed_groups_names, + const GroupsAliasNameCollection& disallowed_groups_names) { + // Arrange + vector<FunctionalGroupPermission> groups_permissions; + perm_consent.device_id = dev_id; + perm_consent.policy_app_id = app_id; + perm_consent.consent_source = consent_source; + // Fill groups + FillGroupPermission(groups_permissions, + group1_perm, + allowed_groups_names, + GroupConsent::kGroupAllowed); + FillGroupPermission(groups_permissions, + group2_perm, + disallowed_groups_names, + GroupConsent::kGroupDisallowed); + perm_consent.group_permissions = groups_permissions; + } + + bool Check(const GroupsAliasNameCollection& groups_names, + const vector<int32_t>& group_Ids) { + vector<int32_t>::const_iterator group_Ids_it = group_Ids.begin(); + GroupsAliasNameCollection::const_iterator group_alias_name_it = + groups_names.begin(); + + EXPECT_EQ(groups_names.size(), group_Ids.size()); + while (group_Ids_it != group_Ids.end()) { + while (group_alias_name_it != groups_names.end()) { + if (group_Ids.end() != std::find(group_Ids.begin(), + group_Ids.end(), + ::utils::Djb2HashFromString( + group_alias_name_it->second))) { + return true; + } + ++group_alias_name_it; + } + ++group_Ids_it; + } + return false; + } + + bool CheckGroupTypesExist( + const FunctionalIdType& group_types, + const GroupsAliasNameCollection& allowed_groups_names, + const GroupsAliasNameCollection& disallowed_groups_names) { + bool result = true; + map<GroupType, FunctionalGroupIDs>::const_iterator functional_id_type_it1 = + group_types.find(GroupType::kTypeAllowed); + map<GroupType, FunctionalGroupIDs>::const_iterator functional_id_type_it2 = + group_types.find(GroupType::kTypeDisallowed); + + if (functional_id_type_it1 == group_types.end() || + functional_id_type_it2 == group_types.end()) { + return false; + } + + const std::vector<int32_t>& allowedGroupIDs = + functional_id_type_it1->second; + const std::vector<int32_t>& disallowedGroupIDs = + functional_id_type_it2->second; + if (0u == allowedGroupIDs.size() && 0u == disallowedGroupIDs.size()) { + result = false; + } else if (0u != allowedGroupIDs.size() && + 0u == disallowedGroupIDs.size()) { + result = Check(allowed_groups_names, allowedGroupIDs); + } else if (0u != disallowedGroupIDs.size() && + 0u == allowedGroupIDs.size()) { + result = Check(disallowed_groups_names, disallowedGroupIDs); + } else if (0u != allowedGroupIDs.size() && + 0u != disallowedGroupIDs.size()) { + result = Check(allowed_groups_names, allowedGroupIDs) && + Check(disallowed_groups_names, disallowedGroupIDs); + } else { + result = false; + } + return result; + } +}; + +const string SQLPTExtRepresentationTest::kDatabaseName = ":memory:"; +const bool SQLPTExtRepresentationTest::in_memory_ = true; + +::testing::AssertionResult IsValid(const policy_table::Table& table) { + if (table.is_valid()) { + return ::testing::AssertionSuccess(); + } else { + ::rpc::ValidationReport report(" - table"); + table.ReportErrors(&report); + return ::testing::AssertionFailure() << ::rpc::PrettyFormat(report); + } +} + +TEST_F(SQLPTExtRepresentationTest, + DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) { + // TODO(AKutsan): APPLINK-31526 Test requires initial preloaded pt for preloaded date reading + // Arrange + Json::Value table(Json::objectValue); + table["policy_table"] = Json::Value(Json::objectValue); + + Json::Value& policy_table = table["policy_table"]; + policy_table["module_config"] = Json::Value(Json::objectValue); + policy_table["functional_groupings"] = Json::Value(Json::objectValue); + policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue); + policy_table["app_policies"] = Json::Value(Json::objectValue); + + Json::Value& module_config = policy_table["module_config"]; + module_config["preloaded_date"] = Json::Value(""); + module_config["exchange_after_x_ignition_cycles"] = Json::Value(10); + module_config["exchange_after_x_kilometers"] = Json::Value(100); + module_config["exchange_after_x_days"] = Json::Value(5); + module_config["timeout_after_x_seconds"] = Json::Value(500); + module_config["seconds_between_retries"] = Json::Value(Json::arrayValue); + module_config["seconds_between_retries"][0] = Json::Value(10); + module_config["seconds_between_retries"][1] = Json::Value(20); + module_config["seconds_between_retries"][2] = Json::Value(30); + module_config["endpoints"] = Json::Value(Json::objectValue); + module_config["endpoints"]["0x00"] = Json::Value(Json::objectValue); + module_config["endpoints"]["0x00"]["default"] = Json::Value(Json::arrayValue); + module_config["endpoints"]["0x00"]["default"][0] = + Json::Value("http://ford.com/cloud/default"); + module_config["notifications_per_minute_by_priority"] = + Json::Value(Json::objectValue); + module_config["notifications_per_minute_by_priority"]["emergency"] = + Json::Value(1); + module_config["notifications_per_minute_by_priority"]["navigation"] = + Json::Value(2); + module_config["notifications_per_minute_by_priority"]["VOICECOMM"] = + Json::Value(3); + module_config["notifications_per_minute_by_priority"]["communication"] = + Json::Value(4); + module_config["notifications_per_minute_by_priority"]["normal"] = + Json::Value(5); + module_config["notifications_per_minute_by_priority"]["none"] = + Json::Value(6); + module_config["vehicle_make"] = Json::Value("MakeT"); + module_config["vehicle_model"] = Json::Value("ModelT"); + module_config["vehicle_year"] = Json::Value("2014"); + module_config["certificate"] = Json::Value("my_cert"); + + Json::Value& functional_groupings = policy_table["functional_groupings"]; + functional_groupings["default"] = Json::Value(Json::objectValue); + Json::Value& default_group = functional_groupings["default"]; + default_group["rpcs"] = Json::Value(Json::objectValue); + default_group["rpcs"]["Update"] = Json::Value(Json::objectValue); + default_group["rpcs"]["Update"]["hmi_levels"] = Json::Value(Json::arrayValue); + default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL"); + default_group["rpcs"]["Update"]["parameters"] = Json::Value(Json::arrayValue); + default_group["rpcs"]["Update"]["parameters"][0] = Json::Value("speed"); + + Json::Value& consumer_friendly_messages = + policy_table["consumer_friendly_messages"]; + consumer_friendly_messages["version"] = Json::Value("1.2"); + consumer_friendly_messages["messages"] = Json::Value(Json::objectValue); + consumer_friendly_messages["messages"]["MSG1"] = + Json::Value(Json::objectValue); + Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"]; + msg1["languages"] = Json::Value(Json::objectValue); + msg1["languages"]["en-us"] = Json::Value(Json::objectValue); + msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message"); + msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message"); + msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message"); + msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message"); + msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message"); + + Json::Value& app_policies = policy_table["app_policies"]; + app_policies["default"] = Json::Value(Json::objectValue); + app_policies["default"]["memory_kb"] = Json::Value(50); + app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100); + app_policies["default"]["groups"] = Json::Value(Json::arrayValue); + app_policies["default"]["groups"][0] = Json::Value("default"); + app_policies["default"]["priority"] = Json::Value("EMERGENCY"); + app_policies["default"]["default_hmi"] = Json::Value("FULL"); + app_policies["default"]["keep_context"] = Json::Value(true); + app_policies["default"]["steal_focus"] = Json::Value(true); + app_policies["pre_DataConsent"] = Json::Value(Json::objectValue); + app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(50); + app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(100); + app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue); + app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default"); + app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY"); + app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL"); + app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true); + app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true); + app_policies["1234"] = Json::Value(Json::objectValue); + app_policies["1234"]["memory_kb"] = Json::Value(50); + app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(100); + app_policies["1234"]["groups"] = Json::Value(Json::arrayValue); + app_policies["1234"]["groups"][0] = Json::Value("default"); + app_policies["1234"]["priority"] = Json::Value("EMERGENCY"); + app_policies["1234"]["default_hmi"] = Json::Value("FULL"); + app_policies["1234"]["keep_context"] = Json::Value(true); + app_policies["1234"]["steal_focus"] = Json::Value(true); + app_policies["device"] = Json::Value(Json::objectValue); + app_policies["device"]["groups"] = Json::Value(Json::arrayValue); + app_policies["device"]["groups"][0] = Json::Value("default"); + app_policies["device"]["priority"] = Json::Value("EMERGENCY"); + app_policies["device"]["default_hmi"] = Json::Value("FULL"); + app_policies["device"]["keep_context"] = Json::Value(true); + app_policies["device"]["steal_focus"] = Json::Value(true); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + + // Assert + ASSERT_TRUE(IsValid(update)); + ASSERT_TRUE(reps->Save(update)); + + // Act + utils::SharedPtr<policy_table::Table> snapshot = reps->GenerateSnapshot(); + snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT); + + policy_table["module_meta"] = Json::Value(Json::objectValue); + policy_table["usage_and_error_counts"] = Json::Value(Json::objectValue); + policy_table["device_data"] = Json::Value(Json::objectValue); + policy_table["module_config"]["preloaded_pt"] = Json::Value(false); + + Json::Value& module_meta = policy_table["module_meta"]; + module_meta["ccpu_version"] = Json::Value(""); + module_meta["language"] = Json::Value(""); + module_meta["wers_country_code"] = Json::Value(""); + module_meta["pt_exchanged_at_odometer_x"] = Json::Value(0); + module_meta["pt_exchanged_x_days_after_epoch"] = Json::Value(0); + module_meta["ignition_cycles_since_last_exchange"] = Json::Value(0); + module_meta["vin"] = Json::Value(""); + + Json::Value& usage_and_error_counts = policy_table["usage_and_error_counts"]; + usage_and_error_counts["count_of_iap_buffer_full"] = Json::Value(0); + usage_and_error_counts["count_sync_out_of_memory"] = Json::Value(0); + usage_and_error_counts["count_of_sync_reboots"] = Json::Value(0); + + policy_table::Table expected(&table); + + // Assert + EXPECT_EQ(expected.ToJsonValue().toStyledString(), + snapshot->ToJsonValue().toStyledString()); +} + +TEST_F( + SQLPTExtRepresentationTest, + CanAppKeepContext_InsertKeepContext_ExpectValuesThatSetInKeepContextParams) { + // Arrange + const std::string query_delete = "DELETE FROM `application`; "; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + const std::string query_insert_12345 = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `keep_context`) VALUES ('12345', 5, 10, 1)"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); + EXPECT_FALSE(reps->CanAppKeepContext("0")); + EXPECT_TRUE(reps->CanAppKeepContext("12345")); + // Act + const std::string query_insert_123 = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `keep_context`) VALUES ('123', 10, 7, 0)"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_123)); + EXPECT_FALSE(reps->CanAppKeepContext("123")); +} + +TEST_F(SQLPTExtRepresentationTest, + CanAppStealFocus_SetStealFocus_ExpectValuesThatSetInStealFocusParam) { + // Arrange + const std::string query_delete = "DELETE FROM `application`; "; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + const std::string query_insert_12345 = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `steal_focus`) VALUES ('12345', 5, 10, 1)"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); + EXPECT_TRUE(reps->CanAppStealFocus("12345")); + EXPECT_FALSE(reps->CanAppStealFocus("0")); + // Act + const std::string query_insert_123 = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `steal_focus`) VALUES ('123', 10, 7, 0)"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_123)); + EXPECT_FALSE(reps->CanAppStealFocus("123")); +} + +TEST_F(SQLPTExtRepresentationTest, + GetDefaultHMI_SetHMI_ExpectValuesThatSetInHMIParam) { + // Arrange + const std::string query_delete = "DELETE FROM `application`; "; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + const std::string query_insert_12345 = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `default_hmi`) VALUES ('12345', 5, 10, " + "'NONE')"; + std::string result; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); + EXPECT_TRUE(reps->GetDefaultHMI("12345", &result)); + EXPECT_EQ("NONE", result); + const std::string query_insert_123 = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `default_hmi`) VALUES ('123', 5, 10, " + "'LIMITED')"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_123)); + EXPECT_TRUE(reps->GetDefaultHMI("123", &result)); + EXPECT_EQ("LIMITED", result); +} + +TEST_F(SQLPTExtRepresentationTest, + GetUserPermissionsForDevice_SetPermissions_ExpectValuesThatSetInParams) { + // Arrange + StringArray allowed_groups; + StringArray disallowed_groups; + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + EXPECT_EQ(0u, allowed_groups.size()); + EXPECT_EQ(0u, disallowed_groups.size()); + + const std::string query_delete = "DELETE FROM `device_consent_group`; "; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + const std::string query_insert_DataConsent = + "INSERT INTO `device_consent_group` (`device_id`, " + "`functional_group_id`,'is_consented', `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', 'DataConsent-2', 1,'GUI', '2014-01-01T00:00:52Z')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_DataConsent)); + const std::string query_insert_Navigation = + "INSERT INTO `device_consent_group` (`device_id`, " + "`functional_group_id`,'is_consented', `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', 'Navigation-1', 0,'GUI', '2015-01-01T00:00:52Z')"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Navigation)); + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + EXPECT_EQ(1u, allowed_groups.size()); + EXPECT_EQ(1u, disallowed_groups.size()); +} + +TEST_F(SQLPTExtRepresentationTest, + SetUserPermissionsForDevice_SetPermissions_ExpectValuesThatSetInParams) { + // Arrange + StringArray allowed_groups; + StringArray disallowed_groups; + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + EXPECT_EQ(0u, allowed_groups.size()); + EXPECT_EQ(0u, disallowed_groups.size()); + allowed_groups.push_back("DataConsent-2"); + disallowed_groups.push_back("Navigation-1"); + EXPECT_TRUE(reps->SetUserPermissionsForDevice( + "XXX12345ZZZ", allowed_groups, disallowed_groups)); + + allowed_groups.clear(); + disallowed_groups.clear(); + // Act + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + // Checks + EXPECT_EQ(1u, allowed_groups.size()); + EXPECT_EQ(1u, disallowed_groups.size()); + EXPECT_TRUE(std::find(allowed_groups.begin(), + allowed_groups.end(), + "DataConsent-2") != allowed_groups.end()); + EXPECT_TRUE(std::find(disallowed_groups.begin(), + disallowed_groups.end(), + "Navigation-1") != disallowed_groups.end()); +} + +TEST_F(SQLPTExtRepresentationTest, + ResetDeviceConsents_SetConsentThenReset_ExpectValuesReset) { + // Arrange + StringArray allowed_groups; + StringArray disallowed_groups; + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + EXPECT_EQ(0u, allowed_groups.size()); + EXPECT_EQ(0u, disallowed_groups.size()); + allowed_groups.push_back("DataConsent-2"); + disallowed_groups.push_back("Navigation-1"); + EXPECT_TRUE(reps->SetUserPermissionsForDevice( + "XXX12345ZZZ", allowed_groups, disallowed_groups)); + + allowed_groups.clear(); + disallowed_groups.clear(); + // Act + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + // Checks + EXPECT_EQ(1u, allowed_groups.size()); + EXPECT_EQ(1u, disallowed_groups.size()); + EXPECT_TRUE(std::find(allowed_groups.begin(), + allowed_groups.end(), + "DataConsent-2") != allowed_groups.end()); + EXPECT_TRUE(std::find(disallowed_groups.begin(), + disallowed_groups.end(), + "Navigation-1") != disallowed_groups.end()); + allowed_groups.clear(); + disallowed_groups.clear(); + // Act + reps->ResetDeviceConsents(); + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + // Checks + EXPECT_EQ(0u, allowed_groups.size()); + EXPECT_EQ(0u, disallowed_groups.size()); +} + +TEST_F(SQLPTExtRepresentationTest, + GetPermissionsForApp_SetPermissions_ExpectValuesThatSetInParams) { + // Arrange + const std::string query_insert_input_0 = + "INSERT INTO `consent_group` (`device_id`, 'application_id' , " + "`functional_group_id`, 'is_consented', `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', '12345', 414812216, 1,'GUI', " + "'2014-01-01T00:00:52Z')"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_input_0)); + const std::string query_insert_input_1 = + "INSERT INTO `consent_group` (`device_id`, 'application_id' , " + "`functional_group_id`, 'is_consented', `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', '12345', 686787169, 0,'GUI', " + "'2014-01-01T00:00:52Z')"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_input_1)); + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("DataConsent", "DataConsent-2")); + + GroupsAliasNameCollection disallowed_groups; + disallowed_groups.push_back(std::make_pair("", "Base-4")); + FillPermissionStruct("", "", "", allowed_groups, disallowed_groups); + FunctionalIdType group_types; + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "12345", &group_types)); + EXPECT_TRUE( + CheckGroupTypesExist(group_types, allowed_groups, disallowed_groups)); +} + +TEST_F(SQLPTExtRepresentationTest, + SetUserPermissionsForApp_SetPermissions_ExpectValuesThatSetInParams) { + // Arrange + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection disallowed_groups; + disallowed_groups.push_back(std::make_pair("DataConsent", "DataConsent-2")); + FillPermissionStruct( + "XXX12345ZZZ", "12345", "VR", allowed_groups, disallowed_groups); + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + + FunctionalIdType group_types; + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "12345", &group_types)); + EXPECT_TRUE( + CheckGroupTypesExist(group_types, allowed_groups, disallowed_groups)); +} + +TEST_F(SQLPTExtRepresentationTest, + ResetAppConsents_SetPermissionsThenReset_ExpectValuesReset) { + // Arrange + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection disallowed_groups; + disallowed_groups.push_back(std::make_pair("DataConsent", "DataConsent-2")); + FillPermissionStruct( + "XXX12345ZZZ", "12345", "VR", allowed_groups, disallowed_groups); + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + + FunctionalIdType group_types; + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "12345", &group_types)); + EXPECT_TRUE( + CheckGroupTypesExist(group_types, allowed_groups, disallowed_groups)); + + reps->ResetAppConsents(); + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "12345", &group_types)); + EXPECT_FALSE( + CheckGroupTypesExist(group_types, allowed_groups, disallowed_groups)); +} + +TEST_F(SQLPTExtRepresentationTest, + ResetUserConsent_SetConsentThenReset_ExpectValuesReset) { + // Arrange + GroupsAliasNameCollection perm_allowed_groups; + perm_allowed_groups.push_back( + std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection perm_disallowed_groups; + perm_disallowed_groups.push_back( + std::make_pair("DataConsent", "DataConsent-2")); + FillPermissionStruct("XXX12345ZZZ", + "12345", + "VR", + perm_allowed_groups, + perm_disallowed_groups); + // Set permissions for app + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + + FunctionalIdType group_types; + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "12345", &group_types)); + EXPECT_TRUE(CheckGroupTypesExist( + group_types, perm_allowed_groups, perm_disallowed_groups)); + + StringArray allowed_groups; + StringArray disallowed_groups; + allowed_groups.push_back("DataConsent-2"); + disallowed_groups.push_back("Navigation-1"); + // Set permissions for device + EXPECT_TRUE(reps->SetUserPermissionsForDevice( + "XXX12345ZZZ", allowed_groups, disallowed_groups)); + + allowed_groups.clear(); + disallowed_groups.clear(); + // Act + reps->ResetUserConsent(); + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + // Checks + EXPECT_EQ(0u, allowed_groups.size()); + EXPECT_EQ(0u, disallowed_groups.size()); + EXPECT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "12345", &group_types)); + EXPECT_FALSE(CheckGroupTypesExist( + group_types, perm_allowed_groups, perm_disallowed_groups)); +} + +TEST_F(SQLPTExtRepresentationTest, + GetDeviceGroupsFromPolicies_SetGroups_ExpectValuesThatSetInParams) { + // Arrange + const std::string query_insert_app_group_1 = + "INSERT INTO `app_group` (`application_id`, 'functional_group_id') " + "VALUES ('device', '414812216')"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_group_1)); + + const std::string query_insert_DataConsent = + "INSERT INTO `functional_group` (`id`, 'user_consent_prompt', 'name') " + "VALUES ('414812216', 'DataConsent', 'DataConsent-2')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_DataConsent)); + + const std::string query_insert_app_group_2 = + "INSERT INTO `app_group` (`application_id`, 'functional_group_id') " + "VALUES ('device', 1809526495)"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_group_2)); + + const std::string query_insert_Notifications = + "INSERT INTO `functional_group` (`id`, 'user_consent_prompt', 'name') " + "VALUES (1809526495, 'Notifications', 'Notifications')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Notifications)); + + const std::string query_insert_preconsented_group = + "INSERT INTO `preconsented_group` (`application_id`, " + "`functional_group_id`) " + "VALUES ('device', 686787169)"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_preconsented_group)); + + const std::string query_insert_Base = + "INSERT INTO `functional_group` (`id`, 'user_consent_prompt', 'name') " + "VALUES (686787169, '', 'Base-4')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Base)); + + policy_table::Strings groups; + policy_table::Strings preconsented_groups; + + EXPECT_TRUE(reps->GetDeviceGroupsFromPolicies(&groups, &preconsented_groups)); + EXPECT_EQ(2u, groups.size()); + EXPECT_EQ(1u, preconsented_groups.size()); + + const uint32_t min_size = 1u; + const uint32_t max_size = 255u; + + rpc::String<min_size, max_size> temp1("DataConsent-2"); + rpc::String<min_size, max_size> temp2("Notifications"); + rpc::String<min_size, max_size> temp3("Base-4"); + + EXPECT_NE(groups.end(), std::find(groups.begin(), groups.end(), temp1)); + EXPECT_NE(groups.end(), std::find(groups.begin(), groups.end(), temp2)); + EXPECT_NE( + preconsented_groups.end(), + std::find(preconsented_groups.begin(), preconsented_groups.end(), temp3)); +} + +TEST_F(SQLPTExtRepresentationTest, + SetDeviceData_SetDeviceData_ExpectValuesThatSetInParams) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + reps->SetDeviceData("08-00-27-CE-76-FE", + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth"); + const std::string query_select_hardware = + "SELECT `hardware` FROM `device` WHERE `id` = '08-00-27-CE-76-FE'"; + const std::string query_select_firmware_rev = + "SELECT `firmware_rev` FROM `device` WHERE `id` = '08-00-27-CE-76-FE'"; + const std::string query_select_os = + "SELECT `os` FROM `device` WHERE `id` = '08-00-27-CE-76-FE'"; + const std::string query_select_os_version = + "SELECT `os_version` FROM `device` WHERE `id` = '08-00-27-CE-76-FE'"; + const std::string query_select_carrier = + "SELECT `carrier` FROM `device` WHERE `id` = '08-00-27-CE-76-FE'"; + const std::string query_select_max_rfports_number = + "SELECT `max_number_rfcom_ports` FROM `device` WHERE `id` = " + "'08-00-27-CE-76-FE'"; + const std::string query_select_connection_type = + "SELECT `connection_type` FROM `device` WHERE `id` = '08-00-27-CE-76-FE'"; + + // Checks + query.Prepare(query_select_hardware); + query.Next(); + EXPECT_EQ(string("hardware IPX"), query.GetString(0)); + + query.Prepare(query_select_firmware_rev); + query.Next(); + EXPECT_EQ("v.8.0.1", query.GetString(0)); + + query.Prepare(query_select_os); + query.Next(); + EXPECT_EQ("Android", query.GetString(0)); + + query.Prepare(query_select_os_version); + query.Next(); + EXPECT_EQ("4.4.2", query.GetString(0)); + + query.Prepare(query_select_carrier); + query.Next(); + EXPECT_EQ("Life", query.GetString(0)); + + query.Prepare(query_select_max_rfports_number); + query.Next(); + EXPECT_EQ(2, query.GetInteger(0)); + + query.Prepare(query_select_connection_type); + query.Next(); + EXPECT_EQ("Bluetooth", query.GetString(0)); +} + +TEST_F( + SQLPTExtRepresentationTest, + ReactOnUserDevConsentForApp_SetDeviceAllowedAppHasPreDataConsent_ExpectAppHasDefaultPolicies) { + // Arrange + const std::string query_insert_device = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`) " + "VALUES ('device', '414812216')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_device)); + + const std::string query_insert_default = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`) " + "VALUES ('default', '686787169')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_default)); + + const std::string query_insert_pre_DataConsent = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`) " + "VALUES ('pre_DataConsent', '129372391')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_pre_DataConsent)); + + const std::string query_insert_1234 = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`) " + "VALUES ('1234', '129372391')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_1234)); + + const std::string query_insert_preconsented_group = + "INSERT INTO `preconsented_group` (`application_id`, " + "`functional_group_id`) " + "VALUES ('1234', '129372391')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_preconsented_group)); + + const std::string query_insert_functional_group = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (129372391, '', 'pre_DataConsent')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_functional_group)); + + const std::string query_insert_application = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `is_predata`, `keep_context`) VALUES ('1234', " + "5, 10, 1, 0)"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_application)); + + EXPECT_TRUE(reps->IsPredataPolicy("1234")); + reps->ReactOnUserDevConsentForApp("1234", true); + EXPECT_TRUE(reps->IsDefaultPolicy("1234")); +} + +TEST_F( + SQLPTExtRepresentationTest, + ReactOnUserDevConsentForApp_SetDeviceAllowedAppHasSpecificPoliciesThenSetPredata_ExpectAppGroupsRestored) { + // Arrange + const std::string query_insert_device_consent_group = + "INSERT INTO `device_consent_group` (`device_id`, " + "`functional_group_id`,'is_consented', `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', 'Location-1', 1,'GUI', '2015-01-01T00:00:52Z')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_device_consent_group)); + + const std::string query_insert_consent_group_1 = + "INSERT INTO `consent_group` (`device_id`, 'application_id' , " + "`functional_group_id`, `is_consented`, `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', '1234', 156072572, 1,'GUI', " + "'2014-01-01T00:00:52Z')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_consent_group_1)); + + const std::string query_insert_consent_group_2 = + "INSERT INTO `consent_group` (`device_id`, 'application_id' , " + "`functional_group_id`, `is_consented`, `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', '1234', 1809526495, 1,'GUI', " + "'2014-01-01T00:00:52Z')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_consent_group_2)); + + const std::string query_insert_pre_DataConsent = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (129372391, '', 'pre_DataConsent')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_pre_DataConsent)); + + const std::string query_insert_Notifications = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (1809526495, 'Notifications', 'Notifications')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Notifications)); + + const std::string query_insert_Location = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (156072572, 'Location', 'Location-1')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Location)); + + // Add to app_group + const std::string query_insert_app_group_1 = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`) " + "VALUES ('1234', '1809526495')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_group_1)); + + const std::string query_insert_app_group_2 = + "INSERT INTO `app_group` (`application_id`, `functional_group_id`) " + "VALUES ('1234', '156072572')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_group_2)); + // Add to pre_consented groups + const std::string query_insert_preconsented_group = + "INSERT INTO `preconsented_group` (`application_id`, " + "`functional_group_id`) " + "VALUES ('1234', '129372391')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_preconsented_group)); + + const std::string query_insert_application = + "INSERT INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`, `is_predata`, `keep_context`) VALUES ('1234', " + "5, 10, 0, 0)"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_application)); + FunctionalIdType group_types; + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "1234", &group_types)); + EXPECT_FALSE(reps->IsPredataPolicy("1234")); + EXPECT_FALSE(reps->IsDefaultPolicy("1234")); + std::map<GroupType, FunctionalGroupIDs>::iterator it1 = + group_types.find(GroupType::kTypeAllowed); + EXPECT_TRUE(group_types.end() != it1); + EXPECT_EQ(2u, it1->second.size()); + std::vector<int32_t>::iterator it2 = + std::find(it1->second.begin(), it1->second.end(), 156072572); + ASSERT_TRUE(it2 != it1->second.end()); + it2 = std::find(it1->second.begin(), it1->second.end(), 1809526495); + ASSERT_TRUE(it2 != it1->second.end()); + reps->SetIsPredata("1234", true); + EXPECT_TRUE(reps->IsPredataPolicy("1234")); + reps->ReactOnUserDevConsentForApp("1234", true); + group_types.clear(); + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "1234", &group_types)); + EXPECT_FALSE(reps->IsPredataPolicy("1234")); + EXPECT_FALSE(reps->IsDefaultPolicy("1234")); + it1 = group_types.find(GroupType::kTypeAllowed); + EXPECT_TRUE(group_types.end() != it1); + EXPECT_EQ(2u, it1->second.size()); + it2 = std::find(it1->second.begin(), it1->second.end(), 156072572); + ASSERT_TRUE(it2 != it1->second.end()); + it2 = std::find(it1->second.begin(), it1->second.end(), 1809526495); + ASSERT_TRUE(it2 != it1->second.end()); +} + +TEST_F(SQLPTExtRepresentationTest, + GetUserFriendlyMsg_SetMsg_ExpectReceivedMsgSetInParams) { + // Arrange + const std::string query_insert_message = + "INSERT INTO `message` (`tts`, `label`,`line1`, `line2`, `textBody`, " + "`language_code`, `message_type_name`) VALUES ('test tts message', " + "'GPS and speed', 'test', 'test1', 'test3', 'en-en', 'AppPermissions')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_message)); + const std::string query_insert_message_type = + "INSERT INTO `message_type` (`name`) VALUES ('AppPermissions')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_message_type)); + std::vector<string> msg_code; + msg_code.push_back("AppPermissions"); + // Act + std::vector<UserFriendlyMessage> result = + reps->GetUserFriendlyMsg(msg_code, string("en-en")); + // Checks + ASSERT_EQ(1u, result.size()); + EXPECT_EQ(result[0].message_code, "AppPermissions"); + EXPECT_EQ(result[0].tts, "test tts message"); + EXPECT_EQ(result[0].label, "GPS and speed"); + EXPECT_EQ(result[0].line1, "test"); + EXPECT_EQ(result[0].line2, "test1"); + EXPECT_EQ(result[0].text_body, "test3"); +} + +TEST_F(SQLPTExtRepresentationTest, + IncrementGlobalCounter_IncrementThreeTimes_ExpectCountEqual3) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_update = + "UPDATE `usage_and_error_count` SET" + " `count_of_sync_reboots` = 0"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_update)); + + // Act + reps->Increment("count_of_sync_reboots"); + reps->Increment("count_of_sync_reboots"); + reps->Increment("count_of_sync_reboots"); + + const std::string query_select = + "SELECT `count_of_sync_reboots` FROM `usage_and_error_count`"; + // Assert + query.Prepare(query_select); + query.Next(); + EXPECT_EQ(3, query.GetInteger(0)); +} + +TEST_F( + SQLPTExtRepresentationTest, + IncrementAppCounter_IncrementCountOfUserSelections3Times_ExpectCountEqual3) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_delete = + "DELETE FROM `app_level` WHERE `application_id` = '12345'"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + + // Act + reps->Increment("12345", "count_of_user_selections"); + reps->Increment("12345", "count_of_user_selections"); + reps->Increment("12345", "count_of_user_selections"); + + const std::string query_select = + "SELECT `count_of_user_selections` FROM `app_level`" + " WHERE `application_id` = '12345'"; + + // Assert + query.Prepare(query_select); + query.Next(); + EXPECT_EQ(3, query.GetInteger(0)); +} + +TEST_F(SQLPTExtRepresentationTest, + AppInfo_SetLanguageRuInGUIAndEnInVUI_ExpectRuInGUIAndEnInVUI) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_delete = + "DELETE FROM `app_level` WHERE `application_id` = '12345'"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + reps->Set("12345", "app_registration_language_gui", "ru-ru"); + reps->Set("12345", "app_registration_language_vui", "en-en"); + + const std::string query_select_gui = + "SELECT `app_registration_language_gui`" + " FROM `app_level` WHERE `application_id` = '12345'"; + + const std::string query_select_vui = + "SELECT `app_registration_language_vui`" + " FROM `app_level` WHERE `application_id` = '12345'"; + + // Assert + query.Prepare(query_select_gui); + query.Next(); + EXPECT_EQ("ru-ru", query.GetString(0)); + + query.Prepare(query_select_vui); + query.Next(); + EXPECT_EQ("en-en", query.GetString(0)); +} + +TEST_F(SQLPTExtRepresentationTest, + AddAppStopwatch_Set10And60MinutesForStopwatch_Expect70Minutes) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_delete = + "DELETE FROM `app_level` WHERE `application_id` = '12345'"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + reps->Add("12345", "minutes_in_hmi_full", 10); + reps->Add("12345", "minutes_in_hmi_full", 60); + + const std::string query_select = + "SELECT `minutes_in_hmi_full` FROM `app_level`" + " WHERE `application_id` = '12345'"; + + // Assert + query.Prepare(query_select); + query.Next(); + EXPECT_EQ(70, query.GetInteger(0)); +} + +TEST_F( + SQLPTExtRepresentationTest, + SetUnpairedDevice_SetUnpairedDeviceId12345_ExpectUnpairedDeviceIdEquals12345) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_delete = "DELETE FROM `device`"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + const std::string query_insert = + "INSERT INTO `device` (`id`) VALUES('12345')"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + ASSERT_TRUE(reps->SetUnpairedDevice("12345", true)); + // Act + const std::string query_select = + "SELECT `id` FROM `device` WHERE `unpaired` = 1"; + // Assert + query.Prepare(query_select); + query.Next(); + EXPECT_EQ("12345", query.GetString(0)); +} + +TEST_F( + SQLPTExtRepresentationTest, + UnpairedDevicesList_SetUnpairedDevicesWithId12345AndId54321_Expect2UnpairedDevices) { + // Arrange + const std::string query_delete = "DELETE FROM `device`"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + // Act + const std::string query_insert_12345 = + "INSERT INTO `device` (`id`, `unpaired`)" + " VALUES('12345', 1)"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_12345)); + // Act + const std::string query_insert_54321 = + "INSERT INTO `device` (`id`, `unpaired`) VALUES('54321', 1)"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert_54321)); + // Act + std::vector<std::string> output; + // Assert + ASSERT_TRUE(reps->UnpairedDevicesList(&output)); + ASSERT_EQ(2u, output.size()); + EXPECT_NE(output.end(), std::find(output.begin(), output.end(), "12345")); + EXPECT_NE(output.end(), std::find(output.begin(), output.end(), "54321")); +} + +TEST_F(SQLPTExtRepresentationTest, + SetMetaInfo_SetMetaInfo_ExpectValuesSetInParams) { + // Arrange + ASSERT_TRUE(reps->SetMetaInfo("4.1.3.B_EB355B", "WAEGB", "ru-ru")); + utils::dbms::SQLQuery query(reps->db()); + const std::string query_select_ccpu = + "SELECT `ccpu_version` FROM `module_meta`"; + const std::string query_select_wers_country_code = + "SELECT `wers_country_code` FROM `module_meta`"; + const std::string query_select_language = + "SELECT `language` FROM `module_meta`"; + + // Assert + query.Prepare(query_select_ccpu); + query.Next(); + EXPECT_EQ("4.1.3.B_EB355B", query.GetString(0)); + query.Prepare(query_select_wers_country_code); + query.Next(); + EXPECT_EQ("WAEGB", query.GetString(0)); + query.Prepare(query_select_language); + query.Next(); + EXPECT_EQ("ru-ru", query.GetString(0)); +} + +TEST_F(SQLPTExtRepresentationTest, + IsMetaInfoPresent_SetMetaInfo_ExpectMetaInfoPresent) { + // Arrange + const std::string query_insert_meta_info = + "UPDATE `module_meta` SET `ccpu_version` = '4.1.3.B_EB355B', " + "`wers_country_code` = 'WAEGB', `language` = 'ru-ru' "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_meta_info)); + EXPECT_TRUE(reps->IsMetaInfoPresent()); +} + +TEST_F(SQLPTExtRepresentationTest, + SetSystemLanguage_SetSystemLanguage_ExpectValueSetInParams) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + ASSERT_TRUE(reps->SetSystemLanguage("ru-ru")); + const std::string query_select_language = + "SELECT `language` FROM `module_meta`"; + // Assert + query.Prepare(query_select_language); + query.Next(); + EXPECT_EQ("ru-ru", query.GetString(0)); +} + +TEST_F( + SQLPTExtRepresentationTest, + GetFunctionalGroupNames_SetGroupsManuallyThenGetGroupNames_ExpectAllGroupsReceived) { + // Arrange + const std::string query_insert_pre_DataConsent = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (129372391, '', 'pre_DataConsent')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_pre_DataConsent)); + + const std::string query_insert_Notifications = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (1809526495, 'Notifications', 'Notifications')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Notifications)); + + const std::string query_insert_Location = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (156072572, 'Location', 'Location-1')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Location)); + + std::map<uint32_t, std::pair<std::string, std::string> > FunctionalGroupNames; + std::map<uint32_t, std::pair<std::string, std::string> >::iterator it; + reps->GetFunctionalGroupNames(FunctionalGroupNames); + EXPECT_EQ(3u, FunctionalGroupNames.size()); + ASSERT_TRUE(FunctionalGroupNames.end() != + (it = FunctionalGroupNames.find(129372391))); + EXPECT_EQ("", it->second.first); + EXPECT_EQ("pre_DataConsent", it->second.second); + + ASSERT_TRUE(FunctionalGroupNames.end() != + (it = FunctionalGroupNames.find(156072572))); + EXPECT_EQ("Location", it->second.first); + EXPECT_EQ("Location-1", it->second.second); + + ASSERT_TRUE(FunctionalGroupNames.end() != + (it = FunctionalGroupNames.find(1809526495))); + EXPECT_EQ("Notifications", it->second.first); + EXPECT_EQ("Notifications", it->second.second); +} + +TEST_F( + SQLPTExtRepresentationTest, + RemoveAppConsentForGroup_SetAppConsentThenRemove_ExpectAppConsentForGroupRemoved) { + // Arrange + const std::string query_insert_pre_DataConsent = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (129372391, '', 'pre_DataConsent')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_pre_DataConsent)); + + const std::string query_insert_Notifications = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (1809526495, 'Notifications', 'Notifications')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Notifications)); + + const std::string query_insert_Location = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (156072572, 'Location', 'Location-1')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_Location)); + + const std::string query_insert_consent_group_1 = + "INSERT INTO `consent_group` (`device_id`, 'application_id' , " + "`functional_group_id`, `is_consented`, `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', '1234', 1809526495, 1,'GUI', " + "'2014-01-01T00:00:52Z')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_consent_group_1)); + + const std::string query_insert_consent_group_2 = + "INSERT INTO `consent_group` (`device_id`, 'application_id' , " + "`functional_group_id`, `is_consented`, `input`, `time_stamp`) VALUES " + "('XXX12345ZZZ', '1234', 156072572, 1,'GUI', " + "'2015-01-01T00:00:52Z')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_consent_group_2)); + + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("Location", "Location-1")); + allowed_groups.push_back(std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection disallowed_groups; + + FillPermissionStruct( + "XXX12345ZZZ", "1234", "VR", allowed_groups, disallowed_groups); + FunctionalIdType group_types; + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "1234", &group_types)); + EXPECT_TRUE( + CheckGroupTypesExist(group_types, allowed_groups, disallowed_groups)); + group_types.clear(); + reps->RemoveAppConsentForGroup("1234", "Notifications"); + ASSERT_TRUE(reps->GetPermissionsForApp("XXX12345ZZZ", "1234", &group_types)); + allowed_groups.pop_back(); + EXPECT_TRUE( + CheckGroupTypesExist(group_types, allowed_groups, disallowed_groups)); +} + +TEST_F(SQLPTExtRepresentationTest, + CleanUnpaireDevices_SetDevicesThenCleanup_ExpectDevicesDeleted) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + reps->SetDeviceData("XXX12345ZZZ", + "hardware IPX", + "v.8.0.1", + "Android", + "4.4.2", + "Life", + 2, + "Bluetooth"); + + StringArray allowed_groups; + StringArray disallowed_groups; + EXPECT_TRUE(reps->GetUserPermissionsForDevice( + "XXX12345ZZZ", &allowed_groups, &disallowed_groups)); + EXPECT_EQ(0u, allowed_groups.size()); + EXPECT_EQ(0u, disallowed_groups.size()); + allowed_groups.push_back("DataConsent-2"); + disallowed_groups.push_back("Navigation-1"); + EXPECT_TRUE(reps->SetUserPermissionsForDevice( + "XXX12345ZZZ", allowed_groups, disallowed_groups)); + + GroupsAliasNameCollection perm_allowed_groups; + perm_allowed_groups.push_back( + std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection perm_disallowed_groups; + perm_disallowed_groups.push_back(std::make_pair("Location", "Location-1")); + FillPermissionStruct("XXX12345ZZZ", + "12345", + "VR", + perm_allowed_groups, + perm_disallowed_groups); + + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + + const std::string query_select_device = + "SELECT COUNT(*) FROM `device` WHERE `id` = 'XXX12345ZZZ'"; + const std::string query_select_device_consent = + "SELECT COUNT(*) FROM `device_consent_group` WHERE `device_id` = " + "'XXX12345ZZZ'"; + const std::string query_select_consent_group = + "SELECT COUNT(*) FROM `consent_group` WHERE `device_id` = 'XXX12345ZZZ'"; + + query.Prepare(query_select_device); + query.Next(); + EXPECT_EQ(1, query.GetInteger(0)); + + query.Prepare(query_select_device_consent); + query.Next(); + EXPECT_EQ(2, query.GetInteger(0)); + + query.Prepare(query_select_consent_group); + query.Next(); + EXPECT_EQ(2, query.GetInteger(0)); + + EXPECT_TRUE(reps->SetUnpairedDevice("XXX12345ZZZ", true)); + + std::vector<std::string> DeviceIds; + DeviceIds.push_back("XXX12345ZZZ"); + EXPECT_TRUE(reps->CleanupUnpairedDevices(DeviceIds)); + + // Assert + query.Prepare(query_select_device); + query.Next(); + EXPECT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_device_consent); + query.Next(); + EXPECT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_consent_group); + query.Next(); + EXPECT_EQ(0, query.GetInteger(0)); +} + +TEST_F( + SQLPTExtRepresentationTest, + SetDefaultPolicy_SetPredataThenChangeToDefaultPolicy_ExpectDefaultPolicySet) { + // Arrange + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " + "0, 64, 10) "; + + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection disallowed_groups; + disallowed_groups.push_back(std::make_pair("DataConsent", "DataConsent-2")); + FillPermissionStruct( + "XXX12345ZZZ", "12345", "VR", allowed_groups, disallowed_groups); + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + // Act + ASSERT_TRUE(reps->SetIsPredata("12345", true)); + // Check + EXPECT_TRUE(reps->IsPredataPolicy("12345")); + // Act + EXPECT_TRUE(reps->SetDefaultPolicy("12345")); + // Check + EXPECT_TRUE(reps->IsDefaultPolicy("12345")); +} + +TEST_F(SQLPTExtRepresentationTest, + SetIsPreData_SetSpecificPoliciesThenSetIsPredata_ExpectPreDataSet) { + // Arrange + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " + "0, 64, 10) "; + + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection disallowed_groups; + disallowed_groups.push_back(std::make_pair("DataConsent", "DataConsent-2")); + FillPermissionStruct( + "XXX12345ZZZ", "12345", "VR", allowed_groups, disallowed_groups); + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + EXPECT_FALSE(reps->IsPredataPolicy("12345")); + // Act + ASSERT_TRUE(reps->SetIsPredata("12345", false)); + // Check + EXPECT_FALSE(reps->IsPredataPolicy("12345")); + // Act + ASSERT_TRUE(reps->SetIsPredata("12345", true)); + // Check + EXPECT_TRUE(reps->IsPredataPolicy("12345")); +} + +TEST_F( + SQLPTExtRepresentationTest, + SetPreDataPolicy_SetSpecificPoliciesThenSetPredataPolicy_ExpectPreDataPolicySet) { + // Arrange + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " + "0, 64, 10) "; + + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + GroupsAliasNameCollection allowed_groups; + allowed_groups.push_back(std::make_pair("Notifications", "Notifications")); + + GroupsAliasNameCollection disallowed_groups; + disallowed_groups.push_back(std::make_pair("DataConsent", "DataConsent-2")); + FillPermissionStruct( + "XXX12345ZZZ", "12345", "VR", allowed_groups, disallowed_groups); + EXPECT_TRUE(reps->SetUserPermissionsForApp(perm_consent)); + EXPECT_FALSE(reps->IsPredataPolicy("12345")); + // Act + ASSERT_TRUE(reps->SetPredataPolicy("12345")); + // Check + EXPECT_TRUE(reps->IsPredataPolicy("12345")); +} + +TEST_F(SQLPTExtRepresentationTest, + IsPreDataPolicy_SetPredataPolicy_ExpectPreDataPolicySet) { + // Arrange + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, 0, " + "1, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + // Check + EXPECT_TRUE(reps->IsPredataPolicy("12345")); +} + +} // namespace policy_test +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/sql_pt_representation_test.cc b/src/components/policy/policy_external/test/sql_pt_representation_test.cc new file mode 100644 index 0000000000..5530db8b3f --- /dev/null +++ b/src/components/policy/policy_external/test/sql_pt_representation_test.cc @@ -0,0 +1,1845 @@ +/* Copyright (c) 2015, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <vector> +#include <string> +#include <algorithm> +#include <fstream> +#include <stdio.h> +#include <sys/stat.h> +#include <memory> + +#include "gtest/gtest.h" +#include "policy/sql_pt_representation.h" +#include "utils/file_system.h" +#include "utils/system.h" +#include "policy/sql_wrapper.h" +#include "policy/policy_types.h" +#include "json/writer.h" +#include "json/reader.h" +#include "policy/policy_table/types.h" +#include "policy/policy_table/enums.h" +#include "rpc_base/rpc_base.h" +#include "policy/mock_policy_settings.h" +#include "utils/shared_ptr.h" + +namespace policy_table = rpc::policy_table_interface_base; +using policy::SQLPTRepresentation; +using policy::CheckPermissionResult; +using policy::UserFriendlyMessage; +using policy::EndpointUrls; +using policy::VehicleInfo; + +using testing::ReturnRef; +using testing::Return; +using testing::NiceMock; +using testing::Mock; +namespace test { +namespace components { +namespace policy_test { + +class SQLPTRepresentationTest : public SQLPTRepresentation, + public ::testing::Test { + public: + static const bool in_memory_; + + protected: + static SQLPTRepresentation* reps; + static const std::string kDatabaseName; + static utils::dbms::SQLQuery* query_wrapper_; + // Gtest can show message that this object doesn't destroyed + static std::auto_ptr<policy_handler_test::MockPolicySettings> + policy_settings_; + + static void SetUpTestCase() { + const std::string kAppStorageFolder = "storage1"; + reps = new SQLPTRepresentation(in_memory_); + ASSERT_TRUE(reps != NULL); + policy_settings_ = std::auto_ptr<policy_handler_test::MockPolicySettings>( + new policy_handler_test::MockPolicySettings()); + ON_CALL(*policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kAppStorageFolder)); + EXPECT_EQ(::policy::SUCCESS, reps->Init(policy_settings_.get())); + query_wrapper_ = new utils::dbms::SQLQuery(reps->db()); + ASSERT_TRUE(query_wrapper_ != NULL); + } + + void TearDown() OVERRIDE { + EXPECT_TRUE(reps->Clear()); + } + + static void TearDownTestCase() { + delete query_wrapper_; + EXPECT_TRUE(reps->Drop()); + EXPECT_TRUE(reps->Close()); + reps->RemoveDB(); + delete reps; + policy_settings_.reset(); + } + + virtual utils::dbms::SQLDatabase* db() const { + return reps->db(); + } + + void GatherModuleMeta(policy_table::ModuleMeta* meta) const { + ::SQLPTRepresentation::GatherModuleMeta(meta); + } + + void GatherModuleConfig(policy_table::ModuleConfig* config) const { + ::SQLPTRepresentation::GatherModuleConfig(config); + } + + bool GatherUsageAndErrorCounts( + policy_table::UsageAndErrorCounts* counts) const { + return ::SQLPTRepresentation::GatherUsageAndErrorCounts(counts); + } + + bool GatherApplicationPoliciesSection( + policy_table::ApplicationPoliciesSection* policies) const { + return ::SQLPTRepresentation::GatherApplicationPoliciesSection(policies); + } + virtual void GatherDeviceData(policy_table::DeviceData* data) const { + ::SQLPTRepresentation::GatherDeviceData(data); + } + + virtual bool GatherConsumerFriendlyMessages( + policy_table::ConsumerFriendlyMessages* messages) const { + return ::SQLPTRepresentation::GatherConsumerFriendlyMessages(messages); + } + + bool GatherAppGroup(const std::string& app_id, + policy_table::Strings* app_groups) const { + return ::SQLPTRepresentation::GatherAppGroup(app_id, app_groups); + } + + bool GatherAppType(const std::string& app_id, + policy_table::AppHMITypes* app_types) const { + return ::SQLPTRepresentation::GatherAppType(app_id, app_types); + } + + bool GatherRequestType(const std::string& app_id, + policy_table::RequestTypes* request_types) const { + return ::SQLPTRepresentation::GatherRequestType(app_id, request_types); + } + + bool GatherNickName(const std::string& app_id, + policy_table::Strings* nicknames) const { + return ::SQLPTRepresentation::GatherNickName(app_id, nicknames); + } + + void CheckAppPoliciesSection( + policy_table::ApplicationPoliciesSection& policies, + uint16_t apps_size, + policy_table::Priority prio, + const std::string& section, + uint16_t memory_kb, + uint32_t heart_beat_timeout_ms, + policy_table::Strings& groups) const { + if (section != "device") { + policy_table::ApplicationPolicies& apps = policies.apps; + EXPECT_EQ(apps_size, apps.size()); + policy_table::ApplicationPolicies::iterator apps_iter = + apps.find(section); + ASSERT_TRUE(apps.end() != apps_iter); + policy_table::Strings& temp_groups = apps_iter->second.groups; + StringsCompare(groups, temp_groups); + EXPECT_EQ(0u, (*(apps_iter->second.nicknames)).size()); + EXPECT_EQ(prio, apps_iter->second.priority); + EXPECT_EQ(0u, (*(apps_iter->second.AppHMIType)).size()); + EXPECT_EQ(memory_kb, (*(apps_iter->second.memory_kb))); + EXPECT_EQ(heart_beat_timeout_ms, + (*(apps_iter->second.heart_beat_timeout_ms))); + } else { + policy_table::DevicePolicy& device = policies.device; + EXPECT_EQ(prio, device.priority); + } + } + + void StringsCompare(policy_table::Strings& groups1, + policy_table::Strings& groups2) const { + EXPECT_EQ(groups1.size(), groups2.size()); + std::sort(groups1.begin(), groups1.end()); + std::sort(groups2.begin(), groups2.end()); + EXPECT_TRUE(groups1 == groups2); + } + + void CheckAppGroups(const std::string& app_id, + policy_table::Strings& groups) { + policy_table::Strings app_groups; + GatherAppGroup(app_id, &app_groups); + StringsCompare(groups, app_groups); + } + + void PolicyTableUpdatePrepare(Json::Value& table) { + PolicyTableUpdatePrepareNoParameters(table); + + table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"] + ["parameters"] = Json::Value(Json::arrayValue); + table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"] + ["parameters"][0] = Json::Value("speed"); + } + + void PolicyTableUpdatePrepareEmptyParameters(Json::Value& table) { + PolicyTableUpdatePrepareNoParameters(table); + + // Parameters are empty + table["policy_table"]["functional_groupings"]["default"]["rpcs"]["Update"] + ["parameters"] = Json::Value(Json::arrayValue); + } + + void PolicyTableUpdatePrepareNoParameters(Json::Value& table) { + table["policy_table"] = Json::Value(Json::objectValue); + Json::Value& policy_table = table["policy_table"]; + policy_table["module_config"] = Json::Value(Json::objectValue); + policy_table["functional_groupings"] = Json::Value(Json::objectValue); + policy_table["consumer_friendly_messages"] = Json::Value(Json::objectValue); + policy_table["app_policies"] = Json::Value(Json::objectValue); + + Json::Value& module_config = policy_table["module_config"]; + module_config["exchange_after_x_ignition_cycles"] = Json::Value(10); + module_config["exchange_after_x_kilometers"] = Json::Value(100); + module_config["exchange_after_x_days"] = Json::Value(5); + module_config["timeout_after_x_seconds"] = Json::Value(500); + module_config["seconds_between_retries"] = Json::Value(Json::arrayValue); + Json::Value& seconds_between_retries = + module_config["seconds_between_retries"]; + seconds_between_retries[0] = Json::Value(10); + seconds_between_retries[1] = Json::Value(20); + seconds_between_retries[2] = Json::Value(30); + module_config["endpoints"] = Json::Value(Json::objectValue); + Json::Value& endpoins = module_config["endpoints"]; + endpoins["0x00"] = Json::Value(Json::objectValue); + endpoins["0x00"]["default"] = Json::Value(Json::arrayValue); + endpoins["0x00"]["default"][0] = + Json::Value("http://ford.com/cloud/default"); + module_config["notifications_per_minute_by_priority"] = + Json::Value(Json::objectValue); + module_config["notifications_per_minute_by_priority"]["emergency"] = + Json::Value(1); + module_config["notifications_per_minute_by_priority"]["navigation"] = + Json::Value(2); + module_config["notifications_per_minute_by_priority"]["VOICECOMM"] = + Json::Value(3); + module_config["notifications_per_minute_by_priority"]["communication"] = + Json::Value(4); + module_config["notifications_per_minute_by_priority"]["normal"] = + Json::Value(5); + module_config["notifications_per_minute_by_priority"]["none"] = + Json::Value(6); + module_config["vehicle_make"] = Json::Value("MakeT"); + module_config["vehicle_model"] = Json::Value("ModelT"); + module_config["vehicle_year"] = Json::Value("2014"); + module_config["certificate"] = Json::Value("my_cert"); + + Json::Value& functional_groupings = policy_table["functional_groupings"]; + functional_groupings["default"] = Json::Value(Json::objectValue); + Json::Value& default_group = functional_groupings["default"]; + default_group["rpcs"] = Json::Value(Json::objectValue); + default_group["rpcs"]["Update"] = Json::Value(Json::objectValue); + default_group["rpcs"]["Update"]["hmi_levels"] = + Json::Value(Json::arrayValue); + default_group["rpcs"]["Update"]["hmi_levels"][0] = Json::Value("FULL"); + // No parameters + + Json::Value& consumer_friendly_messages = + policy_table["consumer_friendly_messages"]; + consumer_friendly_messages["version"] = Json::Value("1.2"); + consumer_friendly_messages["messages"] = Json::Value(Json::objectValue); + consumer_friendly_messages["messages"]["MSG1"] = + Json::Value(Json::objectValue); + Json::Value& msg1 = consumer_friendly_messages["messages"]["MSG1"]; + msg1["languages"] = Json::Value(Json::objectValue); + msg1["languages"]["en-us"] = Json::Value(Json::objectValue); + msg1["languages"]["en-us"]["tts"] = Json::Value("TTS message"); + msg1["languages"]["en-us"]["label"] = Json::Value("LABEL message"); + msg1["languages"]["en-us"]["line1"] = Json::Value("LINE1 message"); + msg1["languages"]["en-us"]["line2"] = Json::Value("LINE2 message"); + msg1["languages"]["en-us"]["textBody"] = Json::Value("TEXTBODY message"); + + Json::Value& app_policies = policy_table["app_policies"]; + app_policies["default"] = Json::Value(Json::objectValue); + app_policies["default"]["priority"] = Json::Value("EMERGENCY"); + app_policies["default"]["memory_kb"] = Json::Value(50); + app_policies["default"]["heart_beat_timeout_ms"] = Json::Value(100); + app_policies["default"]["groups"] = Json::Value(Json::arrayValue); + app_policies["default"]["groups"][0] = Json::Value("default"); + app_policies["default"]["priority"] = Json::Value("EMERGENCY"); + app_policies["default"]["is_revoked"] = Json::Value(true); + app_policies["default"]["default_hmi"] = Json::Value("FULL"); + app_policies["default"]["keep_context"] = Json::Value(true); + app_policies["default"]["steal_focus"] = Json::Value(true); + + app_policies["pre_DataConsent"] = Json::Value(Json::objectValue); + app_policies["pre_DataConsent"]["memory_kb"] = Json::Value(40); + app_policies["pre_DataConsent"]["heart_beat_timeout_ms"] = Json::Value(90); + app_policies["pre_DataConsent"]["groups"] = Json::Value(Json::arrayValue); + app_policies["pre_DataConsent"]["groups"][0] = Json::Value("default"); + app_policies["pre_DataConsent"]["priority"] = Json::Value("EMERGENCY"); + app_policies["pre_DataConsent"]["default_hmi"] = Json::Value("FULL"); + app_policies["pre_DataConsent"]["is_revoked"] = Json::Value(false); + app_policies["pre_DataConsent"]["keep_context"] = Json::Value(true); + app_policies["pre_DataConsent"]["steal_focus"] = Json::Value(true); + app_policies["1234"] = Json::Value(Json::objectValue); + app_policies["1234"]["memory_kb"] = Json::Value(150); + app_policies["1234"]["heart_beat_timeout_ms"] = Json::Value(200); + app_policies["1234"]["groups"] = Json::Value(Json::arrayValue); + app_policies["1234"]["groups"][0] = Json::Value("default"); + app_policies["1234"]["priority"] = Json::Value("EMERGENCY"); + app_policies["1234"]["default_hmi"] = Json::Value("FULL"); + app_policies["1234"]["is_revoked"] = Json::Value(true); + app_policies["1234"]["keep_context"] = Json::Value(false); + app_policies["1234"]["steal_focus"] = Json::Value(false); + app_policies["device"] = Json::Value(Json::objectValue); + app_policies["device"]["groups"] = Json::Value(Json::arrayValue); + app_policies["device"]["groups"][0] = Json::Value("default"); + app_policies["device"]["priority"] = Json::Value("EMERGENCY"); + app_policies["device"]["is_revoked"] = Json::Value(true); + app_policies["device"]["default_hmi"] = Json::Value("FULL"); + app_policies["device"]["keep_context"] = Json::Value(true); + app_policies["device"]["steal_focus"] = Json::Value(true); + } + + ::testing::AssertionResult IsValid(const policy_table::Table& table) { + if (table.is_valid()) { + return ::testing::AssertionSuccess(); + } else { + ::rpc::ValidationReport report(" - table"); + table.ReportErrors(&report); + return ::testing::AssertionFailure() << ::rpc::PrettyFormat(report); + } + } +}; + +SQLPTRepresentation* SQLPTRepresentationTest::reps = 0; +utils::dbms::SQLQuery* SQLPTRepresentationTest::query_wrapper_ = 0; +const std::string SQLPTRepresentationTest::kDatabaseName = ":memory:"; +const bool SQLPTRepresentationTest::in_memory_ = true; +std::auto_ptr<policy_handler_test::MockPolicySettings> + SQLPTRepresentationTest::policy_settings_; + +class SQLPTRepresentationTest2 : public ::testing::Test { + protected: + SQLPTRepresentation* reps; + NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; + virtual void SetUp() OVERRIDE { + file_system::CreateDirectory(kAppStorageFolder); + chmod(kAppStorageFolder.c_str(), 00000); + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kAppStorageFolder)); + ON_CALL(policy_settings_, open_attempt_timeout_ms()) + .WillByDefault(Return(kOpenAttemptTimeoutMs)); + ON_CALL(policy_settings_, attempts_to_open_policy_db()) + .WillByDefault(Return(kAttemptsToOpenPolicyDB)); + reps = new SQLPTRepresentation; + ASSERT_TRUE(reps != NULL); + } + + virtual void TearDown() OVERRIDE { + file_system::RemoveDirectory(kAppStorageFolder, true); + delete reps; + } + const std::string kAppStorageFolder = "storage123"; + const uint16_t kOpenAttemptTimeoutMs = 70u; + const uint16_t kAttemptsToOpenPolicyDB = 2u; +}; + +TEST_F(SQLPTRepresentationTest2, + CheckActualAttemptsToOpenDB_ExpectCorrectNumber) { + EXPECT_EQ(::policy::FAIL, reps->Init(&policy_settings_)); + // Check Actual attempts number made to try to open DB + EXPECT_EQ(kAttemptsToOpenPolicyDB, reps->open_counter()); +} + +TEST_F(SQLPTRepresentationTest, + RefreshDB_DropExistedPTThenRefreshDB_ExpectTablesWithInitialData) { + // Check + utils::dbms::SQLQuery query(reps->db()); + const std::string query_select = + "SELECT COUNT(*) FROM sqlite_master WHERE `type` = 'table'"; + // In normally created PT there are more than 0 tables + query.Prepare(query_select); + query.Next(); + ASSERT_GT(query.GetInteger(0), 0); + query.Finalize(); + + ASSERT_TRUE(reps->Drop()); + query.Prepare(query_select); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + query.Finalize(); + + ASSERT_TRUE(reps->RefreshDB()); + // Check PT structure destroyed and tables number is 0 + query.Prepare(query_select); + query.Next(); + ASSERT_EQ(25, query.GetInteger(0)); + + const std::string query_select_count_of_iap_buffer_full = + "SELECT `count_of_iap_buffer_full` FROM `usage_and_error_count`"; + const std::string query_select_count_sync_out_of_memory = + "SELECT `count_sync_out_of_memory` FROM `usage_and_error_count`"; + const std::string query_select_count_of_sync_reboots = + "SELECT `count_of_sync_reboots` FROM `usage_and_error_count`"; + const std::string query_select_pt_exchanged_at_odometer_x = + "SELECT `pt_exchanged_at_odometer_x` FROM `module_meta`"; + const std::string query_select_pt_exchanged_x_days_after_epoch = + "SELECT `pt_exchanged_x_days_after_epoch` FROM `module_meta`"; + const std::string query_select_flag_update_required = + "SELECT `flag_update_required` FROM `module_meta`"; + const std::string query_select_ignition_cycles_since_last_exchange = + "SELECT `ignition_cycles_since_last_exchange` FROM `module_meta`"; + const std::string query_select_preloaded_pt = + "SELECT `preloaded_pt` FROM `module_config`"; + const std::string query_select_is_first_run = + "SELECT `is_first_run` FROM `module_config`"; + const std::string query_select_exchange_after_x_ignition_cycles = + "SELECT `exchange_after_x_ignition_cycles` FROM `module_config`"; + const std::string query_select_exchange_after_x_kilometers = + "SELECT `exchange_after_x_kilometers` FROM `module_config`"; + const std::string query_select_exchange_after_x_days = + "SELECT `exchange_after_x_days` FROM `module_config`"; + const std::string query_select_timeout_after_x_seconds = + "SELECT `timeout_after_x_seconds` FROM `module_config`"; + const std::string query_select_priorities = + "SELECT COUNT(`value`) FROM `priority`"; + const std::string query_select_hmi_levels = + "SELECT COUNT(`value`) FROM `hmi_level`"; + const std::string query_select_version = "SELECT `number` FROM `version`"; + + query.Prepare(query_select_count_of_iap_buffer_full); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_count_sync_out_of_memory); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_count_of_sync_reboots); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_pt_exchanged_at_odometer_x); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_pt_exchanged_x_days_after_epoch); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_ignition_cycles_since_last_exchange); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_flag_update_required); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_preloaded_pt); + query.Next(); + ASSERT_EQ(1, query.GetInteger(0)); + + query.Prepare(query_select_is_first_run); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_exchange_after_x_ignition_cycles); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_exchange_after_x_kilometers); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_exchange_after_x_days); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_timeout_after_x_seconds); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_priorities); + query.Next(); + ASSERT_EQ(6, query.GetInteger(0)); + + query.Prepare(query_select_hmi_levels); + query.Next(); + ASSERT_EQ(4, query.GetInteger(0)); + + query.Prepare(query_select_version); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); +} + +TEST_F( + SQLPTRepresentationTest, + CheckPermissionsAllowed_SetValuesInAppGroupRpcFunctionalGroup_GetEqualParamsInCheckPermissionResult) { + // Arrange + const std::string query = + "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`) VALUES ('12345', 5, 10); " + "INSERT OR REPLACE INTO functional_group (`id`, `name`)" + " VALUES (1, 'Base-4'); " + "INSERT OR REPLACE INTO `app_group` (`application_id`," + " `functional_group_id`) VALUES ('12345', 1); " + "INSERT OR REPLACE INTO `rpc` (`name`, `parameter`, `hmi_level_value`," + " `functional_group_id`) VALUES ('Update', 'gps', 'FULL', 1); " + "INSERT OR REPLACE INTO `rpc` (`name`, `parameter`, `hmi_level_value`," + " `functional_group_id`) VALUES ('Update', 'speed', 'FULL', 1);"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query)); + + // Act + CheckPermissionResult ret; + reps->CheckPermissions("12345", "FULL", "Update", ret); + + // Assert + EXPECT_TRUE(ret.hmi_level_permitted == ::policy::kRpcAllowed); + ASSERT_EQ(2u, ret.list_of_allowed_params.size()); + EXPECT_TRUE(ret.list_of_allowed_params.end() != + ret.list_of_allowed_params.find("gps")); + EXPECT_TRUE(ret.list_of_allowed_params.end() != + ret.list_of_allowed_params.find("speed")); +} + +TEST_F( + SQLPTRepresentationTest, + CheckPermissionsAllowedWithoutParameters_SetLimitedPermissions_ExpectEmptyListOfAllowedParams) { + // Arrange + const std::string query = + "INSERT OR REPLACE INTO `application` (`id`, `memory_kb`," + " `heart_beat_timeout_ms`) VALUES ('12345', 5, 10); " + "INSERT OR REPLACE INTO functional_group (`id`, `name`)" + " VALUES (1, 'Base-4'); " + "INSERT OR REPLACE INTO `app_group` (`application_id`," + " `functional_group_id`) VALUES ('12345', 1); " + "DELETE FROM `rpc`; " + "INSERT OR REPLACE INTO `rpc` (`name`, `hmi_level_value`," + " `functional_group_id`) VALUES ('Update', 'LIMITED', 1);"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query)); + + // Act + CheckPermissionResult ret; + reps->CheckPermissions("12345", "LIMITED", "Update", ret); + + // Assert + EXPECT_TRUE(ret.hmi_level_permitted == ::policy::kRpcAllowed); + EXPECT_TRUE(ret.list_of_allowed_params.empty()); +} + +TEST_F( + SQLPTRepresentationTest, + CheckPermissionsDisallowedWithoutParameters_DeletedAppGroupAndSetFULLLevel_ExpectHmiLevelIsDissalowed) { + // Arrange + const std::string query = "DELETE FROM `app_group`"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query)); + + // Act + CheckPermissionResult ret; + reps->CheckPermissions("12345", "FULL", "Update", ret); + + // Assert + EXPECT_EQ(::policy::kRpcDisallowed, ret.hmi_level_permitted); + EXPECT_TRUE(ret.list_of_allowed_params.empty()); +} + +TEST_F(SQLPTRepresentationTest, + PTPReloaded_UpdateModuleConfig_ReturnIsPTPreloadedTRUE) { + // Arrange + const std::string query = "UPDATE `module_config` SET `preloaded_pt` = 1"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query)); + EXPECT_TRUE(reps->IsPTPreloaded()); +} + +TEST_F(SQLPTRepresentationTest, + GetUpdateUrls_DeleteAndInsertEndpoints_ExpectUpdateUrls) { + // Arrange + const std::string query_delete = "DELETE FROM `endpoint`; "; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + + // Act + EndpointUrls ret = reps->GetUpdateUrls(7); + + // Assert + EXPECT_TRUE(ret.empty()); + + // Act + const std::string query_insert = + "INSERT INTO `endpoint` (`application_id`, `url`, `service`) " + " VALUES ('12345', 'http://ford.com/cloud/1', 7);" + "INSERT INTO `endpoint` (`application_id`, `url`, `service`) " + " VALUES ('12345', 'http://ford.com/cloud/2', 7);"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + // Act + ret = reps->GetUpdateUrls(7); + + // Assert + ASSERT_EQ(2u, ret.size()); + EXPECT_EQ("http://ford.com/cloud/1", ret[0].url[0]); + EXPECT_EQ("http://ford.com/cloud/2", ret[1].url[0]); + + // Act + ret = reps->GetUpdateUrls(0); + + // Assert + EXPECT_TRUE(ret.empty()); +} + +TEST_F(SQLPTRepresentationTest, + IgnitionCyclesBeforeExchange_WithParametersOfQueryEqualZero) { + // Arrange + const std::string query_zeros = + "UPDATE `module_meta` SET " + " `ignition_cycles_since_last_exchange` = 0; " + " UPDATE `module_config` SET `exchange_after_x_ignition_cycles` = 0"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_zeros)); + EXPECT_EQ(0, reps->IgnitionCyclesBeforeExchange()); + + // Act + reps->IncrementIgnitionCycles(); + + // Assert + EXPECT_EQ(0, reps->IgnitionCyclesBeforeExchange()); +} + +TEST_F(SQLPTRepresentationTest, + IgnitionCyclesBeforeExchange_WithParametersOfQueryAreLessLimit) { + // Arrange + const std::string query_less_limit = + "UPDATE `module_meta` SET " + " `ignition_cycles_since_last_exchange` = 5; " + " UPDATE `module_config` SET `exchange_after_x_ignition_cycles` = 10"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_less_limit)); + EXPECT_EQ(5, reps->IgnitionCyclesBeforeExchange()); + + // Act + reps->IncrementIgnitionCycles(); + + // Assert + EXPECT_EQ(4, reps->IgnitionCyclesBeforeExchange()); +} + +TEST_F(SQLPTRepresentationTest, + IgnitionCyclesBeforeExchange_WithLimitCountOfParametersOfQuery) { + // Arrange + const std::string query_limit = + "UPDATE `module_meta` SET " + " `ignition_cycles_since_last_exchange` = 9; " + " UPDATE `module_config` SET `exchange_after_x_ignition_cycles` = 10"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_limit)); + EXPECT_EQ(1, reps->IgnitionCyclesBeforeExchange()); + // Act + reps->IncrementIgnitionCycles(); + // Assert + EXPECT_EQ(0, reps->IgnitionCyclesBeforeExchange()); +} + +TEST_F(SQLPTRepresentationTest, + IgnitionCyclesBeforeExchange_WithMoreLimitCountOfParametersOfQuery) { + // Arrange + const std::string query_more_limit = + "UPDATE `module_meta` SET " + " `ignition_cycles_since_last_exchange` = 12; " + " UPDATE `module_config` SET `exchange_after_x_ignition_cycles` = 10"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_more_limit)); + // Chceck + EXPECT_EQ(0, reps->IgnitionCyclesBeforeExchange()); +} + +TEST_F(SQLPTRepresentationTest, + IgnitionCyclesBeforeExchange_WithNegativeLimitOfParametersOfQuery) { + // Arrange + const std::string query_negative_limit = + "UPDATE `module_meta` SET " + " `ignition_cycles_since_last_exchange` = 3; " + " UPDATE `module_config` SET `exchange_after_x_ignition_cycles` = -1"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_negative_limit)); + // Check + EXPECT_EQ(0, reps->IgnitionCyclesBeforeExchange()); +} + +TEST_F( + SQLPTRepresentationTest, + IgnitionCyclesBeforeExchange_WithNegativeLimitOfCurrentParameterOfQuery) { + // Arrange + const std::string query_negative_current = + "UPDATE `module_meta` SET " + " `ignition_cycles_since_last_exchange` = -1; " + " UPDATE `module_config` SET `exchange_after_x_ignition_cycles` = 2"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_negative_current)); + // Check + EXPECT_EQ(0, reps->IgnitionCyclesBeforeExchange()); +} + +TEST_F(SQLPTRepresentationTest, + KilometersBeforeExchange_WithParametersOfQueryEqualZero) { + // Arrange + const std::string query_zeros = + "UPDATE `module_meta` SET " + " `pt_exchanged_at_odometer_x` = 0; " + " UPDATE `module_config` SET `exchange_after_x_kilometers` = 0"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_zeros)); + // Checks + EXPECT_EQ(0, reps->KilometersBeforeExchange(0)); + EXPECT_EQ(0, reps->KilometersBeforeExchange(-10)); + EXPECT_EQ(0, reps->KilometersBeforeExchange(10)); +} + +TEST_F(SQLPTRepresentationTest, + KilometersBeforeExchange_QueryWithNegativeLimit) { + // Arrange + const std::string query_negative_limit = + "UPDATE `module_meta` SET " + " `pt_exchanged_at_odometer_x` = 10; " + " UPDATE `module_config` SET `exchange_after_x_kilometers` = -10"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_negative_limit)); + // Checks + EXPECT_EQ(0, reps->KilometersBeforeExchange(0)); + EXPECT_EQ(0, reps->KilometersBeforeExchange(10)); +} + +TEST_F(SQLPTRepresentationTest, + KilometersBeforeExchange_QueryWithNegativeCurrentLimit) { + // Arrange + const std::string query_negative_last = + "UPDATE `module_meta` SET " + " `pt_exchanged_at_odometer_x` = -10; " + " UPDATE `module_config` SET `exchange_after_x_kilometers` = 20"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_negative_last)); + // Checks + EXPECT_EQ(0, reps->KilometersBeforeExchange(0)); + EXPECT_EQ(0, reps->KilometersBeforeExchange(10)); +} + +TEST_F(SQLPTRepresentationTest, + KilometersBeforeExchange_QueryWithLimitParameters) { + // Arrange + const std::string query_limit = + "UPDATE `module_meta` SET " + " `pt_exchanged_at_odometer_x` = 10; " + " UPDATE `module_config` SET `exchange_after_x_kilometers` = 100"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_limit)); + // Checks + EXPECT_EQ(0, reps->KilometersBeforeExchange(120)); + EXPECT_EQ(60, reps->KilometersBeforeExchange(50)); + EXPECT_EQ(0, reps->KilometersBeforeExchange(5)); +} + +TEST_F(SQLPTRepresentationTest, + DaysBeforeExchange_WithParametersOfQueryEqualZero) { + // Arrange + const std::string query_zeros = + "UPDATE `module_meta` SET " + " `pt_exchanged_x_days_after_epoch` = 0; " + " UPDATE `module_config` SET `exchange_after_x_days` = 0"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_zeros)); + // Checks + EXPECT_EQ(0, reps->DaysBeforeExchange(0)); + EXPECT_EQ(0, reps->DaysBeforeExchange(-10)); + EXPECT_EQ(0, reps->DaysBeforeExchange(10)); +} + +TEST_F(SQLPTRepresentationTest, DaysBeforeExchange_QueryWithNegativeLimit) { + // Arrange + const std::string query_negative_limit = + "UPDATE `module_meta` SET " + " `pt_exchanged_x_days_after_epoch` = 10; " + " UPDATE `module_config` SET `exchange_after_x_days` = -10"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_negative_limit)); + // Checks + EXPECT_EQ(0, reps->DaysBeforeExchange(0)); + EXPECT_EQ(0, reps->DaysBeforeExchange(10)); +} + +TEST_F(SQLPTRepresentationTest, + DaysBeforeExchange_QueryWithNegativeCurrentLimit) { + // Arrange + const std::string query_negative_last = + "UPDATE `module_meta` SET " + " `pt_exchanged_x_days_after_epoch` = -10; " + " UPDATE `module_config` SET `exchange_after_x_days` = 20"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_negative_last)); + // Checks + EXPECT_EQ(0, reps->DaysBeforeExchange(0)); + EXPECT_EQ(0, reps->DaysBeforeExchange(10)); +} + +TEST_F(SQLPTRepresentationTest, DaysBeforeExchange_QueryWithLimitParameters) { + // Arrange + const std::string query_limit = + "UPDATE `module_meta` SET " + " `pt_exchanged_x_days_after_epoch` = 10; " + " UPDATE `module_config` SET `exchange_after_x_days` = 100"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_limit)); + // Checks + EXPECT_EQ(0, reps->DaysBeforeExchange(120)); + EXPECT_EQ(60, reps->DaysBeforeExchange(50)); + EXPECT_EQ(0, reps->DaysBeforeExchange(5)); +} + +TEST_F( + SQLPTRepresentationTest, + SecondsBetweenRetries_DeletedAndInsertedSecondsBetweenRetry_ExpectCountOfSecondsEqualInserted) { + // Arrange + std::vector<int> seconds; + const std::string query_delete = "DELETE FROM `seconds_between_retry`; "; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_delete)); + ASSERT_TRUE(reps->SecondsBetweenRetries(&seconds)); + EXPECT_EQ(0u, seconds.size()); + + // Arrange + const std::string query_insert = + "INSERT INTO `seconds_between_retry` (`index`, `value`) " + " VALUES (0, 10); " + "INSERT INTO `seconds_between_retry` (`index`, `value`) " + " VALUES (1, 20); "; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + ASSERT_TRUE(reps->SecondsBetweenRetries(&seconds)); + // Checks + ASSERT_EQ(2u, seconds.size()); + EXPECT_EQ(10, seconds[0]); + EXPECT_EQ(20, seconds[1]); +} + +TEST_F(SQLPTRepresentationTest, TimeoutResponse_Set60Seconds_GetEqualTimeout) { + // Arrange + const std::string query = + "UPDATE `module_config` SET `timeout_after_x_seconds` = 60"; + + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query)); + // Check + EXPECT_EQ(60000, reps->TimeoutResponse()); +} + +TEST_F(SQLPTRepresentationTest, + IsPTPreloaded_SetPTPreloadedThenCheck_ExpectCorrectValue) { + // Arrange + const std::string query_insert = + "UPDATE `module_config` SET `preloaded_pt` = 1"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + // Check + ASSERT_TRUE(reps->IsPTPreloaded()); +} + +TEST_F( + SQLPTRepresentationTest, + SetCountersPassedForSuccessfulUpdate_SetCounters_ExpectValueChangedInPT) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_select_odometer = + "SELECT `pt_exchanged_at_odometer_x` FROM`module_meta`"; + const std::string query_select_days_after_epoch = + "SELECT `pt_exchanged_x_days_after_epoch` FROM`module_meta`"; + query.Prepare(query_select_odometer); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + query.Prepare(query_select_days_after_epoch); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + + // Act + ASSERT_TRUE(reps->SetCountersPassedForSuccessfulUpdate(100, 10000)); + query.Prepare(query_select_odometer); + query.Next(); + ASSERT_EQ(100, query.GetInteger(0)); + + query.Prepare(query_select_days_after_epoch); + query.Next(); + ASSERT_EQ(10000, query.GetInteger(0)); +} + +TEST_F( + SQLPTRepresentationTest, + IncrementIgnitionCycles_SetIgnitionCyclesValueThenIncrement_ExpectValueIncrementedInPT) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_insert = + "UPDATE `module_meta` SET `ignition_cycles_since_last_exchange` = 54"; + const std::string query_select = + "SELECT `ignition_cycles_since_last_exchange`FROM `module_meta`"; + ASSERT_TRUE(query.Exec(query_insert)); + // Act + reps->IncrementIgnitionCycles(); + // Check + query.Prepare(query_select); + query.Next(); + ASSERT_EQ(55, query.GetInteger(0)); +} + +TEST_F( + SQLPTRepresentationTest, + ResetIgnitionCycles_SetIgnitionCyclesValueThenReset_ExpectZeroValueInPT) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_insert = + "UPDATE `module_meta` SET `ignition_cycles_since_last_exchange` = 55"; + const std::string query_select = + "SELECT `ignition_cycles_since_last_exchange` FROM `module_meta`"; + ASSERT_TRUE(query.Exec(query_insert)); + // Act + reps->ResetIgnitionCycles(); + // Check + query.Prepare(query_select); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); +} + +TEST_F( + SQLPTRepresentationTest, + GetVehicleInfo_ManuallySetVehcleInfoThenCallGetVehicleInfo_ExpectValuesReceived) { + // Check + const std::string query_insert_module_config = + "UPDATE `module_config` SET `preloaded_pt` = 1, " + " `exchange_after_x_ignition_cycles` = 50," + " `exchange_after_x_kilometers` = 2000, `exchange_after_x_days` = 30," + " `timeout_after_x_seconds` = 5, `vehicle_make` = 'FORD', " + " `vehicle_model` = 'MUSTANG', `vehicle_year` = '2003', " + "`preloaded_date` = '25.04.2015'"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_module_config)); + VehicleInfo info = reps->GetVehicleInfo(); + + ASSERT_EQ("FORD", info.vehicle_make); + ASSERT_EQ("MUSTANG", info.vehicle_model); + ASSERT_EQ("2003", info.vehicle_year); +} + +TEST_F(SQLPTRepresentationTest, + GetUserFriendlyMsg_SetMsg_ExpectReceivedMsgSetInParams) { + // Arrange + + const std::string query_insert_language_code = + "INSERT INTO `message` (`language_code`, `message_type_name`) VALUES " + "('en-en', 'AppPermissions')"; + + ASSERT_TRUE(query_wrapper_->Exec(query_insert_language_code)); + const std::string query_insert_name = + "INSERT INTO `message_type` (`name`) VALUES ('AppPermissions')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_name)); + std::vector<std::string> msg_code; + msg_code.push_back("AppPermissions"); + // Act + std::vector<UserFriendlyMessage> result = + reps->GetUserFriendlyMsg(msg_code, std::string("en-en")); + // Checks + ASSERT_EQ(1u, result.size()); + EXPECT_EQ(result[0].message_code, "AppPermissions"); +} + +TEST_F( + SQLPTRepresentationTest, + GetNotificationNumber_SetNotificationsPriorities_ExpectReceivedValuesCorrect) { + // Arrange + const std::string query_insert = + "INSERT INTO `notifications_by_priority` (`priority_value`, `value`) " + "VALUES ('NAVIGATION', 15) , " + "('COMMUNICATION', 6), ('EMERGENCY', 60), ('NONE', 0), ('NORMAL', 4), " + "('VOICECOMMUNICATION', 20)"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + EXPECT_EQ(6, reps->GetNotificationsNumber("COMMUNICATION")); + EXPECT_EQ(60, reps->GetNotificationsNumber("EMERGENCY")); + EXPECT_EQ(15, reps->GetNotificationsNumber("NAVIGATION")); + EXPECT_EQ(0, reps->GetNotificationsNumber("NONE")); + EXPECT_EQ(4, reps->GetNotificationsNumber("NORMAL")); + EXPECT_EQ(20, reps->GetNotificationsNumber("VOICECOMMUNICATION")); +} + +TEST_F(SQLPTRepresentationTest, + GetPriority_SetAppsPrioritiesThenGet_ExpectReceivedValuesCorrect) { + // Arrange + const std::string query_insert_app_default = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " + "0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); + + const std::string query_insert_app_pre_DataConsent = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'pre_DataConsent', 0, 0, 'NONE', " + "'NONE', 0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_pre_DataConsent)); + + const std::string query_insert_app_device = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " + "'COMMUNICATION', 0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); + + const std::string query_insert_app_12345 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " + "0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); + + std::string priority; + // Checks + EXPECT_TRUE(reps->GetPriority("default", &priority)); + EXPECT_EQ("NONE", priority); + EXPECT_TRUE(reps->GetPriority("pre_DataConsent", &priority)); + EXPECT_EQ("NONE", priority); + EXPECT_TRUE(reps->GetPriority("device", &priority)); + EXPECT_EQ("COMMUNICATION", priority); + EXPECT_TRUE(reps->GetPriority("12345", &priority)); + EXPECT_EQ("EMERGENCY", priority); +} + +namespace { +const std::string kAppStorageFolder = "storage"; +} +TEST(SQLPTRepresentationTest3, Init_InitNewDataBase_ExpectResultSuccess) { + // Arrange + const bool in_memory_ = true; + NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; + SQLPTRepresentation reps(in_memory_); + // Checks + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kAppStorageFolder)); + EXPECT_EQ(::policy::SUCCESS, reps.Init(&policy_settings_)); + EXPECT_EQ(::policy::EXISTS, reps.Init(&policy_settings_)); + reps.RemoveDB(); +} + +TEST(SQLPTRepresentationTest3, + Init_TryInitNotExistingDataBase_ExpectResultFail) { + // Arrange + NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; + const std::string not_existing_path = "/not/existing/path"; + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(not_existing_path)); + SQLPTRepresentation reps; + // Check + EXPECT_EQ(::policy::FAIL, reps.Init(&policy_settings_)); +} + +TEST(SQLPTRepresentationTest3, + Close_InitNewDataBaseThenClose_ExpectResultSuccess) { + // Arrange + NiceMock<policy_handler_test::MockPolicySettings> policy_settings_; + ON_CALL(policy_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kAppStorageFolder)); + const bool in_memory_ = true; + SQLPTRepresentation reps(in_memory_); + EXPECT_EQ(::policy::SUCCESS, reps.Init(&policy_settings_)); + EXPECT_TRUE(reps.Close()); + utils::dbms::SQLError error(utils::dbms::Error::OK); + // Checks + EXPECT_EQ(error.number(), (reps.db()->LastError().number())); + reps.RemoveDB(); +} + +TEST_F(SQLPTRepresentationTest, + Clear_InitNewDataBaseThenClear_ExpectResultSuccess) { + // Arrange + const std::string query_insert_app_default = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " + "0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); + + const std::string query_insert_app_pre_DataConsent = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'pre_DataConsent', 0, 0, 'NONE', " + "'NONE', 0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_pre_DataConsent)); + + const std::string query_insert_app_device = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " + "'COMMUNICATION', 0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); + + const std::string query_insert_app_12345 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " + "0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); + + const std::string query_insert = + "INSERT INTO `notifications_by_priority` (`priority_value`, `value`) " + "VALUES ('NAVIGATION', 15) , " + "('COMMUNICATION', 6), ('EMERGENCY', 60), ('NONE', 0), ('NORMAL', 4), " + "('VOICECOMMUNICATION', 20)"; + + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + EXPECT_TRUE(reps->Clear()); + utils::dbms::SQLError error(utils::dbms::Error::OK); + EXPECT_EQ(error.number(), (reps->db()->LastError().number())); +} + +TEST_F(SQLPTRepresentationTest, + GetInitialAppData_SetData_ExpectCorrectValuesReceived) { + // Arrange + const std::string query_insert_nickname = + "INSERT INTO `nickname` (`application_id`, `name`)" + "VALUES ('1111', 'first_app') , " + "('2222', 'second_app'), ('3333', 'third_app')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_nickname)); + + const std::string query_insert_app_type = + "INSERT INTO `app_type` (`application_id`, `name`)" + "VALUES ('1111', 'NAVIGATION') , " + "('1111', 'MEDIA'), ('3333', 'COMMUNICATION')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_type)); + ::policy::StringArray nicknames; + ::policy::StringArray app_types; + ASSERT_TRUE(reps->GetInitialAppData("1111", &nicknames, &app_types)); + EXPECT_EQ(1u, nicknames.size()); + EXPECT_TRUE(nicknames.end() != + std::find(nicknames.begin(), nicknames.end(), "first_app")); + EXPECT_EQ(2u, app_types.size()); + EXPECT_TRUE(app_types.end() != + std::find(app_types.begin(), app_types.end(), "NAVIGATION")); + EXPECT_TRUE(app_types.end() != + std::find(app_types.begin(), app_types.end(), "MEDIA")); + nicknames.clear(); + app_types.clear(); + ASSERT_TRUE(reps->GetInitialAppData("2222", &nicknames, &app_types)); + EXPECT_EQ(1u, nicknames.size()); + EXPECT_TRUE(nicknames.end() != + std::find(nicknames.begin(), nicknames.end(), "second_app")); + EXPECT_EQ(0u, app_types.size()); + nicknames.clear(); + app_types.clear(); + ASSERT_TRUE(reps->GetInitialAppData("3333", &nicknames, &app_types)); + EXPECT_EQ(1u, nicknames.size()); + EXPECT_TRUE(nicknames.end() != + std::find(nicknames.begin(), nicknames.end(), "third_app")); + EXPECT_EQ(1u, app_types.size()); + EXPECT_TRUE(app_types.end() != + std::find(app_types.begin(), app_types.end(), "COMMUNICATION")); +} + +TEST_F( + SQLPTRepresentationTest, + GetFunctionalGroupings_SetFunctionalGroupings_ExpectCorrectValuesReceived) { + // Arrange + const std::string query_insert_functional_group = + "INSERT INTO `functional_group` (`id`, `user_consent_prompt`, `name`) " + "VALUES (73072936, null, 'SendLocation'), (1533011474, null, " + "'OnKeyboardInputOnlyGroup')"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_functional_group)); + + const std::string query_insert_SendLocation = + "INSERT INTO `rpc` (`name`, `hmi_level_value`, `functional_group_id`) " + "VALUES ('SendLocation', 'BACKGROUND', 73072936), ('SendLocation', " + "'FULL', 73072936), ('SendLocation', 'LIMITED', 73072936)"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_SendLocation)); + + const std::string query_insert_OnKeyboardInput = + "INSERT INTO `rpc` (`name`, `hmi_level_value`, `functional_group_id`) " + "VALUES ('OnKeyboardInput', 'FULL', 1533011474)"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_OnKeyboardInput)); + + policy_table::FunctionalGroupings func_groups; + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + EXPECT_EQ(2u, func_groups.size()); + policy_table::FunctionalGroupings::iterator func_groups_it = + func_groups.find("SendLocation"); + EXPECT_TRUE(func_groups.end() != func_groups_it); + policy_table::Rpcs& rpcs = func_groups_it->second; + EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + EXPECT_EQ(1u, rpc.size()); + policy_table::Rpc::const_iterator rpc_it = rpc.find("SendLocation"); + EXPECT_TRUE(rpc.end() != rpc_it); + const policy_table::HmiLevels& hmi_levels1 = rpc_it->second.hmi_levels; + EXPECT_EQ(3u, hmi_levels1.size()); + EXPECT_TRUE(hmi_levels1.end() != + std::find(hmi_levels1.begin(), + hmi_levels1.end(), + policy_table::HmiLevel::HL_BACKGROUND)); + EXPECT_TRUE(hmi_levels1.end() != + std::find(hmi_levels1.begin(), + hmi_levels1.end(), + policy_table::HmiLevel::HL_LIMITED)); + EXPECT_TRUE(hmi_levels1.end() != std::find(hmi_levels1.begin(), + hmi_levels1.end(), + policy_table::HmiLevel::HL_FULL)); + + func_groups_it = func_groups.find("OnKeyboardInputOnlyGroup"); + EXPECT_TRUE(func_groups.end() != func_groups_it); + policy_table::Rpcs& rpcs2 = func_groups_it->second; + EXPECT_EQ("", static_cast<std::string>(*rpcs2.user_consent_prompt)); + policy_table::Rpc& rpc2 = rpcs2.rpcs; + EXPECT_EQ(1u, rpc2.size()); + rpc_it = rpc2.find("OnKeyboardInput"); + EXPECT_TRUE(rpc2.end() != rpc_it); + const policy_table::HmiLevels& hmi_levels2 = rpc_it->second.hmi_levels; + EXPECT_EQ(1u, hmi_levels2.size()); + EXPECT_TRUE(hmi_levels2.end() != std::find(hmi_levels2.begin(), + hmi_levels2.end(), + policy_table::HmiLevel::HL_FULL)); +} + +TEST_F( + SQLPTRepresentationTest, + UpdateRequired_SetUpdateNotRequiredFlagThenCheck_ExpectUpdateNotRequired) { + // Arrange + EXPECT_FALSE(reps->UpdateRequired()); +} + +TEST_F(SQLPTRepresentationTest, + UpdateRequired_SetUpdateRequiredFlagThenCheck_ExpectUpdateRequired) { + // Arrange + const std::string query_insert = + "UPDATE `module_meta` SET `flag_update_required` = 1"; + // Assert + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + // Check + EXPECT_TRUE(reps->UpdateRequired()); +} + +TEST_F(SQLPTRepresentationTest, + SaveUpdateRequired_SaveUpdateRequired_ExpectCorrectValues) { + // Arrange + reps->SaveUpdateRequired(true); + // Check + EXPECT_TRUE(reps->UpdateRequired()); + // Act + reps->SaveUpdateRequired(false); + // Check + EXPECT_FALSE(reps->UpdateRequired()); +} + +TEST_F(SQLPTRepresentationTest, + IsApplicationRepresented_Check_ExpectCorrectResult) { + // Arrange + const std::string query_insert_app_default = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " + "0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); + + const std::string query_insert_app_device = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'device', 0, 0, 'NONE', " + "'COMMUNICATION', 0, 0, 0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_device)); + + const std::string query_insert_app_12345 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " + "0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); + // Checks + EXPECT_TRUE(reps->IsApplicationRepresented("default")); + EXPECT_TRUE(reps->IsApplicationRepresented("device")); + EXPECT_TRUE(reps->IsApplicationRepresented("12345")); + EXPECT_FALSE(reps->IsApplicationRepresented("1234")); +} + +TEST_F(SQLPTRepresentationTest, + IsApplicationRevoked_CheckApps_ExpectCorrectResult) { + // Arrange + const std::string query_insert_app_7777 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '7777', 0, 0, 'NONE', 'NONE', 1, " + "0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_7777)); + + const std::string query_insert_app_12345 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'EMERGENCY', " + "0, 0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_12345)); + // Checks + EXPECT_TRUE(reps->IsApplicationRevoked("7777")); + EXPECT_FALSE(reps->IsApplicationRevoked("12345")); +} + +TEST_F(SQLPTRepresentationTest, + CopyApplication_CopyApplication_ExpectAppCopiedSuccesfully) { + // Arrange + const std::string query_insert_app_default = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " + "1, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); + + const std::string query_insert_app_123 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '123', 1, 0, 'FULL', " + "'COMMUNICATION', 1, 1, 0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_123)); + EXPECT_FALSE(reps->IsApplicationRepresented("7777")); + EXPECT_FALSE(reps->IsApplicationRepresented("9999")); + // Act + EXPECT_TRUE(reps->CopyApplication("default", "7777")); + EXPECT_TRUE(reps->CopyApplication("123", "9999")); + // Checks + EXPECT_TRUE(reps->IsApplicationRepresented("7777")); + EXPECT_TRUE(reps->IsApplicationRepresented("9999")); + EXPECT_FALSE(reps->IsApplicationRevoked("7777")); + EXPECT_TRUE(reps->IsApplicationRevoked("9999")); + EXPECT_TRUE(reps->IsDefaultPolicy("7777")); + std::string priority1; + std::string priority2; + EXPECT_TRUE(reps->GetPriority("default", &priority1)); + EXPECT_TRUE(reps->GetPriority("7777", &priority2)); + EXPECT_EQ(priority1, priority2); + EXPECT_TRUE(reps->GetPriority("123", &priority1)); + EXPECT_TRUE(reps->GetPriority("9999", &priority2)); + EXPECT_EQ(priority1, priority2); +} + +TEST_F(SQLPTRepresentationTest, + IsDefaultPolicy_SetAppPreDataThenCheck_ExpectNotDefaultPolicySet) { + // Arrange + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( '12345', 0, 0, 'NONE', 'NONE', 0, " + "0, " + "1, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + // Check + EXPECT_FALSE(reps->IsDefaultPolicy("12345")); +} + +TEST_F(SQLPTRepresentationTest, + IsDefaultPolicy_SetAppDefaultThenCheck_ExpectNotDefaultPolicySet) { + // Arrange + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " + "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 1, 0, 64, 10) "; + + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + // Check + EXPECT_TRUE(reps->IsDefaultPolicy("1234567")); +} + +TEST_F(SQLPTRepresentationTest, Drop_DropExistedPT_ExpectZeroTables) { + // Check + utils::dbms::SQLQuery query(reps->db()); + const std::string query_select = + "SELECT COUNT(*) FROM `sqlite_master` WHERE `type` = 'table'"; + // In normally created PT there are more than 0 tables + + ASSERT_TRUE(query_wrapper_->Exec(query_select)); + query.Prepare(query_select); + query.Next(); + ASSERT_GT(query.GetInteger(0), 0); + query.Finalize(); + + // Destroy schema + ASSERT_TRUE(reps->Drop()); + + // Check PT structure destroyed and tables number is 0 + query.Prepare(query_select); + query.Next(); + ASSERT_EQ(0, query.GetInteger(0)); + query.Finalize(); + + // Restore schema + ASSERT_TRUE(reps->RefreshDB()); +} + +TEST_F(SQLPTRepresentationTest, + SetDefaultPolicy_SetDefaultPolicyThenCheck_ExpectDefaultPolicySet) { + // Arrange + const std::string query_insert_app_default = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, " + " `default_hmi`, `priority_value`, `is_revoked`, `is_default`, " + "`is_predata`, `memory_kb`, " + " `heart_beat_timeout_ms`) VALUES( 'default', 0, 0, 'NONE', 'NONE', 0, " + "0, " + "0, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_default)); + + const std::string query_insert_app_1234567 = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " + "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app_1234567)); + EXPECT_FALSE(reps->IsDefaultPolicy("1234567")); + // Act + ASSERT_TRUE(reps->SetDefaultPolicy("1234567")); + // Check + EXPECT_TRUE(reps->IsDefaultPolicy("1234567")); +} + +TEST_F(SQLPTRepresentationTest, + SetPreloaded_SetPreloaded_ExpectPTSetToPreloaded) { + // Arrange + const std::string query_insert = + "UPDATE `module_config` SET `preloaded_pt` = 0"; + ASSERT_TRUE(query_wrapper_->Exec(query_insert)); + // Check + ASSERT_FALSE(reps->IsPTPreloaded()); + // Act + reps->SetPreloaded(true); + // Check + ASSERT_TRUE(reps->IsPTPreloaded()); + // Act + reps->SetPreloaded(false); + // Check + ASSERT_FALSE(reps->IsPTPreloaded()); +} + +TEST_F(SQLPTRepresentationTest, + SetIsDefault_SetIsDefault_ExpectDefaultFlagSet) { + // Arrange + utils::dbms::SQLQuery query(reps->db()); + const std::string query_insert_app = + "INSERT OR IGNORE INTO `application`(`id`, `keep_context`, " + "`steal_focus`, `default_hmi`, `priority_value`, `is_revoked`, " + "`is_default`, `is_predata`, `memory_kb`, `heart_beat_timeout_ms`) " + "VALUES( '1234567', 0, 0, 'NONE', 'NONE', 0, 0, 1, 64, 10) "; + ASSERT_TRUE(query_wrapper_->Exec(query_insert_app)); + const std::string query_select = + "SELECT `is_default` FROM `application`WHERE`id`= '1234567' "; + + query.Prepare(query_select); + query.Next(); + EXPECT_EQ(0, query.GetInteger(0)); + query.Finalize(); + // Act + EXPECT_TRUE(reps->SetIsDefault("1234567", true)); + + // Check + query.Prepare(query_select); + query.Next(); + EXPECT_EQ(1, query.GetInteger(0)); + query.Finalize(); + // Act + EXPECT_TRUE(reps->SetIsDefault("1234567", false)); + + // Check + query.Prepare(query_select); + query.Next(); + EXPECT_EQ(0, query.GetInteger(0)); +} + +TEST(SQLPTRepresentationTest3, RemoveDB_RemoveDB_ExpectFileDeleted) { + // Arrange + const bool in_memory_ = true; + policy_handler_test::MockPolicySettings policy_settings_; + SQLPTRepresentation reps(in_memory_); + EXPECT_EQ(::policy::SUCCESS, reps.Init(&policy_settings_)); + EXPECT_EQ(::policy::EXISTS, reps.Init(&policy_settings_)); + std::string path = (reps.db())->get_path(); + // Act + reps.RemoveDB(); + // Check + EXPECT_FALSE(file_system::FileExists(path)); +} + +TEST_F(SQLPTRepresentationTest, + DISABLED_GenerateSnapshot_SetPolicyTable_SnapshotIsPresent) { + // TODO(AKutsan):APPLINK-31526 Test requires initial preloaded pt for preloaded date reading + // Arrange + Json::Value table(Json::objectValue); + PolicyTableUpdatePrepare(table); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + + // Assert + ASSERT_TRUE(IsValid(update)); + ASSERT_TRUE(reps->Save(update)); + + // Act + utils::SharedPtr<policy_table::Table> snapshot = reps->GenerateSnapshot(); + snapshot->SetPolicyTableType(rpc::policy_table_interface_base::PT_SNAPSHOT); + // Remove fields which must be absent in snapshot + table["policy_table"]["consumer_friendly_messages"].removeMember("messages"); + table["policy_table"]["app_policies"]["1234"].removeMember("default_hmi"); + table["policy_table"]["app_policies"]["1234"].removeMember("keep_context"); + table["policy_table"]["app_policies"]["1234"].removeMember("steal_focus"); + table["policy_table"]["app_policies"]["default"].removeMember("default_hmi"); + table["policy_table"]["app_policies"]["default"].removeMember("keep_context"); + table["policy_table"]["app_policies"]["default"].removeMember("steal_focus"); + table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( + "default_hmi"); + table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( + "keep_context"); + table["policy_table"]["app_policies"]["pre_DataConsent"].removeMember( + "steal_focus"); + table["policy_table"]["app_policies"]["device"].removeMember("default_hmi"); + table["policy_table"]["app_policies"]["device"].removeMember("keep_context"); + table["policy_table"]["app_policies"]["device"].removeMember("steal_focus"); + table["policy_table"]["app_policies"]["device"].removeMember("groups"); + table["policy_table"]["device_data"] = Json::Value(Json::objectValue); + table["policy_table"]["module_meta"] = Json::Value(Json::objectValue); + table["policy_table"]["module_config"]["preloaded_pt"] = Json::Value(false); + policy_table::Table expected(&table); + Json::StyledWriter writer; + // Checks + EXPECT_EQ(writer.write(expected.ToJsonValue()), + writer.write(snapshot->ToJsonValue())); + std::cout << writer.write(snapshot->ToJsonValue()) << std::endl; + EXPECT_EQ(expected.ToJsonValue().toStyledString(), + snapshot->ToJsonValue().toStyledString()); +} + +TEST_F(SQLPTRepresentationTest, DISABLED_Save_SetPolicyTableThenSave_ExpectSavedToPT) { + // TODO(AKutsan): APPLINK-31526 Test requires initial preloaded pt for preloaded date reading + // Arrange + Json::Value table(Json::objectValue); + PolicyTableUpdatePrepare(table); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + // Checks PT before Save + policy_table::FunctionalGroupings func_groups; + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + // Check functional groupings section + EXPECT_EQ(0u, func_groups.size()); + + policy_table::ApplicationPoliciesSection policies; + GatherApplicationPoliciesSection(&policies); + // Check ApplicationPoliciesSection + EXPECT_EQ(0u, policies.apps.size()); + EXPECT_EQ(0u, (policies.device.preconsented_groups)->size()); + EXPECT_EQ(0u, policies.device.groups.size()); + EXPECT_EQ(policy_table::Priority::P_EMERGENCY, policies.device.priority); + EXPECT_EQ(policy_table::HmiLevel::HL_BACKGROUND, policies.device.default_hmi); + EXPECT_FALSE(policies.device.keep_context); + EXPECT_FALSE(policies.device.steal_focus); + + policy_table::ModuleConfig config; + GatherModuleConfig(&config); + // Check Module config section + EXPECT_TRUE(*config.preloaded_pt); + EXPECT_EQ(0, config.exchange_after_x_ignition_cycles); + EXPECT_EQ(0, config.exchange_after_x_kilometers); + EXPECT_EQ(0, config.exchange_after_x_days); + EXPECT_EQ(0, config.timeout_after_x_seconds); + EXPECT_EQ("", static_cast<std::string>(*config.vehicle_make)); + EXPECT_EQ("", static_cast<std::string>(*config.vehicle_model)); + EXPECT_EQ("", static_cast<std::string>(*config.vehicle_year)); + EXPECT_EQ("", static_cast<std::string>(*config.preloaded_date)); + EXPECT_EQ("", static_cast<std::string>(*config.certificate)); + EXPECT_EQ(0u, config.seconds_between_retries.size()); + EXPECT_EQ(0u, config.endpoints.size()); + EXPECT_EQ(0u, config.notifications_per_minute_by_priority.size()); + + policy_table::ConsumerFriendlyMessages messages; + GatherConsumerFriendlyMessages(&messages); + EXPECT_EQ("0", static_cast<std::string>(messages.version)); + policy_table::DeviceData devices; + GatherDeviceData(&devices); + EXPECT_EQ(0u, devices.size()); + policy_table::UsageAndErrorCounts counts; + GatherUsageAndErrorCounts(&counts); + EXPECT_EQ(0u, counts.app_level->size()); + ASSERT_TRUE(IsValid(update)); + // Act + ASSERT_TRUE(reps->Save(update)); + + // Check Functional Groupings + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + // Checks + EXPECT_EQ(1u, func_groups.size()); + policy_table::FunctionalGroupings::iterator func_groups_iter = + func_groups.find("default"); + ASSERT_TRUE(func_groups.end() != func_groups_iter); + policy_table::Rpcs& rpcs = func_groups_iter->second; + EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + EXPECT_EQ(1u, rpc.size()); + policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); + EXPECT_TRUE(rpc.end() != rpc_iter); + const policy_table::HmiLevels& hmi_levels = rpc_iter->second.hmi_levels; + EXPECT_EQ(1u, hmi_levels.size()); + EXPECT_TRUE(hmi_levels.end() != std::find(hmi_levels.begin(), + hmi_levels.end(), + policy_table::HmiLevel::HL_FULL)); + + const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); + EXPECT_EQ(1u, parameters.size()); + EXPECT_TRUE(parameters.end() != std::find(parameters.begin(), + parameters.end(), + policy_table::Parameter::P_SPEED)); + // Check Application Policies Section + GatherApplicationPoliciesSection(&policies); + const uint32_t apps_size = 3u; + + rpc::String<1ul, 255ul> str("default"); + policy_table::Strings groups; + groups.push_back(str); + CheckAppPoliciesSection(policies, + apps_size, + policy_table::Priority::P_EMERGENCY, + "1234", + 150u, + 200u, + groups); + CheckAppPoliciesSection(policies, + apps_size, + policy_table::Priority::P_EMERGENCY, + "default", + 50u, + 100u, + groups); + CheckAppPoliciesSection(policies, + apps_size, + policy_table::Priority::P_EMERGENCY, + "pre_DataConsent", + 40u, + 90u, + groups); + CheckAppPoliciesSection(policies, + apps_size, + policy_table::Priority::P_EMERGENCY, + "device", + 0u, + 0u, + groups); + EXPECT_EQ(0u, (policies.device.preconsented_groups)->size()); + EXPECT_EQ(0u, policies.device.groups.size()); + EXPECT_EQ(policy_table::HmiLevel::HL_BACKGROUND, policies.device.default_hmi); + EXPECT_FALSE(policies.device.keep_context); + EXPECT_FALSE(policies.device.steal_focus); + + CheckAppGroups("1234", groups); + CheckAppGroups("default", groups); + CheckAppGroups("pre_DataConsent", groups); + CheckAppGroups("device", groups); + + GatherModuleConfig(&config); + // Check Module Config section + ASSERT_FALSE(*config.preloaded_pt); + ASSERT_EQ("my_cert", static_cast<std::string>(*config.certificate)); + ASSERT_EQ("25-04-2015", static_cast<std::string>(*config.preloaded_date)); + ASSERT_EQ("2014", static_cast<std::string>(*config.vehicle_year)); + ASSERT_EQ("ModelT", static_cast<std::string>(*config.vehicle_model)); + ASSERT_EQ("MakeT", static_cast<std::string>(*config.vehicle_make)); + ASSERT_EQ(10, config.exchange_after_x_ignition_cycles); + ASSERT_EQ(100, config.exchange_after_x_kilometers); + ASSERT_EQ(5, config.exchange_after_x_days); + ASSERT_EQ(500, config.timeout_after_x_seconds); + ASSERT_EQ(3u, config.seconds_between_retries.size()); + ASSERT_EQ(10, config.seconds_between_retries[0]); + ASSERT_EQ(20, config.seconds_between_retries[1]); + ASSERT_EQ(30, config.seconds_between_retries[2]); + ASSERT_EQ(6u, config.notifications_per_minute_by_priority.size()); + ASSERT_EQ(1, config.notifications_per_minute_by_priority["emergency"]); + ASSERT_EQ(2, config.notifications_per_minute_by_priority["navigation"]); + ASSERT_EQ(3, config.notifications_per_minute_by_priority["VOICECOMM"]); + ASSERT_EQ(4, config.notifications_per_minute_by_priority["communication"]); + ASSERT_EQ(5, config.notifications_per_minute_by_priority["normal"]); + ASSERT_EQ(6, config.notifications_per_minute_by_priority["none"]); + EXPECT_EQ(1u, config.endpoints.size()); + policy_table::ServiceEndpoints& service_endpoints = config.endpoints; + EXPECT_EQ("0x00", service_endpoints.begin()->first); + policy_table::URLList& url_list = service_endpoints.begin()->second; + EXPECT_EQ("default", url_list.begin()->first); + policy_table::URL& url = url_list.begin()->second; + EXPECT_EQ("http://ford.com/cloud/default", static_cast<std::string>(url[0])); + GatherConsumerFriendlyMessages(&messages); + EXPECT_EQ("1.2", static_cast<std::string>(messages.version)); +} + +TEST_F(SQLPTRepresentationTest, + Save_SavePolicyTable_EmptyParameters_ParametersEMPTY) { + // Arrange + Json::Value table(Json::objectValue); + PolicyTableUpdatePrepareEmptyParameters(table); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + // Checks PT before Save + policy_table::FunctionalGroupings func_groups; + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + // Check functional groupings section + EXPECT_EQ(0u, func_groups.size()); + + // Act + ASSERT_TRUE(reps->Save(update)); + + // Check Functional Groupings + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + // Checks + EXPECT_EQ(1u, func_groups.size()); + policy_table::FunctionalGroupings::iterator func_groups_iter = + func_groups.find("default"); + ASSERT_TRUE(func_groups.end() != func_groups_iter); + policy_table::Rpcs& rpcs = func_groups_iter->second; + EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + EXPECT_EQ(1u, rpc.size()); + policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); + EXPECT_TRUE(rpc.end() != rpc_iter); + // Check parameters + const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); + // 'parameters' : [] - represented as initialized, but empty + // missing 'parameters' - represented as non-initialized and empty + EXPECT_TRUE(parameters.is_initialized()); + EXPECT_TRUE(parameters.empty()); +} + +TEST_F(SQLPTRepresentationTest, + Save_SavePolicyTable_NoParameters_NoParametersSaved) { + // Arrange + Json::Value table(Json::objectValue); + PolicyTableUpdatePrepareNoParameters(table); + + policy_table::Table update(&table); + update.SetPolicyTableType(rpc::policy_table_interface_base::PT_UPDATE); + // Checks PT before Save + policy_table::FunctionalGroupings func_groups; + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + // Check functional groupings section + EXPECT_EQ(0u, func_groups.size()); + + // Act + ASSERT_TRUE(reps->Save(update)); + + // Check Functional Groupings + ASSERT_TRUE(reps->GetFunctionalGroupings(func_groups)); + // Checks + EXPECT_EQ(1u, func_groups.size()); + policy_table::FunctionalGroupings::iterator func_groups_iter = + func_groups.find("default"); + ASSERT_TRUE(func_groups.end() != func_groups_iter); + policy_table::Rpcs& rpcs = func_groups_iter->second; + EXPECT_EQ("", static_cast<std::string>(*rpcs.user_consent_prompt)); + policy_table::Rpc& rpc = rpcs.rpcs; + EXPECT_EQ(1u, rpc.size()); + policy_table::Rpc::const_iterator rpc_iter = rpc.find("Update"); + EXPECT_TRUE(rpc.end() != rpc_iter); + // Check parameters + const ::policy_table::Parameters& parameters = *(rpc_iter->second.parameters); + EXPECT_EQ(0u, parameters.size()); +} + +} // namespace policy_test +} // namespace components +} // namespace test diff --git a/src/components/policy/policy_external/test/update_status_manager_test.cc b/src/components/policy/policy_external/test/update_status_manager_test.cc new file mode 100644 index 0000000000..5546984ff4 --- /dev/null +++ b/src/components/policy/policy_external/test/update_status_manager_test.cc @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2015, Ford Motor Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the + * distribution. + * + * Neither the name of the Ford Motor Company nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gtest/gtest.h" +#include "policy/mock_policy_listener.h" +#include "policy/policy_manager_impl.h" +#include "policy/update_status_manager.h" +#include "utils/make_shared.h" +#include "utils/conditional_variable.h" + +namespace test { +namespace components { +namespace policy_test { + +using namespace ::policy; +using ::testing::_; +using ::testing::Return; +using testing::NiceMock; + +class UpdateStatusManagerTest : public ::testing::Test { + protected: + utils::SharedPtr<UpdateStatusManager> manager_; + PolicyTableStatus status_; + const uint32_t k_timeout_; + NiceMock<MockPolicyListener> listener_; + const std::string up_to_date_status_; + const std::string update_needed_status_; + const std::string updating_status_; + + public: + UpdateStatusManagerTest() + : manager_(utils::MakeShared<UpdateStatusManager>()) + , k_timeout_(1000) + , listener_() + , up_to_date_status_("UP_TO_DATE") + , update_needed_status_("UPDATE_NEEDED") + , updating_status_("UPDATING") {} + + void SetUp() OVERRIDE { + manager_->set_listener(&listener_); + ON_CALL(listener_, OnUpdateStatusChanged(_)).WillByDefault(Return()); + } + + void TearDown() OVERRIDE {} +}; + +namespace { +/** + * @brief The WaitAsync class + * can wait for a certain amount of function calls from different + * threads, or a timeout expires. + */ +class WaitAsync { + public: + WaitAsync(const uint32_t count, const uint32_t timeout) + : count_(count), timeout_(timeout) {} + + void Notify() { + count_--; + cond_var_.NotifyOne(); + } + + bool Wait(sync_primitives::AutoLock& auto_lock) { + while (count_ > 0) { + sync_primitives::ConditionalVariable::WaitStatus wait_status = + cond_var_.WaitFor(auto_lock, timeout_); + if (wait_status == sync_primitives::ConditionalVariable::kTimeout) { + return false; + } + } + return true; + } + + private: + int count_; + const uint32_t timeout_; + sync_primitives::ConditionalVariable cond_var_; +}; +} + +ACTION_P(NotifyAsync, waiter) { + waiter->Notify(); +} + +TEST_F(UpdateStatusManagerTest, + OnUpdateSentOut_WaitForTimeoutExpired_ExpectStatusUpdateNeeded) { + // Arrange + sync_primitives::Lock lock; + sync_primitives::AutoLock auto_lock(lock); + const uint32_t count = 3u; + const uint32_t timeout = 2u * k_timeout_; + WaitAsync waiter(count, timeout); + EXPECT_CALL(listener_, OnUpdateStatusChanged(_)) + .WillRepeatedly(NotifyAsync(&waiter)); + manager_->ScheduleUpdate(); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + EXPECT_TRUE(waiter.Wait(auto_lock)); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpdateRequired, status_); +} + +TEST_F(UpdateStatusManagerTest, + OnUpdateTimeOutOccurs_ExpectStatusUpdateNeeded) { + // Arrange + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpToDate, status_); + manager_->ScheduleUpdate(); + manager_->OnUpdateTimeoutOccurs(); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpdateRequired, status_); +} + +TEST_F(UpdateStatusManagerTest, + OnValidUpdateReceived_SetValidUpdateReceived_ExpectStatusUpToDate) { + // Arrange + EXPECT_CALL(listener_, OnUpdateStatusChanged(update_needed_status_)); + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + EXPECT_CALL(listener_, OnUpdateStatusChanged(updating_status_)); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + + EXPECT_CALL(listener_, OnUpdateStatusChanged(up_to_date_status_)); + manager_->OnValidUpdateReceived(); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpToDate, status_); +} + +TEST_F( + UpdateStatusManagerTest, + SheduledUpdate_OnValidUpdateReceived_ExpectStatusUpToDateThanUpdateNeeded) { + using ::testing::InSequence; + // Arrange + EXPECT_CALL(listener_, OnUpdateStatusChanged(update_needed_status_)); + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + EXPECT_CALL(listener_, OnUpdateStatusChanged(updating_status_)); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + manager_->ScheduleUpdate(); + + InSequence s; + EXPECT_CALL(listener_, OnUpdateStatusChanged(up_to_date_status_)); + EXPECT_CALL(listener_, OnUpdateStatusChanged(update_needed_status_)); + + manager_->OnValidUpdateReceived(); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpdateRequired, status_); +} + +TEST_F(UpdateStatusManagerTest, + OnWrongUpdateReceived_SetWrongUpdateReceived_ExpectStatusUpdateNeeded) { + // Arrange + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + manager_->OnWrongUpdateReceived(); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpdateRequired, status_); +} + +TEST_F(UpdateStatusManagerTest, + OnResetDefaulPT_ResetPTtoDefaultState_ExpectPTinDefaultState) { + // Arrange + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + // Reset PT to default state with flag update required + manager_->OnResetDefaultPT(true); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpdateRequired, status_); +} + +TEST_F(UpdateStatusManagerTest, + OnResetDefaulPT2_ResetPTtoDefaultState_ExpectPTinDefaultState) { + // Arrange + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + // Reset PT to default state with flag update not needed + manager_->OnResetDefaultPT(false); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpToDate, status_); +} + +TEST_F(UpdateStatusManagerTest, OnResetRetrySequence_ExpectStatusUpToDate) { + // Arrange + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + manager_->OnResetRetrySequence(); + status_ = manager_->GetLastUpdateStatus(); + // Check + EXPECT_EQ(StatusUpdatePending, status_); +} + +TEST_F(UpdateStatusManagerTest, + OnNewApplicationAdded_ExpectStatusUpdateNeeded) { + // Arrange + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + manager_->OnNewApplicationAdded(kDeviceAllowed); + status_ = manager_->GetLastUpdateStatus(); + // Checks + EXPECT_EQ(StatusUpdatePending, status_); + EXPECT_TRUE(manager_->IsUpdatePending()); + EXPECT_TRUE(manager_->IsUpdateRequired()); +} + +TEST_F(UpdateStatusManagerTest, ScheduleUpdate_ExpectStatusUpdateNeeded) { + // Arrange + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdateRequired, status_); + manager_->OnUpdateSentOut(k_timeout_); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpdatePending, status_); + manager_->OnValidUpdateReceived(); + status_ = manager_->GetLastUpdateStatus(); + EXPECT_EQ(StatusUpToDate, status_); + EXPECT_FALSE(manager_->IsUpdatePending()); + EXPECT_FALSE(manager_->IsUpdateRequired()); + manager_->ScheduleUpdate(); + status_ = manager_->GetLastUpdateStatus(); + // Checks + EXPECT_EQ(StatusUpdateRequired, status_); + EXPECT_FALSE(manager_->IsUpdatePending()); + EXPECT_TRUE(manager_->IsUpdateRequired()); +} + +TEST_F(UpdateStatusManagerTest, + OnPolicyInit_SetUpdateRequired_ExpectStatusUpdateNeeded) { + // Arrange + manager_->OnPolicyInit(true); + status_ = manager_->GetLastUpdateStatus(); + // Checks + EXPECT_EQ(StatusUpdateRequired, status_); + EXPECT_FALSE(manager_->IsUpdatePending()); + EXPECT_TRUE(manager_->IsUpdateRequired()); +} + +TEST_F(UpdateStatusManagerTest, + OnPolicyInit_SetUpdateNotRequired_ExpectStatusUpToDate) { + // Arrange + manager_->OnPolicyInit(false); + status_ = manager_->GetLastUpdateStatus(); + // Checks + EXPECT_EQ(StatusUpToDate, status_); + EXPECT_FALSE(manager_->IsUpdatePending()); + EXPECT_FALSE(manager_->IsUpdateRequired()); +} + +TEST_F(UpdateStatusManagerTest, + StringifiedUpdateStatus_SetStatuses_ExpectCorrectStringifiedStatuses) { + // Arrange + manager_->OnPolicyInit(false); + // Check + EXPECT_EQ("UP_TO_DATE", manager_->StringifiedUpdateStatus()); + manager_->OnPolicyInit(true); + // Check + EXPECT_EQ("UPDATE_NEEDED", manager_->StringifiedUpdateStatus()); + manager_->OnUpdateSentOut(k_timeout_); + // Check + EXPECT_EQ("UPDATING", manager_->StringifiedUpdateStatus()); +} + +TEST_F(UpdateStatusManagerTest, + OnAppSearchStartedCompleted_ExpectAppSearchCorrectStatus) { + // Arrange + manager_->OnAppsSearchStarted(); + // Check + EXPECT_TRUE(manager_->IsAppsSearchInProgress()); + // Arrange + manager_->OnAppsSearchCompleted(); + // Check + EXPECT_FALSE(manager_->IsAppsSearchInProgress()); +} + +} // namespace policy +} // namespace components +} // namespace test |