Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -375,6 +375,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", Loading core/java/android/view/IDisplayFoldListener.aidl 0 → 100644 +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); } core/java/android/view/IWindowManager.aidl +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading services/core/java/com/android/server/policy/DisplayFoldController.java +44 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading @@ -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); } /** Loading @@ -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 Loading @@ -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()); } } services/core/java/com/android/server/policy/PhoneWindowManager.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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 Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -375,6 +375,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", Loading
core/java/android/view/IDisplayFoldListener.aidl 0 → 100644 +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); }
core/java/android/view/IWindowManager.aidl +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. */ Loading
services/core/java/com/android/server/policy/DisplayFoldController.java +44 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading @@ -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); } /** Loading @@ -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 Loading @@ -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()); } }
services/core/java/com/android/server/policy/PhoneWindowManager.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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