2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-22 18:07:55 +00:00

272 lines
8.9 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.Context;
2013-06-06 05:57:06 +02:00
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Binder;
2013-06-06 05:57:06 +02:00
import android.os.IBinder;
import android.preference.PreferenceManager;
2013-06-06 05:57:06 +02:00
import android.util.Log;
2013-06-18 03:05:32 +02:00
import org.kde.connect.ComputerLinks.BaseComputerLink;
import org.kde.connect.LinkProviders.AvahiTcpLinkProvider;
2013-07-02 15:22:05 +02:00
import org.kde.connect.LinkProviders.BaseLinkProvider;
2013-08-07 10:44:52 +02:00
import org.kde.connect.LinkProviders.BroadcastTcpLinkProvider;
import org.kde.connect.PackageInterfaces.BasePackageInterface;
2013-07-26 16:23:26 +02:00
import org.kde.connect.PackageInterfaces.BatteryMonitorPackageInterface;
import org.kde.connect.PackageInterfaces.CallNotificationPackageInterface;
import org.kde.connect.PackageInterfaces.ClipboardPackageInterface;
import org.kde.connect.PackageInterfaces.MprisControlPackageInterface;
import org.kde.connect.PackageInterfaces.PingPackageInterface;
import org.kde.connect.PackageInterfaces.SmsNotificationPackageInterface;
2013-06-06 05:57:06 +02:00
import java.util.ArrayList;
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-08-08 04:26:06 +02:00
private ArrayList<BaseLinkProvider> linkProviders = new ArrayList<BaseLinkProvider>();
2013-08-08 04:26:06 +02:00
private ArrayList<BasePackageInterface> packageInterfaces = new ArrayList<BasePackageInterface>();
2013-08-08 04:26:06 +02:00
private HashMap<String, Device> devices = new HashMap<String, Device>();
2013-06-06 05:57:06 +02:00
public void registerLinkProviders() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
if (settings.getBoolean("avahitcp_link", true)) {
2013-08-07 10:44:52 +02:00
//linkProviders.add(new AvahiTcpLinkProvider(this));
}
if (settings.getBoolean("broadcasttcp_link", true)) {
linkProviders.add(new BroadcastTcpLinkProvider(this));
}
}
public void registerPackageInterfacesFromSettings() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
Log.e("registerPackageInterfacesFromSettings","registerPackageInterfacesFromSettings");
if (settings.getBoolean("call_interface", true)) {
addPackageInterface(CallNotificationPackageInterface.class);
} else {
removePackageInterface(CallNotificationPackageInterface.class);
}
if (settings.getBoolean("sms_interface", true)) {
addPackageInterface(SmsNotificationPackageInterface.class);
} else {
removePackageInterface(SmsNotificationPackageInterface.class);
}
2013-07-26 16:23:26 +02:00
if (settings.getBoolean("battery_interface", true)) {
addPackageInterface(BatteryMonitorPackageInterface.class);
} else {
removePackageInterface(BatteryMonitorPackageInterface.class);
}
if (settings.getBoolean("clipboard_interface", true)) {
addPackageInterface(ClipboardPackageInterface.class);
} else {
removePackageInterface(ClipboardPackageInterface.class);
}
if (settings.getBoolean("mpris_interface", true)) {
addPackageInterface(MprisControlPackageInterface.class);
} else {
removePackageInterface(MprisControlPackageInterface.class);
2013-07-26 16:23:26 +02:00
}
if (settings.getBoolean("ping_interface", true)) {
addPackageInterface(PingPackageInterface.class);
} else {
removePackageInterface(PingPackageInterface.class);
}
}
public BasePackageInterface getPackageInterface(Class c) {
for (BasePackageInterface pi : packageInterfaces) {
if (c.isInstance(pi)) return pi;
}
return null;
}
public BasePackageInterface addPackageInterface(Class c) {
BasePackageInterface pi = getPackageInterface(c);
if (pi != null) {
Log.e("addPackageInterface","package interface already existent");
return pi;
}
try {
pi = (BasePackageInterface)c.newInstance();
} catch(Exception e) {
e.printStackTrace();
Log.e("addPackageInterface","Error instantiating packageinterface");
return null;
}
packageInterfaces.add(pi);
pi.onCreate(getApplicationContext());
for (Device dev : devices.values()) {
dev.addPackageReceiver(pi);
pi.addDevice(dev);
}
return pi;
}
public boolean removePackageInterface(Class c) {
for (BasePackageInterface pi : packageInterfaces) {
if (c.isInstance(pi)) {
packageInterfaces.remove(pi);
for (Device dev : devices.values()) {
dev.removePackageReceiver(pi);
pi.removeDevice(dev);
}
pi.onDestroy();
return true;
}
}
Log.e("removePackageInterface","Unexistent preference");
return false;
}
public Device getDevice(String id) {
return devices.get(id);
}
private BaseLinkProvider.ConnectionReceiver deviceListener = new BaseLinkProvider.ConnectionReceiver() {
@Override
2013-08-07 10:44:52 +02:00
public void onConnectionAccepted(NetworkPackage identityPackage, BaseComputerLink link) {
Log.i("BackgroundService", "Connection accepted!");
2013-08-07 10:44:52 +02:00
String deviceId = identityPackage.getString("deviceId");
String name = identityPackage.getString("deviceName");
if (devices.containsKey(deviceId)) {
Log.i("BackgroundService", "known device");
devices.get(deviceId).addLink(link);
} else {
Log.i("BackgroundService", "unknown device");
Device device = new Device(deviceId, name, link);
devices.put(deviceId, device);
for (BasePackageInterface pe : packageInterfaces) {
device.addPackageReceiver(pe);
pe.addDevice(device);
}
}
}
@Override
public void onConnectionLost(BaseComputerLink link) {
Log.e("BackgroundService","onConnectionLost");
Device d = devices.get(link.getDeviceId());
if (d != null) {
d.removeLink(link);
if (d.countLinkedDevices() == 0) devices.remove(link.getDeviceId());
}
}
};
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
}
return list;
2013-06-18 03:05:32 +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) {
Log.i("BackgroundService","onStartCommand");
for (InstanceCallback c : callbacks) {
c.onServiceStart(this);
}
callbacks.clear();
return Service.START_STICKY;
}
public void startDiscovery() {
Log.i("BackgroundService","StartDiscovery");
for (BaseLinkProvider a : linkProviders) {
a.onStart();
}
}
public void stopDiscovery() {
Log.i("BackgroundService","StopDiscovery");
for (BaseLinkProvider a : linkProviders) {
a.onStop();
}
}
2013-08-07 10:44:52 +02:00
public void onNetworkChange() {
Log.i("BackgroundService","OnNetworkChange");
for (BaseLinkProvider a : linkProviders) {
a.onNetworkChange();
}
}
public void addConnectionListener(BaseLinkProvider.ConnectionReceiver cr) {
Log.i("BackgroundService","Registering connection listener");
for (BaseLinkProvider a : linkProviders) {
a.addConnectionReceiver(cr);
2013-06-17 12:23:08 +02:00
}
2013-06-06 05:57:06 +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();
Log.i("BackgroundService","Service not started yet, initializing...");
2013-06-17 12:23:08 +02:00
registerPackageInterfacesFromSettings();
registerLinkProviders();
//Link Providers need to be already registered
addConnectionListener(deviceListener);
startDiscovery();
}
2013-06-17 12:23:08 +02:00
2013-06-06 05:57:06 +02:00
@Override
public void onDestroy() {
Log.i("BackgroundService", "Destroying");
stopDiscovery();
2013-06-06 05:57:06 +02:00
super.onDestroy();
}
@Override
public IBinder onBind (Intent intent) {
return new Binder();
}
//To use the service from the gui
2013-07-02 15:22:05 +02:00
public interface InstanceCallback {
void onServiceStart(BackgroundService service);
}
2013-07-02 15:22:05 +02:00
private static ArrayList<InstanceCallback> callbacks = new ArrayList<InstanceCallback>();
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);
Intent serviceIntent = new Intent(c, BackgroundService.class);
c.startService(serviceIntent);
2013-07-02 15:22:05 +02:00
}
2013-06-06 05:57:06 +02:00
}