Skip to content

Commit 2aee13e

Browse files
chingjunchaselatta
authored andcommitted
Support loading assets from Android dynamic feature modules (flutter#21504)
Initialize the AssetManager from the application context so that assets from dynamic feature modules can be loaded.
1 parent 297cfa0 commit 2aee13e

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package io.flutter.embedding.engine;
66

77
import android.content.Context;
8+
import android.content.pm.PackageManager.NameNotFoundException;
9+
import android.content.res.AssetManager;
810
import androidx.annotation.NonNull;
911
import androidx.annotation.Nullable;
1012
import io.flutter.FlutterInjector;
@@ -264,7 +266,13 @@ public FlutterEngine(
264266
@Nullable String[] dartVmArgs,
265267
boolean automaticallyRegisterPlugins,
266268
boolean waitForRestorationData) {
267-
this.dartExecutor = new DartExecutor(flutterJNI, context.getAssets());
269+
AssetManager assetManager;
270+
try {
271+
assetManager = context.createPackageContext(context.getPackageName(), 0).getAssets();
272+
} catch (NameNotFoundException e) {
273+
assetManager = context.getAssets();
274+
}
275+
this.dartExecutor = new DartExecutor(flutterJNI, assetManager);
268276
this.dartExecutor.onAttachedToJNI();
269277

270278
accessibilityChannel = new AccessibilityChannel(dartExecutor, flutterJNI);

shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import static org.junit.Assert.assertNotNull;
55
import static org.junit.Assert.assertTrue;
66
import static org.mockito.Mockito.any;
7+
import static org.mockito.Mockito.anyInt;
78
import static org.mockito.Mockito.atLeast;
89
import static org.mockito.Mockito.mock;
910
import static org.mockito.Mockito.times;
1011
import static org.mockito.Mockito.verify;
1112
import static org.mockito.Mockito.when;
1213

1314
import android.content.Context;
15+
import android.content.pm.PackageManager.NameNotFoundException;
1416
import io.flutter.FlutterInjector;
1517
import io.flutter.embedding.engine.FlutterEngine;
1618
import io.flutter.embedding.engine.FlutterJNI;
@@ -127,8 +129,11 @@ public void itNotifiesPlatformViewsControllerAboutJNILifecycle() {
127129
}
128130

129131
@Test
130-
public void itUsesApplicationContext() {
132+
public void itUsesApplicationContext() throws NameNotFoundException {
131133
Context context = mock(Context.class);
134+
Context packageContext = mock(Context.class);
135+
136+
when(context.createPackageContext(any(), anyInt())).thenReturn(packageContext);
132137

133138
new FlutterEngine(
134139
context,
@@ -141,12 +146,32 @@ public void itUsesApplicationContext() {
141146
}
142147

143148
@Test
144-
public void itCanUseFlutterLoaderInjectionViaFlutterInjector() {
149+
public void itUsesPackageContextForAssetManager() throws NameNotFoundException {
150+
Context context = mock(Context.class);
151+
Context packageContext = mock(Context.class);
152+
when(context.createPackageContext(any(), anyInt())).thenReturn(packageContext);
153+
154+
new FlutterEngine(
155+
context,
156+
mock(FlutterLoader.class),
157+
flutterJNI,
158+
/*dartVmArgs=*/ new String[] {},
159+
/*automaticallyRegisterPlugins=*/ false);
160+
161+
verify(packageContext, atLeast(1)).getAssets();
162+
verify(context, times(0)).getAssets();
163+
}
164+
165+
@Test
166+
public void itCanUseFlutterLoaderInjectionViaFlutterInjector() throws NameNotFoundException {
145167
FlutterInjector.reset();
146168
FlutterLoader mockFlutterLoader = mock(FlutterLoader.class);
147169
FlutterInjector.setInstance(
148170
new FlutterInjector.Builder().setFlutterLoader(mockFlutterLoader).build());
149171
Context mockContext = mock(Context.class);
172+
Context packageContext = mock(Context.class);
173+
174+
when(mockContext.createPackageContext(any(), anyInt())).thenReturn(packageContext);
150175

151176
new FlutterEngine(mockContext, null, flutterJNI);
152177

0 commit comments

Comments
 (0)