Don't setup checkboxes in constructors

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

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

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

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

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