Merge "Update animations for phones: Overview > OverviewSplitSelect transition" into tm-qpr-dev
This commit is contained in:
@@ -42,6 +42,8 @@ import com.android.launcher3.anim.PropertySetter;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.quickstep.util.AnimUtils;
|
||||
import com.android.quickstep.util.SplitAnimationTimings;
|
||||
import com.android.quickstep.views.ClearAllButton;
|
||||
import com.android.quickstep.views.LauncherRecentsView;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
@@ -123,12 +125,18 @@ public final class RecentsViewStateController extends
|
||||
TASK_PRIMARY_SPLIT_TRANSLATION, TASK_SECONDARY_SPLIT_TRANSLATION,
|
||||
mLauncher.getDeviceProfile());
|
||||
|
||||
SplitAnimationTimings timings =
|
||||
AnimUtils.getDeviceOverviewToSplitTimings(mLauncher.getDeviceProfile().isTablet);
|
||||
|
||||
mRecentsView.createSplitSelectInitAnimation(builder,
|
||||
toState.getTransitionDuration(mLauncher, true /* isToState */));
|
||||
// Add properties to shift remaining taskViews to get out of placeholder view
|
||||
builder.setFloat(mRecentsView, taskViewsFloat.first,
|
||||
toState.getSplitSelectTranslation(mLauncher), LINEAR);
|
||||
builder.setFloat(mRecentsView, taskViewsFloat.second, 0, LINEAR);
|
||||
toState.getSplitSelectTranslation(mLauncher),
|
||||
timings.getGridSlidePrimaryInterpolator());
|
||||
builder.setFloat(mRecentsView, taskViewsFloat.second,
|
||||
0,
|
||||
timings.getGridSlideSecondaryInterpolator());
|
||||
|
||||
if (!animate) {
|
||||
AnimatorSet as = builder.buildAnim();
|
||||
|
||||
+5
-2
@@ -191,12 +191,15 @@ public class QuickstepAtomicAnimationFactory extends
|
||||
} else if (fromState == NORMAL && toState == ALL_APPS) {
|
||||
AllAppsSwipeController.applyNormalToAllAppsAnimConfig(mActivity, config);
|
||||
} else if (fromState == OVERVIEW && toState == OVERVIEW_SPLIT_SELECT) {
|
||||
SplitAnimationTimings timings = SplitAnimationTimings.OVERVIEW_TO_SPLIT;
|
||||
SplitAnimationTimings timings = mActivity.getDeviceProfile().isTablet
|
||||
? SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT
|
||||
: SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT;
|
||||
config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, clampToProgress(LINEAR,
|
||||
timings.getActionsFadeStartOffset(),
|
||||
timings.getActionsFadeEndOffset()));
|
||||
} else if (fromState == NORMAL && toState == OVERVIEW_SPLIT_SELECT) {
|
||||
SplitAnimationTimings timings = SplitAnimationTimings.NORMAL_TO_SPLIT;
|
||||
// Splitting from Home is currently only available on tablets
|
||||
SplitAnimationTimings timings = SplitAnimationTimings.TABLET_HOME_TO_SPLIT;
|
||||
config.setInterpolator(ANIM_SCRIM_FADE, clampToProgress(LINEAR,
|
||||
timings.getScrimFadeInStartOffset(),
|
||||
timings.getScrimFadeInEndOffset()));
|
||||
|
||||
@@ -44,8 +44,13 @@ public class SplitScreenSelectState extends OverviewState {
|
||||
|
||||
@Override
|
||||
public int getTransitionDuration(Context context, boolean isToState) {
|
||||
return isToState
|
||||
? SplitAnimationTimings.ENTER_DURATION
|
||||
: SplitAnimationTimings.ABORT_DURATION;
|
||||
boolean isTablet = ((Launcher) context).getDeviceProfile().isTablet;
|
||||
if (isToState && isTablet) {
|
||||
return SplitAnimationTimings.TABLET_ENTER_DURATION;
|
||||
} else if (isToState && !isTablet) {
|
||||
return SplitAnimationTimings.PHONE_ENTER_DURATION;
|
||||
} else {
|
||||
return SplitAnimationTimings.ABORT_DURATION;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
/**
|
||||
* Utility class containing methods to help manage animations, interpolators, and timings.
|
||||
*/
|
||||
public class AnimUtils {
|
||||
/**
|
||||
* Fetches device-specific timings for the Overview > Split animation
|
||||
* (splitscreen initiated from Overview).
|
||||
*/
|
||||
public static SplitAnimationTimings getDeviceOverviewToSplitTimings(boolean isTablet) {
|
||||
return isTablet
|
||||
? SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT
|
||||
: SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches device-specific timings for the Split > Confirm animation
|
||||
* (splitscreen confirmed by selecting a second app).
|
||||
*/
|
||||
public static SplitAnimationTimings getDeviceSplitToConfirmTimings(boolean isTablet) {
|
||||
return isTablet
|
||||
? SplitAnimationTimings.TABLET_SPLIT_TO_CONFIRM
|
||||
: SplitAnimationTimings.PHONE_SPLIT_TO_CONFIRM;
|
||||
}
|
||||
}
|
||||
@@ -16,27 +16,28 @@
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.DEACCEL_2;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the Overview > OverviewSplitSelect animation.
|
||||
*/
|
||||
public class OverviewToSplitTimings implements SplitAnimationTimings {
|
||||
public int getPlaceholderFadeInStart() { return 0; }
|
||||
public int getPlaceholderFadeInEnd() { return 133; }
|
||||
public int getPlaceholderIconFadeInStart() { return 167; }
|
||||
public int getPlaceholderIconFadeInEnd() { return 250; }
|
||||
public int getStagedRectSlideStart() { return 0; }
|
||||
public int getStagedRectSlideEnd() { return 417; }
|
||||
public int getGridSlideStart() { return 67; }
|
||||
public int getGridSlideStagger() { return 16; }
|
||||
public int getGridSlideDuration() { return 500; }
|
||||
public int getActionsFadeStart() { return 0; }
|
||||
public int getActionsFadeEnd() { return 83; }
|
||||
abstract class OverviewToSplitTimings implements SplitAnimationTimings {
|
||||
// Overwritten by device-specific timings
|
||||
abstract public int getPlaceholderFadeInStart();
|
||||
abstract public int getPlaceholderFadeInEnd();
|
||||
abstract public int getPlaceholderIconFadeInStart();
|
||||
abstract public int getPlaceholderIconFadeInEnd();
|
||||
abstract public int getStagedRectSlideStart();
|
||||
abstract public int getStagedRectSlideEnd();
|
||||
abstract public int getGridSlideStart();
|
||||
abstract public int getGridSlideStagger();
|
||||
abstract public int getGridSlideDuration();
|
||||
|
||||
// Common timings
|
||||
public int getIconFadeStart() { return 0; }
|
||||
public int getIconFadeEnd() { return 83; }
|
||||
public int getActionsFadeStart() { return 0; }
|
||||
public int getActionsFadeEnd() { return 83; }
|
||||
public int getInstructionsContainerFadeInStart() { return 167; }
|
||||
public int getInstructionsContainerFadeInEnd() { return 250; }
|
||||
public int getInstructionsTextFadeInStart() { return 217; }
|
||||
@@ -44,11 +45,13 @@ public class OverviewToSplitTimings implements SplitAnimationTimings {
|
||||
public int getInstructionsUnfoldStart() { return 167; }
|
||||
public int getInstructionsUnfoldEnd() { return 500; }
|
||||
|
||||
public int getDuration() { return ENTER_DURATION; }
|
||||
public Interpolator getStagedRectXInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getStagedRectYInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getStagedRectScaleXInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getStagedRectScaleYInterpolator() { return DEACCEL_2; }
|
||||
abstract public int getDuration();
|
||||
abstract public Interpolator getStagedRectXInterpolator();
|
||||
abstract public Interpolator getStagedRectYInterpolator();
|
||||
abstract public Interpolator getStagedRectScaleXInterpolator();
|
||||
abstract public Interpolator getStagedRectScaleYInterpolator();
|
||||
abstract public Interpolator getGridSlidePrimaryInterpolator();
|
||||
abstract public Interpolator getGridSlideSecondaryInterpolator();
|
||||
|
||||
public float getGridSlideStartOffset() {
|
||||
return (float) getGridSlideStart() / getDuration();
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.EMPHASIZED;
|
||||
import static com.android.launcher3.anim.Interpolators.INSTANT;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the Overview > OverviewSplitSelect animation on phones.
|
||||
*/
|
||||
public class PhoneOverviewToSplitTimings
|
||||
extends OverviewToSplitTimings implements SplitAnimationTimings {
|
||||
public int getPlaceholderFadeInStart() { return 0; }
|
||||
public int getPlaceholderFadeInEnd() { return 133; }
|
||||
public int getPlaceholderIconFadeInStart() { return 83; }
|
||||
public int getPlaceholderIconFadeInEnd() { return 167; }
|
||||
public int getStagedRectSlideStart() { return 0; }
|
||||
public int getStagedRectSlideEnd() { return 333; }
|
||||
public int getGridSlideStart() { return 100; }
|
||||
public int getGridSlideStagger() { return 0; }
|
||||
public int getGridSlideDuration() { return 417; }
|
||||
|
||||
public int getDuration() { return PHONE_ENTER_DURATION; }
|
||||
public Interpolator getStagedRectXInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getStagedRectYInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getStagedRectScaleXInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getStagedRectScaleYInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getGridSlidePrimaryInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getGridSlideSecondaryInterpolator() { return INSTANT; }
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.EMPHASIZED;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the OverviewSplitSelect > confirmed animation on phones.
|
||||
*/
|
||||
public class PhoneSplitToConfirmTimings
|
||||
extends SplitToConfirmTimings implements SplitAnimationTimings {
|
||||
public int getPlaceholderFadeInStart() { return 0; }
|
||||
public int getPlaceholderFadeInEnd() { return 133; }
|
||||
public int getPlaceholderIconFadeInStart() { return 50; }
|
||||
public int getPlaceholderIconFadeInEnd() { return 133; }
|
||||
public int getStagedRectSlideStart() { return 0; }
|
||||
public int getStagedRectSlideEnd() { return 333; }
|
||||
|
||||
public int getDuration() { return PHONE_CONFIRM_DURATION; }
|
||||
public Interpolator getStagedRectXInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getStagedRectYInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getStagedRectScaleXInterpolator() { return EMPHASIZED; }
|
||||
public Interpolator getStagedRectScaleYInterpolator() { return EMPHASIZED; }
|
||||
}
|
||||
@@ -16,19 +16,28 @@
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* An interface that supports the centralization of timing information for splitscreen animations.
|
||||
*/
|
||||
public interface SplitAnimationTimings {
|
||||
int ENTER_DURATION = 866;
|
||||
int ABORT_DURATION = 500;
|
||||
int CONFIRM_DURATION = 383;
|
||||
int TABLET_ENTER_DURATION = 866;
|
||||
int TABLET_CONFIRM_DURATION = 383;
|
||||
|
||||
SplitAnimationTimings OVERVIEW_TO_SPLIT = new OverviewToSplitTimings();
|
||||
SplitAnimationTimings NORMAL_TO_SPLIT = new NormalToSplitTimings();
|
||||
SplitAnimationTimings SPLIT_TO_CONFIRM = new SplitToConfirmTimings();
|
||||
int PHONE_ENTER_DURATION = 517;
|
||||
int PHONE_CONFIRM_DURATION = 333;
|
||||
|
||||
int ABORT_DURATION = 500;
|
||||
|
||||
SplitAnimationTimings TABLET_OVERVIEW_TO_SPLIT = new TabletOverviewToSplitTimings();
|
||||
SplitAnimationTimings TABLET_HOME_TO_SPLIT = new TabletHomeToSplitTimings();
|
||||
SplitAnimationTimings TABLET_SPLIT_TO_CONFIRM = new TabletSplitToConfirmTimings();
|
||||
|
||||
SplitAnimationTimings PHONE_OVERVIEW_TO_SPLIT = new PhoneOverviewToSplitTimings();
|
||||
SplitAnimationTimings PHONE_SPLIT_TO_CONFIRM = new PhoneSplitToConfirmTimings();
|
||||
|
||||
// Shared methods
|
||||
int getDuration();
|
||||
@@ -75,8 +84,10 @@ public interface SplitAnimationTimings {
|
||||
default float getInstructionsTextFadeInEndOffset() { return 0; }
|
||||
default float getInstructionsUnfoldStartOffset() { return 0; }
|
||||
default float getInstructionsUnfoldEndOffset() { return 0; }
|
||||
default Interpolator getGridSlidePrimaryInterpolator() { return LINEAR; }
|
||||
default Interpolator getGridSlideSecondaryInterpolator() { return LINEAR; }
|
||||
|
||||
// Defaults for NormalToSplit
|
||||
// Defaults for HomeToSplit
|
||||
default float getScrimFadeInStartOffset() { return 0; }
|
||||
default float getScrimFadeInEndOffset() { return 0; }
|
||||
|
||||
|
||||
@@ -16,28 +16,29 @@
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the OverviewSplitSelect > confirmed animation.
|
||||
*/
|
||||
public class SplitToConfirmTimings implements SplitAnimationTimings {
|
||||
public int getPlaceholderFadeInStart() { return 0; }
|
||||
public int getPlaceholderFadeInEnd() { return 133; }
|
||||
public int getPlaceholderIconFadeInStart() { return 167; }
|
||||
public int getPlaceholderIconFadeInEnd() { return 250; }
|
||||
public int getStagedRectSlideStart() { return 0; }
|
||||
public int getStagedRectSlideEnd() { return 383; }
|
||||
abstract class SplitToConfirmTimings implements SplitAnimationTimings {
|
||||
// Overwritten by device-specific timings
|
||||
abstract public int getPlaceholderFadeInStart();
|
||||
abstract public int getPlaceholderFadeInEnd();
|
||||
abstract public int getPlaceholderIconFadeInStart();
|
||||
abstract public int getPlaceholderIconFadeInEnd();
|
||||
abstract public int getStagedRectSlideStart();
|
||||
abstract public int getStagedRectSlideEnd();
|
||||
|
||||
// Common timings
|
||||
public int getInstructionsFadeStart() { return 0; }
|
||||
public int getInstructionsFadeEnd() { return 67; }
|
||||
|
||||
public int getDuration() { return CONFIRM_DURATION; }
|
||||
public Interpolator getStagedRectXInterpolator() { return LINEAR; }
|
||||
public Interpolator getStagedRectYInterpolator() { return LINEAR; }
|
||||
public Interpolator getStagedRectScaleXInterpolator() { return LINEAR; }
|
||||
public Interpolator getStagedRectScaleYInterpolator() { return LINEAR; }
|
||||
abstract public int getDuration();
|
||||
abstract public Interpolator getStagedRectXInterpolator();
|
||||
abstract public Interpolator getStagedRectYInterpolator();
|
||||
abstract public Interpolator getStagedRectScaleXInterpolator();
|
||||
abstract public Interpolator getStagedRectScaleYInterpolator();
|
||||
|
||||
public float getInstructionsFadeStartOffset() {
|
||||
return (float) getInstructionsFadeStart() / getDuration();
|
||||
|
||||
+3
-2
@@ -21,9 +21,10 @@ import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the Normal > OverviewSplitSelect animation.
|
||||
* Timings for the Home > OverviewSplitSelect animation on tablets.
|
||||
*/
|
||||
public class NormalToSplitTimings extends OverviewToSplitTimings implements SplitAnimationTimings {
|
||||
public class TabletHomeToSplitTimings
|
||||
extends TabletOverviewToSplitTimings implements SplitAnimationTimings {
|
||||
@Override
|
||||
public Interpolator getStagedRectXInterpolator() { return LINEAR; }
|
||||
@Override
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.DEACCEL_2;
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the Overview > OverviewSplitSelect animation on tablets.
|
||||
*/
|
||||
public class TabletOverviewToSplitTimings
|
||||
extends OverviewToSplitTimings implements SplitAnimationTimings {
|
||||
public int getPlaceholderFadeInStart() { return 0; }
|
||||
public int getPlaceholderFadeInEnd() { return 133; }
|
||||
public int getPlaceholderIconFadeInStart() { return 167; }
|
||||
public int getPlaceholderIconFadeInEnd() { return 250; }
|
||||
public int getStagedRectSlideStart() { return 0; }
|
||||
public int getStagedRectSlideEnd() { return 417; }
|
||||
public int getGridSlideStart() { return 67; }
|
||||
public int getGridSlideStagger() { return 16; }
|
||||
public int getGridSlideDuration() { return 500; }
|
||||
|
||||
public int getDuration() { return TABLET_ENTER_DURATION; }
|
||||
public Interpolator getStagedRectXInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getStagedRectYInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getStagedRectScaleXInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getStagedRectScaleYInterpolator() { return DEACCEL_2; }
|
||||
public Interpolator getGridSlidePrimaryInterpolator() { return LINEAR; }
|
||||
public Interpolator getGridSlideSecondaryInterpolator() { return LINEAR; }
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* Timings for the OverviewSplitSelect > confirmed animation on tablets.
|
||||
*/
|
||||
public class TabletSplitToConfirmTimings
|
||||
extends SplitToConfirmTimings implements SplitAnimationTimings {
|
||||
public int getPlaceholderFadeInStart() { return 0; }
|
||||
public int getPlaceholderFadeInEnd() { return 133; }
|
||||
public int getPlaceholderIconFadeInStart() { return 167; }
|
||||
public int getPlaceholderIconFadeInEnd() { return 250; }
|
||||
public int getStagedRectSlideStart() { return 0; }
|
||||
public int getStagedRectSlideEnd() { return 383; }
|
||||
|
||||
public int getDuration() { return TABLET_CONFIRM_DURATION; }
|
||||
public Interpolator getStagedRectXInterpolator() { return LINEAR; }
|
||||
public Interpolator getStagedRectYInterpolator() { return LINEAR; }
|
||||
public Interpolator getStagedRectScaleXInterpolator() { return LINEAR; }
|
||||
public Interpolator getStagedRectScaleYInterpolator() { return LINEAR; }
|
||||
}
|
||||
@@ -30,6 +30,7 @@ import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions;
|
||||
import com.android.launcher3.views.BaseDragLayer;
|
||||
import com.android.quickstep.util.AnimUtils;
|
||||
import com.android.quickstep.util.MultiValueUpdateListener;
|
||||
import com.android.quickstep.util.SplitAnimationTimings;
|
||||
import com.android.quickstep.util.TaskCornerRadius;
|
||||
@@ -215,9 +216,19 @@ public class FloatingTaskView extends FrameLayout {
|
||||
*/
|
||||
public void addStagingAnimation(PendingAnimation animation, RectF startingBounds,
|
||||
Rect endBounds, boolean fadeWithThumbnail, boolean isStagedTask) {
|
||||
SplitAnimationTimings timings = fadeWithThumbnail
|
||||
? SplitAnimationTimings.OVERVIEW_TO_SPLIT
|
||||
: SplitAnimationTimings.NORMAL_TO_SPLIT;
|
||||
boolean isTablet = mActivity.getDeviceProfile().isTablet;
|
||||
boolean splittingFromOverview = fadeWithThumbnail;
|
||||
SplitAnimationTimings timings;
|
||||
|
||||
if (isTablet && splittingFromOverview) {
|
||||
timings = SplitAnimationTimings.TABLET_OVERVIEW_TO_SPLIT;
|
||||
} else if (!isTablet && splittingFromOverview) {
|
||||
timings = SplitAnimationTimings.PHONE_OVERVIEW_TO_SPLIT;
|
||||
} else {
|
||||
// Splitting from Home is currently only available on tablets
|
||||
timings = SplitAnimationTimings.TABLET_HOME_TO_SPLIT;
|
||||
}
|
||||
|
||||
addAnimation(animation, startingBounds, endBounds, fadeWithThumbnail, isStagedTask,
|
||||
timings);
|
||||
}
|
||||
@@ -228,8 +239,11 @@ public class FloatingTaskView extends FrameLayout {
|
||||
*/
|
||||
public void addConfirmAnimation(PendingAnimation animation, RectF startingBounds,
|
||||
Rect endBounds, boolean fadeWithThumbnail, boolean isStagedTask) {
|
||||
SplitAnimationTimings timings =
|
||||
AnimUtils.getDeviceSplitToConfirmTimings(mActivity.getDeviceProfile().isTablet);
|
||||
|
||||
addAnimation(animation, startingBounds, endBounds, fadeWithThumbnail, isStagedTask,
|
||||
SplitAnimationTimings.SPLIT_TO_CONFIRM);
|
||||
timings);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -171,6 +171,7 @@ import com.android.quickstep.TopTaskTracker;
|
||||
import com.android.quickstep.ViewUtils;
|
||||
import com.android.quickstep.util.ActiveGestureErrorDetector;
|
||||
import com.android.quickstep.util.ActiveGestureLog;
|
||||
import com.android.quickstep.util.AnimUtils;
|
||||
import com.android.quickstep.util.GroupTask;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
import com.android.quickstep.util.RecentsOrientedState;
|
||||
@@ -2775,7 +2776,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
anim.setFloat(taskView, VIEW_ALPHA, 0,
|
||||
clampToProgress(isOnGridBottomRow(taskView) ? ACCEL : FINAL_FRAME, 0, 0.5f));
|
||||
FloatProperty<TaskView> secondaryViewTranslate =
|
||||
taskView.getSecondaryDissmissTranslationProperty();
|
||||
taskView.getSecondaryDismissTranslationProperty();
|
||||
int secondaryTaskDimension = mOrientationHandler.getSecondaryDimension(taskView);
|
||||
int verticalFactor = mOrientationHandler.getSecondaryTranslationDirectionFactor();
|
||||
|
||||
@@ -2809,7 +2810,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
mOrientationHandler.getInitialSplitPlaceholderBounds(mSplitPlaceholderSize,
|
||||
mSplitPlaceholderInset, mActivity.getDeviceProfile(),
|
||||
mSplitSelectStateController.getActiveSplitStagePosition(), mTempRect);
|
||||
SplitAnimationTimings timings = SplitAnimationTimings.OVERVIEW_TO_SPLIT;
|
||||
SplitAnimationTimings timings =
|
||||
AnimUtils.getDeviceOverviewToSplitTimings(mActivity.getDeviceProfile().isTablet);
|
||||
|
||||
RectF startingTaskRect = new RectF();
|
||||
safeRemoveDragLayerView(mFirstFloatingTaskView);
|
||||
@@ -3053,6 +3055,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
}
|
||||
}
|
||||
|
||||
SplitAnimationTimings splitTimings =
|
||||
AnimUtils.getDeviceOverviewToSplitTimings(mActivity.getDeviceProfile().isTablet);
|
||||
|
||||
int distanceFromDismissedTask = 0;
|
||||
for (int i = 0; i < count; i++) {
|
||||
View child = getChildAt(i);
|
||||
@@ -3095,9 +3100,29 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
float additionalDismissDuration =
|
||||
ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET * Math.abs(
|
||||
i - dismissedIndex);
|
||||
anim.setFloat(child, translationProperty, scrollDiff, clampToProgress(LINEAR,
|
||||
Utilities.boundToRange(INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
|
||||
+ additionalDismissDuration, 0f, 1f), 1));
|
||||
|
||||
// We are in non-grid layout.
|
||||
// If dismissing for split select, use split timings.
|
||||
// If not, use dismiss timings.
|
||||
float animationStartProgress = isSplitSelectionActive()
|
||||
? Utilities.boundToRange(splitTimings.getGridSlideStartOffset(), 0f, 1f)
|
||||
: Utilities.boundToRange(
|
||||
INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
|
||||
+ additionalDismissDuration, 0f, 1f);
|
||||
|
||||
float animationEndProgress = isSplitSelectionActive()
|
||||
? Utilities.boundToRange(splitTimings.getGridSlideStartOffset()
|
||||
+ splitTimings.getGridSlideDurationOffset(), 0f, 1f)
|
||||
: 1f;
|
||||
|
||||
anim.setFloat(child, translationProperty, scrollDiff,
|
||||
clampToProgress(
|
||||
splitTimings.getGridSlidePrimaryInterpolator(),
|
||||
animationStartProgress,
|
||||
animationEndProgress
|
||||
)
|
||||
);
|
||||
|
||||
if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mEnableDrawingLiveTile
|
||||
&& child instanceof TaskView
|
||||
&& ((TaskView) child).isRunningTask()) {
|
||||
@@ -3138,11 +3163,11 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
: distanceFromDismissedTask;
|
||||
// Set timings based on if user is initiating splitscreen on the focused task,
|
||||
// or splitting/dismissing some other task.
|
||||
SplitAnimationTimings timings = SplitAnimationTimings.OVERVIEW_TO_SPLIT;
|
||||
float animationStartProgress = isStagingFocusedTask
|
||||
? Utilities.boundToRange(
|
||||
timings.getGridSlideStartOffset()
|
||||
+ (timings.getGridSlideStaggerOffset() * staggerColumn),
|
||||
splitTimings.getGridSlideStartOffset()
|
||||
+ (splitTimings.getGridSlideStaggerOffset()
|
||||
* staggerColumn),
|
||||
0f,
|
||||
dismissTranslationInterpolationEnd)
|
||||
: Utilities.boundToRange(
|
||||
@@ -3151,9 +3176,9 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
* staggerColumn, 0f, dismissTranslationInterpolationEnd);
|
||||
float animationEndProgress = isStagingFocusedTask
|
||||
? Utilities.boundToRange(
|
||||
timings.getGridSlideStartOffset()
|
||||
+ (timings.getGridSlideStaggerOffset() * staggerColumn)
|
||||
+ timings.getGridSlideDurationOffset(),
|
||||
splitTimings.getGridSlideStartOffset()
|
||||
+ (splitTimings.getGridSlideStaggerOffset() * staggerColumn)
|
||||
+ splitTimings.getGridSlideDurationOffset(),
|
||||
0f,
|
||||
dismissTranslationInterpolationEnd)
|
||||
: dismissTranslationInterpolationEnd;
|
||||
@@ -3173,7 +3198,7 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
if (!nextFocusedTaskFromTop) {
|
||||
secondaryTranslation -= mTopBottomRowHeightDiff;
|
||||
}
|
||||
anim.setFloat(taskView, taskView.getSecondaryDissmissTranslationProperty(),
|
||||
anim.setFloat(taskView, taskView.getSecondaryDismissTranslationProperty(),
|
||||
secondaryTranslation, clampToProgress(LINEAR, animationStartProgress,
|
||||
dismissTranslationInterpolationEnd));
|
||||
anim.setFloat(taskView, TaskView.FOCUS_TRANSITION, 0f,
|
||||
@@ -4179,9 +4204,13 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
// TODO(194414938) starting bounds seem slightly off, investigate
|
||||
Rect firstTaskStartingBounds = new Rect();
|
||||
Rect firstTaskEndingBounds = mTempRect;
|
||||
PendingAnimation pendingAnimation =
|
||||
new PendingAnimation(SplitAnimationTimings.CONFIRM_DURATION);
|
||||
SplitAnimationTimings timings = SplitAnimationTimings.SPLIT_TO_CONFIRM;
|
||||
|
||||
boolean isTablet = mActivity.getDeviceProfile().isTablet;
|
||||
int duration = isTablet
|
||||
? SplitAnimationTimings.TABLET_CONFIRM_DURATION
|
||||
: SplitAnimationTimings.PHONE_CONFIRM_DURATION;
|
||||
PendingAnimation pendingAnimation = new PendingAnimation(duration);
|
||||
SplitAnimationTimings timings = AnimUtils.getDeviceSplitToConfirmTimings(isTablet);
|
||||
|
||||
int halfDividerSize = getResources()
|
||||
.getDimensionPixelSize(R.dimen.multi_window_task_divider_size) / 2;
|
||||
|
||||
@@ -1261,7 +1261,7 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
DISMISS_TRANSLATION_X, DISMISS_TRANSLATION_Y);
|
||||
}
|
||||
|
||||
public FloatProperty<TaskView> getSecondaryDissmissTranslationProperty() {
|
||||
public FloatProperty<TaskView> getSecondaryDismissTranslationProperty() {
|
||||
return getPagedOrientationHandler().getSecondaryValue(
|
||||
DISMISS_TRANSLATION_X, DISMISS_TRANSLATION_Y);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user