stone: parts: import dirac from marble

This commit is contained in:
kamikaonashi
2024-03-01 17:19:42 +01:00
parent 60db844c45
commit ad8602e112
20 changed files with 912 additions and 1 deletions

View File

@@ -43,6 +43,7 @@
<library name="shoebox" path="libshoebox.so"/>
<library name="v4a_re" path="libv4a_re.so"/>
<library name="spatializer" path="libspatialaudio.so"/>
<library name="misoundfx" path="libmisoundfx.so"/>
</libraries>
<effects>
<effectProxy name="bassboost" library="proxy" uuid="14804144-a5ee-4d24-aa88-0002a5d5c51b">
@@ -93,6 +94,7 @@
<effect name="shoebox" library="shoebox" uuid="1eab784c-1a36-4b2a-b7fc-e34c44cab89e"/>
<effect name="v4a_standard_re" library="v4a_re" uuid="90380da3-8536-4744-a6a3-5731970e640f"/>
<effect name="spatializer" library="spatializer" uuid="cc4677de-ff72-11eb-9a03-0242ac130003"/>
<effect name="misoundfx" library="misoundfx" uuid="5b8e36a5-144a-4c38-b1d7-0002a5d5c51b"/>
</effects>
<postprocess>
<stream type="music">

View File

@@ -49,6 +49,31 @@
android:authorities="${applicationId}.androidx-startup"
tools:replace="android:authorities"/>
<activity
android:name=".dirac.DiracActivity"
android:label="@string/dirac_title"
android:exported="true">
<intent-filter>
<action android:name="com.android.settings.action.IA_SETTINGS" />
</intent-filter>
<meta-data
android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.sound" />
<meta-data
android:name="com.android.settings.summary"
android:resource="@string/dirac_summary" />
</activity>
<service
android:name=".dirac.DiracTileService"
android:icon="@drawable/ic_qs_dirac"
android:label="@string/dirac_title"
android:exported="true"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE"/>
</intent-filter>
</service>
<activity
android:name=".thermal.ThermalActivity"
android:label="@string/thermal_title">

View File

@@ -0,0 +1,3 @@
-keep class org.lineageos.settings.dirac.* {
*;
}

View File

@@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#000"
android:pathData="M12 1.43c-2.39 0-4.68 0.94-6.36 2.63C3.94 5.75 3 8.04 3 10.43v7c0 1.1 0.9 2 2 2h4v-8H5v-1c0-3.87 3.13-7 7-7s7 3.13 7 7v1h-4v8h4c1.1 0 2-0.9 2-2v-7c0-2.4-0.95-4.68-2.64-6.37C16.68 2.37 14.4 1.43 12 1.43zm-5 12v4H5v-4h2zm12 4h-2v-4h2v4z"/>
<path
android:fillColor="#000"
android:pathData="M15 22.57v-2h2v2h-2zm-4 0v-2h2v2h-2zm-4 0v-2h2v2H7z"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="409.6dp"
android:height="133.7dp"
android:viewportWidth="409.6"
android:viewportHeight="133.7">
<path
android:fillColor="#000000"
android:pathData="M57.4,0.6C55.9,10.2 57.3,20.1 61.5,28.8 54.6,16.4 44.2,6.4 31.5,0L0,0v133.7,0c25.9,0 49.7,-14.2 62,-37 -5.5,11.5 -8.3,24.1 -8.1,36.8 36.8,-2.9 64.3,-35 61.4,-71.8C112.8,30.1 88.7,4.7 57.4,0.6ZM63.3,94C72.9,74.2 72.8,51.1 63,31.5c8.4,14.7 24,23.7 41,23.7 3.1,0 6.3,-0.3 9.4,-0.9C91.8,60 73.7,74.4 63.3,94ZM244.8,78.7h12.8l11.6,21.8h13.5L269.8,75.9c10.9,-6 14.9,-19.7 8.8,-30.6C274.7,38.1 267.1,33.7 259,33.7h-26.9v66.8h12.6L244.7,78.7ZM268.5,56.1c0.2,5.5 -4.2,10.1 -9.7,10.3 0,0 0,0 0,0L244.7,66.4L244.7,45.8h14c5.5,0.1 10,4.6 9.9,10.1 0,0 0,0 0,0zM309.1,33.6 L286.2,100.4h13.4l5,-15.5h24.7l5,15.5h13.2L324.7,33.6ZM308.4,73.3 L317,46.8 325.5,73.3zM399.8,78.7 L409.6,86.7C398.7,102.1 377.4,105.9 362,95 346.6,84.1 342.8,62.8 353.7,47.4 364.6,32 385.9,28.2 401.3,39.1c3.2,2.3 6,5.1 8.3,8.3l-9.8,8c-6.1,-9.9 -19.1,-13 -29.1,-6.8 -6.4,4 -10.2,11 -10,18.5 -0.3,11.7 9,21.3 20.6,21.6 0.1,0 0.2,0 0.4,0 7.4,-0.1 14.2,-3.8 18.1,-10zM198,67.1c0,-18.4 -14.9,-33.4 -33.3,-33.4 0,0 0,0 0,0h-24.3v66.8h24.3C183.1,100.4 198,85.5 198,67.1ZM153.1,88.4L153.1,45.8h11.5c11.4,0.1 20.6,9.5 20.5,20.9 0,0.1 0,0.2 0,0.3 0.3,11.5 -8.8,21 -20.2,21.2 -0.1,0 -0.2,0 -0.3,0zM207.2,33.6h12.7v66.8h-12.7z"/>
</vector>

