OSDN Git Service

Fix a print spooler crash when printing.
authorSvetoslav <svetoslavganov@google.com>
Fri, 19 Sep 2014 21:24:30 +0000 (14:24 -0700)
committerSvetoslav <svetoslavganov@google.com>
Fri, 19 Sep 2014 21:24:40 +0000 (14:24 -0700)
The spooler communicates with he remote PDF renderer asynchronously.
When print is confirmed we close the renderer, destroy it, and unbind
from its service. If we unbind from the service after the print activiy
is finished we get a crash. The bug was that we did not wait until we
disconnect from the remote renderer before finishing the print activity.

bug:17583115

Change-Id: I55b0135f9c5658b3a4fda2901b8b3bdef044e211

packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java
packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java

index a4555f1..f779f87 100644 (file)
@@ -110,13 +110,13 @@ public final class PageContentRepository {
         mRenderer.close(callback);
     }
 
-    public void destroy() {
+    public void destroy(Runnable callback) {
         throwIfNotClosed();
         mState = STATE_DESTROYED;
         if (DEBUG) {
             Log.i(LOG_TAG, "STATE_DESTROYED");
         }
-        doDestroy();
+        doDestroy(callback);
     }
 
     public void startPreload(int firstShownPage, int lastShownPage) {
@@ -163,19 +163,19 @@ public final class PageContentRepository {
         try {
             if (mState != STATE_DESTROYED) {
                 mCloseGuard.warnIfOpen();
-                doDestroy();
+                doDestroy(null);
             }
         } finally {
             super.finalize();
         }
     }
 
-    private void doDestroy() {
+    private void doDestroy(Runnable callback) {
         mState = STATE_DESTROYED;
         if (DEBUG) {
             Log.i(LOG_TAG, "STATE_DESTROYED");
         }
-        mRenderer.destroy();
+        mRenderer.destroy(callback);
     }
 
     private void throwIfNotOpened() {
@@ -536,7 +536,7 @@ public final class PageContentRepository {
             }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
         }
 
-        public void destroy() {
+        public void destroy(final Runnable callback) {
             new AsyncTask<Void, Void, Void>() {
                 @Override
                 protected Void doInBackground(Void... params) {
@@ -551,6 +551,10 @@ public final class PageContentRepository {
                     }
                     mPageContentCache.invalidate();
                     mPageContentCache.clear();
+                    if (callback != null) {
+                        callback.run();
+                    }
+
                 }
             }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
         }
index da8160a..20e774f 100644 (file)
@@ -488,9 +488,9 @@ public final class PageAdapter extends Adapter implements
         return selectedPages;
     }
 
-    public void destroy() {
+    public void destroy(Runnable callback) {
         throwIfNotClosed();
-        doDestroy();
+        doDestroy(callback);
     }
 
     @Override
@@ -498,7 +498,7 @@ public final class PageAdapter extends Adapter implements
         try {
             if (mState != STATE_DESTROYED) {
                 mCloseGuard.warnIfOpen();
-                doDestroy();
+                doDestroy(null);
             }
         } finally {
             super.finalize();
@@ -745,8 +745,8 @@ public final class PageAdapter extends Adapter implements
         mPageContentRepository.stopPreload();
     }
 
-    private void doDestroy() {
-        mPageContentRepository.destroy();
+    private void doDestroy(Runnable callback) {
+        mPageContentRepository.destroy(callback);
         mCloseGuard.close();
         mState = STATE_DESTROYED;
         if (DEBUG) {
index c4b3262..56497d7 100644 (file)
@@ -1562,12 +1562,18 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat
         if (mState != STATE_INITIALIZING) {
             mProgressMessageController.cancel();
             mPrinterRegistry.setTrackedPrinter(null);
-            mPrintPreviewController.destroy();
             mSpoolerProvider.destroy();
             mPrintedDocument.finish();
             mPrintedDocument.destroy();
+            mPrintPreviewController.destroy(new Runnable() {
+                @Override
+                public void run() {
+                    finish();
+                }
+            });
+        } else {
+            finish();
         }
-        finish();
     }
 
     private final class SpinnerItem<T> {
index 0d45352..e4eab10 100644 (file)
@@ -192,12 +192,15 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
         });
     }
 
-    public void destroy() {
+    public void destroy(Runnable callback) {
         if (mPageAdapter.isOpened()) {
-            mPageAdapter.close(null);
+            Message operation = mHandler.obtainMessage(MyHandler.MSG_CLOSE);
+            mHandler.enqueueOperation(operation);
         }
-        mRecyclerView.setAdapter(null);
-        mPageAdapter.destroy();
+
+        Message operation = mHandler.obtainMessage(MyHandler.MSG_DESTROY);
+        operation.obj = callback;
+        mHandler.enqueueOperation(operation);
     }
 
     @Override
@@ -292,7 +295,9 @@ class PrintPreviewController implements MutexFileProvider.OnReleaseRequestCallba
                 } break;
 
                 case MSG_DESTROY: {
-                    mPageAdapter.destroy();
+                    Runnable callback = (Runnable) message.obj;
+                    mRecyclerView.setAdapter(null);
+                    mPageAdapter.destroy(callback);
                     handleNextOperation();
                 } break;