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-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 org.kde.connect.Types.NetworkPackage;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
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 20:04:53 +02:00
|
|
|
ArrayList<BaseComputerLink> computerLinks = new ArrayList<BaseComputerLink>();
|
2013-06-18 02:14:22 +02:00
|
|
|
|
|
|
|
ArrayList<BasePackageEmitter> emitters = new ArrayList<BasePackageEmitter>();
|
|
|
|
ArrayList<BasePackageReceiver> receivers = new ArrayList<BasePackageReceiver>();
|
|
|
|
|
|
|
|
PingPackageEmitter pingEmitter;
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-06-18 03:05:32 +02:00
|
|
|
private void addComputerLink(BaseComputerLink cl) {
|
|
|
|
|
|
|
|
Log.i("BackgroundService","addComputerLink");
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-06-18 20:04:53 +02:00
|
|
|
computerLinks.add(cl);
|
|
|
|
|
|
|
|
for(BasePackageEmitter pe : emitters) pe.addComputerLink(cl);
|
|
|
|
for(BasePackageReceiver pr : receivers) cl.addPackageReceiver(pr);
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-06-18 03:05:32 +02:00
|
|
|
Log.i("BackgroundService","sending ping after connection");
|
2013-06-06 05:57:06 +02:00
|
|
|
|
2013-07-03 03:52:44 +02:00
|
|
|
//NetworkPackage p = new NetworkPackage(System.currentTimeMillis());
|
|
|
|
//p.setType(NetworkPackage.Type.PING);
|
|
|
|
//cl.sendPackage(p);
|
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() {
|
|
|
|
if (settings.getBoolean("announce_avahi", true)) {
|
2013-07-02 15:22:05 +02:00
|
|
|
locators.add(new AvahiLinkProvider(this));
|
2013-06-18 03:05:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-17 12:23:08 +02:00
|
|
|
@Override
|
|
|
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
|
|
|
Log.e("BackgroundService","Starting");
|
2013-07-02 15:22:05 +02:00
|
|
|
instance=this;
|
|
|
|
attendCallbacks();
|
2013-06-18 20:04:53 +02:00
|
|
|
return Service.START_STICKY;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void reachComputers() {
|
2013-07-02 15:22:05 +02:00
|
|
|
for (BaseLinkProvider a : locators) {
|
|
|
|
a.reachComputers(new BaseLinkProvider.ConnectionReceiver() {
|
2013-06-17 12:23:08 +02:00
|
|
|
@Override
|
2013-06-18 20:04:53 +02:00
|
|
|
public void onConnectionAccepted(BaseComputerLink link) {
|
2013-07-02 15:22:05 +02:00
|
|
|
Log.e("BackgroundService", "Connection accepted!");
|
|
|
|
//TODO: Check if there are other links available, and keep the best one
|
|
|
|
addComputerLink(link);
|
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-06-06 05:57:06 +02:00
|
|
|
@Override
|
|
|
|
public void onCreate() {
|
2013-07-02 15:22:05 +02:00
|
|
|
super.onCreate();
|
|
|
|
|
2013-06-06 05:57:06 +02:00
|
|
|
Log.e("BackgroundService","Creating");
|
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-06-17 12:23:08 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
instance = this;
|
|
|
|
attendCallbacks();
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroy() {
|
|
|
|
Log.e("BackgroundService","Destroying");
|
|
|
|
super.onDestroy();
|
2013-07-02 15:22:05 +02:00
|
|
|
instance = null;
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|
|
|
|
|
2013-06-18 02:14:22 +02:00
|
|
|
|
2013-06-18 20:04:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
//All kind of black magic to make the service a singleton
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static BackgroundService instance = null;
|
2013-07-02 15:22:05 +02:00
|
|
|
private static ArrayList<InstanceCallback> callbacks = new ArrayList<InstanceCallback>();
|
2013-06-18 20:04:53 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
private static void attendCallbacks() {
|
|
|
|
for (InstanceCallback c : callbacks) {
|
|
|
|
c.onServiceStart(instance);
|
|
|
|
}
|
|
|
|
callbacks.clear();
|
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-02 15:22:05 +02:00
|
|
|
public static void RunCommand(Context c, final InstanceCallback callback) {
|
|
|
|
|
|
|
|
if (callback != null) callbacks.add(callback);
|
|
|
|
|
|
|
|
if (instance == null) {
|
|
|
|
Intent serviceIntent = new Intent(c, BackgroundService.class);
|
|
|
|
c.startService(serviceIntent);
|
|
|
|
try {
|
|
|
|
c.bindService(serviceIntent, new ServiceConnection() {
|
|
|
|
public void onServiceDisconnected(ComponentName name) {
|
|
|
|
instance = null;
|
|
|
|
}
|
|
|
|
public void onServiceConnected(ComponentName name, IBinder binder) {
|
|
|
|
instance = ((LocalBinder) binder).getInstance();
|
|
|
|
attendCallbacks();
|
|
|
|
}
|
|
|
|
}, Service.BIND_AUTO_CREATE);
|
|
|
|
} catch(Exception e) {
|
2013-06-18 20:04:53 +02:00
|
|
|
|
|
|
|
}
|
2013-07-02 15:22:05 +02:00
|
|
|
} else {
|
|
|
|
attendCallbacks();
|
|
|
|
}
|
|
|
|
}
|
2013-06-18 20:04:53 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
private class LocalBinder extends Binder {
|
|
|
|
public BackgroundService getInstance() {
|
|
|
|
return BackgroundService.this;
|
|
|
|
}
|
2013-06-18 20:04:53 +02:00
|
|
|
}
|
2013-06-18 02:14:22 +02:00
|
|
|
|
2013-07-02 15:22:05 +02:00
|
|
|
private IBinder mBinder = new LocalBinder();
|
|
|
|
|
2013-06-06 05:57:06 +02:00
|
|
|
@Override
|
|
|
|
public IBinder onBind(Intent intent) {
|
2013-06-18 02:14:22 +02:00
|
|
|
return mBinder;
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|
|
|
|
}
|