View File

@@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#000"
android:pathData="M16.9 21.02V2.98h-2v18.04h2zm4 0v-9.7h-2v9.7h2zm-8 0v-16h-2v16h2zm-6 0h2V9h-2v12.03z"/>
<path
android:fillColor="#000"
android:pathData="M5.1 21.02h-2v-3.11h2v3.11z"/>
</vector>

View File

@@ -0,0 +1,10 @@
<!-- drawable/hifi.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?android:attr/colorControlNormal"
android:pathData="M17,2 L7,2 C5.9,2,5,2.9,5,4 L5,20 C5,21.1,5.9,21.99,7,21.99 L17,22 C18.1,22,19,21.1,19,20 L19,4 C19,2.9,18.1,2,17,2 Z M7,20 L7,4 L17,4 L17,20 L7,20 Z M12,9 C13.1,9,14,8.1,14,7 S13.1,5,12,5 C10.89,5,10,5.9,10,7 S10.89,9,12,9 Z M12,11 C9.79,11,8,12.79,8,15 S9.79,19,12,19 S16,17.21,16,15 S14.21,11,12,11 Z M12,17 C10.9,17,10,16.1,10,15 S10.9,13,12,13 S14,13.9,14,15 S13.1,17,12,17 Z" />
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#fff"
android:pathData="M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM7.76,16.24l-1.41,1.41C4.78,16.1 4,14.05 4,12c0,-2.05 0.78,-4.1 2.34,-5.66l1.41,1.41C6.59,8.93 6,10.46 6,12s0.59,3.07 1.76,4.24zM12,16c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4zM17.66,17.66l-1.41,-1.41C17.41,15.07 18,13.54 18,12s-0.59,-3.07 -1.76,-4.24l1.41,-1.41C19.22,7.9 20,9.95 20,12c0,2.05 -0.78,4.1 -2.34,5.66zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

View File

@@ -0,0 +1,9 @@
<!-- drawable/music_clef_bass.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?android:attr/colorControlNormal">
<path android:fillColor="#000" android:pathData="M18.5 5A1.5 1.5 0 1 1 17 6.5A1.5 1.5 0 0 1 18.5 5M18.5 11A1.5 1.5 0 1 1 17 12.5A1.5 1.5 0 0 1 18.5 11M10 4A5 5 0 0 0 5 9V10A2 2 0 1 0 7.18 8A3 3 0 0 1 10 6A4 4 0 0 1 14 10C14 13.59 11.77 16.19 7 18.2L7.76 20.04C13.31 17.72 16 14.43 16 10A6 6 0 0 0 10 4Z" />
</vector>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="96dp"
android:layout_marginEnd="96dp"
android:src="@drawable/ic_dirac_logo"
android:tint="?android:attr/colorAccent" />
</FrameLayout>

View File

