Skip to content

Instantly share code, notes, and snippets.

@phhusson
Created May 14, 2020 16:44
Show Gist options
  • Save phhusson/94143e11ece2335ad4819f3e18296f08 to your computer and use it in GitHub Desktop.
Save phhusson/94143e11ece2335ad4819f3e18296f08 to your computer and use it in GitHub Desktop.
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