Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef81b5c6 authored by Brandon Dayauon's avatar Brandon Dayauon Committed by Android (Google) Code Review
Browse files

Merge "Remove enableLayoutTransitions for private space." into main

parents e6b43c86 0e564037
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@
            android:layout_height="@dimen/ps_header_image_height"
            android:background="@drawable/ps_settings_background"
            android:src="@drawable/ic_ps_settings"
            android:visibility="gone"
            android:contentDescription="@string/ps_container_settings" />
        <LinearLayout
            android:id="@+id/ps_lock_unlock_button"
@@ -71,7 +72,9 @@
                android:textColor="@color/material_color_on_primary_fixed"
                android:textSize="14sp"
                android:text="@string/ps_container_lock_title"
                android:maxLines="1"
                android:visibility="gone"
                android:alpha="0"
                style="@style/TextHeadline"/>
        </LinearLayout>
    </LinearLayout>
+100 −75
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ import static com.android.launcher3.util.SettingsCache.PRIVATE_SPACE_HIDE_WHEN_L
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.LayoutTransition;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
@@ -92,14 +91,14 @@ import java.util.function.Predicate;
public class PrivateProfileManager extends UserProfileManager {

    private static final String TAG = "PrivateProfileManager";
    private static final int EXPAND_COLLAPSE_DURATION = 800;
    private static final int EXPAND_COLLAPSE_DURATION = 400;
    private static final int SETTINGS_OPACITY_DURATION = 400;
    private static final int TEXT_UNLOCK_OPACITY_DURATION = 300;
    private static final int TEXT_LOCK_OPACITY_DURATION = 50;
    private static final int APP_OPACITY_DURATION = 400;
    private static final int MASK_VIEW_DURATION = 200;
    private static final int APP_OPACITY_DELAY = 400;
    private static final int SETTINGS_AND_LOCK_GROUP_TRANSITION_DELAY = 400;
    private static final int PILL_TRANSITION_DELAY = 400;
    private static final int SETTINGS_OPACITY_DELAY = 400;
    private static final int LOCK_TEXT_OPACITY_DELAY = 500;
    private static final int MASK_VIEW_DELAY = 400;
@@ -109,6 +108,8 @@ public class PrivateProfileManager extends UserProfileManager {
    private final Predicate<UserHandle> mPrivateProfileMatcher;
    private final int mPsHeaderHeight;
    private final int mFloatingMaskViewCornerRadius;
    private final int mLockTextMarginStart;
    private final int mLockTextMarginEnd;
    private final RecyclerView.OnScrollListener mOnIdleScrollListener =
            new RecyclerView.OnScrollListener() {
        @Override
@@ -133,6 +134,11 @@ public class PrivateProfileManager extends UserProfileManager {
    private Runnable mOnPSHeaderAdded;
    @Nullable
    private RelativeLayout mPSHeader;
    @Nullable
    private TextView mLockText;
    @Nullable
    private PrivateSpaceSettingsButton mPrivateSpaceSettingsButton;
    @Nullable
    private ConstraintLayout mFloatingMaskView;
    private final String mLockedStateContentDesc;
    private final String mUnLockedStateContentDesc;
@@ -155,6 +161,10 @@ public class PrivateProfileManager extends UserProfileManager {
                .getString(R.string.ps_container_unlock_button_content_description);
        mFloatingMaskViewCornerRadius = mAllApps.getContext().getResources().getDimensionPixelSize(
                R.dimen.ps_floating_mask_corner_radius);
        mLockTextMarginStart = mAllApps.getContext().getResources().getDimensionPixelSize(
                R.dimen.ps_lock_icon_text_margin_start_expanded);
        mLockTextMarginEnd = mAllApps.getContext().getResources().getDimensionPixelSize(
                R.dimen.ps_lock_icon_text_margin_end_expanded);
    }

    /** Adds Private Space Header to the layout. */
@@ -354,20 +364,11 @@ public class PrivateProfileManager extends UserProfileManager {
    /** Add Private Space Header view elements based upon {@link UserProfileState} */
    public void bindPrivateSpaceHeaderViewElements(RelativeLayout parent) {
        mPSHeader = parent;
        updateView();
        if (mOnPSHeaderAdded != null) {
            MAIN_EXECUTOR.execute(mOnPSHeaderAdded);
            mOnPSHeaderAdded = null;
        }
        // Set the transition duration for the settings and lock button to animate.
        ViewGroup settingAndLockGroup = mPSHeader.findViewById(R.id.settingsAndLockGroup);
        if (mReadyToAnimate) {
            enableLayoutTransition(settingAndLockGroup);
        } else {
            // Ensure any unwanted animations to not happen.
            settingAndLockGroup.setLayoutTransition(null);
            Log.d(TAG, "bindPrivateSpaceHeaderViewElements: removing transitions ");
        }
        updateView();
    }

    /** Update the states of the views that make up the header at the state it is called in. */
@@ -378,9 +379,10 @@ public class PrivateProfileManager extends UserProfileManager {
        mPSHeader.setAlpha(1);
        ViewGroup lockPill = mPSHeader.findViewById(R.id.ps_lock_unlock_button);
        assert lockPill != null;
        TextView lockText = lockPill.findViewById(R.id.lock_text);
        PrivateSpaceSettingsButton settingsButton = mPSHeader.findViewById(R.id.ps_settings_button);
        assert settingsButton != null;
        mLockText = lockPill.findViewById(R.id.lock_text);
        assert mLockText != null;
        mPrivateSpaceSettingsButton = mPSHeader.findViewById(R.id.ps_settings_button);
        assert mPrivateSpaceSettingsButton != null;
        //Add image for private space transitioning view
        ImageView transitionView = mPSHeader.findViewById(R.id.ps_transition_image);
        assert transitionView != null;
@@ -391,12 +393,18 @@ public class PrivateProfileManager extends UserProfileManager {
                // Remove header from accessibility target when enabled.
                mPSHeader.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);

                lockText.setVisibility(VISIBLE);
                if (!mReadyToAnimate) {
                    // Don't set visibilities when animating as the animation will handle it.
                    mLockText.setVisibility(VISIBLE);
                    mLockText.setAlpha(1);
                    mLockText.setHorizontallyScrolling(false);
                    mPrivateSpaceSettingsButton.setVisibility(
                            isPrivateSpaceSettingsAvailable() ? VISIBLE : GONE);
                }
                lockPill.setVisibility(VISIBLE);
                lockPill.setOnClickListener(view -> lockingAction(/* lock */ true));
                lockPill.setContentDescription(mUnLockedStateContentDesc);

                settingsButton.setVisibility(isPrivateSpaceSettingsAvailable() ? VISIBLE : GONE);
                transitionView.setVisibility(GONE);
            }
            case STATE_DISABLED -> {
@@ -406,12 +414,14 @@ public class PrivateProfileManager extends UserProfileManager {
                mPSHeader.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
                mPSHeader.setContentDescription(mLockedStateContentDesc);

                lockText.setVisibility(GONE);
                mLockText.setVisibility(GONE);
                mLockText.setAlpha(0);
                mLockText.setHorizontallyScrolling(false);
                lockPill.setVisibility(VISIBLE);
                lockPill.setOnClickListener(view -> lockingAction(/* lock */ false));
                lockPill.setContentDescription(mLockedStateContentDesc);

                settingsButton.setVisibility(GONE);
                mPrivateSpaceSettingsButton.setVisibility(GONE);
                transitionView.setVisibility(GONE);
            }
            case STATE_TRANSITION -> {
@@ -585,6 +595,51 @@ public class PrivateProfileManager extends UserProfileManager {
        return alphaAnim;
    }

    private ValueAnimator animatePillTransition(boolean isExpanding) {
        if (mLockText == null) {
            return new ValueAnimator().setDuration(0);
        }
        mLockText.measure(0,0);
        int currentWidth = mLockText.getWidth();
        int fullWidth = mLockText.getMeasuredWidth();
        float from = isExpanding ? 0 : currentWidth;
        float to = isExpanding ? fullWidth : 0;
        ValueAnimator pillAnim = ObjectAnimator.ofFloat(from, to);
        pillAnim.setStartDelay(isExpanding ? PILL_TRANSITION_DELAY : 0);
        pillAnim.setDuration(EXPAND_COLLAPSE_DURATION);
        pillAnim.setInterpolator(Interpolators.STANDARD);
        pillAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float translation = (float) valueAnimator.getAnimatedValue();
                float translationFraction = translation / fullWidth;
                ViewGroup.MarginLayoutParams layoutParams =
                        (ViewGroup.MarginLayoutParams) mLockText.getLayoutParams();
                layoutParams.width = (int) translation;
                layoutParams.setMarginStart((int) (mLockTextMarginStart * translationFraction));
                layoutParams.setMarginEnd((int) (mLockTextMarginEnd * translationFraction));
                mLockText.setLayoutParams(layoutParams);
                mLockText.requestLayout();
            }
        });
        pillAnim.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animator) {
                if (!isExpanding) {
                    mLockText.setVisibility(GONE);
                }
                mLockText.setHorizontallyScrolling(false);
            }

            @Override
            public void onAnimationStart(Animator animator) {
                mLockText.setHorizontallyScrolling(true);
                mLockText.setVisibility(VISIBLE);
            }
        });
        return pillAnim;
    }