@@ -0,0 +1,105 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2020 The LineageOS Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<!-- Ambient settings -->
<string name="ambient_display_title">主动显示</string>
<string name="ambient_display_enable_title">使用主动显示</string>
<!-- Dirac settings -->
<string name="dirac_enable">启用米音</string>
<string name="dirac_title">米音</string>
<string name="dirac_summary">使用米音和 Hi-Fi 来优化音质</string>
<string name="dirac_headset_title">耳机类型</string>
<string name="dirac_preset_title">声音预设</string>
<string name="dirac_hifi_enable_title">启用 Hi-Fi</string>
<string name="dirac_hifi_summary">减少噪音和失真,提高音频质量</string>
<!-- Dirac settings: Headset types -->
<string name="dirac_headset_default">默认</string>
<string name="dirac_headset_earbuds">灵动耳塞式</string>
<string name="dirac_headset_in_ear_2013">灵悦入耳式</string>
<string name="dirac_headset_piston_1">小米活塞1</string>
<string name="dirac_headset_general">通用耳塞式</string>
<string name="dirac_headset_general_inear">通用入耳式</string>
<string name="dirac_headset_piston_basic">小米活塞简装版</string>
<string name="dirac_headset_piston_2">小米活塞2</string>
<string name="dirac_headset_piston_standard">小米活塞标准版</string>
<string name="dirac_headset_headphone">小米头戴式</string>
<string name="dirac_headset_piston_youth">小米活塞青春版</string>
<string name="dirac_headset_piston_color">小米活塞炫彩版</string>
<string name="dirac_headset_in_ear">小米圈铁</string>
<string name="dirac_headset_capsule">小米胶囊</string>
<string name="dirac_headset_in_ear_pro">小米圈铁Pro</string>
<string name="dirac_headset_comfort">小米头戴轻松版</string>
<string name="dirac_headset_reduction_noise">小米降噪 typeC</string>
<string name="dirac_headset_cancelling">小米降噪 3.5mm</string>
<string name="dirac_headset_half_in_ear">小米半入耳式</string>
<string name="dirac_headset_in_ear2">小米圈铁2</string>
<string name="dirac_headset_earphone_basic">小米耳机基本款</string>
<string name="dirac_headset_earphone">小米耳机</string>
<string name="dirac_headset_ear_four">小米四驱耳机</string>
<string name="dirac_headset_piston_typec">小米入耳式耳机 (Type-C)</string>
<string name="dirac_headset_bluetooth_collar">小米蓝牙项圈耳机</string>
<string name="dirac_headset_bluetooth_linefree">小米蓝牙耳机</string>
<string name="dirac_headset_redmi_earphones">红米耳机</string>
<string name="dirac_headset_dual_driver_in_ear">小米双单元耳机 (印度版)</string>
<!-- Dirac settings: Equalizer presets -->
<string name="dirac_preset_default">默认</string>
<string name="dirac_preset_rock">摇滚</string>
<string name="dirac_preset_jazz">爵士</string>
<string name="dirac_preset_pop">流行</string>
<string name="dirac_preset_classical">古典</string>
<string name="dirac_preset_hiphop">嘻哈</string>
<string name="dirac_preset_blues">蓝调</string>
<string name="dirac_preset_electronic">电子</string>
<string name="dirac_preset_country">乡村</string>
<string name="dirac_preset_dance">舞曲</string>
<string name="dirac_preset_metal">金属</string>
<string name="dirac_preset_bass_booster">低音强化</string>
<string name="dirac_preset_live">现场</string>
<string name="dirac_preset_balanced">均衡</string>
<string name="dirac_preset_bass_reduction">低音弱化</string>
<string name="dirac_preset_treble_reduction">高音弱化</string>
<string name="dirac_preset_soft_bass">柔和低音</string>
<string name="dirac_preset_soft_treble">柔和高音</string>
<!-- Dirac settings: Sound Scenes -->
<string name="music_headset_scenario_select">场景选择</string>
<string name="music_headset_scenario_intelligent">动态</string>
<string name="music_headset_scenario_music">音乐</string>
<string name="music_headset_scenario_video">视频</string>
<string name="music_headset_scenario_vocal">人声</string>
<!-- Thermal Profiles -->
<string name="thermal_title">温控配置</string>
<string name="thermal_summary">调整每个应用使用的温控文件以获得最体验</string>
<string name="thermal_default">默认</string>
<string name="thermal_benchmark">性能</string>
<string name="thermal_browser">浏览器</string>
<string name="thermal_camera">相机</string>
<string name="thermal_dialer">电话</string>
<string name="thermal_gaming">游戏</string>
<string name="thermal_streaming">流媒体</string>
<!-- Clear Speaker -->
<string name="clear_speaker_title">扬声器清理</string>
<string name="clear_speaker_summary">开启后自动播放30s音频清理扬声器出音孔灰尘</string>
<string name="clear_speaker_description">功能说明:\n\n 1.当出现轻微堵孔时,建议执行该功能一到两次;\n\n 2.当出现严重堵孔时,建议执行该功能两到五次,同时完成手握手机向下甩的动作</string>
<!-- Refresh rate -->
<string name="refresh_title">刷新率设置</string>
<string name="refresh_summary">设置特定应用的最大刷新率</string>
<string name="refresh_default">默认</string>
</resources>

128
parts/res/values/arrays.xml Normal file
View File

