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.Context;
|
2013-06-06 05:57:06 +02:00
|
|
|
import android.content.Intent;
|
2013-08-10 05:16:59 +02:00
|
|
|
import android.content.IntentFilter;
|
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-08-16 10:31:01 +02:00
|
|
|
import android.os.Handler;
|
2013-06-06 05:57:06 +02:00
|
|
|
import android.os.IBinder;
|
2013-08-16 10:31:01 +02:00
|
|
|
import android.os.Looper;
|
2013-07-31 18:02:22 +02:00
|
|
|
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;
|
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;
|
2013-06-06 05:57:06 +02:00
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2013-07-23 16:11:54 +02:00
|
|
|
import java.util.HashMap;
|
2013-08-16 10:31:01 +02:00
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Set;
|
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-06-18 02:14:22 +02:00
|
|
|
|
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
|
|
|
|
2013-08-16 10:31:01 +02:00
|
|
|
private void loadRememberedDevicesFromSettings() {
|
|
|
|
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
|
|
|
Set<String> trustedDevices = preferences.getStringSet("trusted", new HashSet<String>());
|
|
|
|
for(String deviceId : trustedDevices) {
|
|
|
|
Log.e("loadRememberedDevicesFromSettings",deviceId);
|
2013-08-19 19:57:29 +02:00
|
|
|
devices.put(deviceId,new Device(getBaseContext(), deviceId));
|
2013-08-16 10:31:01 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-31 18:02:22 +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));
|
|
|
|
}
|
2013-08-16 10:31:01 +02:00
|
|
|
|
2013-08-07 10:44:52 +02:00
|
|
|
if (settings.getBoolean("broadcasttcp_link", true)) {
|
|
|
|
linkProviders.add(new BroadcastTcpLinkProvider(this));
|
2013-07-31 18:02:22 +02:00
|
|
|
}
|
2013-08-01 02:30:58 +02:00
|
|
|
|
2013-07-29 18:42:12 +02:00
|
|
|
}
|
|
|
|
|
2013-07-31 18:02:22 +02:00
|
|
|
public Device getDevice(String id) {
|
|
|
|
return devices.get(id);
|
2013-07-23 16:11:54 +02:00
|
|
|
}
|
|
|
|
|
2013-07-31 18:02:22 +02:00
|
|
|
private BaseLinkProvider.ConnectionReceiver deviceListener = new BaseLinkProvider.ConnectionReceiver() {
|
|
|
|
@Override
|
2013-08-16 10:31:01 +02:00
|
|
|
public void onConnectionReceived(final NetworkPackage identityPackage, final BaseComputerLink link) {
|
|
|
|
|
2013-07-31 18:02:22 +02:00
|
|
|
Log.i("BackgroundService", "Connection accepted!");
|
|
|
|
|
2013-08-16 10:31:01 +02:00
|
|
|
runOnMainThread(new Runnable() { //Some plugins that create Handlers will crash if started from a different thread!
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
|
|
|
|
String deviceId = identityPackage.getString("deviceId");
|
|
|
|
String name = identityPackage.getString("deviceName");
|
|
|
|
|
|
|
|
if (devices.containsKey(deviceId)) {
|
|
|
|
Log.i("BackgroundService", "known device");
|
|
|
|
Device device = devices.get(deviceId);
|
|
|
|
if (!device.hasName()) device.setName(identityPackage.getString("deviceName"));
|
|
|
|
device.addLink(link);
|
|
|
|
} else {
|
|
|
|
Log.i("BackgroundService", "unknown device");
|
2013-08-19 19:57:29 +02:00
|
|
|
Device device = new Device(getBaseContext(), deviceId, name, link);
|
2013-08-16 10:31:01 +02:00
|
|
|
devices.put(deviceId, device);
|
|
|
|
}
|
2013-07-31 18:02:22 +02:00
|
|
|
}
|
2013-08-16 10:31:01 +02:00
|
|
|
});
|
2013-07-31 18:02:22 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onConnectionLost(BaseComputerLink link) {
|
|
|
|
Device d = devices.get(link.getDeviceId());
|
|
|
|
if (d != null) {
|
|
|
|
d.removeLink(link);
|
2013-08-16 10:31:01 +02:00
|
|
|
if (!d.isReachable() && !d.isTrusted()) {
|
|
|
|
devices.remove(link.getDeviceId());
|
|
|
|
}
|
2013-07-31 18:02:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-08-16 10:31:01 +02:00
|
|
|
public HashMap<String, Device> getDevices() {
|
|
|
|
return devices;
|
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-24 18:42:33 +02:00
|
|
|
Log.i("BackgroundService","onStartCommand");
|
2013-07-04 19:17:22 +02:00
|
|
|
for (InstanceCallback c : callbacks) {
|
|
|
|
c.onServiceStart(this);
|
|
|
|
}
|
|
|
|
callbacks.clear();
|
2013-06-18 20:04:53 +02:00
|
|
|
return Service.START_STICKY;
|
|
|
|
}
|
|
|
|
|
2013-07-31 19:10:51 +02:00
|
|
|
public void startDiscovery() {
|
|
|
|
Log.i("BackgroundService","StartDiscovery");
|
2013-07-29 18:42:12 +02:00
|
|
|
for (BaseLinkProvider a : linkProviders) {
|
2013-07-31 19:10:51 +02:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-07-31 19:10:51 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
|
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-08-10 05:16:59 +02:00
|
|
|
// Register screen on listener
|
|
|
|
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
|
2013-08-16 10:31:01 +02:00
|
|
|
registerReceiver(new KdeConnectBroadcastReceiver(), filter);
|
2013-08-10 05:16:59 +02:00
|
|
|
|
2013-07-24 18:42:33 +02:00
|
|
|
Log.i("BackgroundService","Service not started yet, initializing...");
|
2013-06-17 12:23:08 +02:00
|
|
|
|
2013-08-16 10:31:01 +02:00
|
|
|
loadRememberedDevicesFromSettings();
|
2013-07-24 18:42:33 +02:00
|
|
|
registerLinkProviders();
|
2013-07-31 19:10:51 +02:00
|
|
|
|
|
|
|
//Link Providers need to be already registered
|
|
|
|
addConnectionListener(deviceListener);
|
2013-07-23 16:11:54 +02:00
|
|
|
startDiscovery();
|
|
|
|
|
|
|
|
}
|
2013-06-17 12:23:08 +02:00
|
|
|
|
2013-06-06 05:57:06 +02:00
|
|
|
@Override
|
|
|
|
public void onDestroy() {
|
2013-07-24 18:42:33 +02:00
|
|
|
Log.i("BackgroundService", "Destroying");
|
2013-08-08 04:12:28 +02:00
|
|
|
stopDiscovery();
|
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-08-16 10:31:01 +02:00
|
|
|
|
|
|
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
|
|
|
private void runOnMainThread(Runnable runnable) {
|
|
|
|
mainHandler.post(runnable);
|
|
|
|
}
|
|
|
|
|
2013-06-06 05:57:06 +02:00
|
|
|
}
|