Sync up to v214

This commit is contained in:
Andy CrossGate Yan 2020-03-25 02:23:49 +00:00
parent 90d7ed3178
commit 80a47a7f4f
6 changed files with 436 additions and 32 deletions

View File

@ -0,0 +1,40 @@
From b0d4bdf42853edee3ee12acf269c8891af63060c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 10 Mar 2020 23:30:17 +0100
Subject: [PATCH 54/55] Allow disabling of fingerprint cleanups, needed on some
Realme devices that cant enumerate
---
.../android/server/biometrics/BiometricServiceBase.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
index 4031cd32829..e74343ce4de 100644
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
@@ -323,6 +323,7 @@ public abstract class BiometricServiceBase extends SystemService
private List<? extends BiometricAuthenticator.Identifier> mEnrolledList;
// List of templates to remove from the HAL
private List<BiometricAuthenticator.Identifier> mUnknownHALTemplates = new ArrayList<>();
+ final boolean mNocleanup = android.os.SystemProperties.getBoolean("persist.sys.phh.fingerprint.nocleanup", false);
InternalEnumerateClient(Context context,
DaemonWrapper daemon, long halDeviceId, IBinder token,
@@ -367,9 +368,11 @@ public abstract class BiometricServiceBase extends SystemService
BiometricAuthenticator.Identifier identifier = mEnrolledList.get(i);
Slog.e(getTag(), "doTemplateCleanup(): Removing dangling template from framework: "
+ identifier.getBiometricId() + " "
- + identifier.getName());
- mUtils.removeBiometricForUser(getContext(),
- getTargetUserId(), identifier.getBiometricId());
+ + identifier.getName() + " /// " + mNocleanup);
+ if(!mNocleanup) {
+ mUtils.removeBiometricForUser(getContext(),
+ getTargetUserId(), identifier.getBiometricId());
+ }
StatsLog.write(StatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
statsModality(),
BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_FRAMEWORK);
--
2.17.1

View File

