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 17 package com.android.printservice.recommendation.plugin.hp; 18 19 import android.net.nsd.NsdManager; 20 import android.net.nsd.NsdServiceInfo; 21 import android.util.Pair; 22 import com.android.printservice.recommendation.util.NsdResolveQueue; 23 24 import java.util.LinkedList; 25 26 final class ServiceResolveQueue { 27 28 private final NsdManager mNsdManager; 29 private final LinkedList<Pair<NsdServiceInfo, ResolveCallback>> mQueue = new LinkedList<>(); 30 private final Object mLock = new Object(); 31 32 private static Object sLock = new Object(); 33 private static ServiceResolveQueue sInstance = null; 34 private final NsdResolveQueue mNsdResolveQueue; 35 private Pair<NsdServiceInfo, ResolveCallback> mCurrentRequest = null; 36 37 public static void createInstance(NsdManager nsdManager) { 38 if (sInstance == null) sInstance = new ServiceResolveQueue(nsdManager); 39 } 40 41 public static ServiceResolveQueue getInstance(NsdManager nsdManager) { 42 synchronized (sLock) { 43 createInstance(nsdManager); 44 return sInstance; 45 } 46 } 47 48 public static void destroyInstance() { 49 sInstance = null; 50 } 51 52 public interface ResolveCallback { 53 void serviceResolved(NsdServiceInfo nsdServiceInfo); 54 } 55 56 public ServiceResolveQueue(NsdManager nsdManager) { 57 mNsdManager = nsdManager; 58 mNsdResolveQueue = NsdResolveQueue.getInstance(); 59 } 60 61 public void queueRequest(NsdServiceInfo serviceInfo, ResolveCallback callback) { 62 synchronized (mLock) { 63 Pair<NsdServiceInfo, ResolveCallback> newRequest = Pair.create(serviceInfo, callback); 64 if (mQueue.contains(newRequest)) return; 65 mQueue.add(newRequest); 66 makeNextRequest(); 67 } 68 } 69 70 public void removeRequest(NsdServiceInfo serviceInfo, ResolveCallback callback) { 71 synchronized (mLock) { 72 Pair<NsdServiceInfo, ResolveCallback> newRequest = Pair.create(serviceInfo, callback); 73 mQueue.remove(newRequest); 74 if ((mCurrentRequest != null) && newRequest.equals(mCurrentRequest)) mCurrentRequest = null; 75 } 76 } 77 78 private void makeNextRequest() { 79 synchronized (mLock) { 80 if (mCurrentRequest != null) return; 81 if (mQueue.isEmpty()) return; 82 mCurrentRequest = mQueue.removeFirst(); 83 mNsdResolveQueue.resolve(mNsdManager, mCurrentRequest.first, 84 new NsdManager.ResolveListener() { 85 @Override 86 public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) { 87 synchronized (mLock) { 88 if (mCurrentRequest != null) mQueue.add(mCurrentRequest); 89 makeNextRequest(); 90 } 91 } 92 93 @Override 94 public void onServiceResolved(NsdServiceInfo nsdServiceInfo) { 95 synchronized (mLock) { 96 if (mCurrentRequest != null) { 97 mCurrentRequest.second.serviceResolved(nsdServiceInfo); 98 mCurrentRequest = null; 99 } 100 makeNextRequest(); 101 } 102 } 103 }); 104 105 } 106 } 107 108 109 } 110