Loading services/java/com/android/server/AppWidgetService.java +72 −43 Original line number Diff line number Diff line Loading @@ -172,6 +172,10 @@ class AppWidgetService extends IAppWidgetService.Stub boolean mSafeMode; boolean mStateLoaded; // These are for debugging only -- widgets are going missing in some rare instances ArrayList<Provider> mDeletedProviders = new ArrayList<Provider>(); ArrayList<Host> mDeletedHosts = new ArrayList<Host>(); AppWidgetService(Context context) { mContext = context; mPackageManager = context.getPackageManager(); Loading Loading @@ -219,23 +223,9 @@ class AppWidgetService extends IAppWidgetService.Stub } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump from from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); return; } synchronized (mAppWidgetIds) { int N = mInstalledProviders.size(); pw.println("Providers:"); for (int i=0; i<N; i++) { Provider p = mInstalledProviders.get(i); private void dumpProvider(Provider p, int index, PrintWriter pw) { AppWidgetProviderInfo info = p.info; pw.print(" ["); pw.print(i); pw.print("] provider "); pw.print(" ["); pw.print(index); pw.print("] provider "); pw.print(info.provider.flattenToShortString()); pw.println(':'); pw.print(" min=("); pw.print(info.minWidth); Loading @@ -253,12 +243,18 @@ class AppWidgetService extends IAppWidgetService.Stub pw.print(" zombie="); pw.println(p.zombie); } N = mAppWidgetIds.size(); pw.println(" "); pw.println("AppWidgetIds:"); for (int i=0; i<N; i++) { AppWidgetId id = mAppWidgetIds.get(i); pw.print(" ["); pw.print(i); pw.print("] id="); private void dumpHost(Host host, int index, PrintWriter pw) { pw.print(" ["); pw.print(index); pw.print("] hostId="); pw.print(host.hostId); pw.print(' '); pw.print(host.packageName); pw.print('/'); pw.print(host.uid); pw.println(':'); pw.print(" callbacks="); pw.println(host.callbacks); pw.print(" instances.size="); pw.print(host.instances.size()); pw.print(" zombie="); pw.println(host.zombie); } private void dumpAppWidgetId(AppWidgetId id, int index, PrintWriter pw) { pw.print(" ["); pw.print(index); pw.print("] id="); pw.println(id.appWidgetId); pw.print(" hostId="); pw.print(id.host.hostId); pw.print(' '); Loading @@ -276,18 +272,49 @@ class AppWidgetService extends IAppWidgetService.Stub } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump from from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); return; } synchronized (mAppWidgetIds) { int N = mInstalledProviders.size(); pw.println("Providers:"); for (int i=0; i<N; i++) { dumpProvider(mInstalledProviders.get(i), i, pw); } N = mAppWidgetIds.size(); pw.println(" "); pw.println("AppWidgetIds:"); for (int i=0; i<N; i++) { dumpAppWidgetId(mAppWidgetIds.get(i), i, pw); } N = mHosts.size(); pw.println(" "); pw.println("Hosts:"); for (int i=0; i<N; i++) { Host host = mHosts.get(i); pw.print(" ["); pw.print(i); pw.print("] hostId="); pw.print(host.hostId); pw.print(' '); pw.print(host.packageName); pw.print('/'); pw.print(host.uid); pw.println(':'); pw.print(" callbacks="); pw.println(host.callbacks); pw.print(" instances.size="); pw.print(host.instances.size()); pw.print(" zombie="); pw.println(host.zombie); dumpHost(mHosts.get(i), i, pw); } N = mDeletedProviders.size(); pw.println(" "); pw.println("Deleted Providers:"); for (int i=0; i<N; i++) { dumpProvider(mDeletedProviders.get(i), i, pw); } N = mDeletedHosts.size(); pw.println(" "); pw.println("Deleted Hosts:"); for (int i=0; i<N; i++) { dumpHost(mDeletedHosts.get(i), i, pw); } } } Loading Loading @@ -363,6 +390,7 @@ class AppWidgetService extends IAppWidgetService.Stub } host.instances.clear(); mHosts.remove(host); mDeletedHosts.add(host); // it's gone or going away, abruptly drop the callback connection host.callbacks = null; } Loading Loading @@ -934,6 +962,7 @@ class AppWidgetService extends IAppWidgetService.Stub } p.instances.clear(); mInstalledProviders.remove(index); mDeletedProviders.add(p); // no need to send the DISABLE broadcast, since the receiver is gone anyway cancelBroadcasts(p); } Loading Loading
services/java/com/android/server/AppWidgetService.java +72 −43 Original line number Diff line number Diff line Loading @@ -172,6 +172,10 @@ class AppWidgetService extends IAppWidgetService.Stub boolean mSafeMode; boolean mStateLoaded; // These are for debugging only -- widgets are going missing in some rare instances ArrayList<Provider> mDeletedProviders = new ArrayList<Provider>(); ArrayList<Host> mDeletedHosts = new ArrayList<Host>(); AppWidgetService(Context context) { mContext = context; mPackageManager = context.getPackageManager(); Loading Loading @@ -219,23 +223,9 @@ class AppWidgetService extends IAppWidgetService.Stub } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump from from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); return; } synchronized (mAppWidgetIds) { int N = mInstalledProviders.size(); pw.println("Providers:"); for (int i=0; i<N; i++) { Provider p = mInstalledProviders.get(i); private void dumpProvider(Provider p, int index, PrintWriter pw) { AppWidgetProviderInfo info = p.info; pw.print(" ["); pw.print(i); pw.print("] provider "); pw.print(" ["); pw.print(index); pw.print("] provider "); pw.print(info.provider.flattenToShortString()); pw.println(':'); pw.print(" min=("); pw.print(info.minWidth); Loading @@ -253,12 +243,18 @@ class AppWidgetService extends IAppWidgetService.Stub pw.print(" zombie="); pw.println(p.zombie); } N = mAppWidgetIds.size(); pw.println(" "); pw.println("AppWidgetIds:"); for (int i=0; i<N; i++) { AppWidgetId id = mAppWidgetIds.get(i); pw.print(" ["); pw.print(i); pw.print("] id="); private void dumpHost(Host host, int index, PrintWriter pw) { pw.print(" ["); pw.print(index); pw.print("] hostId="); pw.print(host.hostId); pw.print(' '); pw.print(host.packageName); pw.print('/'); pw.print(host.uid); pw.println(':'); pw.print(" callbacks="); pw.println(host.callbacks); pw.print(" instances.size="); pw.print(host.instances.size()); pw.print(" zombie="); pw.println(host.zombie); } private void dumpAppWidgetId(AppWidgetId id, int index, PrintWriter pw) { pw.print(" ["); pw.print(index); pw.print("] id="); pw.println(id.appWidgetId); pw.print(" hostId="); pw.print(id.host.hostId); pw.print(' '); Loading @@ -276,18 +272,49 @@ class AppWidgetService extends IAppWidgetService.Stub } } @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) != PackageManager.PERMISSION_GRANTED) { pw.println("Permission Denial: can't dump from from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); return; } synchronized (mAppWidgetIds) { int N = mInstalledProviders.size(); pw.println("Providers:"); for (int i=0; i<N; i++) { dumpProvider(mInstalledProviders.get(i), i, pw); } N = mAppWidgetIds.size(); pw.println(" "); pw.println("AppWidgetIds:"); for (int i=0; i<N; i++) { dumpAppWidgetId(mAppWidgetIds.get(i), i, pw); } N = mHosts.size(); pw.println(" "); pw.println("Hosts:"); for (int i=0; i<N; i++) { Host host = mHosts.get(i); pw.print(" ["); pw.print(i); pw.print("] hostId="); pw.print(host.hostId); pw.print(' '); pw.print(host.packageName); pw.print('/'); pw.print(host.uid); pw.println(':'); pw.print(" callbacks="); pw.println(host.callbacks); pw.print(" instances.size="); pw.print(host.instances.size()); pw.print(" zombie="); pw.println(host.zombie); dumpHost(mHosts.get(i), i, pw); } N = mDeletedProviders.size(); pw.println(" "); pw.println("Deleted Providers:"); for (int i=0; i<N; i++) { dumpProvider(mDeletedProviders.get(i), i, pw); } N = mDeletedHosts.size(); pw.println(" "); pw.println("Deleted Hosts:"); for (int i=0; i<N; i++) { dumpHost(mDeletedHosts.get(i), i, pw); } } } Loading Loading @@ -363,6 +390,7 @@ class AppWidgetService extends IAppWidgetService.Stub } host.instances.clear(); mHosts.remove(host); mDeletedHosts.add(host); // it's gone or going away, abruptly drop the callback connection host.callbacks = null; } Loading Loading @@ -934,6 +962,7 @@ class AppWidgetService extends IAppWidgetService.Stub } p.instances.clear(); mInstalledProviders.remove(index); mDeletedProviders.add(p); // no need to send the DISABLE broadcast, since the receiver is gone anyway cancelBroadcasts(p); } Loading