diff --git a/res/layout/all_apps_content.xml b/res/layout/all_apps_content.xml index b33029fcd1..773ab8d4d3 100644 --- a/res/layout/all_apps_content.xml +++ b/res/layout/all_apps_content.xml @@ -44,6 +44,13 @@ + + diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java index e4e56a904e..5c55b53e2a 100644 --- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java @@ -282,7 +282,7 @@ public class ActivityAllAppsContainerView false); @@ -744,7 +757,7 @@ public abstract class BaseAllAppsContainerView workspace and determines if window inset - * should be applied.. ex) the work mode switch. - */ - public void setApplyWindowInset(boolean shouldApplyWindowInset) { - if (mWorkManager.getWorkModeSwitch() != null) { - mWorkManager.getWorkModeSwitch().setApplyWindowInset(shouldApplyWindowInset); - } - } - protected void onInitializeRecyclerView(RecyclerView rv) { rv.addOnScrollListener(mScrollListener); } diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java index 1cbb0f9481..7fd3752216 100644 --- a/src/com/android/launcher3/allapps/FloatingHeaderView.java +++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java @@ -364,6 +364,10 @@ public class FloatingHeaderView extends LinearLayout implements onHeightUpdated(); } + public int getClipTop() { + return mHeaderClip.top; + } + public void reset(boolean animate) { if (mAnimator.isStarted()) { mAnimator.cancel(); diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java index 2272cdc3ef..aadd0b52de 100644 --- a/src/com/android/launcher3/allapps/WorkModeSwitch.java +++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java @@ -19,7 +19,6 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.getTabWidth; import android.content.Context; -import android.graphics.Insets; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; @@ -27,6 +26,9 @@ import android.view.ViewGroup.MarginLayoutParams; import android.view.WindowInsets; import android.widget.Button; +import androidx.core.graphics.Insets; +import androidx.core.view.WindowInsetsCompat; + import com.android.launcher3.DeviceProfile; import com.android.launcher3.Insettable; import com.android.launcher3.R; @@ -49,10 +51,10 @@ public class WorkModeSwitch extends Button implements Insettable, View.OnClickLi private static final int FLAG_PROFILE_TOGGLE_ONGOING = 1 << 3; private final Rect mInsets = new Rect(); + private final Rect mImeInsets = new Rect(); private int mFlags; private boolean mWorkEnabled; private boolean mOnWorkTab; - private boolean mApplyWindowInset; public WorkModeSwitch(Context context) { this(context, null, 0); @@ -89,12 +91,12 @@ public class WorkModeSwitch extends Button implements Insettable, View.OnClickLi @Override public void setInsets(Rect insets) { mInsets.set(insets); + updateTranslationY(); MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams(); if (lp != null) { int bottomMargin = getResources().getDimensionPixelSize(R.dimen.work_fab_margin_bottom); DeviceProfile dp = ActivityContext.lookupContext(getContext()).getDeviceProfile(); if (FeatureFlags.ENABLE_FLOATING_SEARCH_BAR.get()) { - bottomMargin <<= 1; // Double margin to add space above search bar. bottomMargin += dp.hotseatQsbHeight; } @@ -154,7 +156,6 @@ public class WorkModeSwitch extends Button implements Insettable, View.OnClickLi private void updateVisibility() { clearAnimation(); - onApplyWindowInsets(getRootWindowInsets()); if (mWorkEnabled && mOnWorkTab) { setFlag(FLAG_FADE_ONGOING); setVisibility(VISIBLE); @@ -170,16 +171,29 @@ public class WorkModeSwitch extends Button implements Insettable, View.OnClickLi @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { - if (!Utilities.ATLEAST_R || !mApplyWindowInset) { - return insets; - } - if (insets.isVisible(WindowInsets.Type.ime())) { - Insets keyboardInsets = insets.getInsets(WindowInsets.Type.ime()); - setTranslationY(mInsets.bottom - keyboardInsets.bottom); + WindowInsetsCompat windowInsetsCompat = + WindowInsetsCompat.toWindowInsetsCompat(insets, this); + if (windowInsetsCompat.isVisible(WindowInsetsCompat.Type.ime())) { + setInsets(mImeInsets, windowInsetsCompat.getInsets(WindowInsetsCompat.Type.ime())); } else { - setTranslationY(0); + mImeInsets.setEmpty(); } - return insets; + updateTranslationY(); + return super.onApplyWindowInsets(insets); + } + + private void updateTranslationY() { + setTranslationY(-mImeInsets.bottom); + } + + @Override + public void setTranslationY(float translationY) { + // Always translate at least enough for nav bar insets. + super.setTranslationY(Math.min(translationY, -mInsets.bottom)); + } + + private void setInsets(Rect rect, Insets insets) { + rect.set(insets.left, insets.top, insets.right, insets.bottom); } @Override @@ -199,8 +213,4 @@ public class WorkModeSwitch extends Button implements Insettable, View.OnClickLi private void removeFlag(int flag) { mFlags &= ~flag; } - - public void setApplyWindowInset(boolean applyWindowInset){ - mApplyWindowInset = applyWindowInset; - } } diff --git a/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java b/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java index 9d96365acc..3863dc1962 100644 --- a/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java +++ b/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java @@ -53,10 +53,21 @@ public class KeyboardInsetAnimationCallback extends WindowInsetsAnimation.Callba mView.setTranslationY(mInitialTranslation); return windowInsets; } - float progress = list.get(0).getInterpolatedFraction(); + WindowInsetsAnimation animation = list.get(0); - mView.setTranslationY( - Utilities.mapRange(progress, mInitialTranslation, mTerminalTranslation)); + if (animation.getDurationMillis() > -1) { + float progress = animation.getInterpolatedFraction(); + mView.setTranslationY( + Utilities.mapRange(progress, mInitialTranslation, mTerminalTranslation)); + } else { + // Manually controlled animation: Set translation to keyboard height. + int translationY = -windowInsets.getInsets(WindowInsets.Type.ime()).bottom; + if (mView.getParent() instanceof View) { + // Offset any translation of the parent (e.g. All Apps parallax). + translationY -= ((View) mView.getParent()).getTranslationY(); + } + mView.setTranslationY(translationY); + } return windowInsets; } @@ -73,6 +84,7 @@ public class KeyboardInsetAnimationCallback extends WindowInsetsAnimation.Callba @Override public void onEnd(WindowInsetsAnimation animation) { + mView.setTranslationY(mTerminalTranslation); if (mView instanceof KeyboardInsetListener) { ((KeyboardInsetListener) mView).onTranslationEnd(); }