@ -0,0 +1,293 @@
From 612be3c02c49dc81924a58bf503bb04dfaa6b639 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 10 Mar 2020 23:32:00 +0100
Subject: [PATCH 55/55] Support Realme FOD
List of changes:
- Enable dimlayer_hbm. This dims the framebuffer, while putting screen
into HBM. From user's POV, brightness didn't change, but this enables
HBM facola.
- Have two separate FOD layers
This is needed because hwcomposer is expecting two FOD layers to tell
fingerprint HAL that UI is ready.
Also, using the second magical layer makes this second layer OVER the
dim, so it is running at full brightness.
- All devices are now moved to two layers.
- Sending events to other HALs have been delayed by 200ms, to account
for slow brightness change
---
services/core/Android.bp | 1 +
.../biometrics/fingerprint/FacolaView.java | 146 ++++++++++++++++--
2 files changed, 132 insertions(+), 15 deletions(-)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 84a5450dc05..dd0575c0b02 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -56,6 +56,7 @@ java_library_static {
"netd_event_listener_interface-java",
"vendor.goodix.extend.service-V2.0-java",
"vendor.samsung.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.oppo.hardware.biometrics.fingerprint-V2.1-java",
"vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 2c1ba76f529..42f21d63430 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -19,6 +19,7 @@ package com.android.server.biometrics.fingerprint;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.Point;
import android.content.Context;
import android.view.View.OnTouchListener;
import android.view.View;
@@ -39,19 +40,23 @@ import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
import vendor.goodix.extend.service.V2_0.IGoodixFPExtendService;
import vendor.samsung.hardware.biometrics.fingerprint.V2_1.ISecBiometricsFingerprint;
+import android.hardware.display.DisplayManager;
+
import android.os.Handler;
import android.os.HandlerThread;
import android.os.ServiceManager;
public class FacolaView extends ImageView implements OnTouchListener {
- private final int mX, mY, mW, mH;
+ private int mX, mY, mW, mH;
private final Paint mPaintFingerprint = new Paint();
private final Paint mPaintShow = new Paint();
private IXiaomiFingerprint mXiaomiFingerprint = null;
private IGoodixFPExtendService mGoodixFingerprint = null;
private ISecBiometricsFingerprint mSamsungFingerprint = null;
+ private vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint mOppoFingerprint = null;
private boolean mInsideCircle = false;
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+ private final WindowManager.LayoutParams mParamsTouched = new WindowManager.LayoutParams();
private final static float UNTOUCHED_DIM = .1f;
private final static float TOUCHED_DIM = .9f;
@@ -60,20 +65,34 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final Handler mHandler;
private final WindowManager mWM;
+ private final DisplayManager mDM;
private final boolean samsungFod = samsungHasCmd("fod_enable");
- private final boolean noDim;
+ private boolean noDim;
+ private boolean mFullGreenDisplayed = false;
+ private final View mFullGreen;
private boolean mHidden = true;
FacolaView(Context context) {
super(context);
+ mFullGreen = new ImageView(context) {
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), mPaintFingerprint);
+ };
+ };
+
+ mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+ mDM = (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
+
android.util.Log.d("PHH", "Samsung FOD " + samsungFod);
mHandlerThread = new HandlerThread("FacolaThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false);
+ noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", true);
String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
if(location.length != 2)
location = android.os.SystemProperties.get("persist.sys.fp.fod.location.X_Y", "").split(",");
@@ -94,13 +113,29 @@ public class FacolaView extends ImageView implements OnTouchListener {
mH = -1;
}
+ int oppoSize = android.os.SystemProperties.getInt("persist.vendor.fingerprint.optical.iconsize", 0);
+ if(oppoSize > 0) {
+ mW = oppoSize;
+ mH = oppoSize;
+ }
+ int oppoLocation = android.os.SystemProperties.getInt("persist.vendor.fingerprint.optical.iconlocation", 0);
+ if(oppoLocation > 0) {
+ Slog.d("PHH-Enroll", "Got Oppo icon location " + oppoLocation);
+ Point p = new Point();
+ mDM.getDisplay(0).getRealSize(p);
+ Slog.d("PHH-Enroll", "\tscreen size " + p.x + ", " + p.y);
+ mX = p.x/2 - mW/2;
+ mY = p.y - mH/2 - oppoLocation;
+ Slog.d("PHH-Enroll", "\tfacola at " + mX + ", " + mY);
+ noDim = true;
+ }
+
mPaintFingerprint.setAntiAlias(true);
mPaintFingerprint.setColor(Color.GREEN);
mPaintShow.setAntiAlias(true);
mPaintShow.setColor(Color.argb(0x18, 0x00, 0xff, 0x00));
setOnTouchListener(this);
- mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Slog.d("PHH-Enroll", "Created facola...");
if(mW != -1) {
try {
@@ -118,6 +153,17 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e);
}
+ try {
+ mOppoFingerprint = vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting oppo fingerprint service", e);
+ }
+ }
+
+ if(mX != -1) {
+ android.os.SystemProperties.set("persist.sys.phh.has_fod", "true");
+ } else {
+ android.os.SystemProperties.set("persist.sys.phh.has_fod", "false");
}
}
@@ -143,21 +189,53 @@ public class FacolaView extends ImageView implements OnTouchListener {
//TODO w!=h?
if(mInsideCircle) {
try {
- int nitValue = 2;
- if(mXiaomiFingerprint != null) {
- mXiaomiFingerprint.extCmd(0xa, nitValue);
- } else if(mGoodixFingerprint != null) {
- mGoodixFingerprint.goodixExtendCommand(10, 1);
- } else if(mSamsungFingerprint != null) {
- mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 2 /* pressed */, new java.util.ArrayList<Byte>(),
- (int retval, java.util.ArrayList<Byte> out) -> {} );
+ mParamsTouched.x = mX;
+ mParamsTouched.y = mY;
+
+ mParamsTouched.height = mW;
+ mParamsTouched.width = mH;
+ mParamsTouched.format = PixelFormat.TRANSLUCENT;
+
+ mParamsTouched.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
+ mParamsTouched.setTitle("Fingerprint on display.touched");
+ mParamsTouched.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+ mParamsTouched.dimAmount = UNTOUCHED_DIM;
+ if(!noDim) {
+ mParamsTouched.dimAmount = TOUCHED_DIM;
+ mParamsTouched.screenBrightness = 1.0f;
}
+
+ mParamsTouched.packageName = "android";
+
+ mParamsTouched.gravity = Gravity.TOP | Gravity.LEFT;
+ if(!mFullGreenDisplayed && !mHidden) {
+ mHandler.post( () -> {
+ Slog.d("PHH-Enroll", "Adding full green because of finger pressed");
+ mFullGreenDisplayed = true;
+ mWM.addView(mFullGreen, mParamsTouched);
+ });
+ }
+
+ int nitValue = 2;
+ mHandler.postDelayed( () -> {
+ try {
+ if(mXiaomiFingerprint != null) {
+ mXiaomiFingerprint.extCmd(0xa, nitValue);
+ } else if(mGoodixFingerprint != null) {
+ mGoodixFingerprint.goodixExtendCommand(10, 1);
+ } else if(mSamsungFingerprint != null) {
+ mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 2 /* pressed */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling late fp extcmd", e);
+ }
+ }, 200);
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
oppoPress(true);
-
- canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintFingerprint);
} else {
oppoPress(false);
try {
@@ -172,8 +250,15 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
- canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
+ if(mFullGreenDisplayed) {
+ mHandler.post( () -> {
+ Slog.d("PHH-Enroll", "Removing full green because of finger released");
+ mFullGreenDisplayed = false;
+ mWM.removeView(mFullGreen);
+ });
+ }
}
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
}
@Override
@@ -211,7 +296,15 @@ public class FacolaView extends ImageView implements OnTouchListener {
Slog.d("PHH-Enroll", "Show", new Exception());
if(!mHidden) return;
mHidden = false;
+ if(mOppoFingerprint != null) {
+ try {
+ mOppoFingerprint.setScreenState(vendor.oppo.hardware.biometrics.fingerprint.V2_1.FingerprintScreenState.FINGERPRINT_SCREEN_ON);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting oppo screen state", e);
+ }
+ }
mInsideCircle = false;
+ writeFile("/sys/kernel/oppo_display/dimlayer_hbm", "1");
if(samsungFod) {
samsungCmd("fod_enable,1,1");
}
@@ -254,7 +347,20 @@ public class FacolaView extends ImageView implements OnTouchListener {
mInsideCircle = false;
Slog.d("PHH-Enroll", "Hide", new Exception());
if(mHidden) return;
+ if(mOppoFingerprint != null) {
+ try {
+ mOppoFingerprint.setScreenState(vendor.oppo.hardware.biometrics.fingerprint.V2_1.FingerprintScreenState.FINGERPRINT_SCREEN_ON);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting oppo screen state", e);
+ }
+ }
+ writeFile("/sys/kernel/oppo_display/dimlayer_hbm", "0");
mHidden = true;
+ if(mFullGreenDisplayed) {
+ Slog.d("PHH-Enroll", "Removing full green because of hide");
+ mFullGreenDisplayed = false;
+ mWM.removeView(mFullGreen);
+ }
if(samsungFod) {
samsungCmd("fod_enable,0");
}
@@ -325,4 +431,14 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
}
+ private static void writeFile(String path, String value) {
+ try {
+ PrintWriter writer = new PrintWriter(path, "UTF-8");
+ writer.println(value);
+ writer.close();
+ } catch(Exception e) {
+ android.util.Log.d("PHH", "Failed writing to " + path + ": " + value);
+ }
+ }
+
}
--
2.17.1

View File

@ -0,0 +1,40 @@
From c982ade7da4d434e0a779b003e6bfcc6141232b6 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 10 Mar 2020 23:26:55 +0100
Subject: [PATCH 7/7] Use BKK's hwcomposer hacks to properly display FOD layers
Insecure hack: Set FOD layers to magical Z values to trigger
OPPO/Realme/Oneplus' whole blitter behaviours:
- reports touch event to fingerprint driver
- removes dim on touched layer
---
.../CompositionEngine/src/OutputLayer.cpp | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 5ce72b087..23b29d6fd 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -335,7 +335,18 @@ void OutputLayer::writeStateToHWC(bool includeGeometry) const {
static_cast<int32_t>(error));
}
- if (auto error = hwcLayer->setZOrder(mState.z); error != HWC2::Error::None) {
+ int z = mState.z;
+ if(strstr(mLayerFE->getDebugName(), "Fingerprint on display") != nullptr) {
+ ALOGE("Found fingerprint on display!");
+ z = 0x41000031;
+ }
+
+ if(strstr(mLayerFE->getDebugName(), "Fingerprint on display.touched") != nullptr) {
+ ALOGE("Found fingerprint on display touched!");
+ z = 0x41000033;
+ }
+
+ if (auto error = hwcLayer->setZOrder(z); error != HWC2::Error::None) {
ALOGE("[%s] Failed to set Z %u: %s (%d)", mLayerFE->getDebugName(), mState.z,
to_string(error).c_str(), static_cast<int32_t>(error));
}
--
2.17.1

View File

@ -1,32 +0,0 @@
From d184ff43ee1dd74f64fd9a0db99c29a225c22147 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 16 Sep 2019 13:49:05 +0200
Subject: [PATCH 6/6] Check needsCheckpoint only if checkpoint is supported
This is needed because some devices (Xiaomi MiPad 4, uncertified)
declares a bootctrl HAL in manifest, but doesn't have it.
vold will then hang in needsCheckpoint waiting for bootctrl
Change-Id: I2dafcbca7e994d7a3ac36ef3698590db2ab482fa
---
cryptfs.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/cryptfs.cpp b/cryptfs.cpp
index 07617e9..dbdc5af 100644
--- a/cryptfs.cpp
+++ b/cryptfs.cpp
@@ -1643,7 +1643,9 @@ static int cryptfs_restart_internal(int restart_main) {
SLOGE("Failed to setexeccon");
return -1;
}
- bool needs_cp = android::vold::cp_needsCheckpoint();
+ bool supportsCheckpoint = false;
+ android::vold::cp_supportsCheckpoint(supportsCheckpoint);
+ bool needs_cp = supportsCheckpoint && android::vold::cp_needsCheckpoint();
while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, crypto_blkdev, 0,
needs_cp)) != 0) {
if (mount_rc == FS_MGR_DOMNT_BUSY) {
--
2.17.1

View File

@ -0,0 +1,38 @@
From e4a3ff285cb25559117d38d573e79a6fc34cc9f5 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 7 Mar 2020 14:49:09 +0100
Subject: [PATCH 8/9] Failing to create facedata shouldn't be fatal
Some Pie vendors create it on their own, so SELinux would deny that
Also not all devices have face unlock anyway
See https://github.com/phhusson/treble_experimentations/issues/1119
---
vold_prepare_subdirs.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/vold_prepare_subdirs.cpp b/vold_prepare_subdirs.cpp
index a620edd..e07528f 100644
--- a/vold_prepare_subdirs.cpp
+++ b/vold_prepare_subdirs.cpp
@@ -136,7 +136,7 @@ static bool prepare_subdirs(const std::string& volume_uuid, int user_id, int fla
}
auto facedata_path = vendor_de_path + "/facedata";
if (!prepare_dir(sehandle, 0700, AID_SYSTEM, AID_SYSTEM, facedata_path)) {
- return false;
+ LOG(ERROR) << "Failed preparing folder for de facedata";
}
}
if (flags & android::os::IVold::STORAGE_FLAG_CE) {
@@ -156,7 +156,7 @@ static bool prepare_subdirs(const std::string& volume_uuid, int user_id, int fla
auto vendor_ce_path = android::vold::BuildDataVendorCePath(user_id);
auto facedata_path = vendor_ce_path + "/facedata";
if (!prepare_dir(sehandle, 0700, AID_SYSTEM, AID_SYSTEM, facedata_path)) {
- return false;
+ LOG(ERROR) << "Failed preparing folder for de facedata";
}
}
}
--
2.17.1

View File

@ -0,0 +1,25 @@
From 110923dbe0191b030e1ee6f25f3109de78a8f876 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 11 Mar 2020 14:02:35 +0100
Subject: [PATCH 9/9] Every voldmanaged storage is adoptable
---
main.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/main.cpp b/main.cpp
index 27a701b..cd1d6dd 100644
--- a/main.cpp
+++ b/main.cpp
@@ -249,7 +249,7 @@ static int process_config(VolumeManager* vm, bool* has_adoptable, bool* has_quot
std::string nickname(entry.label);
int flags = 0;
- if (entry.is_encryptable()) {
+ if (entry.is_encryptable() || true) {
flags |= android::vold::Disk::Flags::kAdoptable;
*has_adoptable = true;
}
--
2.17.1