Skip to content

Instantly share code, notes, and snippets.

@phhusson
Created March 5, 2020 20:11
Show Gist options
  • Select an option

  • Save phhusson/c80b25f668b57d4694c5ffd5384e602a to your computer and use it in GitHub Desktop.

Select an option

Save phhusson/c80b25f668b57d4694c5ffd5384e602a to your computer and use it in GitHub Desktop.
OPPO/Realme/OnePlus optical fingerprint sensor
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 5ce72b087..a926413a9 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -335,7 +335,19 @@ 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;
+ }
+ ALOGE("Setting z = %d!", z);
+
+ 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));
}
@@ -367,6 +379,19 @@ void OutputLayer::writeStateToHWC(bool includeGeometry) const {
static_cast<int32_t>(error));
}
+/*
+ if(layer == "Sys2023:dream") uvar8 = 0x41000011;
+ if(layer == "OnScreenFingerprintIconForAnim") uvar8 = 0x41000032;
+ if(layer == "OnScreenFingerprintIcon") uvar8 = 0x41000031;
+ if(layer == "OnScreenFingerprintPressedIcon") uvar8 = 0x41000033;
+ if (auto error = hwcLayer->setPlaneCust(outputIndependentState.alpha);
+ error != HWC2::Error::None) {
+ ALOGE("[%s] Failed to set plane alpha %.3f: %s (%d)", mLayerFE->getDebugName(),
+ outputIndependentState.alpha, to_string(error).c_str(),
+ static_cast<int32_t>(error));
+ }
+ */
+
if (auto error =
hwcLayer->setInfo(outputIndependentState.type, outputIndependentState.appId);
error != HWC2::Error::None) {
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..fd23b44712a 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -50,8 +50,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
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;
@@ -63,17 +65,28 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final boolean samsungFod = samsungHasCmd("fod_enable");
private final 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);
+ };
+ };
+
+
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(",");
@@ -88,10 +101,17 @@ public class FacolaView extends ImageView implements OnTouchListener {
mW = Integer.parseInt(size[0]);
mH = Integer.parseInt(size[1]);
} else {
- mX = -1;
- mY = -1;
- mW = -1;
- mH = -1;
+ //a50
+ //mX = -1;//443;// - 190/2;
+ //mY = -1;// 1972;// - 190 / 2;
+ //mW = -1;//190;
+ //mH = -1;//190;
+
+ //x2 pro
+ mX = 445;// - 190/2;
+ mY = 1988;// - 190/2;
+ mW = 190;
+ mH = 190;
}
mPaintFingerprint.setAntiAlias(true);
@@ -118,6 +138,11 @@ 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);
+ }
}
}
@@ -143,6 +168,29 @@ public class FacolaView extends ImageView implements OnTouchListener {
//TODO w!=h?
if(mInsideCircle) {
try {
+ 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;
+
+ mParamsTouched.packageName = "android";
+
+ mParamsTouched.gravity = Gravity.TOP | Gravity.LEFT;
+ if(!mFullGreenDisplayed) {
+ mHandler.post( () -> {
+ mFullGreenDisplayed = true;
+ mWM.addView(mFullGreen, mParamsTouched);
+ });
+ }
+
int nitValue = 2;
if(mXiaomiFingerprint != null) {
mXiaomiFingerprint.extCmd(0xa, nitValue);
@@ -151,13 +199,13 @@ public class FacolaView extends ImageView implements OnTouchListener {
} 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) -> {} );
+ } else if(mOppoFingerprint != null) {
+ //mOppoFingerprint.touchDown();
}
} 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 {
@@ -168,12 +216,20 @@ public class FacolaView extends ImageView implements OnTouchListener {
} else if(mSamsungFingerprint != null) {
mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 1 /* released */, new java.util.ArrayList<Byte>(),
(int retval, java.util.ArrayList<Byte> out) -> {} );
+ } else if(mOppoFingerprint != null) {
+ //mOppoFingerprint.touchUp();
}
} 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( () -> {
+ mFullGreenDisplayed = false;
+ mWM.removeView(mFullGreen);
+ });
+ }
}
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
}
@Override
@@ -211,7 +267,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,6 +318,14 @@ 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(samsungFod) {
samsungCmd("fod_enable,0");
@@ -325,4 +397,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);
+ }
+ }
+
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment