pull/437/head
Alex Baker 8 years ago
parent 173e0ac8ad
commit d46ef1b901

@ -187,27 +187,25 @@ abstract public class TranslationTests extends AndroidTestCase {
} }
forEachLocale(new Runnable() { forEachLocale(() -> {
public void run() { Locale locale = r.getConfiguration().locale;
Locale locale = r.getConfiguration().locale; for(int i = 0; i < strings.length; i++) {
for(int i = 0; i < strings.length; i++) { try {
try { switch(strings[i]) {
switch(strings[i]) { case R.string.abc_shareactionprovider_share_with_application:
case R.string.abc_shareactionprovider_share_with_application: continue;
continue; }
} String string = r.getString(strings[i]);
String string = r.getString(strings[i]); FormatStringData newFS = new FormatStringData(string);
FormatStringData newFS = new FormatStringData(string); if(!newFS.matches(formatStrings[i])) {
if(!newFS.matches(formatStrings[i])) {
String name = r.getResourceName(strings[i]);
failures.append(String.format("%s (%s): %s != %s\n",
name, locale.toString(), newFS, formatStrings[i]));
}
} catch (Exception e) {
String name = r.getResourceName(strings[i]); String name = r.getResourceName(strings[i]);
failures.append(String.format("%s: error opening %s: %s\n", failures.append(String.format("%s (%s): %s != %s\n",
locale.toString(), name, e.getMessage())); name, locale.toString(), newFS, formatStrings[i]));
} }
} catch (Exception e) {
String name = r.getResourceName(strings[i]);
failures.append(String.format("%s: error opening %s: %s\n",
locale.toString(), name, e.getMessage()));
} }
} }
}); });
@ -225,24 +223,22 @@ abstract public class TranslationTests extends AndroidTestCase {
final int[] dateStrings = getDateFormatStrings(); final int[] dateStrings = getDateFormatStrings();
final DateTime date = newDateTime(); final DateTime date = newDateTime();
forEachLocale(new Runnable() { forEachLocale(() -> {
public void run() { Locale locale = r.getConfiguration().locale;
Locale locale = r.getConfiguration().locale; for (int dateString : dateStrings) {
for (int dateString : dateStrings) { try {
String string = r.getString(dateString);
try { try {
String string = r.getString(dateString); date.toString(string);
try {
date.toString(string);
} catch (Exception e) {
String name = r.getResourceName(dateString);
failures.append(String.format("%s: invalid format string '%s': %s\n",
locale.toString(), name, e.getMessage()));
}
} catch (Exception e) { } catch (Exception e) {
String name = r.getResourceName(dateString); String name = r.getResourceName(dateString);
failures.append(String.format("%s: error opening %s: %s\n", failures.append(String.format("%s: invalid format string '%s': %s\n",
locale.toString(), name, e.getMessage())); locale.toString(), name, e.getMessage()));
} }
} catch (Exception e) {
String name = r.getResourceName(dateString);
failures.append(String.format("%s: error opening %s: %s\n",
locale.toString(), name, e.getMessage()));
} }
} }
}); });
@ -271,28 +267,26 @@ abstract public class TranslationTests extends AndroidTestCase {
} }
} }
forEachLocale(new Runnable() { forEachLocale(() -> {
public void run() { for(int i = 0; i < arrays.length; i++) {
for(int i = 0; i < arrays.length; i++) { if(sizes[i] == -1)
if(sizes[i] == -1) continue;
continue; int size;
int size; try {
try { size = r.getStringArray(arrays[i]).length;
size = r.getStringArray(arrays[i]).length; } catch (Resources.NotFoundException e) {
} catch (Resources.NotFoundException e) { String name = r.getResourceName(arrays[i]);
String name = r.getResourceName(arrays[i]); Locale locale = r.getConfiguration().locale;
Locale locale = r.getConfiguration().locale; failures.append(String.format("%s: error opening %s: %s\n",
failures.append(String.format("%s: error opening %s: %s\n", locale, name, e.getMessage()));
locale, name, e.getMessage())); continue;
continue; }
}
if(size != sizes[i]) { if(size != sizes[i]) {
String name = r.getResourceName(arrays[i]); String name = r.getResourceName(arrays[i]);
Locale locale = r.getConfiguration().locale; Locale locale = r.getConfiguration().locale;
failures.append(String.format("%s (%s): size %d != %d\n", failures.append(String.format("%s (%s): size %d != %d\n",
name, locale.toString(), size, sizes[i])); name, locale.toString(), size, sizes[i]));
}
} }
} }
}); });

@ -59,34 +59,30 @@ public class DateUtilitiesTest extends AndroidTestCase {
} }
public void testTimeString() { public void testTimeString() {
forEachLocale(new Runnable() { forEachLocale(() -> {
public void run() { DateTime d = newDateTime();
DateTime d = newDateTime();
DateUtilities.is24HourOverride = false;
DateUtilities.is24HourOverride = false; for (int i = 0; i < 24; i++) {
for (int i = 0; i < 24; i++) { d = d.withHourOfDay(i);
d = d.withHourOfDay(i); getTimeString(getContext(), d);
getTimeString(getContext(), d); }
}
DateUtilities.is24HourOverride = true;
DateUtilities.is24HourOverride = true; for (int i = 0; i < 24; i++) {
for (int i = 0; i < 24; i++) { d = d.withHourOfDay(i);
d = d.withHourOfDay(i); getTimeString(getContext(), d);
getTimeString(getContext(), d);
}
} }
}); });
} }
public void testDateString() { public void testDateString() {
forEachLocale(new Runnable() { forEachLocale(() -> {
public void run() { DateTime d = newDateTime();
DateTime d = newDateTime();
for (int i = 0; i < 12; i++) {
for (int i = 0; i < 12; i++) { d = d.withMonthOfYear(i);
d = d.withMonthOfYear(i); getDateString(d);
getDateString(d);
}
} }
}); });
} }

@ -53,12 +53,10 @@ public class AstridTranslationTest extends TranslationTests {
final Resources r = getContext().getResources(); final Resources r = getContext().getResources();
final StringBuilder failures = new StringBuilder(); final StringBuilder failures = new StringBuilder();
forEachLocale(new Runnable() { forEachLocale(() -> {
public void run() { contains(r, R.string.CFC_tag_text, failures, "?");
contains(r, R.string.CFC_tag_text, failures, "?"); contains(r, R.string.CFC_title_contains_text, failures, "?");
contains(r, R.string.CFC_title_contains_text, failures, "?"); contains(r, R.string.CFC_dueBefore_text, failures, "?");
contains(r, R.string.CFC_dueBefore_text, failures, "?");
}
}); });
assertEquals(failures.toString(), 0, assertEquals(failures.toString(), 0,

@ -22,17 +22,12 @@ public class GtaskListMaker {
return make(instantiator, properties); return make(instantiator, properties);
} }
private static final Instantiator<GtasksList> instantiator = new Instantiator<GtasksList>() { private static final Instantiator<GtasksList> instantiator = lookup -> new GtasksList(new StoreObject() {{
@Override setType(GtasksList.TYPE);
public GtasksList instantiate(final PropertyLookup<GtasksList> lookup) { setValue(StoreObject.ID, lookup.valueOf(GtaskListMaker.ID, 1L));
return new GtasksList(new StoreObject() {{ setValue(StoreObject.ITEM, lookup.valueOf(REMOTE_ID, "1"));
setType(GtasksList.TYPE); setValue(StoreObject.VALUE1, lookup.valueOf(NAME, "Default"));
setValue(StoreObject.ID, lookup.valueOf(GtaskListMaker.ID, 1L)); setValue(StoreObject.VALUE2, String.valueOf(lookup.valueOf(ORDER, 0)));
setValue(StoreObject.ITEM, lookup.valueOf(REMOTE_ID, "1")); setValue(StoreObject.VALUE3, String.valueOf(lookup.valueOf(LAST_SYNC, 0L)));
setValue(StoreObject.VALUE1, lookup.valueOf(NAME, "Default")); }});
setValue(StoreObject.VALUE2, String.valueOf(lookup.valueOf(ORDER, 0)));
setValue(StoreObject.VALUE3, String.valueOf(lookup.valueOf(LAST_SYNC, 0L)));
}});
}
};
} }

@ -24,37 +24,34 @@ public class TaskMaker {
return make(instantiator, properties); return make(instantiator, properties);
} }
private static final Instantiator<Task> instantiator = new Instantiator<Task>() { private static final Instantiator<Task> instantiator = lookup -> {
@Override Task task = new Task();
public Task instantiate(PropertyLookup<Task> lookup) {
Task task = new Task(); DateTime dueDate = lookup.valueOf(DUE_DATE, (DateTime) null);
if (dueDate != null) {
DateTime dueDate = lookup.valueOf(DUE_DATE, (DateTime) null); task.setDueDate(Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, dueDate.getMillis()));
if (dueDate != null) { }
task.setDueDate(Task.createDueDate(Task.URGENCY_SPECIFIC_DAY, dueDate.getMillis()));
} DateTime dueTime = lookup.valueOf(DUE_TIME, (DateTime) null);
if (dueTime != null) {
DateTime dueTime = lookup.valueOf(DUE_TIME, (DateTime) null); task.setDueDate(Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, dueTime.getMillis()));
if (dueTime != null) { }
task.setDueDate(Task.createDueDate(Task.URGENCY_SPECIFIC_DAY_TIME, dueTime.getMillis()));
} int hideType = lookup.valueOf(HIDE_TYPE, -1);
if (hideType >= 0) {
int hideType = lookup.valueOf(HIDE_TYPE, -1); task.setHideUntil(task.createHideUntil(hideType, 0));
if (hideType >= 0) {
task.setHideUntil(task.createHideUntil(hideType, 0));
}
int reminderFlags = lookup.valueOf(REMINDERS, -1);
if (reminderFlags >= 0) {
task.setReminderFlags(reminderFlags);
}
DateTime reminderLast = lookup.valueOf(REMINDER_LAST, (DateTime) null);
if (reminderLast != null) {
task.setReminderLast(reminderLast.getMillis());
}
return task;
} }
int reminderFlags = lookup.valueOf(REMINDERS, -1);
if (reminderFlags >= 0) {
task.setReminderFlags(reminderFlags);
}
DateTime reminderLast = lookup.valueOf(REMINDER_LAST, (DateTime) null);
if (reminderLast != null) {
task.setReminderLast(reminderLast.getMillis());
}
return task;
}; };
} }

@ -19,13 +19,8 @@ public class RemoteGtaskListMaker {
return make(instantiator, properties); return make(instantiator, properties);
} }
private static final Instantiator<TaskList> instantiator = new Instantiator<TaskList>() { private static final Instantiator<TaskList> instantiator = lookup -> new TaskList()
@Override .setId(lookup.valueOf(REMOTE_ID, "1"))
public TaskList instantiate(final PropertyLookup<TaskList> lookup) { .setTitle(lookup.valueOf(NAME, "Default"))
return new TaskList() .setUpdated(new DateTime(currentTimeMillis()));
.setId(lookup.valueOf(REMOTE_ID, "1"))
.setTitle(lookup.valueOf(NAME, "Default"))
.setUpdated(new DateTime(currentTimeMillis()));
}
};
} }

@ -654,28 +654,22 @@ public class IabHelper {
checkNotDisposed(); checkNotDisposed();
checkSetupDone("queryInventory"); checkSetupDone("queryInventory");
flagStartAsync("refresh inventory"); flagStartAsync("refresh inventory");
executor.execute(new Runnable() { executor.execute(() -> {
public void run() { IabResult result = new IabResult(BILLING_RESPONSE_RESULT_OK, "Inventory refresh successful.");
IabResult result = new IabResult(BILLING_RESPONSE_RESULT_OK, "Inventory refresh successful."); Inventory inv = null;
Inventory inv = null; try {
try { inv = queryInventory(querySkuDetails, moreSkus);
inv = queryInventory(querySkuDetails, moreSkus); }
} catch (IabException ex) {
catch (IabException ex) { result = ex.getResult();
result = ex.getResult(); }
}
flagEndAsync(); flagEndAsync();
final IabResult result_f = result; final IabResult result_f = result;
final Inventory inv_f = inv; final Inventory inv_f = inv;
if (!mDisposed && listener != null) { if (!mDisposed && listener != null) {
handler.post(new Runnable() { handler.post(() -> listener.onQueryInventoryFinished(result_f, inv_f));
public void run() {
listener.onQueryInventoryFinished(result_f, inv_f);
}
});
}
} }
}); });
} }
@ -1011,35 +1005,25 @@ public class IabHelper {
final OnConsumeMultiFinishedListener multiListener) { final OnConsumeMultiFinishedListener multiListener) {
final Handler handler = new Handler(); final Handler handler = new Handler();
flagStartAsync("consume"); flagStartAsync("consume");
executor.execute(new Runnable() { executor.execute(() -> {
public void run() { final List<IabResult> results = new ArrayList<IabResult>();
final List<IabResult> results = new ArrayList<IabResult>(); for (Purchase purchase : purchases) {
for (Purchase purchase : purchases) { try {
try { consume(purchase);
consume(purchase); results.add(new IabResult(BILLING_RESPONSE_RESULT_OK, "Successful consume of sku " + purchase.getSku()));
results.add(new IabResult(BILLING_RESPONSE_RESULT_OK, "Successful consume of sku " + purchase.getSku()));
}
catch (IabException ex) {
results.add(ex.getResult());
}
}
flagEndAsync();
if (!mDisposed && singleListener != null) {
handler.post(new Runnable() {
public void run() {
singleListener.onConsumeFinished(purchases.get(0), results.get(0));
}
});
} }
if (!mDisposed && multiListener != null) { catch (IabException ex) {
handler.post(new Runnable() { results.add(ex.getResult());
public void run() {
multiListener.onConsumeMultiFinished(purchases, results);
}
});
} }
} }
flagEndAsync();
if (!mDisposed && singleListener != null) {
handler.post(() -> singleListener.onConsumeFinished(purchases.get(0), results.get(0)));
}
if (!mDisposed && multiListener != null) {
handler.post(() -> multiListener.onConsumeMultiFinished(purchases, results));
}
}); });
} }

@ -46,12 +46,7 @@ public class GtasksFilterExposer {
for (GtasksList list : gtasksListService.getLists()) { for (GtasksList list : gtasksListService.getLists()) {
listFilters.add(filterFromList(list)); listFilters.add(filterFromList(list));
} }
Collections.sort(listFilters, new Comparator<Filter>() { Collections.sort(listFilters, (filter, t1) -> filter.listingTitle.compareTo(t1.listingTitle));
@Override
public int compare(Filter filter, Filter t1) {
return filter.listingTitle.compareTo(t1.listingTitle);
}
});
return listFilters; return listFilters;
} }

@ -55,22 +55,19 @@ public class GtasksPreferences extends InjectingPreferenceActivity implements Go
final CheckBoxPreference gtaskPreference = (CheckBoxPreference) findPreference(getString(R.string.sync_gtasks)); final CheckBoxPreference gtaskPreference = (CheckBoxPreference) findPreference(getString(R.string.sync_gtasks));
gtaskPreference.setChecked(syncAdapterHelper.isEnabled()); gtaskPreference.setChecked(syncAdapterHelper.isEnabled());
gtaskPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { gtaskPreference.setOnPreferenceChangeListener((preference, newValue) -> {
@Override if ((boolean) newValue) {
public boolean onPreferenceChange(Preference preference, Object newValue) { if (!playServicesAvailability.refreshAndCheck()) {
if ((boolean) newValue) { playServicesAvailability.resolve(GtasksPreferences.this);
if (!playServicesAvailability.refreshAndCheck()) { } else if (permissionRequestor.requestAccountPermissions()) {
playServicesAvailability.resolve(GtasksPreferences.this); requestLogin();
} else if (permissionRequestor.requestAccountPermissions()) {
requestLogin();
}
return false;
} else {
syncAdapterHelper.enableSynchronization(false);
tracker.reportEvent(Tracking.Events.GTASK_DISABLED);
gtasksPreferenceService.stopOngoing();
return true;
} }
return false;
} else {
syncAdapterHelper.enableSynchronization(false);
tracker.reportEvent(Tracking.Events.GTASK_DISABLED);
gtasksPreferenceService.stopOngoing();
return true;
} }
}); });
if (gtasksPreferenceService.getLastSyncDate() > 0) { if (gtasksPreferenceService.getLastSyncDate() > 0) {
@ -78,40 +75,28 @@ public class GtasksPreferences extends InjectingPreferenceActivity implements Go
DateUtilities.getDateStringWithTime(GtasksPreferences.this, DateUtilities.getDateStringWithTime(GtasksPreferences.this,
gtasksPreferenceService.getLastSyncDate()))); gtasksPreferenceService.getLastSyncDate())));
} }
findPreference(getString(R.string.gtasks_GPr_interval_key)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(R.string.gtasks_GPr_interval_key)).setOnPreferenceChangeListener((preference, o) -> {
@Override syncAdapterHelper.setSynchronizationInterval(Integer.parseInt((String) o));
public boolean onPreferenceChange(Preference preference, Object o) { return true;
syncAdapterHelper.setSynchronizationInterval(Integer.parseInt((String) o));
return true;
}
}); });
findPreference(getString(R.string.sync_SPr_forget_key)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.sync_SPr_forget_key)).setOnPreferenceClickListener(preference -> {
@Override dialogBuilder.newMessageDialog(R.string.sync_forget_confirm)
public boolean onPreferenceClick(Preference preference) { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
dialogBuilder.newMessageDialog(R.string.sync_forget_confirm) gtasksPreferenceService.clearLastSyncDate();
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { gtasksPreferenceService.setUserName(null);
@Override metadataDao.deleteWhere(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY));
public void onClick(DialogInterface dialog, int which) { syncAdapterHelper.enableSynchronization(false);
gtasksPreferenceService.clearLastSyncDate(); tracker.reportEvent(Tracking.Events.GTASK_LOGOUT);
gtasksPreferenceService.setUserName(null); gtaskPreference.setChecked(false);
metadataDao.deleteWhere(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY)); })
syncAdapterHelper.enableSynchronization(false); .setNegativeButton(android.R.string.cancel, null)
tracker.reportEvent(Tracking.Events.GTASK_LOGOUT); .show();
gtaskPreference.setChecked(false); return true;
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
return true;
}
}); });
getPref(R.string.p_gtasks_default_list).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { getPref(R.string.p_gtasks_default_list).setOnPreferenceClickListener(preference -> {
@Override new NativeGoogleTaskListPicker()
public boolean onPreferenceClick(Preference preference) { .show(getFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION);
new NativeGoogleTaskListPicker() return false;
.show(getFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION);
return false;
}
}); });
updateDefaultGoogleTaskList(); updateDefaultGoogleTaskList();
} }

@ -110,19 +110,16 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<GtasksList
GtasksMetadata.LIST_ID.eq(listId), GtasksMetadata.LIST_ID.eq(listId),
GtasksMetadata.PARENT_TASK.eq(parent))) GtasksMetadata.PARENT_TASK.eq(parent)))
.orderBy(Order.asc(Functions.cast(GtasksMetadata.GTASKS_ORDER, "INTEGER"))); .orderBy(Order.asc(Functions.cast(GtasksMetadata.GTASKS_ORDER, "INTEGER")));
metadataDao.query(query, new Callback<Metadata>() { metadataDao.query(query, curr -> {
@Override if (!alreadyChecked.contains(curr.getTask())) {
public void apply(Metadata curr) { curr.setValue(GtasksMetadata.INDENT, indentLevel);
if (!alreadyChecked.contains(curr.getTask())) { curr.setValue(GtasksMetadata.ORDER, order.getAndIncrement());
curr.setValue(GtasksMetadata.INDENT, indentLevel); metadataDao.saveExisting(curr);
curr.setValue(GtasksMetadata.ORDER, order.getAndIncrement()); alreadyChecked.add(curr.getTask());
metadataDao.saveExisting(curr);
alreadyChecked.add(curr.getTask()); orderAndIndentHelper(listId, order, curr.getTask(), indentLevel + 1, alreadyChecked);
}
orderAndIndentHelper(listId, order, curr.getTask(), indentLevel + 1, alreadyChecked); }
}
}
}
); );
} }
@ -130,42 +127,39 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<GtasksList
final AtomicLong previousTask = new AtomicLong(Task.NO_ID); final AtomicLong previousTask = new AtomicLong(Task.NO_ID);
final AtomicInteger previousIndent = new AtomicInteger(-1); final AtomicInteger previousIndent = new AtomicInteger(-1);
iterateThroughList(list, new OrderedListIterator() { iterateThroughList(list, (taskId, metadata) -> {
@Override int indent = metadata.getValue(GtasksMetadata.INDENT);
public void processTask(long taskId, Metadata metadata) {
int indent = metadata.getValue(GtasksMetadata.INDENT); try {
long parent, sibling;
try { if(indent > previousIndent.get()) {
long parent, sibling; parent = previousTask.get();
if(indent > previousIndent.get()) { sibling = Task.NO_ID;
parent = previousTask.get(); } else if(indent == previousIndent.get()) {
sibling = Task.NO_ID; sibling = previousTask.get();
} else if(indent == previousIndent.get()) { parent = parents.get(sibling);
sibling = previousTask.get(); } else {
// move up once for each indent
sibling = previousTask.get();
for(int i = indent; i < previousIndent.get(); i++) {
sibling = parents.get(sibling);
}
if(parents.containsKey(sibling)) {
parent = parents.get(sibling); parent = parents.get(sibling);
} else { } else {
// move up once for each indent parent = Task.NO_ID;
sibling = previousTask.get();
for(int i = indent; i < previousIndent.get(); i++) {
sibling = parents.get(sibling);
}
if(parents.containsKey(sibling)) {
parent = parents.get(sibling);
} else {
parent = Task.NO_ID;
}
} }
parents.put(taskId, parent);
siblings.put(taskId, sibling);
} catch (Exception e) {
Timber.e(e, e.getMessage());
} }
parents.put(taskId, parent);
siblings.put(taskId, sibling);
} catch (Exception e) {
Timber.e(e, e.getMessage());
}
previousTask.set(taskId); previousTask.set(taskId);
previousIndent.set(indent); previousIndent.set(indent);
if(!TextUtils.isEmpty(metadata.getValue(GtasksMetadata.ID))) { if(!TextUtils.isEmpty(metadata.getValue(GtasksMetadata.ID))) {
localToRemoteIdMap.put(taskId, metadata.getValue(GtasksMetadata.ID)); localToRemoteIdMap.put(taskId, metadata.getValue(GtasksMetadata.ID));
}
} }
}); });
} }

@ -199,12 +199,7 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
taskAdapter = new DraggableTaskAdapter(context, preferences, fragment, cursor, taskAdapter = new DraggableTaskAdapter(context, preferences, fragment, cursor,
sqlQueryTemplate, dialogBuilder, checkBoxes, tagService, themeCache); sqlQueryTemplate, dialogBuilder, checkBoxes, tagService, themeCache);
taskAdapter.addOnCompletedTaskListener(new OnCompletedTaskListener() { taskAdapter.addOnCompletedTaskListener(this::setCompletedForItemAndSubtasks);
@Override
public void onCompletedTask(Task item, boolean newState) {
setCompletedForItemAndSubtasks(item, newState);
}
});
return taskAdapter; return taskAdapter;
} }
@ -253,23 +248,20 @@ public class OrderedMetadataListFragmentHelper<LIST> implements OrderedListFragm
final ArrayList<Long> chained = new ArrayList<>(); final ArrayList<Long> chained = new ArrayList<>();
final int parentIndent = item.getValue(updater.indentProperty()); final int parentIndent = item.getValue(updater.indentProperty());
updater.applyToChildren(list, itemId, new OrderedMetadataListUpdater.OrderedListNodeVisitor() { updater.applyToChildren(list, itemId, node -> {
@Override Task childTask = taskService.fetchById(node.taskId, Task.RECURRENCE);
public void visitNode(OrderedMetadataListUpdater.Node node) { if(!TextUtils.isEmpty(childTask.getRecurrence())) {
Task childTask = taskService.fetchById(node.taskId, Task.RECURRENCE); Metadata metadata = updater.getTaskMetadata(node.taskId);
if(!TextUtils.isEmpty(childTask.getRecurrence())) { metadata.setValue(updater.indentProperty(), parentIndent);
Metadata metadata = updater.getTaskMetadata(node.taskId); metadataDao.persist(metadata);
metadata.setValue(updater.indentProperty(), parentIndent); }
metadataDao.persist(metadata);
}
model.setId(node.taskId); model.setId(node.taskId);
model.setCompletionDate(completionDate); model.setCompletionDate(completionDate);
taskService.save(model); taskService.save(model);
model.clear(); model.clear();
chained.add(node.taskId); chained.add(node.taskId);
}
}); });
if(chained.size() > 0) { if(chained.size() > 0) {

@ -68,53 +68,49 @@ abstract public class OrderedMetadataListUpdater<LIST> {
final AtomicLong previousTask = new AtomicLong(Task.NO_ID); final AtomicLong previousTask = new AtomicLong(Task.NO_ID);
final AtomicLong globalOrder = new AtomicLong(-1); final AtomicLong globalOrder = new AtomicLong(-1);
iterateThroughList(list, new OrderedListIterator() { iterateThroughList(list, (taskId, metadata) -> {
@Override if(!metadata.isSaved()) {
public void processTask(long taskId, Metadata metadata) { metadata = createEmptyMetadata(list, taskId);
if(!metadata.isSaved()) { }
metadata = createEmptyMetadata(list, taskId); int indent = metadata.containsNonNullValue(indentProperty()) ?
} metadata.getValue(indentProperty()) : 0;
int indent = metadata.containsNonNullValue(indentProperty()) ?
metadata.getValue(indentProperty()) : 0; long order = globalOrder.incrementAndGet();
metadata.setValue(orderProperty(), order);
long order = globalOrder.incrementAndGet();
metadata.setValue(orderProperty(), order); if(targetTaskId == taskId) {
// if indenting is warranted, indent me and my children
if(targetTaskId == taskId) { if(indent + delta <= previousIndent.get() + 1 && indent + delta >= 0) {
// if indenting is warranted, indent me and my children targetTaskIndent.set(indent);
if(indent + delta <= previousIndent.get() + 1 && indent + delta >= 0) { metadata.setValue(indentProperty(), indent + delta);
targetTaskIndent.set(indent);
metadata.setValue(indentProperty(), indent + delta); if(parentProperty() != null) {
long newParent = computeNewParent(list,
if(parentProperty() != null) { taskId, indent + delta - 1);
long newParent = computeNewParent(list, if (newParent == taskId) {
taskId, indent + delta - 1); metadata.setValue(parentProperty(), Task.NO_ID);
if (newParent == taskId) { } else {
metadata.setValue(parentProperty(), Task.NO_ID); metadata.setValue(parentProperty(), newParent);
} else {
metadata.setValue(parentProperty(), newParent);
}
} }
saveAndUpdateModifiedDate(metadata);
} }
} else if(targetTaskIndent.get() > -1) { saveAndUpdateModifiedDate(metadata);
// found first task that is not beneath target
if(indent <= targetTaskIndent.get()) {
targetTaskIndent.set(-1);
} else {
metadata.setValue(indentProperty(), indent + delta);
saveAndUpdateModifiedDate(metadata);
}
} else {
previousIndent.set(indent);
previousTask.set(taskId);
} }
} else if(targetTaskIndent.get() > -1) {
if(!metadata.isSaved()) { // found first task that is not beneath target
if(indent <= targetTaskIndent.get()) {
targetTaskIndent.set(-1);
} else {
metadata.setValue(indentProperty(), indent + delta);
saveAndUpdateModifiedDate(metadata); saveAndUpdateModifiedDate(metadata);
} }
} else {
previousIndent.set(indent);
previousTask.set(taskId);
} }
if(!metadata.isSaved()) {
saveAndUpdateModifiedDate(metadata);
}
}); });
onMovedOrIndented(getTaskMetadata(targetTaskId)); onMovedOrIndented(getTaskMetadata(targetTaskId));
} }
@ -129,17 +125,14 @@ abstract public class OrderedMetadataListUpdater<LIST> {
final AtomicLong lastPotentialParent = new AtomicLong(Task.NO_ID); final AtomicLong lastPotentialParent = new AtomicLong(Task.NO_ID);
final AtomicBoolean computedParent = new AtomicBoolean(false); final AtomicBoolean computedParent = new AtomicBoolean(false);
iterateThroughList(list, new OrderedListIterator() { iterateThroughList(list, (taskId, metadata) -> {
@Override if (targetTask.get() == taskId) {
public void processTask(long taskId, Metadata metadata) { computedParent.set(true);
if (targetTask.get() == taskId) { }
computedParent.set(true);
}
int indent = metadata.getValue(indentProperty()); int indent = metadata.getValue(indentProperty());
if (!computedParent.get() && indent == desiredParentIndent.get()) { if (!computedParent.get() && indent == desiredParentIndent.get()) {
lastPotentialParent.set(taskId); lastPotentialParent.set(taskId);
}
} }
}); });
@ -254,35 +247,32 @@ abstract public class OrderedMetadataListUpdater<LIST> {
final AtomicInteger previoustIndent = new AtomicInteger(-1); final AtomicInteger previoustIndent = new AtomicInteger(-1);
final AtomicReference<Node> currentNode = new AtomicReference<>(root); final AtomicReference<Node> currentNode = new AtomicReference<>(root);
iterateThroughList(list, new OrderedListIterator() { iterateThroughList(list, (taskId, metadata) -> {
@Override int indent = metadata.getValue(indentProperty());
public void processTask(long taskId, Metadata metadata) {
int indent = metadata.getValue(indentProperty()); int previousIndentValue = previoustIndent.get();
if(indent == previousIndentValue) { // sibling
int previousIndentValue = previoustIndent.get(); Node parent = currentNode.get().parent;
if(indent == previousIndentValue) { // sibling currentNode.set(new Node(taskId, parent));
Node parent = currentNode.get().parent; parent.children.add(currentNode.get());
currentNode.set(new Node(taskId, parent)); } else if(indent > previousIndentValue) { // child
parent.children.add(currentNode.get()); Node parent = currentNode.get();
} else if(indent > previousIndentValue) { // child currentNode.set(new Node(taskId, parent));
Node parent = currentNode.get(); parent.children.add(currentNode.get());
currentNode.set(new Node(taskId, parent)); } else { // in a different tree
parent.children.add(currentNode.get()); Node node = currentNode.get().parent;
} else { // in a different tree for(int i = indent; i < previousIndentValue; i++) {
Node node = currentNode.get().parent; node = node.parent;
for(int i = indent; i < previousIndentValue; i++) { if(node == null) {
node = node.parent; node = root;
if(node == null) { break;
node = root;
break;
}
} }
currentNode.set(new Node(taskId, node));
node.children.add(currentNode.get());
} }
currentNode.set(new Node(taskId, node));
previoustIndent.set(indent); node.children.add(currentNode.get());
} }
previoustIndent.set(indent);
}); });
return root; return root;
} }

@ -88,12 +88,7 @@ public class GtasksLoginActivity extends InjectingAppCompatActivity implements A
@Override @Override
public void authenticationFailed(final String message) { public void authenticationFailed(final String message) {
runOnUiThread(new Runnable() { runOnUiThread(() -> Toast.makeText(GtasksLoginActivity.this, message, Toast.LENGTH_LONG).show());
@Override
public void run() {
Toast.makeText(GtasksLoginActivity.this, message, Toast.LENGTH_LONG).show();
}
});
DialogUtilities.dismissDialog(GtasksLoginActivity.this, pd); DialogUtilities.dismissDialog(GtasksLoginActivity.this, pd);
} }
}); });

@ -173,14 +173,11 @@ public class GtasksSyncService {
startAtCriterion)). startAtCriterion)).
orderBy(order); orderBy(order);
metadataDao.query(query, new Callback<Metadata>() { metadataDao.query(query, entry -> {
@Override long taskId = entry.getValue(Metadata.TASK);
public void apply(Metadata entry) { Metadata metadata = metadataDao.getFirstActiveByTaskAndKey(taskId, GtasksMetadata.METADATA_KEY);
long taskId = entry.getValue(Metadata.TASK); if(metadata != null) {
Metadata metadata = metadataDao.getFirstActiveByTaskAndKey(taskId, GtasksMetadata.METADATA_KEY); iterator.processTask(taskId, metadata);
if(metadata != null) {
iterator.processTask(taskId, metadata);
}
} }
}); });
} }
@ -210,20 +207,17 @@ public class GtasksSyncService {
final AtomicInteger indentToMatch = new AtomicInteger(gtasksMetadata.getValue(GtasksMetadata.INDENT)); final AtomicInteger indentToMatch = new AtomicInteger(gtasksMetadata.getValue(GtasksMetadata.INDENT));
final AtomicLong parentToMatch = new AtomicLong(gtasksMetadata.getValue(GtasksMetadata.PARENT_TASK)); final AtomicLong parentToMatch = new AtomicLong(gtasksMetadata.getValue(GtasksMetadata.PARENT_TASK));
final AtomicReference<String> sibling = new AtomicReference<>(); final AtomicReference<String> sibling = new AtomicReference<>();
OrderedMetadataListUpdater.OrderedListIterator iterator = new OrderedMetadataListUpdater.OrderedListIterator() { OrderedMetadataListUpdater.OrderedListIterator iterator = (taskId, metadata) -> {
@Override Task t = taskDao.fetch(taskId, Task.TITLE, Task.DELETION_DATE);
public void processTask(long taskId, Metadata metadata) { if (t == null || t.isDeleted()) {
Task t = taskDao.fetch(taskId, Task.TITLE, Task.DELETION_DATE); return;
if (t == null || t.isDeleted()) { }
return; int currIndent = metadata.getValue(GtasksMetadata.INDENT);
} long currParent = metadata.getValue(GtasksMetadata.PARENT_TASK);
int currIndent = metadata.getValue(GtasksMetadata.INDENT);
long currParent = metadata.getValue(GtasksMetadata.PARENT_TASK);
if (currIndent == indentToMatch.get() && currParent == parentToMatch.get()) { if (currIndent == indentToMatch.get() && currParent == parentToMatch.get()) {
if (sibling.get() == null) { if (sibling.get() == null) {
sibling.set(metadata.getValue(GtasksMetadata.ID)); sibling.set(metadata.getValue(GtasksMetadata.ID));
}
} }
} }
}; };

@ -40,15 +40,12 @@ public class SyncV2Service {
public void clearCompleted(final GtasksList list, final SyncResultCallback callback) { public void clearCompleted(final GtasksList list, final SyncResultCallback callback) {
if (syncAdapterHelper.isEnabled()) { if (syncAdapterHelper.isEnabled()) {
syncExecutor.execute(callback, new Runnable() { syncExecutor.execute(callback, () -> {
@Override callback.started();
public void run() { try {
callback.started(); gtasksSyncService.clearCompleted(list.getRemoteId());
try { } finally {
gtasksSyncService.clearCompleted(list.getRemoteId()); callback.finished();
} finally {
callback.finished();
}
} }
}); });
} }

@ -50,12 +50,7 @@ public class AccountManager {
} }
public List<String> getAccounts() { public List<String> getAccounts() {
return transform(getAccountList(), new Function<Account, String>() { return transform(getAccountList(), account -> account.name);
@Override
public String apply(Account account) {
return account.name;
}
});
} }
public boolean hasAccount(final String name) { public boolean hasAccount(final String name) {
@ -71,19 +66,16 @@ public class AccountManager {
if (account == null) { if (account == null) {
handler.authenticationFailed(activity.getString(R.string.gtasks_error_accountNotFound, accountName)); handler.authenticationFailed(activity.getString(R.string.gtasks_error_accountNotFound, accountName));
} else { } else {
new Thread(new Runnable() { new Thread(() -> {
@Override try {
public void run() { GoogleAuthUtil.getToken(activity, account, "oauth2:" + TasksScopes.TASKS, null);
try { handler.authenticationSuccessful(accountName);
GoogleAuthUtil.getToken(activity, account, "oauth2:" + TasksScopes.TASKS, null); } catch(UserRecoverableAuthException e) {
handler.authenticationSuccessful(accountName); Timber.e(e, e.getMessage());
} catch(UserRecoverableAuthException e) { activity.startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
Timber.e(e, e.getMessage()); } catch(GoogleAuthException | IOException e) {
activity.startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION); Timber.e(e, e.getMessage());
} catch(GoogleAuthException | IOException e) { handler.authenticationFailed(context.getString(R.string.gtasks_GLA_errorIOAuth));
Timber.e(e, e.getMessage());
handler.authenticationFailed(context.getString(R.string.gtasks_GLA_errorIOAuth));
}
} }
}).start(); }).start();
} }
@ -100,11 +92,6 @@ public class AccountManager {
return null; return null;
} }
return tryFind(getAccountList(), new Predicate<Account>() { return tryFind(getAccountList(), account -> name.equalsIgnoreCase(account.name)).orNull();
@Override
public boolean apply(Account account) {
return name.equalsIgnoreCase(account.name);
}
}).orNull();
} }
} }

@ -25,12 +25,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment {
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
return createDialog(dialogBuilder, gtasksListService, new GoogleTaskListSelectionHandler() { return createDialog(dialogBuilder, gtasksListService, list -> handler.selectedList(list));
@Override
public void selectedList(GtasksList list) {
handler.selectedList(list);
}
});
} }
@Override @Override

@ -30,12 +30,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
return createDialog(dialogBuilder, gtasksListService, new GoogleTaskListSelectionHandler() { return createDialog(dialogBuilder, gtasksListService, list -> handler.selectedList(list));
@Override
public void selectedList(GtasksList list) {
handler.selectedList(list);
}
});
} }
@Override @Override
@ -47,26 +42,13 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
public static AlertDialog createDialog(DialogBuilder dialogBuilder, GtasksListService gtasksListService, final GoogleTaskListSelectionHandler handler) { public static AlertDialog createDialog(DialogBuilder dialogBuilder, GtasksListService gtasksListService, final GoogleTaskListSelectionHandler handler) {
final List<GtasksList> lists = gtasksListService.getLists(); final List<GtasksList> lists = gtasksListService.getLists();
List<String> listNames = transform(lists, new Function<GtasksList, String>() { List<String> listNames = transform(lists, GtasksList::getName);
@Override
public String apply(GtasksList gtasksList) {
return gtasksList.getName();
}
});
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setItems(listNames, new DialogInterface.OnClickListener() { .setItems(listNames, (dialog, which) -> {
@Override handler.selectedList(lists.get(which));
public void onClick(DialogInterface dialog, int which) { dialog.dismiss();
handler.selectedList(lists.get(which));
dialog.dismiss();
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}) })
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.show(); .show();
} }

@ -34,20 +34,17 @@ public class Tracker {
tracker = analytics.newTracker(R.xml.google_analytics); tracker = analytics.newTracker(R.xml.google_analytics);
tracker.setAppVersion(Integer.toString(BuildConfig.VERSION_CODE)); tracker.setAppVersion(Integer.toString(BuildConfig.VERSION_CODE));
final StandardExceptionParser standardExceptionParser = new StandardExceptionParser(context, null); final StandardExceptionParser standardExceptionParser = new StandardExceptionParser(context, null);
exceptionParser = new ExceptionParser() { exceptionParser = (thread, throwable) -> {
@Override StringBuilder stack = new StringBuilder()
public String getDescription(String thread, Throwable throwable) { .append(standardExceptionParser.getDescription(thread, throwable))
StringBuilder stack = new StringBuilder() .append("\n")
.append(standardExceptionParser.getDescription(thread, throwable)) .append(throwable.getClass().getName())
.append("\n") .append("\n");
.append(throwable.getClass().getName()) for (StackTraceElement element : throwable.getStackTrace()) {
stack.append(element.toString())
.append("\n"); .append("\n");
for (StackTraceElement element : throwable.getStackTrace()) {
stack.append(element.toString())
.append("\n");
}
return stack.toString();
} }
return stack.toString();
}; };
ExceptionReporter reporter = new ExceptionReporter( ExceptionReporter reporter = new ExceptionReporter(
tracker, tracker,

@ -52,35 +52,29 @@ public class InventoryHelper implements IabBroadcastReceiver.IabBroadcastListene
} }
private IabHelper.OnIabSetupFinishedListener getSetupListener(final IabHelper helper) { private IabHelper.OnIabSetupFinishedListener getSetupListener(final IabHelper helper) {
return new IabHelper.OnIabSetupFinishedListener() { return result -> {
@Override if (result.isSuccess()) {
public void onIabSetupFinished(IabResult result) { helper.queryInventoryAsync(getQueryListener(helper));
if (result.isSuccess()) { } else {
helper.queryInventoryAsync(getQueryListener(helper)); Timber.e("setup failed: %s", result.getMessage());
} else { helper.dispose();
Timber.e("setup failed: %s", result.getMessage());
helper.dispose();
}
} }
}; };
} }
private IabHelper.QueryInventoryFinishedListener getQueryListener(final IabHelper helper) { private IabHelper.QueryInventoryFinishedListener getQueryListener(final IabHelper helper) {
return new IabHelper.QueryInventoryFinishedListener() { return (result, inv) -> {
@Override if (result.isSuccess()) {
public void onQueryInventoryFinished(IabResult result, Inventory inv) { inventory = inv;
if (result.isSuccess()) { checkPurchase(R.string.sku_tasker, R.string.p_purchased_tasker);
inventory = inv; checkPurchase(R.string.sku_tesla_unread, R.string.p_purchased_tesla_unread);
checkPurchase(R.string.sku_tasker, R.string.p_purchased_tasker); checkPurchase(R.string.sku_dashclock, R.string.p_purchased_dashclock);
checkPurchase(R.string.sku_tesla_unread, R.string.p_purchased_tesla_unread); checkPurchase(R.string.sku_themes, R.string.p_purchased_themes);
checkPurchase(R.string.sku_dashclock, R.string.p_purchased_dashclock); broadcaster.refresh();
checkPurchase(R.string.sku_themes, R.string.p_purchased_themes); } else {
broadcaster.refresh(); Timber.e("query inventory failed: %s", result.getMessage());
} else {
Timber.e("query inventory failed: %s", result.getMessage());
}
helper.dispose();
} }
helper.dispose();
}; };
} }

@ -66,18 +66,8 @@ public class PurchaseHelper implements IabHelper.OnIabSetupFinishedListener {
if (activity.getString(R.string.sku_tasker).equals(sku) && isAppInstalled(activity, "org.tasks.locale")) { if (activity.getString(R.string.sku_tasker).equals(sku) && isAppInstalled(activity, "org.tasks.locale")) {
dialogBuilder.newMessageDialog(R.string.tasker_message) dialogBuilder.newMessageDialog(R.string.tasker_message)
.setCancelable(false) .setCancelable(false)
.setPositiveButton(R.string.buy, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.buy, (dialog, which) -> launchPurchaseFlow(activity, sku, pref, requestCode, callback))
@Override .setNegativeButton(android.R.string.cancel, (dialog, which) -> callback.purchaseCompleted(false, sku))
public void onClick(DialogInterface dialog, int which) {
launchPurchaseFlow(activity, sku, pref, requestCode, callback);
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
callback.purchaseCompleted(false, sku);
}
})
.show(); .show();
return false; return false;
} else { } else {
@ -107,42 +97,36 @@ public class PurchaseHelper implements IabHelper.OnIabSetupFinishedListener {
} }
final IabHelper iabHelper = new IabHelper(context, context.getString(R.string.gp_key), executor); final IabHelper iabHelper = new IabHelper(context, context.getString(R.string.gp_key), executor);
iabHelper.enableDebugLogging(true); iabHelper.enableDebugLogging(true);
iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { iabHelper.startSetup(result -> {
@Override if (result.isSuccess()) {
public void onIabSetupFinished(IabResult result) { iabHelper.consumeAsync(purchases, (purchases1, results) -> {
if (result.isSuccess()) { for (int i = 0; i < purchases1.size() ; i++) {
iabHelper.consumeAsync(purchases, new IabHelper.OnConsumeMultiFinishedListener() { Purchase purchase = purchases1.get(i);
@Override IabResult iabResult = results.get(i);
public void onConsumeMultiFinished(List<Purchase> purchases, List<IabResult> results) { if (iabResult.isSuccess()) {
for (int i = 0 ; i < purchases.size() ; i++) { if (purchase.equals(tasker)) {
Purchase purchase = purchases.get(i); preferences.setBoolean(R.string.p_purchased_tasker, false);
IabResult iabResult = results.get(i); } else if (purchase.equals(dashclock)) {
if (iabResult.isSuccess()) { preferences.setBoolean(R.string.p_purchased_dashclock, false);
if (purchase.equals(tasker)) { } else if (purchase.equals(teslaUnread)) {
preferences.setBoolean(R.string.p_purchased_tasker, false); preferences.setBoolean(R.string.p_purchased_tesla_unread, false);
} else if (purchase.equals(dashclock)) { preferences.setBoolean(R.string.p_tesla_unread_enabled, false);
preferences.setBoolean(R.string.p_purchased_dashclock, false); } else if (purchase.equals(themes)) {
} else if (purchase.equals(teslaUnread)) { preferences.setBoolean(R.string.p_purchased_themes, false);
preferences.setBoolean(R.string.p_purchased_tesla_unread, false); } else {
preferences.setBoolean(R.string.p_tesla_unread_enabled, false); Timber.e("Unhandled consumption for purchase: %s", purchase);
} else if (purchase.equals(themes)) {
preferences.setBoolean(R.string.p_purchased_themes, false);
} else {
Timber.e("Unhandled consumption for purchase: %s", purchase);
}
inventory.erasePurchase(purchase.getSku());
Timber.d("Consumed %s", purchase);
} else {
Timber.e("Consume failed: %s, %s", purchase, iabResult);
}
} }
iabHelper.dispose(); inventory.erasePurchase(purchase.getSku());
Timber.d("Consumed %s", purchase);
} else {
Timber.e("Consume failed: %s, %s", purchase, iabResult);
} }
}); }
} else {
Timber.e("setup failed: %s", result.getMessage());
iabHelper.dispose(); iabHelper.dispose();
} });
} else {
Timber.e("setup failed: %s", result.getMessage());
iabHelper.dispose();
} }
}); });
} }
@ -157,45 +141,39 @@ public class PurchaseHelper implements IabHelper.OnIabSetupFinishedListener {
iabHelper = new IabHelper(context, context.getString(R.string.gp_key), executor); iabHelper = new IabHelper(context, context.getString(R.string.gp_key), executor);
iabHelper.enableDebugLogging(BuildConfig.DEBUG); iabHelper.enableDebugLogging(BuildConfig.DEBUG);
Timber.d("%s: startSetup", iabHelper); Timber.d("%s: startSetup", iabHelper);
iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { iabHelper.startSetup(result -> {
@Override if (result.isSuccess()) {
public void onIabSetupFinished(IabResult result) { try {
if (result.isSuccess()) { Timber.d("%s: launchPurchaseFlow for %s", iabHelper, sku);
try { iabHelper.launchPurchaseFlow(activity, sku, requestCode, (result1, info) -> {
Timber.d("%s: launchPurchaseFlow for %s", iabHelper, sku); Timber.d(result1.toString());
iabHelper.launchPurchaseFlow(activity, sku, requestCode, new IabHelper.OnIabPurchaseFinishedListener() { tracker.reportIabResult(result1, sku);
@Override if (result1.isSuccess()) {
public void onIabPurchaseFinished(IabResult result, Purchase info) { if (!Strings.isNullOrEmpty(pref)) {
Timber.d(result.toString()); preferences.setBoolean(pref, true);
tracker.reportIabResult(result, sku); broadcaster.refresh();
if (result.isSuccess()) {
if (!Strings.isNullOrEmpty(pref)) {
preferences.setBoolean(pref, true);
broadcaster.refresh();
}
inventory.refreshInventory();
} else if (result.getResponse() != IabHelper.BILLING_RESPONSE_RESULT_USER_CANCELED &&
result.getResponse() != IabHelper.IABHELPER_USER_CANCELLED) {
Toast.makeText(activity, result.getMessage(), Toast.LENGTH_LONG).show();
}
if (activityResultCallback != null) {
activityResultCallback.purchaseCompleted(result.isSuccess(), sku);
}
disposeIabHelper();
} }
}); inventory.refreshInventory();
} catch (IllegalStateException e) { } else if (result1.getResponse() != IabHelper.BILLING_RESPONSE_RESULT_USER_CANCELED &&
tracker.reportException(e); result1.getResponse() != IabHelper.IABHELPER_USER_CANCELLED) {
Toast.makeText(activity, R.string.billing_service_busy, Toast.LENGTH_LONG).show(); Toast.makeText(activity, result1.getMessage(), Toast.LENGTH_LONG).show();
callback.purchaseCompleted(false, sku); }
if (activityResultCallback != null) {
activityResultCallback.purchaseCompleted(result1.isSuccess(), sku);
}
disposeIabHelper(); disposeIabHelper();
} });
} else { } catch (IllegalStateException e) {
Timber.e(result.toString()); tracker.reportException(e);
Toast.makeText(activity, result.getMessage(), Toast.LENGTH_LONG).show(); Toast.makeText(activity, R.string.billing_service_busy, Toast.LENGTH_LONG).show();
callback.purchaseCompleted(false, sku); callback.purchaseCompleted(false, sku);
disposeIabHelper(); disposeIabHelper();
} }
} else {
Timber.e(result.toString());
Toast.makeText(activity, result.getMessage(), Toast.LENGTH_LONG).show();
callback.purchaseCompleted(false, sku);
disposeIabHelper();
} }
}); });
} }

@ -44,14 +44,11 @@ public class DashClockSettings extends InjectingPreferenceActivity implements Pu
addPreferencesFromResource(R.xml.preferences_dashclock); addPreferencesFromResource(R.xml.preferences_dashclock);
findPreference(getString(R.string.p_dashclock_filter)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.p_dashclock_filter)).setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(DashClockSettings.this, FilterSelectionActivity.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(FilterSelectionActivity.EXTRA_RETURN_FILTER, true);
startActivityForResult(new Intent(DashClockSettings.this, FilterSelectionActivity.class) {{ }}, REQUEST_SELECT_FILTER);
putExtra(FilterSelectionActivity.EXTRA_RETURN_FILTER, true); return false;
}}, REQUEST_SELECT_FILTER);
return false;
}
}); });
refreshPreferences(); refreshPreferences();

@ -39,19 +39,13 @@ public class AccountSelectionDialog extends InjectingDialogFragment {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setTitle(R.string.choose_google_account) .setTitle(R.string.choose_google_account)
.setItems(accounts, new DialogInterface.OnClickListener() { .setItems(accounts, (dialog, which) -> {
@Override handler.accountSelected(accounts.get(which));
public void onClick(DialogInterface dialog, int which) { dialog.dismiss();
handler.accountSelected(accounts.get(which));
dialog.dismiss();
}
}) })
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { .setNegativeButton(android.R.string.cancel, (dialog, which) -> {
@Override if (handler != null) {
public void onClick(DialogInterface dialog, int which) { handler.onCancel();
if (handler != null) {
handler.onCancel();
}
} }
}) })
.show(); .show();

@ -409,20 +409,17 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter
newMetadataValues.add(metadatum.getMergedValues()); newMetadataValues.add(metadatum.getMergedValues());
} }
metadataDao.byTaskAndKey(taskId, metadataKey, new Callback<Metadata>() { metadataDao.byTaskAndKey(taskId, metadataKey, item -> {
@Override long id = item.getId();
public void apply(Metadata item) {
long id = item.getId(); // clear item id when matching with incoming values
item.clearValue(Metadata.ID);
// clear item id when matching with incoming values ContentValues itemMergedValues = item.getMergedValues();
item.clearValue(Metadata.ID); if(newMetadataValues.contains(itemMergedValues)) {
ContentValues itemMergedValues = item.getMergedValues(); newMetadataValues.remove(itemMergedValues);
if(newMetadataValues.contains(itemMergedValues)) { } else {
newMetadataValues.remove(itemMergedValues); // not matched. cut it
} else { metadataDao.delete(id);
// not matched. cut it
metadataDao.delete(id);
}
} }
}); });

@ -66,27 +66,16 @@ public final class TaskerSettingsActivity extends AbstractFragmentPluginAppCompa
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_close_24dp)); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_close_24dp));
toolbar.setOnMenuItemClickListener(this); toolbar.setOnMenuItemClickListener(this);
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(view -> {
@Override if (equalBundles(getResultBundle(), previousBundle)) {
public void onClick(View view) { cancel();
if (equalBundles(getResultBundle(), previousBundle)) { } else {
cancel(); dialogBuilder.newMessageDialog(R.string.discard_changes)
} else { .setPositiveButton(android.R.string.ok, (dialog, which) -> cancel())
dialogBuilder.newMessageDialog(R.string.discard_changes) .setNegativeButton(android.R.string.cancel, (dialog, which) -> {
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override })
public void onClick(DialogInterface dialog, int which) { .show();
cancel();
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
} }
}); });
toolbar.inflateMenu(R.menu.tasker_menu); toolbar.inflateMenu(R.menu.tasker_menu);

@ -48,28 +48,22 @@ public class GeofenceApi {
return; return;
} }
newClient(new GoogleApi.GoogleApiClientConnectionHandler() { newClient(client -> {
@Override @SuppressWarnings("ResourceType")
public void onConnect(final GoogleApiClient client) { @SuppressLint("MissingPermission")
@SuppressWarnings("ResourceType") PendingResult<Status> result = LocationServices.GeofencingApi.addGeofences(
@SuppressLint("MissingPermission") client,
PendingResult<Status> result = LocationServices.GeofencingApi.addGeofences( getRequests(geofences),
client, PendingIntent.getService(context, 0, new Intent(context, GeofenceTransitionsIntentService.class), PendingIntent.FLAG_UPDATE_CURRENT));
getRequests(geofences), result.setResultCallback(status -> {
PendingIntent.getService(context, 0, new Intent(context, GeofenceTransitionsIntentService.class), PendingIntent.FLAG_UPDATE_CURRENT)); if (status.isSuccess()) {
result.setResultCallback(new ResultCallback<Status>() { Timber.i("Registered %s", geofences);
@Override } else {
public void onResult(Status status) { Timber.e("Failed to register %s", geofences);
if (status.isSuccess()) { }
Timber.i("Registered %s", geofences);
} else { client.disconnect();
Timber.e("Failed to register %s", geofences); });
}
client.disconnect();
}
});
}
}); });
} }
@ -82,31 +76,18 @@ public class GeofenceApi {
return; return;
} }
final List<String> ids = newArrayList(transform(geofences, new Function<Geofence, String>() { final List<String> ids = newArrayList(transform(geofences, geofence -> Long.toString(geofence.getMetadataId())));
@Override
public String apply(Geofence geofence) { newClient(client -> LocationServices.GeofencingApi.removeGeofences(client, ids)
return Long.toString(geofence.getMetadataId()); .setResultCallback(status -> {
} if (status.isSuccess()) {
})); Timber.i("Removed %s", geofences);
} else {
newClient(new GoogleApi.GoogleApiClientConnectionHandler() { Timber.e("Failed to remove %s", geofences);
@Override }
public void onConnect(final GoogleApiClient client) {
LocationServices.GeofencingApi.removeGeofences(client, ids) client.disconnect();
.setResultCallback(new ResultCallback<Status>() { }));
@Override
public void onResult(Status status) {
if (status.isSuccess()) {
Timber.i("Removed %s", geofences);
} else {
Timber.e("Failed to remove %s", geofences);
}
client.disconnect();
}
});
}
});
} }
private void newClient(final GoogleApi.GoogleApiClientConnectionHandler handler) { private void newClient(final GoogleApi.GoogleApiClientConnectionHandler handler) {
@ -114,12 +95,7 @@ public class GeofenceApi {
} }
private List<com.google.android.gms.location.Geofence> getRequests(List<Geofence> geofences) { private List<com.google.android.gms.location.Geofence> getRequests(List<Geofence> geofences) {
return newArrayList(transform(geofences, new Function<Geofence, com.google.android.gms.location.Geofence>() { return newArrayList(transform(geofences, this::toGoogleGeofence));
@Override
public com.google.android.gms.location.Geofence apply(Geofence geofence) {
return toGoogleGeofence(geofence);
}
}));
} }
private com.google.android.gms.location.Geofence toGoogleGeofence(Geofence geofence) { private com.google.android.gms.location.Geofence toGoogleGeofence(Geofence geofence) {

@ -33,12 +33,7 @@ public class GoogleApi implements GoogleApiClient.ConnectionCallbacks {
} }
public void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler) { public void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler) {
connect(googleApiClientConnectionHandler, new GoogleApiClient.OnConnectionFailedListener() { connect(googleApiClientConnectionHandler, connectionResult -> Timber.e("onConnectionFailed(%s)", connectionResult));
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Timber.e("onConnectionFailed(%s)", connectionResult);
}
});
} }
private void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler, GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener) { private void connect(final GoogleApiClientConnectionHandler googleApiClientConnectionHandler, GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener) {

@ -54,12 +54,7 @@ public class DatabaseDao<TYPE extends AbstractModel> {
public List<TYPE> toList(Query query) { public List<TYPE> toList(Query query) {
final List<TYPE> result = new ArrayList<>(); final List<TYPE> result = new ArrayList<>();
query(new Callback<TYPE>() { query(result::add, query);
@Override
public void apply(TYPE entry) {
result.add(entry);
}
}, query);
return result; return result;
} }

@ -47,13 +47,10 @@ public class AndroidUtilities {
public static void suppressVirtualKeyboard(final TextView editor) { public static void suppressVirtualKeyboard(final TextView editor) {
final int inputType = editor.getInputType(); final int inputType = editor.getInputType();
editor.setInputType(InputType.TYPE_NULL); editor.setInputType(InputType.TYPE_NULL);
editor.setOnTouchListener(new OnTouchListener() { editor.setOnTouchListener((v, event) -> {
@Override editor.setInputType(inputType);
public boolean onTouch(View v, MotionEvent event) { editor.setOnTouchListener(null);
editor.setInputType(inputType); return false;
editor.setOnTouchListener(null);
return false;
}
}); });
} }
@ -178,26 +175,23 @@ public class AndroidUtilities {
} }
ContentValues result = new ContentValues(); ContentValues result = new ContentValues();
fromSerialized(string, result, new SerializedPut<ContentValues>() { fromSerialized(string, result, (object, key, type, value) -> {
@Override switch(type) {
public void put(ContentValues object, String key, char type, String value) throws NumberFormatException { case 'i':
switch(type) { object.put(key, Integer.parseInt(value));
case 'i': break;
object.put(key, Integer.parseInt(value)); case 'd':
break; object.put(key, Double.parseDouble(value));
case 'd': break;
object.put(key, Double.parseDouble(value)); case 'l':
break; object.put(key, Long.parseLong(value));
case 'l': break;
object.put(key, Long.parseLong(value)); case 's':
break; object.put(key, value.replace(SEPARATOR_ESCAPE, SERIALIZATION_SEPARATOR));
case 's': break;
object.put(key, value.replace(SEPARATOR_ESCAPE, SERIALIZATION_SEPARATOR)); case 'b':
break; object.put(key, Boolean.parseBoolean(value));
case 'b': break;
object.put(key, Boolean.parseBoolean(value));
break;
}
} }
}); });
return result; return result;
@ -212,26 +206,23 @@ public class AndroidUtilities {
} }
Bundle result = new Bundle(); Bundle result = new Bundle();
fromSerialized(string, result, new SerializedPut<Bundle>() { fromSerialized(string, result, (object, key, type, value) -> {
@Override switch(type) {
public void put(Bundle object, String key, char type, String value) throws NumberFormatException { case 'i':
switch(type) { object.putInt(key, Integer.parseInt(value));
case 'i': break;
object.putInt(key, Integer.parseInt(value)); case 'd':
break; object.putDouble(key, Double.parseDouble(value));
case 'd': break;
object.putDouble(key, Double.parseDouble(value)); case 'l':
break; object.putLong(key, Long.parseLong(value));
case 'l': break;
object.putLong(key, Long.parseLong(value)); case 's':
break; object.putString(key, value.replace(SEPARATOR_ESCAPE, SERIALIZATION_SEPARATOR));
case 's': break;
object.putString(key, value.replace(SEPARATOR_ESCAPE, SERIALIZATION_SEPARATOR)); case 'b':
break; object.putBoolean(key, Boolean.parseBoolean(value));
case 'b': break;
object.putBoolean(key, Boolean.parseBoolean(value));
break;
}
} }
}); });
return result; return result;
@ -328,12 +319,7 @@ public class AndroidUtilities {
* Sort files by date so the newest file is on top * Sort files by date so the newest file is on top
*/ */
public static void sortFilesByDateDesc(File[] files) { public static void sortFilesByDateDesc(File[] files) {
Arrays.sort(files, new Comparator<File>() { Arrays.sort(files, (o1, o2) -> Long.valueOf(o2.lastModified()).compareTo(o1.lastModified()));
@Override
public int compare(File o1, File o2) {
return Long.valueOf(o2.lastModified()).compareTo(o1.lastModified());
}
});
} }
/** /**

@ -21,14 +21,11 @@ public class DialogUtilities {
if(dialog == null) { if(dialog == null) {
return; return;
} }
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(() -> {
@Override try {
public void run() { dialog.dismiss();
try { } catch(Exception e) {
dialog.dismiss(); Timber.e(e, e.getMessage());
} catch(Exception e) {
Timber.e(e, e.getMessage());
}
} }
}); });
} }

@ -61,14 +61,11 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp
toolbar.setNavigationIcon(getResources().getDrawable( toolbar.setNavigationIcon(getResources().getDrawable(
backButtonSavesTask ? R.drawable.ic_close_24dp : R.drawable.ic_save_24dp)); backButtonSavesTask ? R.drawable.ic_close_24dp : R.drawable.ic_save_24dp));
toolbar.setTitle(filter.listingTitle); toolbar.setTitle(filter.listingTitle);
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(v -> {
@Override if (backButtonSavesTask) {
public void onClick(View v) { discard();
if (backButtonSavesTask) { } else {
discard(); save();
} else {
save();
}
} }
}); });
toolbar.inflateMenu(R.menu.tag_settings_activity); toolbar.inflateMenu(R.menu.tag_settings_activity);
@ -120,13 +117,10 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp
private void deleteTag() { private void deleteTag() {
dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, filter.listingTitle) dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, filter.listingTitle)
.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.delete, (dialog, which) -> {
@Override storeObjectDao.delete(filter.getId());
public void onClick(DialogInterface dialog, int which) { setResult(RESULT_OK, new Intent(AstridApiConstants.BROADCAST_EVENT_FILTER_DELETED).putExtra(TOKEN_FILTER, filter));
storeObjectDao.delete(filter.getId()); finish();
setResult(RESULT_OK, new Intent(AstridApiConstants.BROADCAST_EVENT_FILTER_DELETED).putExtra(TOKEN_FILTER, filter));
finish();
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
@ -138,12 +132,7 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp
finish(); finish();
} else { } else {
dialogBuilder.newMessageDialog(R.string.discard_changes) dialogBuilder.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.discard, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.discard, (dialog, which) -> finish())
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }

@ -100,14 +100,11 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem
toolbar.setTitle(isNewTag ? getString(R.string.new_tag) : tagData.getName()); toolbar.setTitle(isNewTag ? getString(R.string.new_tag) : tagData.getName());
toolbar.setNavigationIcon(getResources().getDrawable( toolbar.setNavigationIcon(getResources().getDrawable(
backButtonSavesTask ? R.drawable.ic_close_24dp : R.drawable.ic_save_24dp)); backButtonSavesTask ? R.drawable.ic_close_24dp : R.drawable.ic_save_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(v -> {
@Override if (backButtonSavesTask) {
public void onClick(View v) { discard();
if (backButtonSavesTask) { } else {
discard(); save();
} else {
save();
}
} }
}); });
toolbar.inflateMenu(R.menu.tag_settings_activity); toolbar.inflateMenu(R.menu.tag_settings_activity);
@ -237,17 +234,14 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem
private void deleteTag() { private void deleteTag() {
dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, tagData.getName()) dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, tagData.getName())
.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.delete, (dialog, which) -> {
@Override if (tagData != null) {
public void onClick(DialogInterface dialog, int which) { String uuid = tagData.getUuid();
if (tagData != null) { metadataDao.deleteWhere(Criterion.and(MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_UUID.eq(uuid)));
String uuid = tagData.getUuid(); tagDataDao.delete(tagData.getId());
metadataDao.deleteWhere(Criterion.and(MetadataDao.MetadataCriteria.withKey(TaskToTagMetadata.KEY), TaskToTagMetadata.TAG_UUID.eq(uuid))); setResult(RESULT_OK, new Intent(AstridApiConstants.BROADCAST_EVENT_TAG_DELETED).putExtra(EXTRA_TAG_UUID, uuid));
tagDataDao.delete(tagData.getId());
setResult(RESULT_OK, new Intent(AstridApiConstants.BROADCAST_EVENT_TAG_DELETED).putExtra(EXTRA_TAG_UUID, uuid));
}
finish();
} }
finish();
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
@ -258,12 +252,7 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem
finish(); finish();
} else { } else {
dialogBuilder.newMessageDialog(R.string.discard_changes) dialogBuilder.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.discard, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.discard, (dialog, which) -> finish())
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }

@ -65,12 +65,7 @@ public class BeastModePreferences extends ThemedInjectingAppCompatActivity imple
ButterKnife.bind(this); ButterKnife.bind(this);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_24dp)); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(v -> finish());
@Override
public void onClick(View v) {
finish();
}
});
toolbar.inflateMenu(R.menu.beast_mode); toolbar.inflateMenu(R.menu.beast_mode);
toolbar.setOnMenuItemClickListener(this); toolbar.setOnMenuItemClickListener(this);
MenuColorizer.colorToolbar(this, toolbar); MenuColorizer.colorToolbar(this, toolbar);
@ -90,19 +85,11 @@ public class BeastModePreferences extends ThemedInjectingAppCompatActivity imple
} }
}; };
touchList.setAdapter(adapter); touchList.setAdapter(adapter);
touchList.setOnTouchListener(new OnTouchListener() { touchList.setOnTouchListener((v, event) -> false);
@Override touchList.setDropListener((from, to) -> {
public boolean onTouch(View v, MotionEvent event) { String s = items.remove(from);
return false; items.add(to, s);
} adapter.notifyDataSetChanged();
});
touchList.setDropListener(new DropListener() {
@Override
public void drop(int from, int to) {
String s = items.remove(from);
items.add(to, s);
adapter.notifyDataSetChanged();
}
}); });
} }

@ -127,14 +127,11 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
final boolean backButtonSavesTask = preferences.backButtonSavesTask(); final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setNavigationIcon(getResources().getDrawable( toolbar.setNavigationIcon(getResources().getDrawable(
backButtonSavesTask ? R.drawable.ic_close_24dp : R.drawable.ic_save_24dp)); backButtonSavesTask ? R.drawable.ic_close_24dp : R.drawable.ic_save_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(v -> {
@Override if (backButtonSavesTask) {
public void onClick(View v) { discardButtonClick();
if (backButtonSavesTask) { } else {
discardButtonClick(); save();
} else {
save();
}
} }
}); });
toolbar.inflateMenu(R.menu.task_edit_fragment); toolbar.inflateMenu(R.menu.task_edit_fragment);
@ -274,12 +271,7 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
if (hasChanges(taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()))) { if (hasChanges(taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()))) {
dialogBuilder.newMessageDialog(R.string.discard_confirmation) dialogBuilder.newMessageDialog(R.string.discard_confirmation)
.setPositiveButton(R.string.keep_editing, null) .setPositiveButton(R.string.keep_editing, null)
.setNegativeButton(R.string.discard, new DialogInterface.OnClickListener() { .setNegativeButton(R.string.discard, (dialog, which) -> discard())
@Override
public void onClick(DialogInterface dialog, int which) {
discard();
}
})
.show(); .show();
} else { } else {
discard(); discard();
@ -297,13 +289,10 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
protected void deleteButtonClick() { protected void deleteButtonClick() {
dialogBuilder.newMessageDialog(R.string.DLG_delete_this_task_question) dialogBuilder.newMessageDialog(R.string.DLG_delete_this_task_question)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
@Override TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model);
public void onClick(DialogInterface dialog, int which) { taskDeleter.delete(model);
TimerPlugin.stopTimer(notificationManager, taskService, getActivity(), model); callback.taskEditFinished();
taskDeleter.delete(model);
callback.taskEditFinished();
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();

@ -225,14 +225,9 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
if (syncAdapterHelper.shouldShowBackgroundSyncWarning() && !preferences.getBoolean(R.string.p_sync_warning_shown, false)) { if (syncAdapterHelper.shouldShowBackgroundSyncWarning() && !preferences.getBoolean(R.string.p_sync_warning_shown, false)) {
if (taskListFragment != null) { if (taskListFragment != null) {
taskListFragment.makeSnackbar(R.string.master_sync_warning) taskListFragment.makeSnackbar(R.string.master_sync_warning)
.setAction(R.string.TLA_menu_settings, new View.OnClickListener() { .setAction(R.string.TLA_menu_settings, view -> startActivity(new Intent(Settings.ACTION_SYNC_SETTINGS) {{
@Override setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
public void onClick(View view) { }}))
startActivity(new Intent(Settings.ACTION_SYNC_SETTINGS) {{
setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}});
}
})
.setCallback(new Snackbar.Callback() { .setCallback(new Snackbar.Callback() {
@Override @Override
public void onShown(Snackbar snackbar) { public void onShown(Snackbar snackbar) {

@ -175,12 +175,9 @@ public class TaskListFragment extends InjectingListFragment implements
public void setSyncOngoing(final boolean ongoing) { public void setSyncOngoing(final boolean ongoing) {
Activity activity = getActivity(); Activity activity = getActivity();
if (activity != null) { if (activity != null) {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(() -> {
@Override swipeRefreshLayout.setRefreshing(ongoing);
public void run() { emptyView.setRefreshing(ongoing);
swipeRefreshLayout.setRefreshing(ongoing);
emptyView.setRefreshing(ongoing);
}
}); });
} }
} }
@ -252,12 +249,7 @@ public class TaskListFragment extends InjectingListFragment implements
toolbar.setTitle(filter.listingTitle); toolbar.setTitle(filter.listingTitle);
toolbar.setNavigationIcon(R.drawable.ic_menu_24dp); toolbar.setNavigationIcon(R.drawable.ic_menu_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(v -> callbacks.onNavigationIconClicked());
@Override
public void onClick(View v) {
callbacks.onNavigationIconClicked();
}
});
inflateMenu(toolbar); inflateMenu(toolbar);
setupMenu(toolbar.getMenu()); setupMenu(toolbar.getMenu());
toolbar.setOnMenuItemClickListener(this); toolbar.setOnMenuItemClickListener(this);
@ -390,39 +382,36 @@ public class TaskListFragment extends InjectingListFragment implements
registerForContextMenu(listView); registerForContextMenu(listView);
// set listener for quick-changing task priority // set listener for quick-changing task priority
listView.setOnKeyListener(new OnKeyListener() { listView.setOnKeyListener((view, keyCode, event) -> {
@Override if (event.getAction() != KeyEvent.ACTION_UP || view == null) {
public boolean onKey(View view, int keyCode, KeyEvent event) {
if (event.getAction() != KeyEvent.ACTION_UP || view == null) {
return false;
}
boolean filterOn = listView.isTextFilterEnabled();
View selected = listView.getSelectedView();
// hot-key to set task priority - 1-4 or ALT + Q-R
if (!filterOn && event.getUnicodeChar() >= '1'
&& event.getUnicodeChar() <= '4' && selected != null) {
int importance = event.getNumber() - '1';
Task task = ((ViewHolder) selected.getTag()).task;
task.setImportance(importance);
taskService.save(task);
taskAdapter.setFieldContentsAndVisibility(selected);
}
// filter
else if (!filterOn && event.getUnicodeChar() != 0) {
listView.setTextFilterEnabled(true);
listView.setFilterText(
Character.toString((char) event.getUnicodeChar()));
}
// turn off filter if nothing is selected
else if (filterOn
&& TextUtils.isEmpty(listView.getTextFilter())) {
listView.setTextFilterEnabled(false);
}
return false; return false;
} }
boolean filterOn = listView.isTextFilterEnabled();
View selected = listView.getSelectedView();
// hot-key to set task priority - 1-4 or ALT + Q-R
if (!filterOn && event.getUnicodeChar() >= '1'
&& event.getUnicodeChar() <= '4' && selected != null) {
int importance = event.getNumber() - '1';
Task task = ((ViewHolder) selected.getTag()).task;
task.setImportance(importance);
taskService.save(task);
taskAdapter.setFieldContentsAndVisibility(selected);
}
// filter
else if (!filterOn && event.getUnicodeChar() != 0) {
listView.setTextFilterEnabled(true);
listView.setFilterText(
Character.toString((char) event.getUnicodeChar()));
}
// turn off filter if nothing is selected
else if (filterOn
&& TextUtils.isEmpty(listView.getTextFilter())) {
listView.setTextFilterEnabled(false);
}
return false;
}); });
filter.setFilterQueryOverride(null); filter.setFilterQueryOverride(null);
@ -440,19 +429,15 @@ public class TaskListFragment extends InjectingListFragment implements
return; return;
} }
listView.setOnItemClickListener(new OnItemClickListener() { listView.setOnItemClickListener((parent, view, position, id) -> {
@Override if (taskAdapter != null) {
public void onItemClick(AdapterView<?> parent, View view, TodorooCursor<Task> cursor = (TodorooCursor<Task>) taskAdapter.getItem(position);
int position, long id) { Task task = new Task(cursor);
if (taskAdapter != null) { if (task.isDeleted()) {
TodorooCursor<Task> cursor = (TodorooCursor<Task>) taskAdapter.getItem(position); return;
Task task = new Task(cursor);
if (task.isDeleted()) {
return;
}
onTaskListItemClicked(id);
} }
onTaskListItemClicked(id);
} }
}); });
} }
@ -541,10 +526,7 @@ public class TaskListFragment extends InjectingListFragment implements
protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) { protected TaskAdapter createTaskAdapter(TodorooCursor<Task> cursor) {
return new TaskAdapter(context, preferences, taskAttachmentDao, taskService, this, cursor, sqlQueryTemplate, return new TaskAdapter(context, preferences, taskAttachmentDao, taskService, this, cursor, sqlQueryTemplate,
new OnCompletedTaskListener() { (item, newState) -> {
@Override
public void onCompletedTask(Task item, boolean newState) {
}
}, dialogBuilder, checkBoxes, tagService, themeCache); }, dialogBuilder, checkBoxes, tagService, themeCache);
} }
@ -657,13 +639,10 @@ public class TaskListFragment extends InjectingListFragment implements
/** Show a dialog box and delete the task specified */ /** Show a dialog box and delete the task specified */
private void deleteTask(final Task task) { private void deleteTask(final Task task) {
dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, task.getTitle()) dialogBuilder.newMessageDialog(R.string.delete_tag_confirmation, task.getTitle())
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, which) -> {
@Override onTaskDelete(task);
public void onClick(DialogInterface dialog, int which) { taskDeleter.delete(task);
onTaskDelete(task); loadTaskListContent();
taskDeleter.delete(task);
loadTaskListContent();
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
@ -695,15 +674,12 @@ public class TaskListFragment extends InjectingListFragment implements
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) { if (requestCode == VOICE_RECOGNITION_REQUEST_CODE) {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
Callback<String> quickAddTask = new Callback<String>() { Callback<String> quickAddTask = title -> {
@Override Task task = addTask(title);
public void apply(String title) { taskCreator.addToCalendar(task);
Task task = addTask(title); onTaskListItemClicked(task.getId());
taskCreator.addToCalendar(task); loadTaskListContent();
onTaskListItemClicked(task.getId()); onTaskCreated(task.getId(), task.getUUID());
loadTaskListContent();
onTaskCreated(task.getId(), task.getUUID());
}
}; };
voiceInputAssistant.handleActivityResult(data, quickAddTask); voiceInputAssistant.handleActivityResult(data, quickAddTask);
} }

@ -95,21 +95,11 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
@Override @Override
public void notifyDataSetChanged() { public void notifyDataSetChanged() {
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(FilterAdapter.super::notifyDataSetChanged);
@Override
public void run() {
FilterAdapter.super.notifyDataSetChanged();
}
});
} }
public void refreshFilterCount() { public void refreshFilterCount() {
filterCounter.refreshFilterCounts(new Runnable() { filterCounter.refreshFilterCounts(this::notifyDataSetChanged);
@Override
public void run() {
notifyDataSetChanged();
}
});
} }
/** /**
@ -286,12 +276,7 @@ public class FilterAdapter extends ArrayAdapter<FilterListItem> {
notifyDataSetChanged(); notifyDataSetChanged();
filterCounter.refreshFilterCounts(new Runnable() { filterCounter.refreshFilterCounts(this::notifyDataSetChanged);
@Override
public void run() {
notifyDataSetChanged();
}
});
} }
/** /**

@ -369,32 +369,26 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
final ViewHolder viewHolder = (ViewHolder)container.getTag(); final ViewHolder viewHolder = (ViewHolder)container.getTag();
// check box listener // check box listener
OnTouchListener otl = new OnTouchListener() { OnTouchListener otl = (v, event) -> {
@Override lastTouchYRawY = new Pair<>(event.getY(), event.getRawY());
public boolean onTouch(View v, MotionEvent event) { return false;
lastTouchYRawY = new Pair<>(event.getY(), event.getRawY());
return false;
}
}; };
viewHolder.completeBox.setOnTouchListener(otl); viewHolder.completeBox.setOnTouchListener(otl);
viewHolder.completeBox.setOnClickListener(completeBoxListener); viewHolder.completeBox.setOnClickListener(completeBoxListener);
if (viewHolder.taskActionContainer != null) { if (viewHolder.taskActionContainer != null) {
viewHolder.taskActionContainer.setOnClickListener(new OnClickListener() { viewHolder.taskActionContainer.setOnClickListener(v -> {
@Override TaskAction action = (TaskAction) viewHolder.taskActionIcon.getTag();
public void onClick(View v) { if (action instanceof NotesAction) {
TaskAction action = (TaskAction) viewHolder.taskActionIcon.getTag(); showEditNotesDialog(viewHolder.task);
if (action instanceof NotesAction) { } else if (action instanceof FilesAction) {
showEditNotesDialog(viewHolder.task); showFilesDialog(viewHolder.task);
} else if (action instanceof FilesAction) { } else if (action != null) {
showFilesDialog(viewHolder.task); try {
} else if (action != null) { action.intent.send();
try { } catch (CanceledException e) {
action.intent.send(); // Oh well
} catch (CanceledException e) { Timber.e(e, e.getMessage());
// Oh well
Timber.e(e, e.getMessage());
}
} }
} }
}); });
@ -443,25 +437,22 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
} }
} }
protected final View.OnClickListener completeBoxListener = new View.OnClickListener() { protected final View.OnClickListener completeBoxListener = v -> {
@Override int[] location = new int[2];
public void onClick(View v) { v.getLocationOnScreen(location);
int[] location = new int[2]; ViewHolder viewHolder = getTagFromCheckBox(v);
v.getLocationOnScreen(location);
ViewHolder viewHolder = getTagFromCheckBox(v); if(Math.abs(location[1] + lastTouchYRawY.getLeft() - lastTouchYRawY.getRight()) > 10) {
viewHolder.completeBox.setChecked(!viewHolder.completeBox.isChecked());
if(Math.abs(location[1] + lastTouchYRawY.getLeft() - lastTouchYRawY.getRight()) > 10) { return;
viewHolder.completeBox.setChecked(!viewHolder.completeBox.isChecked()); }
return;
}
Task task = viewHolder.task; Task task = viewHolder.task;
completeTask(task, viewHolder.completeBox.isChecked()); completeTask(task, viewHolder.completeBox.isChecked());
// set check box to actual action item state // set check box to actual action item state
setTaskAppearance(viewHolder, task); setTaskAppearance(viewHolder, task);
}
}; };
private ViewHolder getTagFromCheckBox(View v) { private ViewHolder getTagFromCheckBox(View v) {
@ -512,12 +503,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
checkBoxView.invalidate(); checkBoxView.invalidate();
} }
private final Function<String, TagData> uuidToTag = new Function<String, TagData>() { private final Function<String, TagData> uuidToTag = tagMap::get;
@Override
public TagData apply(String input) {
return tagMap.get(input);
}
};
private final Ordering<TagData> orderByName = new Ordering<TagData>() { private final Ordering<TagData> orderByName = new Ordering<TagData>() {
@Override @Override
@ -542,18 +528,15 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
}; };
private Function<TagData, SpannableString> tagToString(final float maxLength) { private Function<TagData, SpannableString> tagToString(final float maxLength) {
return new Function<TagData, SpannableString>() { return tagData -> {
@Override String tagName = tagData.getName();
public SpannableString apply(TagData tagData) { tagName = tagName.substring(0, Math.min(tagName.length(), (int) maxLength));
String tagName = tagData.getName(); SpannableString string = new SpannableString(SPACE + tagName + SPACE);
tagName = tagName.substring(0, Math.min(tagName.length(), (int) maxLength)); int themeIndex = tagData.getColor();
SpannableString string = new SpannableString(SPACE + tagName + SPACE); ThemeColor color = themeIndex >= 0 ? themeCache.getThemeColor(themeIndex) : themeCache.getUntaggedColor();
int themeIndex = tagData.getColor(); string.setSpan(new BackgroundColorSpan(color.getPrimaryColor()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ThemeColor color = themeIndex >= 0 ? themeCache.getThemeColor(themeIndex) : themeCache.getUntaggedColor(); string.setSpan(new ForegroundColorSpan(color.getActionBarTint()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
string.setSpan(new BackgroundColorSpan(color.getPrimaryColor()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); return string;
string.setSpan(new ForegroundColorSpan(color.getActionBarTint()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
return string;
}
}; };
} }
@ -648,12 +631,9 @@ public class TaskAdapter extends CursorAdapter implements Filterable {
this.onCompletedTaskListener = newListener; this.onCompletedTaskListener = newListener;
} else { } else {
final OnCompletedTaskListener old = this.onCompletedTaskListener; final OnCompletedTaskListener old = this.onCompletedTaskListener;
this.onCompletedTaskListener = new OnCompletedTaskListener() { this.onCompletedTaskListener = (item, newState) -> {
@Override old.onCompletedTask(item, newState);
public void onCompletedTask(Task item, boolean newState) { newListener.onCompletedTask(item, newState);
old.onCompletedTask(item, newState);
newListener.onCompletedTask(item, newState);
}
}; };
} }
} }

@ -79,13 +79,10 @@ public class AlarmService {
metadata.add(item); metadata.add(item);
} }
boolean changed = synchronizeMetadata(taskId, metadata, new SynchronizeMetadataCallback() { boolean changed = synchronizeMetadata(taskId, metadata, m -> {
@Override // Cancel the alarm before the metadata is deleted
public void beforeDeleteMetadata(Metadata m) { PendingIntent pendingIntent = pendingIntentForAlarm(m, taskId);
// Cancel the alarm before the metadata is deleted alarmManager.cancel(pendingIntent);
PendingIntent pendingIntent = pendingIntentForAlarm(m, taskId);
alarmManager.cancel(pendingIntent);
}
}); });
if(changed) { if(changed) {
@ -113,24 +110,14 @@ public class AlarmService {
* Schedules all alarms * Schedules all alarms
*/ */
public void scheduleAllAlarms() { public void scheduleAllAlarms() {
getActiveAlarms(new Callback<Metadata>() { getActiveAlarms(this::scheduleAlarm);
@Override
public void apply(Metadata alarm) {
scheduleAlarm(alarm);
}
});
} }
/** /**
* Schedules alarms for a single task * Schedules alarms for a single task
*/ */
private void scheduleAlarms(long taskId) { private void scheduleAlarms(long taskId) {
getActiveAlarmsForTask(taskId, new Callback<Metadata>() { getActiveAlarmsForTask(taskId, this::scheduleAlarm);
@Override
public void apply(Metadata alarm) {
scheduleAlarm(alarm);
}
});
} }
private PendingIntent pendingIntentForAlarm(Metadata alarm, long taskId) { private PendingIntent pendingIntentForAlarm(Metadata alarm, long taskId) {
@ -181,27 +168,24 @@ public class AlarmService {
newMetadataValues.add(values); newMetadataValues.add(values);
} }
metadataDao.byTaskAndKey(taskId, AlarmFields.METADATA_KEY, new Callback<Metadata>() { metadataDao.byTaskAndKey(taskId, AlarmFields.METADATA_KEY, item -> {
@Override long id = item.getId();
public void apply(Metadata item) {
long id = item.getId(); // clear item id when matching with incoming values
item.clearValue(Metadata.ID);
// clear item id when matching with incoming values item.clearValue(Metadata.CREATION_DATE);
item.clearValue(Metadata.ID); ContentValues itemMergedValues = item.getMergedValues();
item.clearValue(Metadata.CREATION_DATE);
ContentValues itemMergedValues = item.getMergedValues(); if(newMetadataValues.contains(itemMergedValues)) {
newMetadataValues.remove(itemMergedValues);
if(newMetadataValues.contains(itemMergedValues)) { } else {
newMetadataValues.remove(itemMergedValues); // not matched. cut it
} else { item.setId(id);
// not matched. cut it if (callback != null) {
item.setId(id); callback.beforeDeleteMetadata(item);
if (callback != null) {
callback.beforeDeleteMetadata(item);
}
metadataDao.delete(id);
dirty[0] = true;
} }
metadataDao.delete(id);
dirty[0] = true;
} }
}); });

@ -43,12 +43,7 @@ public class AlarmTaskRepeatListener extends InjectingBroadcastReceiver {
} }
final Set<Long> alarms = new LinkedHashSet<>(); final Set<Long> alarms = new LinkedHashSet<>();
alarmService.getAlarms(taskId, new Callback<Metadata>() { alarmService.getAlarms(taskId, metadata -> alarms.add(metadata.getValue(AlarmFields.TIME) + (newDueDate - oldDueDate)));
@Override
public void apply(Metadata metadata) {
alarms.add(metadata.getValue(AlarmFields.TIME) + (newDueDate - oldDueDate));
}
});
if (!alarms.isEmpty()) { if (!alarms.isEmpty()) {
alarmService.synchronizeAlarms(taskId, alarms); alarmService.synchronizeAlarms(taskId, alarms);
} }

@ -79,12 +79,9 @@ public class TasksXmlExporter {
} }
private void setProgress(final int taskNumber, final int total) { private void setProgress(final int taskNumber, final int total) {
post(new Runnable() { post(() -> {
@Override progressDialog.setMax(total);
public void run() { progressDialog.setProgress(taskNumber);
progressDialog.setMax(total);
progressDialog.setProgress(taskNumber);
}
}); });
} }
@ -109,35 +106,29 @@ public class TasksXmlExporter {
this.progressDialog = new ProgressDialog(context); this.progressDialog = new ProgressDialog(context);
} }
new Thread(new Runnable() { new Thread(() -> {
@Override try {
public void run() { String output = setupFile(backupDirectory,
try { exportType);
String output = setupFile(backupDirectory, int tasks = taskService.countTasks();
exportType);
int tasks = taskService.countTasks();
if(tasks > 0) { if(tasks > 0) {
doTasksExport(output); doTasksExport(output);
} }
preferences.setLong(PREF_BACKUP_LAST_DATE, DateUtilities.now()); preferences.setLong(PREF_BACKUP_LAST_DATE, DateUtilities.now());
if (exportType == ExportType.EXPORT_TYPE_MANUAL) { if (exportType == ExportType.EXPORT_TYPE_MANUAL) {
onFinishExport(output); onFinishExport(output);
}
} catch (IOException e) {
Timber.e(e, e.getMessage());
} finally {
post(new Runnable() {
@Override
public void run() {
if(progressDialog.isShowing() && context instanceof Activity) {
DialogUtilities.dismissDialog((Activity) context, progressDialog);
}
}
});
} }
} catch (IOException e) {
Timber.e(e, e.getMessage());
} finally {
post(() -> {
if(progressDialog.isShowing() && context instanceof Activity) {
DialogUtilities.dismissDialog((Activity) context, progressDialog);
}
});
} }
}).start(); }).start();
} }
@ -169,16 +160,13 @@ public class TasksXmlExporter {
} }
private void serializeTagDatas() { private void serializeTagDatas() {
tagDataDao.allTags(new Callback<TagData>() { tagDataDao.allTags(tag -> {
@Override try {
public void apply(TagData tag) { xml.startTag(null, BackupConstants.TAGDATA_TAG);
try { serializeModel(tag, TagData.PROPERTIES, TagData.ID);
xml.startTag(null, BackupConstants.TAGDATA_TAG); xml.endTag(null, BackupConstants.TAGDATA_TAG);
serializeModel(tag, TagData.PROPERTIES, TagData.ID); } catch(IOException e) {
xml.endTag(null, BackupConstants.TAGDATA_TAG); throw new RuntimeException(e);
} catch(IOException e) {
throw new RuntimeException(e);
}
} }
}); });
} }
@ -207,16 +195,13 @@ public class TasksXmlExporter {
} }
private synchronized void serializeMetadata(Task task) { private synchronized void serializeMetadata(Task task) {
metadataDao.byTask(task.getId(), new Callback<Metadata>() { metadataDao.byTask(task.getId(), metadata -> {
@Override try {
public void apply(Metadata metadata) { xml.startTag(null, BackupConstants.METADATA_TAG);
try { serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK);
xml.startTag(null, BackupConstants.METADATA_TAG); xml.endTag(null, BackupConstants.METADATA_TAG);
serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK); } catch (IOException e) {
xml.endTag(null, BackupConstants.METADATA_TAG); throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
}); });
} }
@ -308,17 +293,14 @@ public class TasksXmlExporter {
} }
private void onFinishExport(final String outputFile) { private void onFinishExport(final String outputFile) {
post(new Runnable() { post(() -> {
@Override if(exportCount == 0) {
public void run() { Toast.makeText(context, context.getString(R.string.export_toast_no_tasks), Toast.LENGTH_LONG).show();
if(exportCount == 0) { } else {
Toast.makeText(context, context.getString(R.string.export_toast_no_tasks), Toast.LENGTH_LONG).show(); CharSequence text = String.format(context.getString(R.string.export_toast),
} else { context.getResources().getQuantityString(R.plurals.Ntasks, exportCount,
CharSequence text = String.format(context.getString(R.string.export_toast), exportCount), outputFile);
context.getResources().getQuantityString(R.plurals.Ntasks, exportCount, Toast.makeText(context, text, Toast.LENGTH_LONG).show();
exportCount), outputFile);
Toast.makeText(context, text, Toast.LENGTH_LONG).show();
}
} }
}); });
} }

