Merge "Remove enableLayoutTransitions for private space." into main
diff --git a/res/layout/private_space_header.xml b/res/layout/private_space_header.xml
index 9c0f129..52180cf 100644
--- a/res/layout/private_space_header.xml
+++ b/res/layout/private_space_header.xml
@@ -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>
diff --git a/src/com/android/launcher3/allapps/PrivateProfileManager.java b/src/com/android/launcher3/allapps/PrivateProfileManager.java
index 0f4204f..aefb7e9 100644
--- a/src/com/android/launcher3/allapps/PrivateProfileManager.java
+++ b/src/com/android/launcher3/allapps/PrivateProfileManager.java
@@ -41,7 +41,6 @@
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 @@
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 @@
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 @@
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 @@
.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 @@
/** 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 @@
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 @@
// 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 @@
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 @@
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 @@
}
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 @@
? 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 @@
: 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 @@
}));
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 @@
/** 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 @@
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 @@
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 @@
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;