2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-24 10:58:20 +00:00

186 lines
5.0 KiB
Java
Raw Normal View History

2013-06-06 05:57:06 +02:00
package org.kde.connect;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
2013-06-06 05:57:06 +02:00
import android.content.Intent;
import android.content.ServiceConnection;
2013-06-06 05:57:06 +02:00
import android.content.SharedPreferences;
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;
import org.kde.connect.Extensions.SingletonService;
import org.kde.connect.Locators.AvahiLocator;
import org.kde.connect.Locators.BaseLocator;
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;
public class BackgroundService extends SingletonService {
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
ArrayList<BaseLocator> locators = new ArrayList<BaseLocator>();
ArrayList<BaseComputerLink> computerLinks = new ArrayList<BaseComputerLink>();
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
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
NetworkPackage p = new NetworkPackage(System.currentTimeMillis());
p.setType(NetworkPackage.Type.PING);
2013-06-17 12:23:08 +02:00
cl.sendPackage(p);
}
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)) {
locators.add(new AvahiLocator(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");
return Service.START_STICKY;
}
public void reachComputers() {
for (BaseLocator a : locators) {
a.reachComputers(new BaseLocator.ConnectionReceiver() {
2013-06-17 12:23:08 +02:00
@Override
public void onConnectionAccepted(BaseComputerLink link) {
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
}
public void sendPing() {
pingEmitter.sendPing();
}
2013-06-06 05:57:06 +02:00
@Override
public void onCreate() {
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-06-06 05:57:06 +02:00
super.onCreate();
}
@Override
public void onDestroy() {
Log.e("BackgroundService","Destroying");
super.onDestroy();
}
//Singleton service auxiliars
private class LocalBinder extends Binder {
public BackgroundService getInstance() {
return BackgroundService.this;
}
}
public interface ServiceStartCallback {
void onServiceStart(BackgroundService service);
}
private IBinder mBinder = new LocalBinder();
private static BackgroundService instance = null;
public static BackgroundService GetInstance() {
return instance;
}
public static void Start(Context c) {
Start(c,null);
}
public static void Start(Context c, ServiceStartCallback callback) {
if (instance != null) {
Log.e("SingletonService","Already started");
}
Intent serviceIntent = new Intent(c, BackgroundService.class);
c.startService(serviceIntent);
c.bindService(serviceIntent, new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
instance = null;
}
public void onServiceConnected(ComponentName name, IBinder binder) {
instance = ((LocalBinder) binder).getInstance();
if (callback != null) callback.onServiceStart(instance);
}
}, Service.BIND_AUTO_CREATE);
}
2013-06-06 05:57:06 +02:00
@Override
public IBinder onBind(Intent intent) {
return mBinder;
2013-06-06 05:57:06 +02:00
}
}