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

Commit c80c41a8 authored by Pranav Madapurmath's avatar Pranav Madapurmath
Browse files

Resolve hidden API Context#registerReceiverAsUser

Resolves the hidden API reference on Context#registerReceiverAsUser in
Telecom. Instead, we can create a user context and use that to register
the receiver via Context#registerReceiver.

Bug: 307817089
Flag: com.android.server.telecom.flags.resolve_hidden_dependencies_two
Test: atest TelecomUnitTests
Change-Id: I03350eee87cd5a3628bc4e537d39e6dcfb390da1
parent cec70ca3
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.telecom.Log;

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

import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
@@ -48,6 +49,7 @@ public class DefaultDialerCache {
    private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
    private final ComponentName mSystemDialerComponentName;
    private final RoleManagerAdapter mRoleManagerAdapter;
    private final FeatureFlags mFeatureFlags;
    private final ConcurrentHashMap<Integer, String> mCurrentDefaultDialerPerUser =
            new ConcurrentHashMap<>();
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -115,10 +117,11 @@ public class DefaultDialerCache {
    public DefaultDialerCache(Context context,
            DefaultDialerManagerAdapter defaultDialerManagerAdapter,
            RoleManagerAdapter roleManagerAdapter,
            TelecomSystem.SyncRoot lock) {
            TelecomSystem.SyncRoot lock, FeatureFlags featureFlags) {
        mContext = context;
        mDefaultDialerManagerAdapter = defaultDialerManagerAdapter;
        mRoleManagerAdapter = roleManagerAdapter;
        mFeatureFlags = featureFlags;

        Resources resources = mContext.getResources();
        mSystemDialerComponentName = new ComponentName(resources.getString(
@@ -131,10 +134,22 @@ public class DefaultDialerCache {
        packageIntentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
        packageIntentFilter.addDataScheme("package");
        packageIntentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        context.registerReceiverAsUser(mReceiver, UserHandle.ALL, packageIntentFilter, null, null);
        Context userContext = context.createContextAsUser(UserHandle.ALL, 0);
        if (mFeatureFlags.resolveHiddenDependenciesTwo()) {
            userContext.registerReceiver(mReceiver, packageIntentFilter,
                    Context.RECEIVER_NOT_EXPORTED);
        } else {
            context.registerReceiverAsUser(mReceiver, UserHandle.ALL, packageIntentFilter, null,
                    null);
        }

        IntentFilter bootIntentFilter = new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
        if (mFeatureFlags.resolveHiddenDependenciesTwo()) {
            userContext.registerReceiver(mReceiver, bootIntentFilter,
                    Context.RECEIVER_NOT_EXPORTED);
        } else {
            context.registerReceiverAsUser(mReceiver, UserHandle.ALL, bootIntentFilter, null, null);
        }

        IntentFilter userRemovedFilter = new IntentFilter(Intent.ACTION_USER_REMOVED);
        context.registerReceiver(mUserRemovedReceiver, userRemovedFilter);
+8 −2
Original line number Diff line number Diff line
@@ -2236,9 +2236,15 @@ public class InCallController extends CallsManagerListenerBase implements

        IntentFilter packageChangedFilter = new IntentFilter(Intent.ACTION_PACKAGE_CHANGED);
        packageChangedFilter.addDataScheme("package");
        Context userContext = mContext.createContextAsUser(UserHandle.ALL, 0);
        if (mFeatureFlags.resolveHiddenDependenciesTwo()) {
            userContext.registerReceiver(mPackageChangedReceiver, packageChangedFilter,
                    null, null);
        } else {
            mContext.registerReceiverAsUser(mPackageChangedReceiver, UserHandle.ALL,
                    packageChangedFilter, null, null);
        }
    }

    private void updateNonUiInCallServices(Call call) {
        UserHandle userFromCall = getUserFromCall(call);
+17 −7
Original line number Diff line number Diff line
@@ -243,7 +243,7 @@ public class TelecomSystem {
                new DefaultDialerCache.DefaultDialerManagerAdapterImpl();

        DefaultDialerCache defaultDialerCache = new DefaultDialerCache(mContext,
                defaultDialerAdapter, roleManagerAdapter, mLock);
                defaultDialerAdapter, roleManagerAdapter, mLock, mFeatureFlags);

        Log.startSession("TS.init");
        // Wrap this in a try block to ensure session cleanup occurs in the case of error.
@@ -466,12 +466,22 @@ public class TelecomSystem {
                asyncTaskExecutor, featureFlags);
            mCallsManager.setRespondViaSmsManager(mRespondViaSmsManager);

            Context userContext = mContext.createContextAsUser(UserHandle.ALL, 0);
            if (mFeatureFlags.resolveHiddenDependenciesTwo()) {
                userContext.registerReceiver(mUserSwitchedReceiver, USER_SWITCHED_FILTER,
                        Context.RECEIVER_NOT_EXPORTED);
                userContext.registerReceiver(mUserStartingReceiver, USER_STARTING_FILTER,
                        Context.RECEIVER_NOT_EXPORTED);
                userContext.registerReceiver(mBootCompletedReceiver, BOOT_COMPLETE_FILTER,
                        Context.RECEIVER_NOT_EXPORTED);
            } else {
                mContext.registerReceiverAsUser(mUserSwitchedReceiver, UserHandle.ALL,
                    USER_SWITCHED_FILTER, null, null);
                        USER_SWITCHED_FILTER, null, null, Context.RECEIVER_NOT_EXPORTED);
                mContext.registerReceiverAsUser(mUserStartingReceiver, UserHandle.ALL,
                    USER_STARTING_FILTER, null, null);
                        USER_STARTING_FILTER, null, null, Context.RECEIVER_NOT_EXPORTED);
                mContext.registerReceiverAsUser(mBootCompletedReceiver, UserHandle.ALL,
                    BOOT_COMPLETE_FILTER, null, null);
                        BOOT_COMPLETE_FILTER, null, null, Context.RECEIVER_NOT_EXPORTED);
            }

            // Set current user explicitly since USER_SWITCHED_FILTER intent can be missed at
            // startup
+7 −0
Original line number Diff line number Diff line
@@ -417,6 +417,13 @@ public class ComponentContextFixture implements TestFixture<Context> {
            return null;
        }

        @Override
        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle handle,
                IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) {
            mBroadcastReceivers.add(receiver);
            return null;
        }

        @Override
        public void sendBroadcast(Intent intent) {
            // TODO -- need to ensure this is captured
+9 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.telecom.tests;

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.times;
@@ -67,24 +68,27 @@ public class DefaultDialerCacheTest extends TelecomTestCase {
    private DefaultDialerCache.DefaultDialerManagerAdapter mMockDefaultDialerManager;
    @Mock
    private RoleManagerAdapter mRoleManagerAdapter;
    @Mock private Context mUserContext;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();
        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
        when(mFeatureFlags.resolveHiddenDependenciesTwo()).thenReturn(true);
        when(mContext.createContextAsUser(any(UserHandle.class), anyInt()))
                .thenReturn(mUserContext);

        ArgumentCaptor<BroadcastReceiver> packageReceiverCaptor =
                ArgumentCaptor.forClass(BroadcastReceiver.class);

        mDefaultDialerCache = new DefaultDialerCache(
                mContext, mMockDefaultDialerManager, mRoleManagerAdapter,
                new TelecomSystem.SyncRoot() {
                });
                new TelecomSystem.SyncRoot() {}, mFeatureFlags);

        verify(mContext, times(2)).registerReceiverAsUser(
                packageReceiverCaptor.capture(), eq(UserHandle.ALL), any(IntentFilter.class),
                isNull(), isNull());
        verify(mUserContext, times(2)).registerReceiver(
                packageReceiverCaptor.capture(), any(IntentFilter.class),
                eq(Context.RECEIVER_NOT_EXPORTED));
        // Receive the first receiver that was captured, the package change receiver.
        mPackageChangeReceiver = packageReceiverCaptor.getAllValues().get(0);

Loading