414 lines
16 KiB
Diff
414 lines
16 KiB
Diff
From b15c825ccb48260a85695db41aff138787d1817f Mon Sep 17 00:00:00 2001
|
|
From: Pierre-Hugues Husson <phh@phh.me>
|
|
Date: Sun, 24 Mar 2019 22:48:39 +0100
|
|
Subject: [PATCH] wip
|
|
|
|
Change-Id: I50fa9a7a670cef5b93fc4a3a027f1587b1214831
|
|
---
|
|
Android.bp | 2 +
|
|
services/core/Android.bp | 1 +
|
|
.../biometrics/fingerprint/FacolaView.java | 210 ++++++++++++++++++
|
|
.../fingerprint/FingerprintService.java | 26 ++-
|
|
.../testharness/TestHarnessModeService.java | 7 +-
|
|
.../com/android/server/wm/ActivityRecord.java | 6 -
|
|
...om_android_server_lights_LightsService.cpp | 15 +-
|
|
7 files changed, 255 insertions(+), 12 deletions(-)
|
|
create mode 100644 services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
|
|
|
|
diff --git a/Android.bp b/Android.bp
|
|
index 16abdbf79de..d01dc639c8f 100644
|
|
--- a/Android.bp
|
|
+++ b/Android.bp
|
|
@@ -777,6 +777,8 @@ java_defaults {
|
|
"android.hardware.vibrator-V1.2-java",
|
|
"android.hardware.vibrator-V1.3-java",
|
|
"android.hardware.wifi-V1.0-java-constants",
|
|
+ "vendor.mediatek.hardware.radio-V2.0-java",
|
|
+ "vendor.samsung.hardware.radio-V1.2-java",
|
|
"devicepolicyprotosnano",
|
|
],
|
|
|
|
diff --git a/services/core/Android.bp b/services/core/Android.bp
|
|
index ee26710cf7b..2e7118da1c0 100644
|
|
--- a/services/core/Android.bp
|
|
+++ b/services/core/Android.bp
|
|
@@ -55,6 +55,7 @@ java_library_static {
|
|
"dnsresolver_aidl_interface-V2-java",
|
|
"netd_aidl_interface-V2-java",
|
|
"netd_event_listener_interface-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
|
|
new file mode 100644
|
|
index 00000000000..8829bcb7e48
|
|
--- /dev/null
|
|
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
|
|
@@ -0,0 +1,210 @@
|
|
+/**
|
|
+ * Copyright (C) 2019 The Android Open Source Project
|
|
+ *
|
|
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
+ * you may not use this file except in compliance with the License.
|
|
+ * You may obtain a copy of the License at
|
|
+ *
|
|
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
+ *
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
+ * See the License for the specific language governing permissions and
|
|
+ * limitations under the License.
|
|
+ */
|
|
+
|
|
+package com.android.server.biometrics.fingerprint;
|
|
+
|
|
+import android.graphics.Canvas;
|
|
+import android.graphics.Color;
|
|
+import android.graphics.Paint;
|
|
+import android.content.Context;
|
|
+import android.view.View.OnTouchListener;
|
|
+import android.view.View;
|
|
+import android.widget.ImageView;
|
|
+import android.view.MotionEvent;
|
|
+import android.util.Slog;
|
|
+
|
|
+import android.view.WindowManager;
|
|
+import android.graphics.PixelFormat;
|
|
+import android.view.Gravity;
|
|
+
|
|
+import java.io.PrintWriter;
|
|
+
|
|
+import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
|
|
+
|
|
+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 final Paint mPaintFingerprint = new Paint();
|
|
+ private final Paint mPaintShow = new Paint();
|
|
+ private IXiaomiFingerprint mXiaomiFingerprint = null;
|
|
+ private boolean mInsideCircle = false;
|
|
+ private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
|
|
+
|
|
+ private final static float UNTOUCHED_DIM = .1f;
|
|
+ private final static float TOUCHED_DIM = .9f;
|
|
+
|
|
+ private final HandlerThread mHandlerThread;
|
|
+ private final Handler mHandler;
|
|
+
|
|
+ private final WindowManager mWM;
|
|
+ FacolaView(Context context) {
|
|
+ super(context);
|
|
+
|
|
+ mHandlerThread = new HandlerThread("FacolaThread");
|
|
+ mHandlerThread.start();
|
|
+ mHandler = new Handler(mHandlerThread.getLooper());
|
|
+
|
|
+ String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
|
|
+ String[] size = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height", "").split(",");
|
|
+ Slog.d("PHH-Enroll", "FacolaView hello");
|
|
+ if(size.length == 2 && location.length == 2) {
|
|
+ Slog.d("PHH-Enroll", "Got real values");
|
|
+ mX = Integer.parseInt(location[0]);
|
|
+ mY = Integer.parseInt(location[1]);
|
|
+ mW = Integer.parseInt(size[0]);
|
|
+ mH = Integer.parseInt(size[1]);
|
|
+ } else {
|
|
+ mX = -1;
|
|
+ mY = -1;
|
|
+ mW = -1;
|
|
+ mH = -1;
|
|
+ }
|
|
+
|
|
+ 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...");
|
|
+ try {
|
|
+ if(mW != -1)
|
|
+ mXiaomiFingerprint = IXiaomiFingerprint.getService();
|
|
+ } catch(Exception e) {
|
|
+ Slog.d("PHH-Enroll", "Failed getting xiaomi fingerprint service", e);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ protected void onDraw(Canvas canvas) {
|
|
+ super.onDraw(canvas);
|
|
+
|
|
+ Slog.d("PHH-Enroll", "Drawing at " + mX + ", " + mY + ", " + mW + ", " + mH);
|
|
+ //TODO w!=h?
|
|
+ if(mInsideCircle) {
|
|
+ try {
|
|
+ int nitValue = 3;
|
|
+ if(mXiaomiFingerprint != null)
|
|
+ mXiaomiFingerprint.extCmd(0xa, nitValue);
|
|
+ } catch(Exception e) {
|
|
+ Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
|
|
+ }
|
|
+
|
|
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintFingerprint);
|
|
+ } else {
|
|
+ try {
|
|
+ if(mXiaomiFingerprint != null)
|
|
+ mXiaomiFingerprint.extCmd(0xa, 0);
|
|
+ } catch(Exception e) {
|
|
+ Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
|
|
+ }
|
|
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean onTouch(View v, MotionEvent event) {
|
|
+ float x = event.getAxisValue(MotionEvent.AXIS_X);
|
|
+ float y = event.getAxisValue(MotionEvent.AXIS_Y);
|
|
+
|
|
+ boolean newInside = (x > 0 && x < mW) && (y > 0 && y < mW);
|
|
+ if(event.getAction() == MotionEvent.ACTION_UP)
|
|
+ newInside = false;
|
|
+
|
|
+ Slog.d("PHH-Enroll", "Got action " + event.getAction() + ", x = " + x + ", y = " + y + ", inside = " + mInsideCircle + "/" + newInside);
|
|
+ if(newInside == mInsideCircle) return mInsideCircle;
|
|
+ mInsideCircle = newInside;
|
|
+
|
|
+ invalidate();
|
|
+
|
|
+ if(!mInsideCircle) {
|
|
+ mParams.screenBrightness = .0f;
|
|
+ mParams.dimAmount = UNTOUCHED_DIM;
|
|
+ mWM.updateViewLayout(this, mParams);
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ mParams.dimAmount = TOUCHED_DIM;
|
|
+ mParams.screenBrightness = 1.0f;
|
|
+ mWM.updateViewLayout(this, mParams);
|
|
+
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public void show() {
|
|
+ Slog.d("PHH-Enroll", "Show", new Exception());
|
|
+ if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
|
|
+
|
|
+ try {
|
|
+ PrintWriter writer = new PrintWriter("/sys/devices/virtual/touch/tp_dev/fod_status", "UTF-8");
|
|
+ writer.println("1");
|
|
+ writer.close();
|
|
+ } catch(Exception e) {
|
|
+ Slog.d("PHH-Enroll", "Failed setting fod status for touchscreen");
|
|
+ }
|
|
+
|
|
+ mParams.x = mX;
|
|
+ mParams.y = mY;
|
|
+
|
|
+ mParams.height = mW;
|
|
+ mParams.width = mH;
|
|
+ mParams.format = PixelFormat.TRANSLUCENT;
|
|
+
|
|
+ mParams.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
|
|
+ mParams.setTitle("Fingerprint on display");
|
|
+ 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.packageName = "android";
|
|
+
|
|
+ mParams.gravity = Gravity.TOP | Gravity.LEFT;
|
|
+ mHandler.post( () -> {
|
|
+ mWM.addView(this, mParams);
|
|
+ });
|
|
+
|
|
+ }
|
|
+
|
|
+ public void hide() {
|
|
+ Slog.d("PHH-Enroll", "Hide", new Exception());
|
|
+ if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
|
|
+
|
|
+ try {
|
|
+ if(mXiaomiFingerprint != null)
|
|
+ mXiaomiFingerprint.extCmd(0xa, 0);
|
|
+ } catch(Exception e) {
|
|
+ Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
|
|
+ }
|
|
+ try {
|
|
+ PrintWriter writer = new PrintWriter("/sys/devices/virtual/touch/tp_dev/fod_status", "UTF-8");
|
|
+ writer.println("0");
|
|
+ writer.close();
|
|
+ } catch(Exception e) {
|
|
+ Slog.d("PHH-Enroll", "Failed setting fod status for touchscreen");
|
|
+ }
|
|
+
|
|
+ Slog.d("PHH-Enroll", "Removed facola");
|
|
+ mHandler.post( () -> {
|
|
+ mWM.removeView(this);
|
|
+ });
|
|
+ }
|
|
+}
|
|
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 19593e7e047..c7de87126e8 100644
|
|
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
|
|
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
|
|
@@ -120,8 +120,10 @@ public class FingerprintService extends BiometricServiceBase {
|
|
}
|
|
}
|
|
}
|
|
+ private FacolaView mFacola;
|
|
|
|
private final class FingerprintAuthClient extends AuthenticationClientImpl {
|
|
+
|
|
@Override
|
|
protected boolean isFingerprint() {
|
|
return true;
|
|
@@ -170,6 +172,26 @@ public class FingerprintService extends BiometricServiceBase {
|
|
|
|
return super.handleFailedAttempt();
|
|
}
|
|
+
|
|
+ @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;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int start() {
|
|
+ mFacola.show();
|
|
+ return super.start();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public int stop(boolean initiatedByClient) {
|
|
+ mFacola.hide();
|
|
+ return super.stop(initiatedByClient);
|
|
+ }
|
|
}
|
|
|
|
/**
|
|
@@ -180,7 +202,6 @@ public class FingerprintService extends BiometricServiceBase {
|
|
/**
|
|
* The following methods contain common code which is shared in biometrics/common.
|
|
*/
|
|
-
|
|
@Override // Binder call
|
|
public long preEnroll(IBinder token) {
|
|
checkPermission(MANAGE_FINGERPRINT);
|
|
@@ -725,6 +746,7 @@ public class FingerprintService extends BiometricServiceBase {
|
|
mAlarmManager = context.getSystemService(AlarmManager.class);
|
|
context.registerReceiver(mLockoutReceiver, new IntentFilter(getLockoutResetIntent()),
|
|
getLockoutBroadcastPermission(), null /* handler */);
|
|
+ mFacola = new FacolaView(context);
|
|
}
|
|
|
|
@Override
|
|
@@ -952,6 +974,7 @@ public class FingerprintService extends BiometricServiceBase {
|
|
Slog.w(TAG, "startPreEnroll: no fingerprint HAL!");
|
|
return 0;
|
|
}
|
|
+ mFacola.show();
|
|
try {
|
|
return daemon.preEnroll();
|
|
} catch (RemoteException e) {
|
|
@@ -966,6 +989,7 @@ public class FingerprintService extends BiometricServiceBase {
|
|
Slog.w(TAG, "startPostEnroll: no fingerprint HAL!");
|
|
return 0;
|
|
}
|
|
+ mFacola.hide();
|
|
try {
|
|
return daemon.postEnroll();
|
|
} catch (RemoteException e) {
|
|
diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
|
|
index fcf87ee2a4b..0aa948417c1 100644
|
|
--- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java
|
|
+++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
|
|
@@ -150,7 +150,12 @@ public class TestHarnessModeService extends SystemService {
|
|
+ "PersistentDataBlockManagerInternal was bound!");
|
|
return null;
|
|
}
|
|
- byte[] testHarnessModeData = blockManager.getTestHarnessModeData();
|
|
+ byte[] testHarnessModeData = null;
|
|
+ try {
|
|
+ testHarnessModeData = blockManager.getTestHarnessModeData();
|
|
+ } catch(Exception e) {
|
|
+ Slog.e(TAG, "Failed to read block for test harness", e);
|
|
+ }
|
|
if (testHarnessModeData == null || testHarnessModeData.length == 0) {
|
|
// There's no data to apply, so leave it as-is.
|
|
return null;
|
|
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
|
|
index 479babc4c7d..1f972dd4918 100644
|
|
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
|
|
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
|
|
@@ -2833,12 +2833,6 @@ final class ActivityRecord extends ConfigurationContainer {
|
|
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
|
|
private void updateOverrideConfiguration() {
|
|
final Configuration overrideConfig = mTmpConfig;
|
|
- if(info.applicationInfo.targetSdkVersion < O) {
|
|
- try {
|
|
- maxAspectRatio = Float.parseFloat(SystemProperties.get("persist.sys.max_aspect_ratio.pre_o", ""));
|
|
- } catch (Throwable t) {}
|
|
- Log.d("PHH", "Overrode aspect ratio because pre-o to " + maxAspectRatio);
|
|
- }
|
|
if (shouldUseSizeCompatMode()) {
|
|
if (mCompatDisplayInsets != null) {
|
|
// The override configuration is set only once in size compatibility mode.
|
|
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
|
|
index 20de7985d1d..2b50d04233e 100644
|
|
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
|
|
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
|
|
@@ -46,6 +46,9 @@ using ISecLight = ::vendor::samsung::hardware::light::V2_0::ISecLight;
|
|
using SecType = ::vendor::samsung::hardware::light::V2_0::SecType;
|
|
static bool sLightSupported = true;
|
|
|
|
+static sp<ISecLight> sSecHal;
|
|
+static bool sSecTried = false;
|
|
+
|
|
static bool validate(jint light, jint flash, jint brightness) {
|
|
bool valid = true;
|
|
|
|
@@ -155,20 +158,24 @@ static void setLight_native(
|
|
colorAlpha = (colorAlpha * brightnessLevel) / 0xFF;
|
|
colorARGB = (colorAlpha << 24) + (colorARGB & 0x00FFFFFF);
|
|
}
|
|
-
|
|
- sp<ISecLight> secHal = ISecLight::getService();
|
|
|
|
- if(secHal != nullptr) {
|
|
+ if(!sSecTried) {
|
|
+ sSecHal = ISecLight::getService();
|
|
+ sSecTried = true;
|
|
+ }
|
|
+
|
|
+ if(sSecHal != nullptr) {
|
|
SecType type = static_cast<SecType>(light);
|
|
LightState state = constructState(
|
|
colorARGB, flashMode, onMS, offMS, brightnessMode);
|
|
|
|
{
|
|
android::base::Timer t;
|
|
- Return<Status> ret = secHal->setLightSec(type, state);
|
|
+ Return<Status> ret = sSecHal->setLightSec(type, state);
|
|
processReturn(ret, static_cast<Type>(light), state);
|
|
if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
|
|
}
|
|
+ return;
|
|
}
|
|
|
|
Type type = static_cast<Type>(light);
|
|
--
|
|
2.17.1
|
|
|