Sadly, supplying the widget id on the intent doesn't fix the problem - the
cancellation of widget creation is never broadcast back to the provider.
It's actually a pretty obvious bug in Launcher (when you're looking for it
that is):
In onActivityResult(), the cancellation is checked for request
code REQUEST_PICK_APPWIDGET whereas it should be checking
for REQUEST_CREATE_APPWIDGET.

Line 338 in:

http://android.git.kernel.org/?p=platform/packages/apps/Launcher.git;a=blob;f=src/com/android/launcher/Launcher.java

I'd judge it to be a fairly significant issue. Do I need to start adding a
workaround now (a dead list of widgetIds that my provider ignores?) or will
a fix be quick coming?

Tom.

2009/4/20 Tom Gibara <[email protected]>

> Re-use of the RemoteViews is clear to me now.
>
> I wasn't passing back the widget id when configuration is cancelled (the
> widget example in the SDK  doesn't do this either when the back button is
> pressed). The APPWIDGET_UPDATE broadcast before configuration doesn't
> surprise me, but having to pass the widget id back does. It seems like state
> that my caller should be retaining. Also the result of not passing back the
> widget id is very surprising: an application performs a misdemeanour
> (forgetting to include an intent extra) and the consequence is an invisible
> widget that leaches resources but cannot be removed by the user nor the
> application.
> Thanks for all the help,
>
> Tom.
>
> 2009/4/20 Jeff Sharkey <[email protected]>
>
>>
>> > I'm still confused by how the
>> > widget service decides which views to recycle and in what way.
>>
>> It recycles entire layouts.  If you send a RemoteViews with the same
>> layout, it just applies the new set of actions over the top of the
>> existing layout, including any current state.  So to be safe you'll
>> want to cover all cases when pushing an update.  For example, if you
>> hide a view in one special case, you'll want to explicitly set it
>> visible again for all other cases, because you can't know the current
>> state you're recycling against.  (Or you can just use a different
>> layout for each case, possibly taking advantage of <include /> as
>> needed.)
>>
>>
>> > I'm receiving a perpetual string
>> > of updates that include the id that should be delete,
>>
>> Yes, that does look like a bug.  It looks like the extras bundle in
>> that broadcast lagging behind because we're not resetting it on
>> delete.  If you /add/ a widget, it should force a refresh of that
>> broadcast bundle and remove any deleted IDs.
>>
>>
>> > when my widget is added,
>> > the APPWIDGET_UPDATE broadcast is received _before_ the configuration
>> > activity is displayed.
>>
>> Yes, that's correct.  The configure activity is launched by the
>> AppWidgetHost (in this case Launcher), instead of by the
>> AppWidgetService.  This allows a custom AppWidgetHost to have
>> pre-configuration placement on their home screen.  Also, it forces
>> developers to push an explicit update when their configuration is
>> finished.  (This makes sure they are ready for AppWidgetHosts that can
>> launch configure at any time, not just during first-insert.)
>>
>>
>> > If I cancel the activity (ie. return a
>> > RESULT_CANCELED as the result) I will continue to receive update events
>> for
>> > this new phantom widget - it's not visible anywhere but continues to be
>> > included in update requests.
>>
>> Are you passing back the appWidgetId in the result extras bundle when
>> sending back the RESULT_CANCELED?  Launcher should try cleaning up any
>> "canceled" widgets like that, but only if the EXTRA_APPWIDGET_ID is
>> passed back.
>>
>>
>> --
>> Jeff Sharkey
>> [email protected]
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to