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

Commit 4f3b3951 authored by Bryce Lee's avatar Bryce Lee
Browse files

Add RTL support to communal touch handler.

This changelist adds RTL support for communal touch handler by adjusting
the touch initiation region based on the layout direction.

Test: atest CommunalTouchHandlerTest#testTouchInitiationArea
Bug: 320786721
Flag: com.android.systemui.communal_hub
Change-Id: Ib74758b3b1adec0a84f3a3596af76733f3cd967e
parent 959c10ba
Loading
Loading
Loading
Loading
+27 −5
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;

import android.graphics.Rect;
import android.graphics.Region;
import android.util.LayoutDirection;
import android.view.GestureDetector;
import android.view.MotionEvent;

@@ -27,6 +28,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle;

import com.android.systemui.ambient.touch.TouchHandler;
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor;
import com.android.systemui.communal.domain.interactor.CommunalInteractor;
import com.android.systemui.dreams.touch.dagger.CommunalTouchModule;
import com.android.systemui.statusbar.phone.CentralSurfaces;
@@ -43,30 +45,42 @@ public class CommunalTouchHandler implements TouchHandler {
    private final Optional<CentralSurfaces> mCentralSurfaces;
    private final Lifecycle mLifecycle;
    private final CommunalInteractor mCommunalInteractor;

    private final ConfigurationInteractor mConfigurationInteractor;
    private Boolean mIsEnabled = false;

    private int mLayoutDirection = LayoutDirection.LTR;

    @VisibleForTesting
    final Consumer<Boolean> mIsCommunalAvailableCallback = isAvailable -> setIsEnabled(isAvailable);

    @VisibleForTesting
    final Consumer<Boolean> mIsCommunalAvailableCallback =
            isAvailable -> {
                setIsEnabled(isAvailable);
            };
    final Consumer<Integer> mLayoutDirectionCallback = direction -> mLayoutDirection = direction;

    @Inject
    public CommunalTouchHandler(
            Optional<CentralSurfaces> centralSurfaces,
            @Named(CommunalTouchModule.COMMUNAL_GESTURE_INITIATION_WIDTH) int initiationWidth,
            CommunalInteractor communalInteractor,
            ConfigurationInteractor configurationInteractor,
            Lifecycle lifecycle) {
        mInitiationWidth = initiationWidth;
        mCentralSurfaces = centralSurfaces;
        mLifecycle = lifecycle;
        mCommunalInteractor = communalInteractor;
        mConfigurationInteractor = configurationInteractor;

        collectFlow(
                mLifecycle,
                mCommunalInteractor.isCommunalAvailable(),
                mIsCommunalAvailableCallback
        );

        collectFlow(
                mLifecycle,
                mConfigurationInteractor.getLayoutDirection(),
                mLayoutDirectionCallback
        );
    }

    @Override
@@ -90,7 +104,15 @@ public class CommunalTouchHandler implements TouchHandler {
    @Override
    public void getTouchInitiationRegion(Rect bounds, Region region, Rect exclusionRect) {
        final Rect outBounds = new Rect(bounds);
        outBounds.inset(outBounds.width() - mInitiationWidth, 0, 0, 0);
        final int inset = outBounds.width() - mInitiationWidth;

        // Touch initiation area is defined in terms of LTR. The insets must be flipped for RTL
        if (mLayoutDirection == LayoutDirection.LTR) {
            outBounds.inset(inset, 0, 0, 0);
        } else {
            outBounds.inset(0, 0, inset, 0);
        }

        region.op(outBounds, Region.Op.UNION);
    }

+27 −0
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.graphics.Rect;
import android.graphics.Region;
import android.util.LayoutDirection;
import android.view.GestureDetector;
import android.view.MotionEvent;

@@ -68,10 +71,12 @@ public class CommunalTouchHandlerTest extends SysuiTestCase {
        AtomicReference reference = new AtomicReference<>(null);
        when(mLifecycle.getInternalScopeRef()).thenReturn(reference);
        when(mLifecycle.getCurrentState()).thenReturn(Lifecycle.State.CREATED);

        mTouchHandler = new CommunalTouchHandler(
                Optional.of(mCentralSurfaces),
                INITIATION_WIDTH,
                mKosmos.getCommunalInteractor(),
                mKosmos.getConfigurationInteractor(),
                mLifecycle
                );
    }
@@ -127,4 +132,26 @@ public class CommunalTouchHandlerTest extends SysuiTestCase {
                .onScroll(motionEvent1, motionEvent2, 1, 1))
                .isTrue();
    }

    @Test
    public void testTouchInitiationArea() {
        final int right = 80;
        final int bottom = 100;
        final Rect bounds = new Rect(0, 0, right, bottom);

        {
            final Region region = new Region();
            mTouchHandler.mLayoutDirectionCallback.accept(LayoutDirection.LTR);
            mTouchHandler.getTouchInitiationRegion(bounds, region, null);
            assertThat(region.getBounds()).isEqualTo(
                    new Rect(right - INITIATION_WIDTH, 0, right, bottom));
        }

        {
            final Region region = new Region();
            mTouchHandler.mLayoutDirectionCallback.accept(LayoutDirection.RTL);
            mTouchHandler.getTouchInitiationRegion(bounds, region, null);
            assertThat(region.getBounds()).isEqualTo(new Rect(0, 0, INITIATION_WIDTH, bottom));
        }
    }
}