1a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav/*
2a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * Copyright (C) 2014 The Android Open Source Project
3a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav *
4a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * Licensed under the Apache License, Version 2.0 (the "License");
5a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * you may not use this file except in compliance with the License.
6a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * You may obtain a copy of the License at
7a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav *
8a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav *      http://www.apache.org/licenses/LICENSE-2.0
9a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav *
10a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * Unless required by applicable law or agreed to in writing, software
11a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * distributed under the License is distributed on an "AS IS" BASIS,
12a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * See the License for the specific language governing permissions and
14a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav * limitations under the License.
15a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav */
16a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
17a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavpackage com.android.printspooler.ui;
18a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
1976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmannimport android.annotation.Nullable;
20a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.app.Activity;
21a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.app.LoaderManager.LoaderCallbacks;
22a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.content.Loader;
23a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Bundle;
24a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Handler;
25a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Looper;
26a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Message;
27a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.print.PrinterId;
28a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.print.PrinterInfo;
29a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport com.android.internal.os.SomeArgs;
30a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
31a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport java.util.ArrayList;
32a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport java.util.List;
33a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
34a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavpublic class PrinterRegistry {
35a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
3666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    private final int mLoaderId;
37a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
38a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final Activity mActivity;
39a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
40a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final List<PrinterInfo> mPrinters = new ArrayList<>();
41a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
42a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final Runnable mReadyCallback;
43a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
44a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final Handler mHandler;
45a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
46a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private boolean mReady;
47a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
48a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private OnPrintersChangeListener mOnPrintersChangeListener;
49a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
50a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public interface OnPrintersChangeListener {
51a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onPrintersChanged(List<PrinterInfo> printers);
52a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onPrintersInvalid();
53a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
54a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
5566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann    public PrinterRegistry(Activity activity, Runnable readyCallback, int loaderId,
5666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            int internalLoaderId) {
5766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        mLoaderId = loaderId;
58a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mActivity = activity;
59a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mReadyCallback = readyCallback;
60a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mHandler = new MyHandler(activity.getMainLooper());
6166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
6266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        Bundle loaderData = new Bundle(1);
6366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        loaderData.putInt(null, internalLoaderId);
6466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann
6566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        activity.getLoaderManager().initLoader(loaderId, loaderData, mLoaderCallbacks);
66a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
67a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
68a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void setOnPrintersChangeListener(OnPrintersChangeListener listener) {
69a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mOnPrintersChangeListener = listener;
70a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
71a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
72a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public List<PrinterInfo> getPrinters() {
73a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return mPrinters;
74a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
75a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
76a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void addHistoricalPrinter(PrinterInfo printer) {
77e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        FusedPrintersProvider provider = getPrinterProvider();
78e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        if (provider != null) {
79e17123dd6d3666c88b47172b8efc995523b47346Svetoslav            getPrinterProvider().addHistoricalPrinter(printer);
80e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        }
81a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
82a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
83a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void forgetFavoritePrinter(PrinterId printerId) {
84e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        FusedPrintersProvider provider = getPrinterProvider();
85e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        if (provider != null) {
86e17123dd6d3666c88b47172b8efc995523b47346Svetoslav            provider.forgetFavoritePrinter(printerId);
87e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        }
88a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
89a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
90a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public boolean isFavoritePrinter(PrinterId printerId) {
91e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        FusedPrintersProvider provider = getPrinterProvider();
92e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        if (provider != null) {
93e17123dd6d3666c88b47172b8efc995523b47346Svetoslav            return provider.isFavoritePrinter(printerId);
94e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        }
95e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        return false;
96a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
97a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
9876d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann    public void setTrackedPrinter(@Nullable PrinterId printerId) {
99e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        FusedPrintersProvider provider = getPrinterProvider();
100e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        if (provider != null) {
101e17123dd6d3666c88b47172b8efc995523b47346Svetoslav            provider.setTrackedPrinter(printerId);
102e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        }
103a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
104a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
10548fec5c9a3e4d78bc4cd175fae05be153ac587afSvet Ganov    public boolean areHistoricalPrintersLoaded() {
106e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        FusedPrintersProvider provider = getPrinterProvider();
107e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        if (provider != null) {
108e17123dd6d3666c88b47172b8efc995523b47346Svetoslav            return getPrinterProvider().areHistoricalPrintersLoaded();
109e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        }
110e17123dd6d3666c88b47172b8efc995523b47346Svetoslav        return false;
11148fec5c9a3e4d78bc4cd175fae05be153ac587afSvet Ganov    }
11248fec5c9a3e4d78bc4cd175fae05be153ac587afSvet Ganov
113a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private FusedPrintersProvider getPrinterProvider() {
11466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann        Loader<?> loader = mActivity.getLoaderManager().getLoader(mLoaderId);
115a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return (FusedPrintersProvider) loader;
116a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
117a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
118a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final LoaderCallbacks<List<PrinterInfo>> mLoaderCallbacks =
119a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            new LoaderCallbacks<List<PrinterInfo>>() {
120a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
121a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onLoaderReset(Loader<List<PrinterInfo>> loader) {
12266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mPrinters.clear();
1232eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann
1242eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            // Post a message as we are in onLoadFinished and certain operations
1252eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            // are not allowed in this callback, such as fragment transactions.
1262eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            // Clients should not handle this explicitly.
1272eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            mHandler.obtainMessage(MyHandler.MSG_PRINTERS_INVALID).sendToTarget();
128a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
129a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
130a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // LoaderCallbacks#onLoadFinished
131a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
132a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onLoadFinished(Loader<List<PrinterInfo>> loader, List<PrinterInfo> printers) {
13366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mPrinters.clear();
13466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mPrinters.addAll(printers);
1352eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann
1362eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            // Post a message as we are in onLoadFinished and certain operations
1372eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            // are not allowed in this callback, such as fragment transactions.
1382eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            // Clients should not handle this explicitly.
1392eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann            mHandler.obtainMessage(MyHandler.MSG_PRINTERS_CHANGED, printers).sendToTarget();
1402eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann
14166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            if (!mReady) {
14266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                mReady = true;
14366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                if (mReadyCallback != null) {
14466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                    mReadyCallback.run();
145a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                }
146a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
147a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
148a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
149a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // LoaderCallbacks#onCreateLoader
150a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
151a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) {
15266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            return new FusedPrintersProvider(mActivity, args.getInt(null));
153a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
154a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    };
155a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
1562eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann    private final class MyHandler extends Handler {
157a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public static final int MSG_PRINTERS_CHANGED = 0;
158a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public static final int MSG_PRINTERS_INVALID = 1;
159a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
160a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public MyHandler(Looper looper) {
161a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            super(looper, null , false);
162a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
163a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
164a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
165a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @SuppressWarnings("unchecked")
166a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void handleMessage(Message message) {
167a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            switch (message.what) {
168a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                case MSG_PRINTERS_CHANGED: {
1692eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                    List<PrinterInfo> printers = (List<PrinterInfo>) message.obj;
1702eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann
1712eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                    if (mOnPrintersChangeListener != null) {
1722eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                        mOnPrintersChangeListener.onPrintersChanged(printers);
1732eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                    }
174a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                } break;
175a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
176a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                case MSG_PRINTERS_INVALID: {
1772eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                    if (mOnPrintersChangeListener != null) {
1782eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                        mOnPrintersChangeListener.onPrintersInvalid();
1792eae8eb7e23d454a323bbbe9c77a9704488b1d6aPhilip P. Moltmann                    }
180a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                } break;
181a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
182a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
183a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
184a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav}
185