diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e05c9e9ce..0cd8c37aa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -417,16 +417,16 @@ android:name=".activities.FindPhoneActivity" android:label="Find Phone" /> + android:parentActivityName=".tasker.settings.activities.TaskerEventsActivity" /> + android:parentActivityName=".tasker.settings.activities.TaskerActivity" /> getSupportedTypes() { - return Arrays.asList(TaskerEventType.BUTTON, TaskerEventType.DATA, TaskerEventType.CONNECTION); - } - - @Override - public TaskerSettings getTaskerSettings(TaskerEventType eventType) { - return null; - } - } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchTaskerSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchTaskerSpec.java new file mode 100644 index 000000000..d6acf2ede --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchTaskerSpec.java @@ -0,0 +1,36 @@ +package nodomain.freeyourgadget.gadgetbridge.devices.xwatch; + +import android.bluetooth.BluetoothGatt; +import android.bluetooth.BluetoothGattCharacteristic; + +import java.util.Arrays; +import java.util.List; + +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; +import nodomain.freeyourgadget.gadgetbridge.tasker.service.AbstractTaskerSpec; + +public class XWatchTaskerSpec extends AbstractTaskerSpec { + + @Override + public TaskerEventType getEventType(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { + if (XWatchService.UUID_NOTIFY.equals(characteristic.getUuid())) { + byte[] data = characteristic.getValue(); + if (data[0] == XWatchService.COMMAND_ACTIVITY_DATA) { + return TaskerEventType.DATA; + } + if (data[0] == XWatchService.COMMAND_ACTION_BUTTON) { + return TaskerEventType.BUTTON; + } + if (data[0] == XWatchService.COMMAND_CONNECTED) { + return TaskerEventType.CONNECTION; + } + } + return TaskerEventType.NO_OP; + } + + @Override + public List getSupportedTypes() { + return Arrays.asList(TaskerEventType.BUTTON, TaskerEventType.DATA, TaskerEventType.CONNECTION); + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xwatch/XWatchSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xwatch/XWatchSupport.java index 527c65a5b..5f289742f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xwatch/XWatchSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/xwatch/XWatchSupport.java @@ -61,6 +61,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder; import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction; import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.DeviceInfo; import nodomain.freeyourgadget.gadgetbridge.tasker.service.TaskerBleProfile; +import nodomain.freeyourgadget.gadgetbridge.tasker.service.TaskerConstants; import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; import nodomain.freeyourgadget.gadgetbridge.tasker.service.TaskerService; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEvent; @@ -81,7 +82,7 @@ public class XWatchSupport extends AbstractBTLEDeviceSupport { addSupportedService(XWatchService.UUID_SERVICE); addSupportedService(XWatchService.UUID_WRITE); addSupportedService(XWatchService.UUID_NOTIFY); - addSupportedProfile(new TaskerBleProfile<>(this, XWatchService.getTaskerSpec())); + addSupportedProfile(new TaskerBleProfile<>(this, TaskerConstants.TaskerDevice.XWATCH)); } public static byte[] crcChecksum(byte[] data) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplier.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplier.java index f5cb83852..8df8ff2a4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplier.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplier.java @@ -9,6 +9,14 @@ public interface SettingSupplier { T get(); + void set(T object); + boolean isPresent(); + SettingSupplier onChanged(SettingListener onChanged); + + interface SettingListener { + void changed(T object); + } + } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplierImpl.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplierImpl.java new file mode 100644 index 000000000..1045cad69 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/event/SettingSupplierImpl.java @@ -0,0 +1,36 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.event; + +public class SettingSupplierImpl implements SettingSupplier { + + private T object; + private SettingListener onChanged; + + public SettingSupplierImpl() { + } + + public SettingSupplierImpl(T object) { + this.object = object; + } + + @Override + public T get() { + return object; + } + + @Override + public void set(T object) { + this.object = object; + onChanged.changed(object); + } + + @Override + public boolean isPresent() { + return object != null; + } + + @Override + public SettingSupplier onChanged(SettingListener onChanged) { + this.onChanged = onChanged; + return this; + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/AbstractTaskerService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/AbstractTaskerService.java new file mode 100644 index 000000000..6e4c620cb --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/AbstractTaskerService.java @@ -0,0 +1,63 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplier; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplierImpl; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; +import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTask; +import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; + +/** + * Tasker service for scheduling task with specific thresholds. + *

+ * One instance per thread/device! The service is not threadsafe. + */ +public abstract class AbstractTaskerService { + + protected SettingSupplier enabled; + private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + private Map tasks = new HashMap<>(); + private static final long DEFAULT_THRESHOLD = 50L; + + public AbstractTaskerService() { + this.enabled = new SettingSupplierImpl() { + @Override + public Boolean get() { + return GBApplication.getPrefs().getBoolean(TaskerConstants.TASKER_ENABLED, false); + } + }; + } + + public boolean isActive() { + return enabled.get(); + } + + public boolean runForType(TaskerEventType type) { + if (type != null && !TaskerEventType.NO_OP.equals(type) && isActive() && ready()) { + if (!tasks.containsKey(type)) { + SettingSupplier taskProvider = taskProvider(type); + if (taskProvider.isPresent()) { + SettingSupplier threshold = threshold(type); + tasks.put(type, new TaskerTask(type, taskProvider.get(), threshold.isPresent() ? threshold.get() : DEFAULT_THRESHOLD)); + } + } + tasks.get(type).schedule(executor); + return true; + } + return false; + } + + protected abstract SettingSupplier threshold(TaskerEventType type); + + protected abstract SettingSupplier taskProvider(TaskerEventType type); + + public static boolean ready() { + return TaskerIntent.testStatus(GBApplication.getContext()).equals(TaskerIntent.Status.OK); + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/AbstractTaskerSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/AbstractTaskerSpec.java new file mode 100644 index 000000000..bdc7c1239 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/AbstractTaskerSpec.java @@ -0,0 +1,105 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.service; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import java.util.HashMap; +import java.util.Map; + +import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplier; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplierImpl; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; +import nodomain.freeyourgadget.gadgetbridge.tasker.settings.TaskerSettings; +import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; + +public abstract class AbstractTaskerSpec implements TaskerSpec { + + private Map settings = new HashMap<>(); + + @Override + public TaskerSettings getSettings(TaskerEventType eventType) { + if (!settings.containsKey(eventType)) { + if (!getSupportedTypes().contains(eventType)) { + settings.put(eventType, new NoOpTaskerSettings()); + } else { + settings.put(eventType, new SimpleTaskerSettings()); + } + } + return settings.get(eventType); + } + + private class SimpleTaskerSettings implements TaskerSettings { + private SettingSupplier consumingEvents = new SettingSupplierImpl<>(); + private SettingSupplier enabled = new SettingSupplierImpl<>(); + private SettingSupplier threshold = new SettingSupplierImpl<>(); + private SettingSupplier taskProvider = new SettingSupplierImpl<>(); + + @Override + public SettingSupplier isConsumingEvents() { + return consumingEvents; + } + + @Override + public SettingSupplier isEnabled() { + return enabled; + } + + @Override + public SettingSupplier getThreshold() { + return threshold; + } + + @Override + public SettingSupplier getTaskProvider() { + return taskProvider; + } + } + + + private class NoOpTaskerSettings implements TaskerSettings { + @Override + public SettingSupplier isConsumingEvents() { + return new NoOpSupplier<>(); + } + + @Override + public SettingSupplier isEnabled() { + return new NoOpSupplier<>(); + } + + @Override + public SettingSupplier getThreshold() { + return new NoOpSupplier<>(); + } + + @Override + public SettingSupplier getTaskProvider() { + return new NoOpSupplier<>(); + } + } + + private class NoOpSupplier implements SettingSupplier { + + @Override + public T get() { + return null; + } + + @Override + public void set(T object) { + } + + @Override + public boolean isPresent() { + return false; + } + + @Override + public SettingSupplier onChanged(SettingListener onChanged) { + return this; + } + + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/SpecTaskerService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/SpecTaskerService.java new file mode 100644 index 000000000..fe3c7a554 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/SpecTaskerService.java @@ -0,0 +1,27 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.service; + +import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplier; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; +import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; + +/** + * {@link TaskerSpec} impl for {@link AbstractTaskerService}. + */ +public class SpecTaskerService extends AbstractTaskerService { + + private TaskerSpec spec; + + public SpecTaskerService(TaskerSpec spec) { + this.spec = spec; + } + + @Override + protected SettingSupplier threshold(TaskerEventType type) { + return spec.getSettings(type).getThreshold(); + } + + @Override + protected SettingSupplier taskProvider(TaskerEventType type) { + return spec.getSettings(type).getTaskProvider(); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerAbstractSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerAbstractSpec.java index 08771676a..40b92f342 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerAbstractSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerAbstractSpec.java @@ -6,7 +6,7 @@ import nodomain.freeyourgadget.gadgetbridge.tasker.settings.TaskerSettings; public abstract class TaskerAbstractSpec implements TaskerSpec { @Override - public TaskerSettings getTaskerSettings(TaskerEventType eventType) { + public TaskerSettings getSettings(TaskerEventType eventType) { return null; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerBleProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerBleProfile.java index ae9742a46..815963a20 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerBleProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerBleProfile.java @@ -17,33 +17,26 @@ import nodomain.freeyourgadget.gadgetbridge.tasker.settings.TaskerSettings; */ public class TaskerBleProfile extends AbstractBleProfile { - private TaskerService taskerService; - private TaskerSpec taskerSpec; + private SpecTaskerService taskerService; + private TaskerConstants.TaskerDevice taskerDevice; - public TaskerBleProfile(T support, TaskerSpec taskerSpec) { + public TaskerBleProfile(T support, TaskerConstants.TaskerDevice taskerDevice) { super(support); - this.taskerSpec = taskerSpec; - taskerService = new TaskerService(); + this.taskerDevice = taskerDevice; + taskerService = new SpecTaskerService(taskerDevice.getSpec()); } @Override public boolean onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { - TaskerEventType eventType = taskerSpec.getEventType(gatt, characteristic); + TaskerEventType eventType = taskerDevice.getSpec().getEventType(gatt, characteristic); if (TaskerEventType.NO_OP.equals(eventType)) { return false; } - TaskerSettings settings = taskerSpec.getTaskerSettings(eventType); + TaskerSettings settings = taskerDevice.getSpec().getSettings(eventType); if (settings.isEnabled().isPresent() && settings.isEnabled().get()) { - TaskerService service = taskerService; - if (settings.getThreshold().isPresent()) { - service = service.withThreshold(eventType, settings.getThreshold().get()); - } - if (settings.getTaskProvider().isPresent()) { - service = service.withProvider(eventType, settings.getTaskProvider().get()); - } boolean run = false; try { - run = service.runForType(eventType); + run = taskerService.runForType(eventType); } catch (NoTaskDefinedException e) { TaskerUtil.noTaskDefinedInformation().show(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerConstants.java index 9071fc115..afd8af24f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerConstants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerConstants.java @@ -4,6 +4,7 @@ import java.io.Serializable; import nodomain.freeyourgadget.gadgetbridge.devices.xwatch.XWatchConstants; import nodomain.freeyourgadget.gadgetbridge.devices.xwatch.XWatchService; +import nodomain.freeyourgadget.gadgetbridge.devices.xwatch.XWatchTaskerSpec; import nodomain.freeyourgadget.gadgetbridge.model.DeviceType; public class TaskerConstants { @@ -30,7 +31,7 @@ public class TaskerConstants { public enum TaskerDevice implements Serializable { - XWATCH(DeviceType.XWATCH, XWatchService.getTaskerSpec()); + XWATCH(DeviceType.XWATCH, new XWatchTaskerSpec()); private DeviceType type; private TaskerSpec spec; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerService.java index bdaea14e5..1bd85dedc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerService.java @@ -10,61 +10,33 @@ import java.util.function.Supplier; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplier; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.SettingSupplierImpl; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEvent; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTask; import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; /** - * Tasker service for scheduling task with specific thresholds. + * Default impl for {@link AbstractTaskerService}. *

* One instance per thread/device! The service is not threadsafe. */ -public class TaskerService { +public class TaskerService extends AbstractTaskerService { - private SettingSupplier enabled; - private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - private Map tasks = new HashMap<>(); private Map> threshold = new HashMap<>(); private Map> typeProvider = new HashMap<>(); - private long defaultThreshold = 50L; - - // Builder - - public TaskerService() { - this.enabled = new SettingSupplier() { - @Override - public Boolean get() { - return GBApplication.getPrefs().getBoolean(TaskerConstants.TASKER_ENABLED, false); - } - - @Override - public boolean isPresent() { - return true; - } - }; - } - - public TaskerService(SettingSupplier enabled) { - this.enabled = enabled; - } public TaskerService(boolean enabled) { - this.enabled = new StaticSettingSupplier<>(enabled); + this.enabled = new SettingSupplierImpl<>(enabled); } public TaskerService withThreshold(TaskerEventType type, long threshold) { - this.threshold.put(type, new StaticSettingSupplier<>(threshold)); - return this; - } - - public TaskerService withThreshold(TaskerEventType type, SettingSupplier threshold) { - this.threshold.put(type, threshold); + this.threshold.put(type, new SettingSupplierImpl<>(threshold)); return this; } public TaskerService withTask(TaskerEventType type, final String task) { - typeProvider.put(type, new StaticSettingSupplier(new TaskerTaskProvider() { + typeProvider.put(type, new SettingSupplierImpl(new TaskerTaskProvider() { @Override public String getTask(TaskerEvent event) { return task; @@ -74,83 +46,22 @@ public class TaskerService { } public TaskerService withProvider(TaskerEventType type, TaskerTaskProvider provider) { - typeProvider.put(type, new StaticSettingSupplier<>(provider)); + typeProvider.put(type, new SettingSupplierImpl<>(provider)); return this; } - public TaskerService withProvider(TaskerEventType type, SettingSupplier provider) { - typeProvider.put(type, provider); - return this; - } - - // Public - - public boolean isActive() { - return enabled.get(); - } - - public boolean buttonPressed(int index) { - return runForType(TaskerEventType.BUTTON.withIndex(index)); - } - - public boolean deviceConnected(int index) { - return runForType(TaskerEventType.CONNECTION.withIndex(index)); - } - - public boolean dataReceived(int index) { - return runForType(TaskerEventType.DATA.withIndex(index)); - } - - public boolean runForType(TaskerEventType type) { - if (type != null && !TaskerEventType.NO_OP.equals(type) && isActive() && ready()) { - if (!tasks.containsKey(type)) { - if (taskProvider(type) != null) { - tasks.put(type, new TaskerTask(type, taskProvider(type), threshold(type))); - } - } - tasks.get(type).schedule(executor); - return true; - } - return false; - } - // Private - private long threshold(TaskerEventType type) { - return threshold.containsKey(type) && threshold.get(type).isPresent() ? threshold.get(type).get() : defaultThreshold; + protected SettingSupplier threshold(TaskerEventType type) { + return threshold.get(type); } - private TaskerTaskProvider taskProvider(TaskerEventType type) { + protected SettingSupplier taskProvider(TaskerEventType type) { if (typeProvider.containsKey(type) && typeProvider.get(type).isPresent()) { - return typeProvider.get(type).get(); + return typeProvider.get(type); } throw new NoTaskDefinedException(); } - // Static - - public static boolean ready() { - return TaskerIntent.testStatus(GBApplication.getContext()).equals(TaskerIntent.Status.OK); - } - - private static class StaticSettingSupplier implements SettingSupplier { - - private T setting; - - public StaticSettingSupplier(T setting) { - this.setting = setting; - } - - @Override - public T get() { - return setting; - } - - @Override - public boolean isPresent() { - return true; - } - - } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerSpec.java index 20862dfd7..eee05c2da 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/service/TaskerSpec.java @@ -14,6 +14,6 @@ public interface TaskerSpec { List getSupportedTypes(); - TaskerSettings getTaskerSettings(TaskerEventType eventType); + TaskerSettings getSettings(TaskerEventType eventType); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/ButtonPreference.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/ButtonPreference.java similarity index 94% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/ButtonPreference.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/ButtonPreference.java index d5909c9f9..4b383a36a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/ButtonPreference.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/ButtonPreference.java @@ -1,4 +1,4 @@ -package nodomain.freeyourgadget.gadgetbridge.tasker.settings; +package nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities; import android.content.Context; import android.preference.EditTextPreference; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerActivity.java similarity index 90% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerActivity.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerActivity.java index 5b31eaf5e..8cc5dac3b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerActivity.java @@ -1,14 +1,12 @@ -package nodomain.freeyourgadget.gadgetbridge.tasker.settings; +package nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities; import android.content.Intent; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceCategory; -import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity; -import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.tasker.service.TaskerConstants; public class TaskerActivity extends AbstractSettingsActivity { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerEventActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java similarity index 64% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerEventActivity.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java index 52678c006..01d862a38 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerEventActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java @@ -1,18 +1,19 @@ -package nodomain.freeyourgadget.gadgetbridge.tasker.settings; +package nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities; -import android.content.res.Resources; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.Preference; -import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import android.view.View; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEvent; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; import nodomain.freeyourgadget.gadgetbridge.tasker.service.TaskerConstants; +import nodomain.freeyourgadget.gadgetbridge.tasker.settings.TaskerSettings; +import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class TaskerEventActivity extends AbstractSettingsActivity { @@ -34,19 +35,23 @@ public class TaskerEventActivity extends AbstractSettingsActivity { protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); device = (TaskerConstants.TaskerDevice) getIntent().getSerializableExtra(TaskerConstants.DEVICE_INTENT); + final TaskerSettings settings = device.getSpec().getSettings(eventType); eventType = (TaskerEventType) getIntent().getSerializableExtra(TaskerConstants.EVENT_INTENT); final PreferenceScreen tasks = (PreferenceScreen) findPreference(TaskerConstants.ACTIVITY_TASKS); - ButtonPreference addTaskButton = (ButtonPreference) findPreference(TaskerConstants.ACTIVITY_TASK_ADD); - final EditTextPreference taskNamePreference = (EditTextPreference) findPreference(TaskerConstants.ACTIVITY_TASK); - final Preference thresholdEnabled = findPreference(TaskerConstants.ACTIVITY_THESHOLD_ENABELD); - addTaskButton.setOnClickListener(new View.OnClickListener() { + initThreshold(settings, tasks); + initTasks(settings, tasks); + } + + private void initThreshold(final TaskerSettings settings, final PreferenceScreen tasks) { + EditTextPreference threshold = (EditTextPreference) findPreference(TaskerConstants.ACTIVITY_THRESHOLD); + threshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override - public void onClick(View v) { - if (prefs.getBoolean(thresholdEnabled.getKey(), false)) { - tasks.addPreference(task(tasks, taskNamePreference)); - } + public boolean onPreferenceChange(Preference preference, Object newValue) { + settings.getThreshold().set(Long.valueOf(newValue.toString())); + return true; } }); + final Preference thresholdEnabled = findPreference(TaskerConstants.ACTIVITY_THESHOLD_ENABELD); thresholdEnabled.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -55,11 +60,38 @@ public class TaskerEventActivity extends AbstractSettingsActivity { tasks.removePreference(tasks.getPreference(tasks.getPreferenceCount())); } } + settings.getThreshold().set(null); return true; } }); } + private void initTasks(final TaskerSettings settings, final PreferenceScreen tasks) { + ButtonPreference addTaskButton = (ButtonPreference) findPreference(TaskerConstants.ACTIVITY_TASK_ADD); + final EditTextPreference taskNamePreference = (EditTextPreference) findPreference(TaskerConstants.ACTIVITY_TASK); + addTaskButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (prefs.getBoolean(TaskerConstants.ACTIVITY_THESHOLD_ENABELD, false)) { + tasks.addPreference(task(tasks, taskNamePreference)); + } + } + }); + TaskerTaskProvider taskerTaskProvider = new TaskerTaskProvider() { + @Override + public String getTask(TaskerEvent event) { + for (int i = 1; i < tasks.getPreferenceCount(); i++) { + if (event.getCount() == i - 1) { + return ((EditTextPreference) tasks.getPreference(i)).getText(); + } + } + return null; + } + + }; + settings.getTaskProvider().set(taskerTaskProvider); + } + private Preference task(final PreferenceScreen tasks, Preference build) { final ButtonPreference task = new ButtonPreference(this); task.setKey(TaskerConstants.ACTIVITY_TASK + "_" + tasks.getPreferenceCount()); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerEventsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventsActivity.java similarity index 93% rename from app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerEventsActivity.java rename to app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventsActivity.java index 1aaa53a11..704dda355 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerEventsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventsActivity.java @@ -1,4 +1,4 @@ -package nodomain.freeyourgadget.gadgetbridge.tasker.settings; +package nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities; import android.content.Intent; import android.os.Bundle; @@ -7,7 +7,6 @@ import android.preference.PreferenceCategory; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.AbstractSettingsActivity; -import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEvent; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; import nodomain.freeyourgadget.gadgetbridge.tasker.service.TaskerConstants; diff --git a/app/src/main/res/xml/tasker_event_preferences.xml b/app/src/main/res/xml/tasker_event_preferences.xml index 43b838068..03290a80b 100644 --- a/app/src/main/res/xml/tasker_event_preferences.xml +++ b/app/src/main/res/xml/tasker_event_preferences.xml @@ -15,11 +15,11 @@ android:key="act_tasker_threshold" android:summary="@string/tasker_threshold_sum" android:title="@string/tasker_threshold" /> - + android:widgetLayout="@layout/tasker_add_button">