@ -59,12 +59,7 @@ public class TasksXmlImporter {
private String input; private String input;
private void setProgressMessage(final String message) { private void setProgressMessage(final String message) {
handler.post(new Runnable() { handler.post(() -> progressDialog.setMessage(message));
@Override
public void run() {
progressDialog.setMessage(message);
}
});
} }
@Inject @Inject
@ -83,14 +78,11 @@ public class TasksXmlImporter {
handler = new Handler(); handler = new Handler();
new Thread(new Runnable() { new Thread(() -> {
@Override try {
public void run() { performImport();
try { } catch (IOException | XmlPullParserException e) {
performImport(); Timber.e(e, e.getMessage());
} catch (IOException | XmlPullParserException e) {
Timber.e(e, e.getMessage());
}
} }
}).start(); }).start();
} }
@ -126,13 +118,10 @@ public class TasksXmlImporter {
} finally { } finally {
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH); Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH);
activity.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); activity.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
handler.post(new Runnable() { handler.post(() -> {
@Override if(progressDialog.isShowing()) {
public void run() { DialogUtilities.dismissDialog(activity, progressDialog);
if(progressDialog.isShowing()) { showSummary();
DialogUtilities.dismissDialog(activity, progressDialog);
showSummary();
}
} }
}); });
} }
@ -148,12 +137,7 @@ public class TasksXmlImporter {
r.getQuantityString(R.plurals.Ntasks, importCount, importCount), r.getQuantityString(R.plurals.Ntasks, importCount, importCount),
r.getQuantityString(R.plurals.Ntasks, skipCount, skipCount), r.getQuantityString(R.plurals.Ntasks, skipCount, skipCount),
r.getQuantityString(R.plurals.Ntasks, errorCount, errorCount))) r.getQuantityString(R.plurals.Ntasks, errorCount, errorCount)))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, id) -> dialog.dismiss())
@Override
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
}
})
.show(); .show();
} }

@ -151,12 +151,7 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
toolbar.setTitle(R.string.FLA_new_filter); toolbar.setTitle(R.string.FLA_new_filter);
toolbar.inflateMenu(R.menu.menu_custom_filter_activity); toolbar.inflateMenu(R.menu.menu_custom_filter_activity);
toolbar.setOnMenuItemClickListener(this); toolbar.setOnMenuItemClickListener(this);
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(view -> discard());
@Override
public void onClick(View view) {
discard();
}
});
MenuColorizer.colorToolbar(this, toolbar); MenuColorizer.colorToolbar(this, toolbar);
listView = (ListView) findViewById(android.R.id.list); listView = (ListView) findViewById(android.R.id.list);
@ -186,30 +181,21 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
} }
private void setUpListeners() { private void setUpListeners() {
findViewById(R.id.add).setOnClickListener(new View.OnClickListener() { findViewById(R.id.add).setOnClickListener(v -> listView.showContextMenu());
@Override
public void onClick(View v) { listView.setOnCreateContextMenuListener((menu, v, menuInfo) -> {
listView.showContextMenu(); if(menu.hasVisibleItems()) {
/* If it has items already, then the user did not click on the "Add Criteria" button, but instead
long held on a row in the list view, which caused CustomFilterAdapter.onCreateContextMenu
to be invoked before this onCreateContextMenu method was invoked.
*/
return;
} }
});
listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { int i = 0;
@Override for (CustomFilterCriterion item : filterCriteriaProvider.getAll()) {
public void onCreateContextMenu(ContextMenu menu, View v, menu.add(CustomFilterActivity.MENU_GROUP_FILTER, i, 0, item.name);
ContextMenuInfo menuInfo) { i++;
if(menu.hasVisibleItems()) {
/* If it has items already, then the user did not click on the "Add Criteria" button, but instead
long held on a row in the list view, which caused CustomFilterAdapter.onCreateContextMenu
to be invoked before this onCreateContextMenu method was invoked.
*/
return;
}
int i = 0;
for (CustomFilterCriterion item : filterCriteriaProvider.getAll()) {
menu.add(CustomFilterActivity.MENU_GROUP_FILTER, i, 0, item.name);
i++;
}
} }
}); });
} }
@ -367,12 +353,7 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
finish(); finish();
} else { } else {
dialogBuilder.newMessageDialog(R.string.discard_changes) dialogBuilder.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.discard, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.discard, (dialog, which) -> finish())
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }
@ -385,12 +366,9 @@ public class CustomFilterActivity extends ThemedInjectingAppCompatActivity imple
CustomFilterCriterion criterion = filterCriteriaProvider.getAll().get(item.getItemId()); CustomFilterCriterion criterion = filterCriteriaProvider.getAll().get(item.getItemId());
final CriterionInstance instance = new CriterionInstance(); final CriterionInstance instance = new CriterionInstance();
instance.criterion = criterion; instance.criterion = criterion;
adapter.showOptionsFor(instance, new Runnable() { adapter.showOptionsFor(instance, () -> {
@Override adapter.add(instance);
public void run() { updateList();
adapter.add(instance);
updateList();
}
}); });
return true; return true;
} }

@ -60,12 +60,9 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
return; return;
} }
showOptionsFor(viewHolder.item, new Runnable() { showOptionsFor(viewHolder.item, () -> {
@Override activity.updateList();
public void run() { notifyDataSetInvalidated();
activity.updateList();
notifyDataSetInvalidated();
}
}); });
} }
}; };
@ -110,13 +107,10 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
if(item.criterion instanceof MultipleSelectCriterion) { if(item.criterion instanceof MultipleSelectCriterion) {
MultipleSelectCriterion multiSelectCriterion = (MultipleSelectCriterion) item.criterion; MultipleSelectCriterion multiSelectCriterion = (MultipleSelectCriterion) item.criterion;
final String[] titles = multiSelectCriterion.entryTitles; final String[] titles = multiSelectCriterion.entryTitles;
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { DialogInterface.OnClickListener listener = (click, which) -> {
@Override item.selectedIndex = which;
public void onClick(DialogInterface click, int which) { if(onComplete != null) {
item.selectedIndex = which; onComplete.run();
if(onComplete != null) {
onComplete.run();
}
} }
}; };
dialog.setItems(titles, listener); dialog.setItems(titles, listener);
@ -131,13 +125,10 @@ public class CustomFilterAdapter extends ArrayAdapter<CriterionInstance> {
FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT,
FrameLayout.LayoutParams.WRAP_CONTENT)); FrameLayout.LayoutParams.WRAP_CONTENT));
dialog.setView(frameLayout). dialog.setView(frameLayout).
setPositiveButton(android.R.string.ok, new OnClickListener() { setPositiveButton(android.R.string.ok, (dialogInterface, which) -> {
@Override item.selectedText = editText.getText().toString();
public void onClick(DialogInterface dialogInterface, int which) { if(onComplete != null) {
item.selectedText = editText.getText().toString(); onComplete.run();
if(onComplete != null) {
onComplete.run();
}
} }
}); });
} }

@ -36,12 +36,7 @@ public final class CustomFilterExposer {
} }
public List<Filter> getFilters() { public List<Filter> getFilters() {
return newArrayList(transform(storeObjectDao.getSavedFilters(), new Function<StoreObject, Filter>() { return newArrayList(transform(storeObjectDao.getSavedFilters(), this::load));
@Override
public Filter apply(StoreObject input) {
return load(input);
}
}));
} }
public Filter getFilter(long id) { public Filter getFilter(long id) {

@ -46,14 +46,11 @@ public class DefaultsPreferences extends InjectingPreferenceActivity {
addPreferencesFromResource(R.xml.preferences_defaults); addPreferencesFromResource(R.xml.preferences_defaults);
defaultCalendarPref = findPreference(getString(R.string.gcal_p_default)); defaultCalendarPref = findPreference(getString(R.string.gcal_p_default));
defaultCalendarPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { defaultCalendarPref.setOnPreferenceClickListener(preference -> {
@Override if (permissionRequester.requestCalendarPermissions()) {
public boolean onPreferenceClick(Preference preference) { startCalendarSelectionActivity();
if (permissionRequester.requestCalendarPermissions()) {
startCalendarSelectionActivity();
}
return false;
} }
return false;
}); });
setCalendarSummary(preferences.getStringValue(R.string.gcal_p_default)); setCalendarSummary(preferences.getStringValue(R.string.gcal_p_default));
} }

