Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d5ccca5 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 12327203 from 8d18e6f7 to 24Q4-release

Change-Id: I847eab939b477b7602a3ee1061ffb43202a4c6ed
parents 76e1412c 8d18e6f7
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2,6 +2,13 @@ package: "com.android.server.telecom.flags"
container: "system"

# OWNER=tjstuart TARGET=24Q3
flag {
  name: "prevent_redundant_location_permission_grant_and_revoke"
  namespace: "telecom"
  description: "avoid redundant action of grant and revoke location permission for multiple emergency calls"
  bug: "345386002"
}

flag {
  name: "transactional_cs_verifier"
  namespace: "telecom"
+9 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.telecom.Log;
import android.telecom.PhoneAccountHandle;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.telecom.flags.FeatureFlags;

/**
 * Helps with emergency calls by:
@@ -51,19 +52,25 @@ public class EmergencyCallHelper {
    private long mLastEmergencyCallTimestampMillis;
    private long mLastOutgoingEmergencyCallTimestampMillis;

    private final FeatureFlags mFeatureFlags;

    @VisibleForTesting
    public EmergencyCallHelper(
            Context context,
            DefaultDialerCache defaultDialerCache,
            Timeouts.Adapter timeoutsAdapter) {
            Timeouts.Adapter timeoutsAdapter,
            FeatureFlags featureFlags) {
        mContext = context;
        mDefaultDialerCache = defaultDialerCache;
        mTimeoutsAdapter = timeoutsAdapter;
        mFeatureFlags = featureFlags;
    }

    @VisibleForTesting
    public void maybeGrantTemporaryLocationPermission(Call call, UserHandle userHandle) {
        if (shouldGrantTemporaryLocationPermission(call)) {
        if (shouldGrantTemporaryLocationPermission(call) && (
                !mFeatureFlags.preventRedundantLocationPermissionGrantAndRevoke()
                || !wasGrantedTemporaryLocationPermission())) {
            grantLocationPermission(userHandle);
        }
        if (call != null && call.isEmergencyCall()) {
+11 −3
Original line number Diff line number Diff line
@@ -1301,6 +1301,8 @@ public class InCallController extends CallsManagerListenerBase implements
    private ArraySet<String> mAllCarrierPrivilegedApps = new ArraySet<>();
    private ArraySet<String> mActiveCarrierPrivilegedApps = new ArraySet<>();

    private java.lang.Runnable mCallRemovedRunnable;

    public InCallController(Context context, TelecomSystem.SyncRoot lock, CallsManager callsManager,
            SystemStateHelper systemStateHelper, DefaultDialerCache defaultDialerCache,
            Timeouts.Adapter timeoutsAdapter, EmergencyCallHelper emergencyCallHelper,
@@ -1516,7 +1518,11 @@ public class InCallController extends CallsManagerListenerBase implements
            /** Let's add a 2 second delay before we send unbind to the services to hopefully
             *  give them enough time to process all the pending messages.
             */
            mHandler.postDelayed(new Runnable("ICC.oCR", mLock) {
            if (mCallRemovedRunnable != null
                    && mFeatureFlags.preventRedundantLocationPermissionGrantAndRevoke()) {
                mHandler.removeCallbacks(mCallRemovedRunnable);
            }
            mCallRemovedRunnable = new Runnable("ICC.oCR", mLock) {
                @Override
                public void loggedRun() {
                    // Check again to make sure there are no active calls for the associated user.
@@ -1530,7 +1536,9 @@ public class InCallController extends CallsManagerListenerBase implements
                        mEmergencyCallHelper.maybeRevokeTemporaryLocationPermission();
                    }
                }
            }.prepare(), mTimeoutsAdapter.getCallRemoveUnbindInCallServicesDelay(
            }.prepare();
            mHandler.postDelayed(mCallRemovedRunnable,
                    mTimeoutsAdapter.getCallRemoveUnbindInCallServicesDelay(
                            mContext.getContentResolver()));
        }
        call.removeListener(mCallListener);
+1 −1
Original line number Diff line number Diff line
@@ -285,7 +285,7 @@ public class TelecomSystem {
                            mContactsAsyncHelper, mLock);

            EmergencyCallHelper emergencyCallHelper = new EmergencyCallHelper(mContext,
                    defaultDialerCache, timeoutsAdapter);
                    defaultDialerCache, timeoutsAdapter, mFeatureFlags);

            InCallControllerFactory inCallControllerFactory = new InCallControllerFactory() {
                @Override
+56 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ public class EmergencyCallHelperTest extends TelecomTestCase {
    mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
    when(mContext.getPackageManager()).thenReturn(mPackageManager);
    mEmergencyCallHelper = new EmergencyCallHelper(mContext, mDefaultDialerCache,
        mTimeoutsAdapter);
        mTimeoutsAdapter, mFeatureFlags);
    when(mDefaultDialerCache.getSystemDialerApplication()).thenReturn(SYSTEM_DIALER_PACKAGE);

    //start with no perms
@@ -183,6 +183,61 @@ public class EmergencyCallHelperTest extends TelecomTestCase {
    verifyRevokeNotInvokedFor(ACCESS_FINE_LOCATION);
  }

  @SmallTest
  @Test
  public void testPermGrantAndRevokeForEmergencyCall() {

    when(mFeatureFlags.preventRedundantLocationPermissionGrantAndRevoke()).thenReturn(true);

    mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(mCall, mUserHandle);
    mEmergencyCallHelper.maybeRevokeTemporaryLocationPermission();

    //permissions should be granted then revoked
    verifyGrantInvokedFor(ACCESS_BACKGROUND_LOCATION);
    verifyGrantInvokedFor(ACCESS_FINE_LOCATION);
    verifyRevokeInvokedFor(ACCESS_BACKGROUND_LOCATION);
    verifyRevokeInvokedFor(ACCESS_FINE_LOCATION);
  }

  @SmallTest
  @Test
  public void testPermGrantAndRevokeForMultiEmergencyCall() {

    when(mFeatureFlags.preventRedundantLocationPermissionGrantAndRevoke()).thenReturn(true);

    //first call is emergency call
    mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(mCall, mUserHandle);
    //second call is emergency call
    mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(mCall, mUserHandle);
    mEmergencyCallHelper.maybeRevokeTemporaryLocationPermission();

    //permissions should be granted then revoked
    verifyGrantInvokedFor(ACCESS_BACKGROUND_LOCATION);
    verifyGrantInvokedFor(ACCESS_FINE_LOCATION);
    verifyRevokeInvokedFor(ACCESS_BACKGROUND_LOCATION);
    verifyRevokeInvokedFor(ACCESS_FINE_LOCATION);
  }

  @SmallTest
  @Test
  public void testPermGrantAndRevokeForEmergencyCallAndNormalCall() {

    when(mFeatureFlags.preventRedundantLocationPermissionGrantAndRevoke()).thenReturn(true);

    //first call is emergency call
    mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(mCall, mUserHandle);
    //second call is normal call
    when(mCall.isEmergencyCall()).thenReturn(false);
    mEmergencyCallHelper.maybeGrantTemporaryLocationPermission(mCall, mUserHandle);
    mEmergencyCallHelper.maybeRevokeTemporaryLocationPermission();

    //permissions should be granted then revoked
    verifyGrantInvokedFor(ACCESS_BACKGROUND_LOCATION);
    verifyGrantInvokedFor(ACCESS_FINE_LOCATION);
    verifyRevokeInvokedFor(ACCESS_BACKGROUND_LOCATION);
    verifyRevokeInvokedFor(ACCESS_FINE_LOCATION);
  }

  @SmallTest
  @Test
  public void testNoPermGrantForNonEmergencyCall() {
Loading