166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann/* 266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Copyright (C) 2016 The Android Open Source Project 366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * 466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License"); 566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * you may not use this file except in compliance with the License. 666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * You may obtain a copy of the License at 766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * 866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * http://www.apache.org/licenses/LICENSE-2.0 966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * 1066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Unless required by applicable law or agreed to in writing, software 1166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS, 1266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * See the License for the specific language governing permissions and 1466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * limitations under the License. 1566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */ 1666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 1766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannpackage android.print; 1866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 1966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.annotation.NonNull; 2066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.content.Context; 2166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.content.Loader; 2266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.os.Handler; 2366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.os.Message; 2466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport android.printservice.PrintServiceInfo; 259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmannimport com.android.internal.util.Preconditions; 2666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 2766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannimport java.util.List; 2866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 2966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann/** 3066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Loader for the list of print services. Can be parametrized to select a subset. 3166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * 3266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * @hide 3366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */ 3466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmannpublic class PrintServicesLoader extends Loader<List<PrintServiceInfo>> { 3566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** What type of services to load. */ 3666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann private final int mSelectionFlags; 3766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 3866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** The print manager to be used by this object */ 3966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann private final @NonNull PrintManager mPrintManager; 4066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 4166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** Handler to sequentialize the delivery of the results to the main thread */ 4266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann private Handler mHandler; 4366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 4466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** Listens for updates to the data from the platform */ 4566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann private PrintManager.PrintServicesChangeListener mListener; 4666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 4766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** 4866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Create a new PrintServicesLoader. 4966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * 509dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param printManager The print manager supplying the data 519dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann * @param context Context of the using object 5266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * @param selectionFlags What type of services to load. 5366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */ 5466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann public PrintServicesLoader(@NonNull PrintManager printManager, @NonNull Context context, 5566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann int selectionFlags) { 569dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann super(Preconditions.checkNotNull(context)); 579dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann mPrintManager = Preconditions.checkNotNull(printManager); 589dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann mSelectionFlags = Preconditions.checkFlagsArgument(selectionFlags, 599dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann PrintManager.ALL_SERVICES); 6066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 6166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 6266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann @Override 6366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann protected void onForceLoad() { 6466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann queueNewResult(); 6566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 6666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 6766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** 6866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Read the print services and queue it to be delivered on the main thread. 6966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */ 7066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann private void queueNewResult() { 7166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann Message m = mHandler.obtainMessage(0); 7266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann m.obj = mPrintManager.getPrintServices(mSelectionFlags); 7366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mHandler.sendMessage(m); 7466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 7566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 7666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann @Override 7766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann protected void onStartLoading() { 7866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mHandler = new MyHandler(); 7966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mListener = new PrintManager.PrintServicesChangeListener() { 8066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann @Override public void onPrintServicesChanged() { 8166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann queueNewResult(); 8266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 8366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann }; 8466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 8566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mPrintManager.addPrintServicesChangeListener(mListener); 8666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 8766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann // Immediately deliver a result 8866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann deliverResult(mPrintManager.getPrintServices(mSelectionFlags)); 8966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 9066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 9166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann @Override 9266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann protected void onStopLoading() { 9366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann if (mListener != null) { 9466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mPrintManager.removePrintServicesChangeListener(mListener); 9566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mListener = null; 9666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 9766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 9866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann if (mHandler != null) { 9966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mHandler.removeMessages(0); 10066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann mHandler = null; 10166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 10266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 10366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 10466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann @Override 10566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann protected void onReset() { 10666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann onStopLoading(); 10766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 10866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 10966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** 11066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Handler to sequentialize all the updates to the main thread. 11166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */ 11266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann private class MyHandler extends Handler { 11366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann /** 11466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann * Create a new handler on the main thread. 11566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann */ 11666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann public MyHandler() { 11766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann super(getContext().getMainLooper()); 11866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 11966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 12066c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann @Override 12166c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann public void handleMessage(Message msg) { 12266c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann super.handleMessage(msg); 12366c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann 12466c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann if (isStarted()) { 12566c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann deliverResult((List<PrintServiceInfo>) msg.obj); 12666c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 12766c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 12866c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann } 12966c96591e2ddb464c67e60dbf4193ef4ec8a620bPhilip P. Moltmann} 130