diff options
| author | 2018-03-22 11:06:36 -0700 | |
|---|---|---|
| committer | 2018-03-27 08:55:53 -0700 | |
| commit | 1d0b15510aa0452340ea9fd00938adda32c09635 (patch) | |
| tree | 877d70914a15dd88f6b135b7dc81ed2f3cc60c93 | |
| parent | 47a0da6aecc207790bf96e917064283bb1080b6c (diff) | |
Modify Open Mobile API to follow Android API guidelines
- Add @Nullable/@NonNull to input arguments for APIs
- Remove deprecated methods openBasicChannel(aid) and
openLogicalChannel(aid)
- SecureElementListener is converted to a stand-alone interface
- serviceConnected() callback is renamed to onServiceConnected()
Bug: 64994044
Test: Run Cts Test
Change-Id: I503044a26a81dae8befb87fb8e8ac96d19de883b
(cherry picked from commit d785fc4f6d238fcab6e2dbfbf53a57e14f248ec4)
| -rw-r--r-- | api/current.txt | 8 | ||||
| -rw-r--r-- | core/java/android/se/omapi/Channel.java | 5 | ||||
| -rw-r--r-- | core/java/android/se/omapi/ISecureElementListener.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/se/omapi/Reader.java | 2 | ||||
| -rw-r--r-- | core/java/android/se/omapi/SEService.java | 45 | ||||
| -rw-r--r-- | core/java/android/se/omapi/Session.java | 63 |
6 files changed, 38 insertions, 89 deletions
diff --git a/api/current.txt b/api/current.txt index be5e3e70d0a2..722b2898e423 100644 --- a/api/current.txt +++ b/api/current.txt @@ -38324,10 +38324,8 @@ package android.se.omapi { method public void shutdown(); } - public static abstract class SEService.SecureElementListener extends android.os.Binder { - ctor public SEService.SecureElementListener(); - method public android.os.IBinder asBinder(); - method public void serviceConnected(); + public static abstract interface SEService.SecureElementListener { + method public abstract void onServiceConnected(); } public class Session { @@ -38337,9 +38335,7 @@ package android.se.omapi { method public android.se.omapi.Reader getReader(); method public boolean isClosed(); method public android.se.omapi.Channel openBasicChannel(byte[], byte) throws java.io.IOException; - method public android.se.omapi.Channel openBasicChannel(byte[]) throws java.io.IOException; method public android.se.omapi.Channel openLogicalChannel(byte[], byte) throws java.io.IOException; - method public android.se.omapi.Channel openLogicalChannel(byte[]) throws java.io.IOException; } } diff --git a/core/java/android/se/omapi/Channel.java b/core/java/android/se/omapi/Channel.java index 65ce67fcba8f..c8efede3419e 100644 --- a/core/java/android/se/omapi/Channel.java +++ b/core/java/android/se/omapi/Channel.java @@ -47,7 +47,8 @@ public class Channel { private final SEService mService; private final Object mLock = new Object(); - Channel(SEService service, Session session, ISecureElementChannel channel) { + Channel(@NonNull SEService service, @NonNull Session session, + @NonNull ISecureElementChannel channel) { if (service == null || session == null || channel == null) { throw new IllegalArgumentException("Parameters cannot be null"); } @@ -158,7 +159,7 @@ public class Channel { * @throws SecurityException if the command is filtered by the security policy. * @throws NullPointerException if command is NULL. */ - public @NonNull byte[] transmit(byte[] command) throws IOException { + public @NonNull byte[] transmit(@NonNull byte[] command) throws IOException { if (!mService.isConnected()) { throw new IllegalStateException("service not connected to system"); } diff --git a/core/java/android/se/omapi/ISecureElementListener.aidl b/core/java/android/se/omapi/ISecureElementListener.aidl index e0c6e047c3d1..e9dd18181c56 100644 --- a/core/java/android/se/omapi/ISecureElementListener.aidl +++ b/core/java/android/se/omapi/ISecureElementListener.aidl @@ -24,8 +24,4 @@ package android.se.omapi; * @hide */ interface ISecureElementListener { - /** - * Called by the framework when the service is connected. - */ - void serviceConnected(); } diff --git a/core/java/android/se/omapi/Reader.java b/core/java/android/se/omapi/Reader.java index 3dec97631e9c..9be3da6c6327 100644 --- a/core/java/android/se/omapi/Reader.java +++ b/core/java/android/se/omapi/Reader.java @@ -46,7 +46,7 @@ public class Reader { private final Object mLock = new Object(); - Reader(SEService service, String name, ISecureElementReader reader) { + Reader(@NonNull SEService service, @NonNull String name, @NonNull ISecureElementReader reader) { if (reader == null || service == null || name == null) { throw new IllegalArgumentException("Parameters cannot be null"); } diff --git a/core/java/android/se/omapi/SEService.java b/core/java/android/se/omapi/SEService.java index d59e86a099b2..311dc4c7ae10 100644 --- a/core/java/android/se/omapi/SEService.java +++ b/core/java/android/se/omapi/SEService.java @@ -62,17 +62,32 @@ public class SEService { /** * Interface to send call-backs to the application when the service is connected. */ - public abstract static class SecureElementListener extends ISecureElementListener.Stub { + public interface SecureElementListener { + /** + * Called by the framework when the service is connected. + */ + void onServiceConnected(); + } + + /** + * Listener object that allows the notification of the caller if this + * SEService could be bound to the backend. + */ + private class SEListener extends ISecureElementListener.Stub { + public SecureElementListener mListener = null; + @Override public IBinder asBinder() { return this; } - /** - * Called by the framework when the service is connected. - */ - public void serviceConnected() {}; + public void onServiceConnected() { + if (mListener != null) { + mListener.onServiceConnected(); + } + } } + private SEListener mSEListener = new SEListener(); private static final String TAG = "OMAPI.SEService"; @@ -95,34 +110,28 @@ public class SEService { private final HashMap<String, Reader> mReaders = new HashMap<String, Reader>(); /** - * Listener object that allows the notification of the caller if this - * SEService could be bound to the backend. - */ - private ISecureElementListener mSEListener; - - /** * Establishes a new connection that can be used to connect to all the * Secure Elements available in the system. The connection process can be * quite long, so it happens in an asynchronous way. It is usable only if * the specified listener is called or if isConnected() returns * <code>true</code>. <br> * The call-back object passed as a parameter will have its - * serviceConnected() method called when the connection actually happen. + * onServiceConnected() method called when the connection actually happen. * * @param context * the context of the calling application. Cannot be * <code>null</code>. * @param listener - * a SecureElementListener object. Can be <code>null</code>. + * a SecureElementListener object. */ - public SEService(Context context, SecureElementListener listener) { + public SEService(@NonNull Context context, @NonNull SecureElementListener listener) { if (context == null) { throw new NullPointerException("context must not be null"); } mContext = context; - mSEListener = listener; + mSEListener.mListener = listener; mConnection = new ServiceConnection() { @@ -131,9 +140,7 @@ public class SEService { mSecureElementService = ISecureElementService.Stub.asInterface(service); if (mSEListener != null) { - try { - mSEListener.serviceConnected(); - } catch (RemoteException ignore) { } + mSEListener.onServiceConnected(); } Log.i(TAG, "Service onServiceConnected"); } @@ -233,7 +240,7 @@ public class SEService { * * @return String containing the OpenMobile API version (e.g. "3.0"). */ - public String getVersion() { + public @NonNull String getVersion() { return "3.2"; } diff --git a/core/java/android/se/omapi/Session.java b/core/java/android/se/omapi/Session.java index 3d8b74b51c4c..adfeddd504c4 100644 --- a/core/java/android/se/omapi/Session.java +++ b/core/java/android/se/omapi/Session.java @@ -47,7 +47,8 @@ public class Session { private final ISecureElementSession mSession; private static final String TAG = "OMAPI.Session"; - Session(SEService service, ISecureElementSession session, Reader reader) { + Session(@NonNull SEService service, @NonNull ISecureElementSession session, + @NonNull Reader reader) { if (service == null || reader == null || session == null) { throw new IllegalArgumentException("Parameters cannot be null"); } @@ -195,7 +196,8 @@ public class Session { * supported by the device * @return an instance of Channel if available or null. */ - public @Nullable Channel openBasicChannel(byte[] aid, byte p2) throws IOException { + public @Nullable Channel openBasicChannel(@Nullable byte[] aid, @Nullable byte p2) + throws IOException { if (!mService.isConnected()) { throw new IllegalStateException("service not connected to system"); } @@ -223,32 +225,6 @@ public class Session { } /** - * This method is provided to ease the development of mobile application and for compliancy - * with existing applications. - * This method is equivalent to openBasicChannel(aid, P2=0x00) - * - * @param aid the AID of the Applet to be selected on this channel, as a - * byte array, or null if no Applet is to be selected. - * @throws IOException if there is a communication problem to the reader or - * the Secure Element. - * @throws IllegalStateException if the Secure Element session is used after - * being closed. - * @throws IllegalArgumentException if the aid's length is not within 5 to - * 16 (inclusive). - * @throws SecurityException if the calling application cannot be granted - * access to this AID or the default Applet on this - * session. - * @throws NoSuchElementException if the AID on the Secure Element is not available or cannot be - * selected. - * @throws UnsupportedOperationException if the given P2 parameter is not - * supported by the device - * @return an instance of Channel if available or null. - */ - public @Nullable Channel openBasicChannel(byte[] aid) throws IOException { - return openBasicChannel(aid, (byte) 0x00); - } - - /** * Open a logical channel with the Secure Element, selecting the Applet represented by * the given AID. If the AID is null, which means no Applet is to be selected on this * channel, the default Applet is used. It's up to the Secure Element to choose which @@ -300,7 +276,8 @@ public class Session { * @return an instance of Channel. Null if the Secure Element is unable to * provide a new logical channel. */ - public @Nullable Channel openLogicalChannel(byte[] aid, byte p2) throws IOException { + public @Nullable Channel openLogicalChannel(@Nullable byte[] aid, @Nullable byte p2) + throws IOException { if (!mService.isConnected()) { throw new IllegalStateException("service not connected to system"); } @@ -327,32 +304,4 @@ public class Session { } } } - - /** - * This method is provided to ease the development of mobile application and for compliancy - * with existing applications. - * This method is equivalent to openLogicalChannel(aid, P2=0x00) - * - * @param aid the AID of the Applet to be selected on this channel, as a - * byte array. - * @throws IOException if there is a communication problem to the reader or - * the Secure Element. - * @throws IllegalStateException if the Secure Element is used after being - * closed. - * @throws IllegalArgumentException if the aid's length is not within 5 to - * 16 (inclusive). - * @throws SecurityException if the calling application cannot be granted - * access to this AID or the default Applet on this - * session. - * @throws NoSuchElementException if the AID on the Secure Element is not - * available or cannot be selected or a logical channel is already - * open to a non-multiselectable Applet. - * @throws UnsupportedOperationException if the given P2 parameter is not - * supported by the device. - * @return an instance of Channel. Null if the Secure Element is unable to - * provide a new logical channel. - */ - public @Nullable Channel openLogicalChannel(byte[] aid) throws IOException { - return openLogicalChannel(aid, (byte) 0x00); - } } |