blob: 083e88df19b74008ee354ead0df37c63d41b0272 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.bips.discovery;
import android.net.Uri;
import android.net.wifi.p2p.WifiP2pDevice;
import android.util.Log;
import com.android.bips.BuiltInPrintService;
import com.android.bips.P2pPermissionManager;
import com.android.bips.p2p.P2pPeerListener;
/**
* Discover previously-added P2P devices, if any.
*/
public class P2pDiscovery extends SavedDiscovery implements P2pPeerListener {
public static final String SCHEME_P2P = "p2p";
private static final String TAG = P2pDiscovery.class.getSimpleName();
private static final boolean DEBUG = false;
private boolean mDiscoveringPeers = false;
private P2pPermissionManager.P2pPermissionRequest mP2pPermissionRequest;
public P2pDiscovery(BuiltInPrintService printService) {
super(printService);
}
/** Convert a peer device to a debug representation */
public static DiscoveredPrinter toPrinter(WifiP2pDevice device) {
Uri path = toPath(device);
String deviceName = device.deviceName;
if (deviceName.trim().isEmpty()) {
deviceName = device.deviceAddress;
}
return new DiscoveredPrinter(path, deviceName, path, null);
}
/** Convert a peer device address to a Uri-based path */
public static Uri toPath(WifiP2pDevice device) {
return Uri.parse(SCHEME_P2P + "://" + device.deviceAddress.replace(":", "-"));
}
@Override
void onStart() {
if (DEBUG) Log.d(TAG, "onStart()");
startPeerDiscovery();
}
@Override
void onStop() {
if (DEBUG) Log.d(TAG, "onStop()");
if (mP2pPermissionRequest != null) {
mP2pPermissionRequest.close();
mP2pPermissionRequest = null;
}
if (mDiscoveringPeers) {
mDiscoveringPeers = false;
getPrintService().getP2pMonitor().stopDiscover(this);
allPrintersLost();
}
}
private void startPeerDiscovery() {
// Ignore if already started or no known P2P printers exist
if (mDiscoveringPeers || getSavedPrinters().isEmpty()) {
return;
}
// Only begin discovery if the user has granted permissions
P2pPermissionManager permissionManager = getPrintService().getP2pPermissionManager();
mP2pPermissionRequest = permissionManager.request(true, approved -> {
if (approved) {
mDiscoveringPeers = true;
getPrintService().getP2pMonitor().discover(this);
}
mP2pPermissionRequest = null;
});
}
@Override
public void onPeerFound(WifiP2pDevice peer) {
DiscoveredPrinter printer = toPrinter(peer);
if (DEBUG) Log.d(TAG, "onPeerFound " + printer);
// Only find saved printers
for (DiscoveredPrinter saved : getSavedPrinters()) {
if (saved.path.equals(printer.path)) {
printerFound(saved);
}
}
}
@Override
public void onPeerLost(WifiP2pDevice peer) {
DiscoveredPrinter printer = toPrinter(peer);
if (DEBUG) Log.d(TAG, "onPeerLost " + printer);
printerLost(printer.getUri());
}
/** Adds a known, P2P-discovered, valid printer */
public void addValidPrinter(DiscoveredPrinter printer) {
if (addSavedPrinter(printer)) {
printerFound(printer);
if (isStarted()) {
startPeerDiscovery();
}
}
}
}