summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Taylor <tomtaylor@google.com>2021-03-19 22:45:38 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-03-19 22:45:38 +0000
commit00ba6b807cd72fea83cac054c686d6cbd68168af (patch)
tree2d0360b9c40c941db16b09ddb037baae84d0b09a
parent11f7022d0dcde62d613ca1663bbe5bd699c8aae0 (diff)
parent83d454e76d9c0237011121c0424b73394dd05eb6 (diff)
downloadMms-00ba6b807cd72fea83cac054c686d6cbd68168af.tar.gz
Pass precise connection error up to calling app am: 83d454e76d
Original change: https://android-review.googlesource.com/c/platform/packages/services/Mms/+/1640599 Change-Id: I0e40353c083bc130fa1076223ab3d3148f940c62
-rw-r--r--src/com/android/mms/service/DownloadRequest.java2
-rw-r--r--src/com/android/mms/service/MmsRequest.java58
-rw-r--r--src/com/android/mms/service/SendRequest.java2
3 files changed, 57 insertions, 5 deletions
diff --git a/src/com/android/mms/service/DownloadRequest.java b/src/com/android/mms/service/DownloadRequest.java
index 96be5fd..f5fe493 100644
--- a/src/com/android/mms/service/DownloadRequest.java
+++ b/src/com/android/mms/service/DownloadRequest.java
@@ -344,7 +344,7 @@ public class DownloadRequest extends MmsRequest {
if (!maybeFallbackToRegularDelivery(result)) {
processResult(mContext, toSmsManagerResult(result), null/* response */,
- 0/* httpStatusCode */);
+ 0/* httpStatusCode */, /* handledByCarrierApp= */ true);
}
}
}
diff --git a/src/com/android/mms/service/MmsRequest.java b/src/com/android/mms/service/MmsRequest.java
index de24a49..b4c1a57 100644
--- a/src/com/android/mms/service/MmsRequest.java
+++ b/src/com/android/mms/service/MmsRequest.java
@@ -16,6 +16,7 @@
package com.android.mms.service;
+import android.annotation.NonNull;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
@@ -27,6 +28,10 @@ import android.os.Bundle;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallback;
import android.telephony.AnomalyReporter;
+import android.telephony.MmsManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.PreciseDataConnectionState;
+import android.telephony.data.ApnSetting;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.ImsMmTelManager;
import android.telephony.ims.stub.ImsRegistrationImplBase;
@@ -49,6 +54,10 @@ public abstract class MmsRequest {
private static final int SIGNAL_LEVEL_THRESHOLD = 2;
// MMS anomaly uuid
private final UUID mAnomalyUUID = UUID.fromString("e4330975-17be-43b7-87d6-d9f281d33278");
+ public static final String EXTRA_LAST_CONNECTION_FAILURE_CAUSE_CODE
+ = "android.telephony.extra.LAST_CONNECTION_FAILURE_CAUSE_CODE";
+ public static final String EXTRA_HANDLED_BY_CARRIER_APP
+ = "android.telephony.extra.HANDLED_BY_CARRIER_APP";
/**
* Interface for certain functionalities from MmsService
@@ -96,6 +105,25 @@ public abstract class MmsRequest {
// Context used to get TelephonyManager.
protected Context mContext;
protected long mMessageId;
+ protected int mLastConnectionFailure;
+
+ class MonitorPhoneStateListener extends PhoneStateListener
+ implements PhoneStateListener.PreciseDataConnectionStateChangedListener {
+ @Override
+ public void onPreciseDataConnectionStateChanged(
+ PreciseDataConnectionState connectionState) {
+ if (connectionState == null) {
+ return;
+ }
+ ApnSetting apnSetting = connectionState.getApnSetting();
+ int apnTypes = apnSetting.getApnTypeBitmask();
+ if ((apnTypes & ApnSetting.TYPE_MMS) != 0) {
+ mLastConnectionFailure = connectionState.getLastCauseCode();
+ LogUtil.d("onPreciseDataConnectionStateChanged mLastConnectionFailure: "
+ + mLastConnectionFailure);
+ }
+ }
+ }
public MmsRequest(RequestManager requestManager, int subId, String creator,
Bundle configOverrides, Context context, long messageId) {
@@ -165,7 +193,9 @@ public abstract class MmsRequest {
// Try multiple times of MMS HTTP request, depending on the error.
for (int i = 0; i < RETRY_TIMES; i++) {
httpStatusCode = 0; // Clear for retry.
+ PhoneStateListener connectionStateListener = new MonitorPhoneStateListener();
try {
+ listenToDataConnectionState(connectionStateListener);
networkManager.acquireNetwork(requestId);
final String apnName = networkManager.getApnName();
LogUtil.d(requestId, "APN name is " + apnName);
@@ -210,6 +240,8 @@ public abstract class MmsRequest {
LogUtil.e(requestId, "Unexpected failure", e);
result = SmsManager.MMS_ERROR_UNSPECIFIED;
break;
+ } finally {
+ stopListeningToDataConnectionState(connectionStateListener);
}
try {
Thread.sleep(retryDelaySecs * 1000, 0/*nano*/);
@@ -217,7 +249,19 @@ public abstract class MmsRequest {
retryDelaySecs <<= 1;
}
}
- processResult(context, result, response, httpStatusCode);
+ processResult(context, result, response, httpStatusCode, /* handledByCarrierApp= */ false);
+ }
+
+ private void listenToDataConnectionState(PhoneStateListener connectionStateListener) {
+ final TelephonyManager telephonyManager = mContext.getSystemService(
+ TelephonyManager.class).createForSubscriptionId(mSubId);
+ telephonyManager.registerTelephonyCallback(r -> r.run(), connectionStateListener);
+ }
+
+ private void stopListeningToDataConnectionState(PhoneStateListener connectionStateListener) {
+ final TelephonyManager telephonyManager = mContext.getSystemService(
+ TelephonyManager.class).createForSubscriptionId(mSubId);
+ telephonyManager.unregisterTelephonyCallback(connectionStateListener);
}
/**
@@ -227,8 +271,11 @@ public abstract class MmsRequest {
* @param result The result code of execution
* @param response The response body
* @param httpStatusCode The optional http status code in case of http failure
+ * @param handledByCarrierApp True if the sending/downloading was handled by a carrier app
+ * rather than MmsService.
*/
- public void processResult(Context context, int result, byte[] response, int httpStatusCode) {
+ public void processResult(Context context, int result, byte[] response, int httpStatusCode,
+ boolean handledByCarrierApp) {
final Uri messageUri = persistIfRequired(context, result, response);
final String requestId = this.getRequestId();
@@ -237,7 +284,9 @@ public abstract class MmsRequest {
// "httpStatusCode: xxx" is now reported for an http failure only.
LogUtil.i(requestId, "processResult: "
+ (result == Activity.RESULT_OK ? "success" : "failure(" + result + ")")
- + (httpStatusCode != 0 ? ", httpStatusCode: " + httpStatusCode : ""));
+ + (httpStatusCode != 0 ? ", httpStatusCode: " + httpStatusCode : "")
+ + " handledByCarrierApp: " + handledByCarrierApp
+ + " mLastConnectionFailure: " + mLastConnectionFailure);
// Return MMS HTTP request result via PendingIntent
final PendingIntent pendingIntent = getPendingIntent();
@@ -254,6 +303,9 @@ public abstract class MmsRequest {
if (result == SmsManager.MMS_ERROR_HTTP_FAILURE && httpStatusCode != 0) {
fillIn.putExtra(SmsManager.EXTRA_MMS_HTTP_STATUS, httpStatusCode);
}
+ fillIn.putExtra(EXTRA_LAST_CONNECTION_FAILURE_CAUSE_CODE,
+ mLastConnectionFailure);
+ fillIn.putExtra(EXTRA_HANDLED_BY_CARRIER_APP, handledByCarrierApp);
try {
if (!succeeded) {
result = SmsManager.MMS_ERROR_IO_ERROR;
diff --git a/src/com/android/mms/service/SendRequest.java b/src/com/android/mms/service/SendRequest.java
index c159cbb..8fd5185 100644
--- a/src/com/android/mms/service/SendRequest.java
+++ b/src/com/android/mms/service/SendRequest.java
@@ -458,7 +458,7 @@ public class SendRequest extends MmsRequest {
if (!maybeFallbackToRegularDelivery(result)) {
processResult(mContext, toSmsManagerResult(result), sendConfPdu,
- 0/* httpStatusCode */);
+ 0/* httpStatusCode */, /* handledByCarrierApp= */ true);
}
}