M7350v1_en_gpl

This commit is contained in:
T
2024-09-09 08:52:07 +00:00
commit f9cc65cfda
65988 changed files with 26357421 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE:= com.android.nfc_extras
include $(BUILD_JAVA_LIBRARY)
# put the classes.jar, with full class files instead of classes.dex inside, into the dist directory
$(call dist-for-goals, droidcore, $(full_classes_jar):com.android.nfc_extras.jar)
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 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.
-->
<permissions>
<library name="com.android.nfc_extras"
file="/system/framework/com.android.nfc_extras.jar" />
</permissions>
@@ -0,0 +1,226 @@
/*
* Copyright (C) 2011 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.nfc_extras;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.nfc.ApduList;
import android.nfc.INfcAdapterExtras;
import android.nfc.NfcAdapter;
import android.os.RemoteException;
import android.util.Log;
/**
* Provides additional methods on an {@link NfcAdapter} for Card Emulation
* and management of {@link NfcExecutionEnvironment}'s.
*
* There is a 1-1 relationship between an {@link NfcAdapterExtras} object and
* a {@link NfcAdapter} object.
*/
public final class NfcAdapterExtras {
private static final String TAG = "NfcAdapterExtras";
/**
* Broadcast Action: an RF field ON has been detected.
*
* <p class="note">This is an unreliable signal, and will be removed.
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission
* to receive.
*/
public static final String ACTION_RF_FIELD_ON_DETECTED =
"com.android.nfc_extras.action.RF_FIELD_ON_DETECTED";
/**
* Broadcast Action: an RF field OFF has been detected.
*
* <p class="note">This is an unreliable signal, and will be removed.
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission
* to receive.
*/
public static final String ACTION_RF_FIELD_OFF_DETECTED =
"com.android.nfc_extras.action.RF_FIELD_OFF_DETECTED";
// protected by NfcAdapterExtras.class, and final after first construction,
// except for attemptDeadServiceRecovery() when NFC crashes - we accept a
// best effort recovery
private static NfcAdapter sAdapter;
private static INfcAdapterExtras sService;
private static NfcAdapterExtras sSingleton;
private static NfcExecutionEnvironment sEmbeddedEe;
private static CardEmulationRoute sRouteOff;
private static CardEmulationRoute sRouteOnWhenScreenOn;
/** get service handles */
private static void initService() {
sService = sAdapter.getNfcAdapterExtrasInterface();
}
/**
* Get the {@link NfcAdapterExtras} for the given {@link NfcAdapter}.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @param adapter a {@link NfcAdapter}, must not be null
* @return the {@link NfcAdapterExtras} object for the given {@link NfcAdapter}
*/
public static NfcAdapterExtras get(NfcAdapter adapter) {
synchronized(NfcAdapterExtras.class) {
if (sSingleton == null) {
try {
sAdapter = adapter;
sRouteOff = new CardEmulationRoute(CardEmulationRoute.ROUTE_OFF, null);
sSingleton = new NfcAdapterExtras();
sEmbeddedEe = new NfcExecutionEnvironment(sSingleton);
sRouteOnWhenScreenOn = new CardEmulationRoute(
CardEmulationRoute.ROUTE_ON_WHEN_SCREEN_ON, sEmbeddedEe);
initService();
} finally {
if (sSingleton == null) {
sService = null;
sEmbeddedEe = null;
sRouteOff = null;
sRouteOnWhenScreenOn = null;
}
}
}
return sSingleton;
}
}
private NfcAdapterExtras() {}
/**
* Immutable data class that describes a card emulation route.
*/
public final static class CardEmulationRoute {
/**
* Card Emulation is turned off on this NfcAdapter.
* <p>This is the default routing state after boot.
*/
public static final int ROUTE_OFF = 1;
/**
* Card Emulation is routed to {@link #nfcEe} only when the screen is on,
* otherwise it is turned off.
*/
public static final int ROUTE_ON_WHEN_SCREEN_ON = 2;
/**
* A route such as {@link #ROUTE_OFF} or {@link #ROUTE_ON_WHEN_SCREEN_ON}.
*/
public final int route;
/**
* The {@link NFcExecutionEnvironment} that is Card Emulation is routed to.
* <p>null if {@link #route} is {@link #ROUTE_OFF}, otherwise not null.
*/
public final NfcExecutionEnvironment nfcEe;
public CardEmulationRoute(int route, NfcExecutionEnvironment nfcEe) {
if (route == ROUTE_OFF && nfcEe != null) {
throw new IllegalArgumentException("must not specifiy a NFC-EE with ROUTE_OFF");
} else if (route != ROUTE_OFF && nfcEe == null) {
throw new IllegalArgumentException("must specifiy a NFC-EE for this route");
}
this.route = route;
this.nfcEe = nfcEe;
}
}
/**
* NFC service dead - attempt best effort recovery
*/
void attemptDeadServiceRecovery(Exception e) {
Log.e(TAG, "NFC Adapter Extras dead - attempting to recover");
sAdapter.attemptDeadServiceRecovery(e);
initService();
}
INfcAdapterExtras getService() {
return sService;
}
/**
* Get the routing state of this NFC EE.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @return
*/
public CardEmulationRoute getCardEmulationRoute() {
try {
int route = sService.getCardEmulationRoute();
return route == CardEmulationRoute.ROUTE_OFF ?
sRouteOff :
sRouteOnWhenScreenOn;
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
return sRouteOff;
}
}
/**
* Set the routing state of this NFC EE.
*
* <p>This routing state is not persisted across reboot.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @param route a {@link #CardEmulationRoute}
*/
public void setCardEmulationRoute(CardEmulationRoute route) {
try {
sService.setCardEmulationRoute(route.route);
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
}
}
/**
* Get the {@link NfcExecutionEnvironment} that is embedded with the
* {@link NFcAdapter}.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @return a {@link NfcExecutionEnvironment}, or null if there is no embedded NFC-EE
*/
public NfcExecutionEnvironment getEmbeddedExecutionEnvironment() {
return sEmbeddedEe;
}
public void registerTearDownApdus(String packageName, ApduList apdus) {
try {
sService.registerTearDownApdus(packageName, apdus);
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
}
}
public void unregisterTearDownApdus(String packageName) {
try {
sService.unregisterTearDownApdus(packageName);
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
}
}
}
@@ -0,0 +1,128 @@
/*
* Copyright (C) 2011 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.nfc_extras;
import java.io.IOException;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.content.Context;
import android.nfc.INfcAdapterExtras;
import android.nfc.NfcAdapter;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
public class NfcExecutionEnvironment {
private final NfcAdapterExtras mExtras;
/**
* Broadcast Action: An ISO-DEP AID was selected.
*
* <p>This happens as the result of a 'SELECT AID' command from an
* external NFC reader/writer.
*
* <p>Always contains the extra field {@link #EXTRA_AID}
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission
* to receive.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_AID_SELECTED =
"com.android.nfc_extras.action.AID_SELECTED";
/**
* Mandatory byte array extra field in {@link #ACTION_AID_SELECTED}.
*
* <p>Contains the AID selected.
* @hide
*/
public static final String EXTRA_AID = "com.android.nfc_extras.extra.AID";
NfcExecutionEnvironment(NfcAdapterExtras extras) {
mExtras = extras;
}
/**
* Open the NFC Execution Environment on its contact interface.
*
* <p>Only one process may open the secure element at a time. If it is
* already open, an {@link IOException} is thrown.
*
* <p>All other NFC functionality is disabled while the NFC-EE is open
* on its contact interface, so make sure to call {@link #close} once complete.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @throws IOException if the NFC-EE is already open, or some other error occurs
*/
public void open() throws IOException {
try {
Bundle b = mExtras.getService().open(new Binder());
throwBundle(b);
} catch (RemoteException e) {
mExtras.attemptDeadServiceRecovery(e);
throw new IOException("NFC Service was dead, try again");
}
}
/**
* Close the NFC Execution Environment on its contact interface.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @throws IOException if the NFC-EE is already open, or some other error occurs
*/
public void close() throws IOException {
try {
throwBundle(mExtras.getService().close());
} catch (RemoteException e) {
mExtras.attemptDeadServiceRecovery(e);
throw new IOException("NFC Service was dead");
}
}
/**
* Send raw commands to the NFC-EE and receive the response.
*
* <p class="note">
* Requires the {@link android.Manifest.permission#WRITE_SECURE_SETTINGS} permission.
*
* @throws IOException if the NFC-EE is not open, or some other error occurs
*/
public byte[] transceive(byte[] in) throws IOException {
Bundle b;
try {
b = mExtras.getService().transceive(in);
} catch (RemoteException e) {
mExtras.attemptDeadServiceRecovery(e);
throw new IOException("NFC Service was dead, need to re-open");
}
throwBundle(b);
return b.getByteArray("out");
}
private static void throwBundle(Bundle b) throws IOException {
if (b.getInt("e") == -1) {
throw new IOException(b.getString("m"));
}
}
}