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

Commit dd7471f3 authored by Fengjiang Li's avatar Fengjiang Li Committed by Android (Google) Code Review
Browse files

Merge "[Launcher Jank] Improve SimpleBroadcastReceiver.java" into main

parents 01b57743 b87ad6f9
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -83,10 +83,8 @@ public final class WellbeingModel implements SafeCloseable {

    private final Handler mWorkerHandler;
    private final ContentObserver mContentObserver;
    private final SimpleBroadcastReceiver mWellbeingAppChangeReceiver =
            new SimpleBroadcastReceiver(t -> restartObserver());
    private final SimpleBroadcastReceiver mAppAddRemoveReceiver =
            new SimpleBroadcastReceiver(this::onAppPackageChanged);
    private final SimpleBroadcastReceiver mWellbeingAppChangeReceiver;
    private final SimpleBroadcastReceiver mAppAddRemoveReceiver;

    private final Object mModelLock = new Object();
    // Maps the action Id to the corresponding RemoteAction
@@ -101,6 +99,11 @@ public final class WellbeingModel implements SafeCloseable {
        mWorkerHandler = new Handler(TextUtils.isEmpty(mWellbeingProviderPkg)
                ? Executors.UI_HELPER_EXECUTOR.getLooper()
                : Executors.getPackageExecutor(mWellbeingProviderPkg).getLooper());
        mWellbeingAppChangeReceiver =
                new SimpleBroadcastReceiver(mWorkerHandler, t -> restartObserver());
        mAppAddRemoveReceiver =
                new SimpleBroadcastReceiver(mWorkerHandler, this::onAppPackageChanged);


        mContentObserver = new ContentObserver(mWorkerHandler) {
            @Override
@@ -135,8 +138,8 @@ public final class WellbeingModel implements SafeCloseable {
    public void close() {
        if (!TextUtils.isEmpty(mWellbeingProviderPkg)) {
            mWorkerHandler.post(() -> {
                mWellbeingAppChangeReceiver.unregisterReceiverSafelySync(mContext);
                mAppAddRemoveReceiver.unregisterReceiverSafelySync(mContext);
                mWellbeingAppChangeReceiver.unregisterReceiverSafely(mContext);
                mAppAddRemoveReceiver.unregisterReceiverSafely(mContext);
                mContext.getContentResolver().unregisterContentObserver(mContentObserver);
            });
        }
+7 −10
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import android.app.PendingIntent;
import android.content.ComponentCallbacks;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.hardware.display.DisplayManager;
@@ -120,7 +119,7 @@ public class TaskbarManager {
    private final ComponentCallbacks mComponentCallbacks;

    private final SimpleBroadcastReceiver mShutdownReceiver =
            new SimpleBroadcastReceiver(i -> destroyExistingTaskbar());
            new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyExistingTaskbar());

    // The source for this provider is set when Launcher is available
    // We use 'non-destroyable' version here so the original provider won't be destroyed
@@ -157,7 +156,7 @@ public class TaskbarManager {
    private boolean mUserUnlocked = false;

    private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver =
            new SimpleBroadcastReceiver(this::showTaskbarFromBroadcast);
            new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, this::showTaskbarFromBroadcast);

    private final AllAppsActionManager mAllAppsActionManager;

@@ -306,17 +305,15 @@ public class TaskbarManager {
                .register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
        Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
        mContext.registerComponentCallbacks(mComponentCallbacks);
        mShutdownReceiver.registerAsync(mContext, Intent.ACTION_SHUTDOWN);
        mShutdownReceiver.register(mContext, Intent.ACTION_SHUTDOWN);
        UI_HELPER_EXECUTOR.execute(() -> {
            mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
                    mContext,
                    SYSTEM_ACTION_ID_TASKBAR,
                    new Intent(ACTION_SHOW_TASKBAR).setPackage(mContext.getPackageName()),
                    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
            mContext.registerReceiver(
                    mTaskbarBroadcastReceiver,
                    new IntentFilter(ACTION_SHOW_TASKBAR),
                    RECEIVER_NOT_EXPORTED);
            mTaskbarBroadcastReceiver.register(
                    mContext, RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
        });

        debugWhyTaskbarNotDestroyed("TaskbarManager created");
@@ -623,7 +620,7 @@ public class TaskbarManager {
    public void destroy() {
        debugWhyTaskbarNotDestroyed("TaskbarManager#destroy()");
        removeActivityCallbacksAndListeners();
        mTaskbarBroadcastReceiver.unregisterReceiverSafelyAsync(mContext);
        mTaskbarBroadcastReceiver.unregisterReceiverSafely(mContext);
        destroyExistingTaskbar();
        removeTaskbarRootViewFromWindow();
        if (mUserUnlocked) {
@@ -635,7 +632,7 @@ public class TaskbarManager {
                .unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
        Log.d(TASKBAR_NOT_DESTROYED_TAG, "unregistering component callbacks from destroy().");
        mContext.unregisterComponentCallbacks(mComponentCallbacks);
        mShutdownReceiver.unregisterReceiverSafelyAsync(mContext);
        mShutdownReceiver.unregisterReceiverSafely(mContext);
    }

    public @Nullable TaskbarActivityContext getCurrentActivityContext() {
+8 −6
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.content.Intent.ACTION_PACKAGE_CHANGED;
import static android.content.Intent.ACTION_PACKAGE_REMOVED;

import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED;

import android.content.ActivityNotFoundException;
@@ -55,10 +56,11 @@ import java.util.function.Consumer;
public final class OverviewComponentObserver {
    private static final String TAG = "OverviewComponentObserver";

    // We register broadcast receivers on main thread to avoid missing updates.
    private final SimpleBroadcastReceiver mUserPreferenceChangeReceiver =
            new SimpleBroadcastReceiver(this::updateOverviewTargets);
            new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets);
    private final SimpleBroadcastReceiver mOtherHomeAppUpdateReceiver =
            new SimpleBroadcastReceiver(this::updateOverviewTargets);
            new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets);

    private final Context mContext;
    private final RecentsAnimationDeviceState mDeviceState;
@@ -102,7 +104,7 @@ public final class OverviewComponentObserver {
            mConfigChangesMap.append(fallbackComponent.hashCode(), fallbackInfo.configChanges);
        } catch (PackageManager.NameNotFoundException ignored) { /* Impossible */ }

        mUserPreferenceChangeReceiver.registerAsync(mContext, ACTION_PREFERRED_ACTIVITY_CHANGED);
        mUserPreferenceChangeReceiver.register(mContext, ACTION_PREFERRED_ACTIVITY_CHANGED);
        updateOverviewTargets();
    }

@@ -191,7 +193,7 @@ public final class OverviewComponentObserver {
                unregisterOtherHomeAppUpdateReceiver();

                mUpdateRegisteredPackage = defaultHome.getPackageName();
                mOtherHomeAppUpdateReceiver.registerPkgActionsAsync(
                mOtherHomeAppUpdateReceiver.registerPkgActions(
                        mContext, mUpdateRegisteredPackage, ACTION_PACKAGE_ADDED,
                        ACTION_PACKAGE_CHANGED, ACTION_PACKAGE_REMOVED);
            }
@@ -203,13 +205,13 @@ public final class OverviewComponentObserver {
     * Clean up any registered receivers.
     */
    public void onDestroy() {
        mUserPreferenceChangeReceiver.unregisterReceiverSafelyAsync(mContext);
        mUserPreferenceChangeReceiver.unregisterReceiverSafely(mContext);
        unregisterOtherHomeAppUpdateReceiver();
    }

    private void unregisterOtherHomeAppUpdateReceiver() {
        if (mUpdateRegisteredPackage != null) {
            mOtherHomeAppUpdateReceiver.unregisterReceiverSafelyAsync(mContext);
            mOtherHomeAppUpdateReceiver.unregisterReceiverSafely(mContext);
            mUpdateRegisteredPackage = null;
        }
    }
+5 −3
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.quickstep.util;
import static android.content.Intent.ACTION_TIMEZONE_CHANGED;
import static android.content.Intent.ACTION_TIME_CHANGED;

import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -50,7 +52,7 @@ public class AsyncClockEventDelegate extends ClockEventDelegate

    private final Context mContext;
    private final SimpleBroadcastReceiver mReceiver =
            new SimpleBroadcastReceiver(this::onClockEventReceived);
            new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, this::onClockEventReceived);

    private final ArrayMap<BroadcastReceiver, Handler> mTimeEventReceivers = new ArrayMap<>();
    private final List<ContentObserver> mFormatObservers = new ArrayList<>();
@@ -62,7 +64,7 @@ public class AsyncClockEventDelegate extends ClockEventDelegate
    private AsyncClockEventDelegate(Context context) {
        super(context);
        mContext = context;
        mReceiver.registerAsync(mContext, ACTION_TIME_CHANGED, ACTION_TIMEZONE_CHANGED);
        mReceiver.register(mContext, ACTION_TIME_CHANGED, ACTION_TIMEZONE_CHANGED);
    }

    @Override
@@ -123,6 +125,6 @@ public class AsyncClockEventDelegate extends ClockEventDelegate
    public void close() {
        mDestroyed = true;
        SettingsCache.INSTANCE.get(mContext).unregister(mFormatUri, this);
        mReceiver.unregisterReceiverSafelyAsync(mContext);
        mReceiver.unregisterReceiverSafely(mContext);
    }
}
+18 −3
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import static com.android.launcher3.LauncherPrefs.ICON_STATE;
import static com.android.launcher3.LauncherPrefs.THEMED_ICONS;
import static com.android.launcher3.model.LoaderTask.SMARTSPACE_ON_HOME_SCREEN;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_BADGING_URI;
import static com.android.launcher3.util.SettingsCache.PRIVATE_SPACE_HIDE_WHEN_LOCKED_URI;

@@ -63,6 +64,9 @@ import com.android.launcher3.util.Themes;
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.widget.custom.CustomWidgetManager;

import java.util.Locale;
import java.util.Objects;

public class LauncherAppState implements SafeCloseable {

    public static final String ACTION_FORCE_ROLOAD = "force-reload-launcher";
@@ -115,14 +119,25 @@ public class LauncherAppState implements SafeCloseable {
        }

        SimpleBroadcastReceiver modelChangeReceiver =
                new SimpleBroadcastReceiver(mModel::onBroadcastIntent);
        modelChangeReceiver.registerAsync(mContext, Intent.ACTION_LOCALE_CHANGED,
                new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, mModel::onBroadcastIntent);
        final Locale oldLocale = mContext.getResources().getConfiguration().locale;
        modelChangeReceiver.register(
                mContext,
                () -> {
                    // if local has changed before receiver is registered on bg thread,
                    // mModel needs to reload.
                    Locale newLocale = mContext.getResources().getConfiguration().locale;
                    if (!Objects.equals(oldLocale, newLocale)) {
                        mModel.forceReload();
                    }
                },
                Intent.ACTION_LOCALE_CHANGED,
                ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
        if (BuildConfig.IS_STUDIO_BUILD) {
            mContext.registerReceiver(modelChangeReceiver, new IntentFilter(ACTION_FORCE_ROLOAD),
                    RECEIVER_EXPORTED);
        }
        mOnTerminateCallback.add(() -> modelChangeReceiver.unregisterReceiverSafelyAsync(mContext));
        mOnTerminateCallback.add(() -> modelChangeReceiver.unregisterReceiverSafely(mContext));

        SafeCloseable userChangeListener = UserCache.INSTANCE.get(mContext)
                .addUserEventListener(mModel::onUserEvent);
Loading