19dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/*
29dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Copyright (C) 2016 The Android Open Source Project
39dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
49dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
59dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * you may not use this file except in compliance with the License.
69dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * You may obtain a copy of the License at
79dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
89dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
99dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
109dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software
119dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
129dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * See the License for the specific language governing permissions and
149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * limitations under the License.
159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */
169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannpackage android.print;
189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.annotation.NonNull;
209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.content.Context;
219dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.content.Loader;
229dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.os.Handler;
239dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.os.Message;
249dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport android.printservice.recommendation.RecommendationInfo;
257e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann
269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport com.android.internal.util.Preconditions;
279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
289dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport java.util.List;
299dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
309dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/**
319dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Loader for the list of print service recommendations.
329dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
339dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @hide
349dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */
359dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannpublic class PrintServiceRecommendationsLoader extends Loader<List<RecommendationInfo>> {
369dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** The print manager to be used by this object */
379dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private final @NonNull PrintManager mPrintManager;
389dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
399dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** Handler to sequentialize the delivery of the results to the main thread */
4000c3659eca6f9ab9235e7746b6d74702ab90555bPhilip P. Moltmann    private final @NonNull Handler mHandler;
419dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
429dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** Listens for updates to the data from the platform */
439dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private PrintManager.PrintServiceRecommendationsChangeListener mListener;
449dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
459dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
469dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Create a new PrintServicesLoader.
479dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
489dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param printManager The print manager supplying the data
499dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param context      Context of the using object
509dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public PrintServiceRecommendationsLoader(@NonNull PrintManager printManager,
529dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            @NonNull Context context) {
539dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        super(Preconditions.checkNotNull(context));
549dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mHandler = new MyHandler();
559dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mPrintManager = Preconditions.checkNotNull(printManager);
569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
579dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
589dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onForceLoad() {
609dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        queueNewResult();
619dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
629dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
639dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
649dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Read the print service recommendations and queue it to be delivered on the main thread.
659dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
669dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private void queueNewResult() {
679dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        Message m = mHandler.obtainMessage(0);
689dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        m.obj = mPrintManager.getPrintServiceRecommendations();
699dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mHandler.sendMessage(m);
709dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
719dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
729dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
739dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onStartLoading() {
749dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mListener = new PrintManager.PrintServiceRecommendationsChangeListener() {
759dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            @Override
769dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            public void onPrintServiceRecommendationsChanged() {
779dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                queueNewResult();
789dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            }
799dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        };
809dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
817e01895e6972c0ebc552215b1207a519529af3fdPhilip P. Moltmann        mPrintManager.addPrintServiceRecommendationsChangeListener(mListener, null);
829dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
839dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        // Immediately deliver a result
849dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        deliverResult(mPrintManager.getPrintServiceRecommendations());
859dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
869dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
879dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
889dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onStopLoading() {
899dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        if (mListener != null) {
909dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            mPrintManager.removePrintServiceRecommendationsChangeListener(mListener);
919dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            mListener = null;
929dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
939dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
9400c3659eca6f9ab9235e7746b6d74702ab90555bPhilip P. Moltmann        mHandler.removeMessages(0);
959dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
969dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
979dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
989dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onReset() {
999dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        onStopLoading();
1009dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1019dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1029dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1039dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Handler to sequentialize all the updates to the main thread.
1049dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1059dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private class MyHandler extends Handler {
1069dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        /**
1079dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann         * Create a new handler on the main thread.
1089dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann         */
1099dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        public MyHandler() {
1109dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            super(getContext().getMainLooper());
1119dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
1129dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1139dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        @Override
1149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        public void handleMessage(Message msg) {
1159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            if (isStarted()) {
1169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                deliverResult((List<RecommendationInfo>) msg.obj);
1179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            }
1189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
1199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann}
121