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

Commit 54b97fbf authored by Nathan Harold's avatar Nathan Harold
Browse files

Async Initialize CarrierPrivilegesTracker

Create a separate HandlerThread to offload the heavyweight
initialization required for CarrierPrivilegesTracker. Push
all async events to that thread until the init is done, then
process the events in-order and turn down the thread so that
there isn't another unnecessary thread hanging around once
the heavy work is done.

Bug: 357096337
Test: atest CarrierPrivilegesTrackerTest
Flag: async_init_carrier_privileges_tracker
Change-Id: Idba6bc2191183568ad5fb3fd96e4219ea5ddfd99
parent 57acd348
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ aconfig_declarations {
        "subscription.aconfig",
        "uicc.aconfig",
        "satellite.aconfig",
        "iwlan.aconfig"
        "iwlan.aconfig",
        "carrier.aconfig",
    ],
}

flags/carrier.aconfig

0 → 100644
+11 −0
Original line number Diff line number Diff line
package: "com.android.internal.telephony.flags"
container: "system"

# OWNER=nharold TARGET=24Q4
flag {
    name: "async_init_carrier_privileges_tracker"
    is_exported: true
    namespace: "telephony"
    description: "Offload the heavyweight initialization of CarrierPrivilegesTracker to a worker thread"
    bug:"357096337"
}
+68 −12
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.content.pm.UserInfo;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
@@ -177,6 +178,8 @@ public class CarrierPrivilegesTracker extends Handler {
    private static final int ACTION_SET_TEST_OVERRIDE_CARRIER_SERVICE_PACKAGE = 11;

    private final Context mContext;
    @NonNull
    private final FeatureFlags mFeatureFlags;
    private final Phone mPhone;
    private final PackageManager mPackageManager;
    private final UserManager mUserManager;
@@ -224,8 +227,7 @@ public class CarrierPrivilegesTracker extends Handler {
            "mPrivilegedPackageInfoLock.writeLock()"})
    private boolean mSimIsReadyButNotLoaded = false;

    @NonNull
    private final FeatureFlags mFeatureFlags;
    private volatile Handler mCurrentHandler;

    /** Small snapshot to hold package names and UIDs of privileged packages. */
    private static final class PrivilegedPackageInfo {
@@ -301,7 +303,9 @@ public class CarrierPrivilegesTracker extends Handler {
                                return;
                            }

                            sendMessage(obtainMessage(ACTION_SIM_STATE_UPDATED, slotId, simState));
                            mCurrentHandler.sendMessage(
                                    mCurrentHandler.obtainMessage(
                                            ACTION_SIM_STATE_UPDATED, slotId, simState));
                            break;
                        }
                        case Intent.ACTION_PACKAGE_ADDED: // fall through
