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

Commit 962017e4 authored by Adrian Roos's avatar Adrian Roos Committed by Chilun Huang
Browse files

Foldables: Add IDisplayFoldListener

Include ag/5663399 to unregister display fold listener.

Bug: 123245311
Test: atest WmTests
Change-Id: I60776fddd4a671b7443cd33220271fed84503b27
parent 595416be
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -376,6 +376,7 @@ java_defaults {
        "core/java/android/view/IApplicationToken.aidl",
        "core/java/android/view/IAppTransitionAnimationSpecsFuture.aidl",
        "core/java/android/view/IDockedStackListener.aidl",
        "core/java/android/view/IDisplayFoldListener.aidl",
        "core/java/android/view/IGraphicsStats.aidl",
        "core/java/android/view/IGraphicsStatsCallback.aidl",
        "core/java/android/view/IInputFilter.aidl",
+26 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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 android.view;

/**
 * {@hide}
 */
oneway interface IDisplayFoldListener
{
    /** Called when the foldedness of a display changes */
    void onDisplayFoldChanged(int displayId, boolean folded);
}
+11 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.ParcelFileDescriptor;
import android.view.IApplicationToken;
import android.view.IAppTransitionAnimationSpecsFuture;
import android.view.IDockedStackListener;
import android.view.IDisplayFoldListener;
import android.view.IOnKeyguardExitResult;
import android.view.IPinnedStackListener;
import android.view.RemoteAnimationAdapter;
@@ -402,6 +403,16 @@ interface IWindowManager
     */
    Region getCurrentImeTouchRegion();

    /**
     * Registers an IDisplayFoldListener.
     */
    void registerDisplayFoldListener(IDisplayFoldListener listener);

    /**
     * Unregisters an IDisplayFoldListener.
     */
    void unregisterDisplayFoldListener(IDisplayFoldListener listener);

    /**
     * Starts a window trace.
     */
+44 −3
Original line number Diff line number Diff line
@@ -23,8 +23,13 @@ import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.DisplayManagerInternal;
import android.os.Handler;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.view.DisplayInfo;
import android.view.IDisplayFoldListener;

import com.android.server.DisplayThread;
import com.android.server.LocalServices;
import com.android.server.wm.WindowManagerInternal;

@@ -40,16 +45,24 @@ class DisplayFoldController {

    /** The display area while device is folded. */
    private final Rect mFoldedArea;
    private final Handler mHandler;

    private final DisplayInfo mNonOverrideDisplayInfo = new DisplayInfo();
    private final RemoteCallbackList<IDisplayFoldListener> mListeners = new RemoteCallbackList<>();
    private Boolean mFolded;

    DisplayFoldController(WindowManagerInternal windowManagerInternal,
            DisplayManagerInternal displayManagerInternal, int displayId, Rect foldedArea) {
            DisplayManagerInternal displayManagerInternal, int displayId, Rect foldedArea,
            Handler handler) {
        mWindowManagerInternal = windowManagerInternal;
        mDisplayManagerInternal = displayManagerInternal;
        mDisplayId = displayId;
        mFoldedArea = new Rect(foldedArea);
        mHandler = handler;
    }

    void requestDeviceFolded(boolean folded) {
        mHandler.post(() -> setDeviceFolded(folded));
    }

    void setDeviceFolded(boolean folded) {
@@ -71,6 +84,34 @@ class DisplayFoldController {
            mDisplayManagerInternal.setDisplayOffsets(mDisplayId, 0, 0);
        }
        mFolded = folded;

        final int n = mListeners.beginBroadcast();
        for (int i = 0; i < n; i++) {
            try {
                mListeners.getBroadcastItem(i).onDisplayFoldChanged(mDisplayId, folded);
            } catch (RemoteException e) {
                // Listener died.
            }
        }
        mListeners.finishBroadcast();
    }

    void registerDisplayFoldListener(IDisplayFoldListener listener) {
        mListeners.register(listener);
        if (mFolded == null) {
            return;
        }
        mHandler.post(() -> {
            try {
                listener.onDisplayFoldChanged(mDisplayId, mFolded);
            } catch (RemoteException e) {
                // Listener died.
            }
        });
    }

    void unregisterDisplayFoldListener(IDisplayFoldListener listener) {
        mListeners.unregister(listener);
    }

    /**
@@ -88,7 +129,7 @@ class DisplayFoldController {
        sensorManager.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                result.setDeviceFolded(event.values[0] < 1f);
                result.requestDeviceFolded(event.values[0] < 1f);
            }

            @Override
@@ -109,6 +150,6 @@ class DisplayFoldController {
                displayInfo.logicalWidth, displayInfo.logicalHeight);

        return new DisplayFoldController(LocalServices.getService(WindowManagerInternal.class),
                displayService, displayId, foldedArea);
                displayService, displayId, foldedArea, DisplayThread.getHandler());
    }
}
+16 −1
Original line number Diff line number Diff line
@@ -177,6 +177,7 @@ import android.util.SparseArray;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
import android.view.HapticFeedbackConstants;
import android.view.IDisplayFoldListener;
import android.view.IWindowManager;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
@@ -3204,6 +3205,20 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mTopFocusedDisplayId = displayId;
    }

    @Override
    public void registerDisplayFoldListener(IDisplayFoldListener listener) {
        if (mDisplayFoldController != null) {
            mDisplayFoldController.registerDisplayFoldListener(listener);
        }
    }

    @Override
    public void unregisterDisplayFoldListener(IDisplayFoldListener listener) {
        if (mDisplayFoldController != null) {
            mDisplayFoldController.unregisterDisplayFoldListener(listener);
        }
    }

    @Override
    public void registerShortcutKey(long shortcutCode, IShortcutService shortcutService)
            throws RemoteException {
@@ -4984,7 +4999,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private void applyLidSwitchState() {
        final int lidState = mDefaultDisplayPolicy.getLidState();
        if (mLidControlsDisplayFold && mDisplayFoldController != null) {
            mDisplayFoldController.setDeviceFolded(lidState == LID_CLOSED);
            mDisplayFoldController.requestDeviceFolded(lidState == LID_CLOSED);
        } else if (lidState == LID_CLOSED && mLidControlsSleep) {
            goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH,
                    PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
Loading