From 944132ba1209b85c1d08e4907978730f723ddb92 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Thu, 17 Feb 2022 23:38:49 +0100 Subject: [PATCH] Improve layout transitions --- .../ui/launcher/LauncherScaffoldView.kt | 11 ++++------- .../search/common/list/SearchResultList.kt | 1 + .../ui/launcher/widgets/WidgetsView.kt | 13 +++++-------- .../widgets/calendar/CalendarWidget.kt | 1 + .../ui/legacy/component/WidgetView.kt | 18 +++--------------- .../ui/legacy/widget/LauncherWidget.kt | 5 ----- .../main/res/layout/view_launcher_scaffold.xml | 1 - ui/src/main/res/layout/view_widget.xml | 1 - ui/src/main/res/layout/view_widgets.xml | 1 - 9 files changed, 14 insertions(+), 38 deletions(-) diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt index 2a5d5275..21f60f58 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/LauncherScaffoldView.kt @@ -1,12 +1,10 @@ package de.mm20.launcher2.ui.launcher import android.animation.AnimatorSet -import android.animation.LayoutTransition import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet -import android.util.Log import android.util.TypedValue import android.view.LayoutInflater import android.view.MotionEvent @@ -20,13 +18,10 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.animation.doOnEnd import androidx.core.content.ContextCompat import androidx.core.content.getSystemService -import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.setPadding import de.mm20.launcher2.ktx.dp import de.mm20.launcher2.ktx.isAtLeastApiLevel -import de.mm20.launcher2.ktx.isBrightColor -import de.mm20.launcher2.transition.ChangingLayoutTransition import de.mm20.launcher2.transition.OneShotLayoutTransition import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.databinding.ViewLauncherScaffoldBinding @@ -152,9 +147,9 @@ class LauncherScaffoldView @JvmOverloads constructor( } widgetsViewModel.isEditMode.observe(context) { + OneShotLayoutTransition.run(binding.scrollContainer) if (it) { binding.scrollView.setOnTouchListener(null) - OneShotLayoutTransition.run(binding.scrollContainer) binding.searchBar.visibility = View.INVISIBLE binding.editWidgetToolbar .animate() @@ -170,7 +165,6 @@ class LauncherScaffoldView @JvmOverloads constructor( context.window.statusBarColor = colorSurface.data viewModel.setStatusBarColor(colorSurface.data) } else { - binding.widgetContainer.layoutTransition = ChangingLayoutTransition() binding.scrollView.setOnTouchListener(scrollViewOnTouchListener) binding.searchBar.visibility = View.VISIBLE @@ -233,6 +227,7 @@ class LauncherScaffoldView @JvmOverloads constructor( set.duration = 300 set.doOnEnd { binding.searchContainer.visibility = View.GONE + binding.widgetContainer.animate().alpha(1f).setDuration(500).start() binding.widgetContainer.visibility = View.VISIBLE } set.playTogether( @@ -255,7 +250,9 @@ class LauncherScaffoldView @JvmOverloads constructor( } private fun showSearch() { + OneShotLayoutTransition.run(binding.widgetContainer) binding.searchContainer.visibility = View.VISIBLE + binding.widgetContainer.animate().alpha(0f).setDuration(500).start() binding.widgetContainer.visibility = View.GONE val set = AnimatorSet() set.duration = 300 diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/list/SearchResultList.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/list/SearchResultList.kt index 10cf4ff5..6ff6c3ba 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/list/SearchResultList.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/common/list/SearchResultList.kt @@ -1,5 +1,6 @@ package de.mm20.launcher2.ui.launcher.search.common.list +import androidx.compose.animation.animateContentSize import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsView.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsView.kt index be01c4aa..519da74c 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsView.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/WidgetsView.kt @@ -55,8 +55,6 @@ class WidgetsView @JvmOverloads constructor( init { context as AppCompatActivity - layoutTransition = ChangingLayoutTransition() - binding.widgetList.layoutTransition.enableTransitionType(LayoutTransition.CHANGING) pickWidgetLauncher = context.registerForActivityResult( ActivityResultContracts.StartActivityForResult() @@ -78,6 +76,7 @@ class WidgetsView @JvmOverloads constructor( viewModel.isEditMode.observe(context) { if (it) { + OneShotLayoutTransition.run(binding.widgetList) binding.clockWidget.visibility = View.GONE for (v in binding.widgetList.iterator()) { @@ -89,8 +88,6 @@ class WidgetsView @JvmOverloads constructor( } } } - OneShotLayoutTransition.run(binding.widgetList) - OneShotLayoutTransition.run(this) binding.fabEditWidget.apply { setIconResource(R.drawable.ic_add) setText(R.string.widget_add_widget) @@ -99,13 +96,14 @@ class WidgetsView @JvmOverloads constructor( } } } else { - if (::widgets.isInitialized) viewModel.saveWidgets(widgets) - binding.widgetList.layoutTransition = ChangingLayoutTransition() + if (::widgets.isInitialized) { + viewModel.saveWidgets(widgets) + OneShotLayoutTransition.run(binding.widgetList) + } binding.clockWidget.visibility = View.VISIBLE for (v in binding.widgetList.iterator()) { if (v is WidgetView) { v.editMode = false - v.layoutTransition = ChangingLayoutTransition() } } binding.fabEditWidget.apply { @@ -155,7 +153,6 @@ class WidgetsView @JvmOverloads constructor( params.topMargin = (8 * dp).roundToInt() for (w in widgets) { val view = WidgetView(context) - view.layoutTransition = ChangingLayoutTransition() view.layoutParams = params if (view.setWidget(w, widgetHost)) { binding.widgetList.addDragView(view, view.getDragHandle()) diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidget.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidget.kt index 91f509fb..1749f0c5 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidget.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidget.kt @@ -97,6 +97,7 @@ fun CalendarWidget() { modifier = Modifier .padding(horizontal = 12.dp) .padding(bottom = 12.dp) + .animateContentSize() ) { if (hasPermission == false) { MissingPermissionBanner( diff --git a/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/WidgetView.kt b/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/WidgetView.kt index 1bfd89c5..6b80b3bd 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/WidgetView.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/legacy/component/WidgetView.kt @@ -1,6 +1,5 @@ package de.mm20.launcher2.ui.legacy.component -import android.animation.LayoutTransition import android.appwidget.AppWidgetHost import android.content.Context import android.util.AttributeSet @@ -9,7 +8,6 @@ import android.view.View import androidx.appcompat.widget.TooltipCompat import androidx.core.view.get import de.mm20.launcher2.ktx.dp -import de.mm20.launcher2.transition.ChangingLayoutTransition import de.mm20.launcher2.transition.OneShotLayoutTransition import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.databinding.ViewWidgetBinding @@ -29,24 +27,19 @@ class WidgetView : LauncherCardView { var editMode = false set(value) { + OneShotLayoutTransition.run(this) if (value) { binding.widgetControlPanel.visibility = View.VISIBLE val widget = binding.widgetWrapper[2] widget.visibility = View.GONE binding.widgetName.visibility = View.VISIBLE visibility = View.VISIBLE - layoutTransition = OneShotLayoutTransition(this) - widgetView?.layoutTransition = null - binding.widgetWrapper.layoutTransition = null } else { resizeMode = false binding.widgetControlPanel.visibility = View.GONE val widget = binding.widgetWrapper[2] as LauncherWidget widget.visibility = View.VISIBLE binding.widgetName.visibility = View.GONE - layoutTransition = ChangingLayoutTransition() - widgetView?.layoutTransition = ChangingLayoutTransition() - binding.widgetWrapper.layoutTransition = ChangingLayoutTransition() } field = value } @@ -55,6 +48,8 @@ class WidgetView : LauncherCardView { set(value) { if (value == field) return onResizeModeChange?.invoke(value) + OneShotLayoutTransition.run(this) + OneShotLayoutTransition.run(binding.widgetWrapper) if (value) { binding.widgetResizeDragHandle.visibility = View.VISIBLE val widget = binding.widgetWrapper[2] @@ -69,7 +64,6 @@ class WidgetView : LauncherCardView { } } - layoutTransition = OneShotLayoutTransition(this) field = value } @@ -86,9 +80,6 @@ class WidgetView : LauncherCardView { binding.widgetActionRemove.setOnClickListener { onRemove?.invoke() } - layoutTransition = LayoutTransition().apply { - enableTransitionType(LayoutTransition.CHANGING) - } TooltipCompat.setTooltipText(binding.widgetActionResize, context.getString(R.string.widget_action_adjust_height)) TooltipCompat.setTooltipText(binding.widgetActionRemove, context.getString(R.string.widget_action_remove)) @@ -118,9 +109,6 @@ class WidgetView : LauncherCardView { binding.widgetName.text = widgetView?.name binding.widgetActionResize.visibility = View.VISIBLE } - widgetView?.layoutTransition = LayoutTransition().apply { - enableTransitionType(LayoutTransition.CHANGING) - } this.widget = widget return true } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/legacy/widget/LauncherWidget.kt b/ui/src/main/java/de/mm20/launcher2/ui/legacy/widget/LauncherWidget.kt index d479bf92..995c74f5 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/legacy/widget/LauncherWidget.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/legacy/widget/LauncherWidget.kt @@ -11,11 +11,6 @@ abstract class LauncherWidget : FrameLayout { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleRes: Int) : super(context, attrs, defStyleRes) - init { - layoutTransition = LayoutTransition().apply { - enableTransitionType(LayoutTransition.CHANGING) - } - } abstract val canResize: Boolean abstract val name: String diff --git a/ui/src/main/res/layout/view_launcher_scaffold.xml b/ui/src/main/res/layout/view_launcher_scaffold.xml index aa7c399a..c6d21e4c 100644 --- a/ui/src/main/res/layout/view_launcher_scaffold.xml +++ b/ui/src/main/res/layout/view_launcher_scaffold.xml @@ -21,7 +21,6 @@ android:layout_height="wrap_content" android:clipChildren="false" android:clipToPadding="false" - android:animateLayoutChanges="true" android:orientation="vertical">