From a67a8856683542c6bf2e6f7cb4440ddae7fcd6e8 Mon Sep 17 00:00:00 2001 From: hunterstich Date: Wed, 14 Jun 2023 09:17:15 -0700 Subject: [PATCH] [Predictive Back] Update components to use BackEventCompat Clients should prefer listening to back events using androidx.activity.OnBackPressedCallback which has been updated to forward BackEventCompat objects in androidx.activity:activity:1.8.0-alpha05. This updates component predictive back APIs to take in BackEventCompat objects instead of android.window.BackEvent objects to simplify usage - getting rid of the need for version checks and object conversions. PiperOrigin-RevId: 540290323 --- build.gradle | 3 ++ .../BottomAppBarMainDemoFragment.java | 14 ++------ .../BottomSheetMainDemoFragment.java | 14 ++------ .../CustomNavigationDrawerDemoActivity.java | 8 +++-- .../sidesheet/SideSheetMainDemoFragment.java | 14 ++------ docs/components/BottomSheet.md | 11 +++--- docs/components/SideSheet.md | 11 +++--- lib/build.gradle | 1 + .../bottomsheet/BottomSheetBehavior.java | 11 +++--- .../motion/MaterialBackAnimationHelper.java | 21 +++++------ .../material/motion/MaterialBackHandler.java | 26 ++++++-------- .../motion/MaterialBackOrchestrator.java | 5 +-- .../MaterialBottomContainerBackHelper.java | 18 +++------- .../MaterialMainContainerBackHelper.java | 14 +++----- .../MaterialSideContainerBackHelper.java | 19 ++++------ .../material/navigation/NavigationView.java | 12 +++---- .../android/material/search/SearchView.java | 35 +++++++++++-------- .../search/SearchViewAnimationHelper.java | 9 +++-- .../material/sidesheet/SideSheetBehavior.java | 13 +++---- 19 files changed, 99 insertions(+), 160 deletions(-) diff --git a/build.gradle b/build.gradle index bc2af919118..f3227e9565e 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ ext { targetSdkVersion = 33 androidXVersions = [ + activity : '1.8.0-alpha05', annotation : '1.2.0', appCompat : '1.6.1', cardView : '1.0.0', @@ -86,6 +87,8 @@ private def getTransformedProjectPath(projectPath) { */ def compatibility(name) { switch (name) { + case "activity": + return "androidx.activity:activity:${androidXVersions.activity}" case "annotation": return "androidx.annotation:annotation:${androidXVersions.annotation}" case "appcompat": diff --git a/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java b/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java index 68dc08f9db3..885b8cc454b 100644 --- a/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java +++ b/catalog/java/io/material/catalog/bottomappbar/BottomAppBarMainDemoFragment.java @@ -18,8 +18,6 @@ import io.material.catalog.R; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -61,16 +59,12 @@ public class BottomAppBarMainDemoFragment extends DemoFragment { new OnBackPressedCallback(/* enabled= */ false) { @Override public void handleOnBackStarted(@NonNull BackEventCompat backEvent) { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - bottomDrawerBehavior.startBackProgress(backEvent.toBackEvent()); - } + bottomDrawerBehavior.startBackProgress(backEvent); } @Override public void handleOnBackProgressed(@NonNull BackEventCompat backEvent) { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - bottomDrawerBehavior.updateBackProgress(backEvent.toBackEvent()); - } + bottomDrawerBehavior.updateBackProgress(backEvent); } @Override @@ -80,9 +74,7 @@ public void handleOnBackPressed() { @Override public void handleOnBackCancelled() { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - bottomDrawerBehavior.cancelBackProgress(); - } + bottomDrawerBehavior.cancelBackProgress(); } }; diff --git a/catalog/java/io/material/catalog/bottomsheet/BottomSheetMainDemoFragment.java b/catalog/java/io/material/catalog/bottomsheet/BottomSheetMainDemoFragment.java index a5cbfe8b074..2e7eaa5cb92 100644 --- a/catalog/java/io/material/catalog/bottomsheet/BottomSheetMainDemoFragment.java +++ b/catalog/java/io/material/catalog/bottomsheet/BottomSheetMainDemoFragment.java @@ -19,8 +19,6 @@ import io.material.catalog.R; import android.app.Activity; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; @@ -52,16 +50,12 @@ public class BottomSheetMainDemoFragment extends DemoFragment { @Override public void handleOnBackStarted(@NonNull BackEventCompat backEvent) { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - persistentBottomSheetBehavior.startBackProgress(backEvent.toBackEvent()); - } + persistentBottomSheetBehavior.startBackProgress(backEvent); } @Override public void handleOnBackProgressed(@NonNull BackEventCompat backEvent) { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - persistentBottomSheetBehavior.updateBackProgress(backEvent.toBackEvent()); - } + persistentBottomSheetBehavior.updateBackProgress(backEvent); } @Override @@ -71,9 +65,7 @@ public void handleOnBackPressed() { @Override public void handleOnBackCancelled() { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - persistentBottomSheetBehavior.cancelBackProgress(); - } + persistentBottomSheetBehavior.cancelBackProgress(); } }; diff --git a/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java b/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java index 82c06fcd826..2be2d7e92ba 100644 --- a/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java +++ b/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java @@ -30,6 +30,7 @@ import android.window.BackEvent; import android.window.OnBackAnimationCallback; import android.window.OnBackInvokedDispatcher; +import androidx.activity.BackEventCompat; import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -140,19 +141,20 @@ private OnBackAnimationCallback createOnBackAnimationCallback() { @Override public void onBackStarted(@NonNull BackEvent backEvent) { - sideContainerBackHelper.startBackProgress(backEvent); + sideContainerBackHelper.startBackProgress(new BackEventCompat(backEvent)); } @Override public void onBackProgressed(@NonNull BackEvent backEvent) { DrawerLayout.LayoutParams drawerLayoutParams = (LayoutParams) currentDrawerView.getLayoutParams(); - sideContainerBackHelper.updateBackProgress(backEvent, drawerLayoutParams.gravity); + sideContainerBackHelper.updateBackProgress( + new BackEventCompat(backEvent), drawerLayoutParams.gravity); } @Override public void onBackInvoked() { - BackEvent backEvent = sideContainerBackHelper.onHandleBackInvoked(); + BackEventCompat backEvent = sideContainerBackHelper.onHandleBackInvoked(); if (backEvent == null) { drawerLayout.closeDrawers(); return; diff --git a/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java b/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java index ff05af5b39c..6ed7973b8f5 100644 --- a/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java +++ b/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java @@ -20,8 +20,6 @@ import static android.view.View.NO_ID; -import android.os.Build.VERSION; -import android.os.Build.VERSION_CODES; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -407,16 +405,12 @@ private OnBackPressedCallback createNonModalOnBackPressedCallback( return new OnBackPressedCallback(/* enabled= */ false) { @Override public void handleOnBackStarted(@NonNull BackEventCompat backEvent) { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - behavior.startBackProgress(backEvent.toBackEvent()); - } + behavior.startBackProgress(backEvent); } @Override public void handleOnBackProgressed(@NonNull BackEventCompat backEvent) { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - behavior.updateBackProgress(backEvent.toBackEvent()); - } + behavior.updateBackProgress(backEvent); } @Override @@ -426,9 +420,7 @@ public void handleOnBackPressed() { @Override public void handleOnBackCancelled() { - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - behavior.cancelBackProgress(); - } + behavior.cancelBackProgress(); } }; } diff --git a/docs/components/BottomSheet.md b/docs/components/BottomSheet.md index bccdbd864b4..d1d1f6d2425 100644 --- a/docs/components/BottomSheet.md +++ b/docs/components/BottomSheet.md @@ -486,18 +486,16 @@ to see how the component behaves when a user swipes back. ### Standard (Non-Modal) Bottom Sheets To set up Predictive Back for standard (non-modal) bottom sheets using -`BottomSheetBehavior`, create an AndroidX back callback that forwards the system -`BackEvent` objects to your `BottomSheetBehavior`: +`BottomSheetBehavior`, create an AndroidX back callback that forwards +`BackEventCompat` objects to your `BottomSheetBehavior`: ```kt val bottomSheetBackCallback = object : OnBackPressedCallback(/* enabled= */false) { - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - override fun handleOnBackStarted(backEvent: BackEvent) { + override fun handleOnBackStarted(backEvent: BackEventCompat) { bottomSheetBehavior.startBackProgress(backEvent) } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - override fun handleOnBackProgressed(backEvent: BackEvent) { + override fun handleOnBackProgressed(backEvent: BackEventCompat) { bottomSheetBehavior.updateBackProgress(backEvent) } @@ -505,7 +503,6 @@ val bottomSheetBackCallback = object : OnBackPressedCallback(/* enabled= */false bottomSheetBehavior.handleBackInvoked() } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) override fun handleOnBackCancelled() { bottomSheetBehavior.cancelBackProgress() } diff --git a/docs/components/SideSheet.md b/docs/components/SideSheet.md index 97016b0217d..f2e21f6dd21 100644 --- a/docs/components/SideSheet.md +++ b/docs/components/SideSheet.md @@ -313,18 +313,16 @@ to see how the component behaves when a user swipes back. ### Standard and Coplanar (Non-Modal) Side Sheets To set up Predictive Back for standard or coplanar (non-modal) side sheets using -`SideSheetBehavior`, create an AndroidX back callback that forwards the system -`BackEvent` objects to your `SideSheetBehavior`: +`SideSheetBehavior`, create an AndroidX back callback that forwards +`BackEventCompat` objects to your `SideSheetBehavior`: ```kt val sideSheetBackCallback = object : OnBackPressedCallback(/* enabled= */false) { - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - override fun handleOnBackStarted(backEvent: BackEvent) { + override fun handleOnBackStarted(backEvent: BackEventCompat) { sideSheetBehavior.startBackProgress(backEvent) } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - override fun handleOnBackProgressed(backEvent: BackEvent) { + override fun handleOnBackProgressed(backEvent: BackEventCompat) { sideSheetBehavior.updateBackProgress(backEvent) } @@ -332,7 +330,6 @@ val sideSheetBackCallback = object : OnBackPressedCallback(/* enabled= */false) sideSheetBehavior.handleBackInvoked() } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) override fun handleOnBackCancelled() { sideSheetBehavior.cancelBackProgress() } diff --git a/lib/build.gradle b/lib/build.gradle index dcd9446dc7e..3a66fa28f0f 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -6,6 +6,7 @@ apply plugin: 'maven-publish' version = mdcLibraryVersion dependencies { + api compatibility("activity") api compatibility("annotation") api compatibility("appcompat") api compatibility("cardview") diff --git a/lib/java/com/google/android/material/bottomsheet/BottomSheetBehavior.java b/lib/java/com/google/android/material/bottomsheet/BottomSheetBehavior.java index 97e82f4ce69..20bff1e4807 100644 --- a/lib/java/com/google/android/material/bottomsheet/BottomSheetBehavior.java +++ b/lib/java/com/google/android/material/bottomsheet/BottomSheetBehavior.java @@ -49,7 +49,7 @@ import android.view.ViewParent; import android.view.WindowInsets; import android.view.accessibility.AccessibilityEvent; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.FloatRange; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -1588,18 +1588,16 @@ boolean shouldHide(@NonNull View child, float yvel) { return Math.abs(newTop - collapsedOffset) / (float) peek > HIDE_THRESHOLD; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void startBackProgress(@NonNull BackEvent backEvent) { + public void startBackProgress(@NonNull BackEventCompat backEvent) { if (bottomContainerBackHelper == null) { return; } bottomContainerBackHelper.startBackProgress(backEvent); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void updateBackProgress(@NonNull BackEvent backEvent) { + public void updateBackProgress(@NonNull BackEventCompat backEvent) { if (bottomContainerBackHelper == null) { return; } @@ -1611,7 +1609,7 @@ public void handleBackInvoked() { if (bottomContainerBackHelper == null) { return; } - BackEvent backEvent = bottomContainerBackHelper.onHandleBackInvoked(); + BackEventCompat backEvent = bottomContainerBackHelper.onHandleBackInvoked(); if (backEvent == null || !BuildCompat.isAtLeastU()) { // If using traditional button system nav or if pre-U, just hide or collapse the bottom sheet. setState(hideable ? STATE_HIDDEN : STATE_COLLAPSED); @@ -1637,7 +1635,6 @@ public void onAnimationEnd(Animator animation) { } } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override public void cancelBackProgress() { if (bottomContainerBackHelper == null) { diff --git a/lib/java/com/google/android/material/motion/MaterialBackAnimationHelper.java b/lib/java/com/google/android/material/motion/MaterialBackAnimationHelper.java index 8dcc4efefbe..6b97edb4ab2 100644 --- a/lib/java/com/google/android/material/motion/MaterialBackAnimationHelper.java +++ b/lib/java/com/google/android/material/motion/MaterialBackAnimationHelper.java @@ -19,12 +19,10 @@ import android.animation.TimeInterpolator; import android.content.Context; -import android.os.Build.VERSION_CODES; import android.view.View; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; import androidx.annotation.RestrictTo.Scope; import androidx.core.view.animation.PathInterpolatorCompat; @@ -50,7 +48,7 @@ public abstract class MaterialBackAnimationHelper { protected final int hideDurationMin; protected final int cancelDuration; - @Nullable private BackEvent backEvent; + @Nullable private BackEventCompat backEvent; public MaterialBackAnimationHelper(@NonNull V view) { this.view = view; @@ -76,13 +74,11 @@ protected float interpolateProgress(float progress) { return progressInterpolator.getInterpolation(progress); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - protected void onStartBackProgress(@NonNull BackEvent backEvent) { + protected void onStartBackProgress(@NonNull BackEventCompat backEvent) { this.backEvent = backEvent; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - protected void onUpdateBackProgress(@NonNull BackEvent backEvent) { + protected void onUpdateBackProgress(@NonNull BackEventCompat backEvent) { if (this.backEvent == null) { throw new IllegalStateException("Must call startBackProgress() before updateBackProgress()"); } @@ -90,21 +86,20 @@ protected void onUpdateBackProgress(@NonNull BackEvent backEvent) { } @Nullable - public BackEvent onHandleBackInvoked() { - BackEvent finalBackEvent = this.backEvent; + public BackEventCompat onHandleBackInvoked() { + BackEventCompat finalBackEvent = this.backEvent; this.backEvent = null; return finalBackEvent; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @CanIgnoreReturnValue @NonNull - protected BackEvent onCancelBackProgress() { + protected BackEventCompat onCancelBackProgress() { if (this.backEvent == null) { throw new IllegalStateException( "Must call startBackProgress() and updateBackProgress() before cancelBackProgress()"); } - BackEvent finalBackEvent = this.backEvent; + BackEventCompat finalBackEvent = this.backEvent; this.backEvent = null; return finalBackEvent; } diff --git a/lib/java/com/google/android/material/motion/MaterialBackHandler.java b/lib/java/com/google/android/material/motion/MaterialBackHandler.java index e0149060bbb..77593205fdb 100644 --- a/lib/java/com/google/android/material/motion/MaterialBackHandler.java +++ b/lib/java/com/google/android/material/motion/MaterialBackHandler.java @@ -17,10 +17,8 @@ import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP; -import android.os.Build.VERSION_CODES; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; /** @@ -32,23 +30,22 @@ public interface MaterialBackHandler { /** - * Call this method from {@link android.window.OnBackAnimationCallback#onBackStarted(BackEvent)} - * or {@link androidx.activity.OnBackPressedCallback#handleOnBackStarted(BackEvent)} so that the - * back handler can initialize and start animating. + * Call this method from {@link + * android.window.OnBackAnimationCallback#onBackStarted(android.window.BackEvent)} or {@link + * androidx.activity.OnBackPressedCallback#handleOnBackStarted(BackEventCompat)} so that the back + * handler can initialize and start animating. * - *

Note that this must be called prior to calling {@link #updateBackProgress(BackEvent)}. + *

Note that this must be called prior to calling {@link #updateBackProgress(BackEventCompat)}. */ - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - void startBackProgress(@NonNull BackEvent backEvent); + void startBackProgress(@NonNull BackEventCompat backEvent); /** * Call this method from {@link - * android.window.OnBackAnimationCallback#onBackProgressed(BackEvent)} or {@link - * androidx.activity.OnBackPressedCallback#handleOnBackProgressed(BackEvent)} so that the back - * handler can continue animating with a new progress value. + * android.window.OnBackAnimationCallback#onBackProgressed(android.window.BackEvent)} or {@link + * androidx.activity.OnBackPressedCallback#handleOnBackProgressed(BackEventCompat)} so that the + * back handler can continue animating with a new progress value. */ - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - void updateBackProgress(@NonNull BackEvent backEvent); + void updateBackProgress(@NonNull BackEventCompat backEvent); /** * Call this method from {@link android.window.OnBackAnimationCallback#onBackInvoked()} or {@link @@ -62,6 +59,5 @@ public interface MaterialBackHandler { * {@link androidx.activity.OnBackPressedCallback#handleOnBackCancelled()} so that the back * handler can cancel the back animation. */ - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) void cancelBackProgress(); } diff --git a/lib/java/com/google/android/material/motion/MaterialBackOrchestrator.java b/lib/java/com/google/android/material/motion/MaterialBackOrchestrator.java index 9a6d9789d53..1bf63592027 100644 --- a/lib/java/com/google/android/material/motion/MaterialBackOrchestrator.java +++ b/lib/java/com/google/android/material/motion/MaterialBackOrchestrator.java @@ -24,6 +24,7 @@ import android.window.OnBackAnimationCallback; import android.window.OnBackInvokedCallback; import android.window.OnBackInvokedDispatcher; +import androidx.activity.BackEventCompat; import androidx.annotation.DoNotInline; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -123,12 +124,12 @@ OnBackInvokedCallback createOnBackInvokedCallback(@NonNull MaterialBackHandler b @Override public void onBackStarted(@NonNull BackEvent backEvent) { - backHandler.startBackProgress(backEvent); + backHandler.startBackProgress(new BackEventCompat(backEvent)); } @Override public void onBackProgressed(@NonNull BackEvent backEvent) { - backHandler.updateBackProgress(backEvent); + backHandler.updateBackProgress(new BackEventCompat(backEvent)); } @Override diff --git a/lib/java/com/google/android/material/motion/MaterialBottomContainerBackHelper.java b/lib/java/com/google/android/material/motion/MaterialBottomContainerBackHelper.java index eb3616b76e2..f95c493b587 100644 --- a/lib/java/com/google/android/material/motion/MaterialBottomContainerBackHelper.java +++ b/lib/java/com/google/android/material/motion/MaterialBottomContainerBackHelper.java @@ -25,13 +25,11 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.res.Resources; -import android.os.Build.VERSION_CODES; import android.view.View; import android.view.ViewGroup; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; import androidx.annotation.VisibleForTesting; import androidx.interpolator.view.animation.FastOutSlowInInterpolator; @@ -59,20 +57,17 @@ public MaterialBottomContainerBackHelper(@NonNull View view) { resources.getDimension(R.dimen.m3_back_progress_bottom_container_max_scale_y_distance); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - public void startBackProgress(@NonNull BackEvent backEvent) { + public void startBackProgress(@NonNull BackEventCompat backEvent) { super.onStartBackProgress(backEvent); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - public void updateBackProgress(@NonNull BackEvent backEvent) { + public void updateBackProgress(@NonNull BackEventCompat backEvent) { super.onUpdateBackProgress(backEvent); updateBackProgress(backEvent.getProgress()); } @VisibleForTesting - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void updateBackProgress(float progress) { progress = interpolateProgress(progress); @@ -99,9 +94,8 @@ public void updateBackProgress(float progress) { } } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void finishBackProgressPersistent( - @NonNull BackEvent backEvent, @Nullable AnimatorListener animatorListener) { + @NonNull BackEventCompat backEvent, @Nullable AnimatorListener animatorListener) { Animator animator = createResetScaleAnimator(); animator.setDuration( AnimationUtils.lerp(hideDurationMax, hideDurationMin, backEvent.getProgress())); @@ -111,9 +105,8 @@ public void finishBackProgressPersistent( animator.start(); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void finishBackProgressNotPersistent( - @NonNull BackEvent backEvent, @Nullable AnimatorListener animatorListener) { + @NonNull BackEventCompat backEvent, @Nullable AnimatorListener animatorListener) { float scaledHeight = view.getHeight() * view.getScaleY(); ObjectAnimator finishAnimator = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, scaledHeight); finishAnimator.setInterpolator(new FastOutSlowInInterpolator()); @@ -133,7 +126,6 @@ public void onAnimationEnd(Animator animation) { finishAnimator.start(); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void cancelBackProgress() { super.onCancelBackProgress(); diff --git a/lib/java/com/google/android/material/motion/MaterialMainContainerBackHelper.java b/lib/java/com/google/android/material/motion/MaterialMainContainerBackHelper.java index aa89f0101d9..763ade5d39f 100644 --- a/lib/java/com/google/android/material/motion/MaterialMainContainerBackHelper.java +++ b/lib/java/com/google/android/material/motion/MaterialMainContainerBackHelper.java @@ -34,7 +34,7 @@ import android.view.RoundedCorner; import android.view.View; import android.view.WindowInsets; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -82,15 +82,13 @@ public Rect getInitialHideFromClipBounds() { return initialHideFromClipBounds; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - public void startBackProgress(@NonNull BackEvent backEvent, @Nullable View collapsedView) { + public void startBackProgress(@NonNull BackEventCompat backEvent, @Nullable View collapsedView) { super.onStartBackProgress(backEvent); startBackProgress(backEvent.getTouchY(), collapsedView); } @VisibleForTesting - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void startBackProgress(float touchY, @Nullable View collapsedView) { initialHideToClipBounds = ViewUtils.calculateRectFromBounds(view); if (collapsedView != null) { @@ -99,22 +97,20 @@ public void startBackProgress(float touchY, @Nullable View collapsedView) { initialTouchY = touchY; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void updateBackProgress( - @NonNull BackEvent backEvent, @Nullable View collapsedView, float collapsedCornerSize) { + @NonNull BackEventCompat backEvent, @Nullable View collapsedView, float collapsedCornerSize) { super.onUpdateBackProgress(backEvent); if (collapsedView != null && collapsedView.getVisibility() != View.INVISIBLE) { collapsedView.setVisibility(View.INVISIBLE); } - boolean leftSwipeEdge = backEvent.getSwipeEdge() == BackEvent.EDGE_LEFT; + boolean leftSwipeEdge = backEvent.getSwipeEdge() == BackEventCompat.EDGE_LEFT; updateBackProgress( backEvent.getProgress(), leftSwipeEdge, backEvent.getTouchY(), collapsedCornerSize); } @VisibleForTesting - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void updateBackProgress( float progress, boolean leftSwipeEdge, float touchY, float collapsedCornerSize) { float width = view.getWidth(); @@ -141,7 +137,6 @@ public void updateBackProgress( } } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void finishBackProgress(long duration, @Nullable View collapsedView) { AnimatorSet resetAnimator = createResetScaleAndTranslationAnimator(collapsedView); resetAnimator.setDuration(duration); @@ -150,7 +145,6 @@ public void finishBackProgress(long duration, @Nullable View collapsedView) { resetInitialValues(); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void cancelBackProgress(@Nullable View collapsedView) { super.onCancelBackProgress(); diff --git a/lib/java/com/google/android/material/motion/MaterialSideContainerBackHelper.java b/lib/java/com/google/android/material/motion/MaterialSideContainerBackHelper.java index 543a97ad9be..8a2f4828e67 100644 --- a/lib/java/com/google/android/material/motion/MaterialSideContainerBackHelper.java +++ b/lib/java/com/google/android/material/motion/MaterialSideContainerBackHelper.java @@ -26,17 +26,15 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.res.Resources; -import android.os.Build.VERSION_CODES; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.MarginLayoutParams; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.GravityInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; import androidx.annotation.VisibleForTesting; import androidx.core.view.GravityCompat; @@ -69,21 +67,18 @@ public MaterialSideContainerBackHelper(@NonNull View view) { resources.getDimension(R.dimen.m3_back_progress_side_container_max_scale_y_distance); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - public void startBackProgress(@NonNull BackEvent backEvent) { + public void startBackProgress(@NonNull BackEventCompat backEvent) { super.onStartBackProgress(backEvent); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - public void updateBackProgress(@NonNull BackEvent backEvent, @GravityInt int gravity) { + public void updateBackProgress(@NonNull BackEventCompat backEvent, @GravityInt int gravity) { super.onUpdateBackProgress(backEvent); - boolean leftSwipeEdge = backEvent.getSwipeEdge() == BackEvent.EDGE_LEFT; + boolean leftSwipeEdge = backEvent.getSwipeEdge() == BackEventCompat.EDGE_LEFT; updateBackProgress(backEvent.getProgress(), leftSwipeEdge, gravity); } @VisibleForTesting - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void updateBackProgress(float progress, boolean leftSwipeEdge, @GravityInt int gravity) { progress = interpolateProgress(progress); boolean leftGravity = checkAbsoluteGravity(gravity, Gravity.LEFT); @@ -124,13 +119,12 @@ public void updateBackProgress(float progress, boolean leftSwipeEdge, @GravityIn } } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void finishBackProgress( - @NonNull BackEvent backEvent, + @NonNull BackEventCompat backEvent, @GravityInt int gravity, @Nullable AnimatorListener animatorListener, @Nullable AnimatorUpdateListener finishAnimatorUpdateListener) { - boolean leftSwipeEdge = backEvent.getSwipeEdge() == BackEvent.EDGE_LEFT; + boolean leftSwipeEdge = backEvent.getSwipeEdge() == BackEventCompat.EDGE_LEFT; boolean leftGravity = checkAbsoluteGravity(gravity, Gravity.LEFT); float scaledWidth = view.getWidth() * view.getScaleX() + getEdgeMargin(leftGravity); ObjectAnimator finishAnimator = @@ -155,7 +149,6 @@ public void onAnimationEnd(Animator animation) { finishAnimator.start(); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) public void cancelBackProgress() { super.onCancelBackProgress(); diff --git a/lib/java/com/google/android/material/navigation/NavigationView.java b/lib/java/com/google/android/material/navigation/NavigationView.java index 30631a8fdf9..85e1a59c9a1 100644 --- a/lib/java/com/google/android/material/navigation/NavigationView.java +++ b/lib/java/com/google/android/material/navigation/NavigationView.java @@ -56,7 +56,7 @@ import android.view.ViewGroup; import android.view.ViewParent; import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.DimenRes; import androidx.annotation.Dimension; import androidx.annotation.DrawableRes; @@ -65,7 +65,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.Px; -import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; import androidx.annotation.StyleRes; import androidx.annotation.VisibleForTesting; @@ -965,16 +964,14 @@ public void setSubheaderInsetEnd(@Px int subheaderInsetEnd) { presenter.setSubheaderInsetEnd(subheaderInsetEnd); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void startBackProgress(@NonNull BackEvent backEvent) { + public void startBackProgress(@NonNull BackEventCompat backEvent) { requireDrawerLayoutParent(); sideContainerBackHelper.startBackProgress(backEvent); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void updateBackProgress(@NonNull BackEvent backEvent) { + public void updateBackProgress(@NonNull BackEventCompat backEvent) { Pair drawerLayoutPair = requireDrawerLayoutParent(); sideContainerBackHelper.updateBackProgress(backEvent, drawerLayoutPair.second.gravity); } @@ -984,7 +981,7 @@ public void handleBackInvoked() { Pair drawerLayoutPair = requireDrawerLayoutParent(); DrawerLayout drawerLayout = drawerLayoutPair.first; - BackEvent backEvent = sideContainerBackHelper.onHandleBackInvoked(); + BackEventCompat backEvent = sideContainerBackHelper.onHandleBackInvoked(); if (backEvent == null || !BuildCompat.isAtLeastU()) { drawerLayout.closeDrawer(this); return; @@ -999,7 +996,6 @@ public void handleBackInvoked() { backEvent, gravity, scrimCloseAnimatorListener, scrimCloseAnimatorUpdateListener); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override public void cancelBackProgress() { requireDrawerLayoutParent(); diff --git a/lib/java/com/google/android/material/search/SearchView.java b/lib/java/com/google/android/material/search/SearchView.java index a95c3cd9ca5..cafa42d3328 100644 --- a/lib/java/com/google/android/material/search/SearchView.java +++ b/lib/java/com/google/android/material/search/SearchView.java @@ -27,6 +27,7 @@ import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Parcel; import android.os.Parcelable; @@ -48,7 +49,7 @@ import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.TextView; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; import androidx.annotation.MenuRes; @@ -89,7 +90,6 @@ /** * Layout that provides a full screen search view and can be used with {@link SearchBar}. * - * *

The example below shows how to use the {@link SearchBar} and {@link SearchView} together: * *

@@ -126,8 +126,8 @@
  * 
*/ @SuppressWarnings("RestrictTo") -public class SearchView extends FrameLayout implements CoordinatorLayout.AttachedBehavior, - MaterialBackHandler { +public class SearchView extends FrameLayout + implements CoordinatorLayout.AttachedBehavior, MaterialBackHandler { private static final long TALKBACK_FOCUS_CHANGE_DELAY_MS = 100; private static final int DEF_STYLE_RES = R.style.Widget_Material3_SearchView; @@ -148,8 +148,10 @@ public class SearchView extends FrameLayout implements CoordinatorLayout.Attache private final boolean layoutInflated; private final SearchViewAnimationHelper searchViewAnimationHelper; - @NonNull private final MaterialBackOrchestrator backOrchestrator = - new MaterialBackOrchestrator(this); + + @NonNull + private final MaterialBackOrchestrator backOrchestrator = new MaterialBackOrchestrator(this); + private final boolean backHandlingEnabled; private final ElevationOverlayProvider elevationOverlayProvider; private final Set transitionListeners = new LinkedHashSet<>(); @@ -265,19 +267,19 @@ public CoordinatorLayout.Behavior getBehavior() { return new SearchView.Behavior(); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void startBackProgress(@NonNull BackEvent backEvent) { + public void startBackProgress(@NonNull BackEventCompat backEvent) { if (isHiddenOrHiding() || searchBar == null) { return; } searchViewAnimationHelper.startBackProgress(backEvent); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void updateBackProgress(@NonNull BackEvent backEvent) { - if (isHiddenOrHiding() || searchBar == null) { + public void updateBackProgress(@NonNull BackEventCompat backEvent) { + if (isHiddenOrHiding() + || searchBar == null + || VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) { return; } searchViewAnimationHelper.updateBackProgress(backEvent); @@ -289,18 +291,21 @@ public void handleBackInvoked() { return; } - BackEvent backEvent = searchViewAnimationHelper.onHandleBackInvoked(); - if (BuildCompat.isAtLeastU() && searchBar != null && backEvent != null) { + BackEventCompat backEvent = searchViewAnimationHelper.onHandleBackInvoked(); + if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE + && searchBar != null + && backEvent != null) { searchViewAnimationHelper.finishBackProgress(); } else { hide(); } } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override public void cancelBackProgress() { - if (isHiddenOrHiding() || searchBar == null) { + if (isHiddenOrHiding() + || searchBar == null + || VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) { return; } searchViewAnimationHelper.cancelBackProgress(); diff --git a/lib/java/com/google/android/material/search/SearchViewAnimationHelper.java b/lib/java/com/google/android/material/search/SearchViewAnimationHelper.java index 14f0b8805e0..31bbd3d7d11 100644 --- a/lib/java/com/google/android/material/search/SearchViewAnimationHelper.java +++ b/lib/java/com/google/android/material/search/SearchViewAnimationHelper.java @@ -37,7 +37,7 @@ import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.TextView; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -612,13 +612,12 @@ private void setMenuItemsNotClickable(Toolbar toolbar) { } } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - void startBackProgress(@NonNull BackEvent backEvent) { + void startBackProgress(@NonNull BackEventCompat backEvent) { backHelper.startBackProgress(backEvent, searchBar); } @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - public void updateBackProgress(@NonNull BackEvent backEvent) { + public void updateBackProgress(@NonNull BackEventCompat backEvent) { if (backEvent.getProgress() <= 0f) { return; } @@ -642,7 +641,7 @@ public void updateBackProgress(@NonNull BackEvent backEvent) { } @Nullable - public BackEvent onHandleBackInvoked() { + public BackEventCompat onHandleBackInvoked() { return backHelper.onHandleBackInvoked(); } diff --git a/lib/java/com/google/android/material/sidesheet/SideSheetBehavior.java b/lib/java/com/google/android/material/sidesheet/SideSheetBehavior.java index 835d7c1f099..ac9ff10f819 100644 --- a/lib/java/com/google/android/material/sidesheet/SideSheetBehavior.java +++ b/lib/java/com/google/android/material/sidesheet/SideSheetBehavior.java @@ -27,7 +27,6 @@ import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; -import android.os.Build.VERSION_CODES; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; @@ -41,12 +40,11 @@ import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.view.ViewParent; -import android.window.BackEvent; +import androidx.activity.BackEventCompat; import androidx.annotation.GravityInt; import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; import androidx.annotation.RestrictTo; import androidx.annotation.VisibleForTesting; import androidx.coordinatorlayout.widget.CoordinatorLayout; @@ -975,18 +973,16 @@ public int getLastStableState() { return lastStableState; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void startBackProgress(@NonNull BackEvent backEvent) { + public void startBackProgress(@NonNull BackEventCompat backEvent) { if (sideContainerBackHelper == null) { return; } sideContainerBackHelper.startBackProgress(backEvent); } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override - public void updateBackProgress(@NonNull BackEvent backEvent) { + public void updateBackProgress(@NonNull BackEventCompat backEvent) { if (sideContainerBackHelper == null) { return; } @@ -1023,7 +1019,7 @@ public void handleBackInvoked() { if (sideContainerBackHelper == null) { return; } - BackEvent backEvent = sideContainerBackHelper.onHandleBackInvoked(); + BackEventCompat backEvent = sideContainerBackHelper.onHandleBackInvoked(); if (backEvent == null || !BuildCompat.isAtLeastU()) { setState(STATE_HIDDEN); return; @@ -1068,7 +1064,6 @@ private AnimatorUpdateListener getCoplanarFinishAnimatorUpdateListener() { }; } - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) @Override public void cancelBackProgress() { if (sideContainerBackHelper == null) {