From ad26b4fe426344371cd018050025d7ca4d47bec2 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson 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 | 13 +- 7 files changed, 254 insertions(+), 11 deletions(-) create mode 100644 services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java diff --git a/Android.bp b/Android.bp index bdd88034655..5e79350ac5c 100644 --- a/Android.bp +++ b/Android.bp @@ -779,6 +779,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 f6e0742aa67..92c0cc5dc85 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); + } } /** @@ -181,7 +203,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); @@ -727,6 +748,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 @@ -954,6 +976,7 @@ public class FingerprintService extends BiometricServiceBase { Slog.w(TAG, "startPreEnroll: no fingerprint HAL!"); return 0; } + mFacola.show(); try { return daemon.preEnroll(); } catch (RemoteException e) { @@ -968,6 +991,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 d9c85c0ca50..0740f70bbf4 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2835,12 +2835,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 2f77726d5bd..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 sSecHal; +static bool sSecTried = false; + static bool validate(jint light, jint flash, jint brightness) { bool valid = true; @@ -156,19 +159,23 @@ static void setLight_native( colorARGB = (colorAlpha << 24) + (colorARGB & 0x00FFFFFF); } - sp secHal = ISecLight::getService(); + if(!sSecTried) { + sSecHal = ISecLight::getService(); + sSecTried = true; + } - if(secHal != nullptr) { + if(sSecHal != nullptr) { SecType type = static_cast(light); LightState state = constructState( colorARGB, flashMode, onMS, offMS, brightnessMode); { android::base::Timer t; - Return ret = secHal->setLightSec(type, state); + Return ret = sSecHal->setLightSec(type, state); processReturn(ret, static_cast(light), state); if (t.duration() > 50ms) ALOGD("Excessive delay setting light"); } + return; } Type type = static_cast(light); -- 2.17.1