Merge in upstream changes
From :https://github.com/phhusson/treble_patches
Change-Id: I785ed4d854f28f661b1b48530dc10a5adf076e74
diff --git a/patches/platform_build/0001-Revert-Remove-root-folder-bt_firmware-in-GSI.patch b/patches/platform_build/0001-Revert-Remove-root-folder-bt_firmware-in-GSI.patch
index 73a2169..a562e71 100644
--- a/patches/platform_build/0001-Revert-Remove-root-folder-bt_firmware-in-GSI.patch
+++ b/patches/platform_build/0001-Revert-Remove-root-folder-bt_firmware-in-GSI.patch
@@ -13,7 +13,7 @@
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/target/board/generic_arm64_ab/BoardConfig.mk b/target/board/generic_arm64_ab/BoardConfig.mk
-index fc6b58284b..820019676a 100644
+index fc6b582..8200196 100644
--- a/target/board/generic_arm64_ab/BoardConfig.mk
+++ b/target/board/generic_arm64_ab/BoardConfig.mk
@@ -33,7 +33,7 @@ TARGET_NO_RECOVERY := true
@@ -26,7 +26,7 @@
# Set this to create /cache mount point for non-A/B devices that mounts /cache.
diff --git a/target/board/generic_arm64_ab/sepolicy/file.te b/target/board/generic_arm64_ab/sepolicy/file.te
-index 7adfdfa4e6..46455339a0 100644
+index 7adfdfa..4645533 100644
--- a/target/board/generic_arm64_ab/sepolicy/file.te
+++ b/target/board/generic_arm64_ab/sepolicy/file.te
@@ -1,5 +1,6 @@
@@ -37,7 +37,7 @@
# Default type for anything under /firmware.
diff --git a/target/board/generic_arm64_ab/sepolicy/file_contexts b/target/board/generic_arm64_ab/sepolicy/file_contexts
-index 0a80559e17..92a4ff8726 100644
+index 0a80559..92a4ff8 100644
--- a/target/board/generic_arm64_ab/sepolicy/file_contexts
+++ b/target/board/generic_arm64_ab/sepolicy/file_contexts
@@ -2,6 +2,7 @@
@@ -49,5 +49,5 @@
/dsp u:object_r:rootfs:s0
--
-2.17.1
+2.7.4
diff --git a/patches/platform_build/0002-Set-ro.build.fingerprint-in-system-etc-prop.default.patch b/patches/platform_build/0002-Set-ro.build.fingerprint-in-system-etc-prop.default.patch
index cc97661..da04fd7 100644
--- a/patches/platform_build/0002-Set-ro.build.fingerprint-in-system-etc-prop.default.patch
+++ b/patches/platform_build/0002-Set-ro.build.fingerprint-in-system-etc-prop.default.patch
@@ -9,7 +9,7 @@
1 file changed, 1 insertion(+)
diff --git a/core/Makefile b/core/Makefile
-index 0a2f6e39d0..059aa98c29 100644
+index 0a2f6e3..059aa98 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -176,6 +176,7 @@ $(INSTALLED_DEFAULT_PROP_TARGET): $(intermediate_system_build_prop)
@@ -21,5 +21,5 @@
ifdef property_overrides_split_enabled
$(hide) mkdir -p $(TARGET_ROOT_OUT)
--
-2.17.1
+2.7.4
diff --git a/patches/platform_external_selinux/0001-Enable-multipl_decls-by-default.-This-is-needed-beca.patch b/patches/platform_external_selinux/0001-Enable-multipl_decls-by-default.-This-is-needed-beca.patch
index 81e554c..abd4692 100644
--- a/patches/platform_external_selinux/0001-Enable-multipl_decls-by-default.-This-is-needed-beca.patch
+++ b/patches/platform_external_selinux/0001-Enable-multipl_decls-by-default.-This-is-needed-beca.patch
@@ -10,7 +10,7 @@
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/secilc/secilc.c b/secilc/secilc.c
-index 0be6975b..e30572e5 100644
+index 0be6975..e30572e 100644
--- a/secilc/secilc.c
+++ b/secilc/secilc.c
@@ -90,7 +90,7 @@ int main(int argc, char *argv[])
@@ -23,5 +23,5 @@
int preserve_tunables = 0;
int handle_unknown = -1;
--
-2.17.1
+2.7.4
diff --git a/patches/platform_external_selinux/0002-Increase-default-log_level-to-get-actual-selinux-err.patch b/patches/platform_external_selinux/0002-Increase-default-log_level-to-get-actual-selinux-err.patch
index dd8304e..91fea13 100644
--- a/patches/platform_external_selinux/0002-Increase-default-log_level-to-get-actual-selinux-err.patch
+++ b/patches/platform_external_selinux/0002-Increase-default-log_level-to-get-actual-selinux-err.patch
@@ -9,7 +9,7 @@
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/secilc/secilc.c b/secilc/secilc.c
-index e30572e5..4a1b09e1 100644
+index e30572e..4a1b09e 100644
--- a/secilc/secilc.c
+++ b/secilc/secilc.c
@@ -101,7 +101,7 @@ int main(int argc, char *argv[])
@@ -22,5 +22,5 @@
{"help", no_argument, 0, 'h'},
{"verbose", no_argument, 0, 'v'},
--
-2.17.1
+2.7.4
diff --git a/patches/platform_frameworks_av/0001-FIH-devices-Fix-Earpiece-audio-output.patch b/patches/platform_frameworks_av/0001-FIH-devices-Fix-Earpiece-audio-output.patch
index 0cf64b4..c5ad3b8 100644
--- a/patches/platform_frameworks_av/0001-FIH-devices-Fix-Earpiece-audio-output.patch
+++ b/patches/platform_frameworks_av/0001-FIH-devices-Fix-Earpiece-audio-output.patch
@@ -1,7 +1,7 @@
From 71286a6af35eeebf33171848285c9e6dc0da1366 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 24 Apr 2018 00:14:28 +0200
-Subject: [PATCH 1/2] FIH devices: Fix "Earpiece" audio output
+Subject: [PATCH 1/4] FIH devices: Fix "Earpiece" audio output
On some FIH devices (confirmed on Razer, and probably on Aquos SS2),
Earpiece is not listed in attachedDevices, and devicePort's profile
@@ -12,11 +12,11 @@
Change-Id: I4a88ba6d34d0fcd346eeea2ca903772f0271040a
---
- .../managerdefinitions/src/Serializer.cpp | 25 ++++++++++++++++---
+ .../common/managerdefinitions/src/Serializer.cpp | 25 +++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
-index a2531131d..380e2f82b 100644
+index a253113..380e2f8 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -191,16 +191,25 @@ const char AudioProfileTraits::Attributes::name[] = "name";
@@ -74,5 +74,5 @@
}
--
-2.17.1
+2.7.4
diff --git a/patches/platform_frameworks_av/0002-Fix-WiFi-Display-on-Huawei-devices-EMUI-8.0.patch b/patches/platform_frameworks_av/0002-Fix-WiFi-Display-on-Huawei-devices-EMUI-8.0.patch
index 3b0f416..ddae3c7 100644
--- a/patches/platform_frameworks_av/0002-Fix-WiFi-Display-on-Huawei-devices-EMUI-8.0.patch
+++ b/patches/platform_frameworks_av/0002-Fix-WiFi-Display-on-Huawei-devices-EMUI-8.0.patch
@@ -1,7 +1,7 @@
From 3e6bf2b4bd5cc97399e8bfe0dace8f4b2c6f69cc Mon Sep 17 00:00:00 2001
From: Alexander Pohl <pohl199885@gmail.com>
Date: Fri, 15 Jun 2018 19:58:07 +0200
-Subject: [PATCH 2/2] Fix WiFi-Display on Huawei devices (EMUI 8.0)
+Subject: [PATCH 2/4] Fix WiFi-Display on Huawei devices (EMUI 8.0)
Huaweis media stack doesn't handle intra-refresh-mode, so skip the error instead.
@@ -11,7 +11,7 @@
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
-index 7f39d109f..ed54fb58a 100644
+index 7f39d10..ed54fb5 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -4279,9 +4279,8 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) {
@@ -27,5 +27,5 @@
}
--
-2.17.1
+2.7.4
diff --git a/patches/platform_frameworks_av/0003-Kirin-Remove-lock-to-prevent-self-lock.patch b/patches/platform_frameworks_av/0003-Kirin-Remove-lock-to-prevent-self-lock.patch
new file mode 100644
index 0000000..4320ceb
--- /dev/null
+++ b/patches/platform_frameworks_av/0003-Kirin-Remove-lock-to-prevent-self-lock.patch
@@ -0,0 +1,34 @@
+From 3ff17862deda0303940be62e8f6cbb4eed06e292 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 19 Aug 2018 22:59:06 +0200
+Subject: [PATCH 3/4] ::Kirin:: Remove lock to prevent self-lock
+
+With Huawei Camera HAL, we get the following call order:
+cameraserver CameraService::enumerateProviders (*)
+=> HAL ICameraProvider::getVendorTags
+=> HAL ICameraProviderCallback::cameraDeviceStatusChange
+=> cameraserver CameraService::addState
+=> cameraserver CameraService::updateCameraNumAndIds (*)
+
+The two functions marked with (*) take mServiceLock
+Hence the safe-lock
+---
+ services/camera/libcameraservice/CameraService.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
+index c41de82..edbafbc 100644
+--- a/services/camera/libcameraservice/CameraService.cpp
++++ b/services/camera/libcameraservice/CameraService.cpp
+@@ -218,7 +218,7 @@ void CameraService::onNewProviderRegistered() {
+ }
+
+ void CameraService::updateCameraNumAndIds() {
+- Mutex::Autolock l(mServiceLock);
++ //Mutex::Autolock l(mServiceLock);
+ mNumberOfCameras = mCameraProviderManager->getCameraCount();
+ mNormalDeviceIds =
+ mCameraProviderManager->getAPI1CompatibleCameraDeviceIds();
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_av/0004-We-might-not-have-a-mFlashlight-at-this-state-but-th.patch b/patches/platform_frameworks_av/0004-We-might-not-have-a-mFlashlight-at-this-state-but-th.patch
new file mode 100644
index 0000000..7426512
--- /dev/null
+++ b/patches/platform_frameworks_av/0004-We-might-not-have-a-mFlashlight-at-this-state-but-th.patch
@@ -0,0 +1,26 @@
+From ec657f31e92f4a58791a39025632f0350a7750db Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 19 Aug 2018 23:05:26 +0200
+Subject: [PATCH 4/4] We might not have a mFlashlight at this state, but that's
+ ok
+
+---
+ services/camera/libcameraservice/CameraService.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
+index edbafbc..222cfe4 100644
+--- a/services/camera/libcameraservice/CameraService.cpp
++++ b/services/camera/libcameraservice/CameraService.cpp
+@@ -243,7 +243,7 @@ void CameraService::addStates(const String8 id) {
+ conflicting));
+ }
+
+- if (mFlashlight->hasFlashUnit(id)) {
++ if (mFlashlight != nullptr && mFlashlight->hasFlashUnit(id)) {
+ Mutex::Autolock al(mTorchStatusMutex);
+ mTorchStatusMap.add(id, TorchModeStatus::AVAILABLE_OFF);
+ }
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0001-Fix-backlight-control-on-Galaxy-S9.patch b/patches/platform_frameworks_base/0001-Fix-backlight-control-on-Galaxy-S9.patch
new file mode 100644
index 0000000..46691c6
--- /dev/null
+++ b/patches/platform_frameworks_base/0001-Fix-backlight-control-on-Galaxy-S9.patch
@@ -0,0 +1,37 @@
+From 83c5a5d0e192b901ec36059bf2fb1fc8d63de1a7 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sat, 24 Mar 2018 08:01:48 +0100
+Subject: [PATCH 01/19] Fix backlight control on Galaxy S9(+)
+
+---
+ services/core/java/com/android/server/lights/LightsService.java | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
+index a94ed60..762b0ae 100644
+--- a/services/core/java/com/android/server/lights/LightsService.java
++++ b/services/core/java/com/android/server/lights/LightsService.java
+@@ -21,6 +21,7 @@ import android.app.ActivityManager;
+ import android.content.Context;
+ import android.os.Handler;
+ import android.os.Message;
++import android.os.SystemProperties;
+ import android.os.Trace;
+ import android.provider.Settings;
+ import android.util.Slog;
+@@ -52,6 +53,12 @@ public class LightsService extends SystemService {
+ return;
+ }
+
++ String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
++ if(fp.contains("starlte") || fp.contains("star2lte")) {
++ setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
++ return;
++ }
++
+ int color = brightness & 0x000000ff;
+ color = 0xff000000 | (color << 16) | (color << 8) | color;
+ setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0002-Relax-requirement-for-visible-flag-to-sdcards.patch b/patches/platform_frameworks_base/0002-Relax-requirement-for-visible-flag-to-sdcards.patch
new file mode 100644
index 0000000..4ce0d86
--- /dev/null
+++ b/patches/platform_frameworks_base/0002-Relax-requirement-for-visible-flag-to-sdcards.patch
@@ -0,0 +1,31 @@
+From 4547592e86f29d043daf0f3385c802949fa73193 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 28 Nov 2017 18:28:04 +0100
+Subject: [PATCH 02/19] Relax requirement for visible flag to sdcards
+
+The vast majority of sdcard readers are stable enough to be declared by
+the API. (I see no counter-example)
+FBE broke adoptable storage with SDCard, hence this need.
+
+Change-Id: Ia616671c03562d1eadaff5531a5c708a62d7ad3a
+---
+ services/core/java/com/android/server/StorageManagerService.java | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
+index 183be9b..e8f2ad1 100644
+--- a/services/core/java/com/android/server/StorageManagerService.java
++++ b/services/core/java/com/android/server/StorageManagerService.java
+@@ -1178,7 +1178,8 @@ class StorageManagerService extends IStorageManager.Stub
+
+ // Adoptable public disks are visible to apps, since they meet
+ // public API requirement of being in a stable location.
+- if (vol.disk.isAdoptable()) {
++ // Assume all SDs match this as well
++ if (vol.disk.isAdoptable() || vol.disk.isSd()) {
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE;
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0003-Also-scan-system-overlay.patch b/patches/platform_frameworks_base/0003-Also-scan-system-overlay.patch
new file mode 100644
index 0000000..a64821d
--- /dev/null
+++ b/patches/platform_frameworks_base/0003-Also-scan-system-overlay.patch
@@ -0,0 +1,52 @@
+From b3bf3329f50ba0fc4a494a772d5f76b66dc67a2c Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 1 May 2018 17:47:36 +0200
+Subject: [PATCH 03/19] Also scan /system/overlay
+
+Change-Id: Ib0223560606b80cdaaa986b159b34b4db0154589
+---
+ core/jni/android_util_AssetManager.cpp | 6 +++++-
+ core/jni/fd_utils.cpp | 3 ++-
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
+index fa9f445..1d3bf73 100644
+--- a/core/jni/android_util_AssetManager.cpp
++++ b/core/jni/android_util_AssetManager.cpp
+@@ -149,7 +149,7 @@ static void NativeVerifySystemIdmaps(JNIEnv* /*env*/, jclass /*clazz*/) {
+ }
+
+ // Generic idmap parameters
+- const char* argv[8];
++ const char* argv[9];
+ int argc = 0;
+ struct stat st;
+
+@@ -179,6 +179,10 @@ static void NativeVerifySystemIdmaps(JNIEnv* /*env*/, jclass /*clazz*/) {
+ argv[argc++] = AssetManager::PRODUCT_OVERLAY_DIR;
+ }
+
++ if(stat("/system/overlay", &st) == 0) {
++ argv[argc++] = "/system/overlay";
++ }
++
+ // Finally, invoke idmap (if any overlay directory exists)
+ if (argc > 5) {
+ execv(AssetManager::IDMAP_BIN, (char* const*)argv);
+diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
+index c5904e0..6548215 100644
+--- a/core/jni/fd_utils.cpp
++++ b/core/jni/fd_utils.cpp
+@@ -93,7 +93,8 @@ bool FileDescriptorWhitelist::IsAllowed(const std::string& path) const {
+ || android::base::StartsWith(path, kOverlaySubdir)
+ || android::base::StartsWith(path, kVendorOverlayDir)
+ || android::base::StartsWith(path, kSystemProductOverlayDir)
+- || android::base::StartsWith(path, kProductOverlayDir))
++ || android::base::StartsWith(path, kProductOverlayDir)
++ || android::base::StartsWith(path, "/system/overlay"))
+ && android::base::EndsWith(path, kApkSuffix)
+ && path.find("/../") == std::string::npos) {
+ return true;
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0004-Don-t-crash-if-there-is-IR-HAL-is-not-declared.patch b/patches/platform_frameworks_base/0004-Don-t-crash-if-there-is-IR-HAL-is-not-declared.patch
new file mode 100644
index 0000000..43cfc48
--- /dev/null
+++ b/patches/platform_frameworks_base/0004-Don-t-crash-if-there-is-IR-HAL-is-not-declared.patch
@@ -0,0 +1,25 @@
+From 89b3b71fc07b7069b7c5f345762925b9743e6361 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Thu, 17 May 2018 20:28:35 +0200
+Subject: [PATCH 04/19] Don't crash if there is IR HAL is not declared
+
+---
+ services/core/java/com/android/server/ConsumerIrService.java | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/services/core/java/com/android/server/ConsumerIrService.java b/services/core/java/com/android/server/ConsumerIrService.java
+index 2ed6c77..c574a03 100644
+--- a/services/core/java/com/android/server/ConsumerIrService.java
++++ b/services/core/java/com/android/server/ConsumerIrService.java
+@@ -50,8 +50,6 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
+ if (!mHasNativeHal) {
+ throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
+ }
+- } else if (mHasNativeHal) {
+- throw new RuntimeException("IR HAL present, but FEATURE_CONSUMER_IR is not set!");
+ }
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0005-Fix-62.patch b/patches/platform_frameworks_base/0005-Fix-62.patch
new file mode 100644
index 0000000..caf028d
--- /dev/null
+++ b/patches/platform_frameworks_base/0005-Fix-62.patch
@@ -0,0 +1,28 @@
+From ca27968613cbe47b158a690f82347586264bbe54 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Wed, 30 May 2018 14:05:30 +0200
+Subject: [PATCH 05/19] Fix(?) #62
+
+---
+ .../SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+index 62cd13b..7efbdb8 100644
+--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
++++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+@@ -891,7 +891,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
+
+ @Override
+ public void onAuthenticationError(int errMsgId, CharSequence errString) {
+- handleFingerprintError(errMsgId, errString.toString());
++ if(errString != null)
++ handleFingerprintError(errMsgId, errString.toString());
++ else
++ handleFingerprintError(errMsgId, "unknown error");
+ }
+
+ @Override
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0006-S9-brightness-override-only-for-screen.patch b/patches/platform_frameworks_base/0006-S9-brightness-override-only-for-screen.patch
new file mode 100644
index 0000000..3ecbdb3
--- /dev/null
+++ b/patches/platform_frameworks_base/0006-S9-brightness-override-only-for-screen.patch
@@ -0,0 +1,35 @@
+From 5b5bafd457463ca4c90d3d2470703655179220ae Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <pierre-hugues.husson@softathome.com>
+Date: Thu, 7 Jun 2018 13:36:51 +0200
+Subject: [PATCH 06/19] S9 brightness override only for screen
+
+---
+ .../core/java/com/android/server/lights/LightsService.java | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
+index 762b0ae..eb25943 100644
+--- a/services/core/java/com/android/server/lights/LightsService.java
++++ b/services/core/java/com/android/server/lights/LightsService.java
+@@ -53,11 +53,13 @@ public class LightsService extends SystemService {
+ return;
+ }
+
+- String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
+- if(fp.contains("starlte") || fp.contains("star2lte")) {
+- setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+- return;
+- }
++ if(mId == 0) {
++ String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
++ if(fp.contains("starlte") || fp.contains("star2lte")) {
++ setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
++ return;
++ }
++ }
+
+ int color = brightness & 0x000000ff;
+ color = 0xff000000 | (color << 16) | (color << 8) | color;
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0007-WIP-Fix-OP6-brightness.patch b/patches/platform_frameworks_base/0007-WIP-Fix-OP6-brightness.patch
new file mode 100644
index 0000000..8aafc40
--- /dev/null
+++ b/patches/platform_frameworks_base/0007-WIP-Fix-OP6-brightness.patch
@@ -0,0 +1,35 @@
+From c23233a753225db8dcb6c74c53c0edc0ab2be44e Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <pierre-hugues.husson@softathome.com>
+Date: Thu, 7 Jun 2018 13:42:02 +0200
+Subject: [PATCH 07/19] [WIP] Fix OP6 brightness
+
+---
+ .../core/java/com/android/server/lights/LightsService.java | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
+index eb25943..a77af44 100644
+--- a/services/core/java/com/android/server/lights/LightsService.java
++++ b/services/core/java/com/android/server/lights/LightsService.java
+@@ -59,6 +59,18 @@ public class LightsService extends SystemService {
+ setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
++
++ boolean qcomExtendBrightness = SystemProperties.getBoolean("persist.extend.brightness", false);
++ int scale = SystemProperties.getInt("persist.display.max_brightness", 1023);
++ if(fp.contains("OnePlus6")) {
++ qcomExtendBrightness = true;
++ scale = 1023;
++ }
++
++ if(qcomExtendBrightness) {
++ setLightLocked(brightness * scale / 255, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
++ return;
++ }
+ }
+
+ int color = brightness & 0x000000ff;
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0008-Try-to-make-brightness-more-generic-using-property-s.patch b/patches/platform_frameworks_base/0008-Try-to-make-brightness-more-generic-using-property-s.patch
new file mode 100644
index 0000000..4619a1b
--- /dev/null
+++ b/patches/platform_frameworks_base/0008-Try-to-make-brightness-more-generic-using-property-s.patch
@@ -0,0 +1,31 @@
+From c87dbdb6ff897e1f25ce90acf136b4606337db00 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 10 Jun 2018 22:54:55 +0200
+Subject: [PATCH 08/19] Try to make brightness more generic using property set
+ by rw-system
+
+---
+ services/core/java/com/android/server/lights/LightsService.java | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
+index a77af44..4dc44de 100644
+--- a/services/core/java/com/android/server/lights/LightsService.java
++++ b/services/core/java/com/android/server/lights/LightsService.java
+@@ -62,9 +62,11 @@ public class LightsService extends SystemService {
+
+ boolean qcomExtendBrightness = SystemProperties.getBoolean("persist.extend.brightness", false);
+ int scale = SystemProperties.getInt("persist.display.max_brightness", 1023);
+- if(fp.contains("OnePlus6")) {
++ //This is set by vndk-detect
++ int qcomScale = SystemProperties.getInt("persist.sys.qcom-brightness", -1);
++ if(qcomScale != -1) {
+ qcomExtendBrightness = true;
+- scale = 1023;
++ scale = qcomScale;
+ }
+
+ if(qcomExtendBrightness) {
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0009-property-matching-RROs-allow-to-prefix-the-value-wit.patch b/patches/platform_frameworks_base/0009-property-matching-RROs-allow-to-prefix-the-value-wit.patch
new file mode 100644
index 0000000..d5dd3af
--- /dev/null
+++ b/patches/platform_frameworks_base/0009-property-matching-RROs-allow-to-prefix-the-value-wit.patch
@@ -0,0 +1,35 @@
+From af7f850833c9de9d3f055406038dfe7c9108a0e3 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 12 Jun 2018 22:55:32 +0200
+Subject: [PATCH 09/19] property-matching RROs: allow to prefix the value with
+ + to do glob match instead of exact match
+
+---
+ cmds/idmap/scan.cpp | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
+index d69dd79..2be6d23 100644
+--- a/cmds/idmap/scan.cpp
++++ b/cmds/idmap/scan.cpp
+@@ -1,5 +1,6 @@
+ #include <dirent.h>
+ #include <inttypes.h>
++#include <fnmatch.h>
+ #include <sys/file.h>
+ #include <sys/stat.h>
+
+@@ -92,6 +93,10 @@ namespace {
+ property_get(prop, propBuf, NULL);
+ val = strndup16to8(value.string(), value.size());
+
++ if(val[0]=='+') {
++ return fnmatch(val+1, propBuf, 0) != 0;
++ }
++
+ return (strcmp(propBuf, val) == 0);
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0010-Fix-typo-on-fnmatch-return-value-check.patch b/patches/platform_frameworks_base/0010-Fix-typo-on-fnmatch-return-value-check.patch
new file mode 100644
index 0000000..dac4cc7
--- /dev/null
+++ b/patches/platform_frameworks_base/0010-Fix-typo-on-fnmatch-return-value-check.patch
@@ -0,0 +1,25 @@
+From 88e3e3df61a84c0a569fe128e1e22776af2e9aa8 Mon Sep 17 00:00:00 2001
+From: Song Fuchang <song.fc@gmail.com>
+Date: Sun, 17 Jun 2018 22:39:37 +0800
+Subject: [PATCH 10/19] Fix typo on fnmatch return value check
+
+---
+ cmds/idmap/scan.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
+index 2be6d23..0acff23 100644
+--- a/cmds/idmap/scan.cpp
++++ b/cmds/idmap/scan.cpp
+@@ -94,7 +94,7 @@ namespace {
+ val = strndup16to8(value.string(), value.size());
+
+ if(val[0]=='+') {
+- return fnmatch(val+1, propBuf, 0) != 0;
++ return fnmatch(val+1, propBuf, 0) == 0;
+ }
+
+ return (strcmp(propBuf, val) == 0);
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0011-Add-Qualcomm-starlte.patch b/patches/platform_frameworks_base/0011-Add-Qualcomm-starlte.patch
new file mode 100644
index 0000000..cea8a7c
--- /dev/null
+++ b/patches/platform_frameworks_base/0011-Add-Qualcomm-starlte.patch
@@ -0,0 +1,27 @@
+From f91ab52edbb4ed99689e0347f08cb9cd135bdbc5 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 25 Jun 2018 22:43:32 +0200
+Subject: [PATCH 11/19] Add Qualcomm starlte
+
+---
+ services/core/java/com/android/server/lights/LightsService.java | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
+index 4dc44de..2886f29 100644
+--- a/services/core/java/com/android/server/lights/LightsService.java
++++ b/services/core/java/com/android/server/lights/LightsService.java
+@@ -55,7 +55,9 @@ public class LightsService extends SystemService {
+
+ if(mId == 0) {
+ String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
+- if(fp.contains("starlte") || fp.contains("star2lte")) {
++ if(
++ fp.contains("starlte") || fp.contains("star2lte") ||
++ fp.contains("starqlte") || fp.contains("star2qlte")) {
+ setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0012-Galaxy-S9-remaining-of-HAL-onEnroll-is-actually-a-pe.patch b/patches/platform_frameworks_base/0012-Galaxy-S9-remaining-of-HAL-onEnroll-is-actually-a-pe.patch
new file mode 100644
index 0000000..3493467
--- /dev/null
+++ b/patches/platform_frameworks_base/0012-Galaxy-S9-remaining-of-HAL-onEnroll-is-actually-a-pe.patch
@@ -0,0 +1,30 @@
+From 880144142eec1864485ae289d6772e046453612d Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 2 Jul 2018 23:36:39 +0200
+Subject: [PATCH 12/19] [Galaxy S9] "remaining" of HAL onEnroll is actually a
+ percent of progress
+
+---
+ .../java/com/android/server/fingerprint/FingerprintService.java | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
+index 06329e57..6f09433 100644
+--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
++++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
+@@ -1046,7 +1046,11 @@ public class FingerprintService extends SystemService implements IHwBinder.Death
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+- handleEnrollResult(deviceId, fingerId, groupId, remaining);
++ int remaining2 = remaining;
++ String fp = android.os.SystemProperties.get("ro.vendor.build.fingerprint");
++ if(fp != null && (fp.contains("starlte") || fp.contains("star2lte") || fp.contains("starqlte") || fp.contains("star2qlte")))
++ remaining2 = 100 - remaining2;
++ handleEnrollResult(deviceId, fingerId, groupId, remaining2);
+ }
+ });
+ }
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0013-Show-APN-Settings-for-CDMA-carriers.patch b/patches/platform_frameworks_base/0013-Show-APN-Settings-for-CDMA-carriers.patch
new file mode 100644
index 0000000..5330a7c
--- /dev/null
+++ b/patches/platform_frameworks_base/0013-Show-APN-Settings-for-CDMA-carriers.patch
@@ -0,0 +1,25 @@
+From 879613f77988fb4b1c628fd51e6b330e02cddfc3 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 6 Aug 2018 12:49:00 +0200
+Subject: [PATCH 13/19] Show APN Settings for CDMA carriers
+
+---
+ telephony/java/android/telephony/CarrierConfigManager.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
+index f66164c..0cf93a1 100644
+--- a/telephony/java/android/telephony/CarrierConfigManager.java
++++ b/telephony/java/android/telephony/CarrierConfigManager.java
+@@ -2019,7 +2019,7 @@ public class CarrierConfigManager {
+ sDefaults.putBoolean(KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL, false);
+ sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
+ sDefaults.putBoolean(KEY_PREFER_2G_BOOL, true);
+- sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, false);
++ sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, true);
+ sDefaults.putBoolean(KEY_SHOW_CDMA_CHOICES_BOOL, false);
+ sDefaults.putBoolean(KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL, false);
+ sDefaults.putBoolean(KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL, true);
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0014-Change-SignalStrentgh-to-change-behaviour-based-on-p.patch b/patches/platform_frameworks_base/0014-Change-SignalStrentgh-to-change-behaviour-based-on-p.patch
new file mode 100644
index 0000000..82f6545
--- /dev/null
+++ b/patches/platform_frameworks_base/0014-Change-SignalStrentgh-to-change-behaviour-based-on-p.patch
@@ -0,0 +1,78 @@
+From fd818b3249a795d3e231fa9346372c183099c745 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 6 Aug 2018 20:01:44 +0200
+Subject: [PATCH 14/19] Change SignalStrentgh to change behaviour based on
+ property
+
+Change-Id: I940ed724047567ec5195ac93ea04574c3d92f70b
+---
+ .../java/android/telephony/SignalStrength.java | 39 +++++++++++++++-------
+ 1 file changed, 27 insertions(+), 12 deletions(-)
+
+diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java
+index 4e56396..ff906d3 100644
+--- a/telephony/java/android/telephony/SignalStrength.java
++++ b/telephony/java/android/telephony/SignalStrength.java
+@@ -854,6 +854,7 @@ public class SignalStrength implements Parcelable {
+ * RSRQ = quality of signal dB = Number of Resource blocks*RSRP/RSSI
+ * SNR = gain = signal/noise ratio = -10log P1/P2 dB
+ */
++ String method = android.os.SystemProperties.get("persist.sys.signal.level", "default");
+ int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN, rsrpIconLevel = -1, snrIconLevel = -1;
+
+ if (mLteRsrp > MAX_LTE_RSRP || mLteRsrp < MIN_LTE_RSRP) {
+@@ -897,6 +898,32 @@ public class SignalStrength implements Parcelable {
+ + rsrpIconLevel + " snrIconLevel:" + snrIconLevel
+ + " lteRsrpBoost:" + mLteRsrpBoost);
+
++ /* Valid values are (0-63, 99) as defined in TS 36.331 */
++ // TODO the range here is probably supposed to be (0..31, 99). It's unclear if anyone relies
++ // on the current incorrect range check, so this will be fixed in a future release with more
++ // soak time
++ if (mLteSignalStrength > 63) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
++ else if (mLteSignalStrength >= 12) rssiIconLevel = SIGNAL_STRENGTH_GREAT;
++ else if (mLteSignalStrength >= 8) rssiIconLevel = SIGNAL_STRENGTH_GOOD;
++ else if (mLteSignalStrength >= 5) rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
++ else if (mLteSignalStrength >= 0) rssiIconLevel = SIGNAL_STRENGTH_POOR;
++
++ if (DBG) log("getLTELevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
++ + rssiIconLevel);
++
++ if("rsrp".equals(method)) {
++ if(rsrpIconLevel == -1) rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
++ return rsrpIconLevel;
++ }
++ if("rssnr".equals(method)) {
++ if(snrIconLevel == -1) snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
++ return snrIconLevel;
++ }
++ if("rssi".equals(method)) {
++ if(rssiIconLevel == -1) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
++ return rssiIconLevel;
++ }
++
+ /* Choose a measurement type to use for notification */
+ if (snrIconLevel != -1 && rsrpIconLevel != -1) {
+ /*
+@@ -911,18 +938,6 @@ public class SignalStrength implements Parcelable {
+
+ if (rsrpIconLevel != -1) return rsrpIconLevel;
+
+- /* Valid values are (0-63, 99) as defined in TS 36.331 */
+- // TODO the range here is probably supposed to be (0..31, 99). It's unclear if anyone relies
+- // on the current incorrect range check, so this will be fixed in a future release with more
+- // soak time
+- if (mLteSignalStrength > 63) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
+- else if (mLteSignalStrength >= 12) rssiIconLevel = SIGNAL_STRENGTH_GREAT;
+- else if (mLteSignalStrength >= 8) rssiIconLevel = SIGNAL_STRENGTH_GOOD;
+- else if (mLteSignalStrength >= 5) rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
+- else if (mLteSignalStrength >= 0) rssiIconLevel = SIGNAL_STRENGTH_POOR;
+-
+- if (DBG) log("getLteLevel - rssi:" + mLteSignalStrength + " rssiIconLevel:"
+- + rssiIconLevel);
+ return rssiIconLevel;
+
+ }
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0015-idmap-Don-t-silently-ignore-RROs-with-same-priority.patch b/patches/platform_frameworks_base/0015-idmap-Don-t-silently-ignore-RROs-with-same-priority.patch
new file mode 100644
index 0000000..6d6b1e5
--- /dev/null
+++ b/patches/platform_frameworks_base/0015-idmap-Don-t-silently-ignore-RROs-with-same-priority.patch
@@ -0,0 +1,26 @@
+From 3ec335c1a6346e2f5ee03bf603839b730c12928c Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 19 Aug 2018 10:51:06 +0200
+Subject: [PATCH 15/19] idmap: Don't silently ignore RROs with same priority
+
+Change-Id: I64a6899f1b30e0cd9e9a872b7ca83d831f038cbe
+---
+ cmds/idmap/scan.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
+index 0acff23..d1dde52 100644
+--- a/cmds/idmap/scan.cpp
++++ b/cmds/idmap/scan.cpp
+@@ -29,6 +29,8 @@ namespace {
+
+ bool operator<(Overlay const& rhs) const
+ {
++ if(rhs.priority == priority)
++ return rhs.apk_path > apk_path;
+ return rhs.priority > priority;
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0016-Move-SysuiDarkThemeOverlay-to-system.patch b/patches/platform_frameworks_base/0016-Move-SysuiDarkThemeOverlay-to-system.patch
new file mode 100644
index 0000000..e052a73
--- /dev/null
+++ b/patches/platform_frameworks_base/0016-Move-SysuiDarkThemeOverlay-to-system.patch
@@ -0,0 +1,24 @@
+From 9629e7118d06a375d96f2967be54f3c2348b5b89 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 19 Aug 2018 10:57:21 +0200
+Subject: [PATCH 16/19] Move SysuiDarkThemeOverlay to /system
+
+Change-Id: I31b3edc5d1abcc1163a13e63c909fee9d27ff432
+---
+ packages/overlays/SysuiDarkThemeOverlay/Android.mk | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/packages/overlays/SysuiDarkThemeOverlay/Android.mk b/packages/overlays/SysuiDarkThemeOverlay/Android.mk
+index 7b277bc..89cfcf8 100644
+--- a/packages/overlays/SysuiDarkThemeOverlay/Android.mk
++++ b/packages/overlays/SysuiDarkThemeOverlay/Android.mk
+@@ -11,4 +11,5 @@ LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+ LOCAL_PACKAGE_NAME := SysuiDarkThemeOverlay
+ LOCAL_SDK_VERSION := current
+
+-include $(BUILD_RRO_PACKAGE)
++LOCAL_IS_RUNTIME_RESOURCE_OVERLAY := true
++include $(BUILD_PACKAGE)
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0017-Reintroduce-button-backlight-and-respective-inactivi.patch b/patches/platform_frameworks_base/0017-Reintroduce-button-backlight-and-respective-inactivi.patch
new file mode 100644
index 0000000..ccee4a4
--- /dev/null
+++ b/patches/platform_frameworks_base/0017-Reintroduce-button-backlight-and-respective-inactivi.patch
@@ -0,0 +1,120 @@
+From 4459e03e52773a42d83bca5a02172d658e7fc2b9 Mon Sep 17 00:00:00 2001
+From: Ricardo Cerqueira <cyanogenmod@cerqueira.org>
+Date: Fri, 23 Nov 2012 14:23:16 +0000
+Subject: [PATCH 17/19] Reintroduce button-backlight (and respective inactivity
+ timeout)
+
+The power manager rewrite from Change I1d7a52e98f0449f76d70bf421f6a7f245957d1d7
+completely removed support for control of the button backlights, which makes
+all capacitive buttons out there stay dark. The commit message in that change
+mentions it hasn't been implemented _yet_, so this fix should be temporary
+until upstream does their own implementation
+
+[RC: Updated to 5.0]
+
+Change-Id: I6094c446e0b8c23f57d30652a3cbd35dee5e821a
+---
+ .../android/server/display/DisplayPowerController.java | 11 +++++++++++
+ .../com/android/server/power/PowerManagerService.java | 15 +++++++++++++++
+ 2 files changed, 26 insertions(+)
+
+diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
+index 99412c5..bb6f65c 100644
+--- a/services/core/java/com/android/server/display/DisplayPowerController.java
++++ b/services/core/java/com/android/server/display/DisplayPowerController.java
+@@ -21,6 +21,7 @@ import com.android.internal.app.IBatteryStats;
+ import com.android.server.LocalServices;
+ import com.android.server.am.BatteryStatsService;
+ import com.android.server.policy.WindowManagerPolicy;
++import com.android.server.lights.LightsManager;
+
+ import android.animation.Animator;
+ import android.animation.ObjectAnimator;
+@@ -141,6 +142,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
+ // Battery stats.
+ private final IBatteryStats mBatteryStats;
+
++ // The lights service.
++ private final LightsManager mLights;
++
+ // The sensor manager.
+ private final SensorManager mSensorManager;
+
+@@ -374,6 +378,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
+ mCallbacks = callbacks;
+
+ mBatteryStats = BatteryStatsService.getService();
++ mLights = LocalServices.getService(LightsManager.class);
+ mSensorManager = sensorManager;
+ mWindowManagerPolicy = LocalServices.getService(WindowManagerPolicy.class);
+ mBlanker = blanker;
+@@ -769,6 +774,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
+ // Use zero brightness when screen is off.
+ if (state == Display.STATE_OFF) {
+ brightness = PowerManager.BRIGHTNESS_OFF;
++ mLights.getLight(LightsManager.LIGHT_ID_BUTTONS).setBrightness(brightness);
++ }
++
++ // Disable button lights when dozing
++ if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) {
++ mLights.getLight(LightsManager.LIGHT_ID_BUTTONS).setBrightness(PowerManager.BRIGHTNESS_OFF);
+ }
+
+ // Always use the VR brightness when in the VR state.
+diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
+index 697801f..9b8584e 100644
+--- a/services/core/java/com/android/server/power/PowerManagerService.java
++++ b/services/core/java/com/android/server/power/PowerManagerService.java
+@@ -222,6 +222,12 @@ public final class PowerManagerService extends SystemService
+ // Persistent property for last reboot reason
+ private static final String LAST_REBOOT_PROPERTY = "persist.sys.boot.reason";
+
++ // Add button light timeout
++ private static final int BUTTON_ON_DURATION = 5 * 1000;
++
++ // File location for last reboot reason
++ private static final String LAST_REBOOT_LOCATION = "/data/misc/reboot/last_reboot_reason";
++
+ private final Context mContext;
+ private final ServiceThread mHandlerThread;
+ private final PowerManagerHandler mHandler;
+@@ -242,6 +248,7 @@ public final class PowerManagerService extends SystemService
+ private SettingsObserver mSettingsObserver;
+ private DreamManagerInternal mDreamManager;
+ private Light mAttentionLight;
++ private Light mButtonsLight;
+
+ private final Object mLock = LockGuard.installNewLock(LockGuard.INDEX_POWER);
+
+@@ -770,6 +777,7 @@ public final class PowerManagerService extends SystemService
+
+ mLightsManager = getLocalService(LightsManager.class);
+ mAttentionLight = mLightsManager.getLight(LightsManager.LIGHT_ID_ATTENTION);
++ mButtonsLight = mLightsManager.getLight(LightsManager.LIGHT_ID_BUTTONS);
+
+ // Initialize display power management.
+ mDisplayManagerInternal.initPowerManagement(
+@@ -1953,6 +1961,7 @@ public final class PowerManagerService extends SystemService
+ final long screenOffTimeout = getScreenOffTimeoutLocked(sleepTimeout);
+ final long screenDimDuration = getScreenDimDurationLocked(screenOffTimeout);
+ final boolean userInactiveOverride = mUserInactiveOverrideFromWindowManager;
++ final int screenBrightness = mScreenBrightnessSettingDefault;
+ final long nextProfileTimeout = getNextProfileTimeoutLocked(now);
+
+ mUserActivitySummary = 0;
+@@ -1960,6 +1969,12 @@ public final class PowerManagerService extends SystemService
+ nextTimeout = mLastUserActivityTime
+ + screenOffTimeout - screenDimDuration;
+ if (now < nextTimeout) {
++ if (now > mLastUserActivityTime + BUTTON_ON_DURATION) {
++ mButtonsLight.setBrightness(0);
++ } else {
++ mButtonsLight.setBrightness(screenBrightness);
++ nextTimeout = now + BUTTON_ON_DURATION;
++ }
+ mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
+ } else {
+ nextTimeout = mLastUserActivityTime + screenOffTimeout;
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0018-power-Disable-keyboard-button-lights-while-dozing-dr.patch b/patches/platform_frameworks_base/0018-power-Disable-keyboard-button-lights-while-dozing-dr.patch
new file mode 100644
index 0000000..7411c5f
--- /dev/null
+++ b/patches/platform_frameworks_base/0018-power-Disable-keyboard-button-lights-while-dozing-dr.patch
@@ -0,0 +1,31 @@
+From 70a48b3381acd2b8cf0ef090c188ae95635d5921 Mon Sep 17 00:00:00 2001
+From: Steve Kondik <steve@cyngn.com>
+Date: Sat, 3 Jan 2015 05:13:26 -0800
+Subject: [PATCH 18/19] power: Disable keyboard/button lights while
+ dozing/dreaming
+
+ * With hardkeys and doze mode enabled, entering suspend results in
+ an epic battle over the lights. It's a bad situation. Disable
+ them when we're sleepy.
+
+Change-Id: I7f1fc35a1573717d1ea101a07c4171d6f66d1553
+---
+ services/core/java/com/android/server/power/PowerManagerService.java | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
+index 9b8584e..0620f2e 100644
+--- a/services/core/java/com/android/server/power/PowerManagerService.java
++++ b/services/core/java/com/android/server/power/PowerManagerService.java
+@@ -1965,7 +1965,7 @@ public final class PowerManagerService extends SystemService
+ final long nextProfileTimeout = getNextProfileTimeoutLocked(now);
+
+ mUserActivitySummary = 0;
+- if (mLastUserActivityTime >= mLastWakeTime) {
++ if (mWakefulness == WAKEFULNESS_AWAKE && mLastUserActivityTime >= mLastWakeTime) {
+ nextTimeout = mLastUserActivityTime
+ + screenOffTimeout - screenDimDuration;
+ if (now < nextTimeout) {
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_base/0019-It-is-okay-not-to-have-wifi-in-SystemUI-on-FDE-lock.patch b/patches/platform_frameworks_base/0019-It-is-okay-not-to-have-wifi-in-SystemUI-on-FDE-lock.patch
new file mode 100644
index 0000000..aab3dbc
--- /dev/null
+++ b/patches/platform_frameworks_base/0019-It-is-okay-not-to-have-wifi-in-SystemUI-on-FDE-lock.patch
@@ -0,0 +1,54 @@
+From bfa2cabcbae2e6b67acda5fad79e98104f66b915 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 20 Aug 2018 22:27:02 +0200
+Subject: [PATCH 19/19] It is okay not to have wifi in SystemUI (on FDE lock)
+
+---
+ .../SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java | 2 +-
+ .../com/android/systemui/statusbar/policy/HotspotControllerImpl.java | 1 +
+ .../com/android/systemui/statusbar/policy/WifiSignalController.java | 4 +++-
+ 3 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+index d8f0886..76cd70d 100644
+--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
++++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+@@ -207,7 +207,7 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro
+ mConnectivityManager = connectivityManager;
+
+ // check if verbose logging developer option has been turned on or off
+- sVerboseLogging = (mWifiManager.getVerboseLoggingLevel() > 0);
++ sVerboseLogging = mWifiManager != null ? (mWifiManager.getVerboseLoggingLevel() > 0) : false;
+
+ mFilter = filter;
+
+diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
+index d6d0673..07db5f8 100644
+--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
++++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
+@@ -113,6 +113,7 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof
+ */
+ private void updateWifiStateListeners(boolean shouldListen) {
+ mWifiStateReceiver.setListening(shouldListen);
++ if(mWifiManager == null) return;
+ if (shouldListen) {
+ mWifiManager.registerSoftApCallback(
+ this,
+diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+index e5e576d..78b3050 100644
+--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
++++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java
+@@ -59,7 +59,9 @@ public class WifiSignalController extends
+ mHasMobileData = hasMobileData;
+ Handler handler = new WifiHandler(Looper.getMainLooper());
+ mWifiChannel = new AsyncChannel();
+- Messenger wifiMessenger = wifiManager.getWifiServiceMessenger();
++ Messenger wifiMessenger = null;
++ if(wifiManager != null)
++ wifiMessenger = wifiManager.getWifiServiceMessenger();
+ if (wifiMessenger != null) {
+ mWifiChannel.connect(context, handler, wifiMessenger);
+ }
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_native/0001-AOSP-8.0-8.1-didn-t-use-presentOrValidate-so-it-s-br.patch b/patches/platform_frameworks_native/0001-AOSP-8.0-8.1-didn-t-use-presentOrValidate-so-it-s-br.patch
new file mode 100644
index 0000000..d76395f
--- /dev/null
+++ b/patches/platform_frameworks_native/0001-AOSP-8.0-8.1-didn-t-use-presentOrValidate-so-it-s-br.patch
@@ -0,0 +1,26 @@
+From 3861d57b5dc895c08e15808d72235540d62bcd4a Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 21:01:35 +0200
+Subject: [PATCH 1/2] AOSP 8.0/8.1 didn't use presentOrValidate, so it's
+ broken. Don't use it
+
+---
+ services/surfaceflinger/DisplayHardware/HWComposer.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+index f5f7a82..3c269ea 100644
+--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
++++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+@@ -435,7 +435,7 @@ status_t HWComposer::prepare(DisplayDevice& displayDevice) {
+ // The check below is incorrect. We actually rely on HWC here to fall
+ // back to validate when there is any client layer.
+ displayData.validateWasSkipped = false;
+- if (!displayData.hasClientComposition) {
++ if ((false)) { //!displayData.hasClientComposition) {
+ sp<android::Fence> outPresentFence;
+ uint32_t state = UINT32_MAX;
+ error = hwcDisplay->presentOrValidate(&numTypes, &numRequests, &outPresentFence , &state);
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_native/0002-Ignore-usage-bits-verification.patch b/patches/platform_frameworks_native/0002-Ignore-usage-bits-verification.patch
new file mode 100644
index 0000000..775b423
--- /dev/null
+++ b/patches/platform_frameworks_native/0002-Ignore-usage-bits-verification.patch
@@ -0,0 +1,26 @@
+From f82e1419c8006bd9a6d40d5c6f59829858b88507 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 19 Aug 2018 23:07:24 +0200
+Subject: [PATCH 2/2] Ignore usage bits verification
+
+This didn't ignore as of 8.1, so we're ""safe""
+---
+ libs/ui/Gralloc2.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp
+index b92cbf3..1c0e5d5 100644
+--- a/libs/ui/Gralloc2.cpp
++++ b/libs/ui/Gralloc2.cpp
+@@ -92,7 +92,7 @@ Gralloc2::Error Mapper::validateBufferDescriptorInfo(
+ if (descriptorInfo.usage & ~validUsageBits) {
+ ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64,
+ descriptorInfo.usage & ~validUsageBits);
+- return Error::BAD_VALUE;
++ //return Error::BAD_VALUE;
+ }
+ return Error::NONE;
+ }
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_opt_net_wifi/0001-Revert-SupplicantManager-Remove-ensure_config_file_e.patch b/patches/platform_frameworks_opt_net_wifi/0001-Revert-SupplicantManager-Remove-ensure_config_file_e.patch
new file mode 100644
index 0000000..0ff49bd
--- /dev/null
+++ b/patches/platform_frameworks_opt_net_wifi/0001-Revert-SupplicantManager-Remove-ensure_config_file_e.patch
@@ -0,0 +1,130 @@
+From 327d25dd7f34dbf3218ad989d4de538515d3c189 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 16:59:12 +0200
+Subject: [PATCH 1/2] Revert "SupplicantManager: Remove
+ |ensure_config_file_exists|"
+
+This reverts commit f61dc8cd7dadda5741d6e4a1bb6b576ba89cc24b.
+---
+ libwifi_system/supplicant_manager.cpp | 97 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 97 insertions(+)
+
+diff --git a/libwifi_system/supplicant_manager.cpp b/libwifi_system/supplicant_manager.cpp
+index 5667648..be0c33a 100644
+--- a/libwifi_system/supplicant_manager.cpp
++++ b/libwifi_system/supplicant_manager.cpp
+@@ -33,7 +33,89 @@ namespace wifi_system {
+ namespace {
+
+ const char kSupplicantInitProperty[] = "init.svc.wpa_supplicant";
++const char kSupplicantConfigTemplatePath[] =
++ "/etc/wifi/wpa_supplicant.conf";
++const char kSupplicantConfigFile[] = "/data/misc/wifi/wpa_supplicant.conf";
++const char kP2pConfigFile[] = "/data/misc/wifi/p2p_supplicant.conf";
+ const char kSupplicantServiceName[] = "wpa_supplicant";
++constexpr mode_t kConfigFileMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
++
++int ensure_config_file_exists(const char* config_file) {
++ char buf[2048];
++ int srcfd, destfd;
++ int nread;
++ int ret;
++ std::string templatePath;
++
++ ret = access(config_file, R_OK | W_OK);
++ if ((ret == 0) || (errno == EACCES)) {
++ if ((ret != 0) && (chmod(config_file, kConfigFileMode) != 0)) {
++ LOG(ERROR) << "Cannot set RW to \"" << config_file << "\": "
++ << strerror(errno);
++ return false;
++ }
++ return true;
++ } else if (errno != ENOENT) {
++ LOG(ERROR) << "Cannot access \"" << config_file << "\": "
++ << strerror(errno);
++ return false;
++ }
++
++ std::string configPathSystem =
++ std::string("/system") + std::string(kSupplicantConfigTemplatePath);
++ std::string configPathVendor =
++ std::string("/vendor") + std::string(kSupplicantConfigTemplatePath);
++ srcfd = TEMP_FAILURE_RETRY(open(configPathSystem.c_str(), O_RDONLY));
++ templatePath = configPathSystem;
++ if (srcfd < 0) {
++ int errnoSystem = errno;
++ srcfd = TEMP_FAILURE_RETRY(open(configPathVendor.c_str(), O_RDONLY));
++ templatePath = configPathVendor;
++ if (srcfd < 0) {
++ int errnoVendor = errno;
++ LOG(ERROR) << "Cannot open \"" << configPathSystem << "\": "
++ << strerror(errnoSystem);
++ LOG(ERROR) << "Cannot open \"" << configPathVendor << "\": "
++ << strerror(errnoVendor);
++ return false;
++ }
++ }
++
++ destfd = TEMP_FAILURE_RETRY(open(config_file,
++ O_CREAT | O_RDWR,
++ kConfigFileMode));
++ if (destfd < 0) {
++ close(srcfd);
++ LOG(ERROR) << "Cannot create \"" << config_file << "\": "
++ << strerror(errno);
++ return false;
++ }
++
++ while ((nread = TEMP_FAILURE_RETRY(read(srcfd, buf, sizeof(buf)))) != 0) {
++ if (nread < 0) {
++ LOG(ERROR) << "Error reading \"" << templatePath
++ << "\": " << strerror(errno);
++ close(srcfd);
++ close(destfd);
++ unlink(config_file);
++ return false;
++ }
++ TEMP_FAILURE_RETRY(write(destfd, buf, nread));
++ }
++
++ close(destfd);
++ close(srcfd);
++
++ /* chmod is needed because open() didn't set permisions properly */
++ if (chmod(config_file, kConfigFileMode) < 0) {
++ LOG(ERROR) << "Error changing permissions of " << config_file
++ << " to 0660: " << strerror(errno);
++ unlink(config_file);
++ return false;
++ }
++
++ return true;
++}
+
+ } // namespace
+
+@@ -49,6 +131,21 @@ bool SupplicantManager::StartSupplicant() {
+ return true;
+ }
+
++ /* Before starting the daemon, make sure its config file exists */
++ if (ensure_config_file_exists(kSupplicantConfigFile) < 0) {
++ LOG(ERROR) << "Wi-Fi will not be enabled";
++ return false;
++ }
++
++ /*
++ * Some devices have another configuration file for the p2p interface.
++ * However, not all devices have this, and we'll let it slide if it
++ * is missing. For devices that do expect this file to exist,
++ * supplicant will refuse to start and emit a good error message.
++ * No need to check for it here.
++ */
++ (void)ensure_config_file_exists(kP2pConfigFile);
++
+ /*
+ * Get a reference to the status property, so we can distinguish
+ * the case where it goes stopped => running => stopped (i.e.,
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_opt_net_wifi/0002-Start-supplicant-later.patch b/patches/platform_frameworks_opt_net_wifi/0002-Start-supplicant-later.patch
new file mode 100644
index 0000000..237024c
--- /dev/null
+++ b/patches/platform_frameworks_opt_net_wifi/0002-Start-supplicant-later.patch
@@ -0,0 +1,67 @@
+From a891832a0b7aa42978630532cb5bba2c45e7633d Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Wed, 15 Aug 2018 00:04:45 +0200
+Subject: [PATCH 2/2] Start supplicant later
+
+Change-Id: I6a67baad486162415840006711fb6d8dbf96a66a
+---
+ service/java/com/android/server/wifi/WifiNative.java | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java
+index 0f78587..18f06f7 100644
+--- a/service/java/com/android/server/wifi/WifiNative.java
++++ b/service/java/com/android/server/wifi/WifiNative.java
+@@ -332,13 +332,15 @@ public class WifiNative {
+ }
+
+ /** Helper method invoked to start supplicant if there were no STA ifaces */
++ private boolean supplicantOn = false;
+ private boolean startSupplicant() {
+ synchronized (mLock) {
+- if (!mIfaceMgr.hasAnyStaIface()) {
++ if (!mIfaceMgr.hasAnyStaIface() || !supplicantOn) {
+ if (!mWificondControl.enableSupplicant()) {
+ Log.e(TAG, "Failed to enable supplicant");
+ return false;
+ }
++ supplicantOn = true;
+ if (!waitForSupplicantConnection()) {
+ Log.e(TAG, "Failed to connect to supplicant");
+ return false;
+@@ -363,6 +365,7 @@ public class WifiNative {
+ if (!mWificondControl.disableSupplicant()) {
+ Log.e(TAG, "Failed to disable supplicant");
+ }
++ supplicantOn = false;
+ }
+ }
+ }
+@@ -852,11 +855,6 @@ public class WifiNative {
+ mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToHal();
+ return null;
+ }
+- if (!startSupplicant()) {
+- Log.e(TAG, "Failed to start supplicant");
+- mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToSupplicant();
+- return null;
+- }
+ Iface iface = mIfaceMgr.allocateIface(Iface.IFACE_TYPE_STA);
+ if (iface == null) {
+ Log.e(TAG, "Failed to allocate new STA iface");
+@@ -870,6 +868,12 @@ public class WifiNative {
+ mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToHal();
+ return null;
+ }
++ Log.e(TAG, "Starting supplicant");
++ if (!startSupplicant()) {
++ Log.e(TAG, "Failed to start supplicant");
++ mWifiMetrics.incrementNumSetupClientInterfaceFailureDueToSupplicant();
++ return null;
++ }
+ if (mWificondControl.setupInterfaceForClientMode(iface.name) == null) {
+ Log.e(TAG, "Failed to setup iface in wificond on " + iface);
+ teardownInterface(iface.name);
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_opt_telephony/0001-Add-route-to-gateway-on-null-netmask.patch b/patches/platform_frameworks_opt_telephony/0001-Add-route-to-gateway-on-null-netmask.patch
new file mode 100644
index 0000000..35e2e0e
--- /dev/null
+++ b/patches/platform_frameworks_opt_telephony/0001-Add-route-to-gateway-on-null-netmask.patch
@@ -0,0 +1,50 @@
+From 3c8c5e2125a845d6868be27c389a5cfb5200e187 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Thu, 16 Aug 2018 22:12:46 +0200
+Subject: [PATCH 1/2] Add route to gateway on null netmask
+
+Galaxy S9 returns empty prefix
+
+Change-Id: I8133da8e8f5203666684100009ba658528a02e94
+---
+ .../telephony/dataconnection/DataConnection.java | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+index 0696aa9..11947a5 100644
+--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
++++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+@@ -24,6 +24,7 @@ import android.content.Context;
+ import android.net.ConnectivityManager;
+ import android.net.ConnectivityManager.PacketKeepalive;
+ import android.net.KeepalivePacketData;
++import android.net.IpPrefix;
+ import android.net.LinkAddress;
+ import android.net.LinkProperties;
+ import android.net.NetworkAgent;
+@@ -1127,6 +1128,22 @@ public class DataConnection extends StateMachine {
+ }
+
+ for (InetAddress gateway : response.getGateways()) {
++ if(response.getAddresses().size()>0) {
++ //TODO:
++ // - IPv6
++ // - Multiple addresses
++ // - Check for non-trivial prefix length
++ LinkAddress la = response.getAddresses().get(0);
++ if(la.getNetworkPrefixLength() == 32 &&
++ gateway instanceof java.net.Inet4Address) {
++ if(!gateway.isAnyLocalAddress()) {
++ linkProperties.addRoute(new RouteInfo(
++ new IpPrefix(gateway, 32),
++ InetAddress.getByName("0.0.0.0"),
++ response.getIfname()));
++ }
++ }
++ }
+ // Allow 0.0.0.0 or :: as a gateway;
+ // this indicates a point-to-point interface.
+ linkProperties.addRoute(new RouteInfo(gateway));
+--
+2.7.4
+
diff --git a/patches/platform_frameworks_opt_telephony/0002-Allow-LocaleTracker-to-work-even-if-wifi-is-not-up-F.patch b/patches/platform_frameworks_opt_telephony/0002-Allow-LocaleTracker-to-work-even-if-wifi-is-not-up-F.patch
new file mode 100644
index 0000000..5ea34d1
--- /dev/null
+++ b/patches/platform_frameworks_opt_telephony/0002-Allow-LocaleTracker-to-work-even-if-wifi-is-not-up-F.patch
@@ -0,0 +1,28 @@
+From a04735c181e6212d3a31c47e7b984163a5df0a70 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 20 Aug 2018 22:39:39 +0200
+Subject: [PATCH 2/2] Allow LocaleTracker to work even if wifi is not up (FDE)
+
+Change-Id: Ie6a83af047bfcefb2588a9f6e31ac64e76c070a8
+---
+ src/java/com/android/internal/telephony/LocaleTracker.java | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/java/com/android/internal/telephony/LocaleTracker.java b/src/java/com/android/internal/telephony/LocaleTracker.java
+index 996e288..263d7e5 100644
+--- a/src/java/com/android/internal/telephony/LocaleTracker.java
++++ b/src/java/com/android/internal/telephony/LocaleTracker.java
+@@ -408,8 +408,8 @@ public class LocaleTracker extends Handler {
+ // Set the country code for wifi. This sets allowed wifi channels based on the
+ // country of the carrier we see. If we can't see any, reset to 0 so we don't
+ // broadcast on forbidden channels.
+- ((WifiManager) mPhone.getContext().getSystemService(Context.WIFI_SERVICE))
+- .setCountryCode(countryIso);
++ WifiManager wifi = (WifiManager)mPhone.getContext().getSystemService(Context.WIFI_SERVICE);
++ if(wifi != null) wifi.setCountryCode(countryIso);
+ }
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_system_bt/0001-Make-BTM_BYPASS_EXTRA_ACL_SETUP-dynamic.patch b/patches/platform_system_bt/0001-Make-BTM_BYPASS_EXTRA_ACL_SETUP-dynamic.patch
index bff9460..74d2277 100644
--- a/patches/platform_system_bt/0001-Make-BTM_BYPASS_EXTRA_ACL_SETUP-dynamic.patch
+++ b/patches/platform_system_bt/0001-Make-BTM_BYPASS_EXTRA_ACL_SETUP-dynamic.patch
@@ -12,7 +12,7 @@
4 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/hci/include/bt_hci_bdroid.h b/hci/include/bt_hci_bdroid.h
-index cf2c1136f..e2844db82 100644
+index cf2c113..e2844db 100644
--- a/hci/include/bt_hci_bdroid.h
+++ b/hci/include/bt_hci_bdroid.h
@@ -32,6 +32,9 @@
@@ -26,7 +26,7 @@
/******************************************************************************
* Constants & Macros
diff --git a/internal_include/bt_target.h b/internal_include/bt_target.h
-index cf09b15da..396114faf 100644
+index cf09b15..396114f 100644
--- a/internal_include/bt_target.h
+++ b/internal_include/bt_target.h
@@ -32,6 +32,9 @@
@@ -40,7 +40,7 @@
#include "bt_types.h" /* This must be defined AFTER buildcfg.h */
diff --git a/stack/btm/btm_acl.cc b/stack/btm/btm_acl.cc
-index ee2530ac2..389a998c6 100644
+index ee2530a..389a998 100644
--- a/stack/btm/btm_acl.cc
+++ b/stack/btm/btm_acl.cc
@@ -1184,17 +1184,17 @@ void btm_read_remote_ext_features_failed(uint8_t status, uint16_t handle) {
@@ -72,7 +72,7 @@
BTM_TRACE_ERROR("%s: Already link is up ", __func__);
return;
diff --git a/stack/btm/btm_sec.cc b/stack/btm/btm_sec.cc
-index b0809010f..4cc1e39ab 100644
+index b080901..4cc1e39 100644
--- a/stack/btm/btm_sec.cc
+++ b/stack/btm/btm_sec.cc
@@ -4356,15 +4356,15 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, uint8_t status,
@@ -101,5 +101,5 @@
btm_acl_created(bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle,
HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
--
-2.17.1
+2.7.4
diff --git a/patches/platform_system_core/0001-Revert-logd-add-passcred-for-logdw-socket.patch b/patches/platform_system_core/0001-Revert-logd-add-passcred-for-logdw-socket.patch
new file mode 100644
index 0000000..232e5ae
--- /dev/null
+++ b/patches/platform_system_core/0001-Revert-logd-add-passcred-for-logdw-socket.patch
@@ -0,0 +1,53 @@
+From 7cb501499404c54c5600d321521b271d462443db Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Sun, 10 Dec 2017 00:26:21 +0100
+Subject: [PATCH 1/4] Revert "logd: add "+passcred" for logdw socket"
+
+This reverts commit 54d8ff1121440d0ef4565ce0ab3751f82fdb393c.
+
+Android 8.0 init doesn't understand this new syntax
+---
+ logd/LogListener.cpp | 10 +++++-----
+ logd/logd.rc | 2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/logd/LogListener.cpp b/logd/LogListener.cpp
+index fc51dcf..f7f8e17 100755
+--- a/logd/LogListener.cpp
++++ b/logd/LogListener.cpp
+@@ -149,14 +149,14 @@ int LogListener::getLogSocket() {
+ static const char socketName[] = "logdw";
+ int sock = android_get_control_socket(socketName);
+
+- if (sock < 0) { // logd started up in init.sh
++ if (sock < 0) {
+ sock = socket_local_server(
+ socketName, ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_DGRAM);
++ }
+
+- int on = 1;
+- if (setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on))) {
+- return -1;
+- }
++ int on = 1;
++ if (setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)) < 0) {
++ return -1;
+ }
+ return sock;
+ }
+diff --git a/logd/logd.rc b/logd/logd.rc
+index bd303b7..4fd845f 100644
+--- a/logd/logd.rc
++++ b/logd/logd.rc
+@@ -1,7 +1,7 @@
+ service logd /system/bin/logd
+ socket logd stream 0666 logd logd
+ socket logdr seqpacket 0666 logd logd
+- socket logdw dgram+passcred 0222 logd logd
++ socket logdw dgram 0222 logd logd
+ file /proc/kmsg r
+ file /dev/kmsg w
+ user logd
+--
+2.7.4
+
diff --git a/patches/platform_system_core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch b/patches/platform_system_core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch
new file mode 100644
index 0000000..cc777a4
--- /dev/null
+++ b/patches/platform_system_core/0002-Some-kernel-crashes-when-using-too-recent-sdcardfs-o.patch
@@ -0,0 +1,27 @@
+From bc1052bfd8747bbba7a6a903ebfcff07d88cb313 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 19:33:03 +0200
+Subject: [PATCH 2/4] Some kernel crashes when using too recent sdcardfs
+ options. Force everyone to old options
+
+Change-Id: Ia5cf1aa8dc07a0f4a78b4d8f760ca0944dabaa89
+---
+ sdcard/sdcard.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sdcard/sdcard.cpp b/sdcard/sdcard.cpp
+index dc36596..e7121a8 100644
+--- a/sdcard/sdcard.cpp
++++ b/sdcard/sdcard.cpp
+@@ -102,7 +102,7 @@ static bool sdcardfs_setup(const std::string& source_path, const std::string& de
+ mode_t mask, bool derive_gid, bool default_normal, bool use_esdfs) {
+ // Try several attempts, each time with one less option, to gracefully
+ // handle older kernels that aren't updated yet.
+- for (int i = 0; i < 4; i++) {
++ for (int i = 2; i < 4; i++) {
+ std::string new_opts;
+ if (multi_user && i < 3) new_opts += "multiuser,";
+ if (derive_gid && i < 2) new_opts += "derive_gid,";
+--
+2.7.4
+
diff --git a/patches/platform_system_core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch b/patches/platform_system_core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch
new file mode 100644
index 0000000..2c2f137
--- /dev/null
+++ b/patches/platform_system_core/0003-First-drop_privs-which-may-fail-and-only-run-thread-.patch
@@ -0,0 +1,44 @@
+From 1d3c779b764c497a88c3b8652519a12ed5a70da1 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 19:33:23 +0200
+Subject: [PATCH 3/4] First drop_privs (which may fail) and only run thread
+ that might be scheduled before us
+
+Change-Id: I118fb2d4beedbeecf5d3a8d255929d3be480b923
+---
+ logd/main.cpp | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/logd/main.cpp b/logd/main.cpp
+index 4af0d21..bb64fb4 100644
+--- a/logd/main.cpp
++++ b/logd/main.cpp
+@@ -450,6 +450,12 @@ int main(int argc, char* argv[]) {
+ if (fdPmesg < 0) android::prdebug("Failed to open %s\n", proc_kmsg);
+ }
+
++ bool auditd =
++ __android_logger_property_get_bool("ro.logd.auditd", BOOL_DEFAULT_TRUE);
++ if (drop_privs(klogd, auditd) != 0) {
++ return -1;
++ }
++
+ // Reinit Thread
+ sem_init(&reinit, 0, 0);
+ sem_init(&uidName, 0, 0);
+@@ -471,12 +477,6 @@ int main(int argc, char* argv[]) {
+ pthread_attr_destroy(&attr);
+ }
+
+- bool auditd =
+- __android_logger_property_get_bool("ro.logd.auditd", BOOL_DEFAULT_TRUE);
+- if (drop_privs(klogd, auditd) != 0) {
+- return -1;
+- }
+-
+ // Serves the purpose of managing the last logs times read on a
+ // socket connection, and as a reader lock on a range of log
+ // entries.
+--
+2.7.4
+
diff --git a/patches/platform_system_core/0004-Fix-Samsung-TS-suspend-by-reseting-it-when-waking-up.patch b/patches/platform_system_core/0004-Fix-Samsung-TS-suspend-by-reseting-it-when-waking-up.patch
new file mode 100644
index 0000000..8beb827
--- /dev/null
+++ b/patches/platform_system_core/0004-Fix-Samsung-TS-suspend-by-reseting-it-when-waking-up.patch
@@ -0,0 +1,77 @@
+From 97fc6c8d2a0ed3f823c7a955e97583960d2a752d Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Thu, 16 Aug 2018 22:29:11 +0200
+Subject: [PATCH 4/4] Fix Samsung TS suspend by reseting it when waking up
+
+Change-Id: I5ee289dcb2347bedc96573bf16bc4c3d1f1b9de3
+---
+ libsuspend/autosuspend_wakeup_count.cpp | 39 +++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+diff --git a/libsuspend/autosuspend_wakeup_count.cpp b/libsuspend/autosuspend_wakeup_count.cpp
+index 27c8629..b8580ef 100644
+--- a/libsuspend/autosuspend_wakeup_count.cpp
++++ b/libsuspend/autosuspend_wakeup_count.cpp
+@@ -53,6 +53,35 @@ static constexpr char sys_power_state[] = "/sys/power/state";
+ static constexpr char sys_power_wakeup_count[] = "/sys/power/wakeup_count";
+ static bool autosuspend_is_init = false;
+
++static std::string samsung_touchscreen_readname(const std::string& path) {
++ std::string fullPath = path + "/name";
++ std::string name;
++ if(!android::base::ReadFileToString(fullPath, &name))
++ name = "unknown";
++ return name;
++}
++
++static std::string samsung_touchscreen_enabled() {
++ int fd = -1;
++ for(int i=0; i<30; i++) {
++ std::string is = std::to_string(i);
++ std::string name;
++ std::string path = "/sys/class/input/input" + is + "/name";
++ if(!android::base::ReadFileToString(path, &name))
++ name = "unknown";
++ if(name == "sec_touchscreen" ||
++ name =="sec_touchscreen\n") {
++ return "/sys/class/input/input" + is + "/enabled";
++ }
++ }
++ return "";
++}
++
++static bool samsung_touchscreen_set(bool enable) {
++ const std::string path = samsung_touchscreen_enabled();
++ return android::base::WriteStringToFile(path, enable ? "1" : "0");
++}
++
+ static void update_sleep_time(bool success) {
+ if (success) {
+ sleep_time = BASE_SLEEP_TIME;
+@@ -64,6 +93,7 @@ static void update_sleep_time(bool success) {
+
+ static void* suspend_thread_func(void* arg __attribute__((unused))) {
+ bool success = true;
++ bool samsungTs = true;
+
+ while (true) {
+ update_sleep_time(success);
+@@ -95,6 +125,15 @@ static void* suspend_thread_func(void* arg __attribute__((unused))) {
+ LOG(VERBOSE) << "write " << sleep_state << " to " << sys_power_state;
+ success = WriteStringToFd(sleep_state, state_fd);
+
++ if(success) {
++ if(samsungTs) {
++ LOG(VERBOSE) << "Resetting Samsung TS";
++ samsung_touchscreen_set(0);
++ for(int i=0; i<10 && !samsung_touchscreen_set(1); i++)
++ LOG(VERBOSE) << "Resetting Samsung TS: try " << i;
++ }
++ }
++
+ void (*func)(bool success) = wakeup_func;
+ if (func != NULL) {
+ (*func)(success);
+--
+2.7.4
+
diff --git a/patches/platform_system_netd/0001-device-Huawei-Kirin-960-accept-broken-rpfilter-match.patch b/patches/platform_system_netd/0001-device-Huawei-Kirin-960-accept-broken-rpfilter-match.patch
new file mode 100644
index 0000000..7a79855
--- /dev/null
+++ b/patches/platform_system_netd/0001-device-Huawei-Kirin-960-accept-broken-rpfilter-match.patch
@@ -0,0 +1,29 @@
+From 4807efaba2761cb186df5d4306479d00d95f7afc Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 2 Jul 2018 22:01:43 +0200
+Subject: [PATCH] [device] ::Huawei Kirin 960:: accept broken rpfilter match
+
+How bad a security flaw is this?
+People lived with rpfilter on IPv4 for a very long time...
+
+Change-Id: I9aa63d18e54a8254133adf97bf757c03d6b66757
+---
+ server/TetherController.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/server/TetherController.cpp b/server/TetherController.cpp
+index 6e805f5..7189e2b 100644
+--- a/server/TetherController.cpp
++++ b/server/TetherController.cpp
+@@ -625,7 +625,7 @@ int TetherController::setForwardRules(bool add, const char *intIface, const char
+ "*raw\n"
+ "%s %s -i %s -m rpfilter --invert ! -s fe80::/64 -j DROP\n"
+ "COMMIT\n", op, LOCAL_RAW_PREROUTING, intIface);
+- if (iptablesRestoreFunction(V6, rpfilterCmd, nullptr) == -1 && add) {
++ if (iptablesRestoreFunction(V6, rpfilterCmd, nullptr) == -1 && add && false) {
+ return -1;
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_system_sepolicy/0001-Don-t-set-esdfs-or-exfat-genfscon.-Assume-OEM-does.patch b/patches/platform_system_sepolicy/0001-Don-t-set-esdfs-or-exfat-genfscon.-Assume-OEM-does.patch
new file mode 100644
index 0000000..184afe4
--- /dev/null
+++ b/patches/platform_system_sepolicy/0001-Don-t-set-esdfs-or-exfat-genfscon.-Assume-OEM-does.patch
@@ -0,0 +1,51 @@
+From 46578b3b71aeb1de3a1d98177a8ead86a194afc5 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 20:56:54 +0200
+Subject: [PATCH 1/2] Don't set esdfs or exfat genfscon. Assume OEM does
+
+---
+ prebuilts/api/28.0/private/genfs_contexts | 4 ++--
+ private/genfs_contexts | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/prebuilts/api/28.0/private/genfs_contexts b/prebuilts/api/28.0/private/genfs_contexts
+index 7e2ea50..56cd92d 100644
+--- a/prebuilts/api/28.0/private/genfs_contexts
++++ b/prebuilts/api/28.0/private/genfs_contexts
+@@ -231,12 +231,12 @@ genfscon debugfs /tracing/events/fence/
+
+ genfscon inotifyfs / u:object_r:inotify:s0
+ genfscon vfat / u:object_r:vfat:s0
+-genfscon exfat / u:object_r:exfat:s0
++#genfscon exfat / u:object_r:exfat:s0
+ genfscon debugfs / u:object_r:debugfs:s0
+ genfscon fuse / u:object_r:fuse:s0
+ genfscon configfs / u:object_r:configfs:s0
+ genfscon sdcardfs / u:object_r:sdcardfs:s0
+-genfscon esdfs / u:object_r:sdcardfs:s0
++#genfscon esdfs / u:object_r:sdcardfs:s0
+ genfscon pstore / u:object_r:pstorefs:s0
+ genfscon functionfs / u:object_r:functionfs:s0
+ genfscon usbfs / u:object_r:usbfs:s0
+diff --git a/private/genfs_contexts b/private/genfs_contexts
+index 7e2ea50..56cd92d 100644
+--- a/private/genfs_contexts
++++ b/private/genfs_contexts
+@@ -231,12 +231,12 @@ genfscon debugfs /tracing/events/fence/
+
+ genfscon inotifyfs / u:object_r:inotify:s0
+ genfscon vfat / u:object_r:vfat:s0
+-genfscon exfat / u:object_r:exfat:s0
++#genfscon exfat / u:object_r:exfat:s0
+ genfscon debugfs / u:object_r:debugfs:s0
+ genfscon fuse / u:object_r:fuse:s0
+ genfscon configfs / u:object_r:configfs:s0
+ genfscon sdcardfs / u:object_r:sdcardfs:s0
+-genfscon esdfs / u:object_r:sdcardfs:s0
++#genfscon esdfs / u:object_r:sdcardfs:s0
+ genfscon pstore / u:object_r:pstorefs:s0
+ genfscon functionfs / u:object_r:functionfs:s0
+ genfscon usbfs / u:object_r:usbfs:s0
+--
+2.7.4
+
diff --git a/patches/platform_system_sepolicy/0002-Relax-proc-read-from-ueventd-huawei-needs-it.patch b/patches/platform_system_sepolicy/0002-Relax-proc-read-from-ueventd-huawei-needs-it.patch
new file mode 100644
index 0000000..077b878
--- /dev/null
+++ b/patches/platform_system_sepolicy/0002-Relax-proc-read-from-ueventd-huawei-needs-it.patch
@@ -0,0 +1,37 @@
+From ba947f13165df3081572a680009157bfb0827752 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Wed, 15 Aug 2018 12:27:21 +0200
+Subject: [PATCH 2/2] Relax /proc read from ueventd, huawei needs it
+
+---
+ prebuilts/api/28.0/private/domain.te | 1 +
+ private/domain.te | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/prebuilts/api/28.0/private/domain.te b/prebuilts/api/28.0/private/domain.te
+index fb6ba4f..95f0dbc 100644
+--- a/prebuilts/api/28.0/private/domain.te
++++ b/prebuilts/api/28.0/private/domain.te
+@@ -32,6 +32,7 @@ full_treble_only(`
+ # /proc
+ neverallow {
+ coredomain
++ -ueventd
+ -vold
+ } proc:file no_rw_file_perms;
+
+diff --git a/private/domain.te b/private/domain.te
+index fb6ba4f..95f0dbc 100644
+--- a/private/domain.te
++++ b/private/domain.te
+@@ -32,6 +32,7 @@ full_treble_only(`
+ # /proc
+ neverallow {
+ coredomain
++ -ueventd
+ -vold
+ } proc:file no_rw_file_perms;
+
+--
+2.7.4
+
diff --git a/patches/platform_system_vold/0001-Allow-deletion-of-symlink.patch b/patches/platform_system_vold/0001-Allow-deletion-of-symlink.patch
index 815f513..1e4ec14 100644
--- a/patches/platform_system_vold/0001-Allow-deletion-of-symlink.patch
+++ b/patches/platform_system_vold/0001-Allow-deletion-of-symlink.patch
@@ -1,7 +1,7 @@
From 06a421423c529991ca38ba2d71b76daa9188849e Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 17 Feb 2018 19:39:38 +0100
-Subject: [PATCH] Allow deletion of symlink
+Subject: [PATCH 1/5] Allow deletion of symlink
Change-Id: I9731895f88729072297f753088583aabbe6990f4
---
@@ -21,5 +21,5 @@
return false;
}
--
-2.17.1
+2.7.4
diff --git a/patches/platform_system_vold/0002-Don-t-set-reserved_disk-group-it-panics-old-inits.patch b/patches/platform_system_vold/0002-Don-t-set-reserved_disk-group-it-panics-old-inits.patch
new file mode 100644
index 0000000..aee9f86
--- /dev/null
+++ b/patches/platform_system_vold/0002-Don-t-set-reserved_disk-group-it-panics-old-inits.patch
@@ -0,0 +1,21 @@
+From bed499eedc05289da45e9fc4de9f53f98c500332 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 20:53:12 +0200
+Subject: [PATCH 2/5] Don't set reserved_disk group, it panics old inits
+
+---
+ vold.rc | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/vold.rc b/vold.rc
+index 7d14453..c27aeda 100644
+--- a/vold.rc
++++ b/vold.rc
+@@ -5,4 +5,3 @@ service vold /system/bin/vold \
+ ioprio be 2
+ writepid /dev/cpuset/foreground/tasks
+ shutdown critical
+- group reserved_disk
+--
+2.7.4
+
diff --git a/patches/platform_system_vold/0003-Create-vendor_de.-This-is-done-by-init.rc-on-system-.patch b/patches/platform_system_vold/0003-Create-vendor_de.-This-is-done-by-init.rc-on-system-.patch
new file mode 100644
index 0000000..d1423cf
--- /dev/null
+++ b/patches/platform_system_vold/0003-Create-vendor_de.-This-is-done-by-init.rc-on-system-.patch
@@ -0,0 +1,26 @@
+From 3a5d884d899664223b8b78c331180c6e3a1b6d05 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Tue, 14 Aug 2018 20:54:08 +0200
+Subject: [PATCH 3/5] Create vendor_de. This is done by /init.rc on
+ system-as-root device
+
+---
+ Ext4Crypt.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/Ext4Crypt.cpp b/Ext4Crypt.cpp
+index 99a63b4..090532f 100644
+--- a/Ext4Crypt.cpp
++++ b/Ext4Crypt.cpp
+@@ -667,6 +667,8 @@ bool e4crypt_prepare_user_storage(const std::string& volume_uuid, userid_t user_
+ auto vendor_de_path = android::vold::BuildDataVendorDePath(user_id);
+ auto user_de_path = android::vold::BuildDataUserDePath(volume_uuid, user_id);
+
++ prepare_dir(android::vold::BuildDataPath("") + "/vendor_de", 0771, 0, 0);
++
+ if (volume_uuid.empty()) {
+ if (!prepare_dir(system_legacy_path, 0700, AID_SYSTEM, AID_SYSTEM)) return false;
+ #if MANAGE_MISC_DIRS
+--
+2.7.4
+
diff --git a/patches/platform_system_vold/0004-Support-Samsung-s-implementation-of-exfat-called-sdf.patch b/patches/platform_system_vold/0004-Support-Samsung-s-implementation-of-exfat-called-sdf.patch
new file mode 100644
index 0000000..7b02826
--- /dev/null
+++ b/patches/platform_system_vold/0004-Support-Samsung-s-implementation-of-exfat-called-sdf.patch
@@ -0,0 +1,44 @@
+From dabad429ba29bd565c21bd1dde65c7e763a56238 Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 20 Aug 2018 22:37:54 +0200
+Subject: [PATCH 4/5] Support Samsung's implementation of exfat, called sdfat
+
+---
+ fs/Exfat.cpp | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/fs/Exfat.cpp b/fs/Exfat.cpp
+index 5c15075..5e23a79 100644
+--- a/fs/Exfat.cpp
++++ b/fs/Exfat.cpp
+@@ -35,7 +35,7 @@ static const char* kFsckPath = "/system/bin/fsck.exfat";
+
+ bool IsSupported() {
+ return access(kMkfsPath, X_OK) == 0 && access(kFsckPath, X_OK) == 0 &&
+- IsFilesystemSupported("exfat");
++ (IsFilesystemSupported("exfat") || IsFilesystemSupported("sdfat"));
+ }
+
+ status_t Check(const std::string& source) {
+@@ -60,13 +60,16 @@ status_t Mount(const std::string& source, const std::string& target, int ownerUi
+ auto mountData = android::base::StringPrintf("uid=%d,gid=%d,fmask=%o,dmask=%o", ownerUid,
+ ownerGid, permMask, permMask);
+
+- if (mount(source.c_str(), target.c_str(), "exfat", mountFlags, mountData.c_str()) == 0) {
++ const char *fs = "exfat";
++ if(IsFilesystemSupported("sdfat"))
++ fs = "sdfat";
++ if (mount(source.c_str(), target.c_str(), fs, mountFlags, mountData.c_str()) == 0) {
+ return 0;
+ }
+
+ PLOG(ERROR) << "Mount failed; attempting read-only";
+ mountFlags |= MS_RDONLY;
+- if (mount(source.c_str(), target.c_str(), "exfat", mountFlags, mountData.c_str()) == 0) {
++ if (mount(source.c_str(), target.c_str(), fs, mountFlags, mountData.c_str()) == 0) {
+ return 0;
+ }
+
+--
+2.7.4
+
diff --git a/patches/platform_system_vold/0005-Also-create-vendor_ce-same-reason-as-vendor_de.patch b/patches/platform_system_vold/0005-Also-create-vendor_ce-same-reason-as-vendor_de.patch
new file mode 100644
index 0000000..5aec913
--- /dev/null
+++ b/patches/platform_system_vold/0005-Also-create-vendor_ce-same-reason-as-vendor_de.patch
@@ -0,0 +1,25 @@
+From 8004f0102629d11e3fa17a13593bf84742761add Mon Sep 17 00:00:00 2001
+From: Pierre-Hugues Husson <phh@phh.me>
+Date: Mon, 20 Aug 2018 22:38:08 +0200
+Subject: [PATCH 5/5] Also create vendor_ce (same reason as vendor_de)
+
+---
+ Ext4Crypt.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/Ext4Crypt.cpp b/Ext4Crypt.cpp
+index 090532f..6b60796 100644
+--- a/Ext4Crypt.cpp
++++ b/Ext4Crypt.cpp
+@@ -706,6 +706,8 @@ bool e4crypt_prepare_user_storage(const std::string& volume_uuid, userid_t user_
+ auto media_ce_path = android::vold::BuildDataMediaCePath(volume_uuid, user_id);
+ auto user_ce_path = android::vold::BuildDataUserCePath(volume_uuid, user_id);
+
++ prepare_dir(android::vold::BuildDataPath("") + "/vendor_ce", 0771, 0, 0);
++
+ if (volume_uuid.empty()) {
+ if (!prepare_dir(system_ce_path, 0770, AID_SYSTEM, AID_SYSTEM)) return false;
+ if (!prepare_dir(misc_ce_path, 01771, AID_SYSTEM, AID_MISC)) return false;
+--
+2.7.4
+