diff options
Diffstat (limited to 'src/com/android/mms/service/MmsNetworkManager.java')
-rw-r--r-- | src/com/android/mms/service/MmsNetworkManager.java | 69 |
1 files changed, 69 insertions, 0 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(); } |