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

Commit e8a7e97f authored by Ned Burns's avatar Ned Burns
Browse files

Manually register Dumpables to DumpManager

Dependency.get() automatically registers its managed objects to the
DumpManager if they implement Dumpable. However, if code is refactored
that removes all usages of Dependency.get() in favor of Dagger
injection, then there is no longer a guarantee that the class in
question will be registered to DumpManager (and so included in bug
reports).

Instead, remove the auto-registration feature of Dependency in favor of
manually registering all dumpables with the DumpManager.

Bug: 198713580
Test: atest
Change-Id: Ie02a44fb7da0b76bf53da874cc9eee030a1b9173
Merged-In: Ie02a44fb7da0b76bf53da874cc9eee030a1b9173
parent dc0c8db2
Loading
Loading
Loading
Loading
+0 −16
Original line number Diff line number Diff line
@@ -597,11 +597,6 @@ public class Dependency {
        if (obj == null) {
            obj = createDependency(key);
            mDependencies.put(key, obj);

            // TODO: Get dependencies to register themselves instead
            if (autoRegisterModulesForDump() && obj instanceof Dumpable) {
                mDumpManager.registerDumpable(obj.getClass().getName(), (Dumpable) obj);
            }
        }
        return obj;
    }
@@ -619,17 +614,6 @@ public class Dependency {
        return provider.createDependency();
    }

    // Currently, there are situations in tests where we might create more than one instance of a
    // thing that should be a singleton: the "real" one (created by Dagger, usually as a result of
    // inflating a view), and a mocked one (injected into Dependency). If we register the mocked
    // one, the DumpManager will throw an exception complaining (rightly) that we have too many
    // things registered with that name. So in tests, we disable the auto-registration until the
    // root cause is fixed, i.e. inflated views in tests with Dagger dependencies.
    @VisibleForTesting
    protected boolean autoRegisterModulesForDump() {
        return true;
    }

    private static Dependency sDependency;

    /**
+2 −1
Original line number Diff line number Diff line
@@ -42,7 +42,8 @@ public class ForegroundServiceController {
    private final Handler mMainHandler;

    @Inject
    public ForegroundServiceController(AppOpsController appOpsController,
    public ForegroundServiceController(
            AppOpsController appOpsController,
            @Main Handler mainHandler) {
        mMainHandler = mainHandler;
        appOpsController.addCallback(APP_OPS, (code, uid, packageName, active) -> {
+19 −5
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.internal.colorextraction.types.Tonal;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.policy.ConfigurationController;

import java.io.FileDescriptor;
@@ -50,19 +51,32 @@ public class SysuiColorExtractor extends ColorExtractor implements Dumpable,
    private final GradientColors mBackdropColors;

    @Inject
    public SysuiColorExtractor(Context context, ConfigurationController configurationController) {
        this(context, new Tonal(context), configurationController,
                context.getSystemService(WallpaperManager.class), false /* immediately */);
    public SysuiColorExtractor(
            Context context,
            ConfigurationController configurationController,
            DumpManager dumpManager) {
        this(
                context,
                new Tonal(context),
                configurationController,
                context.getSystemService(WallpaperManager.class),
                dumpManager,
                false /* immediately */);
    }

    @VisibleForTesting
    public SysuiColorExtractor(Context context, ExtractionType type,
    public SysuiColorExtractor(
            Context context,
            ExtractionType type,
            ConfigurationController configurationController,
            WallpaperManager wallpaperManager, boolean immediately) {
            WallpaperManager wallpaperManager,
            DumpManager dumpManager,
            boolean immediately) {
        super(context, type, immediately, wallpaperManager);
        mTonal = type instanceof Tonal ? (Tonal) type : new Tonal(context);
        mNeutralColorsLock = new GradientColors();
        configurationController.addCallback(this);
        dumpManager.registerDumpable(getClass().getSimpleName(), this);

        mBackdropColors = new GradientColors();
        mBackdropColors.setMainColor(Color.BLACK);
+4 −93
Original line number Diff line number Diff line
@@ -36,11 +36,8 @@ import android.os.UserHandle;
import android.view.Choreographer;
import android.view.IWindowManager;
import android.view.LayoutInflater;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.util.NotificationMessagingUtil;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -51,9 +48,7 @@ import com.android.systemui.R;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
import com.android.systemui.accessibility.ModeSwitchesController;
import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger;
import com.android.systemui.dagger.qualifiers.Background;
@@ -62,48 +57,28 @@ import com.android.systemui.doze.AlwaysOnDisplayPolicy;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.LifecycleScreenStatusProvider;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.NavigationBarA11yHelper;
import com.android.systemui.navigationbar.NavigationBarController;
import com.android.systemui.navigationbar.NavigationBarOverlayController;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.navigationbar.TaskbarDelegate;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.ReduceBrightColorsController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.theme.ThemeOverlayApplier;
import com.android.systemui.util.leak.LeakDetector;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.unfold.UnfoldTransitionFactory;
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
import com.android.systemui.unfold.config.UnfoldTransitionConfig;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import com.android.systemui.util.leak.LeakDetector;
import com.android.systemui.util.settings.SecureSettings;

import java.util.Optional;
import java.util.concurrent.Executor;

import javax.inject.Named;

import dagger.Lazy;
import dagger.Module;
import dagger.Provides;

@@ -171,9 +146,8 @@ public class DependencyProvider {
    /** */
    @Provides
    @SysUISingleton
    public LeakDetector provideLeakDetector() {
        return LeakDetector.create();

    public LeakDetector provideLeakDetector(DumpManager dumpManager) {
        return LeakDetector.create(dumpManager);
    }

    @SuppressLint("MissingPermission")
@@ -205,69 +179,6 @@ public class DependencyProvider {
                context.getString(R.string.themepicker_overlayable_package), dumpManager);
    }

    /** */
    @Provides
    @SysUISingleton
    public NavigationBarController provideNavigationBarController(Context context,
            WindowManager windowManager,
            Lazy<AssistManager> assistManagerLazy,
            AccessibilityManager accessibilityManager,
            AccessibilityManagerWrapper accessibilityManagerWrapper,
            DeviceProvisionedController deviceProvisionedController,
            MetricsLogger metricsLogger,
            OverviewProxyService overviewProxyService,
            NavigationModeController navigationModeController,
            AccessibilityButtonModeObserver accessibilityButtonModeObserver,
            StatusBarStateController statusBarStateController,
            SysUiState sysUiFlagsContainer,
            BroadcastDispatcher broadcastDispatcher,
            CommandQueue commandQueue,
            Optional<Pip> pipOptional,
            Optional<LegacySplitScreen> splitScreenOptional,
            Optional<Recents> recentsOptional,
            Lazy<Optional<StatusBar>> statusBarOptionalLazy,
            ShadeController shadeController,
            NotificationRemoteInputManager notificationRemoteInputManager,
            NotificationShadeDepthController notificationShadeDepthController,
            SystemActions systemActions,
            @Main Handler mainHandler,
            UiEventLogger uiEventLogger,
            NavigationBarOverlayController navBarOverlayController,
            ConfigurationController configurationController,
            NavigationBarA11yHelper navigationBarA11yHelper,
            TaskbarDelegate taskbarDelegate,
            UserTracker userTracker) {
        return new NavigationBarController(context,
                windowManager,
                assistManagerLazy,
                accessibilityManager,
                accessibilityManagerWrapper,
                deviceProvisionedController,
                metricsLogger,
                overviewProxyService,
                navigationModeController,
                accessibilityButtonModeObserver,
                statusBarStateController,
                sysUiFlagsContainer,
                broadcastDispatcher,
                commandQueue,
                pipOptional,
                splitScreenOptional,
                recentsOptional,
                statusBarOptionalLazy,
                shadeController,
                notificationRemoteInputManager,
                notificationShadeDepthController,
                systemActions,
                mainHandler,
                uiEventLogger,
                navBarOverlayController,
                configurationController,
                navigationBarA11yHelper,
                taskbarDelegate,
                userTracker);
    }

    /** */
    @Provides
    @SysUISingleton
+4 −2
Original line number Diff line number Diff line
@@ -143,8 +143,10 @@ public abstract class SystemUIModule {

    @SysUISingleton
    @Provides
    static SysUiState provideSysUiState() {
        return new SysUiState();
    static SysUiState provideSysUiState(DumpManager dumpManager) {
        final SysUiState state = new SysUiState();
        dumpManager.registerDumpable(state);
        return state;
    }

    @BindsOptionalOf
Loading