Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2eae8eb7 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Prevent PrintRegistry callbacks when finishing

Previously these callbacks could happen while we clean up the print
preview controller. Then these callbacks called in destroyed and cleaned
up modules.

Fixes: 29874802
Change-Id: I5d8497e3364b97a33a837f8e3e825e5d254592f9
parent a2beb448
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2060,6 +2060,7 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat

        if (mPrinterRegistry != null) {
            mPrinterRegistry.setTrackedPrinter(null);
            mPrinterRegistry.setOnPrintersChangeListener(null);
        }

        if (mPrintersObserver != null) {
+20 −24
Original line number Diff line number Diff line
@@ -120,13 +120,11 @@ public class PrinterRegistry {
        @Override
        public void onLoaderReset(Loader<List<PrinterInfo>> loader) {
            mPrinters.clear();
            if (mOnPrintersChangeListener != null) {

            // Post a message as we are in onLoadFinished and certain operations
            // are not allowed in this callback, such as fragment transactions.
            // Clients should not handle this explicitly.
                mHandler.obtainMessage(MyHandler.MSG_PRINTERS_INVALID,
                        mOnPrintersChangeListener).sendToTarget();
            }
            mHandler.obtainMessage(MyHandler.MSG_PRINTERS_INVALID).sendToTarget();
        }

        // LoaderCallbacks#onLoadFinished
@@ -134,15 +132,12 @@ public class PrinterRegistry {
        public void onLoadFinished(Loader<List<PrinterInfo>> loader, List<PrinterInfo> printers) {
            mPrinters.clear();
            mPrinters.addAll(printers);
            if (mOnPrintersChangeListener != null) {

            // Post a message as we are in onLoadFinished and certain operations
            // are not allowed in this callback, such as fragment transactions.
            // Clients should not handle this explicitly.
                SomeArgs args = SomeArgs.obtain();
                args.arg1 = mOnPrintersChangeListener;
                args.arg2 = printers;
                mHandler.obtainMessage(MyHandler.MSG_PRINTERS_CHANGED, args).sendToTarget();
            }
            mHandler.obtainMessage(MyHandler.MSG_PRINTERS_CHANGED, printers).sendToTarget();

            if (!mReady) {
                mReady = true;
                if (mReadyCallback != null) {
@@ -158,7 +153,7 @@ public class PrinterRegistry {
        }
    };

    private static final class MyHandler extends Handler {
    private final class MyHandler extends Handler {
        public static final int MSG_PRINTERS_CHANGED = 0;
        public static final int MSG_PRINTERS_INVALID = 1;

@@ -171,16 +166,17 @@ public class PrinterRegistry {
        public void handleMessage(Message message) {
            switch (message.what) {
                case MSG_PRINTERS_CHANGED: {
                    SomeArgs args = (SomeArgs) message.obj;
                    OnPrintersChangeListener callback = (OnPrintersChangeListener) args.arg1;
                    List<PrinterInfo> printers = (List<PrinterInfo>) args.arg2;
                    args.recycle();
                    callback.onPrintersChanged(printers);
                    List<PrinterInfo> printers = (List<PrinterInfo>) message.obj;

                    if (mOnPrintersChangeListener != null) {
                        mOnPrintersChangeListener.onPrintersChanged(printers);
                    }
                } break;

                case MSG_PRINTERS_INVALID: {
                    OnPrintersChangeListener callback = (OnPrintersChangeListener) message.obj;
                    callback.onPrintersInvalid();
                    if (mOnPrintersChangeListener != null) {
                        mOnPrintersChangeListener.onPrintersInvalid();
                    }
                } break;
            }
        }