@ -5,9 +5,7 @@
*/ */
package com.todoroo.astrid.core; package com.todoroo.astrid.core;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.preference.Preference;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
@ -45,222 +43,181 @@ public class OldTaskPreferences extends InjectingPreferenceActivity {
addPreferencesFromResource(R.xml.preferences_oldtasks); addPreferencesFromResource(R.xml.preferences_oldtasks);
findPreference(getString(R.string.EPr_manage_purge_deleted)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.EPr_manage_purge_deleted)).setOnPreferenceClickListener(preference -> {
@Override purgeDeletedTasks();
public boolean onPreferenceClick(Preference preference) { return false;
purgeDeletedTasks();
return false;
}
}); });
findPreference(getString(R.string.EPr_manage_delete_completed)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.EPr_manage_delete_completed)).setOnPreferenceClickListener(preference -> {
@Override deleteCompletedTasks();
public boolean onPreferenceClick(Preference preference) { return false;
deleteCompletedTasks();
return false;
}
}); });
findPreference(getString(R.string.EPr_manage_delete_completed_gcal)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.EPr_manage_delete_completed_gcal)).setOnPreferenceClickListener(preference -> {
@Override deleteCompletedEvents();
public boolean onPreferenceClick(Preference preference) { return false;
deleteCompletedEvents();
return false;
}
}); });
findPreference(getString(R.string.EPr_manage_delete_all_gcal)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.EPr_manage_delete_all_gcal)).setOnPreferenceClickListener(preference -> {
@Override deleteAllCalendarEvents();
public boolean onPreferenceClick(Preference preference) { return false;
deleteAllCalendarEvents();
return false;
}
}); });
findPreference(getString(R.string.EPr_reset_preferences)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.EPr_reset_preferences)).setOnPreferenceClickListener(preference -> {
@Override resetPreferences();
public boolean onPreferenceClick(Preference preference) { return false;
resetPreferences();
return false;
}
}); });
findPreference(getString(R.string.EPr_delete_task_data)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.EPr_delete_task_data)).setOnPreferenceClickListener(preference -> {
@Override deleteTaskData();
public boolean onPreferenceClick(Preference preference) { return false;
deleteTaskData();
return false;
}
}); });
} }
private void deleteCompletedTasks() { private void deleteCompletedTasks() {
dialogBuilder.newMessageDialog(R.string.EPr_manage_delete_completed_message) dialogBuilder.newMessageDialog(R.string.EPr_manage_delete_completed_message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, which) -> new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) {
@Override @Override
public void onClick(DialogInterface dialog, int which) { protected Integer doInBackground(Void... params) {
new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) { TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where(
@Override Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull())));
protected Integer doInBackground(Void... params) { try {
TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where( int length = cursor.getCount();
Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()))); for (int i = 0; i < length; i++) {
try { cursor.moveToNext();
int length = cursor.getCount(); Task task = new Task(cursor);
for (int i = 0; i < length; i++) { gcalHelper.deleteTaskEvent(task);
cursor.moveToNext();
Task task = new Task(cursor);
gcalHelper.deleteTaskEvent(task);
}
} finally {
cursor.close();
}
Task template = new Task();
template.setDeletionDate(DateUtilities.now());
return taskService.update(Task.COMPLETION_DATE.gt(0), template);
} }
} finally {
cursor.close();
}
Task template = new Task();
template.setDeletionDate(DateUtilities.now());
return taskService.update(Task.COMPLETION_DATE.gt(0), template);
}
@Override @Override
protected int getResultResource() { protected int getResultResource() {
return R.string.EPr_manage_delete_completed_status; return R.string.EPr_manage_delete_completed_status;
}
}.execute();
} }
}) }.execute())
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }
private void purgeDeletedTasks() { private void purgeDeletedTasks() {
dialogBuilder.newMessageDialog(R.string.EPr_manage_purge_deleted_message) dialogBuilder.newMessageDialog(R.string.EPr_manage_purge_deleted_message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, which) -> new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) {
@Override @Override
public void onClick(DialogInterface dialog, int which) { protected Integer doInBackground(Void... params) {
new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) { TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.TITLE, Task.CALENDAR_URI).where(
@Override Criterion.and(Task.DELETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull())));
protected Integer doInBackground(Void... params) { try {
TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.TITLE, Task.CALENDAR_URI).where( int length = cursor.getCount();
Criterion.and(Task.DELETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()))); for (int i = 0; i < length; i++) {
try { cursor.moveToNext();
int length = cursor.getCount(); Task task = new Task(cursor);
for (int i = 0; i < length; i++) { gcalHelper.deleteTaskEvent(task);
cursor.moveToNext();
Task task = new Task(cursor);
gcalHelper.deleteTaskEvent(task);
}
} finally {
cursor.close();
}
int result = taskDeleter.purgeDeletedTasks();
metadataDao.removeDanglingMetadata();
return result;
} }
} finally {
cursor.close();
}
int result = taskDeleter.purgeDeletedTasks();
metadataDao.removeDanglingMetadata();
return result;
}
@Override @Override
protected int getResultResource() { protected int getResultResource() {
return R.string.EPr_manage_purge_deleted_status; return R.string.EPr_manage_purge_deleted_status;
}
}.execute();
} }
}) }.execute())
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }
private void deleteCompletedEvents() { private void deleteCompletedEvents() {
dialogBuilder.newMessageDialog(R.string.EPr_manage_delete_completed_gcal_message) dialogBuilder.newMessageDialog(R.string.EPr_manage_delete_completed_gcal_message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, which) -> new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) {
@Override
public void onClick(DialogInterface dialog, int which) {
new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) {
@Override @Override
protected Integer doInBackground(Void... params) { protected Integer doInBackground(Void... params) {
int deletedEventCount = 0; int deletedEventCount = 0;
TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where( TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where(
Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()))); Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull())));
try { try {
int length = cursor.getCount(); int length = cursor.getCount();
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
cursor.moveToNext(); cursor.moveToNext();
Task task = new Task(cursor); Task task = new Task(cursor);
if (gcalHelper.deleteTaskEvent(task)) { if (gcalHelper.deleteTaskEvent(task)) {
deletedEventCount++; deletedEventCount++;
}
}
} finally {
cursor.close();
} }
// mass update the CALENDAR_URI here,
// since the GCalHelper doesnt save it due to performance-reasons
Task template = new Task();
template.setCalendarUri(""); //$NON-NLS-1$
taskService.update(
Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()),
template);
return deletedEventCount;
} }
} finally {
cursor.close();
}
// mass update the CALENDAR_URI here,
// since the GCalHelper doesnt save it due to performance-reasons
Task template = new Task();
template.setCalendarUri(""); //$NON-NLS-1$
taskService.update(
Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()),
template);
return deletedEventCount;
}
@Override @Override
protected int getResultResource() { protected int getResultResource() {
return R.string.EPr_manage_delete_completed_gcal_status; return R.string.EPr_manage_delete_completed_gcal_status;
}
}.execute();
} }
}) }.execute())
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }
private void deleteAllCalendarEvents() { private void deleteAllCalendarEvents() {
dialogBuilder.newMessageDialog(R.string.EPr_manage_delete_all_gcal_message) dialogBuilder.newMessageDialog(R.string.EPr_manage_delete_all_gcal_message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog, which) -> new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) {
@Override @Override
public void onClick(DialogInterface dialog, int which) { protected Integer doInBackground(Void... params) {
new ProgressDialogAsyncTask(OldTaskPreferences.this, dialogBuilder) { int deletedEventCount = 0;
@Override TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where(
protected Integer doInBackground(Void... params) { Task.CALENDAR_URI.isNotNull()));
int deletedEventCount = 0; try {
TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where( int length = cursor.getCount();
Task.CALENDAR_URI.isNotNull())); for (int i = 0; i < length; i++) {
try { cursor.moveToNext();
int length = cursor.getCount(); Task task = new Task(cursor);
for (int i = 0; i < length; i++) { if (gcalHelper.deleteTaskEvent(task)) {
cursor.moveToNext(); deletedEventCount++;
Task task = new Task(cursor);
if (gcalHelper.deleteTaskEvent(task)) {
deletedEventCount++;
}
}
} finally {
cursor.close();
} }
// mass update the CALENDAR_URI here,
// since the GCalHelper doesnt save it due to performance-reasons
Task template = new Task();
template.setCalendarUri(""); //$NON-NLS-1$
taskService.update(Task.CALENDAR_URI.isNotNull(), template);
return deletedEventCount;
} }
} finally {
cursor.close();
}
// mass update the CALENDAR_URI here,
// since the GCalHelper doesnt save it due to performance-reasons
Task template = new Task();
template.setCalendarUri(""); //$NON-NLS-1$
taskService.update(Task.CALENDAR_URI.isNotNull(), template);
return deletedEventCount;
}
@Override @Override
protected int getResultResource() { protected int getResultResource() {
return R.string.EPr_manage_delete_all_gcal_status; return R.string.EPr_manage_delete_all_gcal_status;
}
}.execute();
} }
}) }.execute())
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }
private void resetPreferences() { private void resetPreferences() {
dialogBuilder.newMessageDialog(R.string.EPr_reset_preferences_warning) dialogBuilder.newMessageDialog(R.string.EPr_reset_preferences_warning)
.setPositiveButton(R.string.EPr_reset_preferences, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.EPr_reset_preferences, (dialog, which) -> {
@Override preferences.reset();
public void onClick(DialogInterface dialog, int which) { System.exit(0);
preferences.reset();
System.exit(0);
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
@ -268,12 +225,9 @@ public class OldTaskPreferences extends InjectingPreferenceActivity {
private void deleteTaskData() { private void deleteTaskData() {
dialogBuilder.newMessageDialog(R.string.EPr_delete_task_data_warning) dialogBuilder.newMessageDialog(R.string.EPr_delete_task_data_warning)
.setPositiveButton(R.string.EPr_delete_task_data, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.EPr_delete_task_data, (dialog, which) -> {
@Override deleteDatabase(database.getName());
public void onClick(DialogInterface dialog, int which) { System.exit(0);
deleteDatabase(database.getName());
System.exit(0);
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();

@ -55,12 +55,7 @@ public class StoreObjectDao {
} }
public List<GtasksList> getGtasksLists() { public List<GtasksList> getGtasksLists() {
return newArrayList(transform(getByType(GtasksList.TYPE), new Function<StoreObject, GtasksList>() { return newArrayList(transform(getByType(GtasksList.TYPE), GtasksList::new));
@Override
public GtasksList apply(StoreObject input) {
return new GtasksList(input);
}
}));
} }
public boolean persist(StoreObject storeObject) { public boolean persist(StoreObject storeObject) {

@ -78,12 +78,9 @@ public class FilesControlSet extends TaskEditControlFragment {
} }
final List<TaskAttachment> files = new ArrayList<>(); final List<TaskAttachment> files = new ArrayList<>();
taskAttachmentDao.getAttachments(taskUuid, new Callback<TaskAttachment>() { taskAttachmentDao.getAttachments(taskUuid, attachment -> {
@Override files.add(attachment);
public void apply(TaskAttachment attachment) { addAttachment(attachment);
files.add(attachment);
addAttachment(attachment);
}
}); });
validateFiles(files); validateFiles(files);
return view; return view;
@ -151,32 +148,19 @@ public class FilesControlSet extends TaskEditControlFragment {
TextView nameView = (TextView) fileRow.findViewById(R.id.file_text); TextView nameView = (TextView) fileRow.findViewById(R.id.file_text);
String name = LEFT_TO_RIGHT_MARK + taskAttachment.getName(); String name = LEFT_TO_RIGHT_MARK + taskAttachment.getName();
nameView.setText(name); nameView.setText(name);
nameView.setOnClickListener(new OnClickListener() { nameView.setOnClickListener(v -> showFile(taskAttachment));
@Override
public void onClick(View v) {
showFile(taskAttachment);
}
});
View clearFile = fileRow.findViewById(R.id.clear); View clearFile = fileRow.findViewById(R.id.clear);
clearFile.setOnClickListener(new OnClickListener() { clearFile.setOnClickListener(v -> dialogBuilder.newMessageDialog(R.string.premium_remove_file_confirm)
@Override .setPositiveButton(android.R.string.ok, (dialog, which) -> {
public void onClick(View v) { taskAttachmentDao.delete(taskAttachment.getId());
dialogBuilder.newMessageDialog(R.string.premium_remove_file_confirm) if (taskAttachment.containsNonNullValue(TaskAttachment.FILE_PATH)) {
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { File f = new File(taskAttachment.getFilePath());
@Override f.delete();
public void onClick(DialogInterface dialog, int which) { }
taskAttachmentDao.delete(taskAttachment.getId()); attachmentContainer.removeView(fileRow);
if (taskAttachment.containsNonNullValue(TaskAttachment.FILE_PATH)) { })
File f = new File(taskAttachment.getFilePath()); .setNegativeButton(android.R.string.cancel, null)
f.delete(); .show());
}
attachmentContainer.removeView(fileRow);
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
});
} }
private void validateFiles(List<TaskAttachment> files) { private void validateFiles(List<TaskAttachment> files) {
@ -226,12 +210,7 @@ public class FilesControlSet extends TaskEditControlFragment {
final String filePath = m.getFilePath(); final String filePath = m.getFilePath();
if (fileType.startsWith(TaskAttachment.FILE_TYPE_AUDIO)) { if (fileType.startsWith(TaskAttachment.FILE_TYPE_AUDIO)) {
play(m.getFilePath(), new PlaybackExceptionHandler() { play(m.getFilePath(), () -> showFromIntent(filePath, fileType));
@Override
public void playbackFailed() {
showFromIntent(filePath, fileType);
}
});
} else if (fileType.startsWith(TaskAttachment.FILE_TYPE_IMAGE)) { } else if (fileType.startsWith(TaskAttachment.FILE_TYPE_IMAGE)) {
try { try {
Intent intent = new Intent(Intent.ACTION_VIEW); Intent intent = new Intent(Intent.ACTION_VIEW);

@ -4,7 +4,6 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import com.google.common.base.Predicate;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
@ -104,11 +103,6 @@ public class CalendarAlarmReceiver extends InjectingBroadcastReceiver {
return false; return false;
} }
final List<String> myAccounts = accountManager.getAccounts(); final List<String> myAccounts = accountManager.getAccounts();
return any(attendees, new Predicate<AndroidCalendarEventAttendee>() { return any(attendees, attendee -> myAccounts.contains(attendee.getEmail()));
@Override
public boolean apply(AndroidCalendarEventAttendee attendee) {
return myAccounts.contains(attendee.getEmail());
}
});
} }
} }

@ -54,12 +54,7 @@ public class CalendarReminderActivity extends ThemedInjectingAppCompatActivity {
private View dismissButton; private View dismissButton;
private View ignoreSettingsButton; private View ignoreSettingsButton;
private final OnClickListener dismissListener = new OnClickListener() { private final OnClickListener dismissListener = v -> finish();
@Override
public void onClick(View v) {
finish();
}
};
private final OnClickListener ignoreListener = new OnClickListener() { private final OnClickListener ignoreListener = new OnClickListener() {
@Override @Override
@ -69,19 +64,11 @@ public class CalendarReminderActivity extends ThemedInjectingAppCompatActivity {
ignorePresses++; ignorePresses++;
if (ignorePresses == IGNORE_PROMPT_COUNT) { if (ignorePresses == IGNORE_PROMPT_COUNT) {
dialogBuilder.newMessageDialog(R.string.CRA_ignore_body) dialogBuilder.newMessageDialog(R.string.CRA_ignore_body)
.setPositiveButton(R.string.CRA_ignore_all, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.CRA_ignore_all, (dialog, which) -> {
@Override preferences.setBoolean(R.string.p_calendar_reminders, false);
public void onClick(DialogInterface dialog, int which) { dismissListener.onClick(v);
preferences.setBoolean(R.string.p_calendar_reminders, false);
dismissListener.onClick(v);
}
})
.setNegativeButton(R.string.CRA_ignore_this, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismissListener.onClick(v);
}
}) })
.setNegativeButton(R.string.CRA_ignore_this, (dialog, which) -> dismissListener.onClick(v))
.show(); .show();
} else { } else {
dismissListener.onClick(v); dismissListener.onClick(v);
@ -143,30 +130,17 @@ public class CalendarReminderActivity extends ThemedInjectingAppCompatActivity {
ignoreButton.setOnClickListener(ignoreListener); ignoreButton.setOnClickListener(ignoreListener);
dismissButton.setOnClickListener(dismissListener); dismissButton.setOnClickListener(dismissListener);
ignoreSettingsButton.setOnClickListener(new OnClickListener() { ignoreSettingsButton.setOnClickListener(v -> {
@Override Intent editPreferences = new Intent(CalendarReminderActivity.this, BasicPreferences.class);
public void onClick(View v) { startActivity(editPreferences);
Intent editPreferences = new Intent(CalendarReminderActivity.this, BasicPreferences.class); dismissListener.onClick(v);
startActivity(editPreferences);
dismissListener.onClick(v);
}
}); });
if (!fromPostpone) { if (!fromPostpone) {
postponeButton.setOnClickListener(new OnClickListener() { postponeButton.setOnClickListener(v -> postpone());
@Override
public void onClick(View v) {
postpone();
}
});
} }
createListButton.setOnClickListener(new OnClickListener() { createListButton.setOnClickListener(v -> createNewList(getString(R.string.CRA_default_list_name, eventName)));
@Override
public void onClick(View v) {
createNewList(getString(R.string.CRA_default_list_name, eventName));
}
});
} }
private void createNewList(final String name) { private void createNewList(final String name) {

@ -72,30 +72,17 @@ public class CommentsController {
items.clear(); items.clear();
commentsContainer.removeAllViews(); commentsContainer.removeAllViews();
metadataDao.byTaskAndKey(task.getId(), NoteMetadata.METADATA_KEY, new Callback<Metadata>() { metadataDao.byTaskAndKey(task.getId(), NoteMetadata.METADATA_KEY, metadata -> items.add(NoteOrUpdate.fromMetadata(metadata)));
@Override
public void apply(Metadata metadata) {
items.add(NoteOrUpdate.fromMetadata(metadata));
}
});
userActivityDao.getCommentsForTask(task.getUuid(), new Callback<UserActivity>() { userActivityDao.getCommentsForTask(task.getUuid(), update -> items.add(NoteOrUpdate.fromUpdate(update)));
@Override
public void apply(UserActivity update) {
items.add(NoteOrUpdate.fromUpdate(update));
}
});
Collections.sort(items, new Comparator<NoteOrUpdate>() { Collections.sort(items, (a, b) -> {
@Override if (a.createdAt < b.createdAt) {
public int compare(NoteOrUpdate a, NoteOrUpdate b) { return 1;
if (a.createdAt < b.createdAt) { } else if (a.createdAt == b.createdAt) {
return 1; return 0;
} else if (a.createdAt == b.createdAt) { } else {
return 0; return -1;
} else {
return -1;
}
} }
}); });
@ -109,13 +96,10 @@ public class CommentsController {
loadMore.setText(R.string.TEA_load_more); loadMore.setText(R.string.TEA_load_more);
loadMore.setTextColor(activity.getResources().getColor(R.color.task_edit_deadline_gray)); loadMore.setTextColor(activity.getResources().getColor(R.color.task_edit_deadline_gray));
loadMore.setBackgroundColor(Color.alpha(0)); loadMore.setBackgroundColor(Color.alpha(0));
loadMore.setOnClickListener(new View.OnClickListener() { loadMore.setOnClickListener(v -> {
@Override // Perform action on click
public void onClick(View v) { commentItems += 10;
// Perform action on click reloadView();
commentItems += 10;
reloadView();
}
}); });
commentsContainer.addView(loadMore); commentsContainer.addView(loadMore);
} }
@ -155,14 +139,9 @@ public class CommentsController {
String path = getPathFromUri(activity, updateBitmap); String path = getPathFromUri(activity, updateBitmap);
commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height)); commentPictureView.setImageBitmap(sampleBitmap(path, commentPictureView.getLayoutParams().width, commentPictureView.getLayoutParams().height));
view.setOnClickListener(new View.OnClickListener() { view.setOnClickListener(v -> activity.startActivity(new Intent(Intent.ACTION_VIEW) {{
@Override setDataAndType(updateBitmap, "image/*");
public void onClick(View v) { }}));
activity.startActivity(new Intent(Intent.ACTION_VIEW) {{
setDataAndType(updateBitmap, "image/*");
}});
}
});
} else { } else {
commentPictureView.setVisibility(View.GONE); commentPictureView.setVisibility(View.GONE);
} }

@ -72,12 +72,7 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
R.string.p_geofence_responsiveness); R.string.p_geofence_responsiveness);
fieldMissedCalls = (CheckBoxPreference) findPreference(getString(R.string.p_field_missed_calls)); fieldMissedCalls = (CheckBoxPreference) findPreference(getString(R.string.p_field_missed_calls));
fieldMissedCalls.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { fieldMissedCalls.setOnPreferenceChangeListener((preference, newValue) -> newValue != null && (!(boolean) newValue || permissionRequestor.requestMissedCallPermissions()));
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
return newValue != null && (!(boolean) newValue || permissionRequestor.requestMissedCallPermissions());
}
});
fieldMissedCalls.setChecked(fieldMissedCalls.isChecked() && permissionChecker.canAccessMissedCallPermissions()); fieldMissedCalls.setChecked(fieldMissedCalls.isChecked() && permissionChecker.canAccessMissedCallPermissions());
initializeRingtonePreference(); initializeRingtonePreference();
@ -85,14 +80,11 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
initializeTimePreference(getQuietStartPreference(), REQUEST_QUIET_START); initializeTimePreference(getQuietStartPreference(), REQUEST_QUIET_START);
initializeTimePreference(getQuietEndPreference(), REQUEST_QUIET_END); initializeTimePreference(getQuietEndPreference(), REQUEST_QUIET_END);
findPreference(getString(R.string.p_led_color)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.p_led_color)).setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(ReminderPreferences.this, ColorPickerActivity.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.LED);
startActivityForResult(new Intent(ReminderPreferences.this, ColorPickerActivity.class) {{ }}, REQUEST_LED_PICKER);
putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.LED); return false;
}}, REQUEST_LED_PICKER);
return false;
}
}); });
requires(atLeastJellybean(), R.string.p_rmd_notif_actions_enabled, R.string.p_notification_priority); requires(atLeastJellybean(), R.string.p_rmd_notif_actions_enabled, R.string.p_notification_priority);
@ -104,24 +96,18 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
private void rescheduleNotificationsOnChange(int... resIds) { private void rescheduleNotificationsOnChange(int... resIds) {
for (int resId : resIds) { for (int resId : resIds) {
findPreference(getString(resId)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(resId)).setOnPreferenceChangeListener((preference, newValue) -> {
@Override startService(new Intent(ReminderPreferences.this, ReminderSchedulerIntentService.class));
public boolean onPreferenceChange(Preference preference, Object newValue) { return true;
startService(new Intent(ReminderPreferences.this, ReminderSchedulerIntentService.class));
return true;
}
}); });
} }
} }
private void resetGeofencesOnChange(int... resIds) { private void resetGeofencesOnChange(int... resIds) {
for (int resId : resIds) { for (int resId : resIds) {
findPreference(getString(resId)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(resId)).setOnPreferenceChangeListener((preference, newValue) -> {
@Override startService(new Intent(ReminderPreferences.this, GeofenceSchedulingIntentService.class));
public boolean onPreferenceChange(Preference preference, Object newValue) { return true;
startService(new Intent(ReminderPreferences.this, GeofenceSchedulingIntentService.class));
return true;
}
}); });
} }
} }
@ -141,32 +127,26 @@ public class ReminderPreferences extends InjectingPreferenceActivity {
} }
private void initializeTimePreference(final TimePreference preference, final int requestCode) { private void initializeTimePreference(final TimePreference preference, final int requestCode) {
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { preference.setOnPreferenceClickListener(ignored -> {
@Override final DateTime current = new DateTime().withMillisOfDay(preference.getMillisOfDay());
public boolean onPreferenceClick(Preference ignored) { startActivityForResult(new Intent(ReminderPreferences.this, TimePickerActivity.class) {{
final DateTime current = new DateTime().withMillisOfDay(preference.getMillisOfDay()); putExtra(TimePickerActivity.EXTRA_TIMESTAMP, current.getMillis());
startActivityForResult(new Intent(ReminderPreferences.this, TimePickerActivity.class) {{ }}, requestCode);
putExtra(TimePickerActivity.EXTRA_TIMESTAMP, current.getMillis()); return true;
}}, requestCode);
return true;
}
}); });
} }
private void initializeRingtonePreference() { private void initializeRingtonePreference() {
Preference.OnPreferenceChangeListener ringtoneChangedListener = new Preference.OnPreferenceChangeListener() { Preference.OnPreferenceChangeListener ringtoneChangedListener = (preference, value) -> {
@Override if ("".equals(value)) {
public boolean onPreferenceChange(Preference preference, Object value) { preference.setSummary(R.string.silent);
if ("".equals(value)) { } else {
preference.setSummary(R.string.silent); Ringtone ringtone = RingtoneManager.getRingtone(ReminderPreferences.this, value == null
} else { ? RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_NOTIFICATION)
Ringtone ringtone = RingtoneManager.getRingtone(ReminderPreferences.this, value == null : Uri.parse((String) value));
? RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_NOTIFICATION) preference.setSummary(ringtone == null ? "" : ringtone.getTitle(ReminderPreferences.this));
: Uri.parse((String) value));
preference.setSummary(ringtone == null ? "" : ringtone.getTitle(ReminderPreferences.this));
}
return true;
} }
return true;
}; };
String ringtoneKey = getString(R.string.p_rmd_ringtone); String ringtoneKey = getString(R.string.p_rmd_ringtone);

