summaryrefslogtreecommitdiff
path: root/internal/src/org/codeaurora
diff options
context:
space:
mode:
Diffstat (limited to 'internal/src/org/codeaurora')
-rw-r--r--internal/src/org/codeaurora/internal/TelephonyExtUtils.java66
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;
}