@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2021 The LineageOS Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<!-- Values for Dirac headset pref -->
<string-array name="dirac_headset_pref_entries" translatable="false">
<item>@string/dirac_headset_earbuds</item>
<item>@string/dirac_headset_in_ear_2013</item>
<item>@string/dirac_headset_piston_1</item>
<item>@string/dirac_headset_piston_basic</item>
<item>@string/dirac_headset_piston_2</item>
<item>@string/dirac_headset_piston_standard</item>
<item>@string/dirac_headset_general_inear</item>
<item>@string/dirac_headset_piston_youth</item>
<item>@string/dirac_headset_piston_color</item>
<item>@string/dirac_headset_in_ear</item>
<item>@string/dirac_headset_capsule</item>
<item>@string/dirac_headset_in_ear_pro</item>
<item>@string/dirac_headset_comfort</item>
<item>@string/dirac_headset_reduction_noise</item>
<item>@string/dirac_headset_cancelling</item>
<item>@string/dirac_headset_half_in_ear</item>
<item>@string/dirac_headset_in_ear2</item>
<item>@string/dirac_headset_earphone_basic</item>
<item>@string/dirac_headset_earphone</item>
<item>@string/dirac_headset_ear_four</item>
<item>@string/dirac_headset_piston_typec</item>
<item>@string/dirac_headset_bluetooth_collar</item>
<item>@string/dirac_headset_bluetooth_linefree</item>
<item>@string/dirac_headset_redmi_earphones</item>
<item>@string/dirac_headset_dual_driver_in_ear</item>
</string-array>
<string-array name="dirac_headset_pref_values" translatable="false">
<item>0</item>
<item>1</item>
<item>2</item>
<item>4</item>
<item>5</item>
<item>8</item>
<item>9</item>
<item>10</item>
<item>11</item>
<item>12</item>
<item>13</item>
<item>14</item>
<item>15</item>
<item>16</item>
<item>17</item>
<item>18</item>
<item>19</item>
<item>20</item>
<item>21</item>
<item>24</item>
<item>25</item>
<item>26</item>
<item>27</item>
<item>28</item>
<item>29</item>
</string-array>
<!-- Values for Dirac preset pref -->
<string-array name="dirac_preset_pref_entries" translatable="false">
<item>@string/dirac_preset_default</item>
<item>@string/dirac_preset_rock</item>
<item>@string/dirac_preset_jazz</item>
<item>@string/dirac_preset_pop</item>
<item>@string/dirac_preset_classical</item>
<item>@string/dirac_preset_hiphop</item>
<item>@string/dirac_preset_blues</item>
<item>@string/dirac_preset_electronic</item>
<item>@string/dirac_preset_country</item>
<item>@string/dirac_preset_dance</item>
<item>@string/dirac_preset_metal</item>
<item>@string/dirac_preset_bass_booster</item>
<item>@string/dirac_preset_balanced</item>
<item>@string/dirac_preset_live</item>
<item>@string/dirac_preset_bass_reduction</item>
<item>@string/dirac_preset_treble_reduction</item>
<item>@string/dirac_preset_soft_bass</item>
<item>@string/dirac_preset_soft_treble</item>
</string-array>
<string-array name="dirac_preset_pref_values" translatable="false">
<item>"0,0,0,0,0,0,0"</item>
<item>"4,2,-2,0,-2,-2,4"</item>
<item>"0,0,0,-2,-3,0,0"</item>
<item>"0,-3,-5,0,0,-3,0"</item>
<item>"0,0,0,0,3,6,6"</item>
<item>"3,3,-3,0,-3,0,2"</item>
<item>"2,4,-6,4,0,1,2"</item>
<item>"3,3,-1,0,-3,0,0"</item>
<item>"0,0,-2,-2,2,2,0"</item>
<item>"0,4,2,0,-2,-2,4"</item>
<item>"2,0,0,-2,-4,0,0"</item>
<item>"10,8,-3,0,-3,5,5"</item>
<item>"3,1,0,0,0,1,3"</item>
<item>"-4,-2,2,2,2,1,1"</item>
<item>"-5,-3,0,0,0,0,0"</item>
<item>"0,0,0,0,0,-5,-3"</item>
<item>"3,3,1,-3,-3,0,0"</item>
<item>"0,0,-1,-4,-4,5,4"</item>
</string-array>
<string-array name="scenario_selector_titles" translatable="false">
<item>@string/music_headset_scenario_intelligent</item>
<item>@string/music_headset_scenario_music</item>
<item>@string/music_headset_scenario_video</item>
<item>@string/music_headset_scenario_vocal</item>
</string-array>
<string-array name="scenario_selector_values" translatable="false">
<item>4</item>
<item>1</item>
<item>2</item>
<item>3</item>
</string-array>
</resources>

