Loading res/layout/private_space_header.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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> Loading src/com/android/launcher3/allapps/PrivateProfileManager.java +100 −75 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading @@ -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; Loading @@ -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. */ Loading Loading @@ -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. */ Loading @@ -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; Loading @@ -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 -> { Loading @@ -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 -> { Loading Loading @@ -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 Loading @@ -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)); Loading @@ -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); } Loading @@ -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); Loading @@ -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()); } } Loading Loading @@ -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(); Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading
res/layout/private_space_header.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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> Loading
src/com/android/launcher3/allapps/PrivateProfileManager.java +100 −75 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading @@ -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; Loading @@ -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. */ Loading Loading @@ -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. */ Loading @@ -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; Loading @@ -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 -> { Loading @@ -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 -> { Loading Loading @@ -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 Loading @@ -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)); Loading @@ -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); } Loading @@ -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); Loading @@ -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()); } } Loading Loading @@ -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(); Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading