Loading services/core/java/com/android/server/biometrics/Utils.java +34 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static com.android.server.biometrics.PreAuthInfo.CREDENTIAL_NOT_ENROLLED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; Loading Loading @@ -544,4 +545,37 @@ public class Utils { throw new IllegalArgumentException("Unknown strength: " + strength); } } /** * Checks if a client package is running in the background. * * @param clientPackage The name of the package to be checked. * @return Whether the client package is running in background */ public static boolean isBackground(String clientPackage) { Slog.v(TAG, "Checking if the authenticating is in background," + " clientPackage:" + clientPackage); final List<ActivityManager.RunningTaskInfo> tasks = ActivityTaskManager.getInstance().getTasks(Integer.MAX_VALUE); if (tasks == null || tasks.isEmpty()) { Slog.d(TAG, "No running tasks reported"); return true; } for (ActivityManager.RunningTaskInfo taskInfo : tasks) { final ComponentName topActivity = taskInfo.topActivity; if (topActivity != null) { final String topPackage = topActivity.getPackageName(); if (topPackage.contentEquals(clientPackage) && taskInfo.isVisible()) { return false; } else { Slog.i(TAG, "Running task, top: " + topPackage + ", isVisible: " + taskInfo.isVisible()); } } } return true; } } services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +1 −23 Original line number Diff line number Diff line Loading @@ -19,10 +19,8 @@ package com.android.server.biometrics.sensors; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.TaskStackListener; import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.hardware.biometrics.BiometricAuthenticator; Loading @@ -42,7 +40,6 @@ import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricLogger; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; /** Loading Loading @@ -202,25 +199,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> if (!mAllowBackgroundAuthentication && authenticated && !Utils.isKeyguard(getContext(), getOwnerString()) && !Utils.isSystem(getContext(), getOwnerString())) { final List<ActivityManager.RunningTaskInfo> tasks = mActivityTaskManager.getTasks(1); if (tasks == null || tasks.isEmpty()) { Slog.e(TAG, "No running tasks reported"); isBackgroundAuth = true; } else { final ComponentName topActivity = tasks.get(0).topActivity; if (topActivity == null) { Slog.e(TAG, "Unable to get top activity"); isBackgroundAuth = true; } else { final String topPackage = topActivity.getPackageName(); if (!topPackage.contentEquals(getOwnerString())) { Slog.e(TAG, "Background authentication detected, top: " + topPackage + ", client: " + getOwnerString()); isBackgroundAuth = true; } } } isBackgroundAuth = Utils.isBackground(getOwnerString()); } // Fail authentication if we can't confirm the client activity is on top. Loading Loading @@ -465,7 +444,6 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> @Override public void cancel() { super.cancel(); if (mTaskStackListener != null) { mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener); } Loading services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +8 −13 Original line number Diff line number Diff line Loading @@ -104,24 +104,19 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { Slog.e(getTag(), "Task stack changed for client: " + client); continue; } if (Utils.isKeyguard(mContext, client.getOwnerString())) { if (Utils.isKeyguard(mContext, client.getOwnerString()) || Utils.isSystem(mContext, client.getOwnerString())) { continue; // Keyguard is always allowed } final List<ActivityManager.RunningTaskInfo> runningTasks = mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(client.getOwnerString()) if (Utils.isBackground(client.getOwnerString()) && !client.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + client); Slog.e(getTag(), "Stopping background authentication," + " currentClient: " + client); mSensors.valueAt(i).getScheduler().cancelAuthenticationOrDetection( client.getToken(), client.getRequestId()); } } } }); } } Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +6 −12 Original line number Diff line number Diff line Loading @@ -122,20 +122,14 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi continue; // Keyguard is always allowed } final List<ActivityManager.RunningTaskInfo> runningTasks = mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(client.getOwnerString()) if (Utils.isBackground(client.getOwnerString()) && !client.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + client); Slog.e(getTag(), "Stopping background authentication," + " currentClient: " + client); mSensors.valueAt(i).getScheduler().cancelAuthenticationOrDetection( client.getToken(), client.getRequestId()); } } } }); } } Loading services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +6 −11 Original line number Diff line number Diff line Loading @@ -142,18 +142,13 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider return; // Keyguard is always allowed } final List<ActivityManager.RunningTaskInfo> runningTasks = mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(client.getOwnerString()) if (Utils.isBackground(client.getOwnerString()) && !client.isAlreadyDone()) { Slog.e(TAG, "Stopping background authentication, top: " + topPackage + " currentClient: " + client); Slog.e(TAG, "Stopping background authentication," + " currentClient: " + client); mScheduler.cancelAuthenticationOrDetection( client.getToken(), client.getRequestId()); } } }); } } Loading Loading
services/core/java/com/android/server/biometrics/Utils.java +34 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,7 @@ import static com.android.server.biometrics.PreAuthInfo.CREDENTIAL_NOT_ENROLLED; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; Loading Loading @@ -544,4 +545,37 @@ public class Utils { throw new IllegalArgumentException("Unknown strength: " + strength); } } /** * Checks if a client package is running in the background. * * @param clientPackage The name of the package to be checked. * @return Whether the client package is running in background */ public static boolean isBackground(String clientPackage) { Slog.v(TAG, "Checking if the authenticating is in background," + " clientPackage:" + clientPackage); final List<ActivityManager.RunningTaskInfo> tasks = ActivityTaskManager.getInstance().getTasks(Integer.MAX_VALUE); if (tasks == null || tasks.isEmpty()) { Slog.d(TAG, "No running tasks reported"); return true; } for (ActivityManager.RunningTaskInfo taskInfo : tasks) { final ComponentName topActivity = taskInfo.topActivity; if (topActivity != null) { final String topPackage = topActivity.getPackageName(); if (topPackage.contentEquals(clientPackage) && taskInfo.isVisible()) { return false; } else { Slog.i(TAG, "Running task, top: " + topPackage + ", isVisible: " + taskInfo.isVisible()); } } } return true; } }
services/core/java/com/android/server/biometrics/sensors/AuthenticationClient.java +1 −23 Original line number Diff line number Diff line Loading @@ -19,10 +19,8 @@ package com.android.server.biometrics.sensors; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityTaskManager; import android.app.TaskStackListener; import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.hardware.biometrics.BiometricAuthenticator; Loading @@ -42,7 +40,6 @@ import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricLogger; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; /** Loading Loading @@ -202,25 +199,7 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> if (!mAllowBackgroundAuthentication && authenticated && !Utils.isKeyguard(getContext(), getOwnerString()) && !Utils.isSystem(getContext(), getOwnerString())) { final List<ActivityManager.RunningTaskInfo> tasks = mActivityTaskManager.getTasks(1); if (tasks == null || tasks.isEmpty()) { Slog.e(TAG, "No running tasks reported"); isBackgroundAuth = true; } else { final ComponentName topActivity = tasks.get(0).topActivity; if (topActivity == null) { Slog.e(TAG, "Unable to get top activity"); isBackgroundAuth = true; } else { final String topPackage = topActivity.getPackageName(); if (!topPackage.contentEquals(getOwnerString())) { Slog.e(TAG, "Background authentication detected, top: " + topPackage + ", client: " + getOwnerString()); isBackgroundAuth = true; } } } isBackgroundAuth = Utils.isBackground(getOwnerString()); } // Fail authentication if we can't confirm the client activity is on top. Loading Loading @@ -465,7 +444,6 @@ public abstract class AuthenticationClient<T> extends AcquisitionClient<T> @Override public void cancel() { super.cancel(); if (mTaskStackListener != null) { mActivityTaskManager.unregisterTaskStackListener(mTaskStackListener); } Loading
services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +8 −13 Original line number Diff line number Diff line Loading @@ -104,24 +104,19 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { Slog.e(getTag(), "Task stack changed for client: " + client); continue; } if (Utils.isKeyguard(mContext, client.getOwnerString())) { if (Utils.isKeyguard(mContext, client.getOwnerString()) || Utils.isSystem(mContext, client.getOwnerString())) { continue; // Keyguard is always allowed } final List<ActivityManager.RunningTaskInfo> runningTasks = mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(client.getOwnerString()) if (Utils.isBackground(client.getOwnerString()) && !client.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + client); Slog.e(getTag(), "Stopping background authentication," + " currentClient: " + client); mSensors.valueAt(i).getScheduler().cancelAuthenticationOrDetection( client.getToken(), client.getRequestId()); } } } }); } } Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +6 −12 Original line number Diff line number Diff line Loading @@ -122,20 +122,14 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi continue; // Keyguard is always allowed } final List<ActivityManager.RunningTaskInfo> runningTasks = mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(client.getOwnerString()) if (Utils.isBackground(client.getOwnerString()) && !client.isAlreadyDone()) { Slog.e(getTag(), "Stopping background authentication, top: " + topPackage + " currentClient: " + client); Slog.e(getTag(), "Stopping background authentication," + " currentClient: " + client); mSensors.valueAt(i).getScheduler().cancelAuthenticationOrDetection( client.getToken(), client.getRequestId()); } } } }); } } Loading
services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +6 −11 Original line number Diff line number Diff line Loading @@ -142,18 +142,13 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider return; // Keyguard is always allowed } final List<ActivityManager.RunningTaskInfo> runningTasks = mActivityTaskManager.getTasks(1); if (!runningTasks.isEmpty()) { final String topPackage = runningTasks.get(0).topActivity.getPackageName(); if (!topPackage.contentEquals(client.getOwnerString()) if (Utils.isBackground(client.getOwnerString()) && !client.isAlreadyDone()) { Slog.e(TAG, "Stopping background authentication, top: " + topPackage + " currentClient: " + client); Slog.e(TAG, "Stopping background authentication," + " currentClient: " + client); mScheduler.cancelAuthenticationOrDetection( client.getToken(), client.getRequestId()); } } }); } } Loading