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

Commit f8728315 authored by Bill Lin's avatar Bill Lin
Browse files

Register DisplayAreaOrganizer for one handed (6/N)

Introduce OneHandeDisplayAreaOrganizer and AnimationController

Test: atest OneHandedDisplayAreaOrganizerTest
Test: atest OneHandedManagerImplTest
Test: atest OneHandedUITest
Test: atest OneHandedSettingsUtilTest
Test: atest SystemUITests
Test: atest DisplayAreaPolicyBuilderTest
Bug: 150747909
Change-Id: I654090adf404214056ef37d83bacd3f65fffc1ff
parent 1045477d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -5293,6 +5293,7 @@ package android.window {
    method public void onDisplayAreaVanished(@NonNull android.window.DisplayAreaInfo);
    method @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS) public void registerOrganizer(int);
    field public static final int FEATURE_DEFAULT_TASK_CONTAINER = 1; // 0x1
    field public static final int FEATURE_ONE_HANDED = 3; // 0x3
    field public static final int FEATURE_ROOT = 0; // 0x0
    field public static final int FEATURE_SYSTEM_FIRST = 0; // 0x0
    field public static final int FEATURE_SYSTEM_LAST = 10000; // 0x2710
+30 −4
Original line number Diff line number Diff line
@@ -30,18 +30,44 @@ import android.view.SurfaceControl;
@TestApi
public class DisplayAreaOrganizer extends WindowOrganizer {

    /**
     * The value in display area indicating that no value has been set.
     */
    public static final int FEATURE_UNDEFINED = -1;

    /**
     * The Root display area on a display
     */
    public static final int FEATURE_SYSTEM_FIRST = 0;
    // The Root display area on a display

    /**
     * The Root display area on a display
     */
    public static final int FEATURE_ROOT = FEATURE_SYSTEM_FIRST;
    // Display area hosting the default task container.

    /**
     * Display area hosting the default task container.
     */
    public static final int FEATURE_DEFAULT_TASK_CONTAINER = FEATURE_SYSTEM_FIRST + 1;
    // Display area hosting non-activity window tokens.

    /**
     * Display area hosting non-activity window tokens.
     */
    public static final int FEATURE_WINDOW_TOKENS = FEATURE_SYSTEM_FIRST + 2;

    /**
     * Display area for one handed feature
     */
    public static final int FEATURE_ONE_HANDED = FEATURE_SYSTEM_FIRST + 3;

    /**
     * The last boundary of display area for system features
     */
    public static final int FEATURE_SYSTEM_LAST = 10_000;

    // Vendor specific display area definition can start with this value.
    /**
     * Vendor specific display area definition can start with this value.
     */
    public static final int FEATURE_VENDOR_FIRST = FEATURE_SYSTEM_LAST + 1;

    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
+3 −3
Original line number Diff line number Diff line
@@ -490,9 +490,6 @@
    <!-- On debuggable builds, alert the user if SystemUI PSS goes over this number (in kb) -->
    <integer name="watch_heap_limit">256000</integer>

    <!-- One handed mode default offset % of display size -->
    <fraction name="config_one_handed_offset">50%</fraction>

    <!-- Animation duration for resizing of PIP when entering/exiting. -->
    <integer name="config_pipResizeAnimationDuration">425</integer>

@@ -574,4 +571,7 @@
    <!-- If the config font scale is >= this value, potentially adjust the number of columns-->
    <item name="controls_max_columns_adjust_above_font_scale" translatable="false" format="float" type="dimen">1.25</item>

    <!-- One handed mode default offset % of display size -->
    <fraction name="config_one_handed_offset">50%</fraction>

</resources>
+52 −1
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@ package com.android.systemui.onehanded;

import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.view.SurfaceControl;
import android.window.DisplayAreaInfo;
import android.window.DisplayAreaOrganizer;
import android.window.WindowContainerTransaction;

@@ -28,6 +31,7 @@ import com.android.systemui.Dumpable;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Objects;

import javax.inject.Inject;

@@ -46,10 +50,14 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer implemen

    private final Handler mUpdateHandler;

    private boolean mIsInOneHanded;
    @VisibleForTesting
    DisplayAreaInfo mDisplayAreaInfo;
    private SurfaceControl mLeash;

    @SuppressWarnings("unchecked")
    private final Handler.Callback mUpdateCallback = (msg) -> true;


    /**
     * Constructor of OneHandedDisplayAreaOrganizer
     */
@@ -58,14 +66,57 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer implemen
        mUpdateHandler = new Handler(OneHandedThread.get().getLooper(), mUpdateCallback);
    }

    @Override
    public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo,
            @NonNull SurfaceControl leash) {
        Objects.requireNonNull(displayAreaInfo, "displayAreaInfo must not be null");
        Objects.requireNonNull(leash, "leash must not be null");
        mDisplayAreaInfo = displayAreaInfo;
        mLeash = leash;
    }

    @Override
    public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {
        Objects.requireNonNull(displayAreaInfo, "displayArea must not be null");
        mDisplayAreaInfo = displayAreaInfo;
    }

    @Override
    public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
        Objects.requireNonNull(displayAreaInfo,
                "Requires valid displayArea, and displayArea must not be null");
        if (displayAreaInfo.token.asBinder() != mDisplayAreaInfo.token.asBinder()) {
            Log.w(TAG, "Unrecognized token: " + displayAreaInfo.token);
            return;
        }
        mDisplayAreaInfo = displayAreaInfo;

        // Stop one handed immediately
    }

    @VisibleForTesting
    Handler getUpdateHandler() {
        return mUpdateHandler;
    }

    /**
     * The latest state of one handed mode
     *
     * @return true Currently is in one handed mode, otherwise is not in one handed mode
     */
    public boolean isInOneHanded() {
        return mIsInOneHanded;
    }

    @Override
    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
        final String innerPrefix = "  ";
        pw.println(TAG + "states: ");
        pw.print(innerPrefix + "mIsInOneHanded=");
        pw.println(mIsInOneHanded);
        pw.print(innerPrefix + "mDisplayAreaInfo=");
        pw.println(mDisplayAreaInfo);
        pw.print(innerPrefix + "mLeash=");
        pw.println(mLeash);
    }
}
+13 −2
Original line number Diff line number Diff line
@@ -82,14 +82,25 @@ public class OneHandedManagerImpl implements OneHandedManager, Dumpable {
    }

    private void updateOneHandedEnabled() {
        if (mDisplayAreaOrganizer.isInOneHanded()) {
            stopOneHanded();
        }
        // TODO Be aware to unregisterOrganizer() after animation finished
        mDisplayAreaOrganizer.unregisterOrganizer();
        if (mIsOneHandedEnabled) {
            mDisplayAreaOrganizer.registerOrganizer(
                    OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED);
        }
    }

    @Override
    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
        final String innerPrefix = "  ";
        pw.println(TAG + "states: ");
        pw.print(innerPrefix + "mIsOneHandedEnabled=");
        pw.println(mIsOneHandedEnabled);
        pw.print(innerPrefix + "mSysUiFlagContainer=");
        pw.println(mSysUiFlagContainer.getFlags());
        pw.print(innerPrefix + "mOffSetFraction=");
        pw.println(mOffSetFraction);

        if (mDisplayAreaOrganizer != null) {
            mDisplayAreaOrganizer.dump(fd, pw, args);
Loading