diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e7d6f6d..3bf58a1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,92 +4,117 @@
android:versionCode="1"
android:versionName="1.0" >
-
+
+
+
+ android:theme="@style/MacroDroidTheme" >
-
+
+ android:configChanges="keyboardHidden|orientation"
+ android:label="@string/app_name"
+ android:screenOrientation="portrait"
+ android:theme="@style/FullHeightDialog" >
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/project.properties b/project.properties
index 5a70945..a39542f 100644
--- a/project.properties
+++ b/project.properties
@@ -8,4 +8,5 @@
# project structure.
# Project target.
-target=android-7
+target=android-15
+android.library.reference.1=../ActionBarSherlock/library
diff --git a/res/drawable-hdpi/background.png b/res/drawable-hdpi/background.png
new file mode 100644
index 0000000..d85904e
Binary files /dev/null and b/res/drawable-hdpi/background.png differ
diff --git a/res/drawable-hdpi/calendar_week.png b/res/drawable-hdpi/calendar_week.png
new file mode 100644
index 0000000..298216c
Binary files /dev/null and b/res/drawable-hdpi/calendar_week.png differ
diff --git a/res/drawable-hdpi/ic_menu_archive.png b/res/drawable-hdpi/ic_menu_archive.png
new file mode 100644
index 0000000..9ca5c62
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_archive.png differ
diff --git a/res/drawable-hdpi/ic_menu_close_clear_cancel.png b/res/drawable-hdpi/ic_menu_close_clear_cancel.png
new file mode 100644
index 0000000..55ab11e
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_close_clear_cancel.png differ
diff --git a/res/drawable-hdpi/ic_menu_mark.png b/res/drawable-hdpi/ic_menu_mark.png
new file mode 100644
index 0000000..724d787
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_mark.png differ
diff --git a/res/drawable-hdpi/ic_menu_play_clip.png b/res/drawable-hdpi/ic_menu_play_clip.png
new file mode 100644
index 0000000..06b6531
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_play_clip.png differ
diff --git a/res/drawable-xhdpi/background.png b/res/drawable-xhdpi/background.png
new file mode 100644
index 0000000..d85904e
Binary files /dev/null and b/res/drawable-xhdpi/background.png differ
diff --git a/res/drawable-xhdpi/calendar_week.png b/res/drawable-xhdpi/calendar_week.png
new file mode 100644
index 0000000..298216c
Binary files /dev/null and b/res/drawable-xhdpi/calendar_week.png differ
diff --git a/res/drawable/action_bar_divider.xml b/res/drawable/action_bar_divider.xml
new file mode 100644
index 0000000..0b3ff6c
--- /dev/null
+++ b/res/drawable/action_bar_divider.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/action_bar_gradient.xml b/res/drawable/action_bar_gradient.xml
new file mode 100644
index 0000000..d50842b
--- /dev/null
+++ b/res/drawable/action_bar_gradient.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/typeb_calendar_today.png b/res/drawable/typeb_calendar_today.png
new file mode 100644
index 0000000..2e513a8
Binary files /dev/null and b/res/drawable/typeb_calendar_today.png differ
diff --git a/res/layout/day_detail_activity.xml b/res/layout/day_detail_activity.xml
index 9124ddf..a332458 100644
--- a/res/layout/day_detail_activity.xml
+++ b/res/layout/day_detail_activity.xml
@@ -4,40 +4,10 @@
android:layout_height="fill_parent"
android:gravity="center|top" >
-
-
-
-
-
-
-
@@ -112,44 +82,11 @@
android:text="of 250g" />
-
-
-
-
-
-
-
-
-
-
-
@@ -166,8 +103,8 @@
style="@style/CenteredHeaderTV"
android:layout_width="fill_parent"
android:layout_below="@id/TV_todays_foods"
- android:visibility="gone"
android:gravity="center"
- android:text="@string/day_detail_activity_no_foods_yet" />
+ android:text="@string/day_detail_activity_no_foods_yet"
+ android:visibility="gone" />
\ No newline at end of file
diff --git a/res/layout/day_detail_add_food_tab_activity.xml b/res/layout/day_detail_add_food_tab_activity.xml
index af512a0..d6bd58f 100644
--- a/res/layout/day_detail_add_food_tab_activity.xml
+++ b/res/layout/day_detail_add_food_tab_activity.xml
@@ -7,8 +7,7 @@
+ android:orientation="vertical" >
+ android:layout_height="fill_parent" />
\ No newline at end of file
diff --git a/res/layout/main.xml b/res/layout/main.xml
new file mode 100644
index 0000000..0ba9789
--- /dev/null
+++ b/res/layout/main.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/main_activity.xml b/res/layout/main_activity.xml
index 6added1..256f106 100644
--- a/res/layout/main_activity.xml
+++ b/res/layout/main_activity.xml
@@ -1,50 +1,49 @@
-
+
-
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true" >
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/res/layout/my_food_groups_activity.xml b/res/layout/my_food_groups_activity.xml
index cb64ff4..2127f67 100644
--- a/res/layout/my_food_groups_activity.xml
+++ b/res/layout/my_food_groups_activity.xml
@@ -3,25 +3,9 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
-
-
-
-
+ android:layout_height="fill_parent" />
\ No newline at end of file
diff --git a/res/layout/my_foods_activity.xml b/res/layout/my_foods_activity.xml
index 41b8b85..8281e60 100644
--- a/res/layout/my_foods_activity.xml
+++ b/res/layout/my_foods_activity.xml
@@ -3,32 +3,9 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
-
-
-
-
-
-
+ android:layout_height="fill_parent" />
\ No newline at end of file
diff --git a/res/layout/my_macros_activity.xml b/res/layout/my_macros_activity.xml
index eab88e3..d9c4408 100644
--- a/res/layout/my_macros_activity.xml
+++ b/res/layout/my_macros_activity.xml
@@ -49,14 +49,6 @@
android:layout_height="wrap_content"
android:visibility="gone" >
-
-
-
-
-
-
-
-
-
diff --git a/res/layout/my_macros_i_know_activity.xml b/res/layout/my_macros_i_know_activity.xml
index 376d491..d7bb973 100644
--- a/res/layout/my_macros_i_know_activity.xml
+++ b/res/layout/my_macros_i_know_activity.xml
@@ -4,28 +4,9 @@
android:layout_height="fill_parent"
android:gravity="center|center_vertical" >
-
-
-
-
-
-
-
@@ -39,12 +20,6 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
-
-
diff --git a/res/menu/day_detail_menu.xml b/res/menu/day_detail_menu.xml
index acf3773..afe38ed 100644
--- a/res/menu/day_detail_menu.xml
+++ b/res/menu/day_detail_menu.xml
@@ -1,9 +1,32 @@
\ No newline at end of file
diff --git a/res/menu/my_food_groups_menu.xml b/res/menu/my_food_groups_menu.xml
new file mode 100644
index 0000000..d65c145
--- /dev/null
+++ b/res/menu/my_food_groups_menu.xml
@@ -0,0 +1,10 @@
+
+
\ No newline at end of file
diff --git a/res/menu/my_foods_menu.xml b/res/menu/my_foods_menu.xml
new file mode 100644
index 0000000..9553461
--- /dev/null
+++ b/res/menu/my_foods_menu.xml
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/res/menu/my_macros_calculate_menu.xml b/res/menu/my_macros_calculate_menu.xml
new file mode 100644
index 0000000..e073d9f
--- /dev/null
+++ b/res/menu/my_macros_calculate_menu.xml
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/res/menu/my_macros_i_know_menu.xml b/res/menu/my_macros_i_know_menu.xml
new file mode 100644
index 0000000..e073d9f
--- /dev/null
+++ b/res/menu/my_macros_i_know_menu.xml
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/res/values-hdpi/.svn/all-wcprops b/res/values-hdpi/.svn/all-wcprops
new file mode 100644
index 0000000..f45a366
--- /dev/null
+++ b/res/values-hdpi/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 38
+/svn/!svn/ver/16/trunk/res/values-hdpi
+END
+dimens.xml
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/!svn/ver/16/trunk/res/values-hdpi/dimens.xml
+END
diff --git a/res/values-hdpi/.svn/entries b/res/values-hdpi/.svn/entries
new file mode 100644
index 0000000..b99ecb4
--- /dev/null
+++ b/res/values-hdpi/.svn/entries
@@ -0,0 +1,62 @@
+10
+
+dir
+36
+https://android-calendar-view.googlecode.com/svn/trunk/res/values-hdpi
+https://android-calendar-view.googlecode.com/svn
+
+
+
+2011-03-18T14:52:10.992523Z
+16
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+e2d3c141-846a-bc16-5981-dca600b91f1b
+
+dimens.xml
+file
+
+
+
+
+2011-07-14T15:01:28.000000Z
+40749ed1f294a955d7a9b110d7b8c28d
+2011-03-18T14:52:10.992523Z
+16
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+356
+
diff --git a/res/values-hdpi/.svn/text-base/dimens.xml.svn-base b/res/values-hdpi/.svn/text-base/dimens.xml.svn-base
new file mode 100644
index 0000000..e22b64d
--- /dev/null
+++ b/res/values-hdpi/.svn/text-base/dimens.xml.svn-base
@@ -0,0 +1,10 @@
+
+
+74px
+40px
+58px
+53px
+92px
+39px
+26px
+
diff --git a/res/values-hdpi/dimens.xml b/res/values-hdpi/dimens.xml
new file mode 100644
index 0000000..e22b64d
--- /dev/null
+++ b/res/values-hdpi/dimens.xml
@@ -0,0 +1,10 @@
+
+
+74px
+40px
+58px
+53px
+92px
+39px
+26px
+
diff --git a/res/values-ldpi/.svn/all-wcprops b/res/values-ldpi/.svn/all-wcprops
new file mode 100644
index 0000000..656e973
--- /dev/null
+++ b/res/values-ldpi/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 38
+/svn/!svn/ver/16/trunk/res/values-ldpi
+END
+dimens.xml
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/!svn/ver/16/trunk/res/values-ldpi/dimens.xml
+END
diff --git a/res/values-ldpi/.svn/entries b/res/values-ldpi/.svn/entries
new file mode 100644
index 0000000..48e0b8b
--- /dev/null
+++ b/res/values-ldpi/.svn/entries
@@ -0,0 +1,62 @@
+10
+
+dir
+36
+https://android-calendar-view.googlecode.com/svn/trunk/res/values-ldpi
+https://android-calendar-view.googlecode.com/svn
+
+
+
+2011-03-18T14:52:10.992523Z
+16
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+e2d3c141-846a-bc16-5981-dca600b91f1b
+
+dimens.xml
+file
+
+
+
+
+2011-07-14T15:01:28.000000Z
+9e3f4a89ee03699720d687353a68eaa6
+2011-03-18T14:52:10.992523Z
+16
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+362
+
diff --git a/res/values-ldpi/.svn/text-base/dimens.xml.svn-base b/res/values-ldpi/.svn/text-base/dimens.xml.svn-base
new file mode 100644
index 0000000..b3e9b38
--- /dev/null
+++ b/res/values-ldpi/.svn/text-base/dimens.xml.svn-base
@@ -0,0 +1,10 @@
+
+
+37px
+20px
+29px
+26.5px
+46px
+19.5px
+13.0px
+
diff --git a/res/values-ldpi/dimens.xml b/res/values-ldpi/dimens.xml
new file mode 100644
index 0000000..b3e9b38
--- /dev/null
+++ b/res/values-ldpi/dimens.xml
@@ -0,0 +1,10 @@
+
+
+37px
+20px
+29px
+26.5px
+46px
+19.5px
+13.0px
+
diff --git a/res/values-mdpi/.svn/all-wcprops b/res/values-mdpi/.svn/all-wcprops
new file mode 100644
index 0000000..3c279dd
--- /dev/null
+++ b/res/values-mdpi/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 38
+/svn/!svn/ver/16/trunk/res/values-mdpi
+END
+dimens.xml
+K 25
+svn:wc:ra_dav:version-url
+V 49
+/svn/!svn/ver/16/trunk/res/values-mdpi/dimens.xml
+END
diff --git a/res/values-mdpi/.svn/entries b/res/values-mdpi/.svn/entries
new file mode 100644
index 0000000..c029856
--- /dev/null
+++ b/res/values-mdpi/.svn/entries
@@ -0,0 +1,62 @@
+10
+
+dir
+36
+https://android-calendar-view.googlecode.com/svn/trunk/res/values-mdpi
+https://android-calendar-view.googlecode.com/svn
+
+
+
+2011-03-18T14:52:10.992523Z
+16
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+e2d3c141-846a-bc16-5981-dca600b91f1b
+
+dimens.xml
+file
+
+
+
+
+2011-07-14T15:01:28.000000Z
+917b94ebd1a6ee35ffec54c5207b2be4
+2011-03-18T14:52:10.992523Z
+16
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+368
+
diff --git a/res/values-mdpi/.svn/text-base/dimens.xml.svn-base b/res/values-mdpi/.svn/text-base/dimens.xml.svn-base
new file mode 100644
index 0000000..1bb36c4
--- /dev/null
+++ b/res/values-mdpi/.svn/text-base/dimens.xml.svn-base
@@ -0,0 +1,10 @@
+
+
+49.3px
+26.3px
+38.3px
+35.3px
+61.3px
+26px
+17.3px
+
diff --git a/res/values-mdpi/dimens.xml b/res/values-mdpi/dimens.xml
new file mode 100644
index 0000000..1bb36c4
--- /dev/null
+++ b/res/values-mdpi/dimens.xml
@@ -0,0 +1,10 @@
+
+
+49.3px
+26.3px
+38.3px
+35.3px
+61.3px
+26px
+17.3px
+
diff --git a/res/values-xhdpi/.svn/all-wcprops b/res/values-xhdpi/.svn/all-wcprops
new file mode 100644
index 0000000..b818b28
--- /dev/null
+++ b/res/values-xhdpi/.svn/all-wcprops
@@ -0,0 +1,11 @@
+K 25
+svn:wc:ra_dav:version-url
+V 39
+/svn/!svn/ver/36/trunk/res/values-xhdpi
+END
+Dimens.xml
+K 25
+svn:wc:ra_dav:version-url
+V 50
+/svn/!svn/ver/36/trunk/res/values-xhdpi/Dimens.xml
+END
diff --git a/res/values-xhdpi/.svn/entries b/res/values-xhdpi/.svn/entries
new file mode 100644
index 0000000..6f24ec9
--- /dev/null
+++ b/res/values-xhdpi/.svn/entries
@@ -0,0 +1,69 @@
+10
+
+dir
+36
+https://android-calendar-view.googlecode.com/svn/trunk/res/values-xhdpi
+https://android-calendar-view.googlecode.com/svn
+
+
+
+2011-07-14T15:42:40.113838Z
+36
+outlooksyncwizard@gmail.com
+
+
+svn:special svn:externals svn:needs-lock
+
+
+
+
+
+
+
+
+
+
+
+e2d3c141-846a-bc16-5981-dca600b91f1b
+
+
+
+
+
+
+0
+
+Dimens.xml
+file
+
+
+
+
+2011-07-14T16:23:15.000000Z
+64b2e68b46205836887987f0a978ecca
+2011-07-14T15:42:40.113838Z
+36
+outlooksyncwizard@gmail.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+358
+
diff --git a/res/values-xhdpi/.svn/text-base/Dimens.xml.svn-base b/res/values-xhdpi/.svn/text-base/Dimens.xml.svn-base
new file mode 100644
index 0000000..b4ee871
--- /dev/null
+++ b/res/values-xhdpi/.svn/text-base/Dimens.xml.svn-base
@@ -0,0 +1,10 @@
+
+
+74px
+116px
+58px
+53px
+92px
+115px
+26px
+
diff --git a/res/values-xhdpi/Dimens.xml b/res/values-xhdpi/Dimens.xml
new file mode 100644
index 0000000..b4ee871
--- /dev/null
+++ b/res/values-xhdpi/Dimens.xml
@@ -0,0 +1,10 @@
+
+
+74px
+116px
+58px
+53px
+92px
+115px
+26px
+
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index d825ad8..09f8715 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -4,6 +4,28 @@
- male
- female
+
+ - Lookin\' good!
+ - Hello good-lookin\'.
+ - Hey gorgeous.
+ - You look hot.
+ - <3 <3 <3
+ - ;) ;) ;)
+ - Whoa. Sexy.
+ - Hey hot stuff.
+ - \@->-- (It\'s a rose. Just for you.)
+ - Keep up the good work!
+ - Look at you, being all healthy and stuff.
+ - Have you been working out?
+ - You\'re the greatest phone owner I could ever have.
+ - Fact: You look good. Really good.
+ - Eating right feels great, doesn\'t it?
+ - You look like the lovechild of Bruce Lee and Angelina Jolie.
+ - Really really ridiculously good-looking.
+ - Serious question: Are you a model?
+ - You rock.
+ - (╯°□°)╯︵ ┻━┻
+
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
new file mode 100644
index 0000000..b11d0f0
--- /dev/null
+++ b/res/values/colors.xml
@@ -0,0 +1,8 @@
+
+
+
+ #000000
+ #333333
+ #DDDDDD
+
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 890fbc0..ae1014a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -16,6 +16,7 @@
grams
grams/serving
g/lb. body weight
+ Touch the first or last day of month to navigate months.
in
kCal
kCal/serving
@@ -34,23 +35,35 @@
years
Add
Add Food
+ Add Food Group
BMR
+ Calculate
Cancel
+ Change Day Type
+ Day Type
+ It\'s a UNIX system! I know this!
Import
+ Import From File
Macros
Macro Conversions
Measurements
My Food Groups
My Foods
+ My Macros
My Measurements
Name
Number of Servings
+ Photos
+ Rest Day
RMR
Save
+ Save Food Group
total servings
Serving Size
Set
Today\'s Foods
+ Training Day
+ Weight
Your macros have been saved!
You haven\'t added any foods yet!
Today
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 71ef8a8..fdebc4a 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -1,6 +1,35 @@
+
+
+
+
+
+
diff --git a/src/com/doomonafireball/macrodroid/DayDetailActivity.java b/src/com/doomonafireball/macrodroid/DayDetailActivity.java
index d1f650c..a5a3af2 100644
--- a/src/com/doomonafireball/macrodroid/DayDetailActivity.java
+++ b/src/com/doomonafireball/macrodroid/DayDetailActivity.java
@@ -1,37 +1,41 @@
package com.doomonafireball.macrodroid;
+import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
-import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
+import android.graphics.Bitmap;
import android.graphics.Color;
+import android.net.Uri;
import android.os.Bundle;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.Menu;
+import android.support.v4.view.MenuItem;
import android.util.Log;
import android.util.Pair;
-import android.view.Menu;
-import android.view.MenuItem;
import android.view.View;
-import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
-import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
+import android.widget.Toast;
-public class DayDetailActivity extends Activity {
+public class DayDetailActivity extends FragmentActivity {
private static final String DATE_FORMAT = "MM/dd/yyyy";
+ private static final String SAVE_DATE_FORMAT = "MMddyyyy";
+ private static final int CAMERA_PIC_REQUEST = 1337;
private MacroDroidApplication application;
private Context mContext;
private Calendar mCalendar; // purely for setup
private ADay mADay;
- private TextView dateTV;
- private Button trainingBTN;
private TextView noFoodsYetTV;
private TextView caloriesTV;
private TextView currentProteinTV;
@@ -40,12 +44,9 @@ public class DayDetailActivity extends Activity {
private TextView macroProteinTV;
private TextView macroCarbsTV;
private TextView macroFatTV;
- private Button picsBTN;
- private Button weightBTN;
- private Button heightBTN;
- private Button addFoodBTN;
private DayDetailFoodsAdapter mFoodsAdapter;
private ListView mFoodsLV;
+ private String mFilePath;
/** Called when the activity is first created. */
@Override
@@ -56,9 +57,12 @@ public class DayDetailActivity extends Activity {
application = ((MacroDroidApplication) getApplication());
mContext = this;
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+
noFoodsYetTV = (TextView) findViewById(R.id.TV_no_foods_yet);
- dateTV = (TextView) findViewById(R.id.TV_day_detail_date);
- trainingBTN = (Button) findViewById(R.id.BTN_training_day);
caloriesTV = (TextView) findViewById(R.id.TV_day_detail_calories);
currentProteinTV = (TextView) findViewById(R.id.TV_day_detail_current_protein);
currentCarbsTV = (TextView) findViewById(R.id.TV_day_detail_current_carbs);
@@ -66,10 +70,6 @@ public class DayDetailActivity extends Activity {
macroProteinTV = (TextView) findViewById(R.id.TV_day_detail_macro_protein);
macroCarbsTV = (TextView) findViewById(R.id.TV_day_detail_macro_carbs);
macroFatTV = (TextView) findViewById(R.id.TV_day_detail_macro_fat);
- picsBTN = (Button) findViewById(R.id.BTN_pics);
- weightBTN = (Button) findViewById(R.id.BTN_weight);
- heightBTN = (Button) findViewById(R.id.BTN_height);
- addFoodBTN = (Button) findViewById(R.id.BTN_add_food);
mFoodsLV = (ListView) findViewById(R.id.LV_day_detail_foods);
// Parse the extras
@@ -92,7 +92,7 @@ public class DayDetailActivity extends Activity {
OnItemClickListener mFoodsItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> av, View v, int position, long id) {
- // TODO Auto-generated method stub
+ // TODO Quick Options
ArrayList> mFoods = mADay.getFoods();
mFoods.remove(position);
mADay.setFoods(mFoods);
@@ -111,7 +111,12 @@ public class DayDetailActivity extends Activity {
private void refreshViews() {
// Refresh the date!
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
- dateTV.setText(sdf.format(mADay.getDate().getTime()));
+ final ActionBar ab = getSupportActionBar();
+ ab.setTitle(sdf.format(mADay.getDate().getTime()));
+ // dateTV.setText(sdf.format(mADay.getDate().getTime()));
+
+ SimpleDateFormat sdf2 = new SimpleDateFormat(SAVE_DATE_FORMAT);
+ mFilePath = sdf2.format(mADay.getDate().getTime());
// Refresh the Views
float totalKCal = 0.0f;
@@ -164,116 +169,35 @@ public class DayDetailActivity extends Activity {
if (totalKCal > application.macrosPrefs.getFloat(
Tags.MACROS_TRAINING_KCAL, 0.0f)) {
caloriesTV.setTextColor(Color.RED);
+ } else {
+ caloriesTV.setTextColor(Color.GRAY);
}
if (totalProtein > application.macrosPrefs.getFloat(
Tags.MACROS_PROTEIN, 0.0f)) {
currentProteinTV.setTextColor(Color.RED);
+ } else {
+ currentProteinTV.setTextColor(Color.GRAY);
}
if (totalCarbs > application.macrosPrefs.getFloat(Tags.MACROS_CARBS,
0.0f)) {
currentCarbsTV.setTextColor(Color.RED);
+ } else {
+ currentCarbsTV.setTextColor(Color.GRAY);
}
if (totalFat > application.macrosPrefs.getFloat(Tags.MACROS_FAT, 0.0f)) {
currentFatTV.setTextColor(Color.RED);
+ } else {
+ currentFatTV.setTextColor(Color.GRAY);
}
// Buttons
- weightBTN.setText(Float.toString(mADay.getWeight()));
- weightBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- AlertDialog.Builder alert = new AlertDialog.Builder(mContext);
- alert.setTitle("Weight");
- // Set an EditText view to get user input
- final EditText input = new EditText(mContext);
- input.setText("100.0");
- alert.setView(input);
- alert.setPositiveButton("Set",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- Float weight = Float.parseFloat(input.getText()
- .toString());
- mADay.setWeight(weight);
- application.saveDay(mADay);
- dialog.dismiss();
- renderDetailInfo();
- }
- });
- alert.setNegativeButton("Cancel",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- dialog.dismiss();
- }
- });
- alert.show();
- }
- });
- heightBTN.setText(Float.toString(mADay.getHeight()));
- heightBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- AlertDialog.Builder alert = new AlertDialog.Builder(mContext);
- alert.setTitle("Height");
- // Set an EditText view to get user input
- final EditText input = new EditText(mContext);
- input.setText("100.0");
- alert.setView(input);
- alert.setPositiveButton("Set",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- Float height = Float.parseFloat(input.getText()
- .toString());
- mADay.setHeight(height);
- application.saveDay(mADay);
- dialog.dismiss();
- renderDetailInfo();
- }
- });
- alert.setNegativeButton("Cancel",
- new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog,
- int whichButton) {
- dialog.dismiss();
- }
- });
- alert.show();
- }
- });
- addFoodBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- // Convert current date and pass it to intent
- Intent i = new Intent(DayDetailActivity.this,
- DayDetailAddFoodTabActivity.class);
- i.putExtra("date", mADay.getDate().get(Calendar.DATE));
- i.putExtra("month", mADay.getDate().get(Calendar.MONTH));
- i.putExtra("year", mADay.getDate().get(Calendar.YEAR));
- startActivity(i);
- }
- });
+ // /weightBTN.setText(Float.toString(mADay.getWeight()));
+
if (mADay.isTraining()) {
- trainingBTN.setText("Training Day");
+ ab.setSubtitle(getResources().getString(R.string.Training_Day));
} else {
- trainingBTN.setText("Rest Day");
+ ab.setSubtitle(getResources().getString(R.string.Rest_Day));
}
- trainingBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mADay.isTraining()) {
- mADay.setTraining(false);
- trainingBTN.setText("Rest Day");
- application.saveDay(mADay);
- } else {
- mADay.setTraining(true);
- trainingBTN.setText("Training Day");
- application.saveDay(mADay);
- }
- }
- });
mFoodsLV.setOnItemClickListener(mFoodsItemClickListener);
}
@@ -301,6 +225,29 @@ public class DayDetailActivity extends Activity {
alert.show();
}
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == CAMERA_PIC_REQUEST) {
+ Log.d(Tags.LOG_TAG, "CAMERA_PIC_REQUEST result.");
+ Bitmap bmp = (Bitmap) data.getExtras().get("data");
+ String saveBmpResults = application.saveBitmapToFile(
+ bmp,
+ Tags.PHOTOS_PATH,
+ mFilePath
+ + "_"
+ + application.numPicsForDay(Tags.PHOTOS_PATH,
+ mFilePath) + ".png");
+ if (saveBmpResults.length() > 0) {
+ Toast.makeText(mContext, "Saved picture to " + saveBmpResults,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(
+ mContext,
+ "Could not save the picture. Please make sure your SD card is mounted.",
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.day_detail_menu, menu);
@@ -310,9 +257,95 @@ public class DayDetailActivity extends Activity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
+ case R.id.MENU_photos:
+ if (application.numPicsForDay(Tags.PHOTOS_PATH, mFilePath) > 0) {
+ // We already have some pictures for this day
+ final CharSequence[] items = { "View photos",
+ "Take another photo" };
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("Choose an option");
+ builder.setItems(items, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ if (item == 0) {
+ Intent intent = new Intent();
+ intent.setAction(Intent.ACTION_VIEW);
+ intent.setDataAndType(Uri.parse("file://"
+ + File.separator + Tags.PHOTOS_PATH), "image/*");
+ startActivity(intent);
+
+ } else {
+ Intent cameraIntent = new Intent(
+ android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
+ startActivityForResult(cameraIntent,
+ CAMERA_PIC_REQUEST);
+ }
+ }
+ });
+ builder.setNegativeButton("Cancel", new OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ } else {
+ // We have no pictures for this day
+ Intent cameraIntent = new Intent(
+ android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
+ startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
+ }
+ return false;
+ case R.id.MENU_weight:
+ AlertDialog.Builder alert = new AlertDialog.Builder(mContext);
+ alert.setTitle("Weight");
+ // Set an EditText view to get user input
+ final EditText input = new EditText(mContext);
+ input.append("100.0");
+ alert.setView(input);
+ alert.setPositiveButton("Set Weight",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ Float weight = Float.parseFloat(input.getText()
+ .toString());
+ mADay.setWeight(weight);
+ application.saveDay(mADay);
+ dialog.dismiss();
+ renderDetailInfo();
+ }
+ });
+ alert.setNegativeButton("Cancel",
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ dialog.dismiss();
+ }
+ });
+ alert.show();
+ return false;
+ case R.id.MENU_add_food:
+ Intent i = new Intent(DayDetailActivity.this,
+ DayDetailAddFoodTabActivity.class);
+ i.putExtra("date", mADay.getDate().get(Calendar.DATE));
+ i.putExtra("month", mADay.getDate().get(Calendar.MONTH));
+ i.putExtra("year", mADay.getDate().get(Calendar.YEAR));
+ startActivity(i);
+ return false;
case R.id.MENU_save_food_group:
saveToFoodGroup();
return false;
+ case R.id.MENU_change_day_type:
+ final ActionBar ab = getSupportActionBar();
+ if (mADay.isTraining()) {
+ mADay.setTraining(false);
+ ab.setSubtitle(getResources().getString(R.string.Rest_Day));
+ application.saveDay(mADay);
+ } else {
+ mADay.setTraining(true);
+ ab.setSubtitle(getResources().getString(R.string.Training_Day));
+ application.saveDay(mADay);
+ }
+ return false;
default:
return super.onOptionsItemSelected(item);
}
diff --git a/src/com/doomonafireball/macrodroid/MacroDroidApplication.java b/src/com/doomonafireball/macrodroid/MacroDroidApplication.java
index f802611..40ef896 100644
--- a/src/com/doomonafireball/macrodroid/MacroDroidApplication.java
+++ b/src/com/doomonafireball/macrodroid/MacroDroidApplication.java
@@ -1,6 +1,7 @@
package com.doomonafireball.macrodroid;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@@ -12,8 +13,13 @@ import java.util.List;
import android.app.Application;
import android.content.Context;
+import android.content.Intent;
import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Environment;
import android.util.Log;
+import android.widget.Toast;
public class MacroDroidApplication extends Application {
private static final String MACROS_PREFS = "MacroDroidMacrosPrefs";
@@ -42,6 +48,84 @@ public class MacroDroidApplication extends Application {
}
}
+ public String getRandomCompliment() {
+ String[] complimentArray = getResources().getStringArray(
+ R.array.compliments);
+ int i = (int) (Math.random() * complimentArray.length);
+ return complimentArray[i];
+ }
+
+ public int numPicsForDay(String path, String day) {
+ if (!Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ return 0;
+ } else {
+ File dir = new File(Environment.getExternalStorageDirectory()
+ + File.separator + path);
+ dir.mkdirs();
+ String[] files = dir.list();
+ int dayCount = 0;
+ for (int i = 0; i < files.length; i++) {
+ String s = files[i];
+ if (s.contains(day)) {
+ dayCount++;
+ }
+ }
+ return dayCount;
+
+ }
+ }
+
+ public int directoryExists(String path) {
+ if (!Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ return -1;
+ } else {
+ File dir = new File(Environment.getExternalStorageDirectory()
+ + File.separator + path);
+ if (dir.exists()) {
+ return dir.list().length;
+ } else {
+ return -1;
+ }
+ }
+ }
+
+ public String saveBitmapToFile(Bitmap bmp, String path, String filename) {
+ // Make sure to declare WRITE_EXTERNAL_STORAGE permission
+ // bmp - self-explanatory
+ // path - e.g "myapp/firstfolder/secondfolder" (no leading or trailing
+ // seps)
+ // filename - e.g. "081012.png" (no leading seps)
+ // Output would be "sdcard/myapp/firstfolder/secondfolder/081012.png"
+ if (!Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ return "";
+ } else {
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+ bmp.compress(Bitmap.CompressFormat.PNG, 100, bytes);
+ File dir = new File(Environment.getExternalStorageDirectory()
+ + File.separator + path);
+ dir.mkdirs();
+ File f = new File(Environment.getExternalStorageDirectory()
+ + File.separator + path + File.separator + filename);
+ Log.d(Tags.LOG_TAG, "Filedir: " + f.getAbsolutePath());
+ try {
+ // write the bytes in file
+ FileOutputStream fo = new FileOutputStream(f);
+ fo.write(bytes.toByteArray());
+ sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
+ Uri.parse("file://"
+ + Environment.getExternalStorageDirectory())));
+ return f.getAbsolutePath();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return "";
+ }
+ }
+ }
+
public boolean hasDayData(Context ctx) {
dbHelper = new Db4oHelper(ctx);
if (dbHelper.fetchAllDayRows().isEmpty()) {
@@ -50,7 +134,7 @@ public class MacroDroidApplication extends Application {
return true;
}
}
-
+
public boolean hasFoodGroupData(Context ctx) {
dbHelper = new Db4oHelper(ctx);
if (dbHelper.fetchAllFoodGroupRows() == null) {
@@ -71,12 +155,12 @@ public class MacroDroidApplication extends Application {
Log.d(Tags.LOG_TAG, "Saving day: \n" + day.toString());
dbHelper.saveDay(day);
}
-
+
public void saveFoodGroup(AFoodGroup foodGroup) {
Log.d(Tags.LOG_TAG, "Saving food group: \n" + foodGroup.toString());
dbHelper.saveFoodGroup(foodGroup);
}
-
+
public void deleteFoodGroup(AFoodGroup foodGroup) {
dbHelper.deleteFoodGroup(foodGroup.id);
}
@@ -84,7 +168,7 @@ public class MacroDroidApplication extends Application {
public List getDaysFromDb() {
return dbHelper.fetchAllDayRows();
}
-
+
public List getFoodGroupsFromDb() {
return dbHelper.fetchAllFoodGroupRows();
}
diff --git a/src/com/doomonafireball/macrodroid/MainActivity.java b/src/com/doomonafireball/macrodroid/MainActivity.java
index 05d7aa4..4957208 100644
--- a/src/com/doomonafireball/macrodroid/MainActivity.java
+++ b/src/com/doomonafireball/macrodroid/MainActivity.java
@@ -1,21 +1,21 @@
package com.doomonafireball.macrodroid;
+import java.text.SimpleDateFormat;
import java.util.Calendar;
-import java.util.List;
-import android.app.Activity;
-import android.app.DatePickerDialog;
-import android.app.DatePickerDialog.OnDateSetListener;
+import com.exina.android.calendar.CalendarActivity;
+
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.util.Log;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
-import android.widget.DatePicker;
+import android.widget.Toast;
-public class MainActivity extends Activity {
+public class MainActivity extends FragmentActivity {
private Button todayBTN;
private Button previousBTN;
private Button myFoodsBTN;
@@ -34,6 +34,12 @@ public class MainActivity extends Activity {
mContext = this;
application = ((MacroDroidApplication) getApplication());
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+ ab.setSubtitle(application.getRandomCompliment());
+
todayBTN = (Button) findViewById(R.id.BTN_today);
previousBTN = (Button) findViewById(R.id.BTN_previous);
myFoodsBTN = (Button) findViewById(R.id.BTN_my_foods);
@@ -56,6 +62,11 @@ public class MainActivity extends Activity {
previousBTN.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
+ // Calendar Widget
+ startActivityForResult(new Intent(Intent.ACTION_PICK)
+ .setDataAndType(null, CalendarActivity.MIME_TYPE), 100);
+
+ /*
// DatePickerDialog
int year = Calendar.getInstance().get(Calendar.YEAR);
int month = Calendar.getInstance().get(Calendar.MONTH);
@@ -75,7 +86,7 @@ public class MainActivity extends Activity {
}
}, year, month, date);
- datePicker.show();
+ datePicker.show();*/
}
});
myFoodsBTN.setOnClickListener(new OnClickListener() {
@@ -107,4 +118,27 @@ public class MainActivity extends Activity {
}
});
}
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == RESULT_OK) {
+ int year = data.getIntExtra("year", 0); // get number of year
+ int month = data.getIntExtra("month", 0); // get number of month
+ // 0..11
+ int day = data.getIntExtra("day", 0); // get number of day 0..31
+
+ Intent i = new Intent(MainActivity.this, DayDetailActivity.class);
+ i.putExtra("date", day);
+ i.putExtra("month", month);
+ i.putExtra("year", year);
+ startActivity(i);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ final ActionBar ab = getSupportActionBar();
+ ab.setSubtitle(application.getRandomCompliment());
+ super.onResume();
+ }
}
\ No newline at end of file
diff --git a/src/com/doomonafireball/macrodroid/MyFoodGroupsActivity.java b/src/com/doomonafireball/macrodroid/MyFoodGroupsActivity.java
index 02c4f67..794fbaf 100644
--- a/src/com/doomonafireball/macrodroid/MyFoodGroupsActivity.java
+++ b/src/com/doomonafireball/macrodroid/MyFoodGroupsActivity.java
@@ -3,11 +3,15 @@ package com.doomonafireball.macrodroid;
import java.util.ArrayList;
import java.util.List;
-import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.Menu;
+import android.support.v4.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
@@ -15,8 +19,7 @@ import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
-public class MyFoodGroupsActivity extends Activity {
- private Button addBTN;
+public class MyFoodGroupsActivity extends FragmentActivity {
private ListView myFoodGroupsLV;
private MyFoodGroupsAdapter myFoodGroupsAdapter;
private MacroDroidApplication application;
@@ -31,19 +34,15 @@ public class MyFoodGroupsActivity extends Activity {
application = ((MacroDroidApplication) getApplication());
mContext = this;
-
- addBTN = (Button) findViewById(R.id.BTN_add);
+
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+ ab.setTitle(getResources().getString(R.string.My_Food_Groups));
+
myFoodGroupsLV = (ListView) findViewById(R.id.LV_my_food_groups);
- addBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- // startActivity(new Intent(MyFoodGroupsActivity.this,
- // MyFoodGroupsAddActivity.class));
- }
- });
-
refreshList();
myFoodGroupsLV.setOnItemLongClickListener(myFoodsItemLongClickListener);
@@ -97,4 +96,21 @@ public class MyFoodGroupsActivity extends Activity {
super.onResume();
refreshList();
}
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.my_food_groups_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.MENU_add_food_group:
+ // TODO
+ return false;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
}
diff --git a/src/com/doomonafireball/macrodroid/MyFoodsActivity.java b/src/com/doomonafireball/macrodroid/MyFoodsActivity.java
index 2807101..d955a26 100644
--- a/src/com/doomonafireball/macrodroid/MyFoodsActivity.java
+++ b/src/com/doomonafireball/macrodroid/MyFoodsActivity.java
@@ -2,12 +2,15 @@ package com.doomonafireball.macrodroid;
import java.util.ArrayList;
-import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.Menu;
+import android.support.v4.view.MenuItem;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
@@ -17,86 +20,96 @@ import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
-public class MyFoodsActivity extends Activity {
- private Button addBTN;
- private Button importBTN;
- private ListView myFoodsLV;
- private MyFoodsAdapter myFoodsAdapter;
- private MacroDroidApplication application;
- private Context mContext;
- private ArrayList myFoodsArrayList;
+public class MyFoodsActivity extends FragmentActivity {
+ private ListView myFoodsLV;
+ private MyFoodsAdapter myFoodsAdapter;
+ private MacroDroidApplication application;
+ private Context mContext;
+ private ArrayList myFoodsArrayList;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.my_foods_activity);
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.my_foods_activity);
- application = ((MacroDroidApplication) getApplication());
- mContext = this;
+ application = ((MacroDroidApplication) getApplication());
+ mContext = this;
- addBTN = (Button) findViewById(R.id.BTN_add);
- importBTN = (Button) findViewById(R.id.BTN_import);
- myFoodsLV = (ListView) findViewById(R.id.LV_my_foods);
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+ ab.setTitle(getResources().getString(R.string.My_Foods));
- addBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- startActivity(new Intent(MyFoodsActivity.this, MyFoodsAddActivity.class));
- }
- });
- importBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- application.writeInternalStoragePrivate(Tags.MY_FOODS_FILENAME,
- application.defaultFoodsToByteArray());
- refreshList();
- }
- });
+ myFoodsLV = (ListView) findViewById(R.id.LV_my_foods);
- refreshList();
+ refreshList();
- myFoodsLV.setOnItemLongClickListener(myFoodsItemLongClickListener);
- }
+ myFoodsLV.setOnItemLongClickListener(myFoodsItemLongClickListener);
+ }
- private OnItemLongClickListener myFoodsItemLongClickListener = new OnItemLongClickListener() {
- @Override
- public boolean onItemLongClick(AdapterView> a, View v, int position, long id) {
- // TODO Auto-generated method stub
- final AFood selectedFood = (AFood) myFoodsAdapter.getItem(position);
+ private OnItemLongClickListener myFoodsItemLongClickListener = new OnItemLongClickListener() {
+ @Override
+ public boolean onItemLongClick(AdapterView> a, View v, int position,
+ long id) {
+ // TODO Auto-generated method stub
+ final AFood selectedFood = (AFood) myFoodsAdapter.getItem(position);
- final CharSequence[] items = { "Delete" };
- AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
- builder.setTitle("Options");
- builder.setItems(items, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- if (item == 0) {
- // Delete this food
- myFoodsArrayList.remove(selectedFood);
- application.writeFoodsToInternalStorage(myFoodsArrayList);
- refreshList();
- dialog.dismiss();
- }
- }
- });
- AlertDialog alert = builder.create();
- alert.show();
- return false;
- }
- };
+ final CharSequence[] items = { "Delete" };
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle("Options");
+ builder.setItems(items, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ if (item == 0) {
+ // Delete this food
+ myFoodsArrayList.remove(selectedFood);
+ application
+ .writeFoodsToInternalStorage(myFoodsArrayList);
+ refreshList();
+ dialog.dismiss();
+ }
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ return false;
+ }
+ };
- private void refreshList() {
- myFoodsArrayList = application.getAllFoods();
- myFoodsAdapter = new MyFoodsAdapter(mContext, myFoodsArrayList);
- myFoodsLV.setAdapter(myFoodsAdapter);
+ private void refreshList() {
+ myFoodsArrayList = application.getAllFoods();
+ myFoodsAdapter = new MyFoodsAdapter(mContext, myFoodsArrayList);
+ myFoodsLV.setAdapter(myFoodsAdapter);
+ }
- }
+ @Override
+ public void onResume() {
+ super.onResume();
+ refreshList();
+ }
- @Override
- public void onResume() {
- super.onResume();
- refreshList();
- }
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.my_foods_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.MENU_add_food:
+ startActivity(new Intent(MyFoodsActivity.this,
+ MyFoodsAddActivity.class));
+ return false;
+ case R.id.MENU_import:
+ // TODO Import from file
+ application.writeInternalStoragePrivate(Tags.MY_FOODS_FILENAME,
+ application.defaultFoodsToByteArray());
+ refreshList();
+ return false;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
}
diff --git a/src/com/doomonafireball/macrodroid/MyMacrosActivity.java b/src/com/doomonafireball/macrodroid/MyMacrosActivity.java
index fa1c0ff..084bb18 100644
--- a/src/com/doomonafireball/macrodroid/MyMacrosActivity.java
+++ b/src/com/doomonafireball/macrodroid/MyMacrosActivity.java
@@ -1,15 +1,16 @@
package com.doomonafireball.macrodroid;
-import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TableLayout;
import android.widget.TextView;
-public class MyMacrosActivity extends Activity {
+public class MyMacrosActivity extends FragmentActivity {
private Button calculateBTN;
private Button iKnowBTN;
private TextView noInputTV;
@@ -29,6 +30,12 @@ public class MyMacrosActivity extends Activity {
setContentView(R.layout.my_macros_activity);
application = ((MacroDroidApplication) getApplication());
+
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+ ab.setTitle(getResources().getString(R.string.My_Macros));
calculateBTN = (Button) findViewById(R.id.BTN_calculate);
iKnowBTN = (Button) findViewById(R.id.BTN_i_know);
diff --git a/src/com/doomonafireball/macrodroid/MyMacrosCalculateActivity.java b/src/com/doomonafireball/macrodroid/MyMacrosCalculateActivity.java
index 69c3440..c0a505d 100644
--- a/src/com/doomonafireball/macrodroid/MyMacrosCalculateActivity.java
+++ b/src/com/doomonafireball/macrodroid/MyMacrosCalculateActivity.java
@@ -1,15 +1,48 @@
package com.doomonafireball.macrodroid;
-import android.app.Activity;
import android.os.Bundle;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.Menu;
+import android.support.v4.view.MenuItem;
-public class MyMacrosCalculateActivity extends Activity {
-
+public class MyMacrosCalculateActivity extends FragmentActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_macros_calculate_activity);
+
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+ ab.setTitle(getResources().getString(R.string.My_Macros));
+ ab.setSubtitle(getResources().getString(R.string.Calculate));
}
+
+ private void setMacros() {
+ // TODO This
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.my_macros_calculate_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.MENU_cancel:
+ finish();
+ return false;
+ case R.id.MENU_set:
+ setMacros();
+ return false;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
}
diff --git a/src/com/doomonafireball/macrodroid/MyMacrosIKnowActivity.java b/src/com/doomonafireball/macrodroid/MyMacrosIKnowActivity.java
index b25e620..90ecc5f 100644
--- a/src/com/doomonafireball/macrodroid/MyMacrosIKnowActivity.java
+++ b/src/com/doomonafireball/macrodroid/MyMacrosIKnowActivity.java
@@ -1,18 +1,20 @@
package com.doomonafireball.macrodroid;
-import android.app.Activity;
import android.content.Context;
+import android.content.Intent;
import android.os.Bundle;
+import android.support.v4.app.ActionBar;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.Menu;
+import android.support.v4.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
-public class MyMacrosIKnowActivity extends Activity {
+public class MyMacrosIKnowActivity extends FragmentActivity {
private MacroDroidApplication application;
- private Button setBTN;
- private Button cancelBTN;
private EditText trainingKCalET;
private EditText restKCalET;
private EditText deficitET;
@@ -33,8 +35,13 @@ public class MyMacrosIKnowActivity extends Activity {
application = ((MacroDroidApplication) getApplication());
mContext = this;
- setBTN = (Button) findViewById(R.id.BTN_set);
- cancelBTN = (Button) findViewById(R.id.BTN_cancel);
+ final ActionBar ab = getSupportActionBar();
+ ab.setDisplayUseLogoEnabled(false);
+ ab.setDisplayHomeAsUpEnabled(false);
+ ab.setDisplayShowHomeEnabled(false);
+ ab.setTitle(getResources().getString(R.string.My_Macros));
+ ab.setSubtitle(getResources().getString(R.string.I_Know_Them));
+
trainingKCalET = (EditText) findViewById(R.id.ET_training_kCal);
restKCalET = (EditText) findViewById(R.id.ET_rest_kCal);
deficitET = (EditText) findViewById(R.id.ET_deficit);
@@ -46,69 +53,78 @@ public class MyMacrosIKnowActivity extends Activity {
fatConversionET = (EditText) findViewById(R.id.ET_fat_conversion);
// Populate existing data
- trainingKCalET.setText(Float.toString(application.macrosPrefs.getFloat(
+ trainingKCalET.append(Float.toString(application.macrosPrefs.getFloat(
Tags.MACROS_TRAINING_KCAL, 0)));
- restKCalET.setText(Float.toString(application.macrosPrefs
+ restKCalET.append(Float.toString(application.macrosPrefs
.getFloat(Tags.MACROS_REST_KCAL, 0)));
- deficitET.setText(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_DEFICIT, 0.0f)));
- proteinET.setText(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_PROTEIN, 0.0f)));
- carbsET.setText(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_CARBS, 0.0f)));
- fatET.setText(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_FAT, 0.0f)));
- proteinConversionET.setText(Float.toString(application.macrosPrefs.getFloat(
+ deficitET.append(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_DEFICIT, 0.0f)));
+ proteinET.append(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_PROTEIN, 0.0f)));
+ carbsET.append(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_CARBS, 0.0f)));
+ fatET.append(Float.toString(application.macrosPrefs.getFloat(Tags.MACROS_FAT, 0.0f)));
+ proteinConversionET.append(Float.toString(application.macrosPrefs.getFloat(
Tags.MACRO_CONVERSION_PROTEIN,
DefaultValues.MACRO_CONVERSION_PROTEIN)));
- carbsConversionET.setText(Float.toString(application.macrosPrefs.getFloat(
+ carbsConversionET.append(Float.toString(application.macrosPrefs.getFloat(
Tags.MACRO_CONVERSION_CARBS,
DefaultValues.MACRO_CONVERSION_CARBS)));
- fatConversionET.setText(Float.toString(application.macrosPrefs.getFloat(
+ fatConversionET.append(Float.toString(application.macrosPrefs.getFloat(
Tags.MACRO_CONVERSION_FAT,
DefaultValues.MACRO_CONVERSION_FAT)));
-
- setBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Validate data entry
-
- application.macrosPrefsEditor.putFloat(Tags.MACROS_TRAINING_KCAL,
- Float.parseFloat(trainingKCalET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACROS_REST_KCAL,
- Float.parseFloat(restKCalET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACROS_DEFICIT,
- Float.parseFloat(deficitET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACROS_PROTEIN,
- Float.parseFloat(proteinET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACROS_CARBS,
- Float.parseFloat(carbsET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACROS_FAT,
- Float.parseFloat(fatET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACRO_CONVERSION_PROTEIN,
- Float.parseFloat(proteinConversionET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACRO_CONVERSION_CARBS,
- Float.parseFloat(carbsConversionET.getText()
- .toString()));
- application.macrosPrefsEditor.putFloat(Tags.MACRO_CONVERSION_FAT,
- Float.parseFloat(fatConversionET.getText()
- .toString()));
- application.macrosPrefsEditor.commit();
- Toast.makeText(mContext,
- getResources().getString(R.string.Your_macros_have_been_saved),
- Toast.LENGTH_SHORT).show();
- finish();
- }
- });
- cancelBTN.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // Auto-generated method stub
- finish();
- }
- });
}
+
+ private void setMacros() {
+ // TODO Validate data entry
+ application.macrosPrefsEditor.putFloat(Tags.MACROS_TRAINING_KCAL,
+ Float.parseFloat(trainingKCalET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACROS_REST_KCAL,
+ Float.parseFloat(restKCalET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACROS_DEFICIT,
+ Float.parseFloat(deficitET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACROS_PROTEIN,
+ Float.parseFloat(proteinET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACROS_CARBS,
+ Float.parseFloat(carbsET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACROS_FAT,
+ Float.parseFloat(fatET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACRO_CONVERSION_PROTEIN,
+ Float.parseFloat(proteinConversionET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACRO_CONVERSION_CARBS,
+ Float.parseFloat(carbsConversionET.getText()
+ .toString()));
+ application.macrosPrefsEditor.putFloat(Tags.MACRO_CONVERSION_FAT,
+ Float.parseFloat(fatConversionET.getText()
+ .toString()));
+ application.macrosPrefsEditor.commit();
+ Toast.makeText(mContext,
+ getResources().getString(R.string.Your_macros_have_been_saved),
+ Toast.LENGTH_SHORT).show();
+ finish();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.my_macros_i_know_menu, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.MENU_cancel:
+ finish();
+ return false;
+ case R.id.MENU_set:
+ setMacros();
+ return false;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
}
diff --git a/src/com/doomonafireball/macrodroid/Tags.java b/src/com/doomonafireball/macrodroid/Tags.java
index bf8ee99..8ae0023 100644
--- a/src/com/doomonafireball/macrodroid/Tags.java
+++ b/src/com/doomonafireball/macrodroid/Tags.java
@@ -4,6 +4,9 @@ public class Tags {
// Application logging
public static final String LOG_TAG = "MacroDroid";
+ // External things
+ public static final String PHOTOS_PATH = "MacroDroid/photos";
+
// Macros SharedPreferences tags
public static final String MACROS_TRAINING_KCAL = "macros_training_kcal";
public static final String MACROS_REST_KCAL = "macros_rest_kcal";
diff --git a/src/com/exina/android/calendar/CalendarActivity.java b/src/com/exina/android/calendar/CalendarActivity.java
new file mode 100644
index 0000000..0d06786
--- /dev/null
+++ b/src/com/exina/android/calendar/CalendarActivity.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2011 Chris Gao
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.exina.android.calendar;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.format.DateUtils;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.doomonafireball.macrodroid.R;
+
+public class CalendarActivity extends Activity implements
+ CalendarView.OnCellTouchListener {
+ public static final String MIME_TYPE = "vnd.android.cursor.dir/vnd.exina.android.calendar.date";
+ CalendarView mView = null;
+ TextView mHit;
+ TextView monthYearTV;
+ Button prevMonthBTN;
+ Button nextMonthBTN;
+ SimpleDateFormat monthYearFormat;
+ Handler mHandler = new Handler();
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+ mView = (CalendarView) findViewById(R.id.calendar);
+ mView.setOnCellTouchListener(this);
+ monthYearTV = (TextView) findViewById(R.id.TV_month_year);
+ prevMonthBTN = (Button) findViewById(R.id.BTN_prev_month);
+ nextMonthBTN = (Button) findViewById(R.id.BTN_next_month);
+ monthYearFormat = new SimpleDateFormat("MMMMM yyyy");
+ prevMonthBTN.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mView.previousMonth();
+ setMonthYearText();
+ }
+ });
+ nextMonthBTN.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mView.nextMonth();
+ setMonthYearText();
+ }
+ });
+ setMonthYearText();
+
+ /*if (getIntent().getAction().equals(Intent.ACTION_PICK))
+ findViewById(R.id.hint).setVisibility(View.INVISIBLE);*/
+ }
+
+ private void setMonthYearText() {
+ Date d = new Date();
+ d.setMonth(mView.getMonth());
+ d.setYear(mView.getYear() - 1900);
+ monthYearTV.setText(monthYearFormat.format(d));
+ }
+
+ public void onTouch(Cell cell) {
+ Intent intent = getIntent();
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_PICK)
+ || action.equals(Intent.ACTION_GET_CONTENT)) {
+ Intent ret = new Intent();
+ ret.putExtra("year", mView.getYear());
+ ret.putExtra("month", mView.getMonth());
+ ret.putExtra("day", cell.getDayOfMonth());
+ this.setResult(RESULT_OK, ret);
+ finish();
+ return;
+ }
+ int day = cell.getDayOfMonth();
+ if (mView.firstDay(day))
+ mView.previousMonth();
+ else if (mView.lastDay(day))
+ mView.nextMonth();
+ else
+ return;
+
+ mHandler.post(new Runnable() {
+ public void run() {
+ Toast.makeText(
+ CalendarActivity.this,
+ DateUtils.getMonthString(mView.getMonth(),
+ DateUtils.LENGTH_LONG) + " " + mView.getYear(),
+ Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+}
\ No newline at end of file
diff --git a/src/com/exina/android/calendar/CalendarView.java b/src/com/exina/android/calendar/CalendarView.java
new file mode 100644
index 0000000..1ea7bd6
--- /dev/null
+++ b/src/com/exina/android/calendar/CalendarView.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2011 Chris Gao
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.exina.android.calendar;
+
+import com.doomonafireball.macrodroid.R;
+import java.util.Calendar;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.MonthDisplayHelper;
+import android.view.MotionEvent;
+import android.widget.ImageView;
+
+public class CalendarView extends ImageView {
+ private static int WEEK_TOP_MARGIN = 74;
+ private static int WEEK_LEFT_MARGIN = 40;
+ private static int CELL_WIDTH = 58;
+ private static int CELL_HEIGH = 53;
+ private static int CELL_MARGIN_TOP = 92;
+ private static int CELL_MARGIN_LEFT = 39;
+ private static float CELL_TEXT_SIZE;
+
+ private static final String TAG = "CalendarView";
+ private Calendar mRightNow = null;
+ private Drawable mWeekTitle = null;
+ private Cell mToday = null;
+ private Cell[][] mCells = new Cell[6][7];
+ private OnCellTouchListener mOnCellTouchListener = null;
+ MonthDisplayHelper mHelper;
+ Drawable mDecoration = null;
+
+ public interface OnCellTouchListener {
+ public void onTouch(Cell cell);
+ }
+
+ public CalendarView(Context context) {
+ this(context, null);
+ }
+
+ public CalendarView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public CalendarView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ mDecoration = context.getResources().getDrawable(
+ R.drawable.typeb_calendar_today);
+ initCalendarView();
+ }
+
+ private void initCalendarView() {
+ mRightNow = Calendar.getInstance();
+ // prepare static vars
+ Resources res = getResources();
+ WEEK_TOP_MARGIN = (int) res.getDimension(R.dimen.week_top_margin);
+ WEEK_LEFT_MARGIN = (int) res.getDimension(R.dimen.week_left_margin);
+
+ CELL_WIDTH = (int) res.getDimension(R.dimen.cell_width);
+ CELL_HEIGH = (int) res.getDimension(R.dimen.cell_heigh);
+ CELL_MARGIN_TOP = (int) res.getDimension(R.dimen.cell_margin_top);
+ CELL_MARGIN_LEFT = (int) res.getDimension(R.dimen.cell_margin_left);
+
+ CELL_TEXT_SIZE = res.getDimension(R.dimen.cell_text_size);
+ // set background
+ setImageResource(R.drawable.background);
+ mWeekTitle = res.getDrawable(R.drawable.calendar_week);
+
+ mHelper = new MonthDisplayHelper(mRightNow.get(Calendar.YEAR),
+ mRightNow.get(Calendar.MONTH));
+
+ }
+
+ private void initCells() {
+ class _calendar {
+ public int day;
+ public boolean thisMonth;
+
+ public _calendar(int d, boolean b) {
+ day = d;
+ thisMonth = b;
+ }
+
+ public _calendar(int d) {
+ this(d, false);
+ }
+ }
+ ;
+ _calendar tmp[][] = new _calendar[6][7];
+
+ for (int i = 0; i < tmp.length; i++) {
+ int n[] = mHelper.getDigitsForRow(i);
+ for (int d = 0; d < n.length; d++) {
+ if (mHelper.isWithinCurrentMonth(i, d))
+ tmp[i][d] = new _calendar(n[d], true);
+ else
+ tmp[i][d] = new _calendar(n[d]);
+
+ }
+ }
+
+ Calendar today = Calendar.getInstance();
+ int thisDay = 0;
+ mToday = null;
+ if (mHelper.getYear() == today.get(Calendar.YEAR)
+ && mHelper.getMonth() == today.get(Calendar.MONTH)) {
+ thisDay = today.get(Calendar.DAY_OF_MONTH);
+ }
+ // build cells
+ Rect Bound = new Rect(CELL_MARGIN_LEFT, CELL_MARGIN_TOP, CELL_WIDTH
+ + CELL_MARGIN_LEFT, CELL_HEIGH + CELL_MARGIN_TOP);
+ for (int week = 0; week < mCells.length; week++) {
+ for (int day = 0; day < mCells[week].length; day++) {
+ if (tmp[week][day].thisMonth) {
+ if (day == 0 || day == 6)
+ mCells[week][day] = new RedCell(tmp[week][day].day,
+ new Rect(Bound), CELL_TEXT_SIZE);
+ else
+ mCells[week][day] = new Cell(tmp[week][day].day,
+ new Rect(Bound), CELL_TEXT_SIZE);
+ } else
+ mCells[week][day] = new GrayCell(tmp[week][day].day,
+ new Rect(Bound), CELL_TEXT_SIZE);
+
+ Bound.offset(CELL_WIDTH, 0); // move to next column
+
+ // get today
+ if (tmp[week][day].day == thisDay && tmp[week][day].thisMonth) {
+ mToday = mCells[week][day];
+ mDecoration.setBounds(mToday.getBound());
+ }
+ }
+ Bound.offset(0, CELL_HEIGH); // move to next row and first column
+ Bound.left = CELL_MARGIN_LEFT;
+ Bound.right = CELL_MARGIN_LEFT + CELL_WIDTH;
+ }
+ }
+
+ @Override
+ public void onLayout(boolean changed, int left, int top, int right,
+ int bottom) {
+ android.util.Log.d(TAG, "left=" + left);
+ Rect re = getDrawable().getBounds();
+ WEEK_LEFT_MARGIN = CELL_MARGIN_LEFT = (right - left - re.width()) / 2;
+ mWeekTitle.setBounds(WEEK_LEFT_MARGIN, WEEK_TOP_MARGIN,
+ WEEK_LEFT_MARGIN + mWeekTitle.getMinimumWidth(),
+ WEEK_TOP_MARGIN + mWeekTitle.getMinimumHeight());
+ initCells();
+ super.onLayout(changed, left, top, right, bottom);
+ }
+
+ public void setTimeInMillis(long milliseconds) {
+ mRightNow.setTimeInMillis(milliseconds);
+ initCells();
+ this.invalidate();
+ }
+
+ public int getYear() {
+ return mHelper.getYear();
+ }
+
+ public int getMonth() {
+ return mHelper.getMonth();
+ }
+
+ public void nextMonth() {
+ mHelper.nextMonth();
+ initCells();
+ invalidate();
+ }
+
+ public void previousMonth() {
+ mHelper.previousMonth();
+ initCells();
+ invalidate();
+ }
+
+ public boolean firstDay(int day) {
+ return day == 1;
+ }
+
+ public boolean lastDay(int day) {
+ return mHelper.getNumberOfDaysInMonth() == day;
+ }
+
+ public void goToday() {
+ Calendar cal = Calendar.getInstance();
+ mHelper = new MonthDisplayHelper(cal.get(Calendar.YEAR),
+ cal.get(Calendar.MONTH));
+ initCells();
+ invalidate();
+ }
+
+ public Calendar getDate() {
+ return mRightNow;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ if (mOnCellTouchListener != null) {
+ for (Cell[] week : mCells) {
+ for (Cell day : week) {
+ if (day.hitTest((int) event.getX(), (int) event.getY())) {
+ mOnCellTouchListener.onTouch(day);
+ }
+ }
+ }
+ }
+ return super.onTouchEvent(event);
+ }
+
+ public void setOnCellTouchListener(OnCellTouchListener p) {
+ mOnCellTouchListener = p;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ // draw background
+ super.onDraw(canvas);
+ mWeekTitle.draw(canvas);
+
+ // draw cells
+ for (Cell[] week : mCells) {
+ for (Cell day : week) {
+ day.draw(canvas);
+ }
+ }
+
+ // draw today
+ if (mDecoration != null && mToday != null) {
+ mDecoration.draw(canvas);
+ }
+ }
+
+ private class GrayCell extends Cell {
+ public GrayCell(int dayOfMon, Rect rect, float s) {
+ super(dayOfMon, rect, s);
+ mPaint.setColor(Color.LTGRAY);
+ }
+ }
+
+ private class RedCell extends Cell {
+ public RedCell(int dayOfMon, Rect rect, float s) {
+ super(dayOfMon, rect, s);
+ mPaint.setColor(0xdddd0000);
+ }
+
+ }
+
+}
diff --git a/src/com/exina/android/calendar/Cell.java b/src/com/exina/android/calendar/Cell.java
new file mode 100644
index 0000000..acfe09b
--- /dev/null
+++ b/src/com/exina/android/calendar/Cell.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011 Chris Gao
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.exina.android.calendar;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+public class Cell {
+ private static final String TAG = "Cell";
+ protected Rect mBound = null;
+ protected int mDayOfMonth = 1; // from 1 to 31
+ protected Paint mPaint = new Paint(Paint.SUBPIXEL_TEXT_FLAG
+ | Paint.ANTI_ALIAS_FLAG);
+ int dx, dy;
+
+ public Cell(int dayOfMon, Rect rect, float textSize, boolean bold) {
+ mDayOfMonth = dayOfMon;
+ mBound = rect;
+ mPaint.setTextSize(textSize/*26f*/);
+ mPaint.setColor(Color.BLACK);
+ if (bold)
+ mPaint.setFakeBoldText(true);
+
+ dx = (int) mPaint.measureText(String.valueOf(mDayOfMonth)) / 2;
+ dy = (int) (-mPaint.ascent() + mPaint.descent()) / 2;
+ }
+
+ public Cell(int dayOfMon, Rect rect, float textSize) {
+ this(dayOfMon, rect, textSize, false);
+ }
+
+ protected void draw(Canvas canvas) {
+ canvas.drawText(String.valueOf(mDayOfMonth), mBound.centerX() - dx,
+ mBound.centerY() + dy, mPaint);
+ }
+
+ public int getDayOfMonth() {
+ return mDayOfMonth;
+ }
+
+ public boolean hitTest(int x, int y) {
+ return mBound.contains(x, y);
+ }
+
+ public Rect getBound() {
+ return mBound;
+ }
+
+ public String toString() {
+ return String.valueOf(mDayOfMonth) + "(" + mBound.toString() + ")";
+ }
+
+}