1 /* 2 * Copyright (C) 2018 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 17 package com.android.bips.discovery; 18 19 import android.net.Uri; 20 import android.util.Log; 21 22 import com.android.bips.DelayedAction; 23 24 import java.util.Collection; 25 import java.util.Collections; 26 import java.util.HashMap; 27 import java.util.Map; 28 29 /** 30 * A discovery that delays each discovery start and/or printer find by a fixed amount. 31 */ 32 public class DelayedDiscovery extends Discovery { 33 private static final String TAG = DelayedDiscovery.class.getSimpleName(); 34 private static final boolean DEBUG = false; 35 36 private final Discovery mChild; 37 private final int mStartDelay; 38 private final Listener mChildListener; 39 private final Map<Uri, DiscoveredPrinter> mPending = new HashMap<>(); 40 private DelayedAction mDelayedStart; 41 42 /** 43 * Construct a Discovery that behaves like the wrapped discovery but with delays 44 * 45 * @param startDelay Milliseconds to delay the first start() command 46 * @param findDelay Milliseconds to delay each printer found 47 */ DelayedDiscovery(Discovery wrapped, int startDelay, int findDelay)48 public DelayedDiscovery(Discovery wrapped, int startDelay, int findDelay) { 49 super(wrapped.getPrintService()); 50 mChild = wrapped; 51 mStartDelay = startDelay; 52 mChildListener = new Listener() { 53 @Override 54 public void onPrinterFound(DiscoveredPrinter printer) { 55 if (findDelay <= 0) { 56 printerFound(printer); 57 return; 58 } 59 60 DiscoveredPrinter old = mPending.put(printer.getUri(), printer); 61 if (old == null) { 62 getHandler().postDelayed(() -> { 63 DiscoveredPrinter pending = mPending.remove(printer.getUri()); 64 if (pending != null) { 65 if (DEBUG) Log.d(TAG, "Delay complete for " + pending); 66 printerFound(pending); 67 } 68 }, findDelay); 69 } 70 } 71 72 @Override 73 public void onPrinterLost(DiscoveredPrinter printer) { 74 mPending.remove(printer.getUri()); 75 printerLost(printer.getUri()); 76 } 77 }; 78 } 79 80 @Override onStart()81 void onStart() { 82 if (mStartDelay == 0) { 83 mChild.start(mChildListener); 84 } else { 85 mDelayedStart = getPrintService().delay(mStartDelay, () -> { 86 if (!isStarted()) { 87 return; 88 } 89 mChild.start(mChildListener); 90 }); 91 } 92 } 93 94 @Override onStop()95 void onStop() { 96 if (mDelayedStart != null) { 97 mDelayedStart.cancel(); 98 } 99 mChild.stop(mChildListener); 100 mPending.clear(); 101 } 102 103 @Override getChildren()104 Collection<Discovery> getChildren() { 105 return Collections.singleton(mChild); 106 } 107 } 108