summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Cerqueira <ricardo@cyngn.com>2016-06-02 21:55:37 +0100
committerRicardo Cerqueira <ricardo@cyngn.com>2016-06-03 23:37:54 +0100
commitc76119708155474eb2bd846a32d4c3b0eae842cf (patch)
tree1162c3213ba7dde6fbb78db1aaa6cd07fdda2954
parent50a85fea2aaf8fc01613e61090fe18c5116032b3 (diff)
downloadandroid_packages_services_Mms-c76119708155474eb2bd846a32d4c3b0eae842cf.tar.gz
android_packages_services_Mms-c76119708155474eb2bd846a32d4c3b0eae842cf.tar.bz2
android_packages_services_Mms-c76119708155474eb2bd846a32d4c3b0eae842cf.zip
MmsRequest: Reimplement automatic data sub switch
Make the whole process more synchronous, by waiting for a switch confirmation from the subscription controller instead of waiting for a fixed "safe" amount of time. Also, tie the switches to the actual network requests/releases so that the existing "reuse this connection if possible" hooks affect the switches too. We want as few of those as possible. This replaces the implementation from Ide3bcc65beb171c8db1f49f9c101a5db7fd505f4 Ref CYNGNOS-2492 Change-Id: Ic9bf7897150ae53e6ebb55c2e8fceb003a366417
-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?
- }
-
}