2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-23 02:17:20 +00:00

189 lines
5.5 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;
2013-07-02 15:22:05 +02:00
import org.kde.connect.LinkProviders.BaseLinkProvider;
import org.kde.connect.LinkProviders.AvahiLinkProvider;
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>();
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);
//cl.sendPackage(p);
2013-06-17 12:23:08 +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();
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
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
}
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-07-02 15:22:05 +02:00
//All kind of black magic to make the service a singleton
2013-07-02 15:22:05 +02:00
public interface InstanceCallback {
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-07-02 15:22:05 +02:00
private static void attendCallbacks() {
for (InstanceCallback c : callbacks) {
c.onServiceStart(instance);
}
callbacks.clear();
}
public static void Start(Context c) {
2013-07-02 15:22:05 +02:00
RunCommand(c, null);
}
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-07-02 15:22:05 +02:00
} else {
attendCallbacks();
}
}
2013-07-02 15:22:05 +02:00
private class LocalBinder extends Binder {
public BackgroundService getInstance() {
return BackgroundService.this;
}
}
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) {
return mBinder;
2013-06-06 05:57:06 +02:00
}
}