Professional Documents
Culture Documents
package com.android.systemui.biometrics;
import android.app.WallpaperColors;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.res.Configuration;
import android.content.ContentResolver;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.PorterDuff;
import android.os.Handler;
import android.os.UserHandle;
import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteException;
import android.provider.Settings;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.Surface;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import androidx.palette.graphics.Palette;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.statusbar.policy.ConfigurationController;
import
com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
;
import vendor.lineage.biometrics.fingerprint.inscreen.V1_1.IFingerprintInscreen;
import
vendor.lineage.biometrics.fingerprint.inscreen.V1_0.IFingerprintInscreenCallback;
import java.util.NoSuchElementException;
import java.util.Timer;
import java.util.TimerTask;
@Override
public void onFingerUp() {
mHandler.post(() -> hideCircle());
}
};
if (dreaming) {
mBurnInProtectionTimer = new Timer();
mBurnInProtectionTimer.schedule(new BurnInProtectionTask(), 0, 60 *
1000);
} else if (mBurnInProtectionTimer != null) {
mBurnInProtectionTimer.cancel();
}
}
@Override
public void onKeyguardBouncerChanged(boolean isBouncer) {
mIsBouncer = isBouncer;
if (isBouncer) {
hide();
} else if (mUpdateMonitor.isFingerprintDetectionRunning()) {
show();
}
}
@Override
public void onScreenTurnedOff() {
hide();
}
@Override
public void onScreenTurnedOn() {
if (mUpdateMonitor.isFingerprintDetectionRunning()) {
show();
}
}
};
try {
mShouldBoostBrightness = daemon.shouldBoostBrightness();
mPositionX = daemon.getPositionX();
mPositionY = daemon.getPositionY();
mSize = daemon.getSize();
} catch (RemoteException e) {
throw new RuntimeException("Failed to retrieve FOD circle position or
size");
}
mPaintFingerprint.setAntiAlias(true);
mPaintFingerprint.setColor(res.getColor(R.color.config_fodColor));
mWindowManager = context.getSystemService(WindowManager.class);
mNavigationBarSize =
res.getDimensionPixelSize(R.dimen.navigation_bar_size);
mPowerManager = context.getSystemService(PowerManager.class);
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
FODCircleView.class.getSimpleName());
mParams.height = mSize;
mParams.width = mSize;
mParams.format = PixelFormat.TRANSLUCENT;
mParams.setTitle("Fingerprint on display");
mParams.packageName = "android";
mParams.type = WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY;
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_DIM_BEHIND |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
mParams.gravity = Gravity.TOP | Gravity.LEFT;
mWindowManager.addView(this, mParams);
updatePosition();
hide();
mUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
mUpdateMonitor.registerCallback(mMonitorCallback);
updateCutoutFlags();
Dependency.get(ConfigurationController.class).addCallback(this);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mIsCircleShowing) {
canvas.drawCircle(mSize / 2, mSize / 2, mSize / 2.0f,
mPaintFingerprint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getAxisValue(MotionEvent.AXIS_X);
float y = event.getAxisValue(MotionEvent.AXIS_Y);
boolean newIsInside = (x > 0 && x < mSize) && (y > 0 && y < mSize);
@Override
public void onConfigurationChanged(Configuration newConfig) {
updatePosition();
}
@Override
public void onTuningChanged(String key, String newValue) {
mCurBrightness = newValue != null ? Integer.parseInt(newValue) : 0;
setDim(true);
}
mFingerprintInscreenDaemon.setCallback(mFingerprintInscreenCallback);
mFingerprintInscreenDaemon.asBinder().linkToDeath((cookie) -> {
mFingerprintInscreenDaemon = null;
}, 0);
}
} catch (NoSuchElementException | RemoteException e) {
// do nothing
}
}
return mFingerprintInscreenDaemon;
}
setKeepScreenOn(true);
if (mIsDreaming) {
mWakeLock.acquire(300);
}
updateAlpha();
dispatchPress();
setImageResource(R.drawable.fod_icon_pressed);
setColorFilter(Color.argb(0,0,0,0), PorterDuff.Mode.SRC_ATOP);
invalidate();
}
setFODIcon();
setColorFilter(Color.argb(mCurDim,0,0,0),
PorterDuff.Mode.SRC_ATOP);
invalidate();
dispatchRelease();
updateAlpha();
setKeepScreenOn(false);
}
mIsRecognizingAnimEnabled =
Settings.System.getInt(mContext.getContentResolver(),
Settings.System.FOD_RECOGNIZING_ANIMATION, 0) != 0;
if (fodicon == 0) {
this.setImageResource(R.drawable.fod_icon_default_0);
} else if (fodicon == 1) {
this.setImageResource(R.drawable.fod_icon_default_1);
} else if (fodicon == 2) {
this.setImageResource(R.drawable.fod_icon_default_2);
} else if (fodicon == 3) {
this.setImageResource(R.drawable.fod_icon_default_3);
} else if (fodicon == 4) {
this.setImageResource(R.drawable.fod_icon_default_4);
} else if (fodicon == 5) {
this.setImageResource(R.drawable.fod_icon_default_5);
} else if (fodicon == 6) {
this.setImageResource(R.drawable.fod_icon_arc_reactor);
} else if (fodicon == 7) {
this.setImageResource(R.drawable.fod_icon_cpt_america_flat);
} else if (fodicon == 8) {
this.setImageResource(R.drawable.fod_icon_cpt_america_flat_gray);
} else if (fodicon == 9) {
this.setImageResource(R.drawable.fod_icon_dragon_black_flat);
} else if (fodicon == 10) {
this.setImageResource(R.drawable.fod_icon_future);
} else if (fodicon == 11) {
this.setImageResource(R.drawable.fod_icon_glow_circle);
} else if (fodicon == 12) {
this.setImageResource(R.drawable.fod_icon_neon_arc);
} else if (fodicon == 13) {
this.setImageResource(R.drawable.fod_icon_neon_arc_gray);
} else if (fodicon == 14) {
this.setImageResource(R.drawable.fod_icon_neon_circle_pink);
} else if (fodicon == 15) {
this.setImageResource(R.drawable.fod_icon_neon_triangle);
} else if (fodicon == 16) {
this.setImageResource(R.drawable.fod_icon_paint_splash_circle);
} else if (fodicon == 17) {
this.setImageResource(R.drawable.fod_icon_rainbow_horn);
} else if (fodicon == 18) {
this.setImageResource(R.drawable.fod_icon_shooky);
} else if (fodicon == 19) {
this.setImageResource(R.drawable.fod_icon_spiral_blue);
} else if (fodicon == 20) {
this.setImageResource(R.drawable.fod_icon_sun_metro);
}
if (useWallpaperColor()) {
try {
WallpaperManager wallpaperManager =
WallpaperManager.getInstance(mContext);
Drawable wallpaperDrawable = wallpaperManager.getDrawable();
Bitmap bitmap = ((BitmapDrawable)wallpaperDrawable).getBitmap();
if (bitmap != null) {
Palette p = Palette.from(bitmap).generate();
int wallColor = p.getDominantColor(iconcolor);
if (iconcolor != wallColor) {
iconcolor = wallColor;
}
this.setColorFilter(lighter(iconcolor, 3));
}
} catch (Exception e) {
// Nothing to do
}
} else {
this.setColorFilter(null);
}
}
if (mIsBouncer) {
// Ignore show calls when Keyguard pin screen is being shown
return;
}
Dependency.get(TunerService.class).addTunable(this, SCREEN_BRIGHTNESS);
mIsShowing = true;
dispatchShow();
setDim(true);
mHandler.postDelayed(() -> { switchHbm(true); } , 250);
setVisibility(View.VISIBLE);
}
switch (rotation) {
case Surface.ROTATION_0:
mParams.x = mPositionX;
mParams.y = mPositionY - cutoutMaskedExtra;
break;
case Surface.ROTATION_90:
mParams.x = mPositionY;
mParams.y = mPositionX - cutoutMaskedExtra;
break;
case Surface.ROTATION_180:
mParams.x = mPositionX;
mParams.y = size.y - mPositionY - mSize - cutoutMaskedExtra;
break;
case Surface.ROTATION_270:
mParams.x = size.x - mPositionY - mSize - mNavigationBarSize -
cutoutMaskedExtra;
mParams.y = mPositionX;
break;
default:
throw new IllegalArgumentException("Unknown rotation: " +
rotation);
}
if (mIsDreaming) {
mParams.x += mDreamingOffsetX;
mParams.y += mDreamingOffsetY;
mFODAnimation.updateParams(mParams.y);
}
mWindowManager.updateViewLayout(this, mParams);
}
mCurDim = dimAmount;
mWindowManager.updateViewLayout(this, mParams);
}
mDreamingOffsetX -= mDreamingMaxOffset;
mDreamingOffsetY -= mDreamingMaxOffset;
mContext = context;
mInflater = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mWindowManager = mContext.getSystemService(WindowManager.class);
mAnimParams.height =
mContext.getResources().getDimensionPixelSize(R.dimen.fod_animation_size);
mAnimParams.width =
mContext.getResources().getDimensionPixelSize(R.dimen.fod_animation_size);
mAnimParams.format = PixelFormat.TRANSLUCENT;
mAnimParams.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; // it
must be behind FOD icon
mAnimParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
mAnimParams.gravity = Gravity.TOP | Gravity.CENTER;
mAnimParams.y = mAnimationPositionY;
this.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
this.setBackgroundResource(R.drawable.fodunlockanim);
recognizingAnim = (AnimationDrawable) this.getBackground();
@Override
public void onOverlayChanged() {
updateCutoutFlags();
}