mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-09 18:48:51 -06:00
Change habit.color palette according to current theme
This commit is contained in:
@@ -25,6 +25,7 @@ import android.graphics.drawable.ColorDrawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.isoron.uhabits.helpers.ColorHelper;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
public class ShowHabitActivity extends BaseActivity
|
||||
@@ -44,7 +45,11 @@ public class ShowHabitActivity extends BaseActivity
|
||||
{
|
||||
actionBar.setTitle(getHabit().name);
|
||||
if (android.os.Build.VERSION.SDK_INT >= 21)
|
||||
actionBar.setBackgroundDrawable(new ColorDrawable(getHabit().color));
|
||||
{
|
||||
int androidColor = ColorHelper.getColor(this, getHabit().color);
|
||||
ColorDrawable drawable = new ColorDrawable(androidColor);
|
||||
actionBar.setBackgroundDrawable(drawable);
|
||||
}
|
||||
}
|
||||
|
||||
setContentView(R.layout.show_habit_activity);
|
||||
|
||||
@@ -40,14 +40,14 @@ import com.android.colorpicker.ColorPickerSwatch;
|
||||
import com.android.datetimepicker.time.RadialPickerLayout;
|
||||
import com.android.datetimepicker.time.TimePickerDialog;
|
||||
|
||||
import org.isoron.uhabits.helpers.ColorHelper;
|
||||
import org.isoron.uhabits.helpers.DateHelper;
|
||||
import org.isoron.uhabits.helpers.UIHelper.OnSavedListener;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.commands.Command;
|
||||
import org.isoron.uhabits.commands.CreateHabitCommand;
|
||||
import org.isoron.uhabits.commands.EditHabitCommand;
|
||||
import org.isoron.uhabits.dialogs.WeekdayPickerDialog;
|
||||
import org.isoron.uhabits.helpers.ColorHelper;
|
||||
import org.isoron.uhabits.helpers.DateHelper;
|
||||
import org.isoron.uhabits.helpers.UIHelper.OnSavedListener;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
import java.util.Arrays;
|
||||
@@ -138,7 +138,7 @@ public class EditHabitFragment extends DialogFragment
|
||||
modifiedHabit = new Habit();
|
||||
modifiedHabit.freqNum = 1;
|
||||
modifiedHabit.freqDen = 1;
|
||||
modifiedHabit.color = prefs.getInt("pref_default_habit_color", modifiedHabit.color);
|
||||
modifiedHabit.color = prefs.getInt("pref_default_habit_palette_color", modifiedHabit.color);
|
||||
}
|
||||
else if (mode == EDIT_MODE)
|
||||
{
|
||||
@@ -174,13 +174,13 @@ public class EditHabitFragment extends DialogFragment
|
||||
return view;
|
||||
}
|
||||
|
||||
private void changeColor(Integer color)
|
||||
private void changeColor(int paletteColor)
|
||||
{
|
||||
modifiedHabit.color = color;
|
||||
tvName.setTextColor(color);
|
||||
modifiedHabit.color = paletteColor;
|
||||
tvName.setTextColor(ColorHelper.getColor(getActivity(), paletteColor));
|
||||
|
||||
SharedPreferences.Editor editor = prefs.edit();
|
||||
editor.putInt("pref_default_habit_color", color);
|
||||
editor.putInt("pref_default_habit_palette_color", paletteColor);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
@@ -237,15 +237,18 @@ public class EditHabitFragment extends DialogFragment
|
||||
|
||||
private void onColorButtonClick()
|
||||
{
|
||||
int originalAndroidColor = ColorHelper.getColor(getActivity(), modifiedHabit.color);
|
||||
|
||||
ColorPickerDialog picker = ColorPickerDialog.newInstance(
|
||||
R.string.color_picker_default_title, ColorHelper.palette, modifiedHabit.color, 4,
|
||||
ColorPickerDialog.SIZE_SMALL);
|
||||
R.string.color_picker_default_title, ColorHelper.getPalette(getActivity()),
|
||||
originalAndroidColor, 4, ColorPickerDialog.SIZE_SMALL);
|
||||
|
||||
picker.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener()
|
||||
{
|
||||
public void onColorSelected(int color)
|
||||
public void onColorSelected(int androidColor)
|
||||
{
|
||||
changeColor(color);
|
||||
int paletteColor = ColorHelper.colorToPaletteIndex(getActivity(), androidColor);
|
||||
changeColor(paletteColor);
|
||||
}
|
||||
});
|
||||
picker.show(getFragmentManager(), "picker");
|
||||
|
||||
@@ -29,8 +29,8 @@ import android.widget.ProgressBar;
|
||||
import com.android.colorpicker.ColorPickerDialog;
|
||||
import com.android.colorpicker.ColorPickerSwatch;
|
||||
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.BaseActivity;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.commands.ArchiveHabitsCommand;
|
||||
import org.isoron.uhabits.commands.ChangeHabitColorCommand;
|
||||
import org.isoron.uhabits.commands.DeleteHabitsCommand;
|
||||
@@ -163,15 +163,20 @@ public class HabitSelectionCallback implements ActionMode.Callback
|
||||
|
||||
case R.id.action_color:
|
||||
{
|
||||
ColorPickerDialog picker = ColorPickerDialog.newInstance(R.string.color_picker_default_title,
|
||||
ColorHelper.palette, firstHabit.color, 4, ColorPickerDialog.SIZE_SMALL);
|
||||
int originalAndroidColor = ColorHelper.getColor(activity, firstHabit.color);
|
||||
|
||||
ColorPickerDialog picker = ColorPickerDialog.newInstance(
|
||||
R.string.color_picker_default_title, ColorHelper.getPalette(activity),
|
||||
originalAndroidColor, 4, ColorPickerDialog.SIZE_SMALL);
|
||||
|
||||
picker.setOnColorSelectedListener(new ColorPickerSwatch.OnColorSelectedListener()
|
||||
{
|
||||
public void onColorSelected(int color)
|
||||
public void onColorSelected(int androidColor)
|
||||
{
|
||||
activity.executeCommand(
|
||||
new ChangeHabitColorCommand(selectedHabits, color), null);
|
||||
int paletteColor = ColorHelper.colorToPaletteIndex(activity,
|
||||
androidColor);
|
||||
activity.executeCommand(new ChangeHabitColorCommand(selectedHabits,
|
||||
paletteColor), null);
|
||||
mode.finish();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -163,7 +163,8 @@ public class ShowHabitFragment extends Fragment
|
||||
float percentage = todayValue / Score.MAX_VALUE;
|
||||
|
||||
RingView scoreRing = (RingView) view.findViewById(R.id.scoreRing);
|
||||
scoreRing.setColor(habit.color);
|
||||
int androidColor = ColorHelper.getColor(getActivity(), habit.color);
|
||||
scoreRing.setColor(androidColor);
|
||||
scoreRing.setPercentage(percentage);
|
||||
}
|
||||
|
||||
@@ -173,7 +174,8 @@ public class ShowHabitFragment extends Fragment
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= 21)
|
||||
{
|
||||
int darkerHabitColor = ColorHelper.mixColors(habit.color, Color.BLACK, 0.75f);
|
||||
int color = ColorHelper.getColor(getActivity(), habit.color);
|
||||
int darkerHabitColor = ColorHelper.mixColors(color, Color.BLACK, 0.75f);
|
||||
activity.getWindow().setStatusBarColor(darkerHabitColor);
|
||||
}
|
||||
|
||||
@@ -189,7 +191,8 @@ public class ShowHabitFragment extends Fragment
|
||||
if(habit == null) return;
|
||||
|
||||
TextView textView = (TextView) view.findViewById(viewId);
|
||||
textView.setTextColor(habit.color);
|
||||
int androidColor = ColorHelper.getColor(activity, habit.color);
|
||||
textView.setTextColor(androidColor);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,27 +19,91 @@
|
||||
|
||||
package org.isoron.uhabits.helpers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.util.Log;
|
||||
|
||||
import org.isoron.uhabits.R;
|
||||
|
||||
public class ColorHelper
|
||||
{
|
||||
public static final int[] palette =
|
||||
|
||||
public static int CSV_PALETTE[] =
|
||||
{
|
||||
Color.parseColor("#D32F2F"), // red
|
||||
Color.parseColor("#E64A19"), // orange
|
||||
Color.parseColor("#F9A825"), // yellow
|
||||
Color.parseColor("#AFB42B"), // light green
|
||||
Color.parseColor("#388E3C"), // dark green
|
||||
Color.parseColor("#00897B"), // teal
|
||||
Color.parseColor("#00ACC1"), // cyan
|
||||
Color.parseColor("#039BE5"), // blue
|
||||
Color.parseColor("#5E35B1"), // deep purple
|
||||
Color.parseColor("#8E24AA"), // purple
|
||||
Color.parseColor("#D81B60"), // pink
|
||||
Color.parseColor("#303030"), // dark grey
|
||||
Color.parseColor("#aaaaaa") // light grey
|
||||
Color.parseColor("#D32F2F"), // red
|
||||
Color.parseColor("#E64A19"), // orange
|
||||
Color.parseColor("#F9A825"), // yellow
|
||||
Color.parseColor("#AFB42B"), // light green
|
||||
Color.parseColor("#388E3C"), // dark green
|
||||
Color.parseColor("#00897B"), // teal
|
||||
Color.parseColor("#00ACC1"), // cyan
|
||||
Color.parseColor("#039BE5"), // blue
|
||||
Color.parseColor("#5E35B1"), // deep purple
|
||||
Color.parseColor("#8E24AA"), // purple
|
||||
Color.parseColor("#D81B60"), // pink
|
||||
Color.parseColor("#303030"), // dark grey
|
||||
Color.parseColor("#aaaaaa") // light grey
|
||||
};
|
||||
|
||||
public static int colorToPaletteIndex(Context context, int color)
|
||||
{
|
||||
int[] palette = getPalette(context);
|
||||
|
||||
for(int k = 0; k < palette.length; k++)
|
||||
if(palette[k] == color) return k;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static int[] getPalette(Context context)
|
||||
{
|
||||
int[] attr = new int[] { R.attr.palette };
|
||||
TypedArray array = context.obtainStyledAttributes(attr);
|
||||
int resourceId = array.getResourceId(0, -1);
|
||||
array.recycle();
|
||||
|
||||
if(resourceId < 0)
|
||||
{
|
||||
Log.w("ColorHelper", "could not find palette resource. Returning CSV palette");
|
||||
return CSV_PALETTE;
|
||||
}
|
||||
|
||||
return context.getResources().getIntArray(resourceId);
|
||||
}
|
||||
|
||||
public static int getColor(Context context, int paletteColor)
|
||||
{
|
||||
|
||||
if(context == null) throw new IllegalArgumentException("Context is null");
|
||||
int palette[] = getPalette(context);
|
||||
if(paletteColor < 0 || paletteColor >= palette.length)
|
||||
{
|
||||
// TODO: Write DB migration and change warnings to runtime exceptions
|
||||
int androidColor = paletteColor;
|
||||
paletteColor = -1;
|
||||
|
||||
Log.w("ColorHelper", "Invalid palette color detected. Trying to convert.");
|
||||
|
||||
for(int k = 0; k < CSV_PALETTE.length; k++)
|
||||
{
|
||||
if (CSV_PALETTE[k] == androidColor)
|
||||
{
|
||||
paletteColor = k;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(paletteColor < 0)
|
||||
{
|
||||
Log.w("ColorHelper", "Conversion failed. Returning default.");
|
||||
paletteColor = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return palette[paletteColor];
|
||||
}
|
||||
|
||||
public static int mixColors(int color1, int color2, float amount)
|
||||
{
|
||||
final byte ALPHA_CHANNEL = 24;
|
||||
|
||||
@@ -93,7 +93,7 @@ public class ListHabitsHelper
|
||||
|
||||
public int getActiveColor(Habit habit)
|
||||
{
|
||||
int activeColor = habit.color;
|
||||
int activeColor = ColorHelper.getColor(context, habit.color);
|
||||
if(habit.isArchived()) activeColor = inactiveColor;
|
||||
|
||||
return activeColor;
|
||||
@@ -221,9 +221,11 @@ public class ListHabitsHelper
|
||||
|
||||
public void toggleCheckmarkView(View v, Habit habit)
|
||||
{
|
||||
int androidColor = ColorHelper.getColor(context, habit.color);
|
||||
|
||||
if (v.getTag(R.string.toggle_key).equals(2))
|
||||
updateCheckmark(habit.color, (TextView) v, 0);
|
||||
updateCheckmark(androidColor, (TextView) v, 0);
|
||||
else
|
||||
updateCheckmark(habit.color, (TextView) v, 2);
|
||||
updateCheckmark(androidColor, (TextView) v, 2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,11 @@ public class Habit extends Model
|
||||
public Integer freqDen;
|
||||
|
||||
/**
|
||||
* Color of the habit. The format is the same as android.graphics.Color.
|
||||
* Color of the habit.
|
||||
*
|
||||
* This number is not an android.graphics.Color, but an index to the activity color palette,
|
||||
* which changes according to the theme. To convert this color into an android.graphics.Color,
|
||||
* use ColorHelper.getColor(context, habit.color).
|
||||
*/
|
||||
@Column(name = "color")
|
||||
public Integer color;
|
||||
@@ -166,7 +170,7 @@ public class Habit extends Model
|
||||
*/
|
||||
public Habit()
|
||||
{
|
||||
this.color = ColorHelper.palette[5];
|
||||
this.color = 5;
|
||||
this.position = Habit.countWithArchived();
|
||||
this.highlight = 0;
|
||||
this.archived = 0;
|
||||
@@ -492,8 +496,15 @@ public class Habit extends Model
|
||||
|
||||
for(Habit habit : habits)
|
||||
{
|
||||
String[] cols = { habit.name, habit.description, Integer.toString(habit.freqNum),
|
||||
Integer.toString(habit.freqDen), ColorHelper.toHTML(habit.color) };
|
||||
String[] cols =
|
||||
{
|
||||
habit.name,
|
||||
habit.description,
|
||||
Integer.toString(habit.freqNum),
|
||||
Integer.toString(habit.freqDen),
|
||||
ColorHelper.toHTML(ColorHelper.CSV_PALETTE[habit.color])
|
||||
};
|
||||
|
||||
csv.writeNext(cols, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ public class CheckmarkView extends View implements HabitDataView
|
||||
fa_check = context.getString(R.string.fa_check);
|
||||
fa_times = context.getString(R.string.fa_times);
|
||||
|
||||
primaryColor = ColorHelper.palette[10];
|
||||
primaryColor = ColorHelper.getColor(getContext(), 10);
|
||||
timesColor = Color.argb(128, 255, 255, 255);
|
||||
darkGrey = Color.argb(64, 0, 0, 0);
|
||||
|
||||
@@ -184,8 +184,9 @@ public class CheckmarkView extends View implements HabitDataView
|
||||
public void refreshData()
|
||||
{
|
||||
this.check_status = habit.checkmarks.getTodayValue();
|
||||
this.primaryColor = Color.argb(230, Color.red(habit.color), Color.green(habit.color),
|
||||
Color.blue(habit.color));
|
||||
int color = ColorHelper.getColor(getContext(), habit.color);
|
||||
this.primaryColor = Color.argb(230, Color.red(color), Color.green(color),
|
||||
Color.blue(color));
|
||||
this.label = habit.name;
|
||||
|
||||
updateLabel();
|
||||
|
||||
@@ -73,7 +73,7 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV
|
||||
public HabitFrequencyView(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
this.primaryColor = ColorHelper.palette[7];
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), 7);
|
||||
this.frequency = new HashMap<>();
|
||||
init();
|
||||
}
|
||||
@@ -101,7 +101,9 @@ public class HabitFrequencyView extends ScrollableDataView implements HabitDataV
|
||||
private void createColors()
|
||||
{
|
||||
if(habit != null)
|
||||
this.primaryColor = habit.color;
|
||||
{
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), habit.color);
|
||||
}
|
||||
|
||||
if (isBackgroundTransparent)
|
||||
{
|
||||
|
||||
@@ -97,7 +97,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
||||
|
||||
isEditable = false;
|
||||
checkmarks = new int[0];
|
||||
primaryColor = ColorHelper.palette[7];
|
||||
primaryColor = ColorHelper.getColor(getContext(), 7);
|
||||
wdays = DateHelper.getShortDayNames();
|
||||
dfMonth = DateHelper.getDateFormat("MMM");
|
||||
dfYear = DateHelper.getDateFormat("yyyy");
|
||||
@@ -164,7 +164,7 @@ public class HabitHistoryView extends ScrollableDataView implements HabitDataVie
|
||||
private void createColors()
|
||||
{
|
||||
if(habit != null)
|
||||
this.primaryColor = habit.color;
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), habit.color);
|
||||
|
||||
if(isBackgroundTransparent)
|
||||
primaryColor = ColorHelper.setMinValue(primaryColor, 0.75f);
|
||||
|
||||
@@ -86,7 +86,7 @@ public class HabitScoreView extends ScrollableDataView implements HabitDataView
|
||||
public HabitScoreView(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
this.primaryColor = ColorHelper.palette[7];
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), 7);
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ public class HabitScoreView extends ScrollableDataView implements HabitDataView
|
||||
private void createColors()
|
||||
{
|
||||
if(habit != null)
|
||||
this.primaryColor = habit.color;
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), habit.color);
|
||||
|
||||
if (isBackgroundTransparent)
|
||||
{
|
||||
|
||||
@@ -72,7 +72,7 @@ public class HabitStreakView extends View implements HabitDataView
|
||||
public HabitStreakView(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
this.primaryColor = ColorHelper.palette[7];
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), 7);
|
||||
init();
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ public class HabitStreakView extends View implements HabitDataView
|
||||
private void createColors()
|
||||
{
|
||||
if(habit != null)
|
||||
this.primaryColor = habit.color;
|
||||
this.primaryColor = ColorHelper.getColor(getContext(), habit.color);
|
||||
|
||||
if(isBackgroundTransparent)
|
||||
{
|
||||
|
||||
@@ -71,7 +71,7 @@ public class NumberView extends View
|
||||
this.textSize = UIHelper.getFloatAttribute(context, attrs, "textSize",
|
||||
getResources().getDimension(R.dimen.regularTextSize));
|
||||
|
||||
this.color = ColorHelper.palette[7];
|
||||
this.color = ColorHelper.getColor(getContext(), 7);
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.helpers.ColorHelper;
|
||||
import org.isoron.uhabits.helpers.DateHelper;
|
||||
import org.isoron.uhabits.helpers.UIHelper;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
@@ -79,6 +80,6 @@ public class RepetitionCountView extends NumberView implements HabitDataView
|
||||
public void setHabit(Habit habit)
|
||||
{
|
||||
this.habit = habit;
|
||||
setColor(habit.color);
|
||||
setColor(ColorHelper.getColor(getContext(), habit.color));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user