diff --git a/ExaltedDice/res/values/strings.xml b/ExaltedDice/res/values/strings.xml
index 90fc667..fdea831 100755
--- a/ExaltedDice/res/values/strings.xml
+++ b/ExaltedDice/res/values/strings.xml
@@ -32,5 +32,7 @@
Tens count twice
Roll Modifier
Calculate Roll + Modifier
+ Highlight Color
+ Highlights your last roll in a custom color
\ No newline at end of file
diff --git a/ExaltedDice/res/xml/settings.xml b/ExaltedDice/res/xml/settings.xml
index 7f153aa..e681892 100644
--- a/ExaltedDice/res/xml/settings.xml
+++ b/ExaltedDice/res/xml/settings.xml
@@ -12,6 +12,11 @@
android:summary="@string/roll_mod_msg"
android:title="@string/roll_mod" />
+
+
diff --git a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ColorDialogPreference.java b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ColorDialogPreference.java
new file mode 100644
index 0000000..5d118ca
--- /dev/null
+++ b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ColorDialogPreference.java
@@ -0,0 +1,217 @@
+/**
+ * ColorDialogPreference.java
+ * @date Feb 6, 2012
+ * @author Casper Wakkers
+ */
+
+package com.TwentyCode.android.ExaltedDice;
+
+import android.app.AlertDialog.Builder;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.graphics.SweepGradient;
+import android.preference.DialogPreference;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * The ColorDialogPreference class is responsible for displaying a color
+ * palet where the user can select a color from.
+ * @author Casper Wakkers
+ */
+public class ColorDialogPreference extends DialogPreference {
+ /**
+ * Inner class representing the color chooser.
+ */
+ private class ColorPickerView extends View {
+ private static final int CENTER_X = 100;
+ private static final int CENTER_Y = 100;
+ private static final int CENTER_RADIUS = 32;
+
+ private Paint paint = null;
+ private Paint centerPaint = null;
+ private boolean trackingCenter = false;
+ private final int[] colors = new int[] {
+ 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
+ 0xFFFFFF00, 0xFFFF0000 };
+
+ /**
+ * @param context
+ * @param listener
+ * @param color
+ */
+ ColorPickerView(Context context, OnColorChangedListener listener,
+ int color) {
+ super(context);
+
+ paint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ paint.setShader(new SweepGradient(0, 0, colors, null));
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(32);
+
+ centerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ centerPaint.setColor(color);
+ centerPaint.setStrokeWidth(5);
+ }
+ /**
+ * @param s
+ * @param d
+ * @param p
+ * @return
+ */
+ private int ave(int s, int d, float p) {
+ return s + Math.round(p * (d - s));
+ }
+ /**
+ * @param colors
+ * @param unit
+ * @return
+ */
+ private int interpColor(int colors[], float unit) {
+ if (unit <= 0) {
+ return colors[0];
+ }
+
+ if (unit >= 1) {
+ return colors[colors.length - 1];
+ }
+
+ float p = unit * (colors.length - 1);
+ int i = (int) p;
+ p -= i;
+
+ // now p is just the fractional part [0...1) and i is the index
+ int c0 = colors[i];
+ int c1 = colors[i + 1];
+ int a = ave(Color.alpha(c0), Color.alpha(c1), p);
+ int r = ave(Color.red(c0), Color.red(c1), p);
+ int g = ave(Color.green(c0), Color.green(c1), p);
+ int b = ave(Color.blue(c0), Color.blue(c1), p);
+
+ return Color.argb(a, r, g, b);
+ }
+ /**
+ * {@inheritDoc}
+ */
+ protected void onDraw(Canvas canvas) {
+ int centerX = getRootView().getWidth()/2 -
+ (int)(paint.getStrokeWidth()/2);
+ float r = CENTER_X - paint.getStrokeWidth()*0.5f;
+
+ canvas.translate(centerX, CENTER_Y);
+ canvas.drawOval(new RectF(-r, -r, r, r), paint);
+ canvas.drawCircle(0, 0, CENTER_RADIUS, centerPaint);
+
+ if (trackingCenter) {
+ int c = centerPaint.getColor();
+ centerPaint.setStyle(Paint.Style.STROKE);
+ centerPaint.setAlpha(0x80);
+
+ canvas.drawCircle(0, 0, CENTER_RADIUS +
+ centerPaint.getStrokeWidth(), centerPaint);
+
+ centerPaint.setStyle(Paint.Style.FILL);
+ centerPaint.setColor(c);
+ }
+ }
+ /**
+ * {@inheritDoc}
+ */
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = getRootView().getWidth();
+
+ if (width == 0) {
+ width = CENTER_X*2 + 50;
+ }
+
+ setMeasuredDimension(width, CENTER_Y*2);
+ }
+ /**
+ * {@inheritDoc}
+ */
+ public boolean onTouchEvent(MotionEvent event) {
+ float x = event.getX() - getRootView().getWidth()/2;
+ float y = event.getY() - CENTER_Y;
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ case MotionEvent.ACTION_MOVE:
+ float angle = (float) java.lang.Math.atan2(y, x);
+ // need to turn angle [-PI ... PI] into unit [0....1]
+ float unit = (float)(angle / (2 * Math.PI));
+
+ if (unit < 0) {
+ unit += 1;
+ }
+
+ centerPaint.setColor(interpColor(colors, unit));
+ invalidate();
+ break;
+ case MotionEvent.ACTION_UP:
+ ColorDialogPreference.this.color = centerPaint.getColor();
+ break;
+ }
+
+ return true;
+ }
+ }
+ /**
+ * Interface describing a color change listener.
+ */
+ public interface OnColorChangedListener {
+ /**
+ * Method colorChanged is called when a new color is selected.
+ * @param color new color.
+ */
+ void colorChanged(int color);
+ }
+
+ private int color = 0;
+
+ // Color change listener.
+ private OnColorChangedListener dialogColorChangedListener = null;
+
+ /**
+ * ColorDialogPreference constructor.
+ * @param context of this class.
+ * @param attrs custom xml attributes.
+ */
+ public ColorDialogPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+ /**
+ * {@inheritDoc}
+ */
+ protected void onDialogClosed(boolean positiveResult) {
+ // Persist the color after the ok button is clicked.
+ if (positiveResult && color != 0) {
+ persistInt(color);
+ }
+
+ super.onDialogClosed(positiveResult);
+ }
+ /**
+ * {@inheritDoc}
+ */
+ protected void onPrepareDialogBuilder(Builder builder) {
+ dialogColorChangedListener = new OnColorChangedListener() {
+ /**
+ * {@inheritDoc}
+ */
+ public void colorChanged(int c) {
+ ColorDialogPreference.this.color = c;
+ }
+ };
+
+ int color = getSharedPreferences().getInt(getKey(), Color.WHITE);
+
+ builder.setView(new ColorPickerView(getContext(),
+ dialogColorChangedListener, color));
+
+ super.onPrepareDialogBuilder(builder);
+ }
+}
\ No newline at end of file
diff --git a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/RollHistoryDatabaseAdapter.java b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/RollHistoryDatabaseAdapter.java
index 23e845b..4db84ca 100644
--- a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/RollHistoryDatabaseAdapter.java
+++ b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/RollHistoryDatabaseAdapter.java
@@ -8,6 +8,8 @@ package com.TwentyCode.android.ExaltedDice;
import android.content.ContentValues;
import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -25,6 +27,7 @@ public class RollHistoryDatabaseAdapter extends BaseAdapter {
private String mGameName;
private LayoutInflater mInflater;
private int mCount;
+ private SharedPreferences mSettings;
/**
* Creates a new RollHistoryDatabaseAdapter
@@ -36,6 +39,7 @@ public class RollHistoryDatabaseAdapter extends BaseAdapter {
mDb = db;
mInflater = LayoutInflater.from(context);
mCount = mDb.getGameRollCount(mGameId);
+ mSettings = context.getSharedPreferences(Settings.SETTINGS, Context.MODE_WORLD_WRITEABLE);
}
/**
@@ -91,6 +95,17 @@ public class RollHistoryDatabaseAdapter extends BaseAdapter {
holder.mRoll.setText("Rolled: "+roll.getAsInteger(Database.KEY_NUMBER) + " "+roll.getAsString(Database.KEY_D_TYPE) +" "+ roll.getAsString(Database.KEY_MOD).replace("'", ""));
holder.mStats.setText(roll.getAsString(Database.KEY_LOG));
holder.mRolled.setText(roll.getAsString(Database.KEY_ROLLED));
+
+ if(position + 1 == mCount){
+ holder.mRoll.setTextColor(mSettings.getInt(Settings.KEY_COLOR, Color.WHITE));
+ holder.mStats.setTextColor(mSettings.getInt(Settings.KEY_COLOR, Color.WHITE));
+ holder.mRolled.setTextColor(mSettings.getInt(Settings.KEY_COLOR, Color.WHITE));
+
+ } else {
+ holder.mRoll.setTextColor(Color.WHITE);
+ holder.mStats.setTextColor(Color.WHITE);
+ holder.mRolled.setTextColor(Color.WHITE);
+ }
return convertView;
}
diff --git a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/Settings.java b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/Settings.java
index 1714905..1b8eeea 100644
--- a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/Settings.java
+++ b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/Settings.java
@@ -34,7 +34,7 @@ public class Settings extends PreferenceActivity implements OnPreferenceClickLis
public static final String KEY_CALC_SUCCESSES = "calc_successes";
public static final String KEY_TENS_COUNT_TWICE = "tens_count_twice";
public static final String KEY_ROLL_MOD = "roll_mod";
-// public static final String KEY_ = "";
+ public static final String KEY_COLOR = "color";
// public static final String KEY_ = "";
// public static final String KEY_ = "";
// public static final String KEY_ = "";