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