706ff85fe5
Previously we were setting the incorrect thumbnail when swiping to overview, then taking a task screenshot right when the animation ends and replacing the first thumbnail. This sometimes caused a flicker of the old thumbnail, now we avoid setting the thumbnail at all for the taskview that is being swiped up. Another edge case handled here is when switching nav modes and then immediately entering overview, Recents receives an onConfigChange for changing task icon size. That would cause all taskviews to null out both their existing icon and thumbnail, now only the icon gets nulled out. Existing issue where switching to 3 button nav and then entering overview shows blank icon, doesn't register for receiving the updated task snapshot fast enough. Fixes: 179307265 Test: Ask assistant for weather, swipe to overview Ask assistant for time, swipe to overview, no flicker Switch nav modes to gesture, swipe to overview. There's a flicker for config change, but thumbnail is correct Change-Id: I300b29f999f6d6876f82bc0189b44f4c10ae33fe
132 lines
5.6 KiB
Java
132 lines
5.6 KiB
Java
/*
|
|
* Copyright (C) 2017 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.launcher3.uioverrides;
|
|
|
|
import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON;
|
|
import static com.android.launcher3.LauncherState.OVERVIEW_ACTIONS;
|
|
import static com.android.launcher3.LauncherState.OVERVIEW_SPLIT_SELECT;
|
|
import static com.android.launcher3.LauncherState.SPLIT_PLACHOLDER_VIEW;
|
|
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
|
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_ACTIONS_FADE;
|
|
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
|
|
import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS;
|
|
import static com.android.quickstep.views.RecentsView.TASK_MODALNESS;
|
|
import static com.android.quickstep.views.SplitPlaceholderView.ALPHA_FLOAT;
|
|
import static com.android.quickstep.views.TaskView.FLAG_UPDATE_ALL;
|
|
|
|
import android.annotation.TargetApi;
|
|
import android.os.Build;
|
|
import android.util.FloatProperty;
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import com.android.launcher3.BaseQuickstepLauncher;
|
|
import com.android.launcher3.LauncherState;
|
|
import com.android.launcher3.anim.AnimationSuccessListener;
|
|
import com.android.launcher3.anim.PendingAnimation;
|
|
import com.android.launcher3.anim.PropertySetter;
|
|
import com.android.launcher3.states.StateAnimationConfig;
|
|
import com.android.launcher3.util.MultiValueAlpha;
|
|
import com.android.quickstep.views.ClearAllButton;
|
|
import com.android.quickstep.views.LauncherRecentsView;
|
|
import com.android.quickstep.views.RecentsView;
|
|
|
|
/**
|
|
* State handler for handling UI changes for {@link LauncherRecentsView}. In addition to managing
|
|
* the basic view properties, this class also manages changes in the task visuals.
|
|
*/
|
|
@TargetApi(Build.VERSION_CODES.O)
|
|
public final class RecentsViewStateController extends
|
|
BaseRecentsViewStateController<LauncherRecentsView> {
|
|
|
|
public RecentsViewStateController(BaseQuickstepLauncher launcher) {
|
|
super(launcher);
|
|
}
|
|
|
|
@Override
|
|
public void setState(@NonNull LauncherState state) {
|
|
super.setState(state);
|
|
if (state.overviewUi) {
|
|
mRecentsView.updateEmptyMessage();
|
|
mRecentsView.resetTaskVisuals();
|
|
}
|
|
setAlphas(PropertySetter.NO_ANIM_PROPERTY_SETTER, new StateAnimationConfig(), state);
|
|
mRecentsView.setFullscreenProgress(state.getOverviewFullscreenProgress());
|
|
}
|
|
|
|
@Override
|
|
void setStateWithAnimationInternal(@NonNull LauncherState toState,
|
|
@NonNull StateAnimationConfig config, @NonNull PendingAnimation builder) {
|
|
super.setStateWithAnimationInternal(toState, config, builder);
|
|
|
|
if (toState.overviewUi) {
|
|
// While animating into recents, update the visible task data as needed
|
|
builder.addOnFrameCallback(() -> mRecentsView.loadVisibleTaskData(FLAG_UPDATE_ALL));
|
|
mRecentsView.updateEmptyMessage();
|
|
} else {
|
|
builder.addListener(
|
|
AnimationSuccessListener.forRunnable(mRecentsView::resetTaskVisuals));
|
|
}
|
|
|
|
// Create or dismiss split screen select animations
|
|
LauncherState currentState = mLauncher.getStateManager().getState();
|
|
if (isSplitSelectionState(toState) && !isSplitSelectionState(currentState)) {
|
|
builder.add(mRecentsView.createSplitSelectInitAnimation().buildAnim());
|
|
} else if (!isSplitSelectionState(toState) && isSplitSelectionState(currentState)) {
|
|
builder.add(mRecentsView.cancelSplitSelect(true).buildAnim());
|
|
}
|
|
|
|
setAlphas(builder, config, toState);
|
|
builder.setFloat(mRecentsView, FULLSCREEN_PROGRESS,
|
|
toState.getOverviewFullscreenProgress(), LINEAR);
|
|
}
|
|
|
|
/**
|
|
* @return true if {@param toState} is {@link LauncherState#OVERVIEW_SPLIT_SELECT}
|
|
*/
|
|
private boolean isSplitSelectionState(@NonNull LauncherState toState) {
|
|
return toState == OVERVIEW_SPLIT_SELECT;
|
|
}
|
|
|
|
private void setAlphas(PropertySetter propertySetter, StateAnimationConfig config,
|
|
LauncherState state) {
|
|
float clearAllButtonAlpha = (state.getVisibleElements(mLauncher) & CLEAR_ALL_BUTTON) != 0
|
|
? 1 : 0;
|
|
propertySetter.setFloat(mRecentsView.getClearAllButton(), ClearAllButton.VISIBILITY_ALPHA,
|
|
clearAllButtonAlpha, LINEAR);
|
|
float overviewButtonAlpha = (state.getVisibleElements(mLauncher) & OVERVIEW_ACTIONS) != 0
|
|
? 1 : 0;
|
|
propertySetter.setFloat(mLauncher.getActionsView().getVisibilityAlpha(),
|
|
MultiValueAlpha.VALUE, overviewButtonAlpha, config.getInterpolator(
|
|
ANIM_OVERVIEW_ACTIONS_FADE, LINEAR));
|
|
|
|
float splitPlaceholderAlpha = state.areElementsVisible(mLauncher, SPLIT_PLACHOLDER_VIEW) ?
|
|
1 : 0;
|
|
propertySetter.setFloat(mRecentsView.getSplitPlaceholder(), ALPHA_FLOAT,
|
|
splitPlaceholderAlpha, LINEAR);
|
|
}
|
|
|
|
@Override
|
|
FloatProperty<RecentsView> getTaskModalnessProperty() {
|
|
return TASK_MODALNESS;
|
|
}
|
|
|
|
@Override
|
|
FloatProperty<RecentsView> getContentAlphaProperty() {
|
|
return CONTENT_ALPHA;
|
|
}
|
|
}
|