@ -165,12 +165,7 @@ public class RepeatControlSet extends TaskEditControlFragment {
for(int i = 0; i < 7; i++) { for(int i = 0; i < 7; i++) {
final int index = i; final int index = i;
CheckBox checkBox = (CheckBox) daysOfWeekContainer.getChildAt(i); CheckBox checkBox = (CheckBox) daysOfWeekContainer.getChildAt(i);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { checkBox.setOnCheckedChangeListener((buttonView, isChecked1) -> RepeatControlSet.this.isChecked[index] = isChecked1);
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
RepeatControlSet.this.isChecked[index] = isChecked;
}
});
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
checkBox.setText(dfs.getShortWeekdays()[dayOfWeek].substring(0, 1)); checkBox.setText(dfs.getShortWeekdays()[dayOfWeek].substring(0, 1));
daysOfWeek[i] = checkBox; daysOfWeek[i] = checkBox;
@ -179,12 +174,7 @@ public class RepeatControlSet extends TaskEditControlFragment {
} }
// set up listeners // set up listeners
value.setOnClickListener(new View.OnClickListener() { value.setOnClickListener(v -> repeatValueClick());
@Override
public void onClick(View v) {
repeatValueClick();
}
});
setRepeatValue(1); setRepeatValue(1);
interval.setOnItemSelectedListener(new OnItemSelectedListener() { interval.setOnItemSelectedListener(new OnItemSelectedListener() {
@ -316,22 +306,14 @@ public class RepeatControlSet extends TaskEditControlFragment {
private AlertDialog buildDialog() { private AlertDialog buildDialog() {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setView(dialogView) .setView(dialogView)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog12, which) -> {
@Override doRepeat = true;
public void onClick(DialogInterface dialog, int which) {
doRepeat = true;
callback.repeatChanged(doRepeat); callback.repeatChanged(doRepeat);
refreshDisplayView(); refreshDisplayView();
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
refreshDisplayView();
}
}) })
.setOnCancelListener(dialog1 -> refreshDisplayView())
.create(); .create();
} }
@ -438,12 +420,7 @@ public class RepeatControlSet extends TaskEditControlFragment {
dialogValue = 1; dialogValue = 1;
} }
NumberPickerDialog dialog = new NumberPickerDialog(theme.getThemedDialog(getActivity()), new OnNumberPickedListener() { NumberPickerDialog dialog = new NumberPickerDialog(theme.getThemedDialog(getActivity()), this::setRepeatValue, getResources().getString(R.string.repeat_interval_prompt),
@Override
public void onNumberPicked(int number) {
setRepeatValue(number);
}
}, getResources().getString(R.string.repeat_interval_prompt),
dialogValue, 1, 1, 365); dialogValue, 1, 1, 365);
theme.applyToContext(dialog.getContext()); theme.applyToContext(dialog.getContext());
dialog.show(); dialog.show();

@ -169,13 +169,7 @@ public class RepeatTaskCompleteListener extends InjectingBroadcastReceiver {
} }
} }
private static Comparator<WeekdayNum> weekdayCompare = new Comparator<WeekdayNum>() { private static Comparator<WeekdayNum> weekdayCompare = (object1, object2) -> object1.wday.javaDayNum - object2.wday.javaDayNum;
@Override
public int compare(WeekdayNum object1, WeekdayNum object2) {
return object1.wday.javaDayNum - object2.wday.javaDayNum;
}
};
private static WeekdayNum findNextWeekday(List<WeekdayNum> byDay, DateTime date) { private static WeekdayNum findNextWeekday(List<WeekdayNum> byDay, DateTime date) {
WeekdayNum next = byDay.get(0); WeekdayNum next = byDay.get(0);

@ -76,11 +76,8 @@ public class StartupService {
} }
// perform startup activities in a background thread // perform startup activities in a background thread
new Thread(new Runnable() { new Thread(() -> {
@Override taskDeleter.deleteTasksWithEmptyTitles(null);
public void run() {
taskDeleter.deleteTasksWithEmptyTitles(null);
}
}).start(); }).start();
if (lastVersion == 0) { if (lastVersion == 0) {

@ -187,12 +187,7 @@ public class AstridOrderedListFragmentHelper<LIST> implements OrderedListFragmen
taskAdapter = new DraggableTaskAdapter(context, preferences, fragment, cursor, taskAdapter = new DraggableTaskAdapter(context, preferences, fragment, cursor,
sqlQueryTemplate, dialogBuilder, checkBoxes, tagService, themeCache); sqlQueryTemplate, dialogBuilder, checkBoxes, tagService, themeCache);
taskAdapter.addOnCompletedTaskListener(new OnCompletedTaskListener() { taskAdapter.addOnCompletedTaskListener(this::setCompletedForItemAndSubtasks);
@Override
public void onCompletedTask(Task item, boolean newState) {
setCompletedForItemAndSubtasks(item, newState);
}
});
return taskAdapter; return taskAdapter;
} }
@ -238,15 +233,12 @@ public class AstridOrderedListFragmentHelper<LIST> implements OrderedListFragmen
} }
final ArrayList<String> chained = new ArrayList<>(); final ArrayList<String> chained = new ArrayList<>();
updater.applyToDescendants(itemId, new AstridOrderedListUpdater.OrderedListNodeVisitor() { updater.applyToDescendants(itemId, node -> {
@Override String uuid = node.uuid;
public void visitNode(AstridOrderedListUpdater.Node node) { model.setCompletionDate(completionDate);
String uuid = node.uuid; taskService.update(Task.UUID.eq(uuid), model);
model.setCompletionDate(completionDate); model.clear();
taskService.update(Task.UUID.eq(uuid), model); chained.add(node.uuid);
model.clear();
chained.add(node.uuid);
}
}); });
if(chained.size() > 0) { if(chained.size() > 0) {

@ -65,12 +65,7 @@ public abstract class AstridOrderedListUpdater<LIST> {
public void initializeFromSerializedTree(LIST list, Filter filter, String serializedTree) { public void initializeFromSerializedTree(LIST list, Filter filter, String serializedTree) {
idToNode.clear(); idToNode.clear();
treeRoot = buildTreeModel(serializedTree, new JSONTreeModelBuilder() { treeRoot = buildTreeModel(serializedTree, node -> idToNode.put(node.uuid, node));
@Override
public void afterAddNode(Node node) {
idToNode.put(node.uuid, node);
}
});
verifyTreeModel(list, filter); verifyTreeModel(list, filter);
} }

@ -156,17 +156,14 @@ public class SubtasksHelper {
} }
private static void remapLocalTreeToRemote(Node root, HashMap<Long, String> idMap) { private static void remapLocalTreeToRemote(Node root, HashMap<Long, String> idMap) {
remapTree(root, idMap, new TreeRemapHelper<Long>() { remapTree(root, idMap, uuid -> {
@Override Long localId = -1L;
public Long getKeyFromOldUuid(String uuid) { try {
Long localId = -1L; localId = Long.parseLong(uuid);
try { } catch (NumberFormatException e) {
localId = Long.parseLong(uuid); Timber.e(e, e.getMessage());
} catch (NumberFormatException e) {
Timber.e(e, e.getMessage());
}
return localId;
} }
return localId;
}); });
} }

@ -72,13 +72,10 @@ public final class TagService {
MetadataCriteria.withKey(TaskToTagMetadata.KEY))). MetadataCriteria.withKey(TaskToTagMetadata.KEY))).
orderBy(order).groupBy(TaskToTagMetadata.TAG_NAME); orderBy(order).groupBy(TaskToTagMetadata.TAG_NAME);
final List<TagData> array = new ArrayList<>(); final List<TagData> array = new ArrayList<>();
metadataDao.query(query, new Callback<Metadata>() { metadataDao.query(query, metadata -> {
@Override TagData tag = tagFromUUID(metadata.getValue(TaskToTagMetadata.TAG_UUID));
public void apply(Metadata metadata) { if (tag != null) {
TagData tag = tagFromUUID(metadata.getValue(TaskToTagMetadata.TAG_UUID)); array.add(tag);
if (tag != null) {
array.add(tag);
}
} }
}); });
return array.toArray(new TagData[array.size()]); return array.toArray(new TagData[array.size()]);
@ -94,12 +91,7 @@ public final class TagService {
MetadataCriteria.withKey(TaskToTagMetadata.KEY), MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Metadata.DELETION_DATE.eq(0), Metadata.DELETION_DATE.eq(0),
TaskToTagMetadata.TASK_UUID.eq(uuid)))); TaskToTagMetadata.TASK_UUID.eq(uuid))));
return newArrayList(Iterables.transform(tags, new Function<Metadata, TagData>() { return newArrayList(Iterables.transform(tags, metadata -> tagFromUUID(metadata.getValue(TaskToTagMetadata.TAG_UUID))));
@Override
public TagData apply(Metadata metadata) {
return tagFromUUID(metadata.getValue(TaskToTagMetadata.TAG_UUID));
}
}));
} }
public ArrayList<TagData> getTagDataForTask(long taskId) { public ArrayList<TagData> getTagDataForTask(long taskId) {
@ -108,12 +100,7 @@ public final class TagService {
MetadataCriteria.withKey(TaskToTagMetadata.KEY), MetadataCriteria.withKey(TaskToTagMetadata.KEY),
Metadata.DELETION_DATE.eq(0), Metadata.DELETION_DATE.eq(0),
MetadataCriteria.byTask(taskId)))); MetadataCriteria.byTask(taskId))));
return newArrayList(transform(tags, new Function<Metadata, TagData>() { return newArrayList(transform(tags, metadata -> tagFromUUID(metadata.getValue(TaskToTagMetadata.TAG_UUID))));
@Override
public TagData apply(Metadata metadata) {
return tagFromUUID(metadata.getValue(TaskToTagMetadata.TAG_UUID));
}
}));
} }
public ArrayList<String> getTagNames(long taskId) { public ArrayList<String> getTagNames(long taskId) {
@ -124,11 +111,8 @@ public final class TagService {
MetadataCriteria.byTask(taskId))) MetadataCriteria.byTask(taskId)))
.orderBy(Order.asc(Functions.upper(TaskToTagMetadata.TAG_NAME))); .orderBy(Order.asc(Functions.upper(TaskToTagMetadata.TAG_NAME)));
final ArrayList<String> tagNames = new ArrayList<>(); final ArrayList<String> tagNames = new ArrayList<>();
metadataDao.query(query, new Callback<Metadata>() { metadataDao.query(query, entry -> {
@Override tagNames.add(entry.getValue(TaskToTagMetadata.TAG_NAME));
public void apply(Metadata entry) {
tagNames.add(entry.getValue(TaskToTagMetadata.TAG_NAME));
}
}); });
return tagNames; return tagNames;
} }
@ -138,12 +122,9 @@ public final class TagService {
*/ */
public List<TagData> getTagList() { public List<TagData> getTagList() {
final List<TagData> tagList = new ArrayList<>(); final List<TagData> tagList = new ArrayList<>();
tagDataDao.tagDataOrderedByName(new Callback<TagData>() { tagDataDao.tagDataOrderedByName(tagData -> {
@Override if (!TextUtils.isEmpty(tagData.getName())) {
public void apply(TagData tagData) { tagList.add(tagData);
if (!TextUtils.isEmpty(tagData.getName())) {
tagList.add(tagData);
}
} }
}); });
return tagList; return tagList;

@ -111,20 +111,17 @@ public final class TagsControlSet extends TaskEditControlFragment {
}; };
private Function<TagData, SpannableString> tagToString(final float maxLength) { private Function<TagData, SpannableString> tagToString(final float maxLength) {
return new Function<TagData, SpannableString>() { return tagData -> {
@Override String tagName = tagData.getName();
public SpannableString apply(TagData tagData) { tagName = tagName
String tagName = tagData.getName(); .substring(0, Math.min(tagName.length(), (int) maxLength))
tagName = tagName .replace(' ', NO_BREAK_SPACE);
.substring(0, Math.min(tagName.length(), (int) maxLength)) SpannableString string = new SpannableString(NO_BREAK_SPACE + tagName + NO_BREAK_SPACE);
.replace(' ', NO_BREAK_SPACE); int themeIndex = tagData.getColor();
SpannableString string = new SpannableString(NO_BREAK_SPACE + tagName + NO_BREAK_SPACE); ThemeColor color = themeIndex >= 0 ? themeCache.getThemeColor(themeIndex) : themeCache.getUntaggedColor();
int themeIndex = tagData.getColor(); string.setSpan(new BackgroundColorSpan(color.getPrimaryColor()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ThemeColor color = themeIndex >= 0 ? themeCache.getThemeColor(themeIndex) : themeCache.getUntaggedColor(); string.setSpan(new ForegroundColorSpan(color.getActionBarTint()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
string.setSpan(new BackgroundColorSpan(color.getPrimaryColor()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); return string;
string.setSpan(new ForegroundColorSpan(color.getActionBarTint()), 0, string.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
return string;
}
}; };
} }
@ -223,12 +220,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
private AlertDialog buildDialog() { private AlertDialog buildDialog() {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setView(dialogView) .setView(dialogView)
.setOnDismissListener(new DialogInterface.OnDismissListener() { .setOnDismissListener(dialogInterface -> refreshDisplayView())
@Override
public void onDismiss(DialogInterface dialogInterface) {
refreshDisplayView();
}
})
.create(); .create();
} }
@ -240,12 +232,7 @@ public final class TagsControlSet extends TaskEditControlFragment {
} }
private boolean isSelected(List<TagData> selected, final String name) { private boolean isSelected(List<TagData> selected, final String name) {
return Iterables.any(selected, new Predicate<TagData>() { return Iterables.any(selected, input -> name.equalsIgnoreCase(input.getName()));
@Override
public boolean apply(TagData input) {
return name.equalsIgnoreCase(input.getName());
}
});
} }
private ArrayList<TagData> getSelectedTags() { private ArrayList<TagData> getSelectedTags() {
@ -335,32 +322,26 @@ public final class TagsControlSet extends TaskEditControlFragment {
} }
}); });
textView.setOnEditorActionListener(new OnEditorActionListener() { textView.setOnEditorActionListener((arg0, actionId, arg2) -> {
@Override if(actionId != EditorInfo.IME_NULL) {
public boolean onEditorAction(TextView arg0, int actionId, KeyEvent arg2) { return false;
if(actionId != EditorInfo.IME_NULL) { }
return false; if(getLastTextView().getText().length() != 0) {
} addTag(""); //$NON-NLS-1$
if(getLastTextView().getText().length() != 0) {
addTag(""); //$NON-NLS-1$
}
return true;
} }
return true;
}); });
tagItem.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { tagItem.findViewById(R.id.button1).setOnClickListener(v -> {
@Override TextView lastView = getLastTextView();
public void onClick(View v) { if(lastView == textView && textView.getText().length() == 0) {
TextView lastView = getLastTextView(); return;
if(lastView == textView && textView.getText().length() == 0) { }
return;
}
if(newTagLayout.getChildCount() > 1) { if(newTagLayout.getChildCount() > 1) {
newTagLayout.removeView(tagItem); newTagLayout.removeView(tagItem);
} else { } else {
textView.setText(""); //$NON-NLS-1$ textView.setText(""); //$NON-NLS-1$
}
} }
}); });
} }

@ -125,18 +125,8 @@ public class TimerControlSet extends TaskEditControlFragment {
private AlertDialog buildDialog() { private AlertDialog buildDialog() {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setView(dialogView) .setView(dialogView)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialog12, which) -> refreshDisplayView())
@Override .setOnCancelListener(dialog1 -> refreshDisplayView())
public void onClick(DialogInterface dialog, int which) {
refreshDisplayView();
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
refreshDisplayView();
}
})
.create(); .create();
} }
@ -239,12 +229,9 @@ public class TimerControlSet extends TaskEditControlFragment {
elapsed += DateUtilities.now() - timerStarted; elapsed += DateUtilities.now() - timerStarted;
chronometer.setBase(SystemClock.elapsedRealtime() - elapsed); chronometer.setBase(SystemClock.elapsedRealtime() - elapsed);
if (elapsed > DateUtilities.ONE_DAY) { if (elapsed > DateUtilities.ONE_DAY) {
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { chronometer.setOnChronometerTickListener(cArg -> {
@Override long t = SystemClock.elapsedRealtime() - cArg.getBase();
public void onChronometerTick(Chronometer cArg) { cArg.setText(DateFormat.format("d'd' h:mm", t)); //$NON-NLS-1$
long t = SystemClock.elapsedRealtime() - cArg.getBase();
cArg.setText(DateFormat.format("d'd' h:mm", t)); //$NON-NLS-1$
}
}); });
} }

@ -317,25 +317,17 @@ public class DraggableListView extends ListView {
try { try {
Thread.sleep(300L); Thread.sleep(300L);
post(new Runnable() { post(() -> initiateDrag(ev));
@Override
public void run() {
initiateDrag(ev);
}
});
Thread.sleep(1000L); Thread.sleep(1000L);
post(new Runnable() { post(() -> {
@Override stopDragging();
public void run() { dragThread = null;
stopDragging(); Vibrator v = (Vibrator) getContext().getSystemService(
dragThread = null; Context.VIBRATOR_SERVICE);
Vibrator v = (Vibrator) getContext().getSystemService( v.vibrate(50);
Context.VIBRATOR_SERVICE); mClickListener.onLongClick(viewAtPosition());
v.vibrate(50);
mClickListener.onLongClick(viewAtPosition());
}
}); });
} catch (InterruptedException e) { } catch (InterruptedException e) {

@ -141,12 +141,7 @@ public class ReminderControlSet extends TaskEditControlFragment {
private List<Long> currentAlarms() { private List<Long> currentAlarms() {
final List<Long> alarms = new ArrayList<>(); final List<Long> alarms = new ArrayList<>();
alarmService.getAlarms(taskId, new Callback<Metadata>() { alarmService.getAlarms(taskId, entry -> alarms.add(entry.getValue(AlarmFields.TIME)));
@Override
public void apply(Metadata entry) {
alarms.add(entry.getValue(AlarmFields.TIME));
}
});
return alarms; return alarms;
} }
@ -284,12 +279,7 @@ public class ReminderControlSet extends TaskEditControlFragment {
} }
public void addAlarmRow(final Long timestamp) { public void addAlarmRow(final Long timestamp) {
addAlarmRow(getLongDateStringWithTime(context, timestamp), new OnClickListener() { addAlarmRow(getLongDateStringWithTime(context, timestamp), v -> alarms.remove(timestamp));
@Override
public void onClick(View v) {
alarms.remove(timestamp);
}
});
alarms.add(timestamp); alarms.add(timestamp);
} }
@ -301,12 +291,7 @@ public class ReminderControlSet extends TaskEditControlFragment {
} }
public void addGeolocationReminder(final Geofence geofence) { public void addGeolocationReminder(final Geofence geofence) {
addAlarmRow(geofence.getName(), new OnClickListener() { addAlarmRow(geofence.getName(), v -> geofences.remove(geofence));
@Override
public void onClick(View v) {
geofences.remove(geofence);
}
});
geofences.add(geofence); geofences.add(geofence);
} }
@ -349,15 +334,12 @@ public class ReminderControlSet extends TaskEditControlFragment {
private void addAlarmRow(final View alertItem, String text, final View.OnClickListener onRemove) { private void addAlarmRow(final View alertItem, String text, final View.OnClickListener onRemove) {
TextView display = (TextView) alertItem.findViewById(R.id.alarm_string); TextView display = (TextView) alertItem.findViewById(R.id.alarm_string);
display.setText(text); display.setText(text);
alertItem.findViewById(R.id.clear).setOnClickListener(new OnClickListener() { alertItem.findViewById(R.id.clear).setOnClickListener(v -> {
@Override alertContainer.removeView(alertItem);
public void onClick(View v) { if (onRemove != null) {
alertContainer.removeView(alertItem); onRemove.onClick(v);
if (onRemove != null) {
onRemove.onClick(v);
}
updateSpinner();
} }
updateSpinner();
}); });
updateSpinner(); updateSpinner();
} }
@ -384,31 +366,16 @@ public class ReminderControlSet extends TaskEditControlFragment {
private void addDue() { private void addDue() {
whenDue = true; whenDue = true;
addAlarmRow(getString(R.string.when_due), new OnClickListener() { addAlarmRow(getString(R.string.when_due), v -> whenDue = false);
@Override
public void onClick(View v) {
whenDue = false;
}
});
} }
private void addOverdue() { private void addOverdue() {
whenOverdue = true; whenOverdue = true;
addAlarmRow(getString(R.string.when_overdue), new OnClickListener() { addAlarmRow(getString(R.string.when_overdue), v -> whenOverdue = false);
@Override
public void onClick(View v) {
whenOverdue = false;
}
});
} }
private void addRandomReminder(long reminderPeriod) { private void addRandomReminder(long reminderPeriod) {
View alarmRow = addAlarmRow(getString(R.string.randomly_once) + " ", new OnClickListener() { View alarmRow = addAlarmRow(getString(R.string.randomly_once) + " ", v -> randomControlSet = null);
@Override
public void onClick(View v) {
randomControlSet = null;
}
});
randomControlSet = new RandomReminderControlSet(context, alarmRow, reminderPeriod); randomControlSet = new RandomReminderControlSet(context, alarmRow, reminderPeriod);
} }

@ -74,27 +74,19 @@ public class TimeDurationControlSet implements OnNNumberPickedListener, View.OnC
new int[] {999, 59}, new String[] {":", null}); new int[] {999, 59}, new String[] {":", null});
final NumberPicker hourPicker = dialog.getPicker(0); final NumberPicker hourPicker = dialog.getPicker(0);
final NumberPicker minutePicker = dialog.getPicker(1); final NumberPicker minutePicker = dialog.getPicker(1);
minutePicker.setFormatter(new NumberPicker.Formatter() { minutePicker.setFormatter(value -> String.format("%02d", value));
@Override minutePicker.setOnChangeListener(newVal -> {
public String toString(int value) { if(newVal < 0) {
return String.format("%02d", value); if(hourPicker.getCurrent() == 0) {
} return 0;
});
minutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() {
@Override
public int onChanged(int newVal) {
if(newVal < 0) {
if(hourPicker.getCurrent() == 0) {
return 0;
}
hourPicker.setCurrent(hourPicker.getCurrent() - 1);
return 60 + newVal;
} else if(newVal > 59) {
hourPicker.setCurrent(hourPicker.getCurrent() + 1);
return newVal % 60;
} }
return newVal; hourPicker.setCurrent(hourPicker.getCurrent() - 1);
return 60 + newVal;
} else if(newVal > 59) {
hourPicker.setCurrent(hourPicker.getCurrent() + 1);
return newVal % 60;
} }
return newVal;
}); });
} }

