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