Glance or Android RemoteView in on demand feature delivery

365 Views Asked by At

I'm currently developing an app and making a widget with Glance. App size spiked from 2.8MB to 5.3MB from Glance.

I'm thinking to use Dynamic Feature/Delivery to reduce the app size issue so user only need to download the widget when they need to.

But I got a strange crash even after the module is downloaded. The widget cannot render and only shows "Can't load widget" text in the launcher.

The error doesn't happen if I set the module at install time:

         <dist:install-time>

            <dist:removable dist:value="false"/>

        </dist:install-time>

When I changed into on demand it's broken:

        <dist:on-demand />

Here's the error log

 Error inflating AppWidget AppWidgetProviderInfo(UserHandle{0}/ComponentInfo{com.example.foo/com.example.foo.glance.ui.glance.MyWidgetReceiver})
                                                                                                android.content.res.Resources$NotFoundException: Resource ID #0x0
                                                                                                    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:240)
                                                                                                    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2529)
                                                                                                    at android.content.res.Resources.getLayout(Resources.java:1335)
                                                                                                    at android.view.LayoutInflater.inflate(LayoutInflater.java:536)
                                                                                                    at android.appwidget.AppWidgetHostView.getDefaultView(AppWidgetHostView.java:926)
                                                                                                    at android.appwidget.AppWidgetHostView.applyRemoteViews(AppWidgetHostView.java:579)
                                                                                                    at android.appwidget.AppWidgetHostView.updateAppWidget(AppWidgetHostView.java:533)
                                                                                                    at com.android.launcher3.widget.LauncherAppWidgetHostView.updateAppWidget(LauncherAppWidgetHostView.java:247)
                                                                                                    at android.appwidget.AppWidgetHost.updateAppWidgetView(AppWidgetHost.java:529)
                                                                                                    at android.appwidget.AppWidgetHost$UpdateHandler.handleMessage(AppWidgetHost.java:158)
                                                                                                    at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                    at android.os.Looper.loopOnce(Looper.java:226)
                                                                                                    at android.os.Looper.loop(Looper.java:313)
                                                                                                    at android.app.ActivityThread.main(ActivityThread.java:8751)
                                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
                                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

Is there any idea how can I enable widget via dynamic delivery?

1

There are 1 best solutions below

1
Marcel On

Few things to consider:

Dynamic modules AndroidManifest gets merged into the base module. Thus the widget provider is present in the base module, meaning, even if the Dynamic feature is not installed the widget will be present in the picker.

A possible solution is to have the receiver disabled and enable it programatically once the DF is downloaded (example)

Now, for the ResourceNotFound issue that could be related to the location of the initial layout or resources defined in the widget metadata.

Are you defining a initialLayout? If yes, maybe try to move that to the base module?