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

Commit e09bad52 authored by Alina Zaidi's avatar Alina Zaidi
Browse files

Extract interface from AutoHideController

In coming CLs a store will generate multiple instances of
AutoHideController for multi display

Bug: 373309973
Test: current tests pass
Flag: EXEMPT minor refactor
Change-Id: I1282757dc72122c56fef9fa17b0c34d21d7ce782
parent c889e1b1
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ import com.android.systemui.log.LogBufferFactory
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.data.StatusBarDataLayerModule
import com.android.systemui.statusbar.data.repository.LightBarControllerStore
import com.android.systemui.statusbar.phone.AutoHideController
import com.android.systemui.statusbar.phone.AutoHideControllerImpl
import com.android.systemui.statusbar.phone.LightBarController
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl
@@ -79,6 +81,8 @@ interface StatusBarModule {
        implFactory: StatusBarWindowControllerImpl.Factory
    ): StatusBarWindowController.Factory

    @Binds @SysUISingleton fun autoHideController(impl: AutoHideControllerImpl): AutoHideController

    companion object {

        @Provides
+62 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.statusbar.phone

import android.content.Context
import android.view.MotionEvent
import com.android.systemui.statusbar.AutoHideUiElement
import java.io.PrintWriter

/**
 * Controls the auto-hide behavior of system bars (status bar, navigation bar).
 *
 * This interface provides methods to manage the auto-hide schedule of system bars, allowing them to
 * be shown or hidden.
 */
interface AutoHideController {
    /**
     * Sets a [AutoHideUiElement] status bar that should be controlled by the [AutoHideController].
     */
    fun setStatusBar(element: AutoHideUiElement)

    /**
     * Sets a [AutoHideUiElement] navigation bar that should be controlled by the
     * [AutoHideController].
     */
    fun setNavigationBar(element: AutoHideUiElement)

    /** Resumes the auto-hide behavior that was previously suspended. */
    fun resumeSuspendedAutoHide()

    /** Suspends the auto-hide behavior. */
    fun suspendAutoHide()

    /** Schedules or cancels auto hide behavior based on current system bar state. */
    fun touchAutoHide()

    /** Hides system bars on user touch if the interaction requires them to be hidden. */
    fun checkUserAutoHide(event: MotionEvent)

    /** Dumps the current state of the [AutoHideController] */
    fun dump(pw: PrintWriter)

    /** Injectable factory for creating a [AutoHideController]. */
    interface Factory {
        /** Create an [AutoHideController] */
        fun create(context: Context): AutoHideController
    }
}
+13 −20
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 The Android Open Source Project
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -28,7 +28,6 @@ import android.view.accessibility.AccessibilityManager;

import androidx.annotation.NonNull;

import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.AutoHideUiElement;

@@ -36,9 +35,7 @@ import java.io.PrintWriter;

import javax.inject.Inject;

/** A controller to control all auto-hide things. Also see {@link AutoHideUiElement}. */
@SysUISingleton
public class AutoHideController {
public class AutoHideControllerImpl implements AutoHideController {
    private static final String TAG = "AutoHideController";
    private static final int AUTO_HIDE_TIMEOUT_MS = 2250;
    private static final int USER_AUTO_HIDE_TIMEOUT_MS = 350;
@@ -61,7 +58,7 @@ public class AutoHideController {
    };

    @Inject
    public AutoHideController(Context context,
    public AutoHideControllerImpl(Context context,
            @Main Handler handler,
            IWindowManager iWindowManager) {
        mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
@@ -70,18 +67,12 @@ public class AutoHideController {
        mDisplayId = context.getDisplayId();
    }

    /**
     * Sets a {@link AutoHideUiElement} status bar that should be controlled by the
     * {@link AutoHideController}.
     */
    @Override
    public void setStatusBar(AutoHideUiElement element) {
        mStatusBar = element;
    }

    /**
     * Sets a {@link AutoHideUiElement} navigation bar that should be controlled by the
     * {@link AutoHideController}.
     */
    @Override
    public void setNavigationBar(AutoHideUiElement element) {
        mNavigationBar = element;
    }
@@ -102,6 +93,7 @@ public class AutoHideController {
        }
    }

    @Override
    public void resumeSuspendedAutoHide() {
        if (mAutoHideSuspended) {
            scheduleAutoHide();
@@ -112,6 +104,7 @@ public class AutoHideController {
        }
    }

    @Override
    public void suspendAutoHide() {
        mHandler.removeCallbacks(mAutoHide);
        Runnable checkBarModesRunnable = getCheckBarModesRunnable();
@@ -121,7 +114,7 @@ public class AutoHideController {
        mAutoHideSuspended = isAnyTransientBarShown();
    }

    /** Schedules or cancels auto hide behavior based on current system bar state. */
    @Override
    public void touchAutoHide() {
        // update transient bar auto hide
        if (isAnyTransientBarShown()) {
@@ -156,6 +149,7 @@ public class AutoHideController {
                FLAG_CONTENT_CONTROLS);
    }

    @Override
    public void checkUserAutoHide(MotionEvent event) {
        boolean shouldHide = isAnyTransientBarShown()
                && event.getAction() == MotionEvent.ACTION_OUTSIDE // touch outside the source bar.
@@ -196,6 +190,7 @@ public class AutoHideController {
        return false;
    }

    @Override
    public void dump(@NonNull PrintWriter pw) {
        pw.println("AutoHideController:");
        pw.println("\tmAutoHideSuspended=" + mAutoHideSuspended);
@@ -205,10 +200,7 @@ public class AutoHideController {
        pw.println("\tgetUserAutoHideTimeout=" + getUserAutoHideTimeout());
    }

    /**
     * Injectable factory for creating a {@link AutoHideController}.
     */
    public static class Factory {
    public static class Factory implements AutoHideController.Factory {
        private final Handler mHandler;
        private final IWindowManager mIWindowManager;

@@ -219,8 +211,9 @@ public class AutoHideController {
        }

        /** Create an {@link AutoHideController} */
        @Override
        public AutoHideController create(Context context) {
            return new AutoHideController(context, mHandler, mIWindowManager);
            return new AutoHideControllerImpl(context, mHandler, mIWindowManager);
        }
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ import com.android.systemui.statusbar.data.repository.PrivacyDotViewControllerSt
import com.android.systemui.statusbar.data.repository.PrivacyDotWindowControllerStoreModule
import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore
import com.android.systemui.statusbar.events.PrivacyDotViewControllerModule
import com.android.systemui.statusbar.phone.AutoHideController
import com.android.systemui.statusbar.phone.AutoHideControllerImpl
import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks
import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStore
@@ -75,6 +77,9 @@ interface StatusBarPhoneModule {

    @Binds fun statusBarInitializer(@Default impl: StatusBarInitializerImpl): StatusBarInitializer

    @Binds
    fun autoHideControllerFactory(impl: AutoHideControllerImpl.Factory): AutoHideController.Factory

    companion object {
        /** Binds {@link StatusBarInitializer} as a {@link CoreStartable}. */
        @Provides