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