mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-28 04:37:40 +00:00
Migrate NsdResolveQueue to Kotlin
This commit is contained in:
parent
9f788da478
commit
2f10f1d0f2
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.kde.kdeconnect.Backends.LanBackend;
|
|
||||||
|
|
||||||
import android.net.nsd.NsdManager;
|
|
||||||
import android.net.nsd.NsdServiceInfo;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
|
|
||||||
public class NsdResolveQueue {
|
|
||||||
|
|
||||||
static final String LOG_TAG = "NsdResolveQueue";
|
|
||||||
|
|
||||||
final @NonNull NsdManager mNsdManager;
|
|
||||||
|
|
||||||
private final Object mLock = new Object();
|
|
||||||
private final LinkedList<PendingResolve> mResolveRequests = new LinkedList<>();
|
|
||||||
|
|
||||||
public NsdResolveQueue(NsdManager nsdManager) {
|
|
||||||
this.mNsdManager = nsdManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class PendingResolve {
|
|
||||||
final @NonNull NsdServiceInfo serviceInfo;
|
|
||||||
final @NonNull NsdManager.ResolveListener listener;
|
|
||||||
|
|
||||||
private PendingResolve(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) {
|
|
||||||
this.serviceInfo = serviceInfo;
|
|
||||||
this.listener = listener;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resolveOrEnqueue(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
for (PendingResolve existing : mResolveRequests) {
|
|
||||||
if (serviceInfo.getServiceName().equals(existing.serviceInfo.getServiceName())) {
|
|
||||||
Log.i(LOG_TAG, "Not enqueuing a new resolve request for the same service: " + serviceInfo.getServiceName());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mResolveRequests.addLast(new PendingResolve(serviceInfo, new ListenerWrapper(listener)));
|
|
||||||
|
|
||||||
if (mResolveRequests.size() == 1) {
|
|
||||||
resolveNextRequest();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ListenerWrapper implements NsdManager.ResolveListener {
|
|
||||||
private final @NonNull NsdManager.ResolveListener mListener;
|
|
||||||
|
|
||||||
private ListenerWrapper(@NonNull NsdManager.ResolveListener listener) {
|
|
||||||
mListener = listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
|
||||||
mListener.onResolveFailed(serviceInfo, errorCode);
|
|
||||||
|
|
||||||
synchronized (mLock) {
|
|
||||||
mResolveRequests.pop();
|
|
||||||
resolveNextRequest();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onServiceResolved(NsdServiceInfo serviceInfo) {
|
|
||||||
mListener.onServiceResolved(serviceInfo);
|
|
||||||
|
|
||||||
synchronized (mLock) {
|
|
||||||
mResolveRequests.pop();
|
|
||||||
resolveNextRequest();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void resolveNextRequest() {
|
|
||||||
if (!mResolveRequests.isEmpty()) {
|
|
||||||
PendingResolve request = mResolveRequests.getFirst();
|
|
||||||
mNsdManager.resolveService(request.serviceInfo, request.listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||||
|
*/
|
||||||
|
package org.kde.kdeconnect.Backends.LanBackend
|
||||||
|
|
||||||
|
import android.net.nsd.NsdManager
|
||||||
|
import android.net.nsd.NsdServiceInfo
|
||||||
|
import android.util.Log
|
||||||
|
import java.util.LinkedList
|
||||||
|
|
||||||
|
class NsdResolveQueue {
|
||||||
|
val LOG_TAG: String = "NsdResolveQueue"
|
||||||
|
|
||||||
|
private val nsdManager: NsdManager
|
||||||
|
private val lock: Any
|
||||||
|
|
||||||
|
private data class PendingResolve(val serviceInfo: NsdServiceInfo, val listener: NsdManager.ResolveListener)
|
||||||
|
private val resolveRequests: LinkedList<PendingResolve>
|
||||||
|
|
||||||
|
constructor(nsdManager: NsdManager) {
|
||||||
|
this.nsdManager = nsdManager
|
||||||
|
this.lock = Any()
|
||||||
|
this.resolveRequests = LinkedList<PendingResolve>()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun resolveOrEnqueue(serviceInfo: NsdServiceInfo, listener: NsdManager.ResolveListener) {
|
||||||
|
synchronized(lock) {
|
||||||
|
if (resolveRequests.any { r -> serviceInfo.serviceName == r.serviceInfo.serviceName }) {
|
||||||
|
Log.i(LOG_TAG, "Not enqueuing a new resolve request for the same service: " + serviceInfo.serviceName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resolveRequests.addLast(PendingResolve(serviceInfo, ListenerWrapper(listener)))
|
||||||
|
if (resolveRequests.size == 1) {
|
||||||
|
resolveNextRequest()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class ListenerWrapper(private val listener: NsdManager.ResolveListener) : NsdManager.ResolveListener {
|
||||||
|
override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
|
||||||
|
listener.onResolveFailed(serviceInfo, errorCode)
|
||||||
|
postResolve()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
|
||||||
|
listener.onServiceResolved(serviceInfo)
|
||||||
|
postResolve()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun postResolve() {
|
||||||
|
synchronized(lock) {
|
||||||
|
resolveRequests.pop()
|
||||||
|
resolveNextRequest()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun resolveNextRequest() {
|
||||||
|
if (resolveRequests.isNotEmpty()) {
|
||||||
|
val request = resolveRequests.first
|
||||||
|
nsdManager.resolveService(request.serviceInfo, request.listener)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user