8477226a3d
This patch fixes a bug where a user could cause a crash by rotating the device in the middle of the split staging animation. The bug arose because: 1) Normally, when you rotate the device, reapplyState() is called to refresh the UI. This reloads the state, cancels any animations that happen to be running at the time, and generally works fine in most cases. 2) When animations are canceled within Overview, we also call RecentsView#reset() to clean up loose ends and prevent bugs. 3) Unlike other states, the split select state is unique because it is a transient state that holds the user's choices temporarily. If that information was cleared -- by reset() -- before it loads, it will crash. Fixed by creating a new function in SplitScreenSelectState, onStateReapplied(), that is called when a reload is occurring. It makes sure that animations do not get canceled by calling end() to accelerate them to completion before the reloading occurs. Fixes: 249819567 Test: Manual Change-Id: I70c4651bcb5df81edd25f6e58e21520ebb391d01
62 lines
2.0 KiB
Java
62 lines
2.0 KiB
Java
/*
|
|
* Copyright 2021 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.states;
|
|
|
|
import android.content.Context;
|
|
|
|
import com.android.launcher3.Launcher;
|
|
import com.android.quickstep.util.SplitAnimationTimings;
|
|
import com.android.quickstep.views.RecentsView;
|
|
|
|
/**
|
|
* New Overview substate representing state where 1 app for split screen has been selected and
|
|
* pinned and user is selecting the second one
|
|
*/
|
|
public class SplitScreenSelectState extends OverviewState {
|
|
public SplitScreenSelectState(int id) {
|
|
super(id);
|
|
}
|
|
|
|
@Override
|
|
public int getVisibleElements(Launcher launcher) {
|
|
return SPLIT_PLACHOLDER_VIEW;
|
|
}
|
|
|
|
@Override
|
|
public float getSplitSelectTranslation(Launcher launcher) {
|
|
RecentsView recentsView = launcher.getOverviewPanel();
|
|
return recentsView.getSplitSelectTranslation();
|
|
}
|
|
|
|
@Override
|
|
public int getTransitionDuration(Context context, boolean isToState) {
|
|
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;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldPreserveDataStateOnReapply() {
|
|
return true;
|
|
}
|
|
}
|