From 7b3ec7ec4fcc03f62937c191a764377801cbf0b4 Mon Sep 17 00:00:00 2001 From: joonhunshin Date: Wed, 12 Jul 2023 05:10:11 +0000 Subject: Fixed NullPointException after SRVCC completed event If IImsCallSessionListener.callSessionProgressing() is called from ImsService right after receiving SRVCC complete state event from RIL, Framework tries to access CallProfile. However, NPE was observed because CallProfile is released by SRVCC completed event. Bug: 286447293 Test: atest ImsCallTest Change-Id: I7e86d8b8190c65b757b753fab2ea4564a7fccf7c --- src/java/com/android/ims/ImsCall.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/java/com/android/ims/ImsCall.java b/src/java/com/android/ims/ImsCall.java index 29f6acd4..5fae98e2 100755 --- a/src/java/com/android/ims/ImsCall.java +++ b/src/java/com/android/ims/ImsCall.java @@ -2538,7 +2538,11 @@ public class ImsCall implements ICall { setCallProfile(updatedProfile); // Apply the new mediaProfile on top of the Call Profile so it is not ignored in // case the ImsService has not had a chance to update it yet. - mCallProfile.mMediaProfile.copyFrom(profile); + if( mCallProfile != null && mCallProfile.mMediaProfile != null) { + mCallProfile.mMediaProfile.copyFrom(profile); + } else { + logi("Call was closed already, skip updating CallProfile"); + } } if (listener != null) { -- cgit v1.2.3 From 22504ae67ac384f90b54a28ca90be0daa61ad6d6 Mon Sep 17 00:00:00 2001 From: joonhunshin Date: Wed, 2 Aug 2023 05:08:33 +0000 Subject: Fix, DeviceCapabilityListener does not try to register IMS registration callback. When IImsFeatureStatusCallback#notifyImsFeatureStatus() calls with unavailable and ready within short time, the PublishControllerImpl's handler calls DeviceCapabilityListener#onRcsConnected and #onRcsDisconnected consecutively. During this time the DeviceCapabilityListener keeps EVENT_UNREGISTER_IMS_CHANGE and EVENT_REGISTER_IMS_CONTENT_CHANGE messages in Q. When the DeviceCapabilityListener handles EVENT_UNREGISTER_IMS_CHANGE message, it removes EVENT_REGISTER_IMS_CONTENT_CHANGE from Q. By deleting EVENT_REGISTER_IMS_CONTENT_CHANGE, the DeviceCapabilityListener does not try to register the IMS registration callback. Bug: 287833083 Test: atest DeviceCapabilityListenerTest, RcsUceAdapterTest Test: AT&T and TMO live network Change-Id: I5010adfb3e1ce2880cb8f816f021c44257d9c521 --- .../android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java index b58f7ec6..bc372054 100644 --- a/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java +++ b/src/java/com/android/ims/rcs/uce/presence/publish/DeviceCapabilityListener.java @@ -343,9 +343,6 @@ public class DeviceCapabilityListener { private void unregisterImsProvisionCallback() { logd("unregisterImsProvisionCallback"); - // Clear the registering IMS callback message from the handler thread - mHandler.removeRegisterImsContentChangedMessage(); - // Unregister mmtel callback if (mImsMmTelManager != null) { try { -- cgit v1.2.3 From cf934c17f21e60b15f6baa20da589aba8c54bda6 Mon Sep 17 00:00:00 2001 From: joonhunshin Date: Fri, 13 Oct 2023 02:28:54 +0000 Subject: Throw the ImsException when registering listener failed If registering listener failed, set session closed flag to block other operations. Bug: 289461637 Bug: 304441595 Test: atest ImsManagerTest Test: received test result from partner Change-Id: I874715e2e0843427fbefe33343fbe2ab2b22dd9c --- src/java/com/android/ims/ImsManager.java | 10 ++++++++ tests/Android.bp | 2 ++ tests/src/com/android/ims/ImsManagerTest.java | 34 +++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java index b5a1168b..c9252f24 100644 --- a/src/java/com/android/ims/ImsManager.java +++ b/src/java/com/android/ims/ImsManager.java @@ -75,6 +75,7 @@ import android.util.SparseArray; import com.android.ims.internal.IImsCallSession; import com.android.ims.internal.IImsServiceFeatureCallback; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.ITelephony; import com.android.telephony.Rlog; @@ -2450,6 +2451,15 @@ public class ImsManager implements FeatureUpdates { call.attachSession(new ImsCallSession(session)); call.setListener(listener); + if (Flags.ignoreAlreadyTerminatedIncomingCallBeforeRegisteringListener()){ + // If the call session already terminated before registering callback then the + // framework should ignore incoming call. + if (!ImsCall.isSessionAlive(call.getSession())) { + loge("takeCall : ImsCallSession is not alive"); + throw new ImsException("takeCall() : ImsCallSession is not alive", + ImsReasonInfo.CODE_UNSPECIFIED); + } + } return call; } catch (Throwable t) { loge("takeCall caught: ", t); diff --git a/tests/Android.bp b/tests/Android.bp index 7ae66b56..a628946a 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -37,6 +37,8 @@ android_test { "androidx.test.ext.junit", "androidx.test.rules", "mockito-target-minus-junit4", + "telephony_flags_core_java_lib", + "flag-junit", ], test_suites: [ diff --git a/tests/src/com/android/ims/ImsManagerTest.java b/tests/src/com/android/ims/ImsManagerTest.java index ad5051be..9e206b78 100644 --- a/tests/src/com/android/ims/ImsManagerTest.java +++ b/tests/src/com/android/ims/ImsManagerTest.java @@ -23,11 +23,15 @@ import static android.telephony.ims.stub.ImsRegistrationImplBase.REGISTRATION_TE import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -38,11 +42,11 @@ import android.content.res.Resources; import android.os.IBinder; import android.os.PersistableBundle; import android.os.RemoteException; +import android.platform.test.flag.junit.SetFlagsRule; import android.telephony.BinderCacheManager; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.ims.ImsMmTelManager; -import android.telephony.ims.ImsRcsManager; import android.telephony.ims.ProvisioningManager; import android.telephony.ims.aidl.IImsConfig; import android.telephony.ims.aidl.IImsRegistration; @@ -56,20 +60,25 @@ import androidx.test.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.ims.internal.IImsCallSession; import com.android.internal.os.SomeArgs; import com.android.internal.telephony.ITelephony; +import com.android.internal.telephony.flags.Flags; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import java.util.Hashtable; -import java.util.concurrent.Executor; @RunWith(AndroidJUnit4.class) public class ImsManagerTest extends ImsTestBase { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + private static final boolean ENHANCED_4G_MODE_DEFAULT_VAL = true; private static final boolean ENHANCED_4G_MODE_EDITABLE = true; private static final boolean WFC_IMS_ENABLE_DEFAULT_VAL = false; @@ -131,6 +140,8 @@ public class ImsManagerTest extends ImsTestBase { InstrumentationRegistry.getInstrumentation().getUiAutomation() .adoptShellPermissionIdentity( "android.permission.READ_PRIVILEGED_PHONE_STATE"); + + mSetFlagsRule.initAllFlagsToReleaseConfigDefault(); } @After @@ -1020,6 +1031,25 @@ public class ImsManagerTest extends ImsTestBase { verify(mMmTelFeatureConnection).onMemoryAvailable(eq(token)); } + @Test @SmallTest + public void testTakeCall_incomingSessionTerminatedBeforeRegisterListener() + throws RemoteException { + mSetFlagsRule.enableFlags( + Flags.FLAG_IGNORE_ALREADY_TERMINATED_INCOMING_CALL_BEFORE_REGISTERING_LISTENER); + + IImsCallSession mockSession = mock(IImsCallSession.class); + doThrow(RemoteException.class).when(mockSession).setListener(any()); + ImsCall.Listener mockListener = mock(ImsCall.Listener.class); + + ImsManager imsManager = getImsManagerAndInitProvisionedValues(); + try { + imsManager.takeCall(mockSession, mockListener); + fail("expect ImsException"); + } catch (ImsException e) { + // expected result + } + } + private ImsManager getImsManagerAndInitProvisionedValues() { when(mImsConfigImplBaseMock.getConfigInt(anyInt())) .thenAnswer(invocation -> { -- cgit v1.2.3 From 9c3f809150ef1ec836601ba73e15816c924979df Mon Sep 17 00:00:00 2001 From: Shai Barack Date: Sat, 9 Mar 2024 19:37:51 +0000 Subject: Enable use of error prone annotations This is required for ag/26422309 Bug: 327646201 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:8cf3a10c33866ece91f4d6b8b4fcfcb2f15ff554) Merged-In: I57812da36aa7b1773c944971decb4afca671ba05 Change-Id: I57812da36aa7b1773c944971decb4afca671ba05 --- Android.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/Android.bp b/Android.bp index dea49d7d..82bf3698 100644 --- a/Android.bp +++ b/Android.bp @@ -44,6 +44,7 @@ java_library { ], libs: [ + "error_prone_annotations", "unsupportedappusage", // TODO b/151667108 add "framework-telephony", // TODO link to framework-minus-apex stub and framework-wifi-stubs -- cgit v1.2.3