summaryrefslogtreecommitdiff
path: root/src/com/android/se/SecureElementService.java
diff options
context:
space:
mode:
authorJack Yu <jackcwyu@google.com>2020-04-08 21:50:43 +0800
committerJack Yu <jackcwyu@google.com>2020-06-11 08:41:24 +0000
commita0108ddb86db8ae5e1bf58462e2f14c8fb1750cc (patch)
tree4c3d7eb265f7cb4fb4fbbbb83ee56cc9e820b538 /src/com/android/se/SecureElementService.java
parentda6daab1ebf75fef31bf78d01f1f1f76903a3f73 (diff)
Refresh terminal instances when switching between SS and DS
Listen to CARRIER_CONFIG_CHANGED and reinitialize UICC terminals. Bug: 152008670 Test: adb shell dumpsys secure_element Merged-In: I8bb13b43de6f17f0b5b82440708d90bf684ca7ec Change-Id: I8bb13b43de6f17f0b5b82440708d90bf684ca7ec
Diffstat (limited to 'src/com/android/se/SecureElementService.java')
-rw-r--r--src/com/android/se/SecureElementService.java62
1 files changed, 62 insertions, 0 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);
+ }
+ }
+ };
}