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

Commit b671d95c authored by Grant Menke's avatar Grant Menke
Browse files

Ensure AppLabelProxy is multiuser aware.

This CL ensures that AppLabelProxy is multiuser aware by removing the dependency on a singular passed in package manager. Instead the correctly associated userHandle is passed in and the correct context is derived from that. Then the correct package manager is derived from that context.

Bug: 321817633
Flag: com.android.server.telecom.flags.telecom_app_label_proxy_hsum_aware
Test: PhoneAccountRegistrarTest + CallScreeningServiceFilterTest
Change-Id: I610efe388c6ad5d98f57770d22c0b5a0fd717a4b
parent 9b314bc9
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -24,3 +24,15 @@ flag {
        purpose: PURPOSE_BUGFIX
      }
}

# OWNER=grantmenke TARGET=25Q2
flag {
    name: "telecom_app_label_proxy_hsum_aware"
    is_exported: true
    namespace: "telecom"
    description: "Support HSUM mode by ensuring AppLableProxy is multiuser aware."
    bug: "321817633"
    metadata {
        purpose: PURPOSE_BUGFIX
      }
}
 No newline at end of file
+29 −7
Original line number Diff line number Diff line
@@ -16,8 +16,11 @@

package com.android.server.telecom;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import com.android.server.telecom.flags.FeatureFlags;
import android.os.UserHandle;
import android.telecom.Log;

/**
@@ -30,15 +33,34 @@ public interface AppLabelProxy {
    class Util {
        /**
         * Default impl of getAppLabel.
         * @param pm PackageManager instance
         * @param context Context instance that is not necessarily associated with the correct user.
         * @param userHandle UserHandle instance of the user that is associated with the app.
         * @param packageName package name to look up.
         */
        public static CharSequence getAppLabel(PackageManager pm, String packageName) {
        public static CharSequence getAppLabel(Context context, UserHandle userHandle,
                String packageName, FeatureFlags featureFlags) {
            try {
                if (featureFlags.telecomAppLabelProxyHsumAware()){
                    Context userContext = context.createContextAsUser(userHandle, 0 /* flags */);
                    PackageManager userPackageManager = userContext.getPackageManager();
                    if (userPackageManager == null) {
                        Log.w(LOG_TAG, "Could not determine app label since PackageManager is "
                                + "null. Package name is %s", packageName);
                        return null;
                    }
                    ApplicationInfo info = userPackageManager.getApplicationInfo(packageName, 0);
                    CharSequence result = userPackageManager.getApplicationLabel(info);
                    Log.i(LOG_TAG, "package %s: name is %s for user = %s", packageName, result,
                            userHandle.toString());
                    return result;
                } else {
                    // Legacy code path:
                    PackageManager pm = context.getPackageManager();
                    ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
                    CharSequence result = pm.getApplicationLabel(info);
                    Log.i(LOG_TAG, "package %s: name is %s", packageName, result);
                    return result;
                }
            } catch (PackageManager.NameNotFoundException nnfe) {
                Log.w(LOG_TAG, "Could not determine app label. Package name is %s", packageName);
            }
@@ -47,5 +69,5 @@ public interface AppLabelProxy {
        }
    }

    CharSequence getAppLabel(String packageName);
    CharSequence getAppLabel(String packageName, UserHandle userHandle);
}
+5 −5
Original line number Diff line number Diff line
@@ -939,8 +939,8 @@ public class CallsManager extends Call.ListenerBase
        String defaultDialerPackageName = telecomManager.getDefaultDialerPackage(userHandle);
        String userChosenPackageName = getRoleManagerAdapter().
                getDefaultCallScreeningApp(userHandle);
        AppLabelProxy appLabelProxy = packageName -> AppLabelProxy.Util.getAppLabel(
                mContext.getPackageManager(), packageName);
        AppLabelProxy appLabelProxy = (packageName, user) -> AppLabelProxy.Util.getAppLabel(
                mContext, user, packageName, mFeatureFlags);
        ParcelableCallUtils.Converter converter = new ParcelableCallUtils.Converter();

        IncomingCallFilterGraph graph = mIncomingCallFilterGraphProvider.createGraph(incomingCall,
@@ -2592,8 +2592,8 @@ public class CallsManager extends Call.ListenerBase
                theCall,
                new AppLabelProxy() {
                    @Override
                    public CharSequence getAppLabel(String packageName) {
                        return Util.getAppLabel(mContext.getPackageManager(), packageName);
                    public CharSequence getAppLabel(String packageName, UserHandle userHandle) {
                        return Util.getAppLabel(mContext, userHandle, packageName, mFeatureFlags);
                    }
                }).process();
        future.thenApply( v -> {
@@ -3214,7 +3214,7 @@ public class CallsManager extends Call.ListenerBase
        }

        CharSequence requestingAppName = AppLabelProxy.Util.getAppLabel(
                mContext.getPackageManager(), requestingPackageName);
                mContext, call.getAssociatedUser(), requestingPackageName, mFeatureFlags);
        if (requestingAppName == null) {
            requestingAppName = requestingPackageName;
        }
+4 −1
Original line number Diff line number Diff line
@@ -1326,7 +1326,10 @@ public class PhoneAccountRegistrar {

            // Ensure name is correct.
            CharSequence newLabel = mAppLabelProxy.getAppLabel(
                    account.getAccountHandle().getComponentName().getPackageName());
                    account.getAccountHandle().getComponentName().getPackageName(),
                    UserUtil.getAssociatedUserForCall(
                            mTelecomFeatureFlags.associatedUserRefactorForWorkProfile(),
                            this, UserHandle.CURRENT, account.getAccountHandle()));

            account = account.toBuilder()
                    .setLabel(newLabel)
+4 −4
Original line number Diff line number Diff line
@@ -245,8 +245,8 @@ public class TelecomSystem {
        // Wrap this in a try block to ensure session cleanup occurs in the case of error.
        try {
            mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext, mLock, defaultDialerCache,
                    packageName -> AppLabelProxy.Util.getAppLabel(
                            mContext.getPackageManager(), packageName), null, mFeatureFlags);
                    (packageName, userHandle) -> AppLabelProxy.Util.getAppLabel(mContext,
                            userHandle, packageName, mFeatureFlags), null, mFeatureFlags);

            mContactsAsyncHelper = contactsAsyncHelperFactory.create(
                    new ContactsAsyncHelper.ContentResolverAdapter() {
@@ -386,8 +386,8 @@ public class TelecomSystem {

            CallStreamingNotification callStreamingNotification =
                    new CallStreamingNotification(mContext,
                            packageName -> AppLabelProxy.Util.getAppLabel(
                                    mContext.getPackageManager(), packageName), asyncTaskExecutor);
                            (packageName, userHandle) -> AppLabelProxy.Util.getAppLabel(mContext,
                                    userHandle, packageName, mFeatureFlags), asyncTaskExecutor);

            mCallsManager = new CallsManager(
                    mContext,
Loading