    /**
     * Using PropertySetter{@link PropertySetter}, we can update the view's attributes within an
     * animation. At the moment, collapsing, setting alpha changes, and animating the text is done
@@ -596,22 +651,12 @@ public class PrivateProfileManager extends UserProfileManager {
        }
        if (mPSHeader == null) {
            mOnPSHeaderAdded = () -> updatePrivateStateAnimator(expand);
            setAnimationRunning(false);
            // Set animation to true, because onBind will be called after this return where we want
            // the views to be updated accordingly so animation can happen.
            setAnimationRunning(true);
            return;
        }
        attachFloatingMaskView(expand);
        ViewGroup settingsAndLockGroup = mPSHeader.findViewById(R.id.settingsAndLockGroup);
        TextView lockText = mPSHeader.findViewById(R.id.lock_text);
        PrivateSpaceSettingsButton privateSpaceSettingsButton =
                mPSHeader.findViewById(R.id.ps_settings_button);
        if (settingsAndLockGroup.getLayoutTransition() == null) {
            // Set a new transition if the current ViewGroup does not already contain one as each
            // transition should only happen once when applied.
            enableLayoutTransition(settingsAndLockGroup);
        }
        settingsAndLockGroup.getLayoutTransition().setStartDelay(
                LayoutTransition.CHANGING,
                expand ? SETTINGS_AND_LOCK_GROUP_TRANSITION_DELAY : NO_DELAY);
        PropertySetter headerSetter = new AnimatedPropertySetter();
        headerSetter.add(updateSettingsGearAlpha(expand));
        headerSetter.add(updateLockTextAlpha(expand));
@@ -626,8 +671,6 @@ public class PrivateProfileManager extends UserProfileManager {
                                ? LAUNCHER_PRIVATE_SPACE_UNLOCK_ANIMATION_BEGIN
                                : LAUNCHER_PRIVATE_SPACE_LOCK_ANIMATION_BEGIN,
                        mAllApps.getActiveRecyclerView());
                // Animate the collapsing of the text at the same time while updating lock button.
                lockText.setVisibility(expand ? VISIBLE : GONE);
                setAnimationRunning(true);
            }

@@ -646,10 +689,10 @@ public class PrivateProfileManager extends UserProfileManager {
                            : LAUNCHER_PRIVATE_SPACE_LOCK_ANIMATION_END,
                    mAllApps.getActiveRecyclerView());
            Log.d(TAG, "updatePrivateStateAnimator: lockText visibility: "
                    + lockText.getVisibility() + " lockTextAlpha: " + lockText.getAlpha());
                    + mLockText.getVisibility() + " lockTextAlpha: " + mLockText.getAlpha());
            Log.d(TAG, "updatePrivateStateAnimator: settingsCog visibility: "
                    + privateSpaceSettingsButton.getVisibility()
                    + " settingsCogAlpha: " + privateSpaceSettingsButton.getAlpha());
                    + mPrivateSpaceSettingsButton.getVisibility()
                    + " settingsCogAlpha: " + mPrivateSpaceSettingsButton.getAlpha());
            if (!expand) {
                mAllApps.mAH.get(MAIN).mRecyclerView.removeItemDecoration(
                        mPrivateAppsSectionDecorator);
@@ -663,15 +706,19 @@ public class PrivateProfileManager extends UserProfileManager {
        }));
        if (expand) {
            animatorSet.playTogether(animateAlphaOfIcons(true),
                    animatePillTransition(true),
                    translateFloatingMaskView(false));
        } else {
            AnimatorSet parallelSet = new AnimatorSet();
            parallelSet.playTogether(animateAlphaOfIcons(false),
                    animatePillTransition(false));
            if (isPrivateSpaceHidden()) {
                animatorSet.playSequentially(animateAlphaOfIcons(false),
                animatorSet.playSequentially(parallelSet,
                        animateAlphaOfPrivateSpaceContainer(),
                        animateCollapseAnimation());
            } else {
                animatorSet.playSequentially(translateFloatingMaskView(true),
                        animateAlphaOfIcons(false),
                        parallelSet,
                        animateCollapseAnimation());
            }
        }
@@ -702,7 +749,7 @@ public class PrivateProfileManager extends UserProfileManager {
    /** Fades out the private space container. */
    private ValueAnimator translateFloatingMaskView(boolean animateIn) {
        if (!Flags.privateSpaceAddFloatingMaskView() || mFloatingMaskView == null) {
            return new ValueAnimator();
            return new ValueAnimator().setDuration(0);
        }
        // Translate base on the height amount. Translates out on expand and in on collapse.
        float floatingMaskViewHeight = getFloatingMaskViewHeight();
@@ -720,36 +767,10 @@ public class PrivateProfileManager extends UserProfileManager {
        return alphaAnim;
    }

    /** Animates the layout changes when the text of the button becomes visible/gone. */
    private void enableLayoutTransition(ViewGroup settingsAndLockGroup) {
        LayoutTransition settingsAndLockTransition = new LayoutTransition();
        settingsAndLockTransition.enableTransitionType(LayoutTransition.CHANGING);
        settingsAndLockTransition.setDuration(EXPAND_COLLAPSE_DURATION);
        settingsAndLockTransition.setInterpolator(LayoutTransition.CHANGING,
                Interpolators.STANDARD);
        settingsAndLockTransition.addTransitionListener(new LayoutTransition.TransitionListener() {
            @Override
            public void startTransition(LayoutTransition transition, ViewGroup viewGroup,
                    View view, int i) {
                Log.d(TAG, "updatePrivateStateAnimator: transition started: " + transition);
            }
            @Override
            public void endTransition(LayoutTransition transition, ViewGroup viewGroup,
                    View view, int i) {
                settingsAndLockGroup.setLayoutTransition(null);
                mReadyToAnimate = false;
                Log.d(TAG, "updatePrivateStateAnimator: transition finished: " + transition);
            }
        });
        settingsAndLockGroup.setLayoutTransition(settingsAndLockTransition);
        Log.d(TAG, "updatePrivateStateAnimator: setting transition: "
                + settingsAndLockTransition);
    }

    /** Change the settings gear alpha when expanded or collapsed. */
    private ValueAnimator updateSettingsGearAlpha(boolean expand) {
        if (mPSHeader == null) {
            return new ValueAnimator();
        if (mPrivateSpaceSettingsButton == null || !isPrivateSpaceSettingsAvailable()) {
            return new ValueAnimator().setDuration(0);
        }
        float from = expand ? 0 : 1;
        float to = expand ? 1 : 0;
@@ -760,16 +781,21 @@ public class PrivateProfileManager extends UserProfileManager {
        settingsAlphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                mPSHeader.findViewById(R.id.ps_settings_button)
                        .setAlpha((float) valueAnimator.getAnimatedValue());
                mPrivateSpaceSettingsButton.setAlpha((float) valueAnimator.getAnimatedValue());
            }
        });
        settingsAlphaAnim.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animator) {
                mPrivateSpaceSettingsButton.setVisibility(VISIBLE);
            }
        });
        return settingsAlphaAnim;
    }

    private ValueAnimator updateLockTextAlpha(boolean expand) {
        if (mPSHeader == null) {
            return new ValueAnimator();
        if (mLockText == null) {
            return new ValueAnimator().setDuration(0);
        }
        float from = expand ? 0 : 1;
        float to = expand ? 1 : 0;
@@ -780,8 +806,7 @@ public class PrivateProfileManager extends UserProfileManager {
        alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                mPSHeader.findViewById(R.id.lock_text).setAlpha(
                        (float) valueAnimator.getAnimatedValue());
                mLockText.setAlpha((float) valueAnimator.getAnimatedValue());
            }
        });
        return alphaAnim;