PrintServicesLoader.java revision 66c96591e2ddb464c67e60dbf4193ef4ec8a620b
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.print; 18 19import android.annotation.NonNull; 20import android.content.Context; 21import android.content.Loader; 22import android.os.Handler; 23import android.os.Message; 24import android.printservice.PrintServiceInfo; 25 26import java.util.List; 27 28/** 29 * Loader for the list of print services. Can be parametrized to select a subset. 30 * 31 * @hide 32 */ 33public class PrintServicesLoader extends Loader<List<PrintServiceInfo>> { 34 /** What type of services to load. */ 35 private final int mSelectionFlags; 36 37 /** The print manager to be used by this object */ 38 private final @NonNull PrintManager mPrintManager; 39 40 /** Handler to sequentialize the delivery of the results to the main thread */ 41 private Handler mHandler; 42 43 /** Listens for updates to the data from the platform */ 44 private PrintManager.PrintServicesChangeListener mListener; 45 46 /** 47 * Create a new PrintServicesLoader. 48 * 49 * @param selectionFlags What type of services to load. 50 */ 51 public PrintServicesLoader(@NonNull PrintManager printManager, @NonNull Context context, 52 int selectionFlags) { 53 super(context); 54 mPrintManager = printManager; 55 mSelectionFlags = selectionFlags; 56 } 57 58 @Override 59 protected void onForceLoad() { 60 queueNewResult(); 61 } 62 63 /** 64 * Read the print services and queue it to be delivered on the main thread. 65 */ 66 private void queueNewResult() { 67 Message m = mHandler.obtainMessage(0); 68 m.obj = mPrintManager.getPrintServices(mSelectionFlags); 69 mHandler.sendMessage(m); 70 } 71 72 @Override 73 protected void onStartLoading() { 74 mHandler = new MyHandler(); 75 mListener = new PrintManager.PrintServicesChangeListener() { 76 @Override public void onPrintServicesChanged() { 77 queueNewResult(); 78 } 79 }; 80 81 mPrintManager.addPrintServicesChangeListener(mListener); 82 83 // Immediately deliver a result 84 deliverResult(mPrintManager.getPrintServices(mSelectionFlags)); 85 } 86 87 @Override 88 protected void onStopLoading() { 89 if (mListener != null) { 90 mPrintManager.removePrintServicesChangeListener(mListener); 91 mListener = null; 92 } 93 94 if (mHandler != null) { 95 mHandler.removeMessages(0); 96 mHandler = null; 97 } 98 } 99 100 @Override 101 protected void onReset() { 102 onStopLoading(); 103 } 104 105 /** 106 * Handler to sequentialize all the updates to the main thread. 107 */ 108 private class MyHandler extends Handler { 109 /** 110 * Create a new handler on the main thread. 111 */ 112 public MyHandler() { 113 super(getContext().getMainLooper()); 114 } 115 116 @Override 117 public void handleMessage(Message msg) { 118 super.handleMessage(msg); 119 120 if (isStarted()) { 121 deliverResult((List<PrintServiceInfo>) msg.obj); 122 } 123 } 124 } 125} 126