diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-11-03 18:06:37 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-11-03 18:06:37 +0000 |
commit | 2c632d3e320d8c64ec5781baaa473353a3512fb9 (patch) | |
tree | 01dbef8d61626d66e207c5754d227cdca3e43738 | |
parent | 23d70dc43f1f7aa972a9e79464be579a8cf8714f (diff) | |
parent | 75b988665e84f769791e66a8916bb1fede3b176b (diff) | |
download | Mms-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.java | 2 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsRequest.java | 87 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsService.java | 66 |
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) { |