|
27 | 27 | import android.window.OnBackInvokedCallback;
|
28 | 28 | import androidx.annotation.NonNull;
|
29 | 29 | import androidx.annotation.Nullable;
|
| 30 | +import androidx.annotation.RequiresApi; |
30 | 31 | import androidx.lifecycle.DefaultLifecycleObserver;
|
31 | 32 | import androidx.lifecycle.LifecycleOwner;
|
32 | 33 | import androidx.test.core.app.ApplicationProvider;
|
@@ -126,69 +127,68 @@ public void itUnregistersOnBackInvokedCallbackOnRelease() {
|
126 | 127 | }
|
127 | 128 |
|
128 | 129 | @Test
|
129 |
| - @Config(maxSdk = Build.VERSION_CODES.S_V2) |
| 130 | + @Config(sdk = Build.VERSION_CODES.S_V2) |
130 | 131 | public void onBackInvokedCallbackIsNullForSdk32OrLower() {
|
131 | 132 | Intent intent = FlutterActivity.createDefaultIntent(ctx);
|
132 | 133 | ActivityController<FlutterActivity> activityController =
|
133 | 134 | Robolectric.buildActivity(FlutterActivity.class, intent);
|
134 | 135 | FlutterActivity flutterActivity = activityController.get();
|
135 | 136 |
|
136 |
| - flutterActivity.onCreate(null); |
137 |
| - |
138 | 137 | assertNull(
|
139 | 138 | "onBackInvokedCallback should be null for SDK 32 or lower",
|
140 |
| - flutterActivity.onBackInvokedCallback); |
| 139 | + flutterActivity.getOnBackInvokedCallback()); |
141 | 140 | }
|
142 | 141 |
|
143 | 142 | @Test
|
144 | 143 | @Config(sdk = Build.VERSION_CODES.TIRAMISU)
|
145 | 144 | @TargetApi(Build.VERSION_CODES.TIRAMISU)
|
146 | 145 | public void onBackInvokedCallbackCallsOnBackPressedForSdk33() {
|
147 |
| - Intent intent = FlutterActivityWithReportFullyDrawn.createDefaultIntent(ctx); |
148 |
| - ActivityController<FlutterActivityWithReportFullyDrawn> activityController = |
149 |
| - Robolectric.buildActivity(FlutterActivityWithReportFullyDrawn.class, intent); |
150 |
| - FlutterActivityWithReportFullyDrawn activity = spy(activityController.get()); |
151 |
| - |
152 |
| - activity.onCreate(null); |
153 |
| - |
154 |
| - assertNotNull( |
155 |
| - "onBackInvokedCallback should not be null for SDK 33", activity.onBackInvokedCallback); |
| 146 | + Intent intent = FlutterActivityWithMockBackInvokedHandling.createDefaultIntent(ctx); |
| 147 | + ActivityController<FlutterActivityWithMockBackInvokedHandling> activityController = |
| 148 | + Robolectric.buildActivity(FlutterActivityWithMockBackInvokedHandling.class, intent); |
| 149 | + FlutterActivityWithMockBackInvokedHandling activity = activityController.get(); |
156 | 150 |
|
157 |
| - OnBackInvokedCallback callback = activity.onBackInvokedCallback; |
| 151 | + OnBackInvokedCallback callback = activity.getOnBackInvokedCallback(); |
| 152 | + assertNotNull("onBackInvokedCallback should not be null for SDK 33", callback); |
158 | 153 |
|
159 | 154 | callback.onBackInvoked();
|
160 |
| - verify(activity, times(1)).onBackPressed(); |
| 155 | + assertEquals("Expected onBackPressed to be called 1 times", 1, activity.onBackPressedCounter); |
161 | 156 | }
|
162 | 157 |
|
163 | 158 | @Test
|
164 | 159 | @Config(sdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
|
165 | 160 | @TargetApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
|
166 | 161 | public void itHandlesOnBackAnimationCallbackAsExpectedForSdk34OrHigher() {
|
167 |
| - Intent intent = FlutterActivityWithReportFullyDrawn.createDefaultIntent(ctx); |
168 |
| - ActivityController<FlutterActivityWithReportFullyDrawn> activityController = |
169 |
| - Robolectric.buildActivity(FlutterActivityWithReportFullyDrawn.class, intent); |
170 |
| - FlutterActivityWithReportFullyDrawn activity = spy(activityController.get()); |
171 |
| - |
172 |
| - activity.onCreate(null); |
| 162 | + Intent intent = FlutterActivityWithMockBackInvokedHandling.createDefaultIntent(ctx); |
| 163 | + ActivityController<FlutterActivityWithMockBackInvokedHandling> activityController = |
| 164 | + Robolectric.buildActivity(FlutterActivityWithMockBackInvokedHandling.class, intent); |
| 165 | + FlutterActivityWithMockBackInvokedHandling activity = activityController.get(); |
173 | 166 |
|
174 | 167 | assertTrue(
|
175 | 168 | "onBackInvokedCallback should be an instance of OnBackAnimationCallback for SDK 34 or higher",
|
176 |
| - activity.onBackInvokedCallback instanceof OnBackAnimationCallback); |
| 169 | + activity.getOnBackInvokedCallback() instanceof OnBackAnimationCallback); |
177 | 170 |
|
178 |
| - OnBackAnimationCallback callback = (OnBackAnimationCallback) activity.onBackInvokedCallback; |
| 171 | + OnBackAnimationCallback callback = |
| 172 | + (OnBackAnimationCallback) activity.getOnBackInvokedCallback(); |
179 | 173 |
|
180 | 174 | BackEvent mockBackEvent = mock(BackEvent.class);
|
181 | 175 | callback.onBackStarted(mockBackEvent);
|
182 |
| - verify(activity, times(1)).startBackGesture(mockBackEvent); |
| 176 | + assertEquals( |
| 177 | + "Expected startBackGesture to be called 1 times", 1, activity.startBackGestureCounter); |
183 | 178 |
|
184 | 179 | callback.onBackProgressed(mockBackEvent);
|
185 |
| - verify(activity, times(1)).updateBackGestureProgress(mockBackEvent); |
| 180 | + assertEquals( |
| 181 | + "Expected updateBackGestureProgress to be called 1 times", |
| 182 | + 1, |
| 183 | + activity.updateBackGestureProgressCounter); |
186 | 184 |
|
187 | 185 | callback.onBackInvoked();
|
188 |
| - verify(activity, times(1)).commitBackGesture(); |
| 186 | + assertEquals( |
| 187 | + "Expected commitBackGesture to be called 1 times", 1, activity.commitBackGestureCounter); |
189 | 188 |
|
190 | 189 | callback.onBackCancelled();
|
191 |
| - verify(activity, times(1)).cancelBackGesture(); |
| 190 | + assertEquals( |
| 191 | + "Expected cancelBackGesture to be called 1 times", 1, activity.cancelBackGestureCounter); |
192 | 192 | }
|
193 | 193 |
|
194 | 194 | @Test
|
@@ -637,12 +637,46 @@ public void resetFullyDrawn() {
|
637 | 637 | }
|
638 | 638 | }
|
639 | 639 |
|
640 |
| - private class FlutterActivityWithMockBackInvokedHandling extends FlutterActivity { |
| 640 | + private static class FlutterActivityWithMockBackInvokedHandling extends FlutterActivity { |
| 641 | + |
| 642 | + int onBackPressedCounter = 0; |
| 643 | + int startBackGestureCounter = 0; |
| 644 | + int updateBackGestureProgressCounter = 0; |
| 645 | + int commitBackGestureCounter = 0; |
| 646 | + int cancelBackGestureCounter = 0; |
| 647 | + |
| 648 | + @Override |
| 649 | + public void onBackPressed() { |
| 650 | + onBackPressedCounter++; |
| 651 | + } |
| 652 | + |
| 653 | + @TargetApi(34) |
| 654 | + @RequiresApi(34) |
| 655 | + @Override |
| 656 | + public void startBackGesture(@NonNull BackEvent backEvent) { |
| 657 | + startBackGestureCounter++; |
| 658 | + } |
| 659 | + |
| 660 | + @TargetApi(34) |
| 661 | + @RequiresApi(34) |
641 | 662 | @Override
|
642 |
| - public void registerOnBackInvokedCallback() {} |
| 663 | + public void updateBackGestureProgress(@NonNull BackEvent backEvent) { |
| 664 | + updateBackGestureProgressCounter++; |
| 665 | + } |
643 | 666 |
|
| 667 | + @TargetApi(34) |
| 668 | + @RequiresApi(34) |
644 | 669 | @Override
|
645 |
| - public void unregisterOnBackInvokedCallback() {} |
| 670 | + public void commitBackGesture() { |
| 671 | + commitBackGestureCounter++; |
| 672 | + } |
| 673 | + |
| 674 | + @TargetApi(34) |
| 675 | + @RequiresApi(34) |
| 676 | + @Override |
| 677 | + public void cancelBackGesture() { |
| 678 | + cancelBackGestureCounter++; |
| 679 | + } |
646 | 680 | }
|
647 | 681 |
|
648 | 682 | private static final class FakeFlutterPlugin
|
|
0 commit comments