mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-01 00:06:47 +00:00
Do not animate QSB and hotseat when portrait
Disables fold/unfold animation for QSB and hotseat icons when in portrait orientation. Launcher workspace icons and widgets are still animated intentionally. Reuses NaturalOrientationRotationProvider which is currently used to disable fold/unfold animation in the status bar when in non-natural orientation. Bug: 201518277 Test: fold/unfold on launcher in landscape => QSB and hotseat animated; rotate screen during fold/unfold animation => translation reset after rotating to portrait, animated after returning to landscape; rotate after fold/unfold animation => no changes Change-Id: I8ed405b09f445f554d7638ab44393c90773e0bb6
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Copyright (C) 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.quickstep.util;
|
||||
|
||||
import android.annotation.CallSuper;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator;
|
||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Animation that moves launcher icons and widgets from center to the sides (final position)
|
||||
*/
|
||||
public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProgressListener {
|
||||
|
||||
private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimation;
|
||||
|
||||
private final Map<ViewGroup, Boolean> mOriginalClipToPadding = new HashMap<>();
|
||||
private final Map<ViewGroup, Boolean> mOriginalClipChildren = new HashMap<>();
|
||||
|
||||
public BaseUnfoldMoveFromCenterAnimator(WindowManager windowManager) {
|
||||
mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager,
|
||||
new LauncherViewsMoveFromCenterTranslationApplier());
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
public void onTransitionStarted() {
|
||||
mMoveFromCenterAnimation.updateDisplayProperties();
|
||||
onPrepareViewsForAnimation();
|
||||
onTransitionProgress(0f);
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
public void onTransitionProgress(float progress) {
|
||||
mMoveFromCenterAnimation.onTransitionProgress(progress);
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
public void onTransitionFinished() {
|
||||
mMoveFromCenterAnimation.onTransitionFinished();
|
||||
mMoveFromCenterAnimation.clearRegisteredViews();
|
||||
|
||||
mOriginalClipChildren.clear();
|
||||
mOriginalClipToPadding.clear();
|
||||
}
|
||||
|
||||
protected void onPrepareViewsForAnimation() {
|
||||
|
||||
}
|
||||
|
||||
protected void registerViewForAnimation(View view) {
|
||||
mMoveFromCenterAnimation.registerViewForAnimation(view);
|
||||
}
|
||||
|
||||
protected void disableClipping(ViewGroup view) {
|
||||
mOriginalClipToPadding.put(view, view.getClipToPadding());
|
||||
mOriginalClipChildren.put(view, view.getClipChildren());
|
||||
view.setClipToPadding(false);
|
||||
view.setClipChildren(false);
|
||||
}
|
||||
|
||||
protected void restoreClipping(ViewGroup view) {
|
||||
final Boolean originalClipToPadding = mOriginalClipToPadding.get(view);
|
||||
if (originalClipToPadding != null) {
|
||||
view.setClipToPadding(originalClipToPadding);
|
||||
}
|
||||
final Boolean originalClipChildren = mOriginalClipChildren.get(view);
|
||||
if (originalClipChildren != null) {
|
||||
view.setClipChildren(originalClipChildren);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,14 +18,17 @@ package com.android.quickstep.util;
|
||||
import static com.android.launcher3.Utilities.comp;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManagerGlobal;
|
||||
|
||||
import androidx.core.view.OneShotPreDrawListener;
|
||||
|
||||
import com.android.launcher3.Hotseat;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.util.HorizontalInsettableView;
|
||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
|
||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener;
|
||||
import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider;
|
||||
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider;
|
||||
|
||||
/**
|
||||
@@ -43,6 +46,7 @@ public class LauncherUnfoldAnimationController {
|
||||
private HorizontalInsettableView mQsbInsettable;
|
||||
|
||||
private final ScopedUnfoldTransitionProgressProvider mProgressProvider;
|
||||
private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider;
|
||||
|
||||
public LauncherUnfoldAnimationController(
|
||||
Launcher launcher,
|
||||
@@ -51,10 +55,19 @@ public class LauncherUnfoldAnimationController {
|
||||
mLauncher = launcher;
|
||||
mProgressProvider = new ScopedUnfoldTransitionProgressProvider(
|
||||
unfoldTransitionProgressProvider);
|
||||
mNaturalOrientationProgressProvider = new NaturalRotationUnfoldProgressProvider(launcher,
|
||||
WindowManagerGlobal.getWindowManagerService(), mProgressProvider);
|
||||
mNaturalOrientationProgressProvider.init();
|
||||
|
||||
// Animated in all orientations
|
||||
mProgressProvider.addCallback(new UnfoldMoveFromCenterWorkspaceAnimator(launcher,
|
||||
windowManager));
|
||||
mProgressProvider.addCallback(new QsbAnimationListener());
|
||||
|
||||
// Animated only in natural orientation
|
||||
mNaturalOrientationProgressProvider
|
||||
.addCallback(new QsbAnimationListener());
|
||||
mNaturalOrientationProgressProvider
|
||||
.addCallback(new UnfoldMoveFromCenterHotseatAnimator(launcher, windowManager));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,17 +79,8 @@ public class LauncherUnfoldAnimationController {
|
||||
mQsbInsettable = (HorizontalInsettableView) hotseat.getQsb();
|
||||
}
|
||||
|
||||
final ViewTreeObserver obs = mLauncher.getWorkspace().getViewTreeObserver();
|
||||
obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
|
||||
@Override
|
||||
public boolean onPreDraw() {
|
||||
if (obs.isAlive()) {
|
||||
mProgressProvider.setReadyToHandleTransition(true);
|
||||
obs.removeOnPreDrawListener(this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
OneShotPreDrawListener.add(mLauncher.getWorkspace(),
|
||||
() -> mProgressProvider.setReadyToHandleTransition(true));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -92,6 +96,7 @@ public class LauncherUnfoldAnimationController {
|
||||
*/
|
||||
public void onDestroy() {
|
||||
mProgressProvider.destroy();
|
||||
mNaturalOrientationProgressProvider.destroy();
|
||||
}
|
||||
|
||||
private class QsbAnimationListener implements TransitionProgressListener {
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 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.quickstep.util;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.android.launcher3.Hotseat;
|
||||
import com.android.launcher3.Launcher;
|
||||
|
||||
/**
|
||||
* Animation that moves hotseat icons from center to the sides (final position)
|
||||
*/
|
||||
public class UnfoldMoveFromCenterHotseatAnimator extends BaseUnfoldMoveFromCenterAnimator {
|
||||
|
||||
private final Launcher mLauncher;
|
||||
|
||||
public UnfoldMoveFromCenterHotseatAnimator(Launcher launcher, WindowManager windowManager) {
|
||||
super(windowManager);
|
||||
mLauncher = launcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPrepareViewsForAnimation() {
|
||||
Hotseat hotseat = mLauncher.getHotseat();
|
||||
|
||||
ViewGroup hotseatIcons = hotseat.getShortcutsAndWidgets();
|
||||
disableClipping(hotseat);
|
||||
|
||||
for (int i = 0; i < hotseatIcons.getChildCount(); i++) {
|
||||
View child = hotseatIcons.getChildAt(i);
|
||||
registerViewForAnimation(child);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionFinished() {
|
||||
restoreClipping(mLauncher.getHotseat());
|
||||
super.onTransitionFinished();
|
||||
}
|
||||
}
|
||||
@@ -16,44 +16,28 @@
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.android.launcher3.CellLayout;
|
||||
import com.android.launcher3.Hotseat;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.ShortcutAndWidgetContainer;
|
||||
import com.android.launcher3.Workspace;
|
||||
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator;
|
||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Animation that moves launcher icons and widgets from center to the sides (final position)
|
||||
*/
|
||||
public class UnfoldMoveFromCenterWorkspaceAnimator
|
||||
implements UnfoldTransitionProgressProvider.TransitionProgressListener {
|
||||
public class UnfoldMoveFromCenterWorkspaceAnimator extends BaseUnfoldMoveFromCenterAnimator {
|
||||
|
||||
private final Launcher mLauncher;
|
||||
private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimation;
|
||||
|
||||
private final Map<ViewGroup, Boolean> mOriginalClipToPadding = new HashMap<>();
|
||||
private final Map<ViewGroup, Boolean> mOriginalClipChildren = new HashMap<>();
|
||||
|
||||
public UnfoldMoveFromCenterWorkspaceAnimator(Launcher launcher, WindowManager windowManager) {
|
||||
super(windowManager);
|
||||
mLauncher = launcher;
|
||||
mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager,
|
||||
new LauncherViewsMoveFromCenterTranslationApplier());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionStarted() {
|
||||
mMoveFromCenterAnimation.updateDisplayProperties();
|
||||
|
||||
protected void onPrepareViewsForAnimation() {
|
||||
Workspace workspace = mLauncher.getWorkspace();
|
||||
Hotseat hotseat = mLauncher.getHotseat();
|
||||
|
||||
// App icons and widgets
|
||||
workspace
|
||||
@@ -65,57 +49,17 @@ public class UnfoldMoveFromCenterWorkspaceAnimator
|
||||
|
||||
for (int i = 0; i < itemsContainer.getChildCount(); i++) {
|
||||
View child = itemsContainer.getChildAt(i);
|
||||
mMoveFromCenterAnimation.registerViewForAnimation(child);
|
||||
registerViewForAnimation(child);
|
||||
}
|
||||
});
|
||||
|
||||
disableClipping(workspace);
|
||||
|
||||
// Hotseat icons
|
||||
ViewGroup hotseatIcons = hotseat.getShortcutsAndWidgets();
|
||||
disableClipping(hotseat);
|
||||
|
||||
for (int i = 0; i < hotseatIcons.getChildCount(); i++) {
|
||||
View child = hotseatIcons.getChildAt(i);
|
||||
mMoveFromCenterAnimation.registerViewForAnimation(child);
|
||||
}
|
||||
|
||||
onTransitionProgress(0f);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionProgress(float progress) {
|
||||
mMoveFromCenterAnimation.onTransitionProgress(progress);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionFinished() {
|
||||
mMoveFromCenterAnimation.onTransitionFinished();
|
||||
mMoveFromCenterAnimation.clearRegisteredViews();
|
||||
|
||||
restoreClipping(mLauncher.getWorkspace());
|
||||
mLauncher.getWorkspace().forEachVisiblePage(page -> restoreClipping((CellLayout) page));
|
||||
restoreClipping(mLauncher.getHotseat());
|
||||
|
||||
mOriginalClipChildren.clear();
|
||||
mOriginalClipToPadding.clear();
|
||||
}
|
||||
|
||||
private void disableClipping(ViewGroup view) {
|
||||
mOriginalClipToPadding.put(view, view.getClipToPadding());
|
||||
mOriginalClipChildren.put(view, view.getClipChildren());
|
||||
view.setClipToPadding(false);
|
||||
view.setClipChildren(false);
|
||||
}
|
||||
|
||||
private void restoreClipping(ViewGroup view) {
|
||||
final Boolean originalClipToPadding = mOriginalClipToPadding.get(view);
|
||||
if (originalClipToPadding != null) {
|
||||
view.setClipToPadding(originalClipToPadding);
|
||||
}
|
||||
final Boolean originalClipChildren = mOriginalClipChildren.get(view);
|
||||
if (originalClipChildren != null) {
|
||||
view.setClipChildren(originalClipChildren);
|
||||
}
|
||||
super.onTransitionFinished();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user