diff options
Diffstat (limited to 'internal/src/org/codeaurora')
| -rw-r--r-- | internal/src/org/codeaurora/internal/TelephonyExtUtils.java | 66 |
1 files changed, 52 insertions, 14 deletions
diff --git a/internal/src/org/codeaurora/internal/TelephonyExtUtils.java b/internal/src/org/codeaurora/internal/TelephonyExtUtils.java index 057b00d..60c65cf 100644 --- a/internal/src/org/codeaurora/internal/TelephonyExtUtils.java +++ b/internal/src/org/codeaurora/internal/TelephonyExtUtils.java @@ -20,9 +20,11 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.AsyncTask; import android.os.IBinder.DeathRecipient; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.SystemProperties; import android.telephony.SubscriptionManager; import android.util.Log; @@ -32,6 +34,8 @@ import org.codeaurora.internal.IExtTelephony; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.TimeUnit; public final class TelephonyExtUtils { private static final boolean DEBUG = false; @@ -42,6 +46,9 @@ public final class TelephonyExtUtils { public static final String EXTRA_NEW_PROVISION_STATE = "newProvisionState"; + private static final int ACTIVATE_TIME_OUT = 15000; + private static final String PROP_TIME_OUT = "sys.uicc.activate.timeout"; + // This is the list of possible values that // IExtTelephony.getCurrentUiccCardProvisioningStatus() can return public static final int CARD_NOT_PRESENT = -2; @@ -159,15 +166,7 @@ public final class TelephonyExtUtils { * @return The result of the activation or -1 */ public int activateUiccCard(int slotId) { - IExtTelephony service = getService(); - if (service != null) { - try { - return mExtTelephony.activateUiccCard(slotId); - } catch (RemoteException ex) { - Log.e(TAG, "Activating sub failed for slotId: " + slotId); - } - } - return -1; + return setUiccCardProvisioningStatus(PROVISIONED, slotId); } /** @@ -176,14 +175,53 @@ public final class TelephonyExtUtils { * @return The result of the deactivation or -1 */ public int deactivateUiccCard(int slotId) { + return setUiccCardProvisioningStatus(NOT_PROVISIONED, slotId); + } + + private int setUiccCardProvisioningStatus(int provStatus, int slotId) { + String actionStr; + switch (provStatus) { + case PROVISIONED: + actionStr = "Activating"; + break; + case NOT_PROVISIONED: + actionStr = "Deactivating"; + break; + default: + Log.e(TAG, "Invalid argument for setUiccCardProvisioningStatus " + + "(provStatus=" + provStatus + ", slotId=" + slotId + ")"); + return -1; + } + IExtTelephony service = getService(); - if (service != null) { - try { - return mExtTelephony.deactivateUiccCard(slotId); - } catch (RemoteException ex) { - Log.e(TAG, "Deactivating sub failed for slotId: " + slotId); + if (service == null) { + return -1; + } + + AsyncTask<Integer, Void, Integer> task = new AsyncTask<Integer, Void, Integer>() { + @Override + protected Integer doInBackground(Integer... params) { + try { + return params[0] == PROVISIONED + ? mExtTelephony.activateUiccCard(params[1]) + : mExtTelephony.deactivateUiccCard(params[1]); + } catch (RemoteException ex) { + Log.e(TAG, actionStr + " sub failed for slotId: " + params[1]); + } + return -1; } + }; + + try { + return task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, provStatus, slotId) + .get(ACTIVATE_TIME_OUT, TimeUnit.MILLISECONDS); + } catch (TimeoutException ex) { + Log.e(TAG, actionStr + " sub timed out for slotId: " + slotId); + SystemProperties.set(PROP_TIME_OUT, Integer.toString(slotId + 1)); + } catch (Exception ex) { + Log.e(TAG, actionStr + " sub task failed for slotId: " + slotId); } + return -1; } |
