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