Loading core/java/android/app/ActivityView.java +14 −23 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ package android.app; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.app.ActivityManager.StackInfo; Loading @@ -32,7 +36,6 @@ import android.util.Log; import android.view.IWindowManager; import android.view.InputDevice; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.SurfaceSession; Loading Loading @@ -82,7 +85,6 @@ public class ActivityView extends ViewGroup { private boolean mOpened; // Protected by mGuard. private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction(); private Surface mTmpSurface = new Surface(); /** The ActivityView is only allowed to contain one task. */ private final boolean mSingleTaskInstance; Loading Loading @@ -319,20 +321,20 @@ public class ActivityView extends ViewGroup { private class SurfaceCallback implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { mTmpSurface = new Surface(); if (mVirtualDisplay == null) { initVirtualDisplay(new SurfaceSession()); if (mVirtualDisplay != null && mActivityViewCallback != null) { mActivityViewCallback.onActivityViewReady(ActivityView.this); } } else { // TODO (b/119209373): DisplayManager determines if a VirtualDisplay is on by // whether it has a surface. Setting a fake surface here so DisplayManager will // consider this display on. mVirtualDisplay.setSurface(mTmpSurface); mTmpTransaction.reparent(mRootSurfaceControl, mSurfaceView.getSurfaceControl().getHandle()).apply(); } if (mVirtualDisplay != null) { mVirtualDisplay.setDisplayState(true); } updateLocation(); } Loading @@ -346,10 +348,8 @@ public class ActivityView extends ViewGroup { @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { mTmpSurface.release(); mTmpSurface = null; if (mVirtualDisplay != null) { mVirtualDisplay.setSurface(null); mVirtualDisplay.setDisplayState(false); } cleanTapExcludeRegion(); } Loading @@ -370,15 +370,11 @@ public class ActivityView extends ViewGroup { final int height = mSurfaceView.getHeight(); final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); // TODO (b/119209373): DisplayManager determines if a VirtualDisplay is on by // whether it has a surface. Setting a fake surface here so DisplayManager will consider // this display on. mVirtualDisplay = displayManager.createVirtualDisplay( DISPLAY_NAME + "@" + System.identityHashCode(this), width, height, getBaseDisplayDensity(), mTmpSurface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL); DISPLAY_NAME + "@" + System.identityHashCode(this), width, height, getBaseDisplayDensity(), null, VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL); if (mVirtualDisplay == null) { Log.e(TAG, "Failed to initialize ActivityView"); return; Loading Loading @@ -443,11 +439,6 @@ public class ActivityView extends ViewGroup { displayReleased = false; } if (mTmpSurface != null) { mTmpSurface.release(); mTmpSurface = null; } if (displayReleased && mActivityViewCallback != null) { mActivityViewCallback.onActivityViewDestroyed(this); } Loading core/java/android/hardware/display/DisplayManagerGlobal.java +9 −0 Original line number Diff line number Diff line Loading @@ -436,6 +436,7 @@ public final class DisplayManagerGlobal { public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) { try { mDm.setVirtualDisplaySurface(token, surface); setVirtualDisplayState(token, surface != null); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } Loading @@ -458,6 +459,14 @@ public final class DisplayManagerGlobal { } } void setVirtualDisplayState(IVirtualDisplayCallback token, boolean isOn) { try { mDm.setVirtualDisplayState(token, isOn); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } /** * Gets the stable device display size, in pixels. */ Loading core/java/android/hardware/display/IDisplayManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ interface IDisplayManager { // No permissions required but must be same Uid as the creator. void releaseVirtualDisplay(in IVirtualDisplayCallback token); // No permissions required but must be same Uid as the creator. void setVirtualDisplayState(in IVirtualDisplayCallback token, boolean isOn); // Get a stable metric for the device's display size. No permissions required. Point getStableDisplaySize(); Loading core/java/android/hardware/display/VirtualDisplay.java +12 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,18 @@ public final class VirtualDisplay { } } /** * Sets the on/off state for a virtual display. * * @param isOn Whether the display should be on or off. * @hide */ public void setDisplayState(boolean isOn) { if (mToken != null) { mGlobal.setVirtualDisplayState(mToken, isOn); } } @Override public String toString() { return "VirtualDisplay{display=" + mDisplay + ", token=" + mToken Loading services/core/java/com/android/server/display/DisplayManagerService.java +20 −0 Original line number Diff line number Diff line Loading @@ -792,6 +792,16 @@ public final class DisplayManagerService extends SystemService { } } private void setVirtualDisplayStateInternal(IBinder appToken, boolean isOn) { synchronized (mSyncRoot) { if (mVirtualDisplayAdapter == null) { return; } mVirtualDisplayAdapter.setVirtualDisplayStateLocked(appToken, isOn); } } private void registerDefaultDisplayAdapters() { // Register default display adapters. synchronized (mSyncRoot) { Loading Loading @@ -1929,6 +1939,16 @@ public final class DisplayManagerService extends SystemService { } } @Override // Binder call public void setVirtualDisplayState(IVirtualDisplayCallback callback, boolean isOn) { final long token = Binder.clearCallingIdentity(); try { setVirtualDisplayStateInternal(callback.asBinder(), isOn); } finally { Binder.restoreCallingIdentity(token); } } @Override // Binder call public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; Loading Loading
core/java/android/app/ActivityView.java +14 −23 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ package android.app; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; import android.annotation.NonNull; import android.annotation.UnsupportedAppUsage; import android.app.ActivityManager.StackInfo; Loading @@ -32,7 +36,6 @@ import android.util.Log; import android.view.IWindowManager; import android.view.InputDevice; import android.view.MotionEvent; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceHolder; import android.view.SurfaceSession; Loading Loading @@ -82,7 +85,6 @@ public class ActivityView extends ViewGroup { private boolean mOpened; // Protected by mGuard. private final SurfaceControl.Transaction mTmpTransaction = new SurfaceControl.Transaction(); private Surface mTmpSurface = new Surface(); /** The ActivityView is only allowed to contain one task. */ private final boolean mSingleTaskInstance; Loading Loading @@ -319,20 +321,20 @@ public class ActivityView extends ViewGroup { private class SurfaceCallback implements SurfaceHolder.Callback { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { mTmpSurface = new Surface(); if (mVirtualDisplay == null) { initVirtualDisplay(new SurfaceSession()); if (mVirtualDisplay != null && mActivityViewCallback != null) { mActivityViewCallback.onActivityViewReady(ActivityView.this); } } else { // TODO (b/119209373): DisplayManager determines if a VirtualDisplay is on by // whether it has a surface. Setting a fake surface here so DisplayManager will // consider this display on. mVirtualDisplay.setSurface(mTmpSurface); mTmpTransaction.reparent(mRootSurfaceControl, mSurfaceView.getSurfaceControl().getHandle()).apply(); } if (mVirtualDisplay != null) { mVirtualDisplay.setDisplayState(true); } updateLocation(); } Loading @@ -346,10 +348,8 @@ public class ActivityView extends ViewGroup { @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { mTmpSurface.release(); mTmpSurface = null; if (mVirtualDisplay != null) { mVirtualDisplay.setSurface(null); mVirtualDisplay.setDisplayState(false); } cleanTapExcludeRegion(); } Loading @@ -370,15 +370,11 @@ public class ActivityView extends ViewGroup { final int height = mSurfaceView.getHeight(); final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); // TODO (b/119209373): DisplayManager determines if a VirtualDisplay is on by // whether it has a surface. Setting a fake surface here so DisplayManager will consider // this display on. mVirtualDisplay = displayManager.createVirtualDisplay( DISPLAY_NAME + "@" + System.identityHashCode(this), width, height, getBaseDisplayDensity(), mTmpSurface, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL); DISPLAY_NAME + "@" + System.identityHashCode(this), width, height, getBaseDisplayDensity(), null, VIRTUAL_DISPLAY_FLAG_PUBLIC | VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL); if (mVirtualDisplay == null) { Log.e(TAG, "Failed to initialize ActivityView"); return; Loading Loading @@ -443,11 +439,6 @@ public class ActivityView extends ViewGroup { displayReleased = false; } if (mTmpSurface != null) { mTmpSurface.release(); mTmpSurface = null; } if (displayReleased && mActivityViewCallback != null) { mActivityViewCallback.onActivityViewDestroyed(this); } Loading
core/java/android/hardware/display/DisplayManagerGlobal.java +9 −0 Original line number Diff line number Diff line Loading @@ -436,6 +436,7 @@ public final class DisplayManagerGlobal { public void setVirtualDisplaySurface(IVirtualDisplayCallback token, Surface surface) { try { mDm.setVirtualDisplaySurface(token, surface); setVirtualDisplayState(token, surface != null); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } Loading @@ -458,6 +459,14 @@ public final class DisplayManagerGlobal { } } void setVirtualDisplayState(IVirtualDisplayCallback token, boolean isOn) { try { mDm.setVirtualDisplayState(token, isOn); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } /** * Gets the stable device display size, in pixels. */ Loading
core/java/android/hardware/display/IDisplayManager.aidl +3 −0 Original line number Diff line number Diff line Loading @@ -82,6 +82,9 @@ interface IDisplayManager { // No permissions required but must be same Uid as the creator. void releaseVirtualDisplay(in IVirtualDisplayCallback token); // No permissions required but must be same Uid as the creator. void setVirtualDisplayState(in IVirtualDisplayCallback token, boolean isOn); // Get a stable metric for the device's display size. No permissions required. Point getStableDisplaySize(); Loading
core/java/android/hardware/display/VirtualDisplay.java +12 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,18 @@ public final class VirtualDisplay { } } /** * Sets the on/off state for a virtual display. * * @param isOn Whether the display should be on or off. * @hide */ public void setDisplayState(boolean isOn) { if (mToken != null) { mGlobal.setVirtualDisplayState(mToken, isOn); } } @Override public String toString() { return "VirtualDisplay{display=" + mDisplay + ", token=" + mToken Loading
services/core/java/com/android/server/display/DisplayManagerService.java +20 −0 Original line number Diff line number Diff line Loading @@ -792,6 +792,16 @@ public final class DisplayManagerService extends SystemService { } } private void setVirtualDisplayStateInternal(IBinder appToken, boolean isOn) { synchronized (mSyncRoot) { if (mVirtualDisplayAdapter == null) { return; } mVirtualDisplayAdapter.setVirtualDisplayStateLocked(appToken, isOn); } } private void registerDefaultDisplayAdapters() { // Register default display adapters. synchronized (mSyncRoot) { Loading Loading @@ -1929,6 +1939,16 @@ public final class DisplayManagerService extends SystemService { } } @Override // Binder call public void setVirtualDisplayState(IVirtualDisplayCallback callback, boolean isOn) { final long token = Binder.clearCallingIdentity(); try { setVirtualDisplayStateInternal(callback.asBinder(), isOn); } finally { Binder.restoreCallingIdentity(token); } } @Override // Binder call public void dump(FileDescriptor fd, final PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; Loading