View File

@@ -20,7 +20,74 @@
<string name="htsr_title">Touch Responsiveness</string>
<string name="htsr_enable_title">Increase Touch Responsiveness</string>
<string name="htsr_enable_summary">Increases touch polling rate to decrease latency</string>
<!-- Dirac settings -->
<string name="dirac_enable">Enable dirac</string>
<string name="dirac_title">Dirac™ Sound</string>
<string name="dirac_summary">Optimize audio quality</string>
<string name="dirac_headset_title">Choose headphones type</string>
<string name="dirac_preset_title">Choose a preset</string>
<string name="dirac_hifi_enable_title">Enable Hi-fi</string>
<string name="dirac_hifi_title">Hi-Fi</string>
<string name="dirac_hifi_summary">Decrease noise and Distortion and increase audio quality</string>
<!-- Dirac settings: Headset types -->
<string name="dirac_headset_default">Default</string>
<string name="dirac_headset_earbuds">Mi Earbuds</string>
<string name="dirac_headset_in_ear_2013">Mi In-Ear (2013)</string>
<string name="dirac_headset_piston_1">Mi Piston-1</string>
<string name="dirac_headset_general">General</string>
<string name="dirac_headset_general_inear">General In-Ear</string>
<string name="dirac_headset_piston_basic">Basic Edition</string>
<string name="dirac_headset_piston_2">Mi Piston-2</string>
<string name="dirac_headset_piston_standard">Standard Edition</string>
<string name="dirac_headset_headphone">Mi Headphones</string>
<string name="dirac_headset_piston_youth">Youth Edition</string>
<string name="dirac_headset_piston_color">Color Edition</string>
<string name="dirac_headset_in_ear">Mi In-Ear</string>
<string name="dirac_headset_capsule">Mi Capsule</string>
<string name="dirac_headset_in_ear_pro">Mi In-Ear Pro</string>
<string name="dirac_headset_comfort">Mi Comfort</string>
<string name="dirac_headset_reduction_noise">Mi Noise Cancelling Type-C</string>
<string name="dirac_headset_cancelling">Mi Noise Cancelling 3.5mm</string>
<string name="dirac_headset_half_in_ear">Mi Half In-Ear</string>
<string name="dirac_headset_in_ear2">Mi In-Ear 2</string>
<string name="dirac_headset_earphone_basic">Mi Earphones Basic</string>
<string name="dirac_headset_earphone">Mi Earphones</string>
<string name="dirac_headset_ear_four">Mi Quadruple Driver Earphones</string>
<string name="dirac_headset_piston_typec">Mi In-Ear Headphones (Type-C)</string>
<string name="dirac_headset_bluetooth_collar">Mi Bluetooth Neckband</string>
<string name="dirac_headset_bluetooth_linefree">Mi Bluetooth Earphones</string>
<string name="dirac_headset_redmi_earphones">Redmi Earphones</string>
<string name="dirac_headset_dual_driver_in_ear">Mi Dual Driver In-ear Earphones</string>
<!-- Dirac settings: Equalizer presets -->
<string name="dirac_preset_default">Default</string>
<string name="dirac_preset_rock">Rock</string>
<string name="dirac_preset_jazz">Jazz</string>
<string name="dirac_preset_pop">Pop</string>
<string name="dirac_preset_classical">Classical</string>
<string name="dirac_preset_hiphop">Hip Hop</string>
<string name="dirac_preset_blues">Blues</string>
<string name="dirac_preset_electronic">Electronic</string>
<string name="dirac_preset_country">Country</string>
<string name="dirac_preset_dance">Dance</string>
<string name="dirac_preset_metal">Metal</string>
<string name="dirac_preset_bass_booster">Bass Booster</string>
<string name="dirac_preset_live">Live</string>
<string name="dirac_preset_balanced">Balanced</string>
<string name="dirac_preset_bass_reduction">Bass Reduction</string>
<string name="dirac_preset_treble_reduction">Treble Reduction</string>
<string name="dirac_preset_soft_bass">Soft Bass</string>
<string name="dirac_preset_soft_treble">Soft Treble</string>
<!-- Dirac settings: Sound Scenes -->
<string name="music_headset_scenario_select">Choose scene</string>
<string name="music_headset_scenario_intelligent">Smart</string>
<string name="music_headset_scenario_music">Music</string>
<string name="music_headset_scenario_video">Video</string>
<string name="music_headset_scenario_vocal">Voice</string>
<!-- Thermal Profiles -->
<string name="thermal_title">Thermal Profiles</string>
<string name="thermal_summary">Adjust per-app thermal profiles for optimum performance</string>

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 The LineageOS Project
Licensed under the Apache License, Version 2.0 (the "License"
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:title="@string/dirac_title">
<com.android.settingslib.widget.LayoutPreference
android:key="dirac_logo"
android:layout="@layout/dirac_logo"
android:selectable="false" />
<com.android.settingslib.widget.MainSwitchPreference
android:defaultValue="false"
android:key="dirac_enable"
android:title="@string/dirac_enable" />
<ListPreference
android:key="scenario_selection"
android:entries="@array/scenario_selector_titles"
android:entryValues="@array/scenario_selector_values"
android:defaultValue="4"
android:icon="@drawable/ic_scenes"
android:title="@string/music_headset_scenario_select"
android:summary="%s" />
<ListPreference
android:key="dirac_headset_pref"
android:entries="@array/dirac_headset_pref_entries"
android:entryValues="@array/dirac_headset_pref_values"
android:defaultValue="0"
android:icon="@drawable/ic_dirac_headphone"
android:title="@string/dirac_headset_title"
android:summary="%s" />
<ListPreference
android:key="dirac_preset_pref"
android:entries="@array/dirac_preset_pref_entries"
android:entryValues="@array/dirac_preset_pref_values"
android:defaultValue="0,0,0,0,0,0,0"
android:icon="@drawable/ic_dirac_preset"
android:title="@string/dirac_preset_title"
android:summary="%s" />
<PreferenceCategory
android:key="dirac_hifi"
android:title="@string/dirac_hifi_title">
<SwitchPreference
android:key="dirac_hifi_pref"
android:defaultValue="false"
android:icon="@drawable/ic_hifi"
android:title="@string/dirac_hifi_enable_title"
android:summary="@string/dirac_hifi_summary"/>
</PreferenceCategory>
</PreferenceScreen>

View File

@@ -24,6 +24,7 @@ import android.util.Log;
import org.lineageos.settings.thermal.ThermalUtils;
import org.lineageos.settings.refreshrate.RefreshUtils;
import org.lineageos.settings.dirac.DiracUtils;
public class BootCompletedReceiver extends BroadcastReceiver {
private static final boolean DEBUG = false;
@@ -34,7 +35,17 @@ public class BootCompletedReceiver extends BroadcastReceiver {
if (DEBUG)
Log.d(TAG, "Received boot completed intent");
// Dirac
try {
DiracUtils.getInstance(context);
} catch (Exception e) {
Log.d(TAG, "Dirac is not present in system");
}
// Thermal Profiles
ThermalUtils.startService(context);
// Refresh Rate
RefreshUtils.initialize(context);
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (C) 2018-2023 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lineageos.settings.dirac;
import android.os.Bundle;
import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity;
import com.android.settingslib.widget.R;
public class DiracActivity extends CollapsingToolbarBaseActivity {
private static final String TAG_DIRAC = "dirac";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(R.id.content_frame,
new DiracSettingsFragment(), TAG_DIRAC).commit();
}
}

View File

@@ -0,0 +1,127 @@
/*
* Copyright (C) 2018,2020 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lineageos.settings.dirac;
import android.os.Bundle;
import android.widget.Switch;
import android.util.Log;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.PreferenceFragment;
import androidx.preference.SwitchPreference;
import com.android.settingslib.widget.MainSwitchPreference;
import com.android.settingslib.widget.OnMainSwitchChangeListener;
import org.lineageos.settings.R;
public class DiracSettingsFragment extends PreferenceFragment implements
OnPreferenceChangeListener, OnMainSwitchChangeListener {
private static final String TAG = "DiracSettingsFragment";
private static final String PREF_ENABLE = "dirac_enable";
private static final String PREF_HEADSET = "dirac_headset_pref";
private static final String PREF_HIFI = "dirac_hifi_pref";
private static final String PREF_PRESET = "dirac_preset_pref";
private static final String PREF_SCENE = "scenario_selection";
private MainSwitchPreference mSwitchBar;
private ListPreference mHeadsetType;
private ListPreference mPreset;
private SwitchPreference mHifi;
private ListPreference mScenes;
private DiracUtils mDiracUtils;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.dirac_settings);
try {
mDiracUtils = DiracUtils.getInstance(getActivity());
} catch (Exception e) {
Log.d(TAG, "Dirac is not present in system");
}
boolean enhancerEnabled = mDiracUtils != null ? mDiracUtils.isDiracEnabled() : false;
mSwitchBar = (MainSwitchPreference) findPreference(PREF_ENABLE);
mSwitchBar.addOnSwitchChangeListener(this);
mSwitchBar.setChecked(enhancerEnabled);
mHeadsetType = (ListPreference) findPreference(PREF_HEADSET);
mHeadsetType.setOnPreferenceChangeListener(this);
mPreset = (ListPreference) findPreference(PREF_PRESET);
mPreset.setOnPreferenceChangeListener(this);
mHifi = (SwitchPreference) findPreference(PREF_HIFI);
mHifi.setOnPreferenceChangeListener(this);
boolean hifiEnable = mDiracUtils != null ? mDiracUtils.getHifiMode() : false;
mHeadsetType.setEnabled(!hifiEnable && enhancerEnabled);
mPreset.setEnabled(!hifiEnable && enhancerEnabled);
mHifi.setEnabled(enhancerEnabled);
mScenes = (ListPreference) findPreference(PREF_SCENE);
mScenes.setOnPreferenceChangeListener(this);
mScenes.setEnabled(enhancerEnabled);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (mDiracUtils == null) return false;
switch (preference.getKey()) {
case PREF_HEADSET:
mDiracUtils.setHeadsetType(Integer.parseInt(newValue.toString()));
return true;
case PREF_HIFI:
mDiracUtils.setHifiMode((Boolean) newValue ? 1 : 0);
if (mDiracUtils.isDiracEnabled()) {
mHeadsetType.setEnabled(!(Boolean) newValue);
mPreset.setEnabled(!(Boolean) newValue);
}
return true;
case PREF_PRESET:
mDiracUtils.setLevel((String) newValue);
return true;
case PREF_SCENE:
mDiracUtils.setScenario(Integer.parseInt(newValue.toString()));
return true;
default:
return false;
}
}
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
mSwitchBar.setChecked(isChecked);
if (mDiracUtils == null) return;
mDiracUtils.setEnabled(isChecked);
mHifi.setEnabled(isChecked);
mHeadsetType.setEnabled(isChecked);
mPreset.setEnabled(isChecked);
mScenes.setEnabled(isChecked);
if (!isChecked) {
mHifi.setChecked(false);
mDiracUtils.setHifiMode(0);
}
}
}

View File

@@ -0,0 +1,77 @@
/*
* Copyright (C) 2018 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lineageos.settings.dirac;
import android.media.audiofx.AudioEffect;
import java.util.UUID;
public class DiracSound extends AudioEffect {
private static final int DIRACSOUND_PARAM_HEADSET_TYPE = 1;
private static final int DIRACSOUND_PARAM_EQ_LEVEL = 2;
private static final int DIRACSOUND_PARAM_MUSIC = 4;
private static final int DIRACSOUND_PARAM_HIFI = 8;
private static final int DIRACSOUND_PARAM_SCENE = 15;
private static final UUID EFFECT_TYPE_DIRACSOUND =
UUID.fromString("5b8e36a5-144a-4c38-b1d7-0002a5d5c51b");
private static final String TAG = "DiracSound";
public DiracSound(int priority, int audioSession) {
super(EFFECT_TYPE_NULL, EFFECT_TYPE_DIRACSOUND, priority, audioSession);
}
public int getMusic() throws IllegalStateException,
IllegalArgumentException, UnsupportedOperationException,
RuntimeException {
int[] value = new int[1];
checkStatus(getParameter(DIRACSOUND_PARAM_MUSIC, value));
return value[0];
}
public void setMusic(int enable) throws IllegalStateException,
IllegalArgumentException, UnsupportedOperationException,
RuntimeException {
checkStatus(setParameter(DIRACSOUND_PARAM_MUSIC, enable));
}
public void setHeadsetType(int type) throws IllegalStateException,
IllegalArgumentException, UnsupportedOperationException,
RuntimeException {
checkStatus(setParameter(DIRACSOUND_PARAM_HEADSET_TYPE, type));
}
public void setLevel(int band, float level) throws IllegalStateException,
IllegalArgumentException, UnsupportedOperationException,
RuntimeException {
checkStatus(setParameter(new int[]{DIRACSOUND_PARAM_EQ_LEVEL, band},
String.valueOf(level).getBytes()));
}
public void setHifiMode(int mode) throws IllegalStateException,
IllegalArgumentException, UnsupportedOperationException,
RuntimeException {
checkStatus(setParameter(DIRACSOUND_PARAM_HIFI, mode));
}
public void setScenario(int scene) throws IllegalStateException,
IllegalArgumentException, UnsupportedOperationException,
RuntimeException {
checkStatus(setParameter(DIRACSOUND_PARAM_SCENE, scene));
}
}

View File

@@ -0,0 +1,38 @@
package org.lineageos.settings.dirac;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
public class DiracTileService extends TileService {
private DiracUtils mDiracUtils;
@Override
public void onStartListening() {
mDiracUtils = DiracUtils.getInstance(getApplicationContext());
Tile tile = getQsTile();
if (mDiracUtils.isDiracEnabled()) {
tile.setState(Tile.STATE_ACTIVE);
} else {
tile.setState(Tile.STATE_INACTIVE);
}
tile.updateTile();
super.onStartListening();
}
@Override
public void onClick() {
Tile tile = getQsTile();
if (mDiracUtils.isDiracEnabled()) {
mDiracUtils.setEnabled(false);
tile.setState(Tile.STATE_INACTIVE);
} else {
mDiracUtils.setEnabled(true);
tile.setState(Tile.STATE_ACTIVE);
}
tile.updateTile();
super.onClick();
}
}

View File

@@ -0,0 +1,148 @@
/*
* Copyright (C) 2018,2020 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.lineageos.settings.dirac;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.UserHandle;
import android.os.SystemClock;
import android.view.KeyEvent;
import android.media.AudioManager;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import java.util.List;
public class DiracUtils {
private static DiracUtils mInstance;
private DiracSound mDiracSound;
private MediaSessionManager mMediaSessionManager;
private Handler mHandler = new Handler();
private Context mContext;
public DiracUtils(Context context) {
mContext = context;
mMediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
mDiracSound = new DiracSound(0, 0);
}
public static synchronized DiracUtils getInstance(Context context) {
if (mInstance == null) {
mInstance = new DiracUtils(context);
}
return mInstance;
}
private void triggerPlayPause(MediaController controller) {
long when = SystemClock.uptimeMillis();
final KeyEvent evDownPause = new KeyEvent(when, when, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE, 0);
final KeyEvent evUpPause = KeyEvent.changeAction(evDownPause, KeyEvent.ACTION_UP);
final KeyEvent evDownPlay = new KeyEvent(when, when, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY, 0);
final KeyEvent evUpPlay = KeyEvent.changeAction(evDownPlay, KeyEvent.ACTION_UP);
mHandler.post(new Runnable() {
@Override
public void run() {
controller.dispatchMediaButtonEvent(evDownPause);
}
});
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
controller.dispatchMediaButtonEvent(evUpPause);
}
}, 20);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
controller.dispatchMediaButtonEvent(evDownPlay);
}
}, 1000);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
controller.dispatchMediaButtonEvent(evUpPlay);
}
}, 1020);
}
private int getMediaControllerPlaybackState(MediaController controller) {
if (controller != null) {
final PlaybackState playbackState = controller.getPlaybackState();
if (playbackState != null) {
return playbackState.getState();
}
}
return PlaybackState.STATE_NONE;
}
private void refreshPlaybackIfNecessary() {
if (mMediaSessionManager == null) return;
final List<MediaController> sessions
= mMediaSessionManager.getActiveSessionsForUser(
null, UserHandle.ALL);
for (MediaController aController : sessions) {
if (PlaybackState.STATE_PLAYING ==
getMediaControllerPlaybackState(aController)) {
triggerPlayPause(aController);
break;
}
}
}
public void setEnabled(boolean enable) {
mDiracSound.setEnabled(enable);
mDiracSound.setMusic(enable ? 1 : 0);
if (enable) {
refreshPlaybackIfNecessary();
}
}
public boolean isDiracEnabled() {
return mDiracSound != null && mDiracSound.getMusic() == 1;
}
public void setLevel(String preset) {
String[] level = preset.split("\\s*,\\s*");
for (int band = 0; band <= level.length - 1; band++) {
mDiracSound.setLevel(band, Float.valueOf(level[band]));
}
}
public void setHeadsetType(int paramInt) {
mDiracSound.setHeadsetType(paramInt);
}
public boolean getHifiMode() {
AudioManager audioManager = mContext.getSystemService(AudioManager.class);
return audioManager.getParameters("hifi_mode").contains("true");
}
public void setHifiMode(int paramInt) {
AudioManager audioManager = mContext.getSystemService(AudioManager.class);
audioManager.setParameters("hifi_mode=" + (paramInt == 1 ? true : false));
mDiracSound.setHifiMode(paramInt);
}
public void setScenario(int sceneInt) {
mDiracSound.setScenario(sceneInt);
}
}