Created
March 5, 2020 20:11
-
-
Save phhusson/c80b25f668b57d4694c5ffd5384e602a to your computer and use it in GitHub Desktop.
OPPO/Realme/OnePlus optical fingerprint sensor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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