3232 * Google Play store.
3333 */
3434public class PlayStoreDynamicFeatureManager implements DynamicFeatureManager {
35+ private static final String TAG = "flutter" ;
3536
3637 private @ NonNull SplitInstallManager splitInstallManager ;
3738 private @ NonNull Map <Integer , String > sessionIdToName ;
@@ -44,52 +45,53 @@ public class PlayStoreDynamicFeatureManager implements DynamicFeatureManager {
4445 private class FeatureInstallStateUpdatedListener implements SplitInstallStateUpdatedListener {
4546 public void onStateUpdate (SplitInstallSessionState state ) {
4647 if (sessionIdToName .containsKey (state .sessionId ())) {
48+ // TODO(garyq): Add capability to access the state from framework.
4749 switch (state .status ()) {
4850 case SplitInstallSessionStatus .FAILED : {
49- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") install failed with " + state .errorCode ());
51+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") install failed with " + state .errorCode ());
5052 flutterJNI .dynamicFeatureInstallFailure (sessionIdToName .get (state .sessionId ()), sessionIdToLoadingUnitId .get (state .sessionId ()), "Module install failed with " + state .errorCode (), true );
5153 sessionIdToName .remove (state .sessionId ());
5254 sessionIdToLoadingUnitId .remove (state .sessionId ());
5355 break ;
5456 }
5557 case SplitInstallSessionStatus .INSTALLED : {
56- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") installed successfully." );
57- extractModule (sessionIdToName .get (state .sessionId ()), sessionIdToLoadingUnitId .get (state .sessionId ()));
58+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") installed successfully." );
59+ extractFeature (sessionIdToName .get (state .sessionId ()), sessionIdToLoadingUnitId .get (state .sessionId ()));
5860 sessionIdToName .remove (state .sessionId ());
5961 sessionIdToLoadingUnitId .remove (state .sessionId ());
6062 break ;
6163 }
6264 case SplitInstallSessionStatus .CANCELED : {
63- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") cancelled" );
65+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") cancelled" );
6466 sessionIdToName .remove (state .sessionId ());
6567 break ;
6668 }
6769 case SplitInstallSessionStatus .CANCELING : {
68- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") canceling" );
70+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") canceling" );
6971 sessionIdToName .remove (state .sessionId ());
7072 break ;
7173 }
7274 case SplitInstallSessionStatus .PENDING : {
73- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") pending." );
75+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") pending." );
7476 break ;
7577 }
7678 case SplitInstallSessionStatus .REQUIRES_USER_CONFIRMATION : {
77- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") requires user confirmation." );
79+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") requires user confirmation." );
7880 break ;
7981 }
8082 case SplitInstallSessionStatus .DOWNLOADING : {
81- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") downloading." );
83+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") downloading." );
8284 break ;
8385 }
8486 case SplitInstallSessionStatus .DOWNLOADED : {
85- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") downloaded." );
87+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") downloaded." );
8688 break ;
8789 }
8890 case SplitInstallSessionStatus .INSTALLING : {
89- Log .e ( "flutter" , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") installing." );
91+ Log .d ( TAG , "Module \" " + sessionIdToName .get (state .sessionId ()) + "\" (sessionId " + state .sessionId () + ") installing." );
9092 break ;
9193 }
92- default : Log .e ( "flutter" , "Status: " + state .status ());
94+ default : Log .d ( TAG , "Status: " + state .status ());
9395 }
9496 }
9597 }
@@ -105,8 +107,11 @@ public PlayStoreDynamicFeatureManager(@NonNull Context context, @NonNull Flutter
105107 sessionIdToLoadingUnitId = new HashMap ();
106108 }
107109
108- public void downloadModule (@ NonNull String moduleName , int loadingUnitId ) {
109- Log .e ("flutter" , "INSTALLING MODULE " + moduleName + " " + flutterJNI );
110+ public void downloadFeature (String moduleName , int loadingUnitId ) {
111+ if (moduleName == null ) {
112+ Log .e (TAG , "Dynamic feature module name was null." );
113+ return ;
114+ }
110115
111116 SplitInstallRequest request =
112117 SplitInstallRequest
@@ -124,53 +129,50 @@ public void downloadModule(@NonNull String moduleName, int loadingUnitId) {
124129 .addOnSuccessListener (sessionId -> {
125130 this .sessionIdToName .put (sessionId , moduleName );
126131 this .sessionIdToLoadingUnitId .put (sessionId , loadingUnitId );
127- Log .e ( "flutter" , "Request to install module \" " + moduleName + "\" sent with session id " + sessionId + "." );
132+ Log .d ( TAG , "Request to install module \" " + moduleName + "\" sent with session id " + sessionId + "." );
128133 })
129134 .addOnFailureListener (exception -> {
130135 switch (((SplitInstallException ) exception ).getErrorCode ()) {
131136 case SplitInstallErrorCode .NETWORK_ERROR :
132- Log .e ( "flutter" , "Install of dynamic feature module \" " + moduleName + "\" failed with a network error" );
137+ Log .d ( TAG , "Install of dynamic feature module \" " + moduleName + "\" failed with a network error" );
133138 flutterJNI .dynamicFeatureInstallFailure (moduleName , loadingUnitId , "Install of dynamic feature module \" " + moduleName + "\" failed with a network error" , true );
134139 break ;
135140 case SplitInstallErrorCode .MODULE_UNAVAILABLE :
136- Log .e ( "flutter" , "Install of dynamic feature module \" " + moduleName + "\" failed as is unavailable." );
141+ Log .d ( TAG , "Install of dynamic feature module \" " + moduleName + "\" failed as is unavailable." );
137142 flutterJNI .dynamicFeatureInstallFailure (moduleName , loadingUnitId , "Install of dynamic feature module \" " + moduleName + "\" failed as is unavailable." , false );
138143 break ;
139144 default :
140- Log .e ( "flutter" , "Install of dynamic feature module \" " + moduleName + "\" failed with error: \" " + ((SplitInstallException ) exception ).getErrorCode () + "\" : " + ((SplitInstallException ) exception ).getMessage ());
145+ Log .d ( TAG , "Install of dynamic feature module \" " + moduleName + "\" failed with error: \" " + ((SplitInstallException ) exception ).getErrorCode () + "\" : " + ((SplitInstallException ) exception ).getMessage ());
141146 flutterJNI .dynamicFeatureInstallFailure (moduleName , loadingUnitId , "Install of dynamic feature module \" " + moduleName + "\" failed with error: \" " + ((SplitInstallException ) exception ).getErrorCode () + "\" : " + ((SplitInstallException ) exception ).getMessage (), false );
142147 break ;
143148 }
144149 });
145150 }
146151
147- public void extractModule (@ NonNull String moduleName , int loadingUnitId ) {
148- Log .e ("flutter" , "Extracting \" " + moduleName + "\" " + flutterJNI );
149-
152+ public void extractFeature (@ NonNull String moduleName , int loadingUnitId ) {
150153 try {
151154 context = context .createPackageContext (context .getPackageName (), 0 );
152155 // We only load dart shared lib for the loading unit id requested. Other loading units in the
153156 // dynamic feature module are not loaded, but can be loaded by calling again with their loading
154157 // unit id.
155- loadDartModules (moduleName , loadingUnitId );
158+ loadDartLibrary (moduleName , loadingUnitId );
156159 } catch (NameNotFoundException e ) {
157- Log .e ( "flutter" , "NameNotFoundException creating context for " + moduleName );
160+ Log .d ( TAG , "NameNotFoundException creating context for " + moduleName );
158161 throw new RuntimeException (e );
159162 }
160163 // TODO: Handle assets here.
161164 }
162165
163- public void loadDartModules (@ NonNull String moduleName , int loadingUnitId ) {
164- Log .e ("flutter" , "Loading dart modules \" " + moduleName + "\" " + flutterJNI );
166+ public void loadDartLibrary (String moduleName , int loadingUnitId ) {
165167 // This matches/depends on dart's loading unit naming convention, which we use unchanged.
166168 String aotSharedLibraryName = "app.so-" + loadingUnitId + ".part.so" ;
167169
168170 // Possible values: armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64
169171 String abi ;
170- if (Build .VERSION .SDK_INT < Build .VERSION_CODES .LOLLIPOP ) {
171- abi = Build .CPU_ABI ;
172- } else {
172+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
173173 abi = Build .SUPPORTED_ABIS [0 ];
174+ } else {
175+ abi = Build .CPU_ABI ;
174176 }
175177 String pathAbi = abi .replace ("-" , "_" ); // abis are represented with underscores in paths.
176178
@@ -198,19 +200,22 @@ public void loadDartModules(@NonNull String moduleName, int loadingUnitId) {
198200 }
199201 }
200202
201- // Usefull logging for development. Remove later.
202- Log .e ("flutter" , "" );
203- Log .e ("flutter" , "APKs " + apkPaths .size ());
204- for (String s : apkPaths ) Log .e ("flutter" , s );
205- Log .e ("flutter" , "" );
206- Log .e ("flutter" , "SO: " + soPath );
207- Log .e ("flutter" , "" );
208- Log .e ("flutter" , "ARCH: " + abi );
209- Log .e ("flutter" , "" );
210-
203+ // TODO(garyq): Handle assets in extractModule() above;
211204 AssetManager assetManager = context .getAssets ();
212205
213- flutterJNI .loadDartLibrary (loadingUnitId , abi , aotSharedLibraryName , assetManager , apkPaths .toArray (new String [apkPaths .size ()]));
206+ flutterJNI .loadDartLibrary (
207+ loadingUnitId ,
208+ aotSharedLibraryName ,
209+ apkPaths .toArray (new String [apkPaths .size ()]),
210+ abi ,
211+ soPath ,
212+ assetManager ,
213+ // TODO(garyq): Made the "flutter_assets" directory dynamic based off of DartEntryPoint.
214+ "flutter_assets" );
215+ }
216+
217+ public void uninstallFeature (String moduleName , int loadingUnitId ) {
218+ // TODO(garyq): support uninstalling.
214219 }
215220
216221 void destroy () {
0 commit comments