From 015898d2d0a9e185b911a444c9f09d144d1e64ee Mon Sep 17 00:00:00 2001 From: nightoftune Date: Sun, 27 Jan 2019 20:19:31 +0100 Subject: [PATCH] Added all tasker plugin classes. --- .../devices/xwatch/XWatchTaskerSpec.java | 5 + .../tasker/plugin/TaskerBleProfile.java | 2 +- .../tasker/plugin/TaskerConstants.java | 1 + .../settings/PreferenceSettingSupplier.java | 102 ++++++++++++++++ .../tasker/settings/SettingsException.java | 13 ++ .../tasker/settings/TaskerSettings.java | 2 +- .../activities/TaskerEventActivity.java | 83 ++++++------- .../tasker/spec/AbstractTaskerSpec.java | 38 ++---- .../tasker/spec/PreferenceTaskerSettings.java | 113 ++++++++++++++++++ .../tasker/task/TaskerTaskProvider.java | 10 +- 10 files changed, 289 insertions(+), 80 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/PreferenceSettingSupplier.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/SettingsException.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/PreferenceTaskerSettings.java 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 index 2bdd696e1..9d9bfc69d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchTaskerSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/xwatch/XWatchTaskerSpec.java @@ -7,10 +7,15 @@ import java.util.Arrays; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; +import nodomain.freeyourgadget.gadgetbridge.tasker.plugin.TaskerDevice; import nodomain.freeyourgadget.gadgetbridge.tasker.spec.AbstractTaskerSpec; public class XWatchTaskerSpec extends AbstractTaskerSpec { + protected XWatchTaskerSpec(TaskerDevice device) { + super(device); + } + @Override public TaskerEventType getEventType(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { if (XWatchService.UUID_NOTIFY.equals(characteristic.getUuid())) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerBleProfile.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerBleProfile.java index ed3968609..fe8ac776b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerBleProfile.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerBleProfile.java @@ -44,7 +44,7 @@ public class TaskerBleProfile extends Abstr } catch (NoTaskDefinedException e) { TaskerUtil.noTaskDefinedInformation().show(); } - if (settings.isConsumingEvents().isPresent() && settings.isConsumingEvents().get()) { + if (settings.isConsumeEvent().isPresent() && settings.isConsumeEvent().get()) { return run; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerConstants.java index fd5c89b36..f65cb78b6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerConstants.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/plugin/TaskerConstants.java @@ -31,6 +31,7 @@ public class TaskerConstants { * Correspond to {@link nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities.TaskerEventActivity}. */ public static final String ACTIVITY_TASK_ADD = "act_tasker_task_add"; + public static final ScopedString ACTIVITY_CONSUME_EVENT = new ScopedString("act_tasker_consume_event"); public static final ScopedString ACTIVITY_THRESHOLD = new ScopedString("act_tasker_threshold"); public static final ScopedString ACTIVITY_TASK = new ScopedString("act_tasker_task"); public static final ScopedString ACTIVITY_THRESHOLD_ENABLED = new ScopedString("act_tasker_threshold_enabled"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/PreferenceSettingSupplier.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/PreferenceSettingSupplier.java new file mode 100644 index 000000000..b69bb2edf --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/PreferenceSettingSupplier.java @@ -0,0 +1,102 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.settings; + +import android.content.SharedPreferences; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashSet; +import java.util.Set; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; + +public final class PreferenceSettingSupplier implements SettingSupplier { + + private String key; + private Class type; + private SharedPreferences sharedPreferences; + + public PreferenceSettingSupplier(String key, Type type) { + if (key == null || key.isEmpty()) { + throw new SettingsException("Undefined", "Key can not be empty!"); + } + if (type == null || + !Boolean.class.isAssignableFrom(type.getClass()) || + !Long.class.isAssignableFrom(type.getClass()) || + !Integer.class.isAssignableFrom(type.getClass()) || + !Float.class.isAssignableFrom(type.getClass()) || + !String.class.isAssignableFrom(type.getClass()) || + (Set.class.isAssignableFrom(type.getClass()) && + !(((ParameterizedType) type).getActualTypeArguments()[0] instanceof Class) && + !String.class.isAssignableFrom((Class) ((ParameterizedType) type).getActualTypeArguments()[0]))) { + throw new SettingsException(key, "Type is must be one of [types={Boolean,Long,Integer,Float,String, Set}]"); + } + this.key = key; + this.type = (Class) ((type instanceof Class) ? type : ((ParameterizedType) type).getRawType()); + this.sharedPreferences = GBApplication.getPrefs().getPreferences(); + } + + @Override + public T get() { + if (!isPresent()) { + return null; + } + if (Boolean.class.isAssignableFrom(type)) { + return (T) Boolean.valueOf(sharedPreferences.getBoolean(key, false)); + } + if (Long.class.isAssignableFrom(type)) { + return (T) Long.valueOf(sharedPreferences.getLong(key, 0L)); + } + if (Integer.class.isAssignableFrom(type)) { + return (T) Integer.valueOf(sharedPreferences.getInt(key, 0)); + } + if (Float.class.isAssignableFrom(type)) { + return (T) Float.valueOf(sharedPreferences.getFloat(key, 0F)); + } + if (Set.class.isAssignableFrom(type)) { + return (T) sharedPreferences.getStringSet(key, new HashSet()); + } + return (T) sharedPreferences.getString(key, ""); + } + + @Override + public void set(T object) { + if (object == null) { + sharedPreferences.edit().remove(key).commit(); + } + if (Boolean.class.isAssignableFrom(type)) { + sharedPreferences.edit().putBoolean(key, (Boolean) object).commit(); + } + if (Long.class.isAssignableFrom(type)) { + sharedPreferences.edit().putLong(key, (Long) object).commit(); + } + if (Integer.class.isAssignableFrom(type)) { + sharedPreferences.edit().putInt(key, (Integer) object).commit(); + } + if (Float.class.isAssignableFrom(type)) { + sharedPreferences.edit().putFloat(key, (Float) object).commit(); + } + if (Set.class.isAssignableFrom(type)) { + sharedPreferences.edit().putStringSet(key, (Set) object).commit(); + } + if (String.class.isAssignableFrom(type)) { + sharedPreferences.edit().putString(key, (String) object).commit(); + } + } + + @Override + public boolean isPresent() { + return sharedPreferences.contains(key); + } + + @Override + public SettingSupplier onChanged(final SettingListener onChanged) { + sharedPreferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + onChanged.changed(get()); + } + }); + return this; + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/SettingsException.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/SettingsException.java new file mode 100644 index 000000000..1e728d2ba --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/SettingsException.java @@ -0,0 +1,13 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.settings; + +public class SettingsException extends RuntimeException { + + public SettingsException(String setting, String message) { + super("Exception in setting [name=" + setting + "]: " + message); + } + + public SettingsException(String setting, String message, Throwable cause) { + super("Exception in setting [name=" + setting + "]: " + message, cause); + } + +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerSettings.java index 0eb16cf1f..7641ce100 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerSettings.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/TaskerSettings.java @@ -18,7 +18,7 @@ public interface TaskerSettings { * * @return True if consumes events. */ - SettingSupplier isConsumingEvents(); + SettingSupplier isConsumeEvent(); /** * Enables the settings. diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java index b153091f8..9d2b45beb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/settings/activities/TaskerEventActivity.java @@ -70,7 +70,6 @@ public class TaskerEventActivity extends AbstractSettingsActivity { private TaskerDevice device; private TaskerEventType eventType; - private TaskerSettings settings; private Prefs prefs = GBApplication.getPrefs(); private SwitchPreference enableEvent; @@ -85,7 +84,6 @@ public class TaskerEventActivity extends AbstractSettingsActivity { setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity())); device = (TaskerDevice) getArguments().get(TaskerConstants.INTENT_DEVICE); eventType = (TaskerEventType) getArguments().get(TaskerConstants.INTENT_EVENT); - settings = device.getSpec().getSettings(eventType); initEnableEvent(); initAddTask(); initEnableThreshold(); @@ -103,14 +101,14 @@ public class TaskerEventActivity extends AbstractSettingsActivity { enableEvent = new SwitchPreference(getActivity()); enableEvent.setKey(key); enableEvent.setTitle(R.string.tasker_event_enabled); - enableEvent.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - settings.isEnabled().set((Boolean) newValue); - return true; - } - }); - settings.isEnabled().set(prefs.getBoolean(key, false)); +// enableEvent.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { +// @Override +// public boolean onPreferenceChange(Preference preference, Object newValue) { +// settings.isEnabled().set((Boolean) newValue); +// return true; +// } +// }); +// settings.isEnabled().set(prefs.getBoolean(key, false)); getPreferenceScreen().addPreference(enableEvent); } @@ -124,24 +122,24 @@ public class TaskerEventActivity extends AbstractSettingsActivity { } private void initThreshold() { - String key = scoped(TaskerConstants.ACTIVITY_THRESHOLD); + final String key = scoped(TaskerConstants.ACTIVITY_THRESHOLD); threshold = new NumberPreference(getActivity()); threshold.setKey(key); threshold.setTitle(R.string.tasker_threshold); threshold.setSummary(R.string.tasker_threshold_sum); threshold.getNumberPicker().setMinValue(50); threshold.getNumberPicker().setMaxValue(10000); - setThresholdIfDefined(settings); - threshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - settings.getThreshold().set(Long.valueOf(newValue.toString())); - return true; - } - }); - if (prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED), false)) { - settings.getThreshold().set(null); - } +// setThresholdIfDefined(settings); +// threshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { +// @Override +// public boolean onPreferenceChange(Preference preference, Object newValue) { +// settings.getThreshold().set(Long.valueOf(newValue.toString())); +// return true; +// } +// }); +// if (prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED), false)) { +// settings.getThreshold().set(null); +// } enableThreshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -151,10 +149,8 @@ public class TaskerEventActivity extends AbstractSettingsActivity { getPreferenceScreen().removePreference(taskPreference); } } - settings.getThreshold().set(null); - return true; + prefs.getPreferences().edit().remove(key).commit(); } - setThresholdIfDefined(settings); return true; } }); @@ -173,13 +169,6 @@ public class TaskerEventActivity extends AbstractSettingsActivity { return scopedString.withScope(device.name()).withScope(eventType.getType()).toString(); } - private void setThresholdIfDefined(TaskerSettings settings) { - long thresholdValue = prefs.getLong(scoped(TaskerConstants.ACTIVITY_THRESHOLD), 0L); - if (thresholdValue != 0L) { - settings.getThreshold().set(prefs.getLong(scoped(TaskerConstants.ACTIVITY_THRESHOLD), 50L)); - } - } - private void loadTasks() { tasks = new ArrayList<>(); for (int i = 0; i < 10; i++) { @@ -211,21 +200,21 @@ public class TaskerEventActivity extends AbstractSettingsActivity { } } }); - TaskerTaskProvider taskerTaskProvider = new TaskerTaskProvider() { - @Override - public String getTask(TaskerEvent event) { - if (event.getCount() < tasks.size()) { - String text = tasks.get(event.getCount()).getText(); - if (text == null || StringUtils.isEmpty(text)) { - throw new NoTaskDefinedException(); - } - return text; - } - return null; - } - - }; - settings.getTaskProvider().set(taskerTaskProvider); +// TaskerTaskProvider taskerTaskProvider = new TaskerTaskProvider() { +// @Override +// public String getTask(TaskerEvent event) { +// if (event.getCount() < tasks.size()) { +// String text = tasks.get(event.getCount()).getText(); +// if (text == null || StringUtils.isEmpty(text)) { +// throw new NoTaskDefinedException(); +// } +// return text; +// } +// return null; +// } +// +// }; +// settings.getTaskProvider().set(taskerTaskProvider); } private EditTextPreference task(String key) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/AbstractTaskerSpec.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/AbstractTaskerSpec.java index e7adf16a9..c5e55cab1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/AbstractTaskerSpec.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/AbstractTaskerSpec.java @@ -3,6 +3,7 @@ package nodomain.freeyourgadget.gadgetbridge.tasker.spec; import java.util.HashMap; import java.util.Map; +import nodomain.freeyourgadget.gadgetbridge.tasker.plugin.TaskerDevice; import nodomain.freeyourgadget.gadgetbridge.tasker.settings.SettingSupplier; import nodomain.freeyourgadget.gadgetbridge.tasker.settings.SettingSupplierImpl; import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; @@ -19,6 +20,11 @@ import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; public abstract class AbstractTaskerSpec implements TaskerSpec { private Map settings = new HashMap<>(); + private TaskerDevice device; + + protected AbstractTaskerSpec(TaskerDevice device) { + this.device = device; + } @Override public TaskerSettings getSettings(TaskerEventType eventType) { @@ -26,43 +32,15 @@ public abstract class AbstractTaskerSpec implements TaskerSpec { if (!getSupportedTypes().contains(eventType)) { settings.put(eventType, new NoOpTaskerSettings()); } else { - settings.put(eventType, new SimpleTaskerSettings()); + settings.put(eventType, new PreferenceTaskerSettings(device, eventType)); } } 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() { + public SettingSupplier isConsumeEvent() { return new NoOpSupplier<>(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/PreferenceTaskerSettings.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/PreferenceTaskerSettings.java new file mode 100644 index 000000000..8a624583b --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/spec/PreferenceTaskerSettings.java @@ -0,0 +1,113 @@ +package nodomain.freeyourgadget.gadgetbridge.tasker.spec; + +import android.content.SharedPreferences; + +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEvent; +import nodomain.freeyourgadget.gadgetbridge.tasker.event.TaskerEventType; +import nodomain.freeyourgadget.gadgetbridge.tasker.plugin.TaskerConstants; +import nodomain.freeyourgadget.gadgetbridge.tasker.plugin.TaskerDevice; +import nodomain.freeyourgadget.gadgetbridge.tasker.settings.PreferenceSettingSupplier; +import nodomain.freeyourgadget.gadgetbridge.tasker.settings.SettingSupplier; +import nodomain.freeyourgadget.gadgetbridge.tasker.settings.TaskerSettings; +import nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities.TaskerEventActivity; +import nodomain.freeyourgadget.gadgetbridge.tasker.task.TaskerTaskProvider; + +/** + * {@link SharedPreferences} implementation of {@link TaskerSettings}. + * Scoped with {@link TaskerDevice} and {@link TaskerEventType}. + *

+ * If used the user settings are already implemented with {@link TaskerEventActivity}. + */ +public class PreferenceTaskerSettings implements TaskerSettings { + + private TaskerDevice device; + private TaskerEventType eventType; + private SettingSupplier consumingEvents; + private SettingSupplier enabled; + private SettingSupplier threshold; + private SettingSupplier taskProvider; + private SharedPreferences preferences; + + public PreferenceTaskerSettings(TaskerDevice device, TaskerEventType eventType) { + this.device = device; + this.eventType = eventType; + this.preferences = GBApplication.getPrefs().getPreferences(); + consumingEvents = new PreferenceSettingSupplier<>(scope(TaskerConstants.ACTIVITY_CONSUME_EVENT).toString(), Boolean.class); + enabled = new PreferenceSettingSupplier<>(scope(TaskerConstants.ACTIVITY_EVENT_ENABLED).toString(), Boolean.class); + threshold = new PreferenceSettingSupplier<>(scope(TaskerConstants.ACTIVITY_THRESHOLD).toString(), Long.class); + taskProvider = new TaskerTaskProviderPreferenceSettingSupplier(); + } + + @Override + public SettingSupplier isConsumeEvent() { + return consumingEvents; + } + + @Override + public SettingSupplier isEnabled() { + return enabled; + } + + @Override + public SettingSupplier getThreshold() { + return threshold; + } + + @Override + public SettingSupplier getTaskProvider() { + return taskProvider; + } + + private class TaskerTaskProviderPreferenceSettingSupplier implements SettingSupplier { + + private TaskerTaskProvider provider = new TaskerTaskProvider() { + + @Override + public String getTask(TaskerEvent event) { + String key = scope(TaskerConstants.ACTIVITY_TASK).withScope(String.valueOf(event.getCount())).toString(); + if (event.getType().equals(eventType) && preferences.contains(key)) { + return preferences.getString(key, ""); + } + return null; + } + + @Override + public void addTask(TaskerEvent event, String task) { + preferences.edit().putString(scope(TaskerConstants.ACTIVITY_TASK).withScope(String.valueOf(event.getCount())).toString(), task).commit(); + } + }; + + @Override + public TaskerTaskProvider get() { + return provider; + } + + @Override + public void set(TaskerTaskProvider object) { + // Not supported + } + + @Override + public boolean isPresent() { + return true; + } + + @Override + public SettingSupplier onChanged(final SettingListener onChanged) { + preferences.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (key.startsWith(scope(TaskerConstants.ACTIVITY_TASK).toString())) { + onChanged.changed(get()); + } + } + }); + return this; + } + } + + private TaskerConstants.ScopedString scope(TaskerConstants.ScopedString constant) { + return constant.withScope(device.name()).withScope(eventType.getType()); + } +} diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/task/TaskerTaskProvider.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/task/TaskerTaskProvider.java index 525fb0b33..5c503723e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/task/TaskerTaskProvider.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/tasker/task/TaskerTaskProvider.java @@ -10,9 +10,17 @@ public interface TaskerTaskProvider { /** * Task name for specific {@link TaskerEvent} * - * @param event + * @param event {@link TaskerEvent} * @return Task name */ String getTask(TaskerEvent event); + /** + * Add a task to the task provider and specific {@link TaskerEvent}. + * + * @param event {@link TaskerEvent} + * @param task Task name + */ + void addTask(TaskerEvent event, String task); + }