diff --git a/livedisplay/DisplayModes.cpp b/livedisplay/DisplayModes.cpp index e75c240..76bcab3 100644 --- a/livedisplay/DisplayModes.cpp +++ b/livedisplay/DisplayModes.cpp @@ -17,7 +17,10 @@ #define LOG_TAG "DisplayModesService" #include "DisplayModes.h" + #include +#include + #include namespace vendor { @@ -26,15 +29,15 @@ namespace livedisplay { namespace V2_0 { namespace implementation { -static constexpr const char* kModePath = - "/sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode"; -static constexpr const char* kDefaultPath = "/data/misc/display/default_display_mode"; +static constexpr const char* kDisplayModeProp = "sys.display.mode"; +static const std::string kModeBasePath = "/sys/class/drm/card0-DSI-1/"; +static const std::string kDefaultPath = "/data/misc/display/default_display_mode"; const std::map DisplayModes::kModeMap = { {0, {"Standard", "default"}}, - {1, {"sRGB", "srgb"}}, - {2, {"DCI P3", "dci-p3"}}, - {3, {"Wide Color", "widecolor"}}, + {1, {"DCI P3", "native_display_p3_mode"}}, + {2, {"Wide Color", "native_display_wide_color_mode"}}, + {3, {"sRGB", "native_display_srgb_color_mode"}}, }; DisplayModes::DisplayModes() : mDefaultModeId(0) { @@ -48,18 +51,19 @@ DisplayModes::DisplayModes() : mDefaultModeId(0) { } for (const auto& entry : kModeMap) { - if (value == entry.second.value) { + // Check if default mode is a valid mode + if (value == std::to_string(entry.first)) { mDefaultModeId = entry.first; + android::base::SetProperty(kDisplayModeProp, entry.second.node); break; } } - - setDisplayMode(mDefaultModeId, false); } // Methods from ::vendor::lineage::livedisplay::V2_0::IDisplayModes follow. Return DisplayModes::getDisplayModes(getDisplayModes_cb resultCb) { std::vector modes; + for (const auto& entry : kModeMap) { modes.push_back({entry.first, entry.second.name}); } @@ -69,13 +73,17 @@ Return DisplayModes::getDisplayModes(getDisplayModes_cb resultCb) { Return DisplayModes::getCurrentDisplayMode(getCurrentDisplayMode_cb resultCb) { int32_t currentModeId = mDefaultModeId; - std::ifstream modeFile(kModePath); std::string value; - modeFile >> value; - if (!modeFile.fail()) { - for (const auto& entry : kModeMap) { - if (value == entry.second.value) { + for (const auto& entry : kModeMap) { + if (entry.first == 0) { + continue; + } + + std::ifstream modeFile(kModeBasePath + entry.second.node); + if (!modeFile.fail()) { + modeFile >> value; + if (value == "1") { currentModeId = entry.first; break; } @@ -91,24 +99,39 @@ Return DisplayModes::getDefaultDisplayMode(getDefaultDisplayMode_cb result } Return DisplayModes::setDisplayMode(int32_t modeID, bool makeDefault) { + // Disable all modes + for (const auto& entry : kModeMap) { + if (entry.first == 0) { + continue; + } + + std::ofstream modeFile(kModeBasePath + entry.second.node); + if (!modeFile.fail()) { + modeFile << 0; + } + } const auto iter = kModeMap.find(modeID); if (iter == kModeMap.end()) { return false; } - std::ofstream modeFile(kModePath); - modeFile << iter->second.value; - if (modeFile.fail()) { - return false; + if (modeID != 0) { + std::ofstream modeFile(kModeBasePath + iter->second.node); + modeFile << 1; + if (modeFile.fail()) { + return false; + } + android::base::SetProperty(kDisplayModeProp, iter->second.node); } if (makeDefault) { std::ofstream defaultFile(kDefaultPath); - defaultFile << iter->second.value; + defaultFile << iter->first; if (defaultFile.fail()) { return false; } mDefaultModeId = iter->first; } + return true; } diff --git a/livedisplay/DisplayModes.h b/livedisplay/DisplayModes.h index c313768..c0554d9 100644 --- a/livedisplay/DisplayModes.h +++ b/livedisplay/DisplayModes.h @@ -44,8 +44,8 @@ class DisplayModes : public IDisplayModes { private: struct ModeInfo { - const char* name; - const char* value; + std::string name; + std::string node; }; static const std::map kModeMap; int32_t mDefaultModeId; diff --git a/livedisplay/lineage.livedisplay@2.0-service.oneplus_kona.rc b/livedisplay/lineage.livedisplay@2.0-service.oneplus_kona.rc index 83bdcc3..fc86892 100644 --- a/livedisplay/lineage.livedisplay@2.0-service.oneplus_kona.rc +++ b/livedisplay/lineage.livedisplay@2.0-service.oneplus_kona.rc @@ -1,8 +1,18 @@ on init - chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode - chmod 0660 /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm - chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/display_mode - chown system system /sys/devices/platform/soc/ae00000.qcom,mdss_mdp/main_display/hbm + chown system graphics /sys/class/drm/card0-DSI-1/DCI_P3 + chown system graphics /sys/class/drm/card0-DSI-1/hbm + chown system graphics /sys/class/drm/card0-DSI-1/night_mode + chown system graphics /sys/class/drm/card0-DSI-1/native_display_loading_effect_mode + chown system graphics /sys/class/drm/card0-DSI-1/native_display_p3_mode + chown system graphics /sys/class/drm/card0-DSI-1/native_display_srgb_color_mode + chown system graphics /sys/class/drm/card0-DSI-1/native_display_wide_color_mode + chmod 0666 /sys/class/drm/card0-DSI-1/DCI_P3 + chmod 0666 /sys/class/drm/card0-DSI-1/hbm + chmod 0666 /sys/class/drm/card0-DSI-1/night_mode + chmod 0666 /sys/class/drm/card0-DSI-1/native_display_loading_effect_mode + chmod 0666 /sys/class/drm/card0-DSI-1/native_display_p3_mode + chmod 0666 /sys/class/drm/card0-DSI-1/native_display_srgb_color_mode + chmod 0666 /sys/class/drm/card0-DSI-1/native_display_wide_color_mode on post-fs-data mkdir /data/misc/display 0770 system graphics @@ -11,3 +21,13 @@ service livedisplay-hal-2-0 /system/bin/hw/lineage.livedisplay@2.0-service.onepl class hal user system group system + +on property:sys.boot_completed=1 + write /sys/class/drm/card0-DSI-1/DCI_P3 0 + write /sys/class/drm/card0-DSI-1/hbm 0 + write /sys/class/drm/card0-DSI-1/night_mode 0 + write /sys/class/drm/card0-DSI-1/native_display_loading_effect_mode 0 + write /sys/class/drm/card0-DSI-1/native_display_p3_mode 0 + write /sys/class/drm/card0-DSI-1/native_display_srgb_color_mode 0 + write /sys/class/drm/card0-DSI-1/native_display_wide_color_mode 0 + write /sys/class/drm/card0-DSI-1/${sys.display.mode} 1 diff --git a/sepolicy/private/genfs_contexts b/sepolicy/private/genfs_contexts index c55203d..9c1ca31 100644 --- a/sepolicy/private/genfs_contexts +++ b/sepolicy/private/genfs_contexts @@ -1,11 +1,13 @@ # Display genfscon proc /touchpanel u:object_r:proc_touchpanel:s0 +genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/DCI_P3 u:object_r:sysfs_livedisplay_tuneable:s0 genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/dim_alpha u:object_r:sysfs_fod:s0 +genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/native_display_loading_effect_mode u:object_r:sysfs_livedisplay_tuneable:s0 +genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/native_display_p3_mode u:object_r:sysfs_livedisplay_tuneable:s0 +genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/native_display_srgb_color_mode u:object_r:sysfs_livedisplay_tuneable:s0 +genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/native_display_wide_color_mode u:object_r:sysfs_livedisplay_tuneable:s0 +genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/night_mode u:object_r:sysfs_livedisplay_tuneable:s0 genfscon sysfs /devices/platform/soc/ae00000.qcom,mdss_mdp/drm/card0/card0-DSI-1/op_friginer_print_hbm u:object_r:sysfs_fod:s0 -genfscon sysfs /devices/platform/soc/soc:qcom,dsi-display-primary/display_mode u:object_r:sysfs_livedisplay_tuneable:s0 -genfscon sysfs /devices/platform/soc/soc:qcom,dsi-display-primary/hbm u:object_r:sysfs_livedisplay_tuneable:s0 -genfscon sysfs /devices/platform/soc/soc:qcom,dsi-display-secondary/display_mode u:object_r:sysfs_livedisplay_tuneable:s0 -genfscon sysfs /devices/platform/soc/soc:qcom,dsi-display-secondary/hbm u:object_r:sysfs_livedisplay_tuneable:s0 # Power supply genfscon sysfs /devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm8150b@2:qcom,qpnp-smb2/power_supply/dc u:object_r:sysfs_battery_supply:s0 diff --git a/sepolicy/private/hal_livedisplay_kona.te b/sepolicy/private/hal_livedisplay_kona.te index 4683a66..88dbf99 100644 --- a/sepolicy/private/hal_livedisplay_kona.te +++ b/sepolicy/private/hal_livedisplay_kona.te @@ -20,4 +20,7 @@ allow hal_livedisplay_kona display_misc_file:dir rw_dir_perms; allow hal_livedisplay_kona display_misc_file:file create_file_perms; # Grant access over LiveDisplay tuneables -allow hal_livedisplay_kona sysfs_livedisplay_tuneable:file rw_file_perms; +allow hal_livedisplay_kona { sysfs_livedisplay_tuneable sysfs_oem }:file rw_file_perms; + +# Allow hal_livedisplay_kona to set config_prop +set_prop(hal_livedisplay_kona, config_prop) diff --git a/sepolicy/private/property_contexts b/sepolicy/private/property_contexts new file mode 100644 index 0000000..8882946 --- /dev/null +++ b/sepolicy/private/property_contexts @@ -0,0 +1 @@ +sys.display.mode u:object_r:config_prop:s0