diff options
author | Ganesh Deva <ganesh.deva_1@nxp.com> | 2020-07-22 19:19:49 +0530 |
---|---|---|
committer | nxf24591 <nanjesh.s_1@nxp.com> | 2020-09-08 17:44:08 +0530 |
commit | ed2d622a9f97b4be3278c3881dffb902e295c52e (patch) | |
tree | f7764c5bbea81e7eb99fab984aa3e1f2a56997b0 | |
parent | 372bf89244506db5ff0cce525d84114b7c31c21d (diff) |
Refresh terminal instances when switching between SS and DS
Listen to CARRIER_CONFIG_CHANGED and reinitialize UICC terminals.
-rwxr-xr-x | src/com/android/se/SecureElementService.java | 73 | ||||
-rwxr-xr-x | src/com/android/se/Terminal.java | 18 |
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: |