@@ -333,19 +337,21 @@ public class CarrierPrivilegesTracker extends Handler {
                                    ? ACTION_PACKAGE_REMOVED_OR_DISABLED_BY_USER
                                    : ACTION_PACKAGE_ADDED_REPLACED_OR_CHANGED;

                            sendMessage(obtainMessage(what, pkgName));
                            mCurrentHandler.sendMessage(
                                    mCurrentHandler.obtainMessage(what, pkgName));
                            break;
                        }
                    }
                }
            };

    public CarrierPrivilegesTracker(@NonNull Looper looper, @NonNull Phone phone,
            @NonNull Context context, @NonNull FeatureFlags flags) {
    public CarrierPrivilegesTracker(
            @NonNull Looper looper, @NonNull Phone phone,
            @NonNull Context context, @NonNull FeatureFlags featureFlags) {
        super(looper);
        mContext = context;
        mFeatureFlags = flags;
        mPhone = phone;
        mContext = context;
        mFeatureFlags = featureFlags;
        mPackageManager = mContext.getPackageManager();
        mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
        mCarrierConfigManager =
@@ -361,6 +367,56 @@ public class CarrierPrivilegesTracker extends Handler {
                (TelephonyRegistryManager)
                        mContext.getSystemService(Context.TELEPHONY_REGISTRY_SERVICE);

        if (mFeatureFlags.asyncInitCarrierPrivilegesTracker()) {
            final Object localLock = new Object();
            HandlerThread initializerThread =
                    new HandlerThread("CarrierPrivilegesTracker Initializer") {
                        @Override
                        protected void onLooperPrepared() {
                            synchronized (localLock) {
                                localLock.notifyAll();
                            }
                        }
                    };
            synchronized (localLock) {
                initializerThread.start();
                while (true) {
                    try {
                        localLock.wait();
                        break;
                    } catch (InterruptedException ie) {
                    }
                }
            }
            mCurrentHandler = new Handler(initializerThread.getLooper()) {
                @Override
                public void handleMessage(Message msg) {
                    switch(msg.what) {
                        case ACTION_INITIALIZE_TRACKER:
                            handleInitializeTracker();
                            if (!hasMessagesOrCallbacks()) {
                                mCurrentHandler = CarrierPrivilegesTracker.this;
                                initializerThread.quitSafely();
                            }
                            break;
                        default:
                            Message m = CarrierPrivilegesTracker.this.obtainMessage();
                            m.copyFrom(msg);
                            m.sendToTarget();
                            if (!hasMessagesOrCallbacks()) {
                                mCurrentHandler = CarrierPrivilegesTracker.this;
                                initializerThread.quitSafely();
                            }
                            break;
                    }
                }
            };
        } else {
            mCurrentHandler = this;
        }

        mCurrentHandler.sendMessage(obtainMessage(ACTION_INITIALIZE_TRACKER));

        IntentFilter certFilter = new IntentFilter();
        certFilter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED);
        certFilter.addAction(TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED);
@@ -389,7 +445,6 @@ public class CarrierPrivilegesTracker extends Handler {
            mContext.registerReceiver(mIntentReceiver, packageFilter);
        }

        sendMessage(obtainMessage(ACTION_INITIALIZE_TRACKER));
    }

    @Override
@@ -497,7 +552,7 @@ public class CarrierPrivilegesTracker extends Handler {
                    && mClearUiccRulesUptimeMillis == CLEAR_UICC_RULE_NOT_SCHEDULED) {
                mClearUiccRulesUptimeMillis =
                        SystemClock.uptimeMillis() + CLEAR_UICC_RULES_DELAY_MILLIS;
                sendMessageAtTime(obtainMessage(ACTION_CLEAR_UICC_RULES),
                mCurrentHandler.sendMessageAtTime(obtainMessage(ACTION_CLEAR_UICC_RULES),
                        mClearUiccRulesUptimeMillis);
                mLocalLog.log("SIM is gone, simState=" + TelephonyManager.simStateToString(simState)
                        + ". Delay " + TimeUnit.MILLISECONDS.toSeconds(
@@ -920,7 +975,8 @@ public class CarrierPrivilegesTracker extends Handler {
     * @see TelephonyManager#setCarrierTestOverride
     */
    public void setTestOverrideCarrierPrivilegeRules(@Nullable String carrierPrivilegeRules) {
        sendMessage(obtainMessage(ACTION_SET_TEST_OVERRIDE_RULE, carrierPrivilegeRules));
        mCurrentHandler.sendMessage(
                obtainMessage(ACTION_SET_TEST_OVERRIDE_RULE, carrierPrivilegeRules));
    }

    /**
@@ -936,7 +992,7 @@ public class CarrierPrivilegesTracker extends Handler {
     * @see TelephonyManager#setCarrierServicePackageOverride
     */
    public void setTestOverrideCarrierServicePackage(@Nullable String carrierServicePackage) {
        sendMessage(obtainMessage(
        mCurrentHandler.sendMessage(obtainMessage(
                ACTION_SET_TEST_OVERRIDE_CARRIER_SERVICE_PACKAGE, carrierServicePackage));
    }

+2 −2
Original line number Diff line number Diff line
@@ -391,8 +391,8 @@ public class GsmCdmaPhone extends Phone {

        mCarrierResolver = mTelephonyComponentFactory.inject(CarrierResolver.class.getName())
                .makeCarrierResolver(this, featureFlags);
        mCarrierPrivilegesTracker = new CarrierPrivilegesTracker(Looper.myLooper(), this, context,
                featureFlags);
        mCarrierPrivilegesTracker = new CarrierPrivilegesTracker(
                Looper.myLooper(), this, context, featureFlags);

        getCarrierActionAgent().registerForCarrierAction(
                CarrierActionAgent.CARRIER_ACTION_SET_METERED_APNS_ENABLED, this,
+3 −2
Original line number Diff line number Diff line
@@ -220,8 +220,9 @@ public class CarrierPrivilegesTrackerTest extends TelephonyTest {
        // Capture CarrierConfigChangeListener to emulate the carrier config change notification
        ArgumentCaptor<CarrierConfigManager.CarrierConfigChangeListener> listenerArgumentCaptor =
                ArgumentCaptor.forClass(CarrierConfigManager.CarrierConfigChangeListener.class);
        CarrierPrivilegesTracker cpt = new CarrierPrivilegesTracker(mTestableLooper.getLooper(),
                mPhone, mContext, mFeatureFlags);
        CarrierPrivilegesTracker cpt =
                new CarrierPrivilegesTracker(
                        mTestableLooper.getLooper(), mPhone, mContext, mFeatureFlags);
        verify(mCarrierConfigManager).registerCarrierConfigChangeListener(any(),
                listenerArgumentCaptor.capture());
        mCarrierConfigChangeListener = listenerArgumentCaptor.getAllValues().get(0);