summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/mms/service/MmsNetworkManager.java69
-rw-r--r--src/com/android/mms/service/MmsRequest.java38
2 files changed, 70 insertions, 37 deletions
diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java
index ed78258..226a5b1 100644
--- a/src/com/android/mms/service/MmsNetworkManager.java
+++ b/src/com/android/mms/service/MmsNetworkManager.java
@@ -16,7 +16,10 @@
package com.android.mms.service;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -24,8 +27,13 @@ import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.SystemClock;
+import android.telephony.SubscriptionManager;
+
import com.android.mms.service.exception.MmsNetworkException;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.TelephonyIntents;
+
/**
* Manages the MMS network connectivity
*/
@@ -59,6 +67,9 @@ public class MmsNetworkManager {
// The SIM ID which we use to connect
private final int mSubId;
+ private int mUserChosenDataSubId = -1;
+ private boolean mWaitForDataSwitch;
+
/**
* Network callback for our network request
*/
@@ -107,8 +118,33 @@ public class MmsNetworkManager {
.addCapability(NetworkCapabilities.NET_CAPABILITY_MMS)
.setNetworkSpecifier(Integer.toString(mSubId))
.build();
+ // Register for DDS changes
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
+ context.registerReceiver(mIntentReceiver, filter, null, null);
+
}
+ private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ddsHasChanged(intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, -1));
+ }
+ };
+
+ private void ddsHasChanged(int subId) {
+ if (mSubId == subId) {
+ mWaitForDataSwitch = false;
+ LogUtil.d("MmsNetworkManager: DDS switch to " + subId + " complete");
+ }
+ }
+
+ private void setDefaultDataSubId(int subId) {
+ SubscriptionManager.from(mContext).setDefaultDataSubId(subId);
+ // Should we toast about the data switch like Settings?
+ }
+
+
/**
* Acquire the MMS network
*
@@ -128,6 +164,11 @@ public class MmsNetworkManager {
LogUtil.d(requestId, "MmsNetworkManager: start new network request");
startNewNetworkRequestLocked();
}
+ // If we got here and still think there's a data switch pending, it didn't take
+ if (mWaitForDataSwitch) {
+ throw new MmsNetworkException("Acquiring data subscription timed out");
+ }
+
final long shouldEnd = SystemClock.elapsedRealtime() + NETWORK_ACQUIRE_TIMEOUT_MILLIS;
long waitTime = NETWORK_ACQUIRE_TIMEOUT_MILLIS;
while (waitTime > 0) {
@@ -172,6 +213,28 @@ public class MmsNetworkManager {
*/
private void startNewNetworkRequestLocked() {
final ConnectivityManager connectivityManager = getConnectivityManager();
+
+ if (mSubId != SubscriptionManager.from(mContext).getDefaultDataSubId()) {
+ mUserChosenDataSubId = SubscriptionManager.from(mContext).getDefaultDataSubId();
+ mWaitForDataSwitch = true;
+ setDefaultDataSubId(mSubId);
+ } else {
+ mWaitForDataSwitch = false;
+ }
+
+ long waitTime = 120 * 1000; // Wait at most 2 minutes for the data switch
+ long switchAbortTime = SystemClock.elapsedRealtime() + waitTime;
+
+ while (mWaitForDataSwitch && waitTime > 0) {
+ LogUtil.d("MmsNetworkManager: Waiting for DDS switch");
+ try {
+ this.wait(2 * 1000); // Re-check every 2 seconds
+ } catch (InterruptedException e) {
+ LogUtil.w("MmsNetworkManager: DDS switch wait interrupted");
+ }
+ waitTime = switchAbortTime - SystemClock.elapsedRealtime();
+ }
+
mNetworkCallback = new NetworkRequestCallback();
connectivityManager.requestNetwork(
mNetworkRequest, mNetworkCallback, NETWORK_REQUEST_TIMEOUT_MILLIS);
@@ -198,6 +261,12 @@ public class MmsNetworkManager {
LogUtil.w("Unregister network callback exception", e);
}
}
+
+ if (mUserChosenDataSubId >= 0 && mSubId != mUserChosenDataSubId) {
+ setDefaultDataSubId(mUserChosenDataSubId);
+ mUserChosenDataSubId = -1;
+ }
+
resetLocked();
}
diff --git a/src/com/android/mms/service/MmsRequest.java b/src/com/android/mms/service/MmsRequest.java
index badcca1..1b6845b 100644
--- a/src/com/android/mms/service/MmsRequest.java
+++ b/src/com/android/mms/service/MmsRequest.java
@@ -25,7 +25,6 @@ import android.os.Bundle;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.telephony.SmsManager;
-import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -38,7 +37,6 @@ import com.android.mms.service.exception.MmsNetworkException;
*/
public abstract class MmsRequest {
private static final int RETRY_TIMES = 3;
- private static final int RETRY_TIMES_WITH_DATA_SWITCH = 5;
/**
* Interface for certain functionalities from MmsService
@@ -85,8 +83,6 @@ public abstract class MmsRequest {
protected Bundle mMmsConfigOverrides;
// Context used to get TelephonyManager.
protected Context mContext;
- // The active DDS id
- protected int mDataSubId;
public MmsRequest(RequestManager requestManager, int subId, String creator,
Bundle configOverrides, Context context) {
@@ -141,8 +137,6 @@ public abstract class MmsRequest {
int result = SmsManager.MMS_ERROR_UNSPECIFIED;
int httpStatusCode = 0;
byte[] response = null;
-
- mDataSubId = getDefaultDataSubId();
// TODO: add mms data channel check back to fast fail if no way to send mms,
// when telephony provides such API.
if (!ensureMmsConfigLoaded()) { // Check mms config
@@ -152,21 +146,9 @@ public abstract class MmsRequest {
LogUtil.e(requestId, "Failed to prepare for request");
result = SmsManager.MMS_ERROR_IO_ERROR;
} else { // Execute
- int retryTimes = RETRY_TIMES;
- if (getDefaultDataSubId() != mSubId) {
- setDefaultDataSubId(mSubId);
- // Give the switch some time to happen
- try {
- Thread.sleep(10 * 1000, 0/*nano*/);
- } catch (InterruptedException e) {}
- // DDS switches are expensive. Instead of retrying for just 30 seconds,
- // try up to approximately 2 minutes before giving up and switching back
- retryTimes = RETRY_TIMES_WITH_DATA_SWITCH;
- }
-
long retryDelaySecs = 2;
// Try multiple times of MMS HTTP request
- for (int i = 0; i < retryTimes; i++) {
+ for (int i = 0; i < RETRY_TIMES; i++) {
try {
networkManager.acquireNetwork(requestId);
final String apnName = networkManager.getApnName();
@@ -257,9 +239,6 @@ public abstract class MmsRequest {
}
revokeUriPermission(context);
- if (getDefaultDataSubId() != mDataSubId) {
- setDefaultDataSubId(mDataSubId);
- }
}
/**
@@ -372,19 +351,4 @@ public abstract class MmsRequest {
LogUtil.e("Unexpected onFilterComplete call with result: " + keepMessage);
}
}
-
- /*
- * @return the subId of whichever subId is active for data.
- */
- private int getDefaultDataSubId() {
- return SubscriptionManager.from(mContext).getDefaultDataSubId();
- }
- /*
- * @return set the subId for data
- */
- private void setDefaultDataSubId(int subId) {
- SubscriptionManager.from(mContext).setDefaultDataSubId(subId);
- // Should we toast about the data switch like Settings?
- }
-
}