mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-03 01:16:49 +00:00
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
82 lines
2.4 KiB
Java
82 lines
2.4 KiB
Java
/*
|
|
* Copyright (C) 2020 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.statemanager;
|
|
|
|
import android.content.Context;
|
|
|
|
import com.android.launcher3.DeviceProfile;
|
|
import com.android.launcher3.views.ActivityContext;
|
|
|
|
/**
|
|
* Interface representing a state of a StatefulActivity
|
|
*/
|
|
public interface BaseState<T extends BaseState> {
|
|
|
|
// Flag to indicate that Launcher is non-interactive in this state
|
|
int FLAG_NON_INTERACTIVE = 1 << 0;
|
|
int FLAG_DISABLE_RESTORE = 1 << 1;
|
|
|
|
static int getFlag(int index) {
|
|
// reserve few spots to base flags
|
|
return 1 << (index + 2);
|
|
}
|
|
|
|
/**
|
|
* @return How long the animation to this state should take (or from this state to NORMAL).
|
|
*/
|
|
<DEVICE_PROFILE_CONTEXT extends Context & ActivityContext>
|
|
int getTransitionDuration(DEVICE_PROFILE_CONTEXT context, boolean isToState);
|
|
|
|
/**
|
|
* Returns the state to go back to from this state
|
|
*/
|
|
T getHistoryForState(T previousState);
|
|
|
|
/**
|
|
* @return true if the state can be persisted across activity restarts.
|
|
*/
|
|
default boolean shouldDisableRestore() {
|
|
return hasFlag(FLAG_DISABLE_RESTORE);
|
|
}
|
|
|
|
/**
|
|
* Returns if the state has the provided flag
|
|
*/
|
|
boolean hasFlag(int flagMask);
|
|
|
|
/**
|
|
* For this state, whether tasks should layout as a grid rather than a list.
|
|
*/
|
|
default boolean displayOverviewTasksAsGrid(DeviceProfile deviceProfile) {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* For this state, whether tasks should show the thumbnail splash.
|
|
*/
|
|
default boolean showTaskThumbnailSplash() {
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* For this state, whether member variables and other forms of data state should be preserved
|
|
* or wiped when the state is reapplied. (See {@link StateManager#reapplyState()})
|
|
*/
|
|
default boolean shouldPreserveDataStateOnReapply() {
|
|
return false;
|
|
}
|
|
}
|