2013-06-06 05:57:06 +02:00
|
|
|
package org.kde.connect;
|
|
|
|
|
|
|
|
import android.app.Service;
|
2013-06-18 20:04:53 +02:00
|
|
|
import android.content.ComponentName;
|
|
|
|
import android.content.Context;
|
2013-06-06 05:57:06 +02:00
|
|
|
import android.content.Intent;
|
2013-06-18 20:04:53 +02:00
|
|
|
import android.content.ServiceConnection;
|
2013-06-06 05:57:06 +02:00
|
|
|
import android.content.SharedPreferences;
|
2013-06-18 02:14:22 +02:00
|
|
|
import android.os.Binder;
|
2013-06-06 05:57:06 +02:00
|
|
|
import android.os.IBinder;
|
|
|
|
import android.util.Log;
|
|
|
|
|
2013-06-18 03:05:32 +02:00
|
|
|
import org.kde.connect.ComputerLinks.BaseComputerLink;
|
2013-07-23 16:11:54 +02:00
|
|
|
import org.kde.connect.LinkProviders.AvahiTcpLinkProvider;
|
2013-07-02 15:22:05 +02:00
|
|
|
import org.kde.connect.LinkProviders.BaseLinkProvider;
|
|
|
|
import org.kde.connect.LinkProviders.AvahiLinkProvider;
|
2013-06-18 02:14:22 +02:00
|
|
|
import org.kde.connect.PackageEmitters.BasePackageEmitter;
|
|
|
|
import org.kde.connect.PackageEmitters.CallPackageEmitter;
|
|
|
|
import org.kde.connect.PackageEmitters.PingPackageEmitter;
|
|
|
|
import org.kde.connect.PackageReceivers.BasePackageReceiver;
|
|
|
|
import org.kde.connect.PackageReceivers.PingPackageReceiver;
|
2013-06-06 05:57:06 +02:00
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2013-07-23 16:11:54 +02:00
|
|
|
import java.util.Dictionary;
|
|
|
|
import java.util.HashMap;
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-06-19 16:15:25 +02:00
|
|
|
public class BackgroundService extends Service {
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-06-17 12:23:08 +02:00
|
|
|
SharedPreferences settings;
|
2013-06-18 03:05:32 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
ArrayList<BaseLinkProvider> locators = new ArrayList<BaseLinkProvider>();
|
2013-06-18 02:14:22 +02:00
|
|
|
|
|
|
|
ArrayList<BasePackageEmitter> emitters = new ArrayList<BasePackageEmitter>();
|
|
|
|
ArrayList<BasePackageReceiver> receivers = new ArrayList<BasePackageReceiver>();
|
|
|
|
|
2013-07-23 16:11:54 +02:00
|
|
|
HashMap<String, Device> devices = new HashMap<String, Device>();
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-07-23 16:11:54 +02:00
|
|
|
PingPackageEmitter pingEmitter;
|
2013-06-17 12:23:08 +02:00
|
|
|
|
2013-06-18 02:14:22 +02:00
|
|
|
private void registerEmitters() {
|
|
|
|
if (settings.getBoolean("emit_call", true)) {
|
|
|
|
emitters.add(new CallPackageEmitter(getApplicationContext()));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (settings.getBoolean("emit_ping", true)) {
|
|
|
|
emitters.add(pingEmitter);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void registerReceivers() {
|
|
|
|
if (settings.getBoolean("receive_ping", true)) {
|
|
|
|
receivers.add(new PingPackageReceiver(getApplicationContext()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-18 03:05:32 +02:00
|
|
|
public void registerAnnouncers() {
|
2013-07-23 16:11:54 +02:00
|
|
|
/*if (settings.getBoolean("announce_avahi", true)) {
|
2013-07-02 15:22:05 +02:00
|
|
|
locators.add(new AvahiLinkProvider(this));
|
2013-07-23 16:11:54 +02:00
|
|
|
}*/
|
|
|
|
if (settings.getBoolean("announce_avahi_tcp", true)) {
|
|
|
|
locators.add(new AvahiTcpLinkProvider(this));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<String> getVisibleDevices() {
|
|
|
|
ArrayList<String> list = new ArrayList<String>();
|
|
|
|
for(Device d : devices.values()) {
|
|
|
|
list.add(d.getName());
|
2013-06-18 03:05:32 +02:00
|
|
|
}
|
2013-07-23 16:11:54 +02:00
|
|
|
return list;
|
2013-06-18 03:05:32 +02:00
|
|
|
}
|
|
|
|
|
2013-07-04 19:17:22 +02:00
|
|
|
//This will be called for each intent launch, even if the service is already started and is reused
|
2013-06-17 12:23:08 +02:00
|
|
|
@Override
|
|
|
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
2013-07-04 19:17:22 +02:00
|
|
|
Log.e("BackgroundService","Running callbacks waiting service to be ready");
|
|
|
|
for (InstanceCallback c : callbacks) {
|
|
|
|
c.onServiceStart(this);
|
|
|
|
}
|
|
|
|
callbacks.clear();
|
2013-06-18 20:04:53 +02:00
|
|
|
return Service.START_STICKY;
|
|
|
|
}
|
|
|
|
|
2013-07-23 16:11:54 +02:00
|
|
|
private void startDiscovery() {
|
|
|
|
Log.e("StartDiscovery","Registering connection receivers");
|
2013-07-02 15:22:05 +02:00
|
|
|
for (BaseLinkProvider a : locators) {
|
2013-07-23 16:11:54 +02:00
|
|
|
Log.e("Registerign", a.toString());
|
2013-07-02 15:22:05 +02:00
|
|
|
a.reachComputers(new BaseLinkProvider.ConnectionReceiver() {
|
2013-06-17 12:23:08 +02:00
|
|
|
@Override
|
2013-07-23 16:11:54 +02:00
|
|
|
public void onConnectionAccepted(String deviceId, String name, BaseComputerLink link) {
|
2013-07-02 15:22:05 +02:00
|
|
|
Log.e("BackgroundService", "Connection accepted!");
|
2013-07-23 16:11:54 +02:00
|
|
|
|
|
|
|
if (devices.containsKey(deviceId)) {
|
|
|
|
Log.e("BackgroundService", "known device");
|
|
|
|
devices.get(deviceId).addLink(link);
|
|
|
|
} else {
|
|
|
|
Log.e("BackgroundService", "unknown device");
|
|
|
|
Device device = new Device(deviceId, name, link);
|
|
|
|
devices.put(deviceId, device);
|
|
|
|
for (BasePackageEmitter pe : emitters) pe.addDevice(device);
|
|
|
|
for (BasePackageReceiver pr : receivers) device.addPackageReceiver(pr);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onConnectionLost(BaseComputerLink link) {
|
|
|
|
Device d = devices.get(link.getDeviceId());
|
|
|
|
if (d != null) {
|
|
|
|
d.removeLink(link);
|
|
|
|
//if (d.countLinkedDevices() == 0) devices.remove(link.getDeviceId);
|
|
|
|
}
|
|
|
|
|
2013-06-17 12:23:08 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|
|
|
|
|
2013-06-18 02:14:22 +02:00
|
|
|
public void sendPing() {
|
|
|
|
pingEmitter.sendPing();
|
|
|
|
}
|
|
|
|
|
2013-07-04 19:17:22 +02:00
|
|
|
//This will called only once, even if we launch the service intent several times
|
2013-06-06 05:57:06 +02:00
|
|
|
@Override
|
|
|
|
public void onCreate() {
|
2013-07-02 15:22:05 +02:00
|
|
|
super.onCreate();
|
|
|
|
|
2013-07-04 19:17:22 +02:00
|
|
|
Log.e("BackgroundService","Service not started yet, initializing...");
|
2013-06-17 12:23:08 +02:00
|
|
|
|
|
|
|
settings = getSharedPreferences("KdeConnect", 0);
|
|
|
|
|
2013-06-18 03:05:32 +02:00
|
|
|
pingEmitter = new PingPackageEmitter(getApplicationContext());
|
|
|
|
|
|
|
|
registerEmitters();
|
|
|
|
registerReceivers();
|
|
|
|
registerAnnouncers();
|
2013-07-23 16:11:54 +02:00
|
|
|
startDiscovery();
|
|
|
|
|
|
|
|
}
|
2013-06-17 12:23:08 +02:00
|
|
|
|
2013-07-23 16:11:54 +02:00
|
|
|
public void restart() {
|
|
|
|
devices.clear();
|
|
|
|
startDiscovery();
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroy() {
|
2013-07-04 19:17:22 +02:00
|
|
|
Log.e("BackgroundService", "Destroying");
|
2013-06-06 05:57:06 +02:00
|
|
|
super.onDestroy();
|
|
|
|
}
|
|
|
|
|
2013-07-04 19:17:22 +02:00
|
|
|
@Override
|
|
|
|
public IBinder onBind (Intent intent) {
|
|
|
|
return new Binder();
|
|
|
|
}
|
2013-06-18 02:14:22 +02:00
|
|
|
|
2013-06-18 20:04:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-04 19:17:22 +02:00
|
|
|
//To use the service from the gui
|
2013-06-18 20:04:53 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
public interface InstanceCallback {
|
2013-06-18 20:04:53 +02:00
|
|
|
void onServiceStart(BackgroundService service);
|
|
|
|
}
|
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
private static ArrayList<InstanceCallback> callbacks = new ArrayList<InstanceCallback>();
|
2013-07-23 16:11:54 +02:00
|
|
|
|
2013-06-18 20:04:53 +02:00
|
|
|
public static void Start(Context c) {
|
2013-07-02 15:22:05 +02:00
|
|
|
RunCommand(c, null);
|
2013-06-18 20:04:53 +02:00
|
|
|
}
|
2013-07-23 16:11:54 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
public static void RunCommand(Context c, final InstanceCallback callback) {
|
|
|
|
if (callback != null) callbacks.add(callback);
|
2013-07-04 19:17:22 +02:00
|
|
|
Intent serviceIntent = new Intent(c, BackgroundService.class);
|
|
|
|
c.startService(serviceIntent);
|
2013-07-02 15:22:05 +02:00
|
|
|
}
|
2013-06-18 20:04:53 +02:00
|
|
|
|
2013-06-18 02:14:22 +02:00
|
|
|
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|