Changed Settings to Fragment based perferences and implemented the scope.

This commit is contained in:
Chris 2019-01-20 15:50:59 +01:00
parent 20e14ec883
commit a857be6c21
2 changed files with 193 additions and 101 deletions

View File

@ -1,4 +1,30 @@
package nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities;
public class NumberPreference {
import android.content.Context;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.NumberPicker;
import nodomain.freeyourgadget.gadgetbridge.R;
public class NumberPreference extends DialogPreference {
private NumberPicker numberPicker;
public NumberPreference(Context context) {
super(context, null);
numberPicker = new NumberPicker(getContext());
}
@Override
protected View onCreateDialogView() {
return numberPicker;
}
public NumberPicker getNumberPicker() {
return numberPicker;
}
}

View File

@ -3,8 +3,10 @@ package nodomain.freeyourgadget.gadgetbridge.tasker.settings.activities;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.support.annotation.Nullable;
import android.view.View;
import java.util.ArrayList;
@ -32,125 +34,189 @@ import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
*/
public class TaskerEventActivity extends AbstractSettingsActivity {
private TaskerDevice device;
private TaskerEventType eventType;
private Prefs prefs = GBApplication.getPrefs();
private List<EditTextPreference> taskPreferences = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.tasker_event_preferences);
TaskerEventFragment taskerEventFragment = new TaskerEventFragment();
Bundle arguments = new Bundle();
arguments.putSerializable(TaskerConstants.INTENT_DEVICE, getIntent().getSerializableExtra(TaskerConstants.INTENT_DEVICE));
arguments.putSerializable(TaskerConstants.INTENT_EVENT, getIntent().getSerializableExtra(TaskerConstants.INTENT_EVENT));
taskerEventFragment.setArguments(arguments);
getFragmentManager().beginTransaction().replace(android.R.id.content,
taskerEventFragment).commit();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
device = (TaskerDevice) getIntent().getSerializableExtra(TaskerConstants.INTENT_DEVICE);
eventType = (TaskerEventType) getIntent().getSerializableExtra(TaskerConstants.INTENT_EVENT);
final TaskerSettings settings = device.getSpec().getSettings(eventType);
SwitchPreference enabled = (SwitchPreference) findPreference(scoped(TaskerConstants.ACTIVITY_EVENT_ENABLED));
settings.isEnabled().set(prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_EVENT_ENABLED), false));
enabled.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
settings.isEnabled().set((Boolean) newValue);
return true;
}
});
eventType = (TaskerEventType) getIntent().getSerializableExtra(TaskerConstants.INTENT_EVENT);
final PreferenceScreen tasks = (PreferenceScreen) findPreference(scoped(TaskerConstants.ACTIVITY_TASKS));
initThreshold(settings, tasks);
initTasks(settings, tasks);
}
public static class TaskerEventFragment extends PreferenceFragment {
private String scoped(TaskerConstants.ScopedString scopedString) {
return scopedString.withScope(device.name()).withScope(eventType.getType()).toString();
}
private TaskerDevice device;
private TaskerEventType eventType;
private TaskerSettings settings;
private Prefs prefs = GBApplication.getPrefs();
private void initThreshold(final TaskerSettings settings, final PreferenceScreen tasks) {
final EditTextPreference threshold = (EditTextPreference) findPreference(scoped(TaskerConstants.ACTIVITY_THRESHOLD));
setThresholdIfDefined(settings);
threshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
settings.getThreshold().set(Long.valueOf(newValue.toString()));
return true;
}
});
final Preference thresholdEnabled = findPreference(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED));
if (prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED), false)) {
settings.getThreshold().set(null);
private SwitchPreference enableEvent;
private SwitchPreference enableThreshold;
private NumberPreference threshold;
private ButtonPreference addTask;
private List<EditTextPreference> tasks = new ArrayList<>();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
device = (TaskerDevice) getArguments().get(TaskerConstants.INTENT_DEVICE);
eventType = (TaskerEventType) getArguments().get(TaskerConstants.INTENT_EVENT);
settings = device.getSpec().getSettings(eventType);
initEnableEvent();
initAddTask();
initEnableThreshold();
initThreshold();
initTasks();
}
thresholdEnabled.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue.equals(Boolean.FALSE)) {
for (EditTextPreference taskPreference : taskPreferences) {
if (!taskPreference.getKey().equals(scoped(TaskerConstants.ACTIVITY_TASK))) {
tasks.removePreference(taskPreference);
}
}
settings.getThreshold().set(null);
private void initEnableEvent() {
String key = scoped(TaskerConstants.ACTIVITY_EVENT_ENABLED);
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;
}
setThresholdIfDefined(settings);
return true;
}
});
}
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));
});
settings.isEnabled().set(prefs.getBoolean(key, false));
getPreferenceScreen().addPreference(enableEvent);
}
}
private void initTasks(final TaskerSettings settings, final PreferenceScreen tasks) {
ButtonPreference addTaskButton = (ButtonPreference) findPreference(TaskerConstants.ACTIVITY_TASK_ADD);
final EditTextPreference taskNamePreference = (EditTextPreference) findPreference(scoped(TaskerConstants.ACTIVITY_TASK));
taskPreferences.add(taskNamePreference);
addTaskButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED), false)) {
tasks.addPreference(task(tasks, taskNamePreference));
private void initEnableThreshold() {
String key = scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED);
enableThreshold = new SwitchPreference(getActivity());
enableThreshold.setKey(key);
enableThreshold.setTitle(R.string.tasker_threshold_enable);
enableThreshold.setSummary(R.string.tasker_threshold_enable_sum);
getPreferenceScreen().addPreference(enableThreshold);
}
private void initThreshold() {
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);
}
});
TaskerTaskProvider taskerTaskProvider = new TaskerTaskProvider() {
@Override
public String getTask(TaskerEvent event) {
if (event.getCount() < taskPreferences.size()) {
String text = taskPreferences.get(event.getCount()).getText();
if (StringUtils.isEmpty(text)) {
throw new NoTaskDefinedException();
enableThreshold.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue.equals(Boolean.FALSE)) {
for (EditTextPreference taskPreference : tasks) {
if (!taskPreference.getKey().equals(scoped(TaskerConstants.ACTIVITY_TASK))) {
getPreferenceScreen().removePreference(taskPreference);
}
}
settings.getThreshold().set(null);
return true;
}
return text;
setThresholdIfDefined(settings);
return true;
}
return null;
}
});
getPreferenceScreen().addPreference(threshold);
}
};
settings.getTaskProvider().set(taskerTaskProvider);
}
private void initAddTask() {
addTask = new ButtonPreference(getActivity());
addTask.setTitle(R.string.tasker_task);
addTask.setSummary(R.string.tasker_task_sum);
getPreferenceScreen().addPreference(addTask);
}
private Preference task(final PreferenceScreen tasks, Preference build) {
final ButtonPreference task = new ButtonPreference(this);
task.setKey(scoped(TaskerConstants.ACTIVITY_TASK) + "_" + tasks.getPreferenceCount());
task.setTitle(build.getTitle());
task.setSummary(build.getSummary());
task.setButtonText(R.string.tasker_remove);
task.setWidgetLayoutResource(R.layout.button_preference_layout);
task.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tasks.removePreference(task);
private String scoped(TaskerConstants.ScopedString scopedString) {
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));
}
});
taskPreferences.add(task);
return task;
}
private void loadTasks() {
tasks = new ArrayList<>();
for (int i = 0; i < 10; i++) {
if (!prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED), false) && i > 0) {
break;
}
String key = scoped(TaskerConstants.ACTIVITY_TASK) + "_" + i;
if (prefs.getPreferences().contains(key)) {
EditTextPreference task = task(key);
tasks.add(task);
getPreferenceScreen().addPreference(task);
}
}
// Add default task
if (tasks.isEmpty()) {
EditTextPreference task = task(scoped(TaskerConstants.ACTIVITY_TASK) + "_" + 0);
tasks.add(task);
getPreferenceScreen().addPreference(task);
}
}
private void initTasks() {
loadTasks();
addTask.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (prefs.getBoolean(scoped(TaskerConstants.ACTIVITY_THRESHOLD_ENABLED), false)) {
getPreferenceScreen().addPreference(task(scoped(TaskerConstants.ACTIVITY_TASK) + "_" + (tasks.size() - 1)));
}
}
});
TaskerTaskProvider taskerTaskProvider = new TaskerTaskProvider() {
@Override
public String getTask(TaskerEvent event) {
if (event.getCount() < tasks.size()) {
String text = tasks.get(event.getCount()).getText();
if (StringUtils.isEmpty(text)) {
throw new NoTaskDefinedException();
}
return text;
}
return null;
}
};
settings.getTaskProvider().set(taskerTaskProvider);
}
private EditTextPreference task(String key) {
final ButtonPreference task = new ButtonPreference(getActivity());
task.setKey(key);
task.setSummary(R.string.tasker_task_sum);
task.setButtonText(R.string.tasker_remove);
task.setWidgetLayoutResource(R.layout.button_preference_layout);
task.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getPreferenceScreen().removePreference(task);
}
});
return task;
}
}
}