Loading packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java +95 −63 Original line number Diff line number Diff line Loading @@ -412,6 +412,8 @@ public final class PageContentRepository { @GuardedBy("mLock") private IPdfRenderer mRenderer; private OpenTask mOpenTask; private boolean mBoundToService; private boolean mDestroyed; Loading Loading @@ -439,75 +441,15 @@ public final class PageContentRepository { } } public void open(final ParcelFileDescriptor source, final OpenDocumentCallback callback) { public void open(ParcelFileDescriptor source, OpenDocumentCallback callback) { // Opening a new document invalidates the cache as it has pages // from the last document. We keep the cache even when the document // is closed to show pages while the other side is writing the new // document. mPageContentCache.invalidate(); new AsyncTask<Void, Void, Integer>() { @Override protected void onPreExecute() { if (mDestroyed) { cancel(true); return; } Intent intent = new Intent(PdfManipulationService.ACTION_GET_RENDERER); intent.setClass(mContext, PdfManipulationService.class); intent.setData(Uri.fromParts("fake-scheme", String.valueOf( AsyncRenderer.this.hashCode()), null)); mContext.bindService(intent, AsyncRenderer.this, Context.BIND_AUTO_CREATE); mBoundToService = true; } @Override protected Integer doInBackground(Void... params) { synchronized (mLock) { while (mRenderer == null) { try { mLock.wait(); } catch (InterruptedException ie) { /* ignore */ } } try { return mRenderer.openDocument(source); } catch (RemoteException re) { Log.e(LOG_TAG, "Cannot open PDF document"); return PdfManipulationService.ERROR_MALFORMED_PDF_FILE; } finally { // Close the fd as we passed it to another process // which took ownership. IoUtils.closeQuietly(source); } } } @Override public void onPostExecute(Integer pageCount) { switch (pageCount) { case PdfManipulationService.ERROR_MALFORMED_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (callback != null) { callback.onFailure(OpenDocumentCallback.ERROR_MALFORMED_PDF_FILE); } } break; case PdfManipulationService.ERROR_SECURE_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (callback != null) { callback.onFailure(OpenDocumentCallback.ERROR_SECURE_PDF_FILE); } } break; default: { mPageCount = pageCount; if (callback != null) { callback.onSuccess(); } } break; } } }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); mOpenTask = new OpenTask(source, callback); mOpenTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } public void close(final Runnable callback) { Loading Loading @@ -549,6 +491,11 @@ public final class PageContentRepository { mBoundToService = false; mContext.unbindService(AsyncRenderer.this); } if (mOpenTask != null) { mOpenTask.cancel(); } mPageContentCache.invalidate(); mPageContentCache.clear(); mDestroyed = true; Loading Loading @@ -687,6 +634,91 @@ public final class PageContentRepository { } } private final class OpenTask extends AsyncTask<Void, Void, Integer> { private final ParcelFileDescriptor mSource; private final OpenDocumentCallback mCallback; public OpenTask(ParcelFileDescriptor source, OpenDocumentCallback callback) { mSource = source; mCallback = callback; } @Override protected void onPreExecute() { if (mDestroyed) { cancel(true); return; } Intent intent = new Intent(PdfManipulationService.ACTION_GET_RENDERER); intent.setClass(mContext, PdfManipulationService.class); intent.setData(Uri.fromParts("fake-scheme", String.valueOf( AsyncRenderer.this.hashCode()), null)); mContext.bindService(intent, AsyncRenderer.this, Context.BIND_AUTO_CREATE); mBoundToService = true; } @Override protected Integer doInBackground(Void... params) { synchronized (mLock) { while (mRenderer == null && !isCancelled()) { try { mLock.wait(); } catch (InterruptedException ie) { /* ignore */ } } try { return mRenderer.openDocument(mSource); } catch (RemoteException re) { Log.e(LOG_TAG, "Cannot open PDF document"); return PdfManipulationService.ERROR_MALFORMED_PDF_FILE; } finally { // Close the fd as we passed it to another process // which took ownership. IoUtils.closeQuietly(mSource); } } } @Override public void onPostExecute(Integer pageCount) { switch (pageCount) { case PdfManipulationService.ERROR_MALFORMED_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (mCallback != null) { mCallback.onFailure(OpenDocumentCallback.ERROR_MALFORMED_PDF_FILE); } } break; case PdfManipulationService.ERROR_SECURE_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (mCallback != null) { mCallback.onFailure(OpenDocumentCallback.ERROR_SECURE_PDF_FILE); } } break; default: { mPageCount = pageCount; if (mCallback != null) { mCallback.onSuccess(); } } break; } mOpenTask = null; } @Override protected void onCancelled(Integer integer) { mOpenTask = null; } public void cancel() { cancel(true); synchronized(mLock) { mLock.notifyAll(); } } } private final class RenderPageTask extends AsyncTask<Void, Void, RenderedPage> { final int mPageIndex; final RenderSpec mRenderSpec; Loading packages/PrintSpooler/src/com/android/printspooler/ui/FusedPrintersProvider.java +8 −7 Original line number Diff line number Diff line Loading @@ -346,7 +346,6 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { private List<PrinterInfo> mHistoricalPrinters = new ArrayList<>(); private boolean mReadHistoryCompleted; private boolean mReadHistoryInProgress; private ReadTask mReadTask; Loading @@ -358,7 +357,7 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { } public boolean isReadHistoryInProgress() { return mReadHistoryInProgress; return mReadTask != null; } public boolean isReadHistoryCompleted() { Loading @@ -366,9 +365,7 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { } public boolean stopReadPrinterHistory() { final boolean cancelled = mReadTask.cancel(true); mReadTask = null; return cancelled; return mReadTask.cancel(true); } public void readPrinterHistory() { Loading @@ -376,7 +373,6 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { Log.i(LOG_TAG, "read history started " + FusedPrintersProvider.this.hashCode()); } mReadHistoryInProgress = true; mReadTask = new ReadTask(); mReadTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); } Loading Loading @@ -534,15 +530,20 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { mFavoritePrinters.clear(); mFavoritePrinters.addAll(computeFavoritePrinters(mHistoricalPrinters)); mReadHistoryInProgress = false; mReadHistoryCompleted = true; // Deliver the printers. updatePrinters(mDiscoverySession.getPrinters(), mFavoritePrinters); // We are done. mReadTask = null; // Loading the available printers if needed. loadInternal(); } @Override protected void onCancelled(List<PrinterInfo> printerInfos) { // We are done. mReadTask = null; } Loading packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +6 −1 Original line number Diff line number Diff line Loading @@ -291,6 +291,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (isFinishing() || (isFinalState(mState) && !mPrintedDocument.isUpdating())) { return; } if (mPrintedDocument.isUpdating()) { mPrintedDocument.cancel(); } setState(STATE_PRINT_CANCELED); doFinish(); } Loading Loading @@ -558,8 +561,10 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (mPrintPreviewController != null) { mPrintPreviewController.onOrientationChanged(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Loading Loading
packages/PrintSpooler/src/com/android/printspooler/model/PageContentRepository.java +95 −63 Original line number Diff line number Diff line Loading @@ -412,6 +412,8 @@ public final class PageContentRepository { @GuardedBy("mLock") private IPdfRenderer mRenderer; private OpenTask mOpenTask; private boolean mBoundToService; private boolean mDestroyed; Loading Loading @@ -439,75 +441,15 @@ public final class PageContentRepository { } } public void open(final ParcelFileDescriptor source, final OpenDocumentCallback callback) { public void open(ParcelFileDescriptor source, OpenDocumentCallback callback) { // Opening a new document invalidates the cache as it has pages // from the last document. We keep the cache even when the document // is closed to show pages while the other side is writing the new // document. mPageContentCache.invalidate(); new AsyncTask<Void, Void, Integer>() { @Override protected void onPreExecute() { if (mDestroyed) { cancel(true); return; } Intent intent = new Intent(PdfManipulationService.ACTION_GET_RENDERER); intent.setClass(mContext, PdfManipulationService.class); intent.setData(Uri.fromParts("fake-scheme", String.valueOf( AsyncRenderer.this.hashCode()), null)); mContext.bindService(intent, AsyncRenderer.this, Context.BIND_AUTO_CREATE); mBoundToService = true; } @Override protected Integer doInBackground(Void... params) { synchronized (mLock) { while (mRenderer == null) { try { mLock.wait(); } catch (InterruptedException ie) { /* ignore */ } } try { return mRenderer.openDocument(source); } catch (RemoteException re) { Log.e(LOG_TAG, "Cannot open PDF document"); return PdfManipulationService.ERROR_MALFORMED_PDF_FILE; } finally { // Close the fd as we passed it to another process // which took ownership. IoUtils.closeQuietly(source); } } } @Override public void onPostExecute(Integer pageCount) { switch (pageCount) { case PdfManipulationService.ERROR_MALFORMED_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (callback != null) { callback.onFailure(OpenDocumentCallback.ERROR_MALFORMED_PDF_FILE); } } break; case PdfManipulationService.ERROR_SECURE_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (callback != null) { callback.onFailure(OpenDocumentCallback.ERROR_SECURE_PDF_FILE); } } break; default: { mPageCount = pageCount; if (callback != null) { callback.onSuccess(); } } break; } } }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); mOpenTask = new OpenTask(source, callback); mOpenTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); } public void close(final Runnable callback) { Loading Loading @@ -549,6 +491,11 @@ public final class PageContentRepository { mBoundToService = false; mContext.unbindService(AsyncRenderer.this); } if (mOpenTask != null) { mOpenTask.cancel(); } mPageContentCache.invalidate(); mPageContentCache.clear(); mDestroyed = true; Loading Loading @@ -687,6 +634,91 @@ public final class PageContentRepository { } } private final class OpenTask extends AsyncTask<Void, Void, Integer> { private final ParcelFileDescriptor mSource; private final OpenDocumentCallback mCallback; public OpenTask(ParcelFileDescriptor source, OpenDocumentCallback callback) { mSource = source; mCallback = callback; } @Override protected void onPreExecute() { if (mDestroyed) { cancel(true); return; } Intent intent = new Intent(PdfManipulationService.ACTION_GET_RENDERER); intent.setClass(mContext, PdfManipulationService.class); intent.setData(Uri.fromParts("fake-scheme", String.valueOf( AsyncRenderer.this.hashCode()), null)); mContext.bindService(intent, AsyncRenderer.this, Context.BIND_AUTO_CREATE); mBoundToService = true; } @Override protected Integer doInBackground(Void... params) { synchronized (mLock) { while (mRenderer == null && !isCancelled()) { try { mLock.wait(); } catch (InterruptedException ie) { /* ignore */ } } try { return mRenderer.openDocument(mSource); } catch (RemoteException re) { Log.e(LOG_TAG, "Cannot open PDF document"); return PdfManipulationService.ERROR_MALFORMED_PDF_FILE; } finally { // Close the fd as we passed it to another process // which took ownership. IoUtils.closeQuietly(mSource); } } } @Override public void onPostExecute(Integer pageCount) { switch (pageCount) { case PdfManipulationService.ERROR_MALFORMED_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (mCallback != null) { mCallback.onFailure(OpenDocumentCallback.ERROR_MALFORMED_PDF_FILE); } } break; case PdfManipulationService.ERROR_SECURE_PDF_FILE: { mPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; if (mCallback != null) { mCallback.onFailure(OpenDocumentCallback.ERROR_SECURE_PDF_FILE); } } break; default: { mPageCount = pageCount; if (mCallback != null) { mCallback.onSuccess(); } } break; } mOpenTask = null; } @Override protected void onCancelled(Integer integer) { mOpenTask = null; } public void cancel() { cancel(true); synchronized(mLock) { mLock.notifyAll(); } } } private final class RenderPageTask extends AsyncTask<Void, Void, RenderedPage> { final int mPageIndex; final RenderSpec mRenderSpec; Loading
packages/PrintSpooler/src/com/android/printspooler/ui/FusedPrintersProvider.java +8 −7 Original line number Diff line number Diff line Loading @@ -346,7 +346,6 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { private List<PrinterInfo> mHistoricalPrinters = new ArrayList<>(); private boolean mReadHistoryCompleted; private boolean mReadHistoryInProgress; private ReadTask mReadTask; Loading @@ -358,7 +357,7 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { } public boolean isReadHistoryInProgress() { return mReadHistoryInProgress; return mReadTask != null; } public boolean isReadHistoryCompleted() { Loading @@ -366,9 +365,7 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { } public boolean stopReadPrinterHistory() { final boolean cancelled = mReadTask.cancel(true); mReadTask = null; return cancelled; return mReadTask.cancel(true); } public void readPrinterHistory() { Loading @@ -376,7 +373,6 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { Log.i(LOG_TAG, "read history started " + FusedPrintersProvider.this.hashCode()); } mReadHistoryInProgress = true; mReadTask = new ReadTask(); mReadTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); } Loading Loading @@ -534,15 +530,20 @@ public final class FusedPrintersProvider extends Loader<List<PrinterInfo>> { mFavoritePrinters.clear(); mFavoritePrinters.addAll(computeFavoritePrinters(mHistoricalPrinters)); mReadHistoryInProgress = false; mReadHistoryCompleted = true; // Deliver the printers. updatePrinters(mDiscoverySession.getPrinters(), mFavoritePrinters); // We are done. mReadTask = null; // Loading the available printers if needed. loadInternal(); } @Override protected void onCancelled(List<PrinterInfo> printerInfos) { // We are done. mReadTask = null; } Loading
packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +6 −1 Original line number Diff line number Diff line Loading @@ -291,6 +291,9 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat if (isFinishing() || (isFinalState(mState) && !mPrintedDocument.isUpdating())) { return; } if (mPrintedDocument.isUpdating()) { mPrintedDocument.cancel(); } setState(STATE_PRINT_CANCELED); doFinish(); } Loading Loading @@ -558,8 +561,10 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (mPrintPreviewController != null) { mPrintPreviewController.onOrientationChanged(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Loading