summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Deva <ganesh.deva_1@nxp.com>2020-07-22 19:19:49 +0530
committernxf24591 <nanjesh.s_1@nxp.com>2020-09-08 17:44:08 +0530
commited2d622a9f97b4be3278c3881dffb902e295c52e (patch)
treef7764c5bbea81e7eb99fab984aa3e1f2a56997b0
parent372bf89244506db5ff0cce525d84114b7c31c21d (diff)
Refresh terminal instances when switching between SS and DS
Listen to CARRIER_CONFIG_CHANGED and reinitialize UICC terminals.
-rwxr-xr-xsrc/com/android/se/SecureElementService.java73
-rwxr-xr-xsrc/com/android/se/Terminal.java18
2 files changed, 88 insertions, 3 deletions
diff --git a/src/com/android/se/SecureElementService.java b/src/com/android/se/SecureElementService.java
index a4fb12a..715794d 100755
--- a/src/com/android/se/SecureElementService.java
+++ b/src/com/android/se/SecureElementService.java
@@ -42,8 +42,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;
@@ -57,6 +59,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;
@@ -82,6 +85,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() {
@@ -131,6 +135,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) {
@@ -159,6 +170,7 @@ public final class SecureElementService extends Service {
public void onCreate() {
super.onCreate();
Log.i(mTag, Thread.currentThread().getName() + " onCreate");
+ initialize();
createTerminals();
ServiceManager.addService(Context.SECURE_ELEMENT_SERVICE, mSecureElementServiceBinder);
}
@@ -174,6 +186,9 @@ public final class SecureElementService extends Service {
terminal.closeChannels();
terminal.close();
}
+ if (mMultiSimConfigChangedReceiver != null) {
+ this.unregisterReceiver(mMultiSimConfigChangedReceiver);
+ }
}
private void addTerminals(String terminalName) {
@@ -187,6 +202,9 @@ public final class SecureElementService extends Service {
// 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);
@@ -201,6 +219,44 @@ public final class SecureElementService extends Service {
addTerminals(UICC_TERMINAL);
}
+ private void refreshUiccTerminals(int activeSimCount) {
+ int index = 1;
+ 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
+ try {
+ index = mActiveSimCount + 1;
+ do {
+ name = UICC_TERMINAL + Integer.toString(index);
+ Log.i(mTag, "Check if terminal " + name + " is available.");
+ Terminal terminal = new Terminal(name, this);
+ terminal.initialize(true);
+ mTerminals.put(name, terminal);
+ mActiveSimCount = index;
+ } while (++index <= activeSimCount);
+ } catch (NoSuchElementException e) {
+ Log.i(mTag, "No HAL implementation for " + name);
+ } catch (RemoteException | RuntimeException e) {
+ Log.e(mTag, "Error in getService() for " + name);
+ }
+ }
+ }
+ }
+
private String getPackageNameFromCallingUid(int uid) {
PackageManager packageManager = getPackageManager();
if (packageManager != null) {
@@ -360,4 +416,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 1108440..4894aec 100755
--- a/src/com/android/se/Terminal.java
+++ b/src/com/android/se/Terminal.java
@@ -129,6 +129,9 @@ public class Terminal {
*/
private static final int NFC_IN_USE = 3;
+ private final int mMaxGetHalRetryCount = 5;
+ private int mGetHalRetryCount = 0;
+
private ISecureElement mSEHal;
private android.hardware.secure_element.V1_2.ISecureElement mSEHal12;
private INxpEse mNxpEseHal;
@@ -222,11 +225,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: