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
+