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;
259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport com.android.internal.util.Preconditions;
269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport java.util.List;
289dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
299dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann/**
309dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * Loader for the list of print service recommendations.
319dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann *
329dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @hide
339dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann */
349dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannpublic class PrintServiceRecommendationsLoader extends Loader<List<RecommendationInfo>> {
359dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** The print manager to be used by this object */
369dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private final @NonNull PrintManager mPrintManager;
379dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
389dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** Handler to sequentialize the delivery of the results to the main thread */
399dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private final Handler mHandler;
409dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
419dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /** Listens for updates to the data from the platform */
429dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private PrintManager.PrintServiceRecommendationsChangeListener mListener;
439dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
449dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
459dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Create a new PrintServicesLoader.
469dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
479dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param printManager The print manager supplying the data
489dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param context      Context of the using object
499dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
509dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public PrintServiceRecommendationsLoader(@NonNull PrintManager printManager,
519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            @NonNull Context context) {
529dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        super(Preconditions.checkNotNull(context));
539dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mHandler = new MyHandler();
549dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mPrintManager = Preconditions.checkNotNull(printManager);
559dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
579dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
589dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onForceLoad() {
599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        queueNewResult();
609dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
619dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
629dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
639dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Read the print service recommendations and queue it to be delivered on the main thread.
649dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
659dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private void queueNewResult() {
669dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        Message m = mHandler.obtainMessage(0);
679dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        m.obj = mPrintManager.getPrintServiceRecommendations();
689dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mHandler.sendMessage(m);
699dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
709dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
719dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
729dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onStartLoading() {
739dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mListener = new PrintManager.PrintServiceRecommendationsChangeListener() {
749dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            @Override
759dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            public void onPrintServiceRecommendationsChanged() {
769dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                queueNewResult();
779dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            }
789dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        };
799dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
809dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        mPrintManager.addPrintServiceRecommendationsChangeListener(mListener);
819dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
829dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        // Immediately deliver a result
839dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        deliverResult(mPrintManager.getPrintServiceRecommendations());
849dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
859dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
869dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
879dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onStopLoading() {
889dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        if (mListener != null) {
899dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            mPrintManager.removePrintServiceRecommendationsChangeListener(mListener);
909dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            mListener = null;
919dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
929dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
939dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        if (mHandler != null) {
949dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            mHandler.removeMessages(0);
959dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
969dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
979dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
989dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    @Override
999dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    protected void onReset() {
1009dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        onStopLoading();
1019dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1029dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1039dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
1049dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Handler to sequentialize all the updates to the main thread.
1059dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
1069dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    private class MyHandler extends Handler {
1079dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        /**
1089dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann         * Create a new handler on the main thread.
1099dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann         */
1109dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        public MyHandler() {
1119dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            super(getContext().getMainLooper());
1129dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
1139dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        @Override
1159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        public void handleMessage(Message msg) {
1169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            if (isStarted()) {
1179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann                deliverResult((List<RecommendationInfo>) msg.obj);
1189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            }
1199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
1209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
1219dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann}
122