mirror of
https://github.com/KDE/kdeconnect-android
synced 2025-08-28 20:57:42 +00:00
Avahi discovering
This commit is contained in:
parent
5b712bad0a
commit
60c63fe27a
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module external.system.id="GRADLE" type="JAVA_MODULE" version="4">
|
<module external.linked.project.path="$MODULE_DIR$/build.gradle" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
|
||||||
<component name="FacetManager">
|
<component name="FacetManager">
|
||||||
<facet type="android-gradle" name="Android-Gradle">
|
<facet type="android-gradle" name="Android-Gradle">
|
||||||
<configuration>
|
<configuration>
|
@ -4,9 +4,8 @@
|
|||||||
android:versionCode="1"
|
android:versionCode="1"
|
||||||
android:versionName="1.0" >
|
android:versionName="1.0" >
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk android:minSdkVersion="16"
|
||||||
android:minSdkVersion="7"
|
android:targetSdkVersion="16" />
|
||||||
android:targetSdkVersion="16" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
18
KdeConnect/src/main/java/org/kde/connect/Announcer.java
Normal file
18
KdeConnect/src/main/java/org/kde/connect/Announcer.java
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package org.kde.connect;
|
||||||
|
|
||||||
|
import android.net.nsd.NsdServiceInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by vaka on 6/10/13.
|
||||||
|
*/
|
||||||
|
public interface Announcer {
|
||||||
|
|
||||||
|
public interface ConnexionReceiver {
|
||||||
|
public void onPair(ComputerLink p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean startAnnouncing(ConnexionReceiver cr);
|
||||||
|
|
||||||
|
public void stopAnnouncing();
|
||||||
|
|
||||||
|
}
|
98
KdeConnect/src/main/java/org/kde/connect/AvahiAnnouncer.java
Normal file
98
KdeConnect/src/main/java/org/kde/connect/AvahiAnnouncer.java
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
package org.kde.connect;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.nsd.NsdManager;
|
||||||
|
import android.net.nsd.NsdServiceInfo;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.kde.connect.Announcer;
|
||||||
|
import org.kde.connect.ComputerLink;
|
||||||
|
import org.kde.connect.Types.NetworkPackage;
|
||||||
|
import org.kde.connect.UdpComputerLink;
|
||||||
|
|
||||||
|
import java.lang.Override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by vaka on 6/10/13.
|
||||||
|
*/
|
||||||
|
public class AvahiAnnouncer implements Announcer {
|
||||||
|
|
||||||
|
UdpComputerLink computerLink;
|
||||||
|
|
||||||
|
NsdManager mNsdManager;
|
||||||
|
NsdServiceInfo serviceInfo;
|
||||||
|
NsdManager.RegistrationListener mRegistrationListener = new NsdManager.RegistrationListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) {
|
||||||
|
Log.e("RegistrationListener","registered");
|
||||||
|
// Save the service name. Android may have changed it in order to
|
||||||
|
// resolve a conflict, so update the name you initially requested
|
||||||
|
// with the name Android actually used.
|
||||||
|
//mServiceName = NsdServiceInfo.getServiceName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||||
|
Log.e("RegistrationListener","Registration error "+errorCode);
|
||||||
|
// Registration failed! Put debugging code here to determine why.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceUnregistered(NsdServiceInfo arg0) {
|
||||||
|
Log.e("RegistrationListener","unregistered");
|
||||||
|
// Service has been unregistered. This only happens when you call
|
||||||
|
// NsdManager.unregisterService() and pass in this listener.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {
|
||||||
|
Log.e("RegistrationListener","Unregistration error "+errorCode);
|
||||||
|
// Unregistration failed. Put debugging code here to determine why.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ComputerLink.PackageReceiver mPackageReceiver = new ComputerLink.PackageReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onPackageReceived(NetworkPackage np) {
|
||||||
|
if (np.getType() == NetworkPackage.Type.ID_REQUEST) {
|
||||||
|
Log.i("Avahi announcer","ID_REQUEST");
|
||||||
|
} else if (np.getType() == NetworkPackage.Type.PAIR_REQUEST) {
|
||||||
|
Log.i("Avahi announcer","PAIR_REQUEST");
|
||||||
|
} else {
|
||||||
|
Log.i("Avahi announcer","Not paired, ignoring package "+np.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public AvahiAnnouncer(Context context) {
|
||||||
|
|
||||||
|
serviceInfo = new NsdServiceInfo();
|
||||||
|
serviceInfo.setPort(10601);
|
||||||
|
serviceInfo.setServiceName("KdeConnect");
|
||||||
|
serviceInfo.setServiceType("_device._tcp.");
|
||||||
|
|
||||||
|
computerLink = new UdpComputerLink();
|
||||||
|
|
||||||
|
mNsdManager = (NsdManager)context.getSystemService(Context.NSD_SERVICE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* public boolean startReceiveing() {
|
||||||
|
mNsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean startAnnouncing(ConnexionReceiver cr) {
|
||||||
|
Log.i("AvahiAnnouncer","startAnnouncing");
|
||||||
|
mNsdManager.registerService(serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener);
|
||||||
|
computerLink.addPackageReceiver(mPackageReceiver);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopAnnouncing() {
|
||||||
|
mNsdManager.unregisterService(mRegistrationListener);
|
||||||
|
computerLink.removePackageReceiver(mPackageReceiver);
|
||||||
|
}
|
||||||
|
}
|
@ -1,54 +1,62 @@
|
|||||||
package org.kde.connect;
|
package org.kde.connect;
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.net.nsd.NsdManager;
|
|
||||||
import android.net.nsd.NsdServiceInfo;
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.View.OnClickListener;
|
|
||||||
|
|
||||||
import org.kde.connect.Receivers.BaseReceiver;
|
import org.kde.connect.PackageEmitters.BaseReceiver;
|
||||||
import org.kde.connect.Receivers.PhoneCallReceiver;
|
import org.kde.connect.PackageEmitters.PhoneCallReceiver;
|
||||||
import org.kde.connect.Types.NetworkPackage;
|
import org.kde.connect.Types.NetworkPackage;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.DatagramPacket;
|
|
||||||
import java.net.DatagramSocket;
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class BackgroundService extends Service {
|
public class BackgroundService extends Service {
|
||||||
|
|
||||||
|
SharedPreferences settings;
|
||||||
|
ArrayList<Announcer> announcers = new ArrayList<Announcer>();
|
||||||
|
ArrayList<ComputerLink> computerLinks = new ArrayList<ComputerLink>();
|
||||||
ArrayList<BaseReceiver> receivers = new ArrayList<BaseReceiver>();
|
ArrayList<BaseReceiver> receivers = new ArrayList<BaseReceiver>();
|
||||||
DesktopCommunication dc = new DesktopCommunication();
|
|
||||||
|
private void addComputerLink(ComputerLink cl) {
|
||||||
|
|
||||||
|
computerLinks.add(cl);
|
||||||
|
|
||||||
|
if (settings.getBoolean("listenCalls", true)) {
|
||||||
|
receivers.add(new PhoneCallReceiver(getApplicationContext(), cl));
|
||||||
|
}
|
||||||
|
|
||||||
|
NetworkPackage p = new NetworkPackage(System.currentTimeMillis());
|
||||||
|
p.setType(NetworkPackage.Type.PING);
|
||||||
|
cl.sendPackage(p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
Log.e("BackgroundService","Starting");
|
Log.e("BackgroundService","Starting");
|
||||||
|
|
||||||
SharedPreferences settings = getSharedPreferences("KdeConnect", 0);
|
for (Announcer a : announcers) {
|
||||||
|
a.startAnnouncing(new Announcer.ConnexionReceiver() {
|
||||||
if (settings.getBoolean("listenCalls", true)) {
|
@Override
|
||||||
receivers.add(new PhoneCallReceiver(getApplicationContext(), dc));
|
public void onPair(ComputerLink cl) {
|
||||||
|
addComputerLink(cl);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkPackage p = new NetworkPackage(System.currentTimeMillis());
|
|
||||||
p.setType(NetworkPackage.Type.PING);
|
|
||||||
dc.asyncSend(p.toString());
|
|
||||||
|
|
||||||
return Service.START_STICKY;
|
return Service.START_STICKY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
Log.e("BackgroundService","Creating");
|
Log.e("BackgroundService","Creating");
|
||||||
|
|
||||||
|
settings = getSharedPreferences("KdeConnect", 0);
|
||||||
|
|
||||||
|
announcers.add(new AvahiAnnouncer(this));
|
||||||
|
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
38
KdeConnect/src/main/java/org/kde/connect/ComputerLink.java
Normal file
38
KdeConnect/src/main/java/org/kde/connect/ComputerLink.java
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package org.kde.connect;
|
||||||
|
|
||||||
|
import org.kde.connect.Types.NetworkPackage;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class ComputerLink {
|
||||||
|
|
||||||
|
public interface PackageReceiver {
|
||||||
|
public void onPackageReceived(NetworkPackage np);
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList<PackageReceiver> receivers = new ArrayList<PackageReceiver>();
|
||||||
|
|
||||||
|
public void addPackageReceiver(PackageReceiver pr) {
|
||||||
|
receivers.add(pr);
|
||||||
|
}
|
||||||
|
public void removePackageReceiver(PackageReceiver pr) {
|
||||||
|
receivers.remove(pr);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void packageReceived(NetworkPackage np) {
|
||||||
|
for(PackageReceiver pr : receivers) {
|
||||||
|
pr.onPackageReceived(np);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TO OVERRIDE
|
||||||
|
|
||||||
|
//Should set up a listener that calls packageReceived(NetworkPackage)
|
||||||
|
public abstract void startListening();
|
||||||
|
|
||||||
|
//Should be async
|
||||||
|
public abstract void sendPackage(NetworkPackage np);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -10,20 +10,6 @@ import android.view.View.OnClickListener;
|
|||||||
|
|
||||||
public class MainActivity extends Activity {
|
public class MainActivity extends Activity {
|
||||||
|
|
||||||
//http://developer.android.com/training/connect-devices-wirelessly/nsd.html
|
|
||||||
public void registerService(int port) {
|
|
||||||
// Create the NsdServiceInfo object, and populate it.
|
|
||||||
NsdServiceInfo serviceInfo = new NsdServiceInfo();
|
|
||||||
|
|
||||||
// The name is subject to change based on conflicts
|
|
||||||
// with other services advertised on the same network.
|
|
||||||
serviceInfo.setServiceName("NsdChat");
|
|
||||||
serviceInfo.setServiceType("_http._tcp.");
|
|
||||||
serviceInfo.setPort(port);
|
|
||||||
//....
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
package org.kde.connect.PackageEmitters;
|
||||||
|
|
||||||
|
public interface BaseReceiver {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,17 +1,17 @@
|
|||||||
package org.kde.connect.Receivers;
|
package org.kde.connect.PackageEmitters;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.telephony.PhoneStateListener;
|
import android.telephony.PhoneStateListener;
|
||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.kde.connect.DesktopCommunication;
|
import org.kde.connect.ComputerLink;
|
||||||
import org.kde.connect.Types.NetworkPackage;
|
import org.kde.connect.Types.NetworkPackage;
|
||||||
|
|
||||||
|
|
||||||
public class PhoneCallReceiver implements BaseReceiver {
|
public class PhoneCallReceiver implements BaseReceiver {
|
||||||
|
|
||||||
public PhoneCallReceiver(final Context ctx, final DesktopCommunication dc) {
|
public PhoneCallReceiver(final Context ctx, final ComputerLink dc) {
|
||||||
|
|
||||||
Log.i("PhoneCallReceiver", "Registered");
|
Log.i("PhoneCallReceiver", "Registered");
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ public class PhoneCallReceiver implements BaseReceiver {
|
|||||||
lastPackage.setType(NetworkPackage.Type.RING);
|
lastPackage.setType(NetworkPackage.Type.RING);
|
||||||
lastPackage.setBody(incomingNumber);
|
lastPackage.setBody(incomingNumber);
|
||||||
|
|
||||||
dc.asyncSend(lastPackage.toString());
|
dc.sendPackage(lastPackage);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ public class PhoneCallReceiver implements BaseReceiver {
|
|||||||
|
|
||||||
if (lastPackage != null) {
|
if (lastPackage != null) {
|
||||||
lastPackage.cancel();
|
lastPackage.cancel();
|
||||||
dc.asyncSend(lastPackage.toString());
|
dc.sendPackage(lastPackage);
|
||||||
lastPackage = null;
|
lastPackage = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ public class PhoneCallReceiver implements BaseReceiver {
|
|||||||
if (lastState != TelephonyManager.CALL_STATE_IDLE && lastPackage != null) {
|
if (lastState != TelephonyManager.CALL_STATE_IDLE && lastPackage != null) {
|
||||||
|
|
||||||
lastPackage.cancel();
|
lastPackage.cancel();
|
||||||
dc.asyncSend(lastPackage.toString());
|
dc.sendPackage(lastPackage);
|
||||||
|
|
||||||
if (lastState == TelephonyManager.CALL_STATE_RINGING) {
|
if (lastState == TelephonyManager.CALL_STATE_RINGING) {
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ public class PhoneCallReceiver implements BaseReceiver {
|
|||||||
lastPackage.setType(NetworkPackage.Type.MISSED);
|
lastPackage.setType(NetworkPackage.Type.MISSED);
|
||||||
lastPackage.setBody(incomingNumber);
|
lastPackage.setBody(incomingNumber);
|
||||||
|
|
||||||
dc.asyncSend(lastPackage.toString());
|
dc.sendPackage(lastPackage);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
package org.kde.connect.Receivers;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
public interface BaseReceiver {
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,5 +1,9 @@
|
|||||||
package org.kde.connect.Types;
|
package org.kde.connect.Types;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.telephony.TelephonyManager;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
@ -9,6 +13,8 @@ public class NetworkPackage {
|
|||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
|
ID_REQUEST,
|
||||||
|
PAIR_REQUEST,
|
||||||
RING,
|
RING,
|
||||||
MISSED,
|
MISSED,
|
||||||
SMS,
|
SMS,
|
||||||
@ -26,8 +32,9 @@ public class NetworkPackage {
|
|||||||
private boolean mIsCancel;
|
private boolean mIsCancel;
|
||||||
private JSONObject mExtras; //JSON
|
private JSONObject mExtras; //JSON
|
||||||
|
|
||||||
public NetworkPackage(long id) {
|
public NetworkPackage(long id/*, Context context*/) {
|
||||||
mId = id;
|
mId = id;
|
||||||
|
// final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
|
||||||
mDeviceId = 42;
|
mDeviceId = 42;
|
||||||
mTime = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() / 1000L;
|
mTime = Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis() / 1000L;
|
||||||
mType = Type.UNKNOWN;
|
mType = Type.UNKNOWN;
|
||||||
@ -99,4 +106,15 @@ public class NetworkPackage {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static public NetworkPackage fromString(String s/*, Context context*/) {
|
||||||
|
Log.i("NetworkPackage.fromString",s);
|
||||||
|
|
||||||
|
NetworkPackage np = new NetworkPackage(123456789 /*, context*/);
|
||||||
|
np.mType = Type.PAIR_REQUEST;
|
||||||
|
return np;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,42 @@
|
|||||||
package org.kde.connect;
|
package org.kde.connect;
|
||||||
|
|
||||||
|
import android.net.nsd.NsdServiceInfo;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.kde.connect.Types.NetworkPackage;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.DatagramPacket;
|
import java.net.DatagramPacket;
|
||||||
import java.net.DatagramSocket;
|
import java.net.DatagramSocket;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
import org.kde.connect.ComputerLink;
|
||||||
|
|
||||||
public class DesktopCommunication {
|
public class UdpComputerLink extends ComputerLink {
|
||||||
|
|
||||||
final int UDP_PORT = 10600;
|
final int UDP_PORT = 10601;
|
||||||
final String IP = "192.168.1.48";
|
final String IP = "192.168.1.48";
|
||||||
|
final int BUFFER_SIZE = 5*1024;
|
||||||
|
|
||||||
public void asyncSend(final String messageStr) {
|
@Override
|
||||||
|
public void startListening() {
|
||||||
|
try {
|
||||||
|
byte[] buffer = new byte[BUFFER_SIZE];
|
||||||
|
DatagramSocket socket = new DatagramSocket(UDP_PORT);
|
||||||
|
while(true){
|
||||||
|
DatagramPacket packet = new DatagramPacket(buffer, buffer.length );
|
||||||
|
socket.receive(packet);
|
||||||
|
String s = new String(packet.getData(), 0, packet.getLength());
|
||||||
|
packageReceived(NetworkPackage.fromString(s));
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendPackage(NetworkPackage np) {
|
||||||
|
final String messageStr = np.toString();
|
||||||
new AsyncTask<Void,Void,Void>(){
|
new AsyncTask<Void,Void,Void>(){
|
||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... voids) {
|
protected Void doInBackground(Void... voids) {
|
||||||
@ -32,6 +56,4 @@ public class DesktopCommunication {
|
|||||||
}
|
}
|
||||||
}.execute();
|
}.execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user