summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Yu <jackcwyu@google.com>2020-06-12 01:33:00 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-06-12 01:33:00 +0000
commitd97725cd738aaa9a00989ad769dd4da8b5fe515d (patch)
tree4c3d7eb265f7cb4fb4fbbbb83ee56cc9e820b538
parent8408f4984d22f96eea7e4c38b371a62963f92c2d (diff)
parenta0108ddb86db8ae5e1bf58462e2f14c8fb1750cc (diff)
downloadSecureElement-d97725cd738aaa9a00989ad769dd4da8b5fe515d.tar.gz
Refresh terminal instances when switching between SS and DS am: a0108ddb86android-mainline-12.0.0_r112android-mainline-11.0.0_r44android-mainline-11.0.0_r43android-mainline-11.0.0_r42android-mainline-11.0.0_r41android-mainline-11.0.0_r40android-mainline-11.0.0_r39android-mainline-11.0.0_r38android-mainline-11.0.0_r37android-mainline-11.0.0_r36android-mainline-11.0.0_r35android-mainline-11.0.0_r34android-mainline-11.0.0_r32android-mainline-11.0.0_r31android-mainline-11.0.0_r30android-mainline-11.0.0_r28android-mainline-11.0.0_r27android-mainline-11.0.0_r26android-mainline-11.0.0_r25android-mainline-11.0.0_r24android-mainline-11.0.0_r23android-mainline-11.0.0_r22android-mainline-11.0.0_r21android-mainline-11.0.0_r20android-mainline-11.0.0_r18android-mainline-11.0.0_r17android-mainline-11.0.0_r16android-mainline-11.0.0_r15android-mainline-11.0.0_r14android-mainline-11.0.0_r13android-mainline-11.0.0_r12aml_tz2_305400500aml_tz2_305400300aml_tz2_305400100aml_tz2_304500300aml_tz2_303900110aml_tz2_303900102aml_tz2_303800002aml_tz2_303800001aml_tz2_303200001android12-mainline-tzdata2-releaseandroid11-mainline-tethering-releaseandroid11-mainline-permission-releaseandroid11-mainline-os-statsd-releaseandroid11-mainline-networkstack-releaseandroid11-mainline-media-swcodec-releaseandroid11-mainline-media-releaseandroid11-mainline-extservices-releaseandroid11-mainline-documentsui-releaseandroid11-mainline-conscrypt-releaseandroid11-mainline-cellbroadcast-releaseandroid11-mainline-captiveportallogin-releaseaml_tz2_305400100
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/SecureElement/+/11675379 Change-Id: Id5767e7cb2045a1e6ca37c40db16be3668531359
-rw-r--r--src/com/android/se/SecureElementService.java62
-rw-r--r--src/com/android/se/Terminal.java18
2 files changed, 77 insertions, 3 deletions
diff --git a/src/com/android/se/SecureElementService.java b/src/com/android/se/SecureElementService.java
index e979fd9..758fc77 100644
--- a/src/com/android/se/SecureElementService.java
+++ b/src/com/android/se/SecureElementService.java
@@ -23,8 +23,10 @@
package com.android.se;
import android.app.Service;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.Build;
@@ -38,6 +40,7 @@ import android.se.omapi.ISecureElementReader;
import android.se.omapi.ISecureElementService;
import android.se.omapi.ISecureElementSession;
import android.se.omapi.SEService;
+import android.telephony.TelephonyManager;
import android.util.Log;
import com.android.se.Terminal.SecureElementReader;
@@ -63,6 +66,7 @@ public final class SecureElementService extends Service {
private static final boolean DEBUG = Build.IS_DEBUGGABLE;
// LinkedHashMap will maintain the order of insertion
private LinkedHashMap<String, Terminal> mTerminals = new LinkedHashMap<String, Terminal>();
+ private int mActiveSimCount = 0;
private final ISecureElementService.Stub mSecureElementServiceBinder =
new ISecureElementService.Stub() {
@@ -108,6 +112,13 @@ public final class SecureElementService extends Service {
super();
}
+ private void initialize() {
+ // listen for events
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED);
+ this.registerReceiver(mMultiSimConfigChangedReceiver, intentFilter);
+ }
+
/** Returns the terminal from the Reader name. */
private Terminal getTerminal(String reader) {
if (reader == null) {
@@ -135,6 +146,7 @@ public final class SecureElementService extends Service {
@Override
public void onCreate() {
Log.i(mTag, Thread.currentThread().getName() + " onCreate");
+ initialize();
createTerminals();
ServiceManager.addService(Context.SECURE_ELEMENT_SERVICE, mSecureElementServiceBinder);
}
@@ -149,19 +161,29 @@ public final class SecureElementService extends Service {
terminal.closeChannels();
terminal.close();
}
+ if (mMultiSimConfigChangedReceiver != null) {
+ this.unregisterReceiver(mMultiSimConfigChangedReceiver);
+ }
}
private void addTerminals(String terminalName) {
int index = 1;
String name = null;
+ if (terminalName.startsWith(SecureElementService.UICC_TERMINAL)) {
+ index = mActiveSimCount + 1;
+ }
try {
do {
name = terminalName + Integer.toString(index);
Terminal terminal = new Terminal(name, this);
+ Log.i(mTag, "Check if terminal " + name + " is available.");
// Only retry on fail for the first terminal of each type.
terminal.initialize(index == 1);
mTerminals.put(name, terminal);
+ if (terminalName.equals(UICC_TERMINAL)) {
+ mActiveSimCount = index;
+ }
} while (++index > 0);
} catch (NoSuchElementException e) {
Log.i(mTag, "No HAL implementation for " + name);
@@ -176,6 +198,29 @@ public final class SecureElementService extends Service {
addTerminals(UICC_TERMINAL);
}
+ private void refreshUiccTerminals(int activeSimCount) {
+ String name = null;
+ synchronized (this) {
+ if (activeSimCount < mActiveSimCount) {
+ // Remove non-supported UICC terminals
+ for (int i = activeSimCount + 1; i <= mActiveSimCount; i++) {
+ name = UICC_TERMINAL + Integer.toString(i);
+ Terminal terminal = mTerminals.get(name);
+ if (terminal != null) {
+ terminal.closeChannels();
+ terminal.close();
+ }
+ mTerminals.remove(name);
+ Log.i(mTag, name + " is removed from available Terminals");
+ }
+ mActiveSimCount = activeSimCount;
+ } else if (activeSimCount > mActiveSimCount) {
+ // Try to initialize new UICC terminals
+ addTerminals(UICC_TERMINAL);
+ }
+ }
+ }
+
private String getPackageNameFromCallingUid(int uid) {
PackageManager packageManager = getPackageManager();
if (packageManager != null) {
@@ -332,4 +377,21 @@ public final class SecureElementService extends Service {
return channel.new SecureElementChannel();
}
}
+
+ private final BroadcastReceiver mMultiSimConfigChangedReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(TelephonyManager.ACTION_MULTI_SIM_CONFIG_CHANGED)) {
+ int activeSimCount =
+ intent.getIntExtra(TelephonyManager.EXTRA_ACTIVE_SIM_SUPPORTED_COUNT, 1);
+ Log.i(mTag, "received action MultiSimConfigChanged. Refresh UICC terminals");
+ Log.i(mTag, "Current ActiveSimCount:" + activeSimCount
+ + ". Previous ActiveSimCount:" + mActiveSimCount);
+
+ // Check for any change to UICC SE HAL implementations
+ refreshUiccTerminals(activeSimCount);
+ }
+ }
+ };
}
diff --git a/src/com/android/se/Terminal.java b/src/com/android/se/Terminal.java
index 4638926..54dc256 100644
--- a/src/com/android/se/Terminal.java
+++ b/src/com/android/se/Terminal.java
@@ -76,6 +76,9 @@ public class Terminal {
private static final int GET_SERVICE_DELAY_MILLIS = 4 * 1000;
private static final int EVENT_GET_HAL = 1;
+ private final int mMaxGetHalRetryCount = 5;
+ private int mGetHalRetryCount = 0;
+
private ISecureElement mSEHal;
private android.hardware.secure_element.V1_2.ISecureElement mSEHal12;
@@ -186,11 +189,20 @@ public class Terminal {
switch (message.what) {
case EVENT_GET_HAL:
try {
- initialize(true);
+ if (mName.startsWith(SecureElementService.ESE_TERMINAL)) {
+ initialize(true);
+ } else {
+ initialize(false);
+ }
} catch (Exception e) {
Log.e(mTag, mName + " could not be initialized again");
- sendMessageDelayed(obtainMessage(EVENT_GET_HAL, 0),
- GET_SERVICE_DELAY_MILLIS);
+ if (mGetHalRetryCount < mMaxGetHalRetryCount) {
+ mGetHalRetryCount++;
+ sendMessageDelayed(obtainMessage(EVENT_GET_HAL, 0),
+ GET_SERVICE_DELAY_MILLIS);
+ } else {
+ Log.e(mTag, mName + " reach maximum retry count");
+ }
}
break;
default: