Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit acc36fd

Browse files
committed
test onBackInvokedCallback for different SDK
1 parent 8127c91 commit acc36fd

File tree

2 files changed

+52
-10
lines changed

2 files changed

+52
-10
lines changed

shell/platform/android/io/flutter/embedding/android/FlutterActivity.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
659659
*/
660660
@VisibleForTesting
661661
public void registerOnBackInvokedCallback() {
662-
if (Build.VERSION.SDK_INT >= 33 && onBackInvokedCallback != null) {
662+
if (Build.VERSION.SDK_INT >= 33) {
663663
getOnBackInvokedDispatcher()
664664
.registerOnBackInvokedCallback(
665665
OnBackInvokedDispatcher.PRIORITY_DEFAULT, onBackInvokedCallback);
@@ -675,18 +675,20 @@ public void registerOnBackInvokedCallback() {
675675
*/
676676
@VisibleForTesting
677677
public void unregisterOnBackInvokedCallback() {
678-
if (Build.VERSION.SDK_INT >= 33 && onBackInvokedCallback != null) {
678+
if (Build.VERSION.SDK_INT >= 33) {
679679
getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(onBackInvokedCallback);
680680
hasRegisteredBackCallback = false;
681681
}
682682
}
683683

684-
final OnBackInvokedCallback onBackInvokedCallback = createOnBackInvokedCallback();
684+
final OnBackInvokedCallback onBackInvokedCallback =
685+
Build.VERSION.SDK_INT < 33 ? null : createOnBackInvokedCallback();
685686

687+
@NonNull
688+
@TargetApi(33)
689+
@RequiresApi(33)
686690
private OnBackInvokedCallback createOnBackInvokedCallback() {
687-
if (Build.VERSION.SDK_INT == 33) {
688-
return this::onBackPressed;
689-
} else if (Build.VERSION.SDK_INT >= 34) {
691+
if (Build.VERSION.SDK_INT >= 34) {
690692
return new OnBackAnimationCallback() {
691693
@Override
692694
public void onBackInvoked() {
@@ -710,7 +712,7 @@ public void onBackStarted(@NonNull BackEvent backEvent) {
710712
};
711713
}
712714

713-
return null;
715+
return this::onBackPressed;
714716
}
715717

716718
@Override

shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import android.os.Bundle;
2525
import android.window.BackEvent;
2626
import android.window.OnBackAnimationCallback;
27+
import android.window.OnBackInvokedCallback;
2728
import androidx.annotation.NonNull;
2829
import androidx.annotation.Nullable;
2930
import androidx.lifecycle.DefaultLifecycleObserver;
@@ -125,8 +126,47 @@ public void itUnregistersOnBackInvokedCallbackOnRelease() {
125126
}
126127

127128
@Test
128-
@TargetApi(34)
129-
public void itHandlesOnBackAnimationCallbackAsExpected() {
129+
@Config(maxSdk = Build.VERSION_CODES.S_V2)
130+
public void onBackInvokedCallbackIsNullForSdk32OrLower() {
131+
Intent intent = FlutterActivity.createDefaultIntent(ctx);
132+
ActivityController<FlutterActivity> activityController =
133+
Robolectric.buildActivity(FlutterActivity.class, intent);
134+
FlutterActivity flutterActivity = activityController.get();
135+
136+
flutterActivity.onCreate(null);
137+
138+
assertNull(
139+
"onBackInvokedCallback should be null for SDK 32 or lower",
140+
flutterActivity.onBackInvokedCallback);
141+
}
142+
143+
@Test
144+
@Config(
145+
sdk = Build.VERSION_CODES.TIRAMISU,
146+
minSdk = Build.VERSION_CODES.TIRAMISU,
147+
maxSdk = Build.VERSION_CODES.TIRAMISU)
148+
@TargetApi(Build.VERSION_CODES.TIRAMISU)
149+
public void onBackInvokedCallbackIsOnBackInvokedCallbackForSdk33() {
150+
Intent intent = FlutterActivityWithReportFullyDrawn.createDefaultIntent(ctx);
151+
ActivityController<FlutterActivityWithReportFullyDrawn> activityController =
152+
Robolectric.buildActivity(FlutterActivityWithReportFullyDrawn.class, intent);
153+
FlutterActivityWithReportFullyDrawn activity = spy(activityController.get());
154+
155+
activity.onCreate(null);
156+
157+
assertNotNull(
158+
"onBackInvokedCallback should not be null for SDK 33", activity.onBackInvokedCallback);
159+
160+
OnBackInvokedCallback callback = activity.onBackInvokedCallback;
161+
162+
callback.onBackInvoked();
163+
verify(activity, times(1)).onBackPressed();
164+
}
165+
166+
@Test
167+
@Config(sdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, minSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
168+
@TargetApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
169+
public void itHandlesOnBackAnimationCallbackAsExpectedForSdk34OrHigher() {
130170
Intent intent = FlutterActivityWithReportFullyDrawn.createDefaultIntent(ctx);
131171
ActivityController<FlutterActivityWithReportFullyDrawn> activityController =
132172
Robolectric.buildActivity(FlutterActivityWithReportFullyDrawn.class, intent);
@@ -135,7 +175,7 @@ public void itHandlesOnBackAnimationCallbackAsExpected() {
135175
activity.onCreate(null);
136176

137177
assertTrue(
138-
"onBackInvokedCallback should be an instance of OnBackAnimationCallback",
178+
"onBackInvokedCallback should be an instance of OnBackAnimationCallback for SDK 34 or higher",
139179
activity.onBackInvokedCallback instanceof OnBackAnimationCallback);
140180

141181
OnBackAnimationCallback callback = (OnBackAnimationCallback) activity.onBackInvokedCallback;

0 commit comments

Comments
 (0)