166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann/*
266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Copyright (C) 2016 The Android Open Source Project
366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann *
466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * you may not use this file except in compliance with the License.
666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * You may obtain a copy of the License at
766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann *
866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann *
1066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Unless required by applicable law or agreed to in writing, software
1166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
1266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * See the License for the specific language governing permissions and
1466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * limitations under the License.
1566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */
1666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
1766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannpackage android.print;
1866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
1966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.annotation.NonNull;
2066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.content.Context;
2166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.content.Loader;
2266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.os.Handler;
2366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.os.Message;
2466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.printservice.PrintServiceInfo;
259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport com.android.internal.util.Preconditions;
2666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
2766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport java.util.List;
2866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
2966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann/**
3066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Loader for the list of print services. Can be parametrized to select a subset.
3166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann *
3266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * @hide
3366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */
3466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannpublic class PrintServicesLoader extends Loader<List<PrintServiceInfo>> {
3566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /** What type of services to load. */
3666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private final int mSelectionFlags;
3766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
3866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /** The print manager to be used by this object */
3966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private final @NonNull PrintManager mPrintManager;
4066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
4166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /** Handler to sequentialize the delivery of the results to the main thread */
4266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private Handler mHandler;
4366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
4466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /** Listens for updates to the data from the platform */
4566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private PrintManager.PrintServicesChangeListener mListener;
4666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
4766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /**
4866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     * Create a new PrintServicesLoader.
4966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     *
509dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param printManager   The print manager supplying the data
519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param context        Context of the using object
5266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     * @param selectionFlags What type of services to load.
5366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     */
5466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    public PrintServicesLoader(@NonNull PrintManager printManager, @NonNull Context context,
5566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            int selectionFlags) {
569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        super(Preconditions.checkNotNull(context));
579dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mPrintManager = Preconditions.checkNotNull(printManager);
589dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mSelectionFlags = Preconditions.checkFlagsArgument(selectionFlags,
599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                PrintManager.ALL_SERVICES);
6066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
6166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
6266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    @Override
6366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    protected void onForceLoad() {
6466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        queueNewResult();
6566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
6666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
6766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /**
6866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     * Read the print services and queue it to be delivered on the main thread.
6966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     */
7066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private void queueNewResult() {
7166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        Message m = mHandler.obtainMessage(0);
7266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        m.obj = mPrintManager.getPrintServices(mSelectionFlags);
7366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        mHandler.sendMessage(m);
7466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
7566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
7666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    @Override
7766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    protected void onStartLoading() {
7866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        mHandler = new MyHandler();
7966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        mListener = new PrintManager.PrintServicesChangeListener() {
8066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            @Override public void onPrintServicesChanged() {
8166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                queueNewResult();
8266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            }
8366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        };
8466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
8566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        mPrintManager.addPrintServicesChangeListener(mListener);
8666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
8766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        // Immediately deliver a result
8866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        deliverResult(mPrintManager.getPrintServices(mSelectionFlags));
8966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
9066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
9166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    @Override
9266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    protected void onStopLoading() {
9366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        if (mListener != null) {
9466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mPrintManager.removePrintServicesChangeListener(mListener);
9566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mListener = null;
9666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        }
9766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
9866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        if (mHandler != null) {
9966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mHandler.removeMessages(0);
10066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mHandler = null;
10166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        }
10266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
10366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
10466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    @Override
10566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    protected void onReset() {
10666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        onStopLoading();
10766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
10866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
10966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    /**
11066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     * Handler to sequentialize all the updates to the main thread.
11166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann     */
11266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private class MyHandler extends Handler {
11366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        /**
11466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann         * Create a new handler on the main thread.
11566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann         */
11666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        public MyHandler() {
11766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            super(getContext().getMainLooper());
11866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        }
11966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
12066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        @Override
12166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        public void handleMessage(Message msg) {
12266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            super.handleMessage(msg);
12366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
12466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            if (isStarted()) {
12566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                deliverResult((List<PrintServiceInfo>) msg.obj);
12666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            }
12766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        }
12866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    }
12966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann}
130