@@ -172,6 +172,10 @@ public void disconnect() {
172172 boolean mSafeMode ;
173173 boolean mStateLoaded ;
174174
175+ // These are for debugging only -- widgets are going missing in some rare instances
176+ ArrayList <Provider > mDeletedProviders = new ArrayList <Provider >();
177+ ArrayList <Host > mDeletedHosts = new ArrayList <Host >();
178+
175179 AppWidgetService (Context context ) {
176180 mContext = context ;
177181 mPackageManager = context .getPackageManager ();
@@ -219,6 +223,55 @@ private void ensureStateLoadedLocked() {
219223 }
220224 }
221225
226+ private void dumpProvider (Provider p , int index , PrintWriter pw ) {
227+ AppWidgetProviderInfo info = p .info ;
228+ pw .print (" [" ); pw .print (index ); pw .print ("] provider " );
229+ pw .print (info .provider .flattenToShortString ());
230+ pw .println (':' );
231+ pw .print (" min=(" ); pw .print (info .minWidth );
232+ pw .print ("x" ); pw .print (info .minHeight );
233+ pw .print (") minResize=(" ); pw .print (info .minResizeWidth );
234+ pw .print ("x" ); pw .print (info .minResizeHeight );
235+ pw .print (") updatePeriodMillis=" );
236+ pw .print (info .updatePeriodMillis );
237+ pw .print (" resizeMode=" );
238+ pw .print (info .resizeMode );
239+ pw .print (" autoAdvanceViewId=" );
240+ pw .print (info .autoAdvanceViewId );
241+ pw .print (" initialLayout=#" );
242+ pw .print (Integer .toHexString (info .initialLayout ));
243+ pw .print (" zombie=" ); pw .println (p .zombie );
244+ }
245+
246+ private void dumpHost (Host host , int index , PrintWriter pw ) {
247+ pw .print (" [" ); pw .print (index ); pw .print ("] hostId=" );
248+ pw .print (host .hostId ); pw .print (' ' );
249+ pw .print (host .packageName ); pw .print ('/' );
250+ pw .print (host .uid ); pw .println (':' );
251+ pw .print (" callbacks=" ); pw .println (host .callbacks );
252+ pw .print (" instances.size=" ); pw .print (host .instances .size ());
253+ pw .print (" zombie=" ); pw .println (host .zombie );
254+ }
255+
256+ private void dumpAppWidgetId (AppWidgetId id , int index , PrintWriter pw ) {
257+ pw .print (" [" ); pw .print (index ); pw .print ("] id=" );
258+ pw .println (id .appWidgetId );
259+ pw .print (" hostId=" );
260+ pw .print (id .host .hostId ); pw .print (' ' );
261+ pw .print (id .host .packageName ); pw .print ('/' );
262+ pw .println (id .host .uid );
263+ if (id .provider != null ) {
264+ pw .print (" provider=" );
265+ pw .println (id .provider .info .provider .flattenToShortString ());
266+ }
267+ if (id .host != null ) {
268+ pw .print (" host.callbacks=" ); pw .println (id .host .callbacks );
269+ }
270+ if (id .views != null ) {
271+ pw .print (" views=" ); pw .println (id .views );
272+ }
273+ }
274+
222275 @ Override
223276 public void dump (FileDescriptor fd , PrintWriter pw , String [] args ) {
224277 if (mContext .checkCallingOrSelfPermission (android .Manifest .permission .DUMP )
@@ -233,61 +286,35 @@ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
233286 int N = mInstalledProviders .size ();
234287 pw .println ("Providers:" );
235288 for (int i =0 ; i <N ; i ++) {
236- Provider p = mInstalledProviders .get (i );
237- AppWidgetProviderInfo info = p .info ;
238- pw .print (" [" ); pw .print (i ); pw .print ("] provider " );
239- pw .print (info .provider .flattenToShortString ());
240- pw .println (':' );
241- pw .print (" min=(" ); pw .print (info .minWidth );
242- pw .print ("x" ); pw .print (info .minHeight );
243- pw .print (") minResize=(" ); pw .print (info .minResizeWidth );
244- pw .print ("x" ); pw .print (info .minResizeHeight );
245- pw .print (") updatePeriodMillis=" );
246- pw .print (info .updatePeriodMillis );
247- pw .print (" resizeMode=" );
248- pw .print (info .resizeMode );
249- pw .print (" autoAdvanceViewId=" );
250- pw .print (info .autoAdvanceViewId );
251- pw .print (" initialLayout=#" );
252- pw .print (Integer .toHexString (info .initialLayout ));
253- pw .print (" zombie=" ); pw .println (p .zombie );
289+ dumpProvider (mInstalledProviders .get (i ), i , pw );
254290 }
255291
256292 N = mAppWidgetIds .size ();
257293 pw .println (" " );
258294 pw .println ("AppWidgetIds:" );
259295 for (int i =0 ; i <N ; i ++) {
260- AppWidgetId id = mAppWidgetIds .get (i );
261- pw .print (" [" ); pw .print (i ); pw .print ("] id=" );
262- pw .println (id .appWidgetId );
263- pw .print (" hostId=" );
264- pw .print (id .host .hostId ); pw .print (' ' );
265- pw .print (id .host .packageName ); pw .print ('/' );
266- pw .println (id .host .uid );
267- if (id .provider != null ) {
268- pw .print (" provider=" );
269- pw .println (id .provider .info .provider .flattenToShortString ());
270- }
271- if (id .host != null ) {
272- pw .print (" host.callbacks=" ); pw .println (id .host .callbacks );
273- }
274- if (id .views != null ) {
275- pw .print (" views=" ); pw .println (id .views );
276- }
296+ dumpAppWidgetId (mAppWidgetIds .get (i ), i , pw );
277297 }
278298
279299 N = mHosts .size ();
280300 pw .println (" " );
281301 pw .println ("Hosts:" );
282302 for (int i =0 ; i <N ; i ++) {
283- Host host = mHosts .get (i );
284- pw .print (" [" ); pw .print (i ); pw .print ("] hostId=" );
285- pw .print (host .hostId ); pw .print (' ' );
286- pw .print (host .packageName ); pw .print ('/' );
287- pw .print (host .uid ); pw .println (':' );
288- pw .print (" callbacks=" ); pw .println (host .callbacks );
289- pw .print (" instances.size=" ); pw .print (host .instances .size ());
290- pw .print (" zombie=" ); pw .println (host .zombie );
303+ dumpHost (mHosts .get (i ), i , pw );
304+ }
305+
306+ N = mDeletedProviders .size ();
307+ pw .println (" " );
308+ pw .println ("Deleted Providers:" );
309+ for (int i =0 ; i <N ; i ++) {
310+ dumpProvider (mDeletedProviders .get (i ), i , pw );
311+ }
312+
313+ N = mDeletedHosts .size ();
314+ pw .println (" " );
315+ pw .println ("Deleted Hosts:" );
316+ for (int i =0 ; i <N ; i ++) {
317+ dumpHost (mDeletedHosts .get (i ), i , pw );
291318 }
292319 }
293320 }
@@ -363,6 +390,7 @@ void deleteHostLocked(Host host) {
363390 }
364391 host .instances .clear ();
365392 mHosts .remove (host );
393+ mDeletedHosts .add (host );
366394 // it's gone or going away, abruptly drop the callback connection
367395 host .callbacks = null ;
368396 }
@@ -934,6 +962,7 @@ void removeProviderLocked(int index, Provider p) {
934962 }
935963 p .instances .clear ();
936964 mInstalledProviders .remove (index );
965+ mDeletedProviders .add (p );
937966 // no need to send the DISABLE broadcast, since the receiver is gone anyway
938967 cancelBroadcasts (p );
939968 }
0 commit comments