Created
May 14, 2020 16:44
-
-
Save phhusson/94143e11ece2335ad4819f3e18296f08 to your computer and use it in GitHub Desktop.
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
framework/native | |
diff --git a/services/surfaceflinger/BufferLayerConsumer.cpp b/services/surfaceflinger/BufferLayerConsumer.cpp | |
index 414814a6f..2a25d1b8e 100644 | |
--- a/services/surfaceflinger/BufferLayerConsumer.cpp | |
+++ b/services/surfaceflinger/BufferLayerConsumer.cpp | |
@@ -77,8 +77,13 @@ BufferLayerConsumer::BufferLayerConsumer(const sp<IGraphicBufferConsumer>& bq, | |
BLC_LOGV("BufferLayerConsumer"); | |
memcpy(mCurrentTransformMatrix, mtxIdentity.asArray(), sizeof(mCurrentTransformMatrix)); | |
+ uint64_t usageBits = DEFAULT_USAGE_FLAGS; | |
+ if(layer != nullptr && strstr(layer->getDebugName(), "Fingerprint on display.touched") != nullptr) { | |
+ ALOGE("Setting fingerprint usage bits from BufferLayerConsumer ctor"); | |
+ usageBits |= 0x400000000LL; | |
+ } | |
- mConsumer->setConsumerUsageBits(DEFAULT_USAGE_FLAGS); | |
+ mConsumer->setConsumerUsageBits(usageBits); | |
} | |
status_t BufferLayerConsumer::setDefaultBufferSize(uint32_t w, uint32_t h) { | |
@@ -517,7 +522,13 @@ void BufferLayerConsumer::abandonLocked() { | |
} | |
status_t BufferLayerConsumer::setConsumerUsageBits(uint64_t usage) { | |
- return ConsumerBase::setConsumerUsageBits(usage | DEFAULT_USAGE_FLAGS); | |
+ uint64_t usageBits = usage | DEFAULT_USAGE_FLAGS; | |
+ sp<Layer> l = mLayer.promote(); | |
+ if(l.get() != nullptr && strstr(l->getDebugName(), "Fingerprint on display.touched") != nullptr) { | |
+ ALOGE("Setting fingerprint usage bits from BufferLayerConsumer setConsumerUsageBits"); | |
+ usageBits |= 0x400000000LL; | |
+ } | |
+ return ConsumerBase::setConsumerUsageBits(usageBits); | |
} | |
void BufferLayerConsumer::dumpLocked(String8& result, const char* prefix) const { | |
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp | |
index cbb9d658e..ad80a8f1d 100644 | |
--- a/services/surfaceflinger/BufferQueueLayer.cpp | |
+++ b/services/surfaceflinger/BufferQueueLayer.cpp | |
@@ -536,7 +536,13 @@ void BufferQueueLayer::onFirstRef() { | |
mConsumer = | |
new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this); | |
} | |
- mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); | |
+ uint64_t usageBits = getEffectiveUsage(0); | |
+ ALOGE("onFirstRef properties for %s", mName.c_str()); | |
+ if(strstr(mName.c_str(), "Fingerprint on display.untouched") != nullptr) { | |
+ ALOGE("Found on touched layer!"); | |
+ usageBits |= 0x400000000LL; | |
+ } | |
+ mConsumer->setConsumerUsageBits(usageBits); | |
mConsumer->setContentsChangedListener(this); | |
mConsumer->setName(mName); | |
@@ -565,7 +571,13 @@ status_t BufferQueueLayer::setDefaultBufferProperties(uint32_t w, uint32_t h, Pi | |
setDefaultBufferSize(w, h); | |
mConsumer->setDefaultBufferFormat(format); | |
- mConsumer->setConsumerUsageBits(getEffectiveUsage(0)); | |
+ uint64_t usageBits = getEffectiveUsage(0); | |
+ ALOGE("Setting buffer properties for %s", mName.c_str()); | |
+ if(strstr(mName.c_str(), "Fingerprint on display.untouched") != nullptr) { | |
+ ALOGE("Found on touched layer!"); | |
+ usageBits |= 0x400000000LL; | |
+ } | |
+ mConsumer->setConsumerUsageBits(usageBits); | |
return NO_ERROR; | |
} | |
device/phh/treble/rw-system.sh | |
+ # This is for Samsung Galaxy devices with HBM FOD | |
+ # On those devices, a magic Layer usageBits switches to "mask_brightness" | |
+ # But default is 255, so set it to max instead | |
+ cat /sys/class/backlight/*/max_brightness |sort -n |tail -n 1 > /sys/class/lcd/panel/mask_brightness | |
frameworks/base | |
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 a87f7e78af4..0f6b5454eb8 100644 | |
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java | |
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java | |
@@ -35,13 +35,16 @@ import java.io.BufferedReader; | |
import java.io.File; | |
import java.io.FileReader; | |
import java.io.PrintWriter; | |
+import java.util.Arrays; | |
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 vendor.samsung.hardware.biometrics.fingerprint.V3_0.ISehBiometricsFingerprint; | |
import android.hardware.display.DisplayManager; | |
+import android.os.FileObserver; | |
import android.os.Handler; | |
import android.os.HandlerThread; | |
import android.os.ServiceManager; | |
@@ -52,13 +55,15 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
private final Paint mPaintShow = new Paint(); | |
private IXiaomiFingerprint mXiaomiFingerprint = null; | |
private IGoodixFPExtendService mGoodixFingerprint = null; | |
+ private vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon mGoodixFingerprintV2_1 = null; | |
private ISecBiometricsFingerprint mSamsungFingerprint = null; | |
+ private ISehBiometricsFingerprint mSamsungFingerprint3_0 = 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 UNTOUCHED_DIM = .0f; | |
private final static float TOUCHED_DIM = .9f; | |
private final HandlerThread mHandlerThread; | |
@@ -68,6 +73,12 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
private final DisplayManager mDM; | |
private final boolean samsungFod = samsungHasCmd("fod_enable"); | |
private boolean noDim; | |
+ private boolean bypassedBrightness; | |
+ private boolean isDown = false; | |
+ | |
+ private FileObserver samsungCallback = null; | |
+ | |
+ private static boolean doneCalibrationOnce = true; | |
private boolean mFullGreenDisplayed = false; | |
private final View mFullGreen; | |
@@ -92,7 +103,7 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
mHandlerThread.start(); | |
mHandler = new Handler(mHandlerThread.getLooper()); | |
- noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", true); | |
+ noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false); | |
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(","); | |
@@ -107,6 +118,17 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
mW = Integer.parseInt(size[0]); | |
mH = Integer.parseInt(size[1]); | |
} else { | |
+ //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; | |
mX = -1; | |
mY = -1; | |
mW = -1; | |
@@ -148,11 +170,21 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
} catch(Exception e) { | |
Slog.d("PHH-Enroll", "Failed getting goodix fingerprint service", e); | |
} | |
+ try { | |
+ mGoodixFingerprintV2_1 = vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon.getService(); | |
+ } catch(Exception e) { | |
+ Slog.d("PHH-Enroll", "Failed getting goodix2 fingerprint service", e); | |
+ } | |
try { | |
mSamsungFingerprint = ISecBiometricsFingerprint.getService(); | |
} catch(Exception e) { | |
Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e); | |
} | |
+ try { | |
+ mSamsungFingerprint3_0 = ISehBiometricsFingerprint.getService(); | |
+ } catch(Exception e) { | |
+ Slog.d("PHH-Enroll", "Failed getting samsung 3.0 fingerprint service", e); | |
+ } | |
try { | |
mOppoFingerprint = vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint.getService(); | |
} catch(Exception e) { | |
@@ -160,13 +192,30 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
} | |
} | |
+ if(mSamsungFingerprint3_0 != null || mSamsungFingerprint != null) { | |
+ noDim = true; | |
+ bypassedBrightness = true; | |
+ samsungCallback = new FileObserver("/sys/class/lcd/panel/actual_mask_brightness", FileObserver.MODIFY) { | |
+ @Override | |
+ public void onEvent(int event, String path) { | |
+ String v = readFile("/sys/class/lcd/panel/actual_mask_brightness"); | |
+ Slog.d("PHH-Enroll", "Samsung brightness callback said " + v); | |
+ } | |
+ }; | |
+ samsungCallback.startWatching(); | |
+ } | |
+ | |
if(mX != -1) { | |
android.os.SystemProperties.set("persist.sys.phh.has_fod", "true"); | |
} else { | |
android.os.SystemProperties.set("persist.sys.phh.has_fod", "false"); | |
} | |
+ | |
+ bypassedBrightness = hbmCtrl1.exists() || noDim; | |
} | |
+ private final File hbmCtrl1 = new File("/proc/leds/hbm_mode"); | |
+ | |
private final File oppoFod = new File("/sys/kernel/oppo_display/notify_fppress"); | |
private void oppoPress(boolean pressed) { | |
if(!oppoFod.exists()) return; | |
@@ -200,10 +249,12 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
mParamsTouched.setTitle("Fingerprint on display.touched"); | |
mParamsTouched.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | | |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; | |
- mParamsTouched.dimAmount = UNTOUCHED_DIM; | |
+ writeFile(hbmCtrl1, "1"); | |
if(!noDim) { | |
mParamsTouched.dimAmount = TOUCHED_DIM; | |
- mParamsTouched.screenBrightness = 1.0f; | |
+ if(!bypassedBrightness) { | |
+ mParamsTouched.screenBrightness = 1.0f; | |
+ } | |
} | |
mParamsTouched.packageName = "android"; | |
@@ -216,39 +267,58 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
mWM.addView(mFullGreen, mParamsTouched); | |
}); | |
} | |
- | |
- int nitValue = 2; | |
- mHandler.postDelayed( () -> { | |
- try { | |
- if(mXiaomiFingerprint != null) { | |
+ if(!isDown) { | |
+ isDown = true; | |
+ int nitValue = 2; | |
+ mHandler.postDelayed( () -> { | |
+ try { | |
+ if(mXiaomiFingerprint != null) { | |
mXiaomiFingerprint.extCmd(0xa, nitValue); | |
- } else if(mGoodixFingerprint != null) { | |
+ } else if(mGoodixFingerprint != null) { | |
mGoodixFingerprint.goodixExtendCommand(10, 1); | |
- } else if(mSamsungFingerprint != null) { | |
+ } else if(mGoodixFingerprintV2_1 != null) { | |
+ mGoodixFingerprintV2_1.sendCommand(0x600, new java.util.ArrayList<Byte>(), | |
+ (int retval, java.util.ArrayList<Byte> out) -> {} ); | |
+ } 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); | |
+ } else if(mSamsungFingerprint3_0 != null) { | |
+ mSamsungFingerprint3_0.sehRequest(22 /* SEM_FINGER_STATE */, 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); | |
} else { | |
+ writeFile(hbmCtrl1, "1"); | |
oppoPress(false); | |
- try { | |
- if(mXiaomiFingerprint != null) { | |
- mXiaomiFingerprint.extCmd(0xa, 0); | |
- } else if(mGoodixFingerprint != null) { | |
- mGoodixFingerprint.goodixExtendCommand(10, 0); | |
- } 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) -> {} ); | |
+ if(isDown) { | |
+ isDown = false; | |
+ try { | |
+ if(mXiaomiFingerprint != null) { | |
+ mXiaomiFingerprint.extCmd(0xa, 0); | |
+ } else if(mGoodixFingerprint != null) { | |
+ mGoodixFingerprint.goodixExtendCommand(10, 0); | |
+ } else if(mGoodixFingerprintV2_1 != null) { | |
+ mGoodixFingerprintV2_1.sendCommand(0x601, new java.util.ArrayList<Byte>(), | |
+ (int retval, java.util.ArrayList<Byte> out) -> {}); | |
+ } 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(mSamsungFingerprint3_0 != null) { | |
+ mSamsungFingerprint3_0.sehRequest(22 /* SEM_FINGER_STATE */, 1 /* released */, new java.util.ArrayList<Byte>(), | |
+ (int retval, java.util.ArrayList<Byte> out) -> {} ); | |
+ } | |
+ } catch(Exception e) { | |
+ Slog.d("PHH-Enroll", "Failed calling fp extcmd", e); | |
} | |
- } catch(Exception e) { | |
- Slog.d("PHH-Enroll", "Failed calling fp extcmd", e); | |
+ | |
} | |
if(mFullGreenDisplayed) { | |
mHandler.post( () -> { | |
@@ -278,7 +348,9 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
if(!mInsideCircle) { | |
mParams.screenBrightness = .0f; | |
- mParams.dimAmount = UNTOUCHED_DIM; | |
+ if(!noDim) { | |
+ mParams.dimAmount = UNTOUCHED_DIM; | |
+ } | |
mWM.updateViewLayout(this, mParams); | |
return false; | |
} | |
@@ -296,6 +368,34 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
Slog.d("PHH-Enroll", "Show", new Exception()); | |
if(!mHidden) return; | |
mHidden = false; | |
+ try { | |
+ mSamsungFingerprint = ISecBiometricsFingerprint.getService(); | |
+ mSamsungFingerprint.request(20 /* SEM_FINGER_STATE */, 0, 0 /* released */, new java.util.ArrayList<Byte>(), | |
+ (int retval, java.util.ArrayList<Byte> out) -> {} ); | |
+ } catch(Exception e) { | |
+ Slog.d("PHH-Enroll", "Failed setting fast fingerprint recognition"); | |
+ } | |
+ try { | |
+ mSamsungFingerprint3_0 = ISehBiometricsFingerprint.getService(); | |
+ Slog.d("PHH-Enroll", "Samsung ask for sensor status"); | |
+ mSamsungFingerprint3_0.sehRequest(6, 0, new java.util.ArrayList(), (int retval, java.util.ArrayList<Byte> out) -> { | |
+ Slog.d("PHH-Enroll", "Result is " + retval); | |
+ for(int i=0; i<out.size(); i++) { | |
+ Slog.d("PHH-Enroll", "\t" + i + ":" + out.get(i)); | |
+ } | |
+ } ); | |
+ Slog.d("PHH-Enroll", "Samsung ask for sensor brightness value"); | |
+ mSamsungFingerprint3_0.sehRequest(32, 0, new java.util.ArrayList(), (int retval, java.util.ArrayList<Byte> out) -> { | |
+ Slog.d("PHH-Enroll", "Result is " + retval); | |
+ for(int i=0; i<out.size(); i++) { | |
+ Slog.d("PHH-Enroll", "\t" + i + ":" + out.get(i)); | |
+ } | |
+ } ); | |
+ | |
+ } catch(Exception e) { | |
+ Slog.d("PHH-Enroll", "Failed setting samsung3.0 fingerprint recognition", e); | |
+ } | |
+ | |
if(mOppoFingerprint != null) { | |
try { | |
mOppoFingerprint.setScreenState(vendor.oppo.hardware.biometrics.fingerprint.V2_1.FingerprintScreenState.FINGERPRINT_SCREEN_ON); | |
@@ -327,13 +427,18 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
mParams.format = PixelFormat.TRANSLUCENT; | |
mParams.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; | |
- mParams.setTitle("Fingerprint on display"); | |
+ mParams.setTitle("Fingerprint on display.untouched"); | |
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | | |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | | |
- WindowManager.LayoutParams.FLAG_DIM_BEHIND | | |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; | |
- mParams.dimAmount = UNTOUCHED_DIM; | |
- mParams.screenBrightness = .0f; | |
+ if(!noDim) { | |
+ mParams.dimAmount = UNTOUCHED_DIM; | |
+ mParams.screenBrightness = .0f; | |
+ } | |
+ //On Samsung, we want to dim continuously, because we are continuously in HBM | |
+ if(mSamsungFingerprint != null || mSamsungFingerprint3_0 != null) { | |
+ mParams.dimAmount = TOUCHED_DIM; | |
+ } | |
mParams.packageName = "android"; | |
@@ -417,7 +522,7 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
} | |
} | |
- private static void samsungCmd(String cmd) { | |
+ public static void samsungCmd(String cmd) { | |
try { | |
PrintWriter writer = new PrintWriter("/sys/devices/virtual/sec/tsp/cmd", "UTF-8"); | |
writer.println(cmd); | |
@@ -442,4 +547,14 @@ public class FacolaView extends ImageView implements OnTouchListener { | |
} | |
} | |
+ private static void writeFile(File file, String value) { | |
+ try { | |
+ PrintWriter writer = new PrintWriter(file, "UTF-8"); | |
+ writer.println(value); | |
+ writer.close(); | |
+ } catch(Exception e) { | |
+ android.util.Log.d("PHH", "Failed writing to " + file + ": " + value); | |
+ } | |
+ } | |
+ | |
} | |
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java | |
index 1323c5ec0dd..6a147f363b8 100644 | |
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java | |
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java | |
@@ -176,7 +176,6 @@ public class FingerprintService extends BiometricServiceBase { | |
@Override | |
public boolean onAcquired(int acquiredInfo, int vendorCode) { | |
boolean result = super.onAcquired(acquiredInfo, vendorCode); | |
- android.util.Log.d("PHH-Enroll", "acquired ret " + result); | |
if(result) mFacola.hide(); | |
return result; | |
} | |
@@ -185,7 +184,6 @@ public class FingerprintService extends BiometricServiceBase { | |
public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier, | |
boolean authenticated, ArrayList<Byte> token) { | |
boolean result = super.onAuthenticated(identifier, authenticated, token); | |
- android.util.Log.d("PHH-Enroll", "auth-ed ret " + result); | |
if(result) mFacola.hide(); | |
return result; | |
} | |
@@ -637,6 +635,18 @@ public class FingerprintService extends BiometricServiceBase { | |
@Override | |
public void onAcquired(final long deviceId, final int acquiredInfo, final int vendorCode) { | |
mHandler.post(() -> { | |
+ if(acquiredInfo == 6) { | |
+ if(vendorCode == 10002) { | |
+ FacolaView.samsungCmd("set_temperature,1"); | |
+ } | |
+ if(vendorCode == 10004) { | |
+ ClientMonitor cc = FingerprintService.this.getCurrentClient(); | |
+ if (cc != null) { | |
+ FingerprintService.this.startCurrentClient(cc.getCookie()); | |
+ } | |
+ | |
+ } | |
+ } | |
FingerprintService.super.handleAcquired(deviceId, acquiredInfo, vendorCode); | |
}); | |
} | |
@@ -744,6 +754,7 @@ public class FingerprintService extends BiometricServiceBase { | |
Slog.w(TAG, "enroll(): no fingerprint HAL!"); | |
return ERROR_ESRCH; | |
} | |
+ mFacola.show(); | |
return daemon.enroll(cryptoToken, groupId, timeout); | |
} | |
@@ -990,7 +1001,6 @@ public class FingerprintService extends BiometricServiceBase { | |
Slog.w(TAG, "startPreEnroll: no fingerprint HAL!"); | |
return 0; | |
} | |
- mFacola.show(); | |
try { | |
return daemon.preEnroll(); | |
} catch (RemoteException e) { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment