summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2020-11-03 18:06:37 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2020-11-03 18:06:37 +0000
commit2c632d3e320d8c64ec5781baaa473353a3512fb9 (patch)
tree01dbef8d61626d66e207c5754d227cdca3e43738
parent23d70dc43f1f7aa972a9e79464be579a8cf8714f (diff)
parent75b988665e84f769791e66a8916bb1fede3b176b (diff)
downloadMms-2c632d3e320d8c64ec5781baaa473353a3512fb9.tar.gz
Snap for 6948038 from 75b988665e84f769791e66a8916bb1fede3b176b to rvc-platform-releaseandroid-platform-11.0.0_r6android-platform-11.0.0_r5android-platform-11.0.0_r4android-platform-11.0.0_r3
Change-Id: Icb08e8c644cf39b9db2b3b425ca029df416cd18f
-rw-r--r--src/com/android/mms/service/ApnSettings.java2
-rw-r--r--src/com/android/mms/service/MmsRequest.java87
-rw-r--r--src/com/android/mms/service/MmsService.java66
3 files changed, 154 insertions, 1 deletions
diff --git a/src/com/android/mms/service/ApnSettings.java b/src/com/android/mms/service/ApnSettings.java
index 7e4a0fc..65d38b7 100644
--- a/src/com/android/mms/service/ApnSettings.java
+++ b/src/com/android/mms/service/ApnSettings.java
@@ -102,7 +102,7 @@ public class ApnSettings {
}
try (Cursor cursor = context.getContentResolver().query(
- Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "/subId/" + subId),
+ Uri.withAppendedPath(Telephony.Carriers.SIM_APN_URI, String.valueOf(subId)),
APN_PROJECTION,
selection,
selectionArgs,
diff --git a/src/com/android/mms/service/MmsRequest.java b/src/com/android/mms/service/MmsRequest.java
index baf9292..68f03d3 100644
--- a/src/com/android/mms/service/MmsRequest.java
+++ b/src/com/android/mms/service/MmsRequest.java
@@ -21,9 +21,15 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper;
+import android.telephony.AnomalyReporter;
+import android.telephony.ims.feature.MmTelFeature;
+import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -32,11 +38,17 @@ import com.android.mms.service.exception.ApnException;
import com.android.mms.service.exception.MmsHttpException;
import com.android.mms.service.exception.MmsNetworkException;
+import java.util.UUID;
+
/**
* Base class for MMS requests. This has the common logic of sending/downloading MMS.
*/
public abstract class MmsRequest {
private static final int RETRY_TIMES = 3;
+ // Signal level threshold for both wifi and cellular
+ private static final int SIGNAL_LEVEL_THRESHOLD = 2;
+ // MMS anomaly uuid
+ private final UUID mAnomalyUUID = UUID.fromString("e4330975-17be-43b7-87d6-d9f281d33278");
/**
* Interface for certain functionalities from MmsService
@@ -243,6 +255,7 @@ public abstract class MmsRequest {
if (!succeeded) {
result = SmsManager.MMS_ERROR_IO_ERROR;
}
+ reportPossibleAnomaly(result, httpStatusCode);
pendingIntent.send(context, result, fillIn);
} catch (PendingIntent.CanceledException e) {
LogUtil.e(requestId, "Sending pending intent canceled", e);
@@ -252,6 +265,80 @@ public abstract class MmsRequest {
revokeUriPermission(context);
}
+ private void reportPossibleAnomaly(int result, int httpStatusCode) {
+ switch (result) {
+ case SmsManager.MMS_ERROR_HTTP_FAILURE:
+ if (isPoorSignal()) {
+ LogUtil.i(this.toString(), "Poor Signal");
+ break;
+ }
+ case SmsManager.MMS_ERROR_INVALID_APN:
+ case SmsManager.MMS_ERROR_UNABLE_CONNECT_MMS:
+ case SmsManager.MMS_ERROR_UNSPECIFIED:
+ case SmsManager.MMS_ERROR_IO_ERROR:
+ String message = "MMS failed";
+ LogUtil.i(this.toString(),
+ message + " with error: " + result + " httpStatus:" + httpStatusCode);
+ AnomalyReporter.reportAnomaly(generateUUID(result, httpStatusCode), message);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private UUID generateUUID(int result, int httpStatusCode) {
+ long lresult = result;
+ long lhttpStatusCode = httpStatusCode;
+ return new UUID(mAnomalyUUID.getMostSignificantBits(),
+ mAnomalyUUID.getLeastSignificantBits() + ((lhttpStatusCode << 32) + lresult));
+ }
+
+ private boolean isPoorSignal() {
+ // Check Wifi signal strength when IMS registers via Wifi
+ if (isImsOnWifi()) {
+ int rssi = 0;
+ WifiManager wifiManager = mContext.getSystemService(WifiManager.class);
+ final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+ if (wifiInfo != null) {
+ rssi = wifiInfo.getRssi();
+ } else {
+ return false;
+ }
+ final int wifiLevel = wifiManager.calculateSignalLevel(rssi);
+ LogUtil.d(this.toString(), "Wifi signal rssi: " + rssi + " level:" + wifiLevel);
+ if (wifiLevel <= SIGNAL_LEVEL_THRESHOLD) {
+ return true;
+ }
+ return false;
+ } else {
+ // Check cellular signal strength
+ final TelephonyManager telephonyManager = mContext.getSystemService(
+ TelephonyManager.class).createForSubscriptionId(mSubId);
+ final int cellLevel = telephonyManager.getSignalStrength().getLevel();
+ LogUtil.d(this.toString(), "Cellular signal level:" + cellLevel);
+ if (cellLevel <= SIGNAL_LEVEL_THRESHOLD) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private boolean isImsOnWifi() {
+ ImsMmTelManager imsManager;
+ try {
+ imsManager = ImsMmTelManager.createForSubscriptionId(mSubId);
+ } catch (IllegalArgumentException e) {
+ LogUtil.e(this.toString(), "invalid subid:" + mSubId);
+ return false;
+ }
+ if (imsManager != null) {
+ return imsManager.isAvailable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
+ ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
+ } else {
+ return false;
+ }
+ }
+
/**
* Returns true if sending / downloading using the carrier app has failed and completes the
* action using platform API's, otherwise false.
diff --git a/src/com/android/mms/service/MmsService.java b/src/com/android/mms/service/MmsService.java
index 277f0b7..eb0fd88 100644
--- a/src/com/android/mms/service/MmsService.java
+++ b/src/com/android/mms/service/MmsService.java
@@ -42,6 +42,7 @@ import android.provider.Telephony;
import android.security.NetworkSecurityPolicy;
import android.service.carrier.CarrierMessagingService;
import android.telephony.SmsManager;
+import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
@@ -63,7 +64,10 @@ import com.google.android.mms.util.SqliteWrapper;
import java.io.IOException;
import java.util.ArrayDeque;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.Callable;
@@ -71,6 +75,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
/**
* System service to process MMS API requests
@@ -253,6 +259,24 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
subId = SubscriptionManager.getDefaultSmsSubscriptionId();
}
+ if (!isActiveSubId(subId)) {
+ List<SubscriptionInfo> activeSubList = getActiveSubscriptionsInGroup(subId);
+ if (activeSubList.isEmpty()) {
+ sendErrorInPendingIntent(downloadedIntent);
+ return;
+ }
+
+ subId = activeSubList.get(0).getSubscriptionId();
+ int defaultSmsSubId = SubscriptionManager.getDefaultSmsSubscriptionId();
+ // If we have default sms subscription, prefer to use that. Otherwise, use first
+ // subscription
+ for (SubscriptionInfo subInfo : activeSubList) {
+ if (subInfo.getSubscriptionId() == defaultSmsSubId) {
+ subId = subInfo.getSubscriptionId();
+ }
+ }
+ }
+
final DownloadRequest request = new DownloadRequest(MmsService.this, subId, locationUrl,
contentUri, downloadedIntent, callingPkg, configOverrides, MmsService.this,
messageId);
@@ -276,6 +300,48 @@ public class MmsService extends Service implements MmsRequest.RequestManager {
addSimRequest(request);
}
+ private List<SubscriptionInfo> getActiveSubscriptionsInGroup(int subId) {
+ SubscriptionManager subManager =
+ (SubscriptionManager) getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+
+ if (subManager == null) {
+ return Collections.emptyList();
+ }
+
+ List<SubscriptionInfo> subList = subManager.getAvailableSubscriptionInfoList();
+
+ if (subList == null) {
+ return Collections.emptyList();
+ }
+
+ SubscriptionInfo subscriptionInfo = null;
+ for (SubscriptionInfo subInfo : subList) {
+ if (subInfo.getSubscriptionId() == subId) {
+ subscriptionInfo = subInfo;
+ break;
+ }
+ }
+
+ if (subscriptionInfo == null) {
+ return Collections.emptyList();
+ }
+
+ if (subscriptionInfo.getGroupUuid() == null) {
+ return Collections.emptyList();
+ }
+
+ List<SubscriptionInfo> subscriptionInGroupList =
+ subManager.getSubscriptionsInGroup(subscriptionInfo.getGroupUuid());
+
+ // the list is sorted by isOpportunistic and isOpportunistic == false will have higher
+ // priority
+ return subscriptionInGroupList.stream()
+ .filter(info ->
+ info.getSimSlotIndex() != SubscriptionManager.INVALID_SIM_SLOT_INDEX)
+ .sorted(Comparator.comparing(SubscriptionInfo::isOpportunistic))
+ .collect(Collectors.toList());
+ }
+
@Override
public Uri importTextMessage(String callingPkg, String address, int type, String text,
long timestampMillis, boolean seen, boolean read) {