Bump versions of agp and robolectric, and configure to use SDK 35 (flutter/engine#56732)

Bumps the version of AGP used in the IDE-support `build.gradle`, as well as the robolectric version in both the IDE-support `build.gradle` and test-runner-`build.gradle`. 

This is the current latest robolectric: https://github.com/robolectric/robolectric/releases/tag/robolectric-4.14.1.

Also 
1. configures robolectric to use API 35, and 
2. removes the use of a deprecated class which (from what I could tell) looked like it was just used for setup, and the test still passes without it.

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
This commit is contained in:
Gray Mackall 2024-11-25 10:24:05 -08:00 committed by GitHub
parent a442db2c24
commit 2aae286c8d
4 changed files with 7 additions and 78 deletions

View File

@ -8,7 +8,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:7.4.2" classpath "com.android.tools.build:gradle:8.7.2"
} }
} }
@ -20,6 +20,7 @@ repositories {
apply plugin: "com.android.library" apply plugin: "com.android.library"
android { android {
namespace "io.flutter.embedding"
compileSdk 35 compileSdk 35
defaultConfig { defaultConfig {
@ -52,7 +53,7 @@ android {
implementation "androidx.test:core:1.4.0" implementation "androidx.test:core:1.4.0"
implementation "com.google.android.play:core:1.8.0" implementation "com.google.android.play:core:1.8.0"
implementation "com.ibm.icu:icu4j:69.1" implementation "com.ibm.icu:icu4j:69.1"
implementation "org.robolectric:robolectric:4.12.1" implementation "org.robolectric:robolectric:4.14.1"
implementation "junit:junit:4.13.2" implementation "junit:junit:4.13.2"
implementation "androidx.test.ext:junit:1.1.4-alpha07" implementation "androidx.test.ext:junit:1.1.4-alpha07"

View File

@ -9,14 +9,10 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.util.SparseArray;
import android.view.InputDevice;
import android.view.KeyEvent; import android.view.KeyEvent;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.BinaryMessenger;
@ -25,7 +21,6 @@ import io.flutter.util.FakeKeyEvent;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -33,14 +28,10 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;
@Config(manifest = Config.NONE) @Config(manifest = Config.NONE)
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@TargetApi(API_LEVELS.API_24) @TargetApi(API_LEVELS.API_35)
public class KeyEventChannelTest { public class KeyEventChannelTest {
KeyEvent keyEvent; KeyEvent keyEvent;
@ -66,20 +57,8 @@ public class KeyEventChannelTest {
keyEventChannel = new KeyEventChannel(fakeMessenger); keyEventChannel = new KeyEventChannel(fakeMessenger);
} }
@After
public void tearDown() {
ShadowInputDevice.reset();
}
@Test @Test
@Config(shadows = {ShadowInputDevice.class})
public void keyDownEventIsSentToFramework() throws JSONException { public void keyDownEventIsSentToFramework() throws JSONException {
final InputDevice device = mock(InputDevice.class);
when(device.isVirtual()).thenReturn(false);
when(device.getName()).thenReturn("keyboard");
ShadowInputDevice.sDeviceIds = new int[] {0};
ShadowInputDevice.addDevice(0, device);
KeyEventChannel.FlutterKeyEvent flutterKeyEvent = KeyEventChannel.FlutterKeyEvent flutterKeyEvent =
new KeyEventChannel.FlutterKeyEvent(keyEvent, null); new KeyEventChannel.FlutterKeyEvent(keyEvent, null);
keyEventChannel.sendFlutterKeyEvent( keyEventChannel.sendFlutterKeyEvent(
@ -106,14 +85,7 @@ public class KeyEventChannelTest {
} }
@Test @Test
@Config(shadows = {ShadowInputDevice.class})
public void keyUpEventIsSentToFramework() throws JSONException { public void keyUpEventIsSentToFramework() throws JSONException {
final InputDevice device = mock(InputDevice.class);
when(device.isVirtual()).thenReturn(false);
when(device.getName()).thenReturn("keyboard");
ShadowInputDevice.sDeviceIds = new int[] {0};
ShadowInputDevice.addDevice(0, device);
keyEvent = new FakeKeyEvent(KeyEvent.ACTION_UP, 65); keyEvent = new FakeKeyEvent(KeyEvent.ACTION_UP, 65);
KeyEventChannel.FlutterKeyEvent flutterKeyEvent = KeyEventChannel.FlutterKeyEvent flutterKeyEvent =
new KeyEventChannel.FlutterKeyEvent(keyEvent, null); new KeyEventChannel.FlutterKeyEvent(keyEvent, null);
@ -139,48 +111,4 @@ public class KeyEventChannelTest {
sendReply(true, replyArgumentCaptor.getValue()); sendReply(true, replyArgumentCaptor.getValue());
assertTrue(handled[0]); assertTrue(handled[0]);
} }
@Implements(InputDevice.class)
public static class ShadowInputDevice extends org.robolectric.shadows.ShadowInputDevice {
public static int[] sDeviceIds;
private static SparseArray<InputDevice> sDeviceMap = new SparseArray<>();
private int mDeviceId;
@Implementation
protected static int[] getDeviceIds() {
return sDeviceIds;
}
@Implementation
protected static InputDevice getDevice(int id) {
return sDeviceMap.get(id);
}
public static void addDevice(int id, InputDevice device) {
sDeviceMap.append(id, device);
}
@Resetter
public static void reset() {
sDeviceIds = null;
sDeviceMap.clear();
}
@Implementation
protected int getId() {
return mDeviceId;
}
public static InputDevice makeInputDevicebyId(int id) {
final InputDevice inputDevice = Shadow.newInstanceOf(InputDevice.class);
final ShadowInputDevice shadowInputDevice = Shadow.extract(inputDevice);
shadowInputDevice.setId(id);
return inputDevice;
}
public void setId(int id) {
mDeviceId = id;
}
}
} }

View File

@ -4,7 +4,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath "com.android.tools.build:gradle:8.5.0" classpath "com.android.tools.build:gradle:8.7.2"
} }
} }
@ -71,7 +71,7 @@ android {
testImplementation "androidx.test:core:1.4.0" testImplementation "androidx.test:core:1.4.0"
testImplementation "com.google.android.play:core:1.8.0" testImplementation "com.google.android.play:core:1.8.0"
testImplementation "com.ibm.icu:icu4j:69.1" testImplementation "com.ibm.icu:icu4j:69.1"
testImplementation "org.robolectric:robolectric:4.12.1" testImplementation "org.robolectric:robolectric:4.14.1"
testImplementation "junit:junit:4.13.2" testImplementation "junit:junit:4.13.2"
testImplementation "androidx.test.ext:junit:1.1.4-alpha07" testImplementation "androidx.test.ext:junit:1.1.4-alpha07"

View File

@ -1,2 +1,2 @@
sdk=33 sdk=35
shadows=io.flutter.CustomShadowContextImpl shadows=io.flutter.CustomShadowContextImpl