Loading core/java/android/app/ActivityView.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region; import android.hardware.display.VirtualDisplay; import android.os.Bundle; import android.os.Bundle; import android.os.UserHandle; import android.os.UserHandle; import android.util.AttributeSet; import android.util.AttributeSet; Loading Loading @@ -443,6 +444,14 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd return mTaskEmbedder.getDisplayId(); return mTaskEmbedder.getDisplayId(); } } /** * @hide * @return virtual display. */ public VirtualDisplay getVirtualDisplay() { return mTaskEmbedder.getVirtualDisplay(); } /** /** * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the * virtual display. * virtual display. Loading core/java/android/window/TaskEmbedder.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.ActivityTaskManager; import android.app.ActivityView; import android.app.IActivityTaskManager; import android.app.IActivityTaskManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.content.ComponentName; import android.content.ComponentName; Loading @@ -36,9 +35,8 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region; import android.os.RemoteException; import android.hardware.display.VirtualDisplay; import android.os.UserHandle; import android.os.UserHandle; import android.util.Log; import android.view.IWindow; import android.view.IWindow; import android.view.IWindowManager; import android.view.IWindowManager; import android.view.KeyEvent; import android.view.KeyEvent; Loading Loading @@ -256,6 +254,10 @@ public abstract class TaskEmbedder { return INVALID_DISPLAY; return INVALID_DISPLAY; } } public VirtualDisplay getVirtualDisplay() { return null; } /** /** * Set forwarded insets on the task content. * Set forwarded insets on the task content. * * Loading core/java/android/window/VirtualDisplayTaskEmbedder.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -251,6 +251,14 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { return INVALID_DISPLAY; return INVALID_DISPLAY; } } @Override public VirtualDisplay getVirtualDisplay() { if (isInitialized()) { return mVirtualDisplay; } return null; } /** /** * Check if container is ready to launch and create {@link ActivityOptions} to target the * Check if container is ready to launch and create {@link ActivityOptions} to target the * virtual display. * virtual display. Loading packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +69 −9 Original line number Original line Diff line number Diff line Loading @@ -19,9 +19,15 @@ package com.android.systemui.bubbles; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.graphics.PixelFormat.TRANSPARENT; import static android.view.Display.INVALID_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.InsetsState.ITYPE_IME; import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.ViewRootImpl.sNewInsetsMode; import static android.view.ViewRootImpl.sNewInsetsMode; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_EXPANDED_VIEW; import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_EXPANDED_VIEW; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; Loading @@ -42,9 +48,12 @@ import android.graphics.Insets; import android.graphics.Point; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.ShapeDrawable; import android.hardware.display.VirtualDisplay; import android.os.Binder; import android.os.RemoteException; import android.os.RemoteException; import android.util.AttributeSet; import android.util.AttributeSet; import android.util.Log; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View; import android.view.WindowInsets; import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowManager; Loading @@ -62,6 +71,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; */ */ public class BubbleExpandedView extends LinearLayout { public class BubbleExpandedView extends LinearLayout { private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleExpandedView" : TAG_BUBBLES; private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleExpandedView" : TAG_BUBBLES; private static final String WINDOW_TITLE = "ImeInsetsWindowWithoutContent"; private enum ActivityViewStatus { private enum ActivityViewStatus { // ActivityView is being initialized, cannot start an activity yet. // ActivityView is being initialized, cannot start an activity yet. Loading Loading @@ -107,6 +117,9 @@ public class BubbleExpandedView extends LinearLayout { private WindowManager mWindowManager; private WindowManager mWindowManager; private BubbleStackView mStackView; private BubbleStackView mStackView; private View mVirtualImeView; private WindowManager mVirtualDisplayWindowManager; private boolean mImeShowing = false; private ActivityView.StateCallback mStateCallback = new ActivityView.StateCallback() { private ActivityView.StateCallback mStateCallback = new ActivityView.StateCallback() { @Override @Override Loading Loading @@ -317,11 +330,8 @@ public class BubbleExpandedView extends LinearLayout { mKeyboardVisible = false; mKeyboardVisible = false; mNeedsNewHeight = false; mNeedsNewHeight = false; if (mActivityView != null) { if (mActivityView != null) { // TODO: Temporary hack to offset the view until we can properly inset Bubbles again. if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { mStackView.animate() setImeWindowToDisplay(0, 0); .setDuration(100) .translationY(0); } else { } else { mActivityView.setForwardedInsets(Insets.of(0, 0, 0, 0)); mActivityView.setForwardedInsets(Insets.of(0, 0, 0, 0)); } } Loading Loading @@ -365,18 +375,61 @@ public class BubbleExpandedView extends LinearLayout { : 0); : 0); final int insetsBottom = Math.max(activityViewBottom - keyboardTop, 0); final int insetsBottom = Math.max(activityViewBottom - keyboardTop, 0); // TODO: Temporary hack to offset the view until we can properly inset Bubbles again. if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { mStackView.animate() setImeWindowToDisplay(getWidth(), insetsBottom); .setDuration(100) .translationY(-insetsBottom) .withEndAction(() -> mActivityView.onLocationChanged()); } else { } else { mActivityView.setForwardedInsets(Insets.of(0, 0, 0, insetsBottom)); mActivityView.setForwardedInsets(Insets.of(0, 0, 0, insetsBottom)); } } } } } } private void setImeWindowToDisplay(int w, int h) { if (getVirtualDisplayId() == INVALID_DISPLAY) { return; } if (h == 0 || w == 0) { if (mImeShowing) { mVirtualImeView.setVisibility(GONE); mImeShowing = false; } return; } final Context virtualDisplayContext = mContext.createDisplayContext( getVirtualDisplay().getDisplay()); if (mVirtualDisplayWindowManager == null) { mVirtualDisplayWindowManager = (WindowManager) virtualDisplayContext.getSystemService(Context.WINDOW_SERVICE); } if (mVirtualImeView == null) { mVirtualImeView = new View(virtualDisplayContext); mVirtualImeView.setVisibility(VISIBLE); mVirtualDisplayWindowManager.addView(mVirtualImeView, getVirtualImeViewAttrs(w, h)); } else { mVirtualDisplayWindowManager.updateViewLayout(mVirtualImeView, getVirtualImeViewAttrs(w, h)); mVirtualImeView.setVisibility(VISIBLE); } mImeShowing = true; } private WindowManager.LayoutParams getVirtualImeViewAttrs(int w, int h) { // To use TYPE_NAVIGATION_BAR_PANEL instead of TYPE_IME_BAR to bypass the IME window type // token check when adding the window. final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(w, h, TYPE_NAVIGATION_BAR_PANEL, FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE, TRANSPARENT); attrs.gravity = Gravity.BOTTOM; attrs.setTitle(WINDOW_TITLE); attrs.token = new Binder(); attrs.providesInsetsTypes = new int[]{ITYPE_IME}; attrs.alpha = 0.0f; return attrs; } void setStackView(BubbleStackView stackView) { void setStackView(BubbleStackView stackView) { mStackView = stackView; mStackView = stackView; } } Loading Loading @@ -570,4 +623,11 @@ public class BubbleExpandedView extends LinearLayout { } } return INVALID_DISPLAY; return INVALID_DISPLAY; } } private VirtualDisplay getVirtualDisplay() { if (usingActivityView()) { return mActivityView.getVirtualDisplay(); } return null; } } } services/core/java/com/android/server/wm/DisplayContent.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -5640,6 +5640,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo Slog.w(TAG, "Failed to deliver showInsets", e); Slog.w(TAG, "Failed to deliver showInsets", e); } } } } @Override public boolean isClientControlled() { return false; } } } /** /** Loading Loading
core/java/android/app/ActivityView.java +9 −0 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region; import android.hardware.display.VirtualDisplay; import android.os.Bundle; import android.os.Bundle; import android.os.UserHandle; import android.os.UserHandle; import android.util.AttributeSet; import android.util.AttributeSet; Loading Loading @@ -443,6 +444,14 @@ public class ActivityView extends ViewGroup implements android.window.TaskEmbedd return mTaskEmbedder.getDisplayId(); return mTaskEmbedder.getDisplayId(); } } /** * @hide * @return virtual display. */ public VirtualDisplay getVirtualDisplay() { return mTaskEmbedder.getVirtualDisplay(); } /** /** * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the * Injects a pair of down/up key events with keycode {@link KeyEvent#KEYCODE_BACK} to the * virtual display. * virtual display. Loading
core/java/android/window/TaskEmbedder.java +5 −3 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.ActivityOptions; import android.app.ActivityTaskManager; import android.app.ActivityTaskManager; import android.app.ActivityView; import android.app.IActivityTaskManager; import android.app.IActivityTaskManager; import android.app.PendingIntent; import android.app.PendingIntent; import android.content.ComponentName; import android.content.ComponentName; Loading @@ -36,9 +35,8 @@ import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region; import android.os.RemoteException; import android.hardware.display.VirtualDisplay; import android.os.UserHandle; import android.os.UserHandle; import android.util.Log; import android.view.IWindow; import android.view.IWindow; import android.view.IWindowManager; import android.view.IWindowManager; import android.view.KeyEvent; import android.view.KeyEvent; Loading Loading @@ -256,6 +254,10 @@ public abstract class TaskEmbedder { return INVALID_DISPLAY; return INVALID_DISPLAY; } } public VirtualDisplay getVirtualDisplay() { return null; } /** /** * Set forwarded insets on the task content. * Set forwarded insets on the task content. * * Loading
core/java/android/window/VirtualDisplayTaskEmbedder.java +8 −0 Original line number Original line Diff line number Diff line Loading @@ -251,6 +251,14 @@ public class VirtualDisplayTaskEmbedder extends TaskEmbedder { return INVALID_DISPLAY; return INVALID_DISPLAY; } } @Override public VirtualDisplay getVirtualDisplay() { if (isInitialized()) { return mVirtualDisplay; } return null; } /** /** * Check if container is ready to launch and create {@link ActivityOptions} to target the * Check if container is ready to launch and create {@link ActivityOptions} to target the * virtual display. * virtual display. Loading
packages/SystemUI/src/com/android/systemui/bubbles/BubbleExpandedView.java +69 −9 Original line number Original line Diff line number Diff line Loading @@ -19,9 +19,15 @@ package com.android.systemui.bubbles; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT; import static android.graphics.PixelFormat.TRANSPARENT; import static android.view.Display.INVALID_DISPLAY; import static android.view.Display.INVALID_DISPLAY; import static android.view.InsetsState.ITYPE_IME; import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.ViewRootImpl.sNewInsetsMode; import static android.view.ViewRootImpl.sNewInsetsMode; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_EXPANDED_VIEW; import static com.android.systemui.bubbles.BubbleDebugConfig.DEBUG_BUBBLE_EXPANDED_VIEW; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.systemui.bubbles.BubbleDebugConfig.TAG_BUBBLES; Loading @@ -42,9 +48,12 @@ import android.graphics.Insets; import android.graphics.Point; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Rect; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.ShapeDrawable; import android.hardware.display.VirtualDisplay; import android.os.Binder; import android.os.RemoteException; import android.os.RemoteException; import android.util.AttributeSet; import android.util.AttributeSet; import android.util.Log; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.View; import android.view.WindowInsets; import android.view.WindowInsets; import android.view.WindowManager; import android.view.WindowManager; Loading @@ -62,6 +71,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry; */ */ public class BubbleExpandedView extends LinearLayout { public class BubbleExpandedView extends LinearLayout { private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleExpandedView" : TAG_BUBBLES; private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleExpandedView" : TAG_BUBBLES; private static final String WINDOW_TITLE = "ImeInsetsWindowWithoutContent"; private enum ActivityViewStatus { private enum ActivityViewStatus { // ActivityView is being initialized, cannot start an activity yet. // ActivityView is being initialized, cannot start an activity yet. Loading Loading @@ -107,6 +117,9 @@ public class BubbleExpandedView extends LinearLayout { private WindowManager mWindowManager; private WindowManager mWindowManager; private BubbleStackView mStackView; private BubbleStackView mStackView; private View mVirtualImeView; private WindowManager mVirtualDisplayWindowManager; private boolean mImeShowing = false; private ActivityView.StateCallback mStateCallback = new ActivityView.StateCallback() { private ActivityView.StateCallback mStateCallback = new ActivityView.StateCallback() { @Override @Override Loading Loading @@ -317,11 +330,8 @@ public class BubbleExpandedView extends LinearLayout { mKeyboardVisible = false; mKeyboardVisible = false; mNeedsNewHeight = false; mNeedsNewHeight = false; if (mActivityView != null) { if (mActivityView != null) { // TODO: Temporary hack to offset the view until we can properly inset Bubbles again. if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { mStackView.animate() setImeWindowToDisplay(0, 0); .setDuration(100) .translationY(0); } else { } else { mActivityView.setForwardedInsets(Insets.of(0, 0, 0, 0)); mActivityView.setForwardedInsets(Insets.of(0, 0, 0, 0)); } } Loading Loading @@ -365,18 +375,61 @@ public class BubbleExpandedView extends LinearLayout { : 0); : 0); final int insetsBottom = Math.max(activityViewBottom - keyboardTop, 0); final int insetsBottom = Math.max(activityViewBottom - keyboardTop, 0); // TODO: Temporary hack to offset the view until we can properly inset Bubbles again. if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { if (sNewInsetsMode == NEW_INSETS_MODE_FULL) { mStackView.animate() setImeWindowToDisplay(getWidth(), insetsBottom); .setDuration(100) .translationY(-insetsBottom) .withEndAction(() -> mActivityView.onLocationChanged()); } else { } else { mActivityView.setForwardedInsets(Insets.of(0, 0, 0, insetsBottom)); mActivityView.setForwardedInsets(Insets.of(0, 0, 0, insetsBottom)); } } } } } } private void setImeWindowToDisplay(int w, int h) { if (getVirtualDisplayId() == INVALID_DISPLAY) { return; } if (h == 0 || w == 0) { if (mImeShowing) { mVirtualImeView.setVisibility(GONE); mImeShowing = false; } return; } final Context virtualDisplayContext = mContext.createDisplayContext( getVirtualDisplay().getDisplay()); if (mVirtualDisplayWindowManager == null) { mVirtualDisplayWindowManager = (WindowManager) virtualDisplayContext.getSystemService(Context.WINDOW_SERVICE); } if (mVirtualImeView == null) { mVirtualImeView = new View(virtualDisplayContext); mVirtualImeView.setVisibility(VISIBLE); mVirtualDisplayWindowManager.addView(mVirtualImeView, getVirtualImeViewAttrs(w, h)); } else { mVirtualDisplayWindowManager.updateViewLayout(mVirtualImeView, getVirtualImeViewAttrs(w, h)); mVirtualImeView.setVisibility(VISIBLE); } mImeShowing = true; } private WindowManager.LayoutParams getVirtualImeViewAttrs(int w, int h) { // To use TYPE_NAVIGATION_BAR_PANEL instead of TYPE_IME_BAR to bypass the IME window type // token check when adding the window. final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(w, h, TYPE_NAVIGATION_BAR_PANEL, FLAG_LAYOUT_NO_LIMITS | FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCHABLE, TRANSPARENT); attrs.gravity = Gravity.BOTTOM; attrs.setTitle(WINDOW_TITLE); attrs.token = new Binder(); attrs.providesInsetsTypes = new int[]{ITYPE_IME}; attrs.alpha = 0.0f; return attrs; } void setStackView(BubbleStackView stackView) { void setStackView(BubbleStackView stackView) { mStackView = stackView; mStackView = stackView; } } Loading Loading @@ -570,4 +623,11 @@ public class BubbleExpandedView extends LinearLayout { } } return INVALID_DISPLAY; return INVALID_DISPLAY; } } private VirtualDisplay getVirtualDisplay() { if (usingActivityView()) { return mActivityView.getVirtualDisplay(); } return null; } } }
services/core/java/com/android/server/wm/DisplayContent.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -5640,6 +5640,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo Slog.w(TAG, "Failed to deliver showInsets", e); Slog.w(TAG, "Failed to deliver showInsets", e); } } } } @Override public boolean isClientControlled() { return false; } } } /** /** Loading