PrinterRegistry.java revision a798c0a984f29f7180883a61839f68d2cbf0c6ce
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
19a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.app.Activity;
20a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.app.LoaderManager.LoaderCallbacks;
21a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.content.Loader;
22a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Bundle;
23a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Handler;
24a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Looper;
25a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.os.Message;
26a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.print.PrinterId;
27a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport android.print.PrinterInfo;
28a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport com.android.internal.os.SomeArgs;
29a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
30a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport java.util.ArrayList;
31a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavimport java.util.List;
32a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
33a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslavpublic class PrinterRegistry {
34a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
35a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private static final int LOADER_ID_PRINTERS_LOADER = 1;
36a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
37a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final Activity mActivity;
38a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
39a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final List<PrinterInfo> mPrinters = new ArrayList<>();
40a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
41a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final Runnable mReadyCallback;
42a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
43a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final Handler mHandler;
44a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
45a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private boolean mReady;
46a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
47a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private OnPrintersChangeListener mOnPrintersChangeListener;
48a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
49a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public interface OnPrintersChangeListener {
50a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onPrintersChanged(List<PrinterInfo> printers);
51a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onPrintersInvalid();
52a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
53a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
54a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public PrinterRegistry(Activity activity, Runnable readyCallback) {
55a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mActivity = activity;
56a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mReadyCallback = readyCallback;
57a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mHandler = new MyHandler(activity.getMainLooper());
58a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        activity.getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER,
59a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                null, mLoaderCallbacks);
60a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
61a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
62a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void setOnPrintersChangeListener(OnPrintersChangeListener listener) {
63a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        mOnPrintersChangeListener = listener;
64a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
65a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
66a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public List<PrinterInfo> getPrinters() {
67a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return mPrinters;
68a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
69a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
70a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void addHistoricalPrinter(PrinterInfo printer) {
71a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        getPrinterProvider().addHistoricalPrinter(printer);
72a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
73a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
74a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void forgetFavoritePrinter(PrinterId printerId) {
75a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        getPrinterProvider().forgetFavoritePrinter(printerId);
76a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
77a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
78a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public boolean isFavoritePrinter(PrinterId printerId) {
79a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return getPrinterProvider().isFavoritePrinter(printerId);
80a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
81a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
82a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    public void setTrackedPrinter(PrinterId printerId) {
83a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        getPrinterProvider().setTrackedPrinter(printerId);
84a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
85a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
86a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private FusedPrintersProvider getPrinterProvider() {
87a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        Loader<?> loader = mActivity.getLoaderManager().getLoader(LOADER_ID_PRINTERS_LOADER);
88a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        return (FusedPrintersProvider) loader;
89a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
90a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
91a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private final LoaderCallbacks<List<PrinterInfo>> mLoaderCallbacks =
92a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            new LoaderCallbacks<List<PrinterInfo>>() {
93a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
94a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onLoaderReset(Loader<List<PrinterInfo>> loader) {
95a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            if (loader.getId() == LOADER_ID_PRINTERS_LOADER) {
96a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                mPrinters.clear();
97a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                if (mOnPrintersChangeListener != null) {
98a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    // Post a message as we are in onLoadFinished and certain operations
99a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    // are not allowed in this callback, such as fragment transactions.
100a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    // Clients should not handle this explicitly.
101a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    mHandler.obtainMessage(MyHandler.MSG_PRINTERS_INVALID,
102a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                            mOnPrintersChangeListener).sendToTarget();
103a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                }
104a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
105a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
106a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
107a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // LoaderCallbacks#onLoadFinished
108a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
109a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void onLoadFinished(Loader<List<PrinterInfo>> loader, List<PrinterInfo> printers) {
110a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            if (loader.getId() == LOADER_ID_PRINTERS_LOADER) {
111a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                mPrinters.clear();
112a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                mPrinters.addAll(printers);
113a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                if (mOnPrintersChangeListener != null) {
114a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    // Post a message as we are in onLoadFinished and certain operations
115a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    // are not allowed in this callback, such as fragment transactions.
116a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    // Clients should not handle this explicitly.
117a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    SomeArgs args = SomeArgs.obtain();
118a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    args.arg1 = mOnPrintersChangeListener;
119a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    args.arg2 = printers;
120a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    mHandler.obtainMessage(MyHandler.MSG_PRINTERS_CHANGED, args).sendToTarget();
121a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                }
122a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                if (!mReady) {
123a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    mReady = true;
124a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    if (mReadyCallback != null) {
125a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                        mReadyCallback.run();
126a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    }
127a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                }
128a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
129a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
130a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
131a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        // LoaderCallbacks#onCreateLoader
132a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
133a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public Loader<List<PrinterInfo>> onCreateLoader(int id, Bundle args) {
134a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            if (id == LOADER_ID_PRINTERS_LOADER) {
135a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                return new FusedPrintersProvider(mActivity);
136a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
137a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            return null;
138a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
139a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    };
140a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
141a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    private static final class MyHandler extends Handler {
142a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public static final int MSG_PRINTERS_CHANGED = 0;
143a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public static final int MSG_PRINTERS_INVALID = 1;
144a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
145a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public MyHandler(Looper looper) {
146a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            super(looper, null , false);
147a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
148a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
149a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @Override
150a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        @SuppressWarnings("unchecked")
151a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        public void handleMessage(Message message) {
152a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            switch (message.what) {
153a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                case MSG_PRINTERS_CHANGED: {
154a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    SomeArgs args = (SomeArgs) message.obj;
155a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    OnPrintersChangeListener callback = (OnPrintersChangeListener) args.arg1;
156a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    List<PrinterInfo> printers = (List<PrinterInfo>) args.arg2;
157a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    args.recycle();
158a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    callback.onPrintersChanged(printers);
159a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                } break;
160a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav
161a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                case MSG_PRINTERS_INVALID: {
162a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    OnPrintersChangeListener callback = (OnPrintersChangeListener) message.obj;
163a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                    callback.onPrintersInvalid();
164a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav                } break;
165a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav            }
166a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav        }
167a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav    }
168a798c0a984f29f7180883a61839f68d2cbf0c6ceSvetoslav}
169