88import android .content .pm .PackageManager .NameNotFoundException ;
99import android .content .res .AssetManager ;
1010import android .os .Build ;
11+ import android .util .SparseArray ;
12+ import android .util .SparseIntArray ;
1113import androidx .annotation .NonNull ;
1214import androidx .annotation .Nullable ;
1315import com .google .android .play .core .splitinstall .SplitInstallException ;
2224import io .flutter .embedding .engine .FlutterJNI ;
2325import java .io .File ;
2426import java .util .ArrayList ;
25- import java .util .HashMap ;
2627import java .util .LinkedList ;
2728import java .util .List ;
28- import java .util .Map ;
2929import java .util .Queue ;
3030
3131/**
@@ -40,14 +40,14 @@ public class PlayStoreDynamicFeatureManager implements DynamicFeatureManager {
4040 private @ NonNull Context context ;
4141 // Each request to install a feature module gets a session ID. These maps associate
4242 // the session ID with the loading unit and module name that was requested.
43- private @ NonNull Map < Integer , String > sessionIdToName ;
44- private @ NonNull Map < Integer , Integer > sessionIdToLoadingUnitId ;
43+ private @ NonNull SparseArray < String > sessionIdToName ;
44+ private @ NonNull SparseIntArray sessionIdToLoadingUnitId ;
4545
4646 private FeatureInstallStateUpdatedListener listener ;
4747
4848 private class FeatureInstallStateUpdatedListener implements SplitInstallStateUpdatedListener {
4949 public void onStateUpdate (SplitInstallSessionState state ) {
50- if (sessionIdToName .containsKey (state .sessionId ())) {
50+ if (sessionIdToName .get (state .sessionId ()) != null ) {
5151 // TODO(garyq): Add system channel for split aot messages.
5252 switch (state .status ()) {
5353 case SplitInstallSessionStatus .FAILED :
@@ -63,8 +63,8 @@ public void onStateUpdate(SplitInstallSessionState state) {
6363 sessionIdToLoadingUnitId .get (state .sessionId ()),
6464 "Module install failed with " + state .errorCode (),
6565 true );
66- sessionIdToName .remove (state .sessionId ());
67- sessionIdToLoadingUnitId .remove (state .sessionId ());
66+ sessionIdToName .delete (state .sessionId ());
67+ sessionIdToLoadingUnitId .delete (state .sessionId ());
6868 break ;
6969 }
7070 case SplitInstallSessionStatus .INSTALLED :
@@ -83,8 +83,8 @@ public void onStateUpdate(SplitInstallSessionState state) {
8383 loadDartLibrary (
8484 sessionIdToLoadingUnitId .get (state .sessionId ()),
8585 sessionIdToName .get (state .sessionId ()));
86- sessionIdToName .remove (state .sessionId ());
87- sessionIdToLoadingUnitId .remove (state .sessionId ());
86+ sessionIdToName .delete (state .sessionId ());
87+ sessionIdToLoadingUnitId .delete (state .sessionId ());
8888 break ;
8989 }
9090 case SplitInstallSessionStatus .CANCELED :
@@ -94,7 +94,8 @@ public void onStateUpdate(SplitInstallSessionState state) {
9494 String .format (
9595 "Module \" %s\" (sessionId %d) install canceled." ,
9696 sessionIdToName .get (state .sessionId ()), state .sessionId ()));
97- sessionIdToName .remove (state .sessionId ());
97+ sessionIdToName .delete (state .sessionId ());
98+ sessionIdToLoadingUnitId .delete (state .sessionId ());
9899 break ;
99100 }
100101 case SplitInstallSessionStatus .CANCELING :
@@ -164,8 +165,8 @@ public PlayStoreDynamicFeatureManager(@NonNull Context context, @Nullable Flutte
164165 splitInstallManager = SplitInstallManagerFactory .create (context );
165166 listener = new FeatureInstallStateUpdatedListener ();
166167 splitInstallManager .registerListener (listener );
167- sessionIdToName = new HashMap ();
168- sessionIdToLoadingUnitId = new HashMap ();
168+ sessionIdToName = new SparseArray < String > ();
169+ sessionIdToLoadingUnitId = new SparseIntArray ();
169170 }
170171
171172 public void setJNI (@ NonNull FlutterJNI flutterJNI ) {
@@ -293,10 +294,10 @@ public void loadDartLibrary(int loadingUnitId, String moduleName) {
293294 // performant and robust.
294295
295296 // Search directly in APKs first
296- List <String > apkPaths = new ArrayList ();
297+ List <String > apkPaths = new ArrayList < String > ();
297298 // If not found in APKs, we check in extracted native libs for the lib directly.
298- List <String > soPaths = new ArrayList ();
299- Queue <File > searchFiles = new LinkedList ();
299+ List <String > soPaths = new ArrayList < String > ();
300+ Queue <File > searchFiles = new LinkedList < File > ();
300301 searchFiles .add (context .getFilesDir ());
301302 while (!searchFiles .isEmpty ()) {
302303 File file = searchFiles .remove ();
0 commit comments