Don't setup checkboxes in constructors

This was involved in an ANR
pull/795/head
Alex Baker 7 years ago
parent 99303b9e56
commit 74cf0fc378

@ -402,7 +402,7 @@ public class TaskListFragment extends InjectingFragment
private void setupRefresh(SwipeRefreshLayout layout) { private void setupRefresh(SwipeRefreshLayout layout) {
layout.setOnRefreshListener(this); layout.setOnRefreshListener(this);
layout.setColorSchemeColors(checkBoxes.getPriorityColorsArray()); layout.setColorSchemeColors(checkBoxes.getPriorityColors());
} }
@Override @Override

@ -170,14 +170,13 @@ public class Astrid2TaskProvider extends InjectingContentProvider {
*/ */
private Cursor getTasks() { private Cursor getTasks() {
MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST); MatrixCursor ret = new MatrixCursor(TASK_FIELD_LIST);
List<Integer> importanceColors = checkBoxes.get().getPriorityColors();
List<Task> tasks = taskDao.get().getAstrid2TaskProviderTasks(); List<Task> tasks = taskDao.get().getAstrid2TaskProviderTasks();
for (Task task : tasks) { for (Task task : tasks) {
String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR); String taskTags = getTagsAsString(task.getId(), TAG_SEPARATOR);
Object[] values = new Object[7]; Object[] values = new Object[7];
values[0] = task.getTitle(); values[0] = task.getTitle();
values[1] = importanceColors.get(task.getPriority()); values[1] = checkBoxes.get().getPriorityColor(task.getPriority());
values[2] = task.getDueDate(); values[2] = task.getDueDate();
values[3] = task.getDueDate(); values[3] = task.getDueDate();
values[4] = task.getPriority(); values[4] = task.getPriority();

@ -4,11 +4,9 @@ import static androidx.core.content.ContextCompat.getColor;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Ints;
import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.R; import org.tasks.R;
import org.tasks.injection.ApplicationScope; import org.tasks.injection.ApplicationScope;
@ -17,45 +15,36 @@ import org.tasks.injection.ForApplication;
@ApplicationScope @ApplicationScope
public class CheckBoxes { public class CheckBoxes {
private static final int MAX_IMPORTANCE_INDEX = 3; private static final int MIN_PRIORITY = 0;
private static final int MAX_PRIORITY = 3;
private final List<Drawable> checkboxes; private final Drawable[] checkboxes = new Drawable[4];
private final List<Drawable> repeatingCheckboxes; private final Drawable[] repeatingCheckboxes = new Drawable[4];
private final List<Drawable> completedCheckboxes; private final Drawable[] completedCheckboxes = new Drawable[4];
private final List<Integer> priorityColors; private final Context context;
private final int[] priorityColorsArray; private final int[] priorityColors;
@Inject @Inject
public CheckBoxes(@ForApplication Context context) { public CheckBoxes(@ForApplication Context context) {
checkboxes = wrapDrawable(context, R.drawable.ic_outline_check_box_outline_blank_24px); this.context = context;
repeatingCheckboxes = wrapDrawable(context, R.drawable.ic_outline_repeat_24px);
completedCheckboxes = wrapDrawable(context, R.drawable.ic_outline_check_box_24px);
priorityColors = priorityColors =
ImmutableList.of( new int[] {
getColor(context, R.color.priority_1), getColor(context, R.color.priority_1),
getColor(context, R.color.priority_2), getColor(context, R.color.priority_2),
getColor(context, R.color.priority_3), getColor(context, R.color.priority_3),
getColor(context, R.color.priority_4)); getColor(context, R.color.priority_4)
priorityColorsArray = Ints.toArray(priorityColors); };
} }
private static List<Drawable> wrapDrawable(Context context, int resId) { private static Drawable getDrawable(Context context, @DrawableRes int resId, int priority) {
return ImmutableList.of(
getDrawable(context, resId, 0),
getDrawable(context, resId, 1),
getDrawable(context, resId, 2),
getDrawable(context, resId, 3));
}
private static Drawable getDrawable(Context context, int resId, int importance) {
Drawable original = ContextCompat.getDrawable(context, resId); Drawable original = ContextCompat.getDrawable(context, resId);
Drawable wrapped = DrawableCompat.wrap(original.mutate()); Drawable wrapped = DrawableCompat.wrap(original.mutate());
DrawableCompat.setTint(wrapped, getColor(context, getPriorityResId(importance))); DrawableCompat.setTint(wrapped, getColor(context, getPriorityResId(priority)));
return wrapped; return wrapped;
} }
private static int getPriorityResId(int importance) { private static int getPriorityResId(int priority) {
switch (importance) { switch (priority) {
case 0: case 0:
return R.color.priority_1; return R.color.priority_1;
case 1: case 1:
@ -68,38 +57,37 @@ public class CheckBoxes {
} }
public int getPriorityColor(int priority) { public int getPriorityColor(int priority) {
return priorityColors.get(Math.max(0, Math.min(3, priority))); return priorityColors[Math.max(MIN_PRIORITY, Math.min(MAX_PRIORITY, priority))];
} }
public List<Integer> getPriorityColors() { public int[] getPriorityColors() {
return priorityColors; return priorityColors;
} }
public int[] getPriorityColorsArray() { public Drawable getCompletedCheckbox(int priority) {
return priorityColorsArray; priority = Math.min(priority, MAX_PRIORITY);
} if (completedCheckboxes[priority] == null) {
completedCheckboxes[priority] =
List<Drawable> getCheckBoxes() { getDrawable(context, R.drawable.ic_outline_check_box_24px, priority);
return checkboxes; }
} return completedCheckboxes[priority];
List<Drawable> getRepeatingCheckBoxes() {
return repeatingCheckboxes;
}
List<Drawable> getCompletedCheckBoxes() {
return completedCheckboxes;
}
public Drawable getCompletedCheckbox(int importance) {
return completedCheckboxes.get(Math.min(importance, MAX_IMPORTANCE_INDEX));
} }
public Drawable getRepeatingCheckBox(int importance) { public Drawable getRepeatingCheckBox(int priority) {
return repeatingCheckboxes.get(Math.min(importance, MAX_IMPORTANCE_INDEX)); priority = Math.min(priority, MAX_PRIORITY);
if (repeatingCheckboxes[priority] == null) {
repeatingCheckboxes[priority] =
getDrawable(context, R.drawable.ic_outline_repeat_24px, priority);
}
return repeatingCheckboxes[priority];
} }
public Drawable getCheckBox(int importance) { public Drawable getCheckBox(int priority) {
return checkboxes.get(Math.min(importance, MAX_IMPORTANCE_INDEX)); priority = Math.min(priority, MAX_PRIORITY);
if (checkboxes[priority] == null) {
checkboxes[priority] =
getDrawable(context, R.drawable.ic_outline_check_box_outline_blank_24px, priority);
}
return checkboxes[priority];
} }
} }

@ -120,7 +120,7 @@ public class PriorityControlSet extends TaskEditControlFragment {
} }
private void tintRadioButton(AppCompatRadioButton radioButton, int priority) { private void tintRadioButton(AppCompatRadioButton radioButton, int priority) {
int color = checkBoxes.getPriorityColors().get(priority); int color = checkBoxes.getPriorityColor(priority);
CompoundButtonCompat.setButtonTintList( CompoundButtonCompat.setButtonTintList(
radioButton, radioButton,
new ColorStateList( new ColorStateList(

@ -1,68 +1,51 @@
package org.tasks.ui; package org.tasks.ui;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.transform;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.injection.ApplicationScope; import org.tasks.injection.ApplicationScope;
import timber.log.Timber;
@ApplicationScope @ApplicationScope
public class WidgetCheckBoxes { public class WidgetCheckBoxes {
private final List<Bitmap> checkboxes; private final CheckBoxes checkBoxes;
private final List<Bitmap> repeatingCheckboxes; private final Bitmap[] incomplete = new Bitmap[4];
private final List<Bitmap> completedCheckboxes; private final Bitmap[] repeating = new Bitmap[4];
private final Bitmap[] completed = new Bitmap[4];
@Inject @Inject
public WidgetCheckBoxes(CheckBoxes checkBoxes) { public WidgetCheckBoxes(CheckBoxes checkBoxes) {
Timber.d("Initializing widget checkboxes"); this.checkBoxes = checkBoxes;
checkboxes = convertToBitmap(checkBoxes.getCheckBoxes());
repeatingCheckboxes = convertToBitmap(checkBoxes.getRepeatingCheckBoxes());
completedCheckboxes = convertToBitmap(checkBoxes.getCompletedCheckBoxes());
} }
private static List<Bitmap> convertToBitmap(final List<Drawable> drawables) { private static Bitmap convertToBitmap(Drawable d) {
return newArrayList( Bitmap bitmap =
transform( Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
drawables, Canvas canvas = new Canvas(bitmap);
drawable -> { d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
if (drawable instanceof BitmapDrawable) { d.draw(canvas);
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; return bitmap;
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
Bitmap bitmap =
drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0
? Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888)
: Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}));
} }
public Bitmap getCompletedCheckbox(int importance) { public Bitmap getCompletedCheckbox(int importance) {
return completedCheckboxes.get(importance); if (completed[importance] == null) {
completed[importance] = convertToBitmap(checkBoxes.getCompletedCheckbox(importance));
}
return completed[importance];
} }
public Bitmap getRepeatingCheckBox(int importance) { public Bitmap getRepeatingCheckBox(int importance) {
return repeatingCheckboxes.get(importance); if (repeating[importance] == null) {
repeating[importance] = convertToBitmap(checkBoxes.getRepeatingCheckBox(importance));
}
return repeating[importance];
} }
public Bitmap getCheckBox(int importance) { public Bitmap getCheckBox(int importance) {
return checkboxes.get(importance); if (incomplete[importance] == null) {
incomplete[importance] = convertToBitmap(checkBoxes.getCheckBox(importance));
}
return incomplete[importance];
} }
} }

Loading…
Cancel
Save