# Copyright (c) 2015, 2017, 2019-2020, The Linux Foundation. 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 Linux Foundation 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 "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER 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.

# access to seemp folder
allow system_app vendor_seemp_data_file:dir r_dir_perms;
allow system_app vendor_seemp_data_file:{ file fifo_file } rw_file_perms;
binder_call(system_app, vendor_seempd)

allow system_app vendor_dpmtcm_socket:sock_file w_file_perms;
allow system_app vendor_dpmd:unix_stream_socket connectto;
allow system_app vendor_color_service:service_manager add;
get_prop(system_app, bluetooth_prop);
# allow system_app to interact with smcinvoke daemon
#binder_call(system_app, smcinvoke_daemon)

# allow system_app access to Workload Classifier Property
set_prop(system_app, vendor_wlc_prop);

# allow system_app access to wigig Property
get_prop(system_app, vendor_wigig_core_prop);

#Wi-Fi Display
set_prop(system_app, wfd_service_prop);
userdebug_or_eng(`
get_prop(system_app, wfd_debug_prop)
')

#allow system_app to access faceauth
hal_client_domain(system_app, hal_face)
