diff options
author | Xin Li <delphij@google.com> | 2023-08-14 15:43:31 -0700 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2023-08-14 15:43:31 -0700 |
commit | 31fcb957f36bc62c087b3f1741c4e813d5623f26 (patch) | |
tree | e868dd25fab5d0a7d5d81e728df694385cb9f605 | |
parent | 4a54ae137881e6e4d66714faef18d481d0240c28 (diff) | |
parent | cadd5ff6dfab4365b0e9295b8ee1590c69346e13 (diff) | |
download | Mms-tmp_amf_298295554.tar.gz |
Merge Android U (ab/10368041)tmp_amf_298295554
Bug: 291102124
Merged-In: Ic36d54ada122dbc1b9e80eed09e13245f55b1c26
Change-Id: Ib0230aba8d96a09341cb6776498518e7e0240f20
-rw-r--r-- | AndroidManifest.xml | 4 | ||||
-rw-r--r-- | proto/src/persist_mms_atoms.proto | 4 | ||||
-rw-r--r-- | src/com/android/mms/service/DownloadRequest.java | 6 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsConstants.java | 25 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsNetworkManager.java | 6 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsRequest.java | 7 | ||||
-rw-r--r-- | src/com/android/mms/service/MmsService.java | 15 | ||||
-rw-r--r-- | src/com/android/mms/service/SendRequest.java | 26 | ||||
-rw-r--r-- | src/com/android/mms/service/metrics/MmsMetricsCollector.java | 6 | ||||
-rw-r--r-- | src/com/android/mms/service/metrics/MmsStats.java | 23 | ||||
-rw-r--r-- | tests/unittests/src/com/android/mms/service/metrics/MmsStatsTest.java | 25 |
11 files changed, 122 insertions, 25 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 87e7947..a19a11a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -26,6 +26,10 @@ <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/> <uses-permission android:name="android.permission.BIND_CARRIER_SERVICES"/> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/> + <!-- Needed to check if subscription is active. --> + <uses-permission android:name="android.permission.READ_PHONE_STATE"/> + <!-- Needed to query user associated with a subscription. --> + <uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION"/> <protected-broadcast android:name="android.settings.ENABLE_MMS_DATA_REQUEST"/> diff --git a/proto/src/persist_mms_atoms.proto b/proto/src/persist_mms_atoms.proto index c562246..bde1cb9 100644 --- a/proto/src/persist_mms_atoms.proto +++ b/proto/src/persist_mms_atoms.proto @@ -50,6 +50,7 @@ message IncomingMms { optional int64 mms_count = 9; optional int32 retry_id = 10; optional bool handled_by_carrier_app = 11; + optional bool is_managed_profile = 12; } message OutgoingMms { @@ -65,4 +66,5 @@ message OutgoingMms { optional bool is_from_default_app = 10; optional int32 retry_id = 11; optional bool handled_by_carrier_app = 12; -}
\ No newline at end of file + optional bool is_managed_profile = 13; +} diff --git a/src/com/android/mms/service/DownloadRequest.java b/src/com/android/mms/service/DownloadRequest.java index d81b384..62fa9e6 100644 --- a/src/com/android/mms/service/DownloadRequest.java +++ b/src/com/android/mms/service/DownloadRequest.java @@ -298,10 +298,12 @@ public class DownloadRequest extends MmsRequest { if (mCarrierMessagingServiceWrapper.bindToCarrierMessagingService( context, carrierMessagingServicePackage, Runnable::run, ()->onServiceReady())) { - LogUtil.v("bindService() for carrier messaging service succeeded. " + LogUtil.v("bindService() for carrier messaging service: " + + carrierMessagingServicePackage + " succeeded. " + MmsService.formatCrossStackMessageId(mMessageId)); } else { - LogUtil.e("bindService() for carrier messaging service failed. " + LogUtil.e("bindService() for carrier messaging service: " + + carrierMessagingServicePackage + " failed. " + MmsService.formatCrossStackMessageId(mMessageId)); carrierDownloadCallback.onDownloadMmsComplete( CarrierMessagingService.DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK); diff --git a/src/com/android/mms/service/MmsConstants.java b/src/com/android/mms/service/MmsConstants.java new file mode 100644 index 0000000..57ef5df --- /dev/null +++ b/src/com/android/mms/service/MmsConstants.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.mms.service; + +import java.util.UUID; + +public class MmsConstants { + // MMS anomaly uuid + public static final UUID MMS_ANOMALY_UUID = UUID.fromString( + "e4330975-17be-43b7-87d6-d9f281d33278"); +} diff --git a/src/com/android/mms/service/MmsNetworkManager.java b/src/com/android/mms/service/MmsNetworkManager.java index 52feb77..f21e510 100644 --- a/src/com/android/mms/service/MmsNetworkManager.java +++ b/src/com/android/mms/service/MmsNetworkManager.java @@ -96,7 +96,7 @@ public class MmsNetworkManager { private final Dependencies mDeps; - private int mNetworkReleaseTimeoutMillis = (5 * 1000); + private int mNetworkReleaseTimeoutMillis; private EventHandler mEventHandler; private final class EventHandler extends Handler { @@ -192,10 +192,6 @@ public class MmsNetworkManager { (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); final PersistableBundle config = configManager.getConfigForSubId(mSubId); - if (config == null) { - LogUtil.e("MmsNetworkManager: handleCarrierConfigChanged() config is null"); - return; - } mNetworkReleaseTimeoutMillis = config.getInt(CarrierConfigManager.KEY_MMS_NETWORK_RELEASE_TIMEOUT_MILLIS_INT); LogUtil.d("MmsNetworkManager: handleCarrierConfigChanged() mNetworkReleaseTimeoutMillis " diff --git a/src/com/android/mms/service/MmsRequest.java b/src/com/android/mms/service/MmsRequest.java index 32e4c6e..dca77df 100644 --- a/src/com/android/mms/service/MmsRequest.java +++ b/src/com/android/mms/service/MmsRequest.java @@ -50,8 +50,6 @@ 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"); 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 @@ -325,8 +323,9 @@ public abstract class MmsRequest { private UUID generateUUID(int result, int httpStatusCode) { long lresult = result; long lhttpStatusCode = httpStatusCode; - return new UUID(mAnomalyUUID.getMostSignificantBits(), - mAnomalyUUID.getLeastSignificantBits() + ((lhttpStatusCode << 32) + lresult)); + return new UUID(MmsConstants.MMS_ANOMALY_UUID.getMostSignificantBits(), + MmsConstants.MMS_ANOMALY_UUID.getLeastSignificantBits() + + ((lhttpStatusCode << 32) + lresult)); } private boolean isPoorSignal() { diff --git a/src/com/android/mms/service/MmsService.java b/src/com/android/mms/service/MmsService.java index 2f3b3aa..ee88f09 100644 --- a/src/com/android/mms/service/MmsService.java +++ b/src/com/android/mms/service/MmsService.java @@ -41,6 +41,7 @@ import android.provider.Settings; import android.provider.Telephony; import android.security.NetworkSecurityPolicy; import android.service.carrier.CarrierMessagingService; +import android.telephony.AnomalyReporter; import android.telephony.SmsManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -183,6 +184,8 @@ public class MmsService extends Service implements MmsRequest.RequestManager { List<String> carrierPackages = telephonyManager.getCarrierPackageNamesForIntent(intent); if (carrierPackages == null || carrierPackages.size() != 1) { + LogUtil.d("getCarrierMessagingServicePackageIfExists - multiple (" + + carrierPackages.size() + ") carrier apps installed, not using any."); return null; } else { return carrierPackages.get(0); @@ -264,8 +267,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager { getCarrierMessagingServicePackageIfExists(subId); if (carrierMessagingServicePackage != null) { - LogUtil.d(request.toString(), "sending message by carrier app " - + formatCrossStackMessageId(messageId)); + LogUtil.d(request.toString(), "sending message by carrier app: " + + carrierMessagingServicePackage + + " " + formatCrossStackMessageId(messageId)); request.trySendingByCarrierApp(MmsService.this, carrierMessagingServicePackage); return; } @@ -362,8 +366,9 @@ public class MmsService extends Service implements MmsRequest.RequestManager { getCarrierMessagingServicePackageIfExists(subId); if (carrierMessagingServicePackage != null) { - LogUtil.d(request.toString(), "downloading message by carrier app " - + formatCrossStackMessageId(messageId)); + LogUtil.d(request.toString(), "downloading message by carrier app: " + + carrierMessagingServicePackage + + " " + formatCrossStackMessageId(messageId)); request.tryDownloadingByCarrierApp(MmsService.this, carrierMessagingServicePackage); return; } @@ -596,6 +601,8 @@ public class MmsService extends Service implements MmsRequest.RequestManager { MmsStats mmsStats) { sendErrorInPendingIntent(pendingIntent, resultCode); mmsStats.addAtomToStorage(resultCode); + String message = "MMS failed" + " with error " + resultCode; + AnomalyReporter.reportAnomaly(MmsConstants.MMS_ANOMALY_UUID, message); } }; diff --git a/src/com/android/mms/service/SendRequest.java b/src/com/android/mms/service/SendRequest.java index 7e078a6..4f97d84 100644 --- a/src/com/android/mms/service/SendRequest.java +++ b/src/com/android/mms/service/SendRequest.java @@ -25,11 +25,13 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Binder; import android.os.Bundle; +import android.os.UserHandle; import android.provider.BlockedNumberContract; import android.provider.Telephony; import android.service.carrier.CarrierMessagingService; import android.service.carrier.CarrierMessagingServiceWrapper; import android.telephony.SmsManager; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -174,10 +176,22 @@ public class SendRequest extends MmsRequest { @Override protected Uri persistIfRequired(Context context, int result, byte[] response) { final String requestId = getRequestId(); - if (!SmsApplication.shouldWriteMessageForPackage(mCreator, context)) { - // Not required to persist + + SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class); + UserHandle userHandle = null; + long identity = Binder.clearCallingIdentity(); + try { + if ((subManager != null) && (subManager.isActiveSubscriptionId(mSubId))) { + userHandle = subManager.getSubscriptionUserHandle(mSubId); + } + } finally { + Binder.restoreCallingIdentity(identity); + } + + if (!SmsApplication.shouldWriteMessageForPackageAsUser(mCreator, context, userHandle)) { return null; } + LogUtil.d(requestId, "persistIfRequired. " + MmsService.formatCrossStackMessageId(mMessageId)); if (mPduData == null) { @@ -185,7 +199,7 @@ public class SendRequest extends MmsRequest { + MmsService.formatCrossStackMessageId(mMessageId)); return null; } - final long identity = Binder.clearCallingIdentity(); + identity = Binder.clearCallingIdentity(); try { final boolean supportContentDisposition = mMmsConfig.getBoolean(SmsManager.MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION); @@ -419,10 +433,12 @@ public class SendRequest extends MmsRequest { if (mCarrierMessagingServiceWrapper.bindToCarrierMessagingService( context, carrierMessagingServicePackage, Runnable::run, () -> onServiceReady())) { - LogUtil.v("bindService() for carrier messaging service succeeded. " + LogUtil.v("bindService() for carrier messaging service: " + + carrierMessagingServicePackage + " succeeded. " + MmsService.formatCrossStackMessageId(mMessageId)); } else { - LogUtil.e("bindService() for carrier messaging service failed. " + LogUtil.e("bindService() for carrier messaging service: " + + carrierMessagingServicePackage + " failed. " + MmsService.formatCrossStackMessageId(mMessageId)); carrierSendCompleteCallback.onSendMmsComplete( CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK, diff --git a/src/com/android/mms/service/metrics/MmsMetricsCollector.java b/src/com/android/mms/service/metrics/MmsMetricsCollector.java index f20d61a..8da61ba 100644 --- a/src/com/android/mms/service/metrics/MmsMetricsCollector.java +++ b/src/com/android/mms/service/metrics/MmsMetricsCollector.java @@ -90,7 +90,8 @@ public class MmsMetricsCollector implements StatsManager.StatsPullAtomCallback { mms.getAvgIntervalMillis(), mms.getMmsCount(), mms.getRetryId(), - mms.getHandledByCarrierApp()); + mms.getHandledByCarrierApp(), + mms.getIsManagedProfile()); } private static StatsEvent buildStatsEvent(OutgoingMms mms) { @@ -107,7 +108,8 @@ public class MmsMetricsCollector implements StatsManager.StatsPullAtomCallback { mms.getMmsCount(), mms.getIsFromDefaultApp(), mms.getRetryId(), - mms.getHandledByCarrierApp()); + mms.getHandledByCarrierApp(), + mms.getIsManagedProfile()); } @Override diff --git a/src/com/android/mms/service/metrics/MmsStats.java b/src/com/android/mms/service/metrics/MmsStats.java index 26e8967..7e98b0b 100644 --- a/src/com/android/mms/service/metrics/MmsStats.java +++ b/src/com/android/mms/service/metrics/MmsStats.java @@ -25,6 +25,8 @@ import android.app.Activity; import android.content.Context; import android.os.Binder; import android.os.SystemClock; +import android.os.UserHandle; +import android.os.UserManager; import android.telephony.ServiceState; import android.telephony.SmsManager; import android.telephony.SubscriptionInfo; @@ -100,6 +102,7 @@ public class MmsStats { .setMmsCount(1) .setRetryId(retryId) .setHandledByCarrierApp(handledByCarrierApp) + .setIsManagedProfile(isManagedProfile()) .build(); mPersistMmsAtomsStorage.addIncomingMms(incomingMms); } @@ -119,10 +122,21 @@ public class MmsStats { .setIsFromDefaultApp(isDefaultMmsApp()) .setRetryId(retryId) .setHandledByCarrierApp(handledByCarrierApp) + .setIsManagedProfile(isManagedProfile()) .build(); mPersistMmsAtomsStorage.addOutgoingMms(outgoingMms); } + /** @return {@code true} if this SIM is dedicated to work profile */ + private boolean isManagedProfile() { + SubscriptionManager subManager = mContext.getSystemService(SubscriptionManager.class); + if (subManager == null || !subManager.isActiveSubscriptionId(mSubId)) return false; + UserHandle userHandle = subManager.getSubscriptionUserHandle(mSubId); + UserManager userManager = mContext.getSystemService(UserManager.class); + if (userHandle == null || userManager == null) return false; + return userManager.isManagedProfile(userHandle.getIdentifier()); + } + /** Returns data network type of current subscription. */ private int getDataNetworkType() { return mTelephonyManager.getDataNetworkType(); @@ -199,7 +213,12 @@ public class MmsStats { /** Returns if the MMS was originated from the default MMS application. */ private boolean isDefaultMmsApp() { - return SmsApplication.isDefaultMmsApplication(mContext, mCallingPkg); + UserHandle userHandle = null; + SubscriptionManager subManager = mContext.getSystemService(SubscriptionManager.class); + if ((subManager != null) && (subManager.isActiveSubscriptionId(mSubId))) { + userHandle = subManager.getSubscriptionUserHandle(mSubId); + } + return SmsApplication.isDefaultMmsApplicationAsUser(mContext, mCallingPkg, userHandle); } /** @@ -210,4 +229,4 @@ public class MmsStats { private long getInterval() { return (SystemClock.elapsedRealtime() - mTimestamp); } -}
\ No newline at end of file +} diff --git a/tests/unittests/src/com/android/mms/service/metrics/MmsStatsTest.java b/tests/unittests/src/com/android/mms/service/metrics/MmsStatsTest.java index f176b6b..2b2cae5 100644 --- a/tests/unittests/src/com/android/mms/service/metrics/MmsStatsTest.java +++ b/tests/unittests/src/com/android/mms/service/metrics/MmsStatsTest.java @@ -22,7 +22,9 @@ import static com.android.mms.MmsStatsLog.OUTGOING_MMS__RESULT__MMS_RESULT_SUCCE import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -38,6 +40,7 @@ import com.android.mms.OutgoingMms; import org.junit.After; import org.junit.Before; import org.junit.Test; + import org.mockito.ArgumentCaptor; public class MmsStatsTest { @@ -45,12 +48,17 @@ public class MmsStatsTest { private Context mContext; private PersistMmsAtomsStorage mPersistMmsAtomsStorage; private TelephonyManager mTelephonyManager; + private SubscriptionManager mSubscriptionManager; @Before public void setUp() { mContext = mock(Context.class); mPersistMmsAtomsStorage = mock(PersistMmsAtomsStorage.class); mTelephonyManager = mock(TelephonyManager.class); + mSubscriptionManager = mock(SubscriptionManager.class); + + doReturn(mSubscriptionManager).when(mContext).getSystemService( + Context.TELEPHONY_SUBSCRIPTION_SERVICE); } @After @@ -83,6 +91,7 @@ public class MmsStatsTest { assertThat(incomingMms.getMmsCount()).isEqualTo(1); assertThat(incomingMms.getRetryId()).isEqualTo(0); assertThat(incomingMms.getHandledByCarrierApp()).isEqualTo(false); + assertThat(incomingMms.getIsManagedProfile()).isEqualTo(false); verifyNoMoreInteractions(mPersistMmsAtomsStorage); } @@ -110,6 +119,7 @@ public class MmsStatsTest { assertThat(outgoingMms.getRetryId()).isEqualTo(0); assertThat(outgoingMms.getHandledByCarrierApp()).isEqualTo(false); assertThat(outgoingMms.getIsFromDefaultApp()).isEqualTo(false); + assertThat(outgoingMms.getIsManagedProfile()).isEqualTo(false); verifyNoMoreInteractions(mPersistMmsAtomsStorage); } @@ -126,4 +136,19 @@ public class MmsStatsTest { IncomingMms incomingMms = incomingMmsCaptor.getValue(); assertThat(incomingMms.getRoaming()).isEqualTo(ServiceState.ROAMING_TYPE_NOT_ROAMING); } + + + @Test + public void isDefaultMmsApp_subId_inactive() { + int inactiveSubId = 123; + doReturn(false).when(mSubscriptionManager) + .isActiveSubscriptionId(eq(inactiveSubId)); + + MmsStats mmsStats = new MmsStats(mContext, mPersistMmsAtomsStorage, inactiveSubId, + mTelephonyManager, null, false); + mmsStats.addAtomToStorage(Activity.RESULT_OK); + + // getSubscriptionUserHandle should not be called if subID is inactive. + verify(mSubscriptionManager, never()).getSubscriptionUserHandle(eq(inactiveSubId)); + } }
\ No newline at end of file |