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();
12366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            if (mOnPrintersChangeListener != null) {
12466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                // Post a message as we are in onLoadFinished and certain operations
12566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                // are not allowed in this callback, such as fragment transactions.
12666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                // Clients should not handle this explicitly.
12766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                mHandler.obtainMessage(MyHandler.MSG_PRINTERS_INVALID,
12866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                        mOnPrintersChangeListener).sendToTarget();
129a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
130a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
131a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
132a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // LoaderCallbacks#onLoadFinished
133a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
134a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onLoadFinished(Loader<List<PrinterInfo>> loader, List<PrinterInfo> printers) {
13566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mPrinters.clear();
13666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            mPrinters.addAll(printers);
13766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            if (mOnPrintersChangeListener != null) {
13866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                // Post a message as we are in onLoadFinished and certain operations
13966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                // are not allowed in this callback, such as fragment transactions.
14066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                // Clients should not handle this explicitly.
14166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                SomeArgs args = SomeArgs.obtain();
14266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                args.arg1 = mOnPrintersChangeListener;
14366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                args.arg2 = printers;
14466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                mHandler.obtainMessage(MyHandler.MSG_PRINTERS_CHANGED, args).sendToTarget();
14566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            }
14666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            if (!mReady) {
14766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                mReady = true;
14866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                if (mReadyCallback != null) {
14966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann                    mReadyCallback.run();
150a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                }
151a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
152a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
153a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
154a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // LoaderCallbacks#onCreateLoader
155a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
156a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) {
15766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann            return new FusedPrintersProvider(mActivity, args.getInt(null));
158a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
159a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    };
160a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
161a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private static final class MyHandler extends Handler {
162a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public static final int MSG_PRINTERS_CHANGED = 0;
163a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public static final int MSG_PRINTERS_INVALID = 1;
164a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
165a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public MyHandler(Looper looper) {
166a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            super(looper, null , false);
167a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
168a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
169a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
170a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @SuppressWarnings("unchecked")
171a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void handleMessage(Message message) {
172a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            switch (message.what) {
173a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                case MSG_PRINTERS_CHANGED: {
174a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    SomeArgs args = (SomeArgs) message.obj;
175a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    OnPrintersChangeListener callback = (OnPrintersChangeListener) args.arg1;
176a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    List<PrinterInfo> printers = (List<PrinterInfo>) args.arg2;
177a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    args.recycle();
178a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    callback.onPrintersChanged(printers);
179a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                } break;
180a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
181a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                case MSG_PRINTERS_INVALID: {
182a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    OnPrintersChangeListener callback = (OnPrintersChangeListener) message.obj;
183a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    callback.onPrintersInvalid();
184a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                } break;
185a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
186a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
187a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
188a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav}
189