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

Added a mutex to BackgroundService to prevent a ConcurrentModificationException

The same should be done for NotificationReceiver

+Added a TODO for the future GUI to plugins
This commit is contained in:
Albert Vaca
2013-08-21 21:30:25 +02:00
parent 32ac65bf8f
commit 9f13d577a4
2 changed files with 24 additions and 12 deletions

View File

@@ -20,6 +20,8 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BackgroundService extends Service { public class BackgroundService extends Service {
@@ -97,17 +99,6 @@ public class BackgroundService extends Service {
return devices; return devices;
} }
//This will be called for each intent launch, even if the service is already started and is reused
@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() { public void startDiscovery() {
Log.i("BackgroundService","StartDiscovery"); Log.i("BackgroundService","StartDiscovery");
for (BaseLinkProvider a : linkProviders) { for (BaseLinkProvider a : linkProviders) {
@@ -183,12 +174,31 @@ public class BackgroundService extends Service {
private static ArrayList<InstanceCallback> callbacks = new ArrayList<InstanceCallback>(); private static ArrayList<InstanceCallback> callbacks = new ArrayList<InstanceCallback>();
private final Lock mutex = new ReentrantLock(true);
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//This will be called for each intent launch, even if the service is already started and it is reused
Log.i("BackgroundService","onStartCommand");
mutex.lock();
for (InstanceCallback c : callbacks) {
c.onServiceStart(this);
}
callbacks.clear();
mutex.unlock();
return Service.START_STICKY;
}
public static void Start(Context c) { public static void Start(Context c) {
RunCommand(c, null); RunCommand(c, null);
} }
public static void RunCommand(Context c, final InstanceCallback callback) { public static void RunCommand(Context c, final InstanceCallback callback) {
if (callback != null) callbacks.add(callback); if (callback != null) {
mutex.lock();
callbacks.add(callback);
mutex.unlock();
}
Intent serviceIntent = new Intent(c, BackgroundService.class); Intent serviceIntent = new Intent(c, BackgroundService.class);
c.startService(serviceIntent); c.startService(serviceIntent);
} }

View File

@@ -76,4 +76,6 @@ public abstract class Plugin {
*/ */
public abstract AlertDialog getErrorDialog(Context baseContext); public abstract AlertDialog getErrorDialog(Context baseContext);
//TODO: Add a getInterfaceButton to show in the device activity
} }