Merge "New system api to get UICC terminal based on slot number"

This commit is contained in:
Alisher Alikhodjaev
2020-01-18 02:00:04 +00:00
committed by Gerrit Code Review
2 changed files with 55 additions and 25 deletions

View File

@@ -40921,6 +40921,7 @@ package android.se.omapi {
public final class SEService { public final class SEService {
ctor public SEService(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.se.omapi.SEService.OnConnectedListener); ctor public SEService(@NonNull android.content.Context, @NonNull java.util.concurrent.Executor, @NonNull android.se.omapi.SEService.OnConnectedListener);
method @NonNull public android.se.omapi.Reader[] getReaders(); method @NonNull public android.se.omapi.Reader[] getReaders();
method @NonNull public android.se.omapi.Reader getUiccReader(int);
method @NonNull public String getVersion(); method @NonNull public String getVersion();
method public boolean isConnected(); method public boolean isConnected();
method public void shutdown(); method public void shutdown();

View File

@@ -98,6 +98,8 @@ public final class SEService {
private static final String TAG = "OMAPI.SEService"; private static final String TAG = "OMAPI.SEService";
private static final String UICC_TERMINAL = "SIM";
private final Object mLock = new Object(); private final Object mLock = new Object();
/** The client context (e.g. activity). */ /** The client context (e.g. activity). */
@@ -190,32 +192,33 @@ public final class SEService {
* is of length 0. * is of length 0.
*/ */
public @NonNull Reader[] getReaders() { public @NonNull Reader[] getReaders() {
if (mSecureElementService == null) { loadReaders();
throw new IllegalStateException("service not connected to system");
}
String[] readerNames;
try {
readerNames = mSecureElementService.getReaders();
} catch (RemoteException e) {
throw new RuntimeException(e);
}
Reader[] readers = new Reader[readerNames.length]; return mReaders.values().toArray(new Reader[0]);
int i = 0; }
for (String readerName : readerNames) {
if (mReaders.get(readerName) == null) { /**
try { * Obtain a UICC Reader instance with specific slot number from the SecureElementService
mReaders.put(readerName, new Reader(this, readerName, *
getReader(readerName))); * @param slotNumber The index of the uicc slot. The index starts from 1.
readers[i++] = mReaders.get(readerName); * @throws IllegalArgumentException if the reader object corresponding to the uiccSlotNumber
} catch (Exception e) { * is not exist.
Log.e(TAG, "Error adding Reader: " + readerName, e); * @return A Reader object for this uicc slot.
} */
} else { public @NonNull Reader getUiccReader(int slotNumber) {
readers[i++] = mReaders.get(readerName); if (slotNumber < 1) {
} throw new IllegalArgumentException("slotNumber should be larger than 0");
} }
return readers; loadReaders();
String readerName = UICC_TERMINAL + slotNumber;
Reader reader = mReaders.get(readerName);
if (reader == null) {
throw new IllegalArgumentException("Reader:" + readerName + " doesn't exist");
}
return reader;
} }
/** /**
@@ -270,4 +273,30 @@ public final class SEService {
throw new IllegalStateException(e.getMessage()); throw new IllegalStateException(e.getMessage());
} }
} }
/**
* Load available Secure Element Readers
*/
private void loadReaders() {
if (mSecureElementService == null) {
throw new IllegalStateException("service not connected to system");
}
String[] readerNames;
try {
readerNames = mSecureElementService.getReaders();
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
for (String readerName : readerNames) {
if (mReaders.get(readerName) == null) {
try {
mReaders.put(readerName, new Reader(this, readerName,
getReader(readerName)));
} catch (Exception e) {
Log.e(TAG, "Error adding Reader: " + readerName, e);
}
}
}
}
} }