diff options
-rw-r--r-- | src/com/android/mms/service/MmsNetworkManager.java | 69 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsRequest.java | 38 |
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? - } - } |