Loading libs/WindowManager/Shell/res/values-land/styles.xml +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ </style> <style name="DockedDividerHandle"> <item name="android:layout_gravity">center_vertical</item> <item name="android:layout_gravity">center</item> <item name="android:layout_width">48dp</item> <item name="android:layout_height">96dp</item> </style> Loading libs/WindowManager/Shell/res/values/styles.xml +1 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ </style> <style name="DockedDividerHandle"> <item name="android:layout_gravity">center_horizontal</item> <item name="android:layout_gravity">center</item> <item name="android:layout_width">96dp</item> <item name="android:layout_height">48dp</item> </style> Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java +31 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.wm.shell.common.split; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Rect; Loading Loading @@ -57,6 +59,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); private SplitLayout mSplitLayout; private SplitWindowManager mSplitWindowManager; private SurfaceControlViewHost mViewHost; private DividerHandleView mHandle; private View mBackground; Loading @@ -67,6 +70,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { private int mStartPos; private GestureDetector mDoubleTapDetector; private boolean mInteractive; private boolean mSetTouchRegion = true; /** * Tracks divider bar visible bounds in screen-based coordination. Used to calculate with Loading @@ -93,6 +97,18 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { } }; private AnimatorListenerAdapter mAnimatorListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mSetTouchRegion = true; } @Override public void onAnimationCancel(Animator animation) { mSetTouchRegion = true; } }; public DividerView(@NonNull Context context) { super(context); } Loading @@ -114,9 +130,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { /** Sets up essential dependencies of the divider bar. */ public void setup( SplitLayout layout, SplitWindowManager splitWindowManager, SurfaceControlViewHost viewHost, InsetsState insetsState) { mSplitLayout = layout; mSplitWindowManager = splitWindowManager; mViewHost = viewHost; mDividerBounds.set(layout.getDividerBounds()); onInsetsChanged(insetsState, false /* animate */); Loading @@ -138,9 +156,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { DIVIDER_HEIGHT_PROPERTY, mDividerBounds.height(), mTempRect.height()); animator.setInterpolator(InsetsController.RESIZE_INTERPOLATOR); animator.setDuration(InsetsController.ANIMATION_DURATION_RESIZE); animator.addListener(mAnimatorListener); animator.start(); } else { DIVIDER_HEIGHT_PROPERTY.set(this, mTempRect.height()); mSetTouchRegion = true; } mDividerBounds.set(mTempRect); } Loading @@ -161,6 +181,17 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { setOnTouchListener(this); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (mSetTouchRegion) { mTempRect.set(mHandle.getLeft(), mHandle.getTop(), mHandle.getRight(), mHandle.getBottom()); mSplitWindowManager.setTouchRegion(mTempRect); mSetTouchRegion = false; } } @Override public boolean onTouch(View v, MotionEvent event) { if (mSplitLayout == null || !mInteractive) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +23 −5 Original line number Diff line number Diff line Loading @@ -40,8 +40,10 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.view.Display; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.RoundedCorner; import android.view.SurfaceControl; import android.view.WindowInsets; import android.view.WindowManager; Loading @@ -53,6 +55,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DockedDividerUtils; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.animation.Interpolators; import com.android.wm.shell.common.DisplayImeController; Loading Loading @@ -133,17 +136,32 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mDismissingEffectPolicy = new DismissingEffectPolicy(applyDismissingParallax); final Resources resources = context.getResources(); mDividerWindowWidth = resources.getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_thickness); mDividerInsets = resources.getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_insets); mDividerSize = mDividerWindowWidth - mDividerInsets * 2; mDividerSize = resources.getDimensionPixelSize(R.dimen.split_divider_bar_width); mDividerInsets = getDividerInsets(resources, context.getDisplay()); mDividerWindowWidth = mDividerSize + 2 * mDividerInsets; mRootBounds.set(configuration.windowConfiguration.getBounds()); mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); resetDividerPosition(); } private int getDividerInsets(Resources resources, Display display) { final int dividerInset = resources.getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_insets); int radius = 0; RoundedCorner corner = display.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; corner = display.getRoundedCorner(RoundedCorner.POSITION_TOP_RIGHT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; corner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; corner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; return Math.max(dividerInset, radius); } /** Gets bounds of the primary split. */ public Rect getBounds1() { return new Rect(mBounds1); Loading libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java +6 −5 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Region; import android.os.Binder; import android.os.IBinder; import android.view.IWindow; import android.view.InsetsState; import android.view.LayoutInflater; Loading @@ -41,6 +40,7 @@ import android.view.SurfaceSession; import android.view.WindowManager; import android.view.WindowlessWindowManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.R; Loading Loading @@ -71,9 +71,10 @@ public final class SplitWindowManager extends WindowlessWindowManager { mWindowName = windowName; } @Override public void setTouchRegion(IBinder window, Region region) { super.setTouchRegion(window, region); void setTouchRegion(@NonNull Rect region) { if (mViewHost != null) { setTouchRegion(mViewHost.getWindowToken().asBinder(), new Region(region)); } } @Override Loading Loading @@ -122,7 +123,7 @@ public final class SplitWindowManager extends WindowlessWindowManager { lp.setTitle(mWindowName); lp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | PRIVATE_FLAG_TRUSTED_OVERLAY; mViewHost.setView(mDividerView, lp); mDividerView.setup(splitLayout, mViewHost, insetsState); mDividerView.setup(splitLayout, this, mViewHost, insetsState); } /** Loading Loading
libs/WindowManager/Shell/res/values-land/styles.xml +1 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ </style> <style name="DockedDividerHandle"> <item name="android:layout_gravity">center_vertical</item> <item name="android:layout_gravity">center</item> <item name="android:layout_width">48dp</item> <item name="android:layout_height">96dp</item> </style> Loading
libs/WindowManager/Shell/res/values/styles.xml +1 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ </style> <style name="DockedDividerHandle"> <item name="android:layout_gravity">center_horizontal</item> <item name="android:layout_gravity">center</item> <item name="android:layout_width">96dp</item> <item name="android:layout_height">48dp</item> </style> Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java +31 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.wm.shell.common.split; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Rect; Loading Loading @@ -57,6 +59,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); private SplitLayout mSplitLayout; private SplitWindowManager mSplitWindowManager; private SurfaceControlViewHost mViewHost; private DividerHandleView mHandle; private View mBackground; Loading @@ -67,6 +70,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { private int mStartPos; private GestureDetector mDoubleTapDetector; private boolean mInteractive; private boolean mSetTouchRegion = true; /** * Tracks divider bar visible bounds in screen-based coordination. Used to calculate with Loading @@ -93,6 +97,18 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { } }; private AnimatorListenerAdapter mAnimatorListener = new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mSetTouchRegion = true; } @Override public void onAnimationCancel(Animator animation) { mSetTouchRegion = true; } }; public DividerView(@NonNull Context context) { super(context); } Loading @@ -114,9 +130,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { /** Sets up essential dependencies of the divider bar. */ public void setup( SplitLayout layout, SplitWindowManager splitWindowManager, SurfaceControlViewHost viewHost, InsetsState insetsState) { mSplitLayout = layout; mSplitWindowManager = splitWindowManager; mViewHost = viewHost; mDividerBounds.set(layout.getDividerBounds()); onInsetsChanged(insetsState, false /* animate */); Loading @@ -138,9 +156,11 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { DIVIDER_HEIGHT_PROPERTY, mDividerBounds.height(), mTempRect.height()); animator.setInterpolator(InsetsController.RESIZE_INTERPOLATOR); animator.setDuration(InsetsController.ANIMATION_DURATION_RESIZE); animator.addListener(mAnimatorListener); animator.start(); } else { DIVIDER_HEIGHT_PROPERTY.set(this, mTempRect.height()); mSetTouchRegion = true; } mDividerBounds.set(mTempRect); } Loading @@ -161,6 +181,17 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { setOnTouchListener(this); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (mSetTouchRegion) { mTempRect.set(mHandle.getLeft(), mHandle.getTop(), mHandle.getRight(), mHandle.getBottom()); mSplitWindowManager.setTouchRegion(mTempRect); mSetTouchRegion = false; } } @Override public boolean onTouch(View v, MotionEvent event) { if (mSplitLayout == null || !mInteractive) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java +23 −5 Original line number Diff line number Diff line Loading @@ -40,8 +40,10 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; import android.graphics.Rect; import android.view.Display; import android.view.InsetsSourceControl; import android.view.InsetsState; import android.view.RoundedCorner; import android.view.SurfaceControl; import android.view.WindowInsets; import android.view.WindowManager; Loading @@ -53,6 +55,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DockedDividerUtils; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.animation.Interpolators; import com.android.wm.shell.common.DisplayImeController; Loading Loading @@ -133,17 +136,32 @@ public final class SplitLayout implements DisplayInsetsController.OnInsetsChange mDismissingEffectPolicy = new DismissingEffectPolicy(applyDismissingParallax); final Resources resources = context.getResources(); mDividerWindowWidth = resources.getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_thickness); mDividerInsets = resources.getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_insets); mDividerSize = mDividerWindowWidth - mDividerInsets * 2; mDividerSize = resources.getDimensionPixelSize(R.dimen.split_divider_bar_width); mDividerInsets = getDividerInsets(resources, context.getDisplay()); mDividerWindowWidth = mDividerSize + 2 * mDividerInsets; mRootBounds.set(configuration.windowConfiguration.getBounds()); mDividerSnapAlgorithm = getSnapAlgorithm(mContext, mRootBounds); resetDividerPosition(); } private int getDividerInsets(Resources resources, Display display) { final int dividerInset = resources.getDimensionPixelSize( com.android.internal.R.dimen.docked_stack_divider_insets); int radius = 0; RoundedCorner corner = display.getRoundedCorner(RoundedCorner.POSITION_TOP_LEFT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; corner = display.getRoundedCorner(RoundedCorner.POSITION_TOP_RIGHT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; corner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; corner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT); radius = corner != null ? Math.max(radius, corner.getRadius()) : radius; return Math.max(dividerInset, radius); } /** Gets bounds of the primary split. */ public Rect getBounds1() { return new Rect(mBounds1); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitWindowManager.java +6 −5 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Region; import android.os.Binder; import android.os.IBinder; import android.view.IWindow; import android.view.InsetsState; import android.view.LayoutInflater; Loading @@ -41,6 +40,7 @@ import android.view.SurfaceSession; import android.view.WindowManager; import android.view.WindowlessWindowManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.wm.shell.R; Loading Loading @@ -71,9 +71,10 @@ public final class SplitWindowManager extends WindowlessWindowManager { mWindowName = windowName; } @Override public void setTouchRegion(IBinder window, Region region) { super.setTouchRegion(window, region); void setTouchRegion(@NonNull Rect region) { if (mViewHost != null) { setTouchRegion(mViewHost.getWindowToken().asBinder(), new Region(region)); } } @Override Loading Loading @@ -122,7 +123,7 @@ public final class SplitWindowManager extends WindowlessWindowManager { lp.setTitle(mWindowName); lp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | PRIVATE_FLAG_TRUSTED_OVERLAY; mViewHost.setView(mDividerView, lp); mDividerView.setup(splitLayout, mViewHost, insetsState); mDividerView.setup(splitLayout, this, mViewHost, insetsState); } /** Loading