@ -30,18 +30,8 @@ public class AACRecorder {
setOutputFormat(OutputFormat.MPEG_4); setOutputFormat(OutputFormat.MPEG_4);
setAudioEncoder(AudioEncoder.AAC); setAudioEncoder(AudioEncoder.AAC);
setOutputFile(tempFile); setOutputFile(tempFile);
setOnErrorListener(new OnErrorListener() { setOnErrorListener((mr, what, extra) -> Timber.e("mediaRecorder.onError(mr, %s, %s)", what, extra));
@Override setOnInfoListener((mr, what, extra) -> Timber.i("mediaRecorder.onInfo(mr, %s, %s)", what, extra));
public void onError(MediaRecorder mr, int what, int extra) {
Timber.e("mediaRecorder.onError(mr, %s, %s)", what, extra);
}
});
setOnInfoListener(new OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
Timber.i("mediaRecorder.onInfo(mr, %s, %s)", what, extra);
}
});
}}; }};
try { try {

@ -50,13 +50,10 @@ public class VoiceOutputAssistant implements OnInitListener {
if (mTts != null && isTTSInitialized) { if (mTts != null && isTTSInitialized) {
final String id = UUID.randomUUID().toString(); final String id = UUID.randomUUID().toString();
Timber.d("%s: %s (%s)", mTts, textToSpeak, id); Timber.d("%s: %s (%s)", mTts, textToSpeak, id);
mTts.setOnUtteranceCompletedListener(new TextToSpeech.OnUtteranceCompletedListener() { mTts.setOnUtteranceCompletedListener(utteranceId -> {
@Override Timber.d("%s: onUtteranceCompleted", utteranceId);
public void onUtteranceCompleted(String utteranceId) { if(utteranceId.equals(id)) {
Timber.d("%s: onUtteranceCompleted", utteranceId); shutdown();
if(utteranceId.equals(id)) {
shutdown();
}
} }
}); });
mTts.speak(textToSpeak, TextToSpeech.QUEUE_ADD, new HashMap<String, String>() {{ mTts.speak(textToSpeak, TextToSpeech.QUEUE_ADD, new HashMap<String, String>() {{

@ -72,25 +72,10 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
adapter = new ArrayAdapter<>(getActivity(), R.layout.simple_list_item_single_choice_themed, calendarNames); adapter = new ArrayAdapter<>(getActivity(), R.layout.simple_list_item_single_choice_themed, calendarNames);
AlertDialogBuilder builder = dialogBuilder.newDialog() AlertDialogBuilder builder = dialogBuilder.newDialog()
.setAdapter(adapter, new DialogInterface.OnClickListener() { .setAdapter(adapter, (dialog, which) -> handler.selectedCalendar(calendars.get(which)))
@Override .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> handler.cancel());
public void onClick(DialogInterface dialog, int which) {
handler.selectedCalendar(calendars.get(which));
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
handler.cancel();
}
});
if (enableNone) { if (enableNone) {
builder.setNeutralButton(R.string.none, new DialogInterface.OnClickListener() { builder.setNeutralButton(R.string.none, (dialog, which) -> handler.selectedCalendar(AndroidCalendar.NONE));
@Override
public void onClick(DialogInterface dialog, int which) {
handler.selectedCalendar(AndroidCalendar.NONE);
}
});
} }
return builder.show(); return builder.show();
@ -104,12 +89,7 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
calendars.clear(); calendars.clear();
calendars.addAll(calendarProvider.getCalendars()); calendars.addAll(calendarProvider.getCalendars());
calendarNames.clear(); calendarNames.clear();
calendarNames.addAll(transform(calendars, new Function<AndroidCalendar, String>() { calendarNames.addAll(transform(calendars, AndroidCalendar::getName));
@Override
public String apply(AndroidCalendar androidCalendar) {
return androidCalendar.getName();
}
}));
if (calendarNames.isEmpty()) { if (calendarNames.isEmpty()) {
Toast.makeText(getActivity(), R.string.no_calendars_found, Toast.LENGTH_LONG).show(); Toast.makeText(getActivity(), R.string.no_calendars_found, Toast.LENGTH_LONG).show();
handler.cancel(); handler.cancel();

@ -66,7 +66,7 @@ public class ColorPickerActivity extends InjectingAppCompatActivity implements C
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_PURCHASE) { if (requestCode == REQUEST_PURCHASE) {
purchaseHelper.handleActivityResult(PurchaseHelperCallback.NO_OP, requestCode, resultCode, data); purchaseHelper.handleActivityResult(null, requestCode, resultCode, data);
} else { } else {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
} }

@ -52,12 +52,7 @@ public class DatePickerActivity extends InjectingAppCompatActivity implements Da
dialog.setAccentColor(themeAccent.getAccentColor()); dialog.setAccentColor(themeAccent.getAccentColor());
dialog.show(fragmentManager, FRAG_TAG_DATE_PICKER); dialog.show(fragmentManager, FRAG_TAG_DATE_PICKER);
} }
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { dialog.setOnCancelListener(dialogInterface -> finish());
@Override
public void onCancel(DialogInterface dialogInterface) {
finish();
}
});
dialog.setOnDateSetListener(this); dialog.setOnDateSetListener(this);
} }
} }

@ -43,29 +43,21 @@ public class FilterSelectionActivity extends InjectingAppCompatActivity {
filterAdapter.populateList(); filterAdapter.populateList();
dialogBuilder.newDialog() dialogBuilder.newDialog()
.setSingleChoiceItems(filterAdapter, -1, new DialogInterface.OnClickListener() { .setSingleChoiceItems(filterAdapter, -1, (dialog, which) -> {
@Override final Filter selectedFilter = (Filter) filterAdapter.getItem(which);
public void onClick(DialogInterface dialog, int which) { setResult(RESULT_OK, new Intent() {{
final Filter selectedFilter = (Filter) filterAdapter.getItem(which); if (returnFilter) {
setResult(RESULT_OK, new Intent() {{ putExtra(EXTRA_FILTER, selectedFilter);
if (returnFilter) { }
putExtra(EXTRA_FILTER, selectedFilter); putExtra(EXTRA_FILTER_NAME, selectedFilter.listingTitle);
} putExtra(EXTRA_FILTER_SQL, selectedFilter.getSqlQuery());
putExtra(EXTRA_FILTER_NAME, selectedFilter.listingTitle); if (selectedFilter.valuesForNewTasks != null) {
putExtra(EXTRA_FILTER_SQL, selectedFilter.getSqlQuery()); putExtra(EXTRA_FILTER_VALUES, AndroidUtilities.contentValuesToSerializedString(selectedFilter.valuesForNewTasks));
if (selectedFilter.valuesForNewTasks != null) { }
putExtra(EXTRA_FILTER_VALUES, AndroidUtilities.contentValuesToSerializedString(selectedFilter.valuesForNewTasks)); }});
} dialog.dismiss();
}});
dialog.dismiss();
}
})
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
finish();
}
}) })
.setOnDismissListener(dialog -> finish())
.show(); .show();
} }

@ -56,12 +56,7 @@ public class TimePickerActivity extends InjectingAppCompatActivity implements Ti
dialog.setAccentColor(themeAccent.getAccentColor()); dialog.setAccentColor(themeAccent.getAccentColor());
dialog.show(fragmentManager, FRAG_TAG_TIME_PICKER); dialog.show(fragmentManager, FRAG_TAG_TIME_PICKER);
} }
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { dialog.setOnCancelListener(dialogInterface -> finish());
@Override
public void onCancel(DialogInterface dialogInterface) {
finish();
}
});
dialog.setOnTimeSetListener(this); dialog.setOnTimeSetListener(this);
} }
} }

@ -1,13 +1,5 @@
package org.tasks.billing; package org.tasks.billing;
public interface PurchaseHelperCallback { public interface PurchaseHelperCallback {
PurchaseHelperCallback NO_OP = new PurchaseHelperCallback() {
@Override
public void purchaseCompleted(boolean success, String sku) {
}
};
void purchaseCompleted(boolean success, String sku); void purchaseCompleted(boolean success, String sku);
} }

@ -44,42 +44,19 @@ public class AddAttachmentDialog extends InjectingDialogFragment {
final List<Runnable> actions = newArrayList(); final List<Runnable> actions = newArrayList();
if (device.hasCamera()) { if (device.hasCamera()) {
entries.add(getString(R.string.take_a_picture)); entries.add(getString(R.string.take_a_picture));
actions.add(new Runnable() { actions.add(() -> callback.takePicture());
@Override
public void run() {
callback.takePicture();
}
});
} }
entries.add(getString(R.string.premium_record_audio)); entries.add(getString(R.string.premium_record_audio));
actions.add(new Runnable() { actions.add(() -> callback.recordNote());
@Override
public void run() {
callback.recordNote();
}
});
if (device.hasGallery()) { if (device.hasGallery()) {
entries.add(getString(R.string.pick_from_gallery)); entries.add(getString(R.string.pick_from_gallery));
actions.add(new Runnable() { actions.add(() -> callback.pickFromGallery());
@Override
public void run() {
callback.pickFromGallery();
}
});
} }
entries.add(getString(R.string.pick_from_storage)); entries.add(getString(R.string.pick_from_storage));
actions.add(new Runnable() { actions.add(() -> callback.pickFromStorage());
@Override
public void run() {
callback.pickFromStorage();
}
});
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setItems(entries, new DialogInterface.OnClickListener() { .setItems(entries, (dialog, which) -> {
@Override actions.get(which).run();
public void onClick(DialogInterface dialog, int which) {
actions.get(which).run();
}
}) })
.show(); .show();
} }

@ -89,22 +89,14 @@ public class ColorPickerDialog extends InjectingDialogFragment {
}; };
return dialogBuilder.newDialog(theme) return dialogBuilder.newDialog(theme)
.setAdapter(adapter, new DialogInterface.OnClickListener() { .setAdapter(adapter, (dialog, which) -> {
@Override if (preferences.hasPurchase(R.string.p_purchased_themes) || which < getNumFree()) {
public void onClick(DialogInterface dialog, int which) { callback.themePicked(palette, which);
if (preferences.hasPurchase(R.string.p_purchased_themes) || which < getNumFree()) { } else {
callback.themePicked(palette, which); callback.initiateThemePurchase();
} else {
callback.initiateThemePurchase();
}
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
callback.dismissed();
} }
}) })
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> callback.dismissed())
.show(); .show();
} }

@ -31,17 +31,14 @@ public class DonationDialog extends InjectingNativeDialogFragment {
final List<String> donationValues = getDonationValues(); final List<String> donationValues = getDonationValues();
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setTitle(R.string.select_amount) .setTitle(R.string.select_amount)
.setItems(donationValues, new DialogInterface.OnClickListener() { .setItems(donationValues, (dialog, which) -> {
@Override String value = donationValues.get(which);
public void onClick(DialogInterface dialog, int which) { Pattern pattern = Pattern.compile("\\$(\\d+) USD");
String value = donationValues.get(which); Matcher matcher = pattern.matcher(value);
Pattern pattern = Pattern.compile("\\$(\\d+) USD"); //noinspection ResultOfMethodCallIgnored
Matcher matcher = pattern.matcher(value); matcher.matches();
//noinspection ResultOfMethodCallIgnored String sku = String.format(java.util.Locale.ENGLISH, "%03d", Integer.parseInt(matcher.group(1)));
matcher.matches(); purchaseHelper.purchase(dialogBuilder, getActivity(), sku, null, BasicPreferences.REQUEST_PURCHASE, (BasicPreferences) getActivity());
String sku = String.format(java.util.Locale.ENGLISH, "%03d", Integer.parseInt(matcher.group(1)));
purchaseHelper.purchase(dialogBuilder, getActivity(), sku, null, BasicPreferences.REQUEST_PURCHASE, (BasicPreferences) getActivity());
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();

@ -40,11 +40,8 @@ public class NativeTimePickerDialog extends InjectingNativeDialogFragment implem
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
Context context = theme.wrap(getActivity()); Context context = theme.wrap(getActivity());
TimePickerDialog timePickerDialog = new TimePickerDialog(context, this, 0, 0, DateUtilities.is24HourFormat(context)); TimePickerDialog timePickerDialog = new TimePickerDialog(context, this, 0, 0, DateUtilities.is24HourFormat(context));
timePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener() { timePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), (dialogInterface, i) -> {
@Override callback.cancel();
public void onClick(DialogInterface dialogInterface, int i) {
callback.cancel();
}
}); });
if (initial != null) { if (initial != null) {
timePickerDialog.updateTime(initial.getHourOfDay(), initial.getMinuteOfHour()); timePickerDialog.updateTime(initial.getHourOfDay(), initial.getMinuteOfHour());

@ -66,12 +66,7 @@ public class SeekBarDialog extends InjectingNativeDialogFragment {
slider.setValue(initial, true); slider.setValue(initial, true);
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setView(view) .setView(view)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> callback.valueSelected(slider.getValue(), requestCode))
@Override
public void onClick(DialogInterface dialogInterface, int i) {
callback.valueSelected(slider.getValue(), requestCode);
}
})
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }

@ -79,25 +79,12 @@ public class SortDialog extends InjectingDialogFragment {
} }
alertDialog = dialogBuilder.newDialog() alertDialog = dialogBuilder.newDialog()
.setSingleChoiceItems(items, selectedIndex, new DialogInterface.OnClickListener() { .setSingleChoiceItems(items, selectedIndex, (dialog, which) -> {
@Override selectedIndex = which;
public void onClick(DialogInterface dialog, int which) { enableReverse();
selectedIndex = which;
enableReverse();
}
})
.setPositiveButton(R.string.TLA_menu_sort, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setSelection(false);
}
})
.setNeutralButton(R.string.reverse, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setSelection(true);
}
}) })
.setPositiveButton(R.string.TLA_menu_sort, (dialog, which) -> setSelection(false))
.setNeutralButton(R.string.reverse, (dialog, which) -> setSelection(true))
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.showThemedListView(); .showThemedListView();

@ -42,16 +42,13 @@ public class FilterCounter {
} }
public void refreshFilterCounts(final Runnable onComplete) { public void refreshFilterCounts(final Runnable onComplete) {
executorService.submit(new Runnable() { executorService.submit(() -> {
@Override for (Filter filter : filterCounts.keySet()) {
public void run() { int size = countTasks(filter);
for (Filter filter : filterCounts.keySet()) { filterCounts.put(filter, size);
int size = countTasks(filter); }
filterCounts.put(filter, size); if (onComplete != null) {
} onComplete.run();
if (onComplete != null) {
onComplete.run();
}
} }
}); });
} }

@ -83,12 +83,7 @@ public class FilterCriteriaProvider {
private CustomFilterCriterion getTagFilter() { private CustomFilterCriterion getTagFilter() {
// TODO: adding to hash set because duplicate tag name bug hasn't been fixed yet // TODO: adding to hash set because duplicate tag name bug hasn't been fixed yet
List<String> tags = newArrayList(newLinkedHashSet(transform(tagService.getTagList(), new Function<TagData, String>() { List<String> tags = newArrayList(newLinkedHashSet(transform(tagService.getTagList(), TagData::getName)));
@Override
public String apply(TagData tagData) {
return tagData.getName();
}
})));
String[] tagNames = tags.toArray(new String[tags.size()]); String[] tagNames = tags.toArray(new String[tags.size()]);
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(Metadata.KEY.name, TaskToTagMetadata.KEY); values.put(Metadata.KEY.name, TaskToTagMetadata.KEY);

@ -182,12 +182,9 @@ public class CommentBarFragment extends TaskEditControlFragment {
if (pendingCommentPicture == null) { if (pendingCommentPicture == null) {
showPictureLauncher(null); showPictureLauncher(null);
} else { } else {
showPictureLauncher(new ClearImageCallback() { showPictureLauncher(() -> {
@Override pendingCommentPicture = null;
public void clearImage() { resetPictureButton();
pendingCommentPicture = null;
resetPictureButton();
}
}); });
} }
} }
@ -254,34 +251,21 @@ public class CommentBarFragment extends TaskEditControlFragment {
final boolean cameraAvailable = device.hasCamera(); final boolean cameraAvailable = device.hasCamera();
if (cameraAvailable) { if (cameraAvailable) {
runnables.add(new Runnable() { runnables.add(() -> startActivityForResult(new Intent(activity, CameraActivity.class), REQUEST_CODE_CAMERA));
@Override
public void run() {
startActivityForResult(new Intent(activity, CameraActivity.class), REQUEST_CODE_CAMERA);
}
});
options.add(getString(R.string.take_a_picture)); options.add(getString(R.string.take_a_picture));
} }
if (clearImageOption != null) { if (clearImageOption != null) {
runnables.add(new Runnable() { runnables.add(clearImageOption::clearImage);
@Override
public void run() {
clearImageOption.clearImage();
}
});
options.add(getString(R.string.actfm_picture_clear)); options.add(getString(R.string.actfm_picture_clear));
} }
if (runnables.size() == 1) { if (runnables.size() == 1) {
runnables.get(0).run(); runnables.get(0).run();
} else { } else {
DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { DialogInterface.OnClickListener listener = (d, which) -> {
@Override runnables.get(which).run();
public void onClick(DialogInterface d, int which) { d.dismiss();
runnables.get(which).run();
d.dismiss();
}
}; };
// show a menu of available options // show a menu of available options

@ -60,12 +60,7 @@ public abstract class InjectingPreferenceActivity extends AppCompatPreferenceAct
toolbar.setTitle(getTitle()); toolbar.setTitle(getTitle());
} }
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_24dp)); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_arrow_back_24dp));
toolbar.setNavigationOnClickListener(new View.OnClickListener() { toolbar.setNavigationOnClickListener(v -> finish());
@Override
public void onClick(View v) {
finish();
}
});
MenuColorizer.colorToolbar(this, toolbar); MenuColorizer.colorToolbar(this, toolbar);
} }

@ -42,19 +42,11 @@ public class LocalePickerDialog extends InjectingNativeDialogFragment {
for (String override : getResources().getStringArray(R.array.localization)) { for (String override : getResources().getStringArray(R.array.localization)) {
locales.add(locale.withLanguage(override)); locales.add(locale.withLanguage(override));
} }
final List<String> display = transform(locales, new Function<Locale, String>() { final List<String> display = transform(locales, Locale::getDisplayName);
@Override
public String apply(Locale input) {
return input.getDisplayName();
}
});
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setItems(display, new DialogInterface.OnClickListener() { .setItems(display, (dialogInterface, i) -> {
@Override dialogInterface.dismiss();
public void onClick(DialogInterface dialogInterface, int i) { callback.onLocaleSelected(locales.get(i));
dialogInterface.dismiss();
callback.onLocaleSelected(locales.get(i));
}
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show(); .show();

@ -62,25 +62,15 @@ public class GeofenceService {
} }
public boolean synchronizeGeofences(final long taskId, Set<Geofence> geofences) { public boolean synchronizeGeofences(final long taskId, Set<Geofence> geofences) {
List<Metadata> metadata = newArrayList(transform(geofences, new Function<Geofence, Metadata>() { List<Metadata> metadata = newArrayList(transform(geofences, (Function<Geofence, Metadata>) geofence -> new Metadata() {{
@Override setKey(GeofenceFields.METADATA_KEY);
public Metadata apply(final Geofence geofence) { setValue(GeofenceFields.PLACE, geofence.getName());
return new Metadata() {{ setValue(GeofenceFields.LATITUDE, geofence.getLatitude());
setKey(GeofenceFields.METADATA_KEY); setValue(GeofenceFields.LONGITUDE, geofence.getLongitude());
setValue(GeofenceFields.PLACE, geofence.getName()); setValue(GeofenceFields.RADIUS, geofence.getRadius());
setValue(GeofenceFields.LATITUDE, geofence.getLatitude()); }}));
setValue(GeofenceFields.LONGITUDE, geofence.getLongitude());
setValue(GeofenceFields.RADIUS, geofence.getRadius());
}};
}
}));
boolean changed = synchronizeMetadata(taskId, metadata, new SynchronizeMetadataCallback() { boolean changed = synchronizeMetadata(taskId, metadata, m -> geofenceApi.cancel(new Geofence(m)));
@Override
public void beforeDeleteMetadata(Metadata m) {
geofenceApi.cancel(new Geofence(m));
}
});
if(changed) { if(changed) {
setupGeofences(taskId); setupGeofences(taskId);
@ -89,12 +79,7 @@ public class GeofenceService {
} }
private List<Geofence> toGeofences(List<Metadata> geofences) { private List<Geofence> toGeofences(List<Metadata> geofences) {
return newArrayList(transform(geofences, new Function<Metadata, Geofence>() { return newArrayList(transform(geofences, Geofence::new));
@Override
public Geofence apply(Metadata metadata) {
return new Geofence(metadata);
}
}));
} }
private List<Geofence> getActiveGeofences() { private List<Geofence> getActiveGeofences() {
@ -128,27 +113,24 @@ public class GeofenceService {
newMetadataValues.add(values); newMetadataValues.add(values);
} }
metadataDao.byTaskAndKey(taskId, GeofenceFields.METADATA_KEY, new Callback<Metadata>() { metadataDao.byTaskAndKey(taskId, GeofenceFields.METADATA_KEY, item -> {
@Override long id = item.getId();
public void apply(Metadata item) {
long id = item.getId(); // clear item id when matching with incoming values
item.clearValue(Metadata.ID);
// clear item id when matching with incoming values item.clearValue(Metadata.CREATION_DATE);
item.clearValue(Metadata.ID); ContentValues itemMergedValues = item.getMergedValues();
item.clearValue(Metadata.CREATION_DATE);
ContentValues itemMergedValues = item.getMergedValues(); if(newMetadataValues.contains(itemMergedValues)) {
newMetadataValues.remove(itemMergedValues);
if(newMetadataValues.contains(itemMergedValues)) { } else {
newMetadataValues.remove(itemMergedValues); // not matched. cut it
} else { item.setId(id);
// not matched. cut it if (callback != null) {
item.setId(id); callback.beforeDeleteMetadata(item);
if (callback != null) {
callback.beforeDeleteMetadata(item);
}
metadataDao.delete(id);
dirty[0] = true;
} }
metadataDao.delete(id);
dirty[0] = true;
} }
}); });

@ -46,24 +46,18 @@ public class AppearancePreferences extends InjectingPreferenceActivity {
setExtraOnChange(R.string.p_show_today_filter, EXTRA_FILTERS_CHANGED); setExtraOnChange(R.string.p_show_today_filter, EXTRA_FILTERS_CHANGED);
setExtraOnChange(R.string.p_show_recently_modified_filter, EXTRA_FILTERS_CHANGED); setExtraOnChange(R.string.p_show_recently_modified_filter, EXTRA_FILTERS_CHANGED);
setExtraOnChange(R.string.p_show_not_in_list_filter, EXTRA_FILTERS_CHANGED); setExtraOnChange(R.string.p_show_not_in_list_filter, EXTRA_FILTERS_CHANGED);
findPreference(getString(R.string.customize_edit_screen)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.customize_edit_screen)).setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(AppearancePreferences.this, BeastModePreferences.class), REQUEST_CUSTOMIZE);
public boolean onPreferenceClick(Preference preference) { return true;
startActivityForResult(new Intent(AppearancePreferences.this, BeastModePreferences.class), REQUEST_CUSTOMIZE);
return true;
}
}); });
Preference defaultList = findPreference(getString(R.string.p_default_list)); Preference defaultList = findPreference(getString(R.string.p_default_list));
Filter filter = defaultFilterProvider.getDefaultFilter(); Filter filter = defaultFilterProvider.getDefaultFilter();
defaultList.setSummary(filter.listingTitle); defaultList.setSummary(filter.listingTitle);
defaultList.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { defaultList.setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(AppearancePreferences.this, FilterSelectionActivity.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(FilterSelectionActivity.EXTRA_RETURN_FILTER, true);
startActivityForResult(new Intent(AppearancePreferences.this, FilterSelectionActivity.class) {{ }}, REQUEST_DEFAULT_LIST);
putExtra(FilterSelectionActivity.EXTRA_RETURN_FILTER, true); return true;
}}, REQUEST_DEFAULT_LIST);
return true;
}
}); });
} }
@ -100,13 +94,10 @@ public class AppearancePreferences extends InjectingPreferenceActivity {
} }
private void setExtraOnChange(final int resId, final String extra) { private void setExtraOnChange(final int resId, final String extra) {
findPreference(getString(resId)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(resId)).setOnPreferenceChangeListener((preference, newValue) -> {
@Override tracker.reportEvent(Tracking.Events.SET_PREFERENCE, resId, newValue.toString());
public boolean onPreferenceChange(Preference preference, Object newValue) { result.putBoolean(extra, true);
tracker.reportEvent(Tracking.Events.SET_PREFERENCE, resId, newValue.toString()); return true;
result.putBoolean(extra, true);
return true;
}
}); });
} }

@ -31,22 +31,16 @@ public class BackupPreferences extends InjectingPreferenceActivity {
addPreferencesFromResource(R.xml.preferences_backup); addPreferencesFromResource(R.xml.preferences_backup);
getPref(R.string.backup_BAc_import).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { getPref(R.string.backup_BAc_import).setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(BackupPreferences.this, FileExplore.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(FileExplore.EXTRA_START_PATH, preferences.getBackupDirectory().getAbsolutePath());
startActivityForResult(new Intent(BackupPreferences.this, FileExplore.class) {{ }}, REQUEST_PICKER);
putExtra(FileExplore.EXTRA_START_PATH, preferences.getBackupDirectory().getAbsolutePath()); return false;
}}, REQUEST_PICKER);
return false;
}
}); });
getPref(R.string.backup_BAc_export).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { getPref(R.string.backup_BAc_export).setOnPreferenceClickListener(preference -> {
@Override newExportTasksDialog().show(getFragmentManager(), FRAG_TAG_EXPORT_TASKS);
public boolean onPreferenceClick(Preference preference) { return false;
newExportTasksDialog().show(getFragmentManager(), FRAG_TAG_EXPORT_TASKS);
return false;
}
}); });
initializeBackupDirectory(); initializeBackupDirectory();
@ -71,15 +65,12 @@ public class BackupPreferences extends InjectingPreferenceActivity {
} }
private void initializeBackupDirectory() { private void initializeBackupDirectory() {
findPreference(getString(R.string.p_backup_dir)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.p_backup_dir)).setOnPreferenceClickListener(p -> {
@Override Intent filesDir = new Intent(BackupPreferences.this, FileExplore.class);
public boolean onPreferenceClick(Preference p) { filesDir.putExtra(FileExplore.EXTRA_DIRECTORY_MODE, true);
Intent filesDir = new Intent(BackupPreferences.this, FileExplore.class); filesDir.putExtra(FileExplore.EXTRA_START_PATH, getBackupDirectory());
filesDir.putExtra(FileExplore.EXTRA_DIRECTORY_MODE, true); startActivityForResult(filesDir, REQUEST_CODE_BACKUP_DIR);
filesDir.putExtra(FileExplore.EXTRA_START_PATH, getBackupDirectory()); return true;
startActivityForResult(filesDir, REQUEST_CODE_BACKUP_DIR);
return true;
}
}); });
updateBackupDirectory(); updateBackupDirectory();
} }

@ -83,148 +83,109 @@ public class BasicPreferences extends InjectingPreferenceActivity implements
Preference themePreference = findPreference(getString(R.string.p_theme)); Preference themePreference = findPreference(getString(R.string.p_theme));
themePreference.setSummary(themeBase.getName()); themePreference.setSummary(themeBase.getName());
themePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { themePreference.setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(BasicPreferences.this, ColorPickerActivity.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.THEMES);
startActivityForResult(new Intent(BasicPreferences.this, ColorPickerActivity.class) {{ }}, REQUEST_THEME_PICKER);
putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.THEMES); return false;
}}, REQUEST_THEME_PICKER);
return false;
}
}); });
Preference colorPreference = findPreference(getString(R.string.p_theme_color)); Preference colorPreference = findPreference(getString(R.string.p_theme_color));
colorPreference.setSummary(themeColor.getName()); colorPreference.setSummary(themeColor.getName());
colorPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { colorPreference.setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(BasicPreferences.this, ColorPickerActivity.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.COLORS);
startActivityForResult(new Intent(BasicPreferences.this, ColorPickerActivity.class) {{ }}, REQUEST_COLOR_PICKER);
putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.COLORS); return false;
}}, REQUEST_COLOR_PICKER);
return false;
}
}); });
Preference accentPreference = findPreference(getString(R.string.p_theme_accent)); Preference accentPreference = findPreference(getString(R.string.p_theme_accent));
accentPreference.setSummary(themeAccent.getName()); accentPreference.setSummary(themeAccent.getName());
accentPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { accentPreference.setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(BasicPreferences.this, ColorPickerActivity.class) {{
public boolean onPreferenceClick(Preference preference) { putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.ACCENTS);
startActivityForResult(new Intent(BasicPreferences.this, ColorPickerActivity.class) {{ }}, REQUEST_ACCENT_PICKER);
putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.ACCENTS); return false;
}}, REQUEST_ACCENT_PICKER);
return false;
}
}); });
Preference languagePreference = findPreference(getString(R.string.p_language)); Preference languagePreference = findPreference(getString(R.string.p_language));
updateLocale(); updateLocale();
languagePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { languagePreference.setOnPreferenceClickListener(preference -> {
@Override newLocalePickerDialog()
public boolean onPreferenceClick(Preference preference) { .show(getFragmentManager(), FRAG_TAG_LOCALE_PICKER);
newLocalePickerDialog() return false;
.show(getFragmentManager(), FRAG_TAG_LOCALE_PICKER);
return false;
}
}); });
findPreference(getString(R.string.p_layout_direction)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(R.string.p_layout_direction)).setOnPreferenceChangeListener((preference, o) -> {
@Override tracker.reportEvent(Tracking.Events.SET_PREFERENCE, R.string.p_layout_direction, o.toString());
public boolean onPreferenceChange(Preference preference, Object o) { int newValue = Integer.parseInt((String) o);
tracker.reportEvent(Tracking.Events.SET_PREFERENCE, R.string.p_layout_direction, o.toString()); if (locale.getDirectionality() != locale.withDirectionality(newValue).getDirectionality()) {
int newValue = Integer.parseInt((String) o); showRestartDialog();
if (locale.getDirectionality() != locale.withDirectionality(newValue).getDirectionality()) {
showRestartDialog();
}
return true;
} }
return true;
}); });
findPreference(getString(R.string.p_collect_statistics)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(R.string.p_collect_statistics)).setOnPreferenceChangeListener((preference, newValue) -> {
@Override if (newValue != null) {
public boolean onPreferenceChange(Preference preference, Object newValue) { tracker.setTrackingEnabled((boolean) newValue);
if (newValue != null) { return true;
tracker.setTrackingEnabled((boolean) newValue);
return true;
}
return false;
} }
return false;
}); });
getPref(R.string.TLA_menu_donate).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { getPref(R.string.TLA_menu_donate).setOnPreferenceClickListener(preference -> {
@Override if (BuildConfig.FLAVOR_store.equals("googleplay")) {
public boolean onPreferenceClick(Preference preference) { newDonationDialog().show(getFragmentManager(), FRAG_TAG_DONATION);
if (BuildConfig.FLAVOR_store.equals("googleplay")) { } else {
newDonationDialog().show(getFragmentManager(), FRAG_TAG_DONATION); startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://tasks.org/donate")));
} else {
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://tasks.org/donate")));
}
return false;
} }
return false;
}); });
getPref(R.string.p_purchased_themes).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { getPref(R.string.p_purchased_themes).setOnPreferenceChangeListener((preference, newValue) -> {
@Override if (newValue != null && (boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_themes)) {
public boolean onPreferenceChange(Preference preference, Object newValue) { purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_themes), getString(R.string.p_purchased_themes), REQUEST_PURCHASE, BasicPreferences.this);
if (newValue != null && (boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_themes)) {
purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_themes), getString(R.string.p_purchased_themes), REQUEST_PURCHASE, BasicPreferences.this);
}
return false;
} }
return false;
}); });
getPref(R.string.p_tesla_unread_enabled).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { getPref(R.string.p_tesla_unread_enabled).setOnPreferenceChangeListener((preference, newValue) -> {
@Override if (newValue != null) {
public boolean onPreferenceChange(Preference preference, Object newValue) { if ((boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_tesla_unread)) {
if (newValue != null) { purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_tesla_unread), getString(R.string.p_purchased_tesla_unread), REQUEST_PURCHASE, BasicPreferences.this);
if ((boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_tesla_unread)) { } else {
purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_tesla_unread), getString(R.string.p_purchased_tesla_unread), REQUEST_PURCHASE, BasicPreferences.this); teslaUnreadReceiver.setEnabled((boolean) newValue);
} else { return true;
teslaUnreadReceiver.setEnabled((boolean) newValue);
return true;
}
} }
return false;
} }
return false;
}); });
getPref(R.string.p_purchased_tasker).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { getPref(R.string.p_purchased_tasker).setOnPreferenceChangeListener((preference, newValue) -> {
@Override if (newValue != null && (boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_tasker)) {
public boolean onPreferenceChange(Preference preference, Object newValue) { purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_tasker), getString(R.string.p_purchased_tasker), REQUEST_PURCHASE, BasicPreferences.this);
if (newValue != null && (boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_tasker)) {
purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_tasker), getString(R.string.p_purchased_tasker), REQUEST_PURCHASE, BasicPreferences.this);
}
return false;
} }
return false;
}); });
getPref(R.string.p_purchased_dashclock).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { getPref(R.string.p_purchased_dashclock).setOnPreferenceChangeListener((preference, newValue) -> {
@Override if (newValue != null && (boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_dashclock)) {
public boolean onPreferenceChange(Preference preference, Object newValue) { purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_dashclock), getString(R.string.p_purchased_dashclock), REQUEST_PURCHASE, BasicPreferences.this);
if (newValue != null && (boolean) newValue && !preferences.hasPurchase(R.string.p_purchased_dashclock)) {
purchaseHelper.purchase(dialogBuilder, BasicPreferences.this, getString(R.string.sku_dashclock), getString(R.string.p_purchased_dashclock), REQUEST_PURCHASE, BasicPreferences.this);
}
return false;
} }
return false;
}); });
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
addPreferencesFromResource(R.xml.preferences_debug); addPreferencesFromResource(R.xml.preferences_debug);
findPreference(getString(R.string.debug_unlock_purchases)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.debug_unlock_purchases)).setOnPreferenceClickListener(preference -> {
@Override preferences.setBoolean(R.string.p_purchased_dashclock, true);
public boolean onPreferenceClick(Preference preference) { preferences.setBoolean(R.string.p_purchased_tasker, true);
preferences.setBoolean(R.string.p_purchased_dashclock, true); preferences.setBoolean(R.string.p_purchased_tesla_unread, true);
preferences.setBoolean(R.string.p_purchased_tasker, true); preferences.setBoolean(R.string.p_purchased_themes, true);
preferences.setBoolean(R.string.p_purchased_tesla_unread, true); recreate();
preferences.setBoolean(R.string.p_purchased_themes, true); return true;
recreate();
return true;
}
}); });
findPreference(getString(R.string.debug_consume_purchases)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.debug_consume_purchases)).setOnPreferenceClickListener(preference -> {
@Override purchaseHelper.consumePurchases();
public boolean onPreferenceClick(Preference preference) { recreate();
purchaseHelper.consumePurchases(); return true;
recreate();
return true;
}
}); });
} }
@ -239,12 +200,9 @@ public class BasicPreferences extends InjectingPreferenceActivity implements
} }
private void setupActivity(int key, final Class<?> target) { private void setupActivity(int key, final Class<?> target) {
findPreference(getString(key)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(key)).setOnPreferenceClickListener(preference -> {
@Override startActivityForResult(new Intent(BasicPreferences.this, target), RC_PREFS);
public boolean onPreferenceClick(Preference preference) { return true;
startActivityForResult(new Intent(BasicPreferences.this, target), RC_PREFS);
return true;
}
}); });
} }
@ -310,14 +268,9 @@ public class BasicPreferences extends InjectingPreferenceActivity implements
private void showRestartDialog() { private void showRestartDialog() {
dialogBuilder.newDialog() dialogBuilder.newDialog()
.setMessage(R.string.restart_required) .setMessage(R.string.restart_required)
.setPositiveButton(R.string.restart_now, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.restart_now, (dialogInterface, i) -> ProcessPhoenix.triggerRebirth(BasicPreferences.this, new Intent(BasicPreferences.this, TaskListActivity.class) {{
@Override putExtra(TaskListActivity.OPEN_FILTER, (Filter) null);
public void onClick(DialogInterface dialogInterface, int i) { }}))
ProcessPhoenix.triggerRebirth(BasicPreferences.this, new Intent(BasicPreferences.this, TaskListActivity.class) {{
putExtra(TaskListActivity.OPEN_FILTER, (Filter) null);
}});
}
})
.setNegativeButton(R.string.restart_later, null) .setNegativeButton(R.string.restart_later, null)
.show(); .show();
} }
@ -339,20 +292,17 @@ public class BasicPreferences extends InjectingPreferenceActivity implements
@Override @Override
public void purchaseCompleted(final boolean success, final String sku) { public void purchaseCompleted(final boolean success, final String sku) {
runOnUiThread(new Runnable() { runOnUiThread(() -> {
@Override if (getString(R.string.sku_tasker).equals(sku)) {
public void run() { ((TwoStatePreference) getPref(R.string.p_purchased_tasker)).setChecked(success);
if (getString(R.string.sku_tasker).equals(sku)) { } else if (getString(R.string.sku_tesla_unread).equals(sku)) {
((TwoStatePreference) getPref(R.string.p_purchased_tasker)).setChecked(success); ((TwoStatePreference) getPref(R.string.p_tesla_unread_enabled)).setChecked(success);
} else if (getString(R.string.sku_tesla_unread).equals(sku)) { } else if (getString(R.string.sku_dashclock).equals(sku)) {
((TwoStatePreference) getPref(R.string.p_tesla_unread_enabled)).setChecked(success); ((TwoStatePreference) getPref(R.string.p_purchased_dashclock)).setChecked(success);
} else if (getString(R.string.sku_dashclock).equals(sku)) { } else if (getString(R.string.sku_themes).equals(sku)) {
((TwoStatePreference) getPref(R.string.p_purchased_dashclock)).setChecked(success); ((TwoStatePreference) getPref(R.string.p_purchased_themes)).setChecked(success);
} else if (getString(R.string.sku_themes).equals(sku)) { } else {
((TwoStatePreference) getPref(R.string.p_purchased_themes)).setChecked(success); Timber.d("Unhandled sku: %s", sku);
} else {
Timber.d("Unhandled sku: %s", sku);
}
} }
}); });
} }

@ -53,15 +53,12 @@ public class DateShortcutPreferences extends InjectingPreferenceActivity impleme
private void initializeTimePreference(final TimePreference preference, final int requestCode) { private void initializeTimePreference(final TimePreference preference, final int requestCode) {
preference.setOnPreferenceChangeListener(this); preference.setOnPreferenceChangeListener(this);
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { preference.setOnPreferenceClickListener(ignored -> {
@Override final DateTime current = new DateTime().withMillisOfDay(preference.getMillisOfDay());
public boolean onPreferenceClick(Preference ignored) { startActivityForResult(new Intent(DateShortcutPreferences.this, TimePickerActivity.class) {{
final DateTime current = new DateTime().withMillisOfDay(preference.getMillisOfDay()); putExtra(TimePickerActivity.EXTRA_TIMESTAMP, current.getMillis());
startActivityForResult(new Intent(DateShortcutPreferences.this, TimePickerActivity.class) {{ }}, requestCode);
putExtra(TimePickerActivity.EXTRA_TIMESTAMP, current.getMillis()); return true;
}}, requestCode);
return true;
}
}); });
} }

@ -84,15 +84,12 @@ public class MiscellaneousPreferences extends InjectingPreferenceActivity {
} }
private void initializeAttachmentDirectoryPreference() { private void initializeAttachmentDirectoryPreference() {
findPreference(getString(R.string.p_attachment_dir)).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { findPreference(getString(R.string.p_attachment_dir)).setOnPreferenceClickListener(p -> {
@Override Intent filesDir = new Intent(MiscellaneousPreferences.this, FileExplore.class);
public boolean onPreferenceClick(Preference p) { filesDir.putExtra(FileExplore.EXTRA_DIRECTORY_MODE, true);
Intent filesDir = new Intent(MiscellaneousPreferences.this, FileExplore.class); filesDir.putExtra(FileExplore.EXTRA_START_PATH, getAttachmentDirectory());
filesDir.putExtra(FileExplore.EXTRA_DIRECTORY_MODE, true); startActivityForResult(filesDir, REQUEST_CODE_FILES_DIR);
filesDir.putExtra(FileExplore.EXTRA_START_PATH, getAttachmentDirectory()); return true;
startActivityForResult(filesDir, REQUEST_CODE_FILES_DIR);
return true;
}
}); });
updateAttachmentDirectory(); updateAttachmentDirectory();
} }
@ -108,45 +105,39 @@ public class MiscellaneousPreferences extends InjectingPreferenceActivity {
private void initializeCalendarReminderPreference() { private void initializeCalendarReminderPreference() {
CheckBoxPreference calendarReminderPreference = (CheckBoxPreference) findPreference(getString(R.string.p_calendar_reminders)); CheckBoxPreference calendarReminderPreference = (CheckBoxPreference) findPreference(getString(R.string.p_calendar_reminders));
calendarReminderPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { calendarReminderPreference.setOnPreferenceChangeListener((preference, newValue) -> {
@Override if (newValue == null) {
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue == null) {
return false;
}
if (!(Boolean) newValue) {
return true;
}
if (permissionRequestor.requestCalendarPermissions()) {
backgroundScheduler.scheduleCalendarNotifications();
return true;
}
return false; return false;
} }
if (!(Boolean) newValue) {
return true;
}
if (permissionRequestor.requestCalendarPermissions()) {
backgroundScheduler.scheduleCalendarNotifications();
return true;
}
return false;
}); });
calendarReminderPreference.setChecked(calendarReminderPreference.isChecked() && permissionChecker.canAccessCalendars()); calendarReminderPreference.setChecked(calendarReminderPreference.isChecked() && permissionChecker.canAccessCalendars());
} }
private void initializeVoiceReminderPreference() { private void initializeVoiceReminderPreference() {
findPreference(getString(R.string.p_voiceRemindersEnabled)).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { findPreference(getString(R.string.p_voiceRemindersEnabled)).setOnPreferenceChangeListener((preference, newValue) -> {
@Override boolean enabled = (boolean) newValue;
public boolean onPreferenceChange(Preference preference, Object newValue) { try {
boolean enabled = (boolean) newValue; if (enabled && !voiceOutputAssistant.isTTSInitialized()) {
try { Intent checkIntent = new Intent();
if (enabled && !voiceOutputAssistant.isTTSInitialized()) { checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
Intent checkIntent = new Intent(); startActivityForResult(checkIntent, REQUEST_CODE_TTS_CHECK);
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); } else if (!enabled && voiceOutputAssistant.isTTSInitialized()) {
startActivityForResult(checkIntent, REQUEST_CODE_TTS_CHECK); voiceOutputAssistant.shutdown();
} else if (!enabled && voiceOutputAssistant.isTTSInitialized()) {
voiceOutputAssistant.shutdown();
}
} catch (VerifyError e) {
Timber.e(e, e.getMessage());
preference.setEnabled(false);
preferences.setBoolean(preference.getKey(), false);
} }
return true; } catch (VerifyError e) {
Timber.e(e, e.getMessage());
preference.setEnabled(false);
preferences.setBoolean(preference.getKey(), false);
} }
return true;
}); });
} }

@ -35,15 +35,10 @@ public class ListNotificationReceiver extends InjectingBroadcastReceiver {
tracker.reportEvent(Tracking.Events.LEGACY_TASKER_TRIGGER); tracker.reportEvent(Tracking.Events.LEGACY_TASKER_TRIGGER);
executorService.execute(new Runnable() { executorService.execute(() -> notifier.triggerFilterNotification(
@Override intent.getStringExtra(EXTRA_FILTER_TITLE),
public void run() { intent.getStringExtra(EXTRA_FILTER_QUERY),
notifier.triggerFilterNotification( intent.getStringExtra(EXTRA_FILTER_VALUES)));
intent.getStringExtra(EXTRA_FILTER_TITLE),
intent.getStringExtra(EXTRA_FILTER_QUERY),
intent.getStringExtra(EXTRA_FILTER_VALUES));
}
});
} }
@Override @Override

@ -72,13 +72,10 @@ public class RepeatConfirmationReceiver extends BroadcastReceiver {
String dueDateString = getRelativeDateAndTimeString(activity, newDueDate); String dueDateString = getRelativeDateAndTimeString(activity, newDueDate);
String snackbarText = activity.getString(R.string.repeat_snackbar, task.getTitle(), dueDateString); String snackbarText = activity.getString(R.string.repeat_snackbar, task.getTitle(), dueDateString);
taskListFragment.makeSnackbar(snackbarText) taskListFragment.makeSnackbar(snackbarText)
.setAction(R.string.DLG_undo, new View.OnClickListener() { .setAction(R.string.DLG_undo, v -> {
@Override task.setDueDateAdjustingHideUntil(oldDueDate);
public void onClick(View v) { task.setCompletionDate(0L);
task.setDueDateAdjustingHideUntil(oldDueDate); taskService.save(task);
task.setCompletionDate(0L);
taskService.save(task);
}
}) })
.show(); .show();
} }

@ -25,14 +25,9 @@ public class TaskNotificationReceiver extends InjectingBroadcastReceiver {
public void onReceive(Context context, final Intent intent) { public void onReceive(Context context, final Intent intent) {
super.onReceive(context, intent); super.onReceive(context, intent);
executorService.execute(new Runnable() { executorService.execute(() -> notifier.triggerTaskNotification(
@Override intent.getLongExtra(ID_KEY, 0),
public void run() { intent.getIntExtra(EXTRAS_TYPE, (byte) 0)));
notifier.triggerTaskNotification(
intent.getLongExtra(ID_KEY, 0),
intent.getIntExtra(EXTRAS_TYPE, (byte) 0));
}
});
} }
@Override @Override

@ -49,20 +49,17 @@ public class MissedCallDialog extends InjectingDialogFragment {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setTitle(title) .setTitle(title)
.setItems(actions, new DialogInterface.OnClickListener() { .setItems(actions, (dialog, which) -> {
@Override switch (which) {
public void onClick(DialogInterface dialog, int which) { case 0:
switch (which) { handler.callNow();
case 0: break;
handler.callNow(); case 1:
break; handler.callLater();
case 1: break;
handler.callLater(); default:
break; handler.ignore();
default: break;
handler.ignore();
break;
}
} }
}) })
.show(); .show();

@ -50,20 +50,17 @@ public class NotificationDialog extends InjectingDialogFragment {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setTitle(title) .setTitle(title)
.setItems(items, new DialogInterface.OnClickListener() { .setItems(items, (dialog, which) -> {
@Override switch (which) {
public void onClick(DialogInterface dialog, int which) { case 0:
switch (which) { handler.edit();
case 0: break;
handler.edit(); case 1:
break; handler.snooze();
case 1: break;
handler.snooze(); case 2:
break; handler.complete();
case 2: break;
handler.complete();
break;
}
} }
}) })
.show(); .show();

@ -46,20 +46,17 @@ public class SnoozeDialog extends InjectingDialogFragment {
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setTitle(R.string.rmd_NoA_snooze) .setTitle(R.string.rmd_NoA_snooze)
.setItems(items, new DialogInterface.OnClickListener() { .setItems(items, (dialog, which) -> {
@Override switch (which) {
public void onClick(DialogInterface dialog, int which) { case 0:
switch (which) { case 1:
case 0: case 2:
case 1: snoozeCallback.snoozeForTime(snoozeOptions.get(which).getDateTime());
case 2: break;
snoozeCallback.snoozeForTime(snoozeOptions.get(which).getDateTime()); case 3:
break; dialog.dismiss();
case 3: snoozeCallback.pickDateTime();
dialog.dismiss(); break;
snoozeCallback.pickDateTime();
break;
}
} }
}) })
.show(); .show();

@ -65,14 +65,11 @@ public class BackupIntentService extends MidnightIntentService {
} }
private void deleteOldBackups() { private void deleteOldBackups() {
FileFilter backupFileFilter = new FileFilter() { FileFilter backupFileFilter = file -> {
@Override if (file.getName().matches(BACKUP_FILE_NAME_REGEX)) {
public boolean accept(File file) { return true;
if (file.getName().matches(BACKUP_FILE_NAME_REGEX)) {
return true;
}
return false;
} }
return false;
}; };
File astridDir = preferences.getBackupDirectory(); File astridDir = preferences.getBackupDirectory();
if(astridDir == null) { if(astridDir == null) {
@ -85,12 +82,7 @@ public class BackupIntentService extends MidnightIntentService {
return; return;
} }
Arrays.sort(files, new Comparator<File>() { Arrays.sort(files, (file1, file2) -> -Long.valueOf(file1.lastModified()).compareTo(file2.lastModified()));
@Override
public int compare(File file1, File file2) {
return -Long.valueOf(file1.lastModified()).compareTo(file2.lastModified());
}
});
for(int i = DAYS_TO_KEEP_BACKUP; i < files.length; i++) { for(int i = DAYS_TO_KEEP_BACKUP; i < files.length; i++) {
if(!files[i].delete()) { if(!files[i].delete()) {
Timber.i("Unable to delete: %s", files[i]); Timber.i("Unable to delete: %s", files[i]);

@ -41,12 +41,7 @@ public class RefreshScheduler {
Criterion criterion = Criterion.or( Criterion criterion = Criterion.or(
Criterion.and(Task.HIDE_UNTIL.gt(now), Task.HIDE_UNTIL.lt(midnight)), Criterion.and(Task.HIDE_UNTIL.gt(now), Task.HIDE_UNTIL.lt(midnight)),
Criterion.and(Task.DUE_DATE.gt(now), Task.DUE_DATE.lt(midnight))); Criterion.and(Task.DUE_DATE.gt(now), Task.DUE_DATE.lt(midnight)));
taskDao.selectActive(criterion, new Callback<Task>() { taskDao.selectActive(criterion, this::scheduleRefresh);
@Override
public void apply(Task task) {
scheduleRefresh(task);
}
});
} }
public void scheduleRefresh(Task task) { public void scheduleRefresh(Task task) {

@ -39,17 +39,14 @@ public class SyncExecutor {
} }
private Runnable wrapWithExceptionHandling(final SyncResultCallback callback, final Runnable command) { private Runnable wrapWithExceptionHandling(final SyncResultCallback callback, final Runnable command) {
return new Runnable() { return () -> {
@Override try {
public void run() { command.run();
try { } catch (Exception e) {
command.run(); Timber.e(e, e.getMessage());
} catch (Exception e) { tracker.reportException(e);
Timber.e(e, e.getMessage()); executor.shutdownNow();
tracker.reportException(e); callback.finished();
executor.shutdownNow();
callback.finished();
}
} }
}; };
} }

@ -217,12 +217,9 @@ public class CalendarControlSet extends TaskEditControlFragment {
clear(); clear();
} else { } else {
dialogBuilder.newMessageDialog(R.string.delete_calendar_event_confirmation) dialogBuilder.newMessageDialog(R.string.delete_calendar_event_confirmation)
.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.delete, (dialog, which) -> {
@Override if (permissionRequestor.requestCalendarPermissions(REQUEST_CODE_CLEAR_EVENT)) {
public void onClick(DialogInterface dialog, int which) { clear();
if (permissionRequestor.requestCalendarPermissions(REQUEST_CODE_CLEAR_EVENT)) {
clear();
}
} }
}) })
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save