Merge "Add OWNERS file for NeuralNetworks package" into main
diff --git a/core/xsd/permission.xsd b/core/xsd/permission.xsd
index 0ec8f7d..0a0ca7c 100644
--- a/core/xsd/permission.xsd
+++ b/core/xsd/permission.xsd
@@ -43,6 +43,7 @@
<xs:element name="disabled-until-used-preinstalled-carrier-app" type="disabled-until-used-preinstalled-carrier-app"/>
<xs:element name="privapp-permissions" type="privapp-permissions"/>
<xs:element name="oem-permissions" type="oem-permissions"/>
+ <xs:element name="signature-permissions" type="signature-permissions"/>
<xs:element name="hidden-api-whitelisted-app" type="hidden-api-whitelisted-app"/>
<xs:element name="allow-association" type="allow-association"/>
<xs:element name="bugreport-whitelisted" type="bugreport-whitelisted"/>
@@ -156,6 +157,21 @@
</xs:sequence>
<xs:attribute name="package" type="xs:string"/>
</xs:complexType>
+ <xs:complexType name="signature-permissions">
+ <xs:sequence>
+ <xs:element name="permission" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="name" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="deny-permission" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="name" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="package" type="xs:string"/>
+ </xs:complexType>
<xs:complexType name="hidden-api-whitelisted-app">
<xs:attribute name="package" type="xs:string"/>
</xs:complexType>
diff --git a/core/xsd/schema/current.txt b/core/xsd/schema/current.txt
index f3beea1..cdec6ab 100644
--- a/core/xsd/schema/current.txt
+++ b/core/xsd/schema/current.txt
@@ -183,6 +183,7 @@
method public java.util.List<com.android.xml.permission.configfile.OemPermissions> getOemPermissions_optional();
method public java.util.List<com.android.xml.permission.configfile.Permission> getPermission_optional();
method public java.util.List<com.android.xml.permission.configfile.PrivappPermissions> getPrivappPermissions_optional();
+ method public java.util.List<com.android.xml.permission.configfile.SignaturePermissions> getSignaturePermissions_optional();
method public java.util.List<com.android.xml.permission.configfile.SplitPermission> getSplitPermission_optional();
method public java.util.List<com.android.xml.permission.configfile.SystemUserBlacklistedApp> getSystemUserBlacklistedApp_optional();
method public java.util.List<com.android.xml.permission.configfile.SystemUserWhitelistedApp> getSystemUserWhitelistedApp_optional();
@@ -209,6 +210,26 @@
method public void setName(String);
}
+ public class SignaturePermissions {
+ ctor public SignaturePermissions();
+ method public java.util.List<com.android.xml.permission.configfile.SignaturePermissions.DenyPermission> getDenyPermission();
+ method public java.util.List<com.android.xml.permission.configfile.SignaturePermissions.Permission> getPermission();
+ method public String get_package();
+ method public void set_package(String);
+ }
+
+ public static class SignaturePermissions.DenyPermission {
+ ctor public SignaturePermissions.DenyPermission();
+ method public String getName();
+ method public void setName(String);
+ }
+
+ public static class SignaturePermissions.Permission {
+ ctor public SignaturePermissions.Permission();
+ method public String getName();
+ method public void setName(String);
+ }
+
public class SplitPermission {
ctor public SplitPermission();
method public java.util.List<com.android.xml.permission.configfile.SplitPermission.Library> getLibrary();
diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt
index 1019a10..031ed73 100644
--- a/nfc/api/system-current.txt
+++ b/nfc/api/system-current.txt
@@ -57,7 +57,7 @@
@FlaggedApi("android.nfc.nfc_oem_extension") public final class NfcOemExtension {
method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void clearPreference();
method @FlaggedApi("android.nfc.nfc_oem_extension") @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public int forceRoutingTableCommit();
- method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public java.util.List<java.lang.String> getActiveNfceeList();
+ method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public java.util.Map<java.lang.String,java.lang.Integer> getActiveNfceeList();
method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.nfc.RoutingStatus getRoutingStatus();
method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public java.util.List<android.nfc.NfcRoutingTableEntry> getRoutingTable();
method @FlaggedApi("android.nfc.nfc_oem_extension") @NonNull public android.nfc.T4tNdefNfcee getT4tNdefNfcee();
diff --git a/nfc/java/android/nfc/INfcAdapter.aidl b/nfc/java/android/nfc/INfcAdapter.aidl
index 13e6734..5ae1be2 100644
--- a/nfc/java/android/nfc/INfcAdapter.aidl
+++ b/nfc/java/android/nfc/INfcAdapter.aidl
@@ -115,7 +115,7 @@
void clearPreference();
void setScreenState();
void checkFirmware();
- List<String> fetchActiveNfceeList();
+ Map fetchActiveNfceeList();
void triggerInitialization();
boolean getSettingStatus();
boolean isTagPresent();
diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java
index ac7b8bb..f1198ed 100644
--- a/nfc/java/android/nfc/NfcOemExtension.java
+++ b/nfc/java/android/nfc/NfcOemExtension.java
@@ -39,6 +39,7 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ResultReceiver;
+import android.se.omapi.Reader;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -148,6 +149,48 @@
public @interface ControllerMode{}
/**
+ * Technology Type for {@link #getActiveNfceeList()}.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ public static final int NFCEE_TECH_NONE = 0;
+
+ /**
+ * Technology Type for {@link #getActiveNfceeList()}.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ public static final int NFCEE_TECH_A = 1;
+
+ /**
+ * Technology Type for {@link #getActiveNfceeList()}.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ public static final int NFCEE_TECH_B = 1 << 1;
+
+ /**
+ * Technology Type for {@link #getActiveNfceeList()}.
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
+ public static final int NFCEE_TECH_F = 1 << 2;
+
+ /**
+ * Nfc technology flags for {@link #getActiveNfceeList()}.
+ *
+ * @hide
+ */
+ @IntDef(flag = true, value = {
+ NFCEE_TECH_NONE,
+ NFCEE_TECH_A,
+ NFCEE_TECH_B,
+ NFCEE_TECH_F,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface NfceeTechnology {}
+
+ /**
* Event that Host Card Emulation is activated.
*/
public static final int HCE_ACTIVATE = 1;
@@ -627,14 +670,18 @@
/**
* Get the Active NFCEE (NFC Execution Environment) List
*
- * @return List of activated secure elements on success
- * which can contain "eSE" and "UICC", otherwise empty list.
+ * @see Reader#getName() for the list of possible NFCEE names.
+ *
+ * @return Map< String, @NfceeTechnology Integer >
+ * A HashMap where keys are activated secure elements and
+ * the values are bitmap of technologies supported by each secure element
+ * on success keys can contain "eSE" and "UICC", otherwise empty map.
*/
@NonNull
@FlaggedApi(Flags.FLAG_NFC_OEM_EXTENSION)
- public List<String> getActiveNfceeList() {
+ public Map<String, Integer> getActiveNfceeList() {
return NfcAdapter.callServiceReturn(() ->
- NfcAdapter.sService.fetchActiveNfceeList(), new ArrayList<String>());
+ NfcAdapter.sService.fetchActiveNfceeList(), new HashMap<String, Integer>());
}
/**
diff --git a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java
index d5aa5e2..43414c0 100644
--- a/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/InvalidationClient.java
@@ -77,6 +77,16 @@
}
@Override
+ public void cancel() {
+ super.cancel();
+ try {
+ mInvalidationCallback.onCompleted();
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Unable to complete invalidation client due to exception: " + e);
+ }
+ }
+
+ @Override
public int getProtoEnum() {
return BiometricsProto.CM_INVALIDATE;
}
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClientTest.java
new file mode 100644
index 0000000..405fb44
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceInvalidationClientTest.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2024 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.sensors.face.aidl;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.hardware.biometrics.IInvalidationCallback;
+import android.hardware.biometrics.face.V1_0.IBiometricsFace;
+import android.hardware.biometrics.face.V1_0.OptionalUint64;
+import android.os.RemoteException;
+import android.platform.test.annotations.Presubmit;
+import android.testing.TestableContext;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.server.biometrics.log.BiometricContext;
+import com.android.server.biometrics.log.BiometricLogger;
+import com.android.server.biometrics.sensors.ClientMonitorCallback;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.stubbing.Answer;
+
+import java.util.HashMap;
+
+@Presubmit
+@SmallTest
+public class FaceInvalidationClientTest {
+
+ private static final int SENSOR_ID = 4;
+ private static final int USER_ID = 0;
+
+
+ @Rule
+ public final TestableContext mContext = new TestableContext(
+ InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Mock
+ private IBiometricsFace mFace;
+ @Mock
+ private AidlResponseHandler mAidlResponseHandler;
+ @Mock
+ private BiometricLogger mBiometricLogger;
+ @Mock
+ private BiometricContext mBiometricContext;
+ @Mock
+ private IInvalidationCallback mInvalidationCallback;
+ @Mock
+ private ClientMonitorCallback mClientMonitorCallback;
+
+ @Test
+ public void testStartInvalidationClient_whenHalIsHidl() throws RemoteException {
+ final OptionalUint64 halId = new OptionalUint64();
+
+ when(mFace.setCallback(any())).thenReturn(halId);
+
+ final AidlSession aidlSession = new AidlSession(mContext, () -> mFace, USER_ID,
+ mAidlResponseHandler);
+ final FaceInvalidationClient faceInvalidationClient =
+ new FaceInvalidationClient(mContext, () -> aidlSession, USER_ID,
+ SENSOR_ID, mBiometricLogger, mBiometricContext, new HashMap<>(),
+ mInvalidationCallback);
+
+ doAnswer((Answer<Void>) invocationOnMock -> {
+ faceInvalidationClient.cancel();
+ return null;
+ }).when(mAidlResponseHandler).onUnsupportedClientScheduled();
+
+ faceInvalidationClient.start(mClientMonitorCallback);
+
+ verify(mInvalidationCallback).onCompleted();
+ }
+}
+
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClientTest.java
new file mode 100644
index 0000000..1ee2fd1
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintInvalidationClientTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 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.sensors.fingerprint.aidl;
+
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.verify;
+
+import android.hardware.biometrics.IInvalidationCallback;
+import android.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint;
+import android.os.RemoteException;
+import android.platform.test.annotations.Presubmit;
+import android.testing.TestableContext;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.server.biometrics.log.BiometricContext;
+import com.android.server.biometrics.log.BiometricLogger;
+import com.android.server.biometrics.sensors.ClientMonitorCallback;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.stubbing.Answer;
+
+import java.util.HashMap;
+
+@Presubmit
+@SmallTest
+public class FingerprintInvalidationClientTest {
+
+ private static final int SENSOR_ID = 4;
+ private static final int USER_ID = 0;
+
+
+ @Rule
+ public final TestableContext mContext = new TestableContext(
+ InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
+ @Rule
+ public final MockitoRule mockito = MockitoJUnit.rule();
+
+ @Mock
+ private IBiometricsFingerprint mFingerprint;
+ @Mock
+ private AidlResponseHandler mAidlResponseHandler;
+ @Mock
+ private BiometricLogger mBiometricLogger;
+ @Mock
+ private BiometricContext mBiometricContext;
+ @Mock
+ private IInvalidationCallback mInvalidationCallback;
+ @Mock
+ private ClientMonitorCallback mClientMonitorCallback;
+
+ @Test
+ public void testStartInvalidationClient_whenHalIsHidl() throws RemoteException {
+ final AidlSession aidlSession = new AidlSession(
+ () -> mFingerprint, USER_ID, mAidlResponseHandler);
+ final FingerprintInvalidationClient fingerprintInvalidationClient =
+ new FingerprintInvalidationClient(mContext, () -> aidlSession, USER_ID,
+ SENSOR_ID, mBiometricLogger, mBiometricContext, new HashMap<>(),
+ mInvalidationCallback);
+
+ doAnswer((Answer<Void>) invocationOnMock -> {
+ fingerprintInvalidationClient.cancel();
+ return null;
+ }).when(mAidlResponseHandler).onUnsupportedClientScheduled(
+ FingerprintInvalidationClient.class);
+
+ fingerprintInvalidationClient.start(mClientMonitorCallback);
+
+ verify(mInvalidationCallback).onCompleted();
+ }
+}