diff --git a/README.md b/README.md index a22a17d..be6a5d8 100644 --- a/README.md +++ b/README.md @@ -1 +1,6 @@ -# build-gigapet-AND \ No newline at end of file +# build-gigapet-AND + +## App that allows parents to encourage their children to live a healthier live by associating the foods they eat with the effects on a digital pet that they're resposible of taking care of. + + +### App is stable, but Not all MVP features are currently working, I'll continue to work on this project over the upcoming months to get it to a market ready product. diff --git a/app/debug/output.json b/app/debug/output.json new file mode 100644 index 0000000..f20a39f --- /dev/null +++ b/app/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7dd4e71..5279c66 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,14 +11,14 @@ diff --git a/app/src/main/ic_launcher_blob-web.png b/app/src/main/ic_launcher_blob-web.png new file mode 100644 index 0000000..5dc9a68 Binary files /dev/null and b/app/src/main/ic_launcher_blob-web.png differ diff --git a/app/src/main/java/com/example/gigapet/AddFoodListAdapter.java b/app/src/main/java/com/example/gigapet/AddFoodListAdapter.java new file mode 100644 index 0000000..9772f54 --- /dev/null +++ b/app/src/main/java/com/example/gigapet/AddFoodListAdapter.java @@ -0,0 +1,81 @@ +package com.example.gigapet; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.util.DisplayMetrics; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.util.ArrayList; + +public class AddFoodListAdapter extends RecyclerView.Adapter { + + public AddFoodListAdapter() { + } + + class ViewHolder extends RecyclerView.ViewHolder { + Context context; + ImageView ivMinusButton; + ImageView ivPlusButton; + ImageView ivFoodImage; + ImageView ivFoodBackground; + TextView tvFoodAmount; + View vParentView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + ivFoodBackground = itemView.findViewById(R.id.iv_food); + ivFoodImage = itemView.findViewById(R.id.iv_food_icon); + tvFoodAmount = itemView.findViewById(R.id.tv_num); + ivMinusButton = itemView.findViewById(R.id.iv_button_food_minus); + ivPlusButton = itemView.findViewById(R.id.iv_button_food_plus); + vParentView = itemView.findViewById(R.id.recycler_view_item_add_food); + } + } + + @NonNull + @Override + public AddFoodListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.food_add_item_layout, parent, false); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull final AddFoodListAdapter.ViewHolder viewHolder, int i) { + viewHolder.tvFoodAmount.setText(String.valueOf(Constants.ADD_FOOD_ARRAY[i])); + viewHolder.ivFoodImage.setImageResource(DrawableResolver.getDrawableImageIcon(i)); + viewHolder.ivFoodBackground.setImageResource(DrawableResolver.getDrawableIcon(i)); + final int position = i; + viewHolder.ivMinusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (Constants.ADD_FOOD_ARRAY[position] > 0) { + Constants.ADD_FOOD_ARRAY[position]--; + viewHolder.tvFoodAmount.setText(String.valueOf(Constants.ADD_FOOD_ARRAY[position])); + } + notifyDataSetChanged(); + } + }); + viewHolder.ivPlusButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Constants.ADD_FOOD_ARRAY[position]++; + viewHolder.tvFoodAmount.setText(String.valueOf(Constants.ADD_FOOD_ARRAY[position])); + notifyDataSetChanged(); + } + }); + + } + + @Override + public int getItemCount() { + return 6; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/gigapet/Animations.java b/app/src/main/java/com/example/gigapet/Animations.java new file mode 100644 index 0000000..f303026 --- /dev/null +++ b/app/src/main/java/com/example/gigapet/Animations.java @@ -0,0 +1,20 @@ +package com.example.gigapet; + +import android.app.Activity; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; + +public class Animations { + Activity activity; + + public Animations(Activity activity){ + this.activity = activity; + } + + public void ItemTap(View v){ + Animation anim = AnimationUtils.loadAnimation(activity, R.anim.item_anim_slide_up); + anim.setDuration(200); + v.startAnimation(anim); + } +} diff --git a/app/src/main/java/com/example/gigapet/Child.java b/app/src/main/java/com/example/gigapet/Child.java index b69e022..87a45b8 100644 --- a/app/src/main/java/com/example/gigapet/Child.java +++ b/app/src/main/java/com/example/gigapet/Child.java @@ -14,10 +14,22 @@ public Child(String name, int id) { } public Child(String name, int id, Gigapet gigapet) { + + //TODO: save food int array in shared prefs to load this.name = name; this.id = id; this.gigapet = gigapet; - foodIntArr = new int[6]; + foodIntArr = new int[]{0,0,0,0,0,0}; + getFoodFromDb(); + } + + public void getFoodFromDb(){ + new Thread(new Runnable() { + @Override + public void run() { + // ChildDao.LoadFoodEntries(); + } + }).start(); } public void setGigapet(Gigapet gigapet) { diff --git a/app/src/main/java/com/example/gigapet/ChildDao.java b/app/src/main/java/com/example/gigapet/ChildDao.java index 9e0105f..8b0b271 100644 --- a/app/src/main/java/com/example/gigapet/ChildDao.java +++ b/app/src/main/java/com/example/gigapet/ChildDao.java @@ -1,25 +1,45 @@ package com.example.gigapet; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; - +import java.util.HashMap; +import java.util.Map; public class ChildDao { - public static Child getCurrentChild(){ - return ChildRepo.getChildById(Parent.getChildIndex()); + public static Child getCurrentChild() { + return ChildRepo.getChildById(ChildRepo.getCurrentChildId()); } public static void addChild(Child child) { ChildRepo.addChild(child); + JSONObject requestBody = null; + try { + requestBody = new JSONObject( + (String.format("{\"name\":\"%s\",\"pet_name\":\"%s\",\"pet_experience\":%d,\"pet_id\":%d}", + child.getName(), + child.getGigapet().getName(), + child.getGigapet().getExp(), + child.getGigapet().getId()))); + } catch (JSONException e) { + e.printStackTrace(); + } + NetworkAdapter.httpRequest( + String.format( + Constants.ADD_CHILD_URL, + Constants.prefs.getInt("parent_id", 0)), + NetworkAdapter.POST, + requestBody, + Constants.getHeaders()); } public static JSONObject getFoodHistory(int mealType, int childPos) { JSONObject jsonObject = null; - String history = "{\"carbs\":[{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 },{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Protein\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"protein\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 4,\"meal\": \"Lunch\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"vegetables\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"fruits\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"dairy\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }]}"; + String history = "{\"carbs\":[{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 },{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Protein\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"protein\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 4,\"meal\": \"Lunch\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"vegetables\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"fruits\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }],\"dairy\": [{\"id\": 1,\"name\": \"Porridge\",\"quantity\": 2,\"meal\": \"Breakfast\",\"category\": \"Carbs\",\"date_added\": \"2019--04-15\",\"date_update\": \"2019--04-15\",\"child_id\": 1 }]}"; try { jsonObject = new JSONObject(history); } catch (JSONException e) { @@ -37,4 +57,223 @@ public static ArrayList getChildren() { public static int getHighestId() { return ChildRepo.getHighestId(); } -} + + public static String[] getChildrenNames() { + return ChildRepo.getChildrenNames(); + } + + public static void removeChild(int pos) { + NetworkAdapter.httpRequest(Constants.CHILD_URL + "/" + String.valueOf(pos) + "/", NetworkAdapter.DELETE, Constants.getHeaders()); + } + + public static void importChildrenFromDb() { + int childId = 0; + String childName = ""; + String petName = ""; + int petExp = 0; + int petId = 0; + String happyImg = ""; + String okImg = ""; + String sadImg = ""; + String sickImg = ""; + String eatingImg = ""; + JSONObject jsonObject; + + + final String result = NetworkAdapter.httpRequest( + Constants.PARENT_URL + + String.valueOf( + Parent.getId()), + NetworkAdapter.GET, Constants.getHeaders()); + + try { + jsonObject = new JSONObject(result); + try { + JSONArray jsonArray = jsonObject.getJSONArray("childArray"); + if (jsonArray.isNull(0)) { + new Thread(new Runnable() { + @Override + public void run() { + ChildDao.addChild(new Child("Default", 1)); + } + }).start(); + + } else { + ChildRepo.removeAllChildren(); + for (int i = 0; i < jsonArray.length(); i++) { + + try { + childId = jsonArray.getJSONObject(i).getInt("child_id"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + childName = jsonArray.getJSONObject(i).getString("child_name"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + petName = jsonArray.getJSONObject(i).getString("pet_name"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + petExp = jsonArray.getJSONObject(i).getInt("pet_experience"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + petId = jsonArray.getJSONObject(i).getInt("pet_id"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + happyImg = jsonArray.getJSONObject(i).getString("happy"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + okImg = jsonArray.getJSONObject(i).getString("ok"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + sadImg = jsonArray.getJSONObject(i).getString("sad"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + sickImg = jsonArray.getJSONObject(i).getString("sick"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + eatingImg = jsonArray.getJSONObject(i).getString("eating"); + } catch (JSONException e) { + e.printStackTrace(); + } + + ChildRepo.addChild(new Child( + childName, + childId, + new Gigapet( + petName, + petExp, + petId, + happyImg, + okImg, + sadImg, + sickImg, + eatingImg))); + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + + public static void setCurrentChildId(int id) { + ChildRepo.setCurrentChildById(id); + } + + public static void AddFoodToDb(Food food){ + + JSONObject requestBody = null; + try { + requestBody = new JSONObject( + (String.format("{\"name\":\"%s\",\"quanity\":\"%d\",\"meal\":%s\",\"category\":%s\",\"date_added\":%s\",\"date_updated\":%s\"}", + food.getName(), + food.getQuantity(), + food.getMeal(), + food.getCategory(), + food.getDateAdded(), + food.getDateUpdated()))); + } catch (JSONException e) { + e.printStackTrace(); + } + + String url = String.format(Constants.FOOD_ENTRIES_UPDATE_URL, ChildDao.getCurrentChild().getId()); + NetworkAdapter.httpRequest(url, NetworkAdapter.POST, requestBody, Constants.getHeaders()); + } + + public static Child getChildByName(String childrenName) { + return ChildRepo.getChildByName(childrenName); + } + + public static void LoadFoodEntries() { + int[] entries = new int[6]; + ArrayList foods = new ArrayList<>(); + + int id = 0; + String name = ""; + int quantity = 0; + String meal = ""; + String category = ""; + String dateAdded = ""; + String dateUpdated = ""; + int childId = 0; + + + String url = String.format(Constants.FOOD_ENTRIES_UPDATE_URL, ChildDao.getCurrentChild().getId()); + String result = NetworkAdapter.httpRequest(url, NetworkAdapter.GET, Constants.getHeaders()); + + try { + JSONArray jsonArray = new JSONArray(result); + JSONObject jsonObject = new JSONObject(); + for (int i = 0; i < jsonArray.length(); i++) { + jsonObject = jsonArray.getJSONObject(i); + + id = jsonObject.getInt("id"); + name = jsonObject.getString("name"); + quantity = jsonObject.getInt("quantity"); + meal = jsonObject.getString("meal"); + category = jsonObject.getString("category"); + dateAdded = jsonObject.getString("date_added"); + dateUpdated = jsonObject.getString("date_updated"); + childId = jsonObject.getInt("child_id"); + + foods.add(new Food(id,name,quantity,meal,category,dateAdded,dateUpdated,childId)); + } + + FoodRepo.addFoodList(foods); + } catch (JSONException e) { + e.printStackTrace(); + } + + } + + public static void CreateFoodFromIntArr(int[] addFoodArray) { + for(int i = 0; i < 6; ++i){ + AddFoodToDb(new Food( + Constants.FOOD_TYPES[i], + Constants.MEAL_TYPES[Parent.getMealIndex()], + addFoodArray[i], + ChildDao.getCurrentChild().getId())); + } + } + + public static void loadFirstChild() { + + String firstChildName = Constants.prefs.getString("first_child_name", "Default"); + int firstChildId = Constants.prefs.getInt("first_child_id", 0); + + if(firstChildId != 0){ + Constants.FIRST_CHILD_LOADED = true; + } + addChild(new Child(firstChildName,firstChildId)); + setCurrentChildId(firstChildId); + + + } + + public static void AddFood(int[] addFoodArray) { + for(int i = 0; i < addFoodArray.length; i++){ + AddFoodToDb(new Food(Constants.FOOD_TYPES[i], Constants.MEAL_TYPES[Parent.getMealIndex()], addFoodArray[i], getCurrentChild().getId())); + ChildRepo.addFood(i, addFoodArray[i]); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/gigapet/ChildRepo.java b/app/src/main/java/com/example/gigapet/ChildRepo.java index 7686cb3..10960df 100644 --- a/app/src/main/java/com/example/gigapet/ChildRepo.java +++ b/app/src/main/java/com/example/gigapet/ChildRepo.java @@ -4,9 +4,11 @@ public class ChildRepo { private static ArrayList children = new ArrayList<>(); + private static int currentChildId = 0; public ChildRepo(ArrayList children) { this.children = children; + currentChildId = 0; } public static void addChild(Child child){ @@ -19,7 +21,7 @@ public static Child getChildById(int id){ return children.get(i); } } - return null; + return children.get(0); } public static ArrayList getChildren() { @@ -35,4 +37,51 @@ public static int getHighestId(){ } return result; } + + public static String[] getChildrenNames() { + String[] names = new String[children.size()]; + int i = 0; + for (Child child:children) { + names[i] = child.getName(); + i++; + } + return names; + } + + public static void removeChild(int pos) { + children.remove(pos); + } + + public static void removeAllChildren() { + children.clear(); + } + + public static void setCurrentChildById(int id) { + currentChildId = id; + } + + public static void setChildren(ArrayList children) { + ChildRepo.children = children; + } + + public static int getCurrentChildId() { + return currentChildId; + } + + public static void setCurrentChildId(int currentChildId) { + ChildRepo.currentChildId = currentChildId; + } + + public static Child getChildByName(String childrenName) { + for(int i = 0; i < children.size(); i++){ + if(childrenName == children.get(i).getName()){ + return children.get(i); + } + } + return null; + } + + public static void addFood(int type, int amount) { + getChildById(getCurrentChildId()).addFood(type, amount); + } } diff --git a/app/src/main/java/com/example/gigapet/Constants.java b/app/src/main/java/com/example/gigapet/Constants.java index c8a9e1d..4c5cd22 100644 --- a/app/src/main/java/com/example/gigapet/Constants.java +++ b/app/src/main/java/com/example/gigapet/Constants.java @@ -1,21 +1,65 @@ package com.example.gigapet; +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Bitmap; + +import java.util.HashMap; +import java.util.Map; + +import static android.content.Context.MODE_PRIVATE; + public class Constants { + + public static final String GIGAPET_DEFAULT_NAME = "Charlie"; + public static Bitmap CURRENT_PET_BITMAP = null; + public static int FOOD_TYPE_FRUIT = 0; public static int FOOD_TYPE_VEGGIE = 1; public static int FOOD_TYPE_CARB = 2; public static int FOOD_TYPE_PROTEIN = 3; public static int FOOD_TYPE_DAIRY = 4; public static int FOOD_TYPE_SWEET = 5; + public static int MEAL_TYPE_ALL = 0; + public static int MEAL_TYPE_BREAKFAST = 1; + public static int MEAL_TYPE_LUNCH = 2; + public static int MEAL_TYPE_DINNER = 3; + public static boolean FIRST_CHILD_LOADED = false; + public static SharedPreferences prefs; + public static SharedPreferences.Editor editor; + public static int[] ADD_FOOD_ARRAY = new int[6]; public static String[] MEAL_TYPES = {"All Meals", "Breakfast", "Lunch", "Dinner"}; + public static String[] FOOD_TYPES = {"fruit", "vegetables", "carbs", "protein", "dairy", "treats"}; public static String BASE_URL = "https://lambda-gigapet.herokuapp.com/"; - // public static String URL_ENDING = "/.json"; public static String PET_URL = BASE_URL + "api/pet"; public static String REGISTER_URL = BASE_URL + "api/auth/register"; public static String LOGIN_URL = BASE_URL + "api/auth/login"; - public static String CHILD_URL = BASE_URL + "api/child/%d"; + public static String CHILD_URL = BASE_URL + "api/child"; + public static String PARENT_URL = BASE_URL + "api/parent/"; + public static String PARENT_ENDING = "api/parent/"; + public static String FOOD_ENTRY_ENDING = "/entries"; + public static String FOOD_ENTRIES_UPDATE_URL = CHILD_URL + "/%d" + FOOD_ENTRY_ENDING; + public static String FOOD_ENTRIES_ID_TIME = BASE_URL + CHILD_URL + "/%d/entries?time-span=%s"; + public static final String ADD_CHILD_URL = BASE_URL + PARENT_ENDING + "%d" + "/child"; + + public static void setSharedPrefs(Context context){ + prefs = context.getSharedPreferences("MyPref", MODE_PRIVATE); + editor = prefs.edit(); + } + + public static Map getHeaders() { + Map params = new HashMap<>(); + params.put("Authorization", Constants.prefs.getString("token", "default")); + params.put("Content-Type", "application/json"); + return params; + } + + public static void ClearFoodArray(){ + ADD_FOOD_ARRAY = new int[] {0,0,0,0,0,0}; + } + } diff --git a/app/src/main/java/com/example/gigapet/DrawableResolver.java b/app/src/main/java/com/example/gigapet/DrawableResolver.java index 25fcd68..d9dd56c 100644 --- a/app/src/main/java/com/example/gigapet/DrawableResolver.java +++ b/app/src/main/java/com/example/gigapet/DrawableResolver.java @@ -40,7 +40,7 @@ public static int[] getDrawableId(int category) { return drawable; } - public static int getDrawableIcon(int category) { + public static int getDrawableIcon(int category) { int drawable; try { switch (category) { @@ -60,7 +60,38 @@ public static int getDrawableIcon(int category) { drawable = R.drawable.protein_icon; break; case 5: + drawable = R.drawable.treat_icon_square; + break; + default: drawable = R.drawable.protein_icon; + } + } catch (ArrayIndexOutOfBoundsException e) { + drawable = R.drawable.protein_icon; + } + return drawable; + } + + public static int getDrawableImageIcon(int category) { + int drawable; + try { + switch (category) { + case 0: + drawable = R.drawable.fruit_apple; + break; + case 1: + drawable = R.drawable.veggie_corn; + break; + case 2: + drawable = R.drawable.veggie_eggplant; + break; + case 3: + drawable = R.drawable.treats_cupcake; + break; + case 4: + drawable = R.drawable.treats_icecream_choc; + break; + case 5: + drawable = R.drawable.treats_donut; break; default: drawable = R.drawable.protein_icon; @@ -72,8 +103,10 @@ public static int getDrawableIcon(int category) { } + public static final int[] fruits = new int[]{ - R.drawable.fruit_apple}; + R.drawable.fruit_apple, + R.drawable.fruit_orange}; public static final int[] veggies = new int[]{ R.drawable.fruit_banana}; diff --git a/app/src/main/java/com/example/gigapet/Food.java b/app/src/main/java/com/example/gigapet/Food.java new file mode 100644 index 0000000..cc859a2 --- /dev/null +++ b/app/src/main/java/com/example/gigapet/Food.java @@ -0,0 +1,99 @@ +package com.example.gigapet; + +public class Food { + + private int id; + private String name; + private int quantity; + private String meal; + private String category; + private String dateAdded; + private String dateUpdated; + private int childId; + + public Food(String category, String meal, int quantity, int childId){ + + this(1,"name", quantity, meal, category, "2019--04-15", "2019--04-16", childId); + } + + + + public Food(int id, String name, int quantity, String meal, String category, String dateAdded, int childId) { + this(id,name,quantity,meal,category,dateAdded,dateAdded,childId); + } + + public Food(int id, String name, int quantity, String meal, String category, String dateAdded, String dateUpdated, int childId) { + this.id = id; + this.name = name; + this.quantity = quantity; + this.meal = meal; + this.category = category; + this.dateAdded = dateAdded; + this.dateUpdated = dateUpdated; + this.childId = childId; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public String getMeal() { + return meal; + } + + public void setMeal(String meal) { + this.meal = meal; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getDateAdded() { + return dateAdded; + } + + public void setDateAdded(String dateAdded) { + this.dateAdded = dateAdded; + } + + public String getDateUpdated() { + return dateUpdated; + } + + public void setDateUpdated(String dateUpdated) { + this.dateUpdated = dateUpdated; + } + + public int getChildId() { + return childId; + } + + public void setChildId(int childId) { + this.childId = childId; + } +} diff --git a/app/src/main/java/com/example/gigapet/FoodDao.java b/app/src/main/java/com/example/gigapet/FoodDao.java deleted file mode 100644 index 72e43d2..0000000 --- a/app/src/main/java/com/example/gigapet/FoodDao.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.gigapet; - -public class FoodDao { -} diff --git a/app/src/main/java/com/example/gigapet/FoodIconAdapter.java b/app/src/main/java/com/example/gigapet/FoodIconAdapter.java index 5ceb146..ad3c91e 100644 --- a/app/src/main/java/com/example/gigapet/FoodIconAdapter.java +++ b/app/src/main/java/com/example/gigapet/FoodIconAdapter.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.res.Resources; import android.support.annotation.NonNull; +import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.RecyclerView; import android.util.DisplayMetrics; import android.view.LayoutInflater; @@ -20,9 +21,9 @@ public class FoodIconAdapter extends RecyclerView.Adapter { ArrayList foodIcons; - - - public FoodIconAdapter() { + Activity activity; + public FoodIconAdapter(Activity activity) { + this.activity = activity; foodIcons = new ArrayList<>(); int[] foodAmountArr = ChildDao.getCurrentChild().getAllFood(); for (int j = 0; j < 5; ++j) { @@ -30,13 +31,14 @@ public FoodIconAdapter() { } } - class ViewHolder extends RecyclerView.ViewHolder { + class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ Context context; ImageView ivFoodImage; ImageView ivFoodBackground; TextView tvFoodAmount; View vParentView; + public ViewHolder(@NonNull View itemView) { super(itemView); ivFoodImage = itemView.findViewById(R.id.iv_food_icon_image); @@ -44,6 +46,11 @@ public ViewHolder(@NonNull View itemView) { ivFoodBackground = itemView.findViewById(R.id.iv_food_icon_background); vParentView = itemView.findViewById(R.id.recycler_view_item); } + + @Override + public void onClick(View v) { + + } } @NonNull @@ -54,18 +61,17 @@ public FoodIconAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, } @Override - public void onBindViewHolder(@NonNull FoodIconAdapter.ViewHolder viewHolder, int i) { + public void onBindViewHolder(@NonNull final FoodIconAdapter.ViewHolder viewHolder, int i) { final FoodIcons data = foodIcons.get(i); - DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics(); - - // viewHolder.vParentView.setLayoutParams(new ViewGroup.LayoutParams(displayMetrics.widthPixels/3,displayMetrics.widthPixels/3)); foodIcons.clear(); - int[] foodAmountArr = ChildDao.getCurrentChild().getAllFood(); + int[] foodAmountArr = ChildDao.getCurrentChild().getAllFood(); for (int j = 0; j < 5; ++j) { foodIcons.add(new FoodIcons(j, foodAmountArr[j])); } + + viewHolder.tvFoodAmount.setText(String.valueOf(data.getNumberOfFood())); viewHolder.ivFoodImage.setImageResource(data.getRandomImage()); final int position = i++; @@ -76,6 +82,14 @@ public void onClick(View v) { if (ChildDao.getCurrentChild().getFoodById(position) > 0) { ChildDao.getCurrentChild().removeFood(position, 1); ChildDao.getCurrentChild().getGigapet().feed(position); + foodIcons.clear(); + int[] foodAmountArr = ChildDao.getCurrentChild().getAllFood(); + for (int j = 0; j < 5; ++j) { + foodIcons.add(new FoodIcons(j, foodAmountArr[j])); + } + + new Animations(activity).ItemTap(viewHolder.vParentView); + GigapetMainActivity.updateGigapet(); notifyDataSetChanged(); } } diff --git a/app/src/main/java/com/example/gigapet/FoodRepo.java b/app/src/main/java/com/example/gigapet/FoodRepo.java new file mode 100644 index 0000000..ef0600a --- /dev/null +++ b/app/src/main/java/com/example/gigapet/FoodRepo.java @@ -0,0 +1,66 @@ +package com.example.gigapet; + +import java.util.ArrayList; +import java.util.Random; + +public class FoodRepo { + + static ArrayList foods = new ArrayList<>(); + + public FoodRepo(){ + addFoodArr(mockData(20)); + } + + public static Food getFoodById(int id) { + for (int i = 0; i < foods.size(); i++) { + if (foods.get(i).getId() == id) { + return foods.get(id); + } + } + return null; + } + + public static void addFoodList(ArrayList foods) { + foods.addAll(foods); + } + + public void addFoodArr(ArrayList addedFoods){ + foods.addAll(addedFoods); + } + + public static void addFood(Food food) { + foods.add(food); + } + + public static void clearFoods(){ + foods.clear(); + } + + public static ArrayList getFoods() { + return foods; + } + + public static ArrayList mockData(int amount){ + int counter = 1; + Random random = new Random(); + ArrayList foods = new ArrayList<>(); + for(int i = 0; i < amount; i++){ + //int id, String name, int quantity, String meal, String category, String dateAdded, String dateUpdated, int childId + foods.add(new Food( + counter, + "FakeFood", + random.nextInt(3), + getRandomFoodType(random.nextInt(5)), + "2019--04-15", + "2019--04-15", + ChildDao.getCurrentChild().getId())); + } + + return foods; + } + + public static String getRandomFoodType(int randomNum){ + return Constants.FOOD_TYPES[randomNum]; + } +} + diff --git a/app/src/main/java/com/example/gigapet/Gigapet.java b/app/src/main/java/com/example/gigapet/Gigapet.java index 4bf36b5..906aa75 100644 --- a/app/src/main/java/com/example/gigapet/Gigapet.java +++ b/app/src/main/java/com/example/gigapet/Gigapet.java @@ -3,52 +3,66 @@ public class Gigapet { private String name; private int id; - private int state; private int exp; - private int[] imageResource; + private String description; + private String species; + private String happyImg; + private String okImg; + private String sadImg; + private String sickImg; + private String eatingImg; + private int state; public Gigapet(String name, int id) { this.name = name; this.id = id; + this.exp = 0; } - public void feed(int foodType){ - switch (foodType){ - case 1: eatHealthyFood(); - break; - case 2: eatHealthyFood(); - break; - case 3: eatHealthyFood(); - break; - case 4: eatHealthyFood(); - break; - case 5: eatHealthyFood(); - break; - case 6: eatSweets(); - break; - } - + public Gigapet(int petId,String species,String description,String happyUrl,String okUrl,String sadUrl,String sickUrl,String eatingUrl){ + this.id = petId; + this.species = species; + this.description = description; + this.happyImg = happyUrl; + this.okImg = okUrl; + this.sadImg = sadUrl; + this.sickImg = sickUrl; + this.eatingImg = eatingUrl; } - private void eatHealthyFood(){ - + public Gigapet(String name, int exp, int id, String happyImg, String okImg, String sadImg, String sickImg, String eatingImg) { + this.name = name; + this.id = id; + this.exp = exp; + this.happyImg = happyImg; + this.okImg = okImg; + this.sadImg = sadImg; + this.sickImg = sickImg; + this.eatingImg = eatingImg; } - private void eatSweets(){ + + public void feed(int foodType) { + state = foodType; } public void setName(String name) { this.name = name; } + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + public void setExp(int exp) { this.exp = exp; } - public void setImageResource(int[] imageResource) { - this.imageResource = imageResource; - } public String getName() { return name; @@ -58,15 +72,35 @@ public int getExp() { return exp; } - public int[] getImageResource() { - return imageResource; + public int getId() { + return id; } - public int getState() { - return state; + public void setId(int id) { + this.id = id; } - public void setState(int state) { - this.state = state; + public String getHappyImg() { + return happyImg; + } + + public String getOkImg() { + return okImg; } + + public String getSadImg() { + return sadImg; + } + public void addExp(){ + exp = exp + 1; + } + + public String getSickImg() { + return sickImg; + } + + public String getEatingImg() { + return eatingImg; + } + } diff --git a/app/src/main/java/com/example/gigapet/GigapetDao.java b/app/src/main/java/com/example/gigapet/GigapetDao.java index fc2366a..9c1836b 100644 --- a/app/src/main/java/com/example/gigapet/GigapetDao.java +++ b/app/src/main/java/com/example/gigapet/GigapetDao.java @@ -1,29 +1,113 @@ package com.example.gigapet; +import android.arch.lifecycle.ViewModelProvider; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; + + public class GigapetDao { - public static String getBaseUrl() { - return Constants.BASE_URL; - } + public static void loadGigapets() { - public static String getPetUrl() { - return Constants.PET_URL; - } + int petId = 0; + String species = ""; + String description = ""; + String happyUrl = ""; + String okUrl = ""; + String sadUrl = ""; + String sickUrl = ""; + String eatingUrl = ""; - public static String getRegisterUrl() { - return Constants.REGISTER_URL; - } + new Thread(new Runnable() { + @Override + public void run() { + String results = NetworkAdapter.httpRequest(Constants.PET_URL, NetworkAdapter.GET, Constants.getHeaders()); + try { + int petId = 0; + String species = ""; + String description = ""; + String happyUrl = ""; + String okUrl = ""; + String sadUrl = ""; + String sickUrl = ""; + String eatingUrl = ""; - public static String getLoginUrl() { - return Constants.LOGIN_URL; - } + ArrayList loadPets = new ArrayList(); + + JSONArray jsonArray = new JSONArray(results); + + for (int i = 0; i < jsonArray.length(); ++i) { + JSONObject jsonObject = (JSONObject) jsonArray.get(i); + try { + petId = jsonObject.getInt("id"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + species = jsonObject.getString("species"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + description = jsonObject.getString("description"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + happyUrl = jsonObject.getString("happy"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + okUrl = jsonObject.getString("ok"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + sadUrl = jsonObject.getString("sad"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + sickUrl = jsonObject.getString("sick"); + } catch (JSONException e) { + e.printStackTrace(); + } + try { + eatingUrl = jsonObject.getString("eating"); + } catch (JSONException e) { + e.printStackTrace(); + } + + loadPets.add(new Gigapet(petId,species,description,happyUrl,okUrl,sadUrl,sickUrl,eatingUrl)); + } + GigapetRepo.addPetArr(loadPets); + } catch (JSONException e) { + e.printStackTrace(); + } - public static String getChildUrl() { - return Constants.CHILD_URL; + } + }).start(); } + public static Bitmap bitmapFromURL(String imageURl) { + Bitmap image = null; - public static void addGigapetToCurrentChild(int id, Gigapet gigapet) { + try { + URL url = new URL(imageURl); + image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + return image; } diff --git a/app/src/main/java/com/example/gigapet/GigapetMainActivity.java b/app/src/main/java/com/example/gigapet/GigapetMainActivity.java index bd616b0..caf22d0 100644 --- a/app/src/main/java/com/example/gigapet/GigapetMainActivity.java +++ b/app/src/main/java/com/example/gigapet/GigapetMainActivity.java @@ -1,12 +1,19 @@ package com.example.gigapet; import android.content.Intent; +import android.graphics.Bitmap; +import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.ImageView; +import android.widget.TextView; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; public class GigapetMainActivity extends AppCompatActivity { @@ -14,27 +21,21 @@ public class GigapetMainActivity extends AppCompatActivity { FoodIconAdapter listAdapter; RecyclerView recyclerView; ImageView sweetsView; - Parent parent; - Child child; + static ImageView gigapetImage; + static TextView gigapetName; + static TextView gigapetLvl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gigapet_main); sweetsView = findViewById(R.id.iv_unhealthy_food_icon); - -/* parent = new Parent(1, "token"); - child = new Child("Steve", 1, new Gigapet("Bob", 1)); - ChildDao.addChild(child); - ChildDao.setCurrentChildById(1); - child.addFood(1, 2); - child.addFood(3, 4); - child.addFood(5, 5); - ChildDao.addChild(child); - ChildDao.addChild(new Child("Sarah", 2));*/ + gigapetImage = findViewById(R.id.iv_gigapet); + gigapetLvl = findViewById(R.id.tv_gigapet_lvl); + gigapetName = findViewById(R.id.tv_gigapet_name); recyclerView = findViewById(R.id.food_icon_recycler_view); - listAdapter = new FoodIconAdapter(); + listAdapter = new FoodIconAdapter(this); final LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); recyclerView.setAdapter(listAdapter); recyclerView.setLayoutManager(layoutManager); @@ -43,8 +44,9 @@ protected void onCreate(Bundle savedInstanceState) { iv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + Intent intent = new Intent(getApplicationContext(), ParentMainActivity.class); - startActivity(intent); + startActivity(intent); } }); checkForSweets(); @@ -54,10 +56,17 @@ public void onClick(View v) { public void onClick(View v) { ChildDao.getCurrentChild().removeFood(Constants.FOOD_TYPE_SWEET, 1); checkForSweets(); + updateGigapet(); } }); + } - + @Override + protected void onResume() { + super.onResume(); + checkForSweets(); + updateGigapet(); + gigapetImage.setImageBitmap(Constants.CURRENT_PET_BITMAP); } private void checkForSweets(){ @@ -70,8 +79,40 @@ private void checkForSweets(){ } } - private void updateGigapet(){ + public static void updateGigapet() { + new loadGigapet().execute(); + gigapetImage.setImageBitmap(Constants.CURRENT_PET_BITMAP); + gigapetName.setText(ChildDao.getCurrentChild().gigapet.getName()); + gigapetLvl.setText("Lvl - " +String.valueOf(ChildDao.getCurrentChild().gigapet.getExp())); + } +} + + +final class loadGigapet extends AsyncTask{ + @Override + protected void onPreExecute() { + super.onPreExecute(); + } + + @Override + protected void onPostExecute(Bitmap bitmap) { + super.onPostExecute(bitmap); + Constants.CURRENT_PET_BITMAP = bitmap; + } + + @Override + protected void onProgressUpdate(Void... values) { + super.onProgressUpdate(values); + } + + @Override + protected Bitmap doInBackground(Void... voids) { + Bitmap result = GigapetDao.bitmapFromURL( + GigapetRepo.getMoodImage( + ChildDao.getCurrentChild().gigapet.getState(), + ChildDao.getCurrentChild().gigapet.getId())); + return result; } } diff --git a/app/src/main/java/com/example/gigapet/GigapetRepo.java b/app/src/main/java/com/example/gigapet/GigapetRepo.java new file mode 100644 index 0000000..0ae8484 --- /dev/null +++ b/app/src/main/java/com/example/gigapet/GigapetRepo.java @@ -0,0 +1,52 @@ +package com.example.gigapet; + +import java.util.ArrayList; + +public class GigapetRepo { + static ArrayList gigapets = new ArrayList<>(); + + public static ArrayList getGigapets() { + return gigapets; + } + + public static void addPetArr(ArrayList loadPets) { + gigapets.addAll(loadPets); + } + + public static Gigapet getPetById(int id) { + for (int i = 0; i < gigapets.size(); i++) { + if (gigapets.get(i).getId() == id) { + return gigapets.get(i); + } + } + return gigapets.get(0); + } + + public static String getMoodImage(int state, int id) { + switch (state) { + case 0: + ChildDao.getCurrentChild().getGigapet().addExp(); + return getPetById(id).getHappyImg(); + case 1: + ChildDao.getCurrentChild().getGigapet().addExp(); + return getPetById(id).getOkImg(); + case 2: + ChildDao.getCurrentChild().getGigapet().addExp(); + return getPetById(id).getSadImg(); + case 3: + ChildDao.getCurrentChild().getGigapet().addExp(); + return getPetById(id).getSickImg(); + case 4: + ChildDao.getCurrentChild().getGigapet().addExp(); + return getPetById(id).getEatingImg(); + } + + return getPetById(id).getHappyImg(); + } + + public void setGigapets(ArrayList newGigapets) { + gigapets = newGigapets; + } + + +} diff --git a/app/src/main/java/com/example/gigapet/LoginActivity.java b/app/src/main/java/com/example/gigapet/LoginActivity.java index 0f92808..2acdc61 100644 --- a/app/src/main/java/com/example/gigapet/LoginActivity.java +++ b/app/src/main/java/com/example/gigapet/LoginActivity.java @@ -69,6 +69,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // Set up the login form. + + Constants.setSharedPrefs(getApplicationContext()); + mEmailView = findViewById(R.id.email); populateAutoComplete(); @@ -87,6 +90,15 @@ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { } }); + Constants.setSharedPrefs(getApplicationContext()); + if(!Constants.prefs.getString("username","enterName").equals("enterName")){ + mUsernameView.setText(Constants.prefs.getString("username", "enterName")); + } + + if(!Constants.prefs.getString("password","enterPassword").equals("enterPassword")){ + mPasswordView.setText(Constants.prefs.getString("password", "enterPassword")); + } + final Button mEmailSignInButton = findViewById(R.id.email_sign_in_button); mEmailSignInButton.setOnClickListener(new OnClickListener() { @@ -103,6 +115,7 @@ public void onClick(View view) { mRegisterFinalizeButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { + attemptRegister(); } }); final Button mRegisterButton = findViewById(R.id.register_button); @@ -130,8 +143,10 @@ public void onClick(View v) { mRegisterFinalizeButton.setVisibility(View.VISIBLE); mEmailSignInButton.setVisibility(View.GONE); mBackToLogin.setVisibility(View.VISIBLE); + mUsernameView.setText(""); + mPasswordView.setText(""); + - // attemptRegister(); } }); @@ -397,12 +412,14 @@ public class UserLoginTask extends AsyncTask { private final String mPassword; private int id; private String token; + private String mJwt; UserLoginTask(String username, String password) { mUsername = username; mPassword = password; token = ""; id = -1; + mJwt = ""; } @Override @@ -414,7 +431,7 @@ protected Boolean doInBackground(Void... params) { "{\"username\":" + mUsername + ",\"password\":" + mPassword + "}"); - String response = NetworkAdapter.httpRequest(GigapetDao.getLoginUrl(), NetworkAdapter.POST, requestBody, getHeaders()); + String response = NetworkAdapter.httpRequest(Constants.LOGIN_URL, NetworkAdapter.POST, requestBody, getHeaders()); JSONObject jsonObject = new JSONObject(); if (jsonObject == null) { onBackPressed(); @@ -423,14 +440,24 @@ protected Boolean doInBackground(Void... params) { Thread.sleep(2000); token = jsonObject.getString("token"); id = jsonObject.getInt("id"); + // mJwt = jsonObject.getString("jwt"); if (token != "" && id != -1) { + + + Constants.editor.putString("token", token); + Constants.editor.putInt("parent_id", id); + Constants.editor.putString("password", mPassword); + Constants.editor.putString("username", mUsername); + // Constants.editor.putString("jwt", mJwt); + Constants.editor.commit(); + parent = new Parent(id, token); + Intent intent = new Intent(getApplicationContext(), GigapetMainActivity.class); startActivity(intent); } - parent = new Parent(id, token); } catch (JSONException e) { e.printStackTrace(); } catch (InterruptedException e) { @@ -441,11 +468,6 @@ protected Boolean doInBackground(Void... params) { return true; } - public Map getHeaders() { - Map headerParams = new HashMap(); - headerParams.put("Content-Type", "application/json"); - return headerParams; - } @Override protected void onPostExecute(final Boolean success) { @@ -460,6 +482,8 @@ protected void onPostExecute(final Boolean success) { } } + + @Override protected void onCancelled() { mAuthTask = null; @@ -467,6 +491,11 @@ protected void onCancelled() { } } + public Map getHeaders() { + Map headerParams = new HashMap(); + headerParams.put("Content-Type", "application/json"); + return headerParams; + } public class UserRegisterTask extends AsyncTask { private final String mEmail; @@ -487,28 +516,48 @@ public class UserRegisterTask extends AsyncTask { @Override protected Boolean doInBackground(Void... params) { + try { JSONObject requestBody = new JSONObject( - "{\"name\":" + mName - + ",\"email\":" + mEmail - + ",\"username\":" + mUsername - + ",\"password\":" + mPassword + "}"); + "{\"username\":" + mUsername + + ",\"password\":" + mPassword + + ",\"name\":" + mName + + ",\"email\":" + mEmail +"}"); - JSONObject jsonObject; - jsonObject = new JSONObject(NetworkAdapter.httpRequest(GigapetDao.getRegisterUrl(), NetworkAdapter.POST, requestBody)); + String response = NetworkAdapter.httpRequest(Constants.REGISTER_URL, NetworkAdapter.POST, requestBody, getHeaders()); + JSONObject jsonObject = new JSONObject(); if (jsonObject == null) { onBackPressed(); } + jsonObject = new JSONObject(response); Thread.sleep(2000); token = jsonObject.getString("token"); id = jsonObject.getInt("id"); + // mJwt = jsonObject.getString("jwt"); - } catch (InterruptedException e) { - return false; + if (token != "" && id != -1) { + + + Constants.editor.putString("token", token); + Constants.editor.putInt("parent_id", id); + Constants.editor.putString("password", mPassword); + Constants.editor.putString("username", mUsername); + // Constants.editor.putString("jwt", mJwt); + Constants.editor.commit(); + + parent = new Parent(id, token); + + Intent intent = new Intent(getApplicationContext(), GigapetMainActivity.class); + startActivity(intent); + } } catch (JSONException e) { e.printStackTrace(); + } catch (InterruptedException e) { + return false; } + + // TODO: register the new account here. return true; } @@ -532,4 +581,3 @@ protected void onCancelled() { } } } - diff --git a/app/src/main/java/com/example/gigapet/NetworkAdapter.java b/app/src/main/java/com/example/gigapet/NetworkAdapter.java index 7fffeb4..9df321b 100644 --- a/app/src/main/java/com/example/gigapet/NetworkAdapter.java +++ b/app/src/main/java/com/example/gigapet/NetworkAdapter.java @@ -15,8 +15,6 @@ import javax.net.ssl.HttpsURLConnection; -// S03M03-1 build and test firebase database -// S03M03-2 Add basic network adapter public class NetworkAdapter { public static final String GET = "GET"; public static final String POST = "POST"; @@ -29,6 +27,9 @@ public class NetworkAdapter { static String httpRequest(String urlString) { return httpRequest(urlString, GET, null, null); } + static String httpRequest(String urlString, String requestMethod, Map headerProperties) { + return httpRequest(urlString, requestMethod, null, headerProperties); + } static String httpRequest(String urlString, String requestMethod) { return httpRequest(urlString, requestMethod, null, null); @@ -55,9 +56,7 @@ static String httpRequest(String urlString, String requestMethod, JSONObject req } } - // S03M03-10 add support for different types of request if((requestMethod.equals(POST) || requestMethod.equals(PUT)) && requestBody != null) { - // S03M03-11 write body of post request connection.setDoInput(true); final OutputStream outputStream = connection.getOutputStream(); outputStream.write(requestBody.toString().getBytes()); @@ -67,7 +66,9 @@ static String httpRequest(String urlString, String requestMethod, JSONObject req } final int responseCode = connection.getResponseCode(); - if(responseCode != HttpsURLConnection.HTTP_OK){ + + + if(responseCode != HttpsURLConnection.HTTP_CREATED && responseCode != HttpsURLConnection.HTTP_OK){ return null; }else{ inputStream = connection.getInputStream(); diff --git a/app/src/main/java/com/example/gigapet/Parent.java b/app/src/main/java/com/example/gigapet/Parent.java index 0572a27..bcfc9fd 100644 --- a/app/src/main/java/com/example/gigapet/Parent.java +++ b/app/src/main/java/com/example/gigapet/Parent.java @@ -4,38 +4,29 @@ public class Parent { private static int id; + private static int mealIndex; private static String token; private static String name; - private static int currentChildIndex; - public static int getChildIndex() { - return currentChildIndex; + + public static int getMealIndex() { + return mealIndex; } - public static void setChildIndex(int childIndex) { - currentChildIndex = childIndex; + public static void setMealIndex(int mealIndex) { + Parent.mealIndex = mealIndex; } public Parent(int id, String token) { this.id = id; this.token = token; - //TODO: load children from database - ChildDao.addChild(new Child("SteveJr",1)); - currentChildIndex = 1; + this.mealIndex = 1; + loadChildren(); + GigapetDao.loadGigapets(); } - - - - public static String[] getChildrensNamesAsArray() { - - ArrayList children = ChildDao.getChildren(); - - String[] names = new String[children.size()]; - for(int i = 0; i < children.size(); i++){ - names[i] = children.get(i).getName(); - } - return names; + public static void loadChildren(){ + ChildDao.importChildrenFromDb(); } public static void setId(int newId) { @@ -46,9 +37,6 @@ public static int getId() { return id; } - public static String getToken() { - return token; - } public static String getName() { return name; @@ -58,4 +46,5 @@ public static void setName(String newName) { name = newName; } + } diff --git a/app/src/main/java/com/example/gigapet/ParentMainActivity.java b/app/src/main/java/com/example/gigapet/ParentMainActivity.java index 1d40c97..a50e551 100644 --- a/app/src/main/java/com/example/gigapet/ParentMainActivity.java +++ b/app/src/main/java/com/example/gigapet/ParentMainActivity.java @@ -1,6 +1,14 @@ package com.example.gigapet; +import android.content.Context; +import android.graphics.Color; +import android.os.Handler; +import android.os.Looper; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -16,35 +24,163 @@ import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; +import android.widget.Toast; import com.jjoe64.graphview.GraphView; +import com.jjoe64.graphview.helper.StaticLabelsFormatter; +import com.jjoe64.graphview.series.BarGraphSeries; import com.jjoe64.graphview.series.DataPoint; import com.jjoe64.graphview.series.LineGraphSeries; import org.json.JSONObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.zip.Inflater; -public class ParentMainActivity extends AppCompatActivity { +import lecho.lib.hellocharts.model.PieChartData; +import lecho.lib.hellocharts.model.SliceValue; +import lecho.lib.hellocharts.view.PieChartView; - private SectionsPagerAdapter mSectionsPagerAdapter; - private ViewPager mViewPager; - private static int spinnerChildCurrentSelection; - private static int spinnerMealTypeCurrentSelection; +public class ParentMainActivity extends AppCompatActivity { + static GraphView graphView; + static PieChartView pieChartView; + static int fragmentCounter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_parent_main); + fragmentCounter = 1; Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - mViewPager = (ViewPager) findViewById(R.id.container); - mViewPager.setAdapter(mSectionsPagerAdapter); + + Button foodButton = findViewById(R.id.food_config_button); + foodButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + loadAddFoodFragment(); + } + }); + + Button dailyHistoryButton = findViewById(R.id.daily_button); + dailyHistoryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + loadDailyFragment(); + } + }); + + Button monthlyHistoryButton = findViewById(R.id.monthly_button); + monthlyHistoryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + loadMonthlyFragment(); + } + }); + + Button weeklyHistoryButton = findViewById(R.id.weekly_button); + weeklyHistoryButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + loadWeeklyFragment(); + } + }); + + loadAddFoodFragment(); + + } + + public void loadWeeklyFragment() { + fragmentCounter = 3; + Bundle arguments = new Bundle(); + arguments.putString(WeeklyHistoryFragment.ARG_ITEM_ID, + getIntent().getStringExtra(WeeklyHistoryFragment.ARG_ITEM_ID)); + WeeklyHistoryFragment fragment = new WeeklyHistoryFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); + } + + public void loadMonthlyFragment() { + fragmentCounter = 4; + Bundle arguments = new Bundle(); + arguments.putString(MonthlyHistoryFragment.ARG_ITEM_ID, + getIntent().getStringExtra(MonthlyHistoryFragment.ARG_ITEM_ID)); + MonthlyHistoryFragment fragment = new MonthlyHistoryFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); + } + + public void loadDailyFragment() { + fragmentCounter = 2; + Bundle arguments = new Bundle(); + arguments.putString(DailyHistoryFragment.ARG_ITEM_ID, + getIntent().getStringExtra(DailyHistoryFragment.ARG_ITEM_ID)); + DailyHistoryFragment fragment = new DailyHistoryFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); + } + + public void loadAddFoodFragment() { + fragmentCounter = 1; + Bundle arguments = new Bundle(); + arguments.putString(AddFoodFragment.ARG_ITEM_ID, + getIntent().getStringExtra(AddFoodFragment.ARG_ITEM_ID)); + AddFoodFragment fragment = new AddFoodFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); + } + + public void loadSelectChildFragment() { + fragmentCounter = 5; + Bundle arguments = new Bundle(); + arguments.putString(SelectChildFragment.ARG_ITEM_ID, + getIntent().getStringExtra(SelectChildFragment.ARG_ITEM_ID)); + SelectChildFragment fragment = new SelectChildFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); + } + + public void loadRemoveChildFragment() { + fragmentCounter = 6; + Bundle arguments = new Bundle(); + arguments.putString(RemoveChildFragment.ARG_ITEM_ID, + getIntent().getStringExtra(RemoveChildFragment.ARG_ITEM_ID)); + RemoveChildFragment fragment = new RemoveChildFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); + } + + public void loadAddChildFragment() { + fragmentCounter = 7; + Bundle arguments = new Bundle(); + arguments.putString(AddChildFragment.ARG_ITEM_ID, + getIntent().getStringExtra(AddChildFragment.ARG_ITEM_ID)); + AddChildFragment fragment = new AddChildFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.container, fragment) + .commit(); } @Override @@ -56,245 +192,418 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.action_settings) { - return true; + switch (id) { + case R.id.action_select_child: + loadSelectChildFragment(); + break; + case R.id.action_add_child: + loadAddChildFragment(); + break; + case R.id.action_remove_child: + loadRemoveChildFragment(); + break; + case R.id.action_mealtype_all: + Parent.setMealIndex(Constants.MEAL_TYPE_ALL); + break; + case R.id.action_mealtype_breakfast: + Parent.setMealIndex(Constants.MEAL_TYPE_BREAKFAST); + break; + case R.id.action_mealtype_lunch: + Parent.setMealIndex(Constants.MEAL_TYPE_LUNCH); + break; + case R.id.action_mealtype_dinner: + Parent.setMealIndex(Constants.MEAL_TYPE_DINNER); + break; } return super.onOptionsItemSelected(item); } - public static class PlaceholderFragment extends Fragment { - static GraphView graphView; - private static final String ARG_SECTION_NUMBER = "section_number"; - public PlaceholderFragment() { - } - public static PlaceholderFragment newInstance(int sectionNumber) { - PlaceholderFragment fragment = new PlaceholderFragment(); - Bundle args = new Bundle(); - args.putInt(ARG_SECTION_NUMBER, sectionNumber); - fragment.setArguments(args); - return fragment; + public static void loadHistoryData() { + //TODO: pull in history data based on currentChildIndex + BarGraphSeries seriesSwith = new BarGraphSeries<>(); + List pieData = new ArrayList<>(); + StaticLabelsFormatter staticLabelsFormatter = new StaticLabelsFormatter(graphView); + + switch (fragmentCounter) { + case 2: + pieData = new ArrayList<>(); + pieData.add(new SliceValue(34, Color.RED)); + pieData.add(new SliceValue(34, Color.MAGENTA)); + pieData.add(new SliceValue(20, Color.YELLOW)); + pieData.add(new SliceValue(54, Color.GREEN)); + pieData.add(new SliceValue(54, Color.CYAN)); + pieData.add(new SliceValue(54, Color.BLUE)); + + seriesSwith = new BarGraphSeries<>(new DataPoint[]{ + new DataPoint(0, 2), + new DataPoint(1, 4), + new DataPoint(2, 3), + new DataPoint(3, 5), + new DataPoint(4, 2), + new DataPoint(5, 3), + new DataPoint(6, 2)}); + graphView.getViewport().setMaxX(7); + graphView.getViewport().setMinX(7); + staticLabelsFormatter.setHorizontalLabels(new String[]{ + "Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"}); + break; + case 3: + + pieData = new ArrayList<>(); + pieData.add(new SliceValue(35, Color.RED)); + pieData.add(new SliceValue(84, Color.MAGENTA)); + pieData.add(new SliceValue(20, Color.YELLOW)); + pieData.add(new SliceValue(24, Color.GREEN)); + pieData.add(new SliceValue(70, Color.CYAN)); + pieData.add(new SliceValue(14, Color.BLUE)); + + seriesSwith = new BarGraphSeries<>(new DataPoint[]{ + new DataPoint(0, 2), + new DataPoint(1, 4), + new DataPoint(2, 3), + new DataPoint(6, 2)}); + graphView.getViewport().setMaxX(4); + graphView.getViewport().setMinX(4); + staticLabelsFormatter.setHorizontalLabels(new String[]{ + "Week - 1", "Week - 2", "Week - 3", "Week - 4"}); + break; + case 4: + + pieData = new ArrayList<>(); + pieData.add(new SliceValue(37, Color.RED)); + pieData.add(new SliceValue(22, Color.MAGENTA)); + pieData.add(new SliceValue(60, Color.YELLOW)); + pieData.add(new SliceValue(24, Color.GREEN)); + pieData.add(new SliceValue(80, Color.CYAN)); + pieData.add(new SliceValue(14, Color.BLUE)); + + seriesSwith = new BarGraphSeries<>(new DataPoint[]{ + new DataPoint(0, 2), + new DataPoint(1, 4), + new DataPoint(2, 3), + new DataPoint(3, 5), + new DataPoint(4, 2), + new DataPoint(5, 3), + new DataPoint(6, 4), + new DataPoint(7, 3), + new DataPoint(8, 5), + new DataPoint(9, 2), + new DataPoint(10, 3), + new DataPoint(11, 2)}); + graphView.getViewport().setMaxX(12); + graphView.getViewport().setMinX(12); + staticLabelsFormatter.setHorizontalLabels(new String[]{ + "Jan", "Feb", "Mar", "Apr", "May", "June", + "July", "Aug", "Sep", "Oct", "Nov", "Dec"}); + break; + case 1: + break; } - public static void loadHistoryData(int mealPos, int childPos) { - //TODO: pull in history data based on currentChildIndex - JSONObject jsonObject = ChildDao.getFoodHistory(mealPos, childPos); - switch (mealPos) { - case 0: - break; - case 1: - break; - case 2: - break; - } - LineGraphSeries series1 = new LineGraphSeries<>(new DataPoint[]{ - new DataPoint(0,2), - new DataPoint(1,4), - new DataPoint(2,3), - new DataPoint(3,5), - new DataPoint(4,2), - new DataPoint(5,3), - new DataPoint(6,2) - }); - LineGraphSeries series2 = new LineGraphSeries<>(new DataPoint[]{ - new DataPoint(0,1), - new DataPoint(1,6), - new DataPoint(2,2), - new DataPoint(3,3), - new DataPoint(4,6), - new DataPoint(5,2), - new DataPoint(6,1) - }); - graphView.addSeries(series1); - graphView.addSeries(series2); - graphView.getViewport().setMaxX(6); - graphView.getViewport().setXAxisBoundsManual(true); - } + PieChartData pieChartData = new PieChartData(pieData); + pieChartView.setPieChartData(pieChartData); + seriesSwith.setAnimated(true); + graphView.addSeries(seriesSwith); + graphView.getGridLabelRenderer().setLabelFormatter(staticLabelsFormatter); - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView; - TextView textView; - if (getArguments().getInt(ARG_SECTION_NUMBER) != 1) { - rootView = inflater.inflate(R.layout.fragment_parent_history, container, false); - textView = rootView.findViewById(R.id.tv_history_time); - graphView = rootView.findViewById(R.id.gv_line_graph); + graphView.getViewport().setXAxisBoundsManual(true); + } - loadHistoryData(setMealSpinner(rootView).getSelectedItemPosition(), setChildSpinner(rootView).getSelectedItemPosition()); - - String fragmentTitle = "default"; - switch (getArguments().getInt(ARG_SECTION_NUMBER)) { - case 2: - fragmentTitle = "Daily"; - break; - case 3: - fragmentTitle = "Weekly"; - break; - case 4: - fragmentTitle = "Monthly"; - break; - } - textView.setText(fragmentTitle); - loadHistoryData(setMealSpinner(rootView).getSelectedItemPosition(), setChildSpinner(rootView).getSelectedItemPosition()); - } else { - rootView = inflater.inflate(R.layout.fragment_parent_food_config, container, false); + public static class AddFoodFragment extends Fragment implements View.OnClickListener { + public static final String ARG_ITEM_ID = "item_id"; + AddFoodListAdapter listAdapter; + RecyclerView recyclerView; + Button btnMealBreakfast; + Button btnMealLunch; + Button btnMealDinner; + Button btnSubmitFood; + Boolean foodGroupSelected = false; + + public AddFoodFragment() { + } + @Nullable + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - ImageView ivFruitPlus = rootView.findViewById(R.id.iv_button_fruit_plus); - ImageView ivFruitMinus = rootView.findViewById(R.id.iv_button_fruit_minus); - final TextView tvFruitNum = rootView.findViewById(R.id.tv_fruit); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_parent_food_config, container, false); + btnMealBreakfast = rootView.findViewById(R.id.meal_type_breakfast); + btnMealLunch = rootView.findViewById(R.id.meal_type_lunch); + btnMealDinner = rootView.findViewById(R.id.meal_type_dinner); + btnSubmitFood = rootView.findViewById(R.id.btn_submit_add_food); - int[] food = ChildDao.getCurrentChild().getAllFood(); - tvFruitNum.setText(String.valueOf(food[Constants.FOOD_TYPE_FRUIT])); + btnSubmitFood.setOnClickListener(this); + { - ivFruitPlus.setOnClickListener(new View.OnClickListener() { + btnMealBreakfast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - tvFruitNum.setText(String.valueOf(Integer.parseInt(tvFruitNum.getText().toString())+1)); + btnMealBreakfast.setBackgroundResource(R.drawable.breakfast_button_select); + btnMealLunch.setBackgroundResource(R.drawable.lunch_background); + btnMealDinner.setBackgroundResource(R.drawable.dinner_background); + Parent.setMealIndex(Constants.MEAL_TYPE_BREAKFAST); + foodGroupSelected = true; } }); - ivFruitMinus.setOnClickListener(new View.OnClickListener() { + btnMealLunch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if(Integer.parseInt(tvFruitNum.getText().toString()) > 0) { - tvFruitNum.setText(String.valueOf(Integer.parseInt(tvFruitNum.getText().toString()) - 1)); - } + btnMealBreakfast.setBackgroundResource(R.drawable.breakfast_button_background); + btnMealLunch.setBackgroundResource(R.drawable.lunch_background_selected); + btnMealDinner.setBackgroundResource(R.drawable.dinner_background); + Parent.setMealIndex(Constants.MEAL_TYPE_LUNCH); + foodGroupSelected = true; } }); + btnMealDinner.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + btnMealBreakfast.setBackgroundResource(R.drawable.breakfast_button_background); + btnMealLunch.setBackgroundResource(R.drawable.lunch_background); + btnMealDinner.setBackgroundResource(R.drawable.dinner_background_selected); + Parent.setMealIndex(Constants.MEAL_TYPE_DINNER); + foodGroupSelected = true; + } + }); + + graphView = rootView.findViewById(R.id.gv_line_graph); + recyclerView = rootView.findViewById(R.id.recycler_view_parent_add_food); + recyclerView.setHasFixedSize(true); + listAdapter = new AddFoodListAdapter(); + LinearLayoutManager layoutManager = new LinearLayoutManager(rootView.getContext()); + + recyclerView.setAdapter(listAdapter); + recyclerView.setLayoutManager(layoutManager); + return rootView; + } + } + + @Override + public void onClick(View v) { + new Thread(new Runnable() { + @Override + public void run() { + ChildDao.AddFood(Constants.ADD_FOOD_ARRAY); + Constants.ClearFoodArray(); + } + }).start(); + } + } + - ImageView ivVeggiePlus = rootView.findViewById(R.id.iv_button_veggie_plus); - ImageView ivVeggieMinus = rootView.findViewById(R.id.iv_button_veggie_minus); - TextView tvVeggieNum = rootView.findViewById(R.id.tv_veggie); + public static class DailyHistoryFragment extends Fragment { + public static final String ARG_ITEM_ID = "item_id"; + TextView tvCurrentChildName; + TextView tvMealType; + TextView tvTimeFrame; - ImageView ivCarbPlus = rootView.findViewById(R.id.iv_button_carb_plus); - ImageView ivCarbMinus = rootView.findViewById(R.id.iv_button_carb_minus); - TextView tvCarbNum = rootView.findViewById(R.id.tv_carb); + public DailyHistoryFragment() { + } - ImageView ivDairyPlus = rootView.findViewById(R.id.iv_button_dairy_plus); - ImageView ivDairyMinus = rootView.findViewById(R.id.iv_button_dairy_minus); - TextView tvDairyNum = rootView.findViewById(R.id.tv_dairy); + @Nullable + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } - ImageView ivProteinPlus = rootView.findViewById(R.id.iv_button_protein_plus); - ImageView ivProteinMinus = rootView.findViewById(R.id.iv_button_protein_minus); - TextView tvProteinNum = rootView.findViewById(R.id.tv_protein); + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_parent_history, container, false); + graphView = rootView.findViewById(R.id.gv_line_graph); + pieChartView = rootView.findViewById(R.id.pc_pie_chart); + tvCurrentChildName = rootView.findViewById(R.id.section_label); + tvMealType = rootView.findViewById(R.id.tv_meal_type); + tvTimeFrame = rootView.findViewById(R.id.tv_history_time); + tvCurrentChildName.setText(ChildDao.getCurrentChild().getName()); + tvMealType.setText(Constants.MEAL_TYPES[Parent.getMealIndex()]); + tvTimeFrame.setText("Daily"); + loadHistoryData(); - ImageView ivTreatPlus = rootView.findViewById(R.id.iv_button_treat_plus); - ImageView ivTreatMinus = rootView.findViewById(R.id.iv_button_treat_minus); - TextView tvTreatNum = rootView.findViewById(R.id.tv_treat); + return rootView; + } + } + public static class WeeklyHistoryFragment extends Fragment { + public static final String ARG_ITEM_ID = "item_id"; + TextView tvCurrentChildName; + TextView tvMealType; + TextView tvTimeFrame; + public WeeklyHistoryFragment() { + } - Spinner childSpinner = setChildSpinner(rootView); - Spinner mealSpinner = setMealSpinner(rootView); + @Nullable + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_parent_history, container, false); + graphView = rootView.findViewById(R.id.gv_line_graph); + pieChartView = rootView.findViewById(R.id.pc_pie_chart); + tvCurrentChildName = rootView.findViewById(R.id.section_label); + tvMealType = rootView.findViewById(R.id.tv_meal_type); + tvTimeFrame = rootView.findViewById(R.id.tv_history_time); + tvCurrentChildName.setText(ChildDao.getCurrentChild().getName()); + tvMealType.setText(Constants.MEAL_TYPES[Parent.getMealIndex()]); + tvTimeFrame.setText("Weekly"); + loadHistoryData(); - } return rootView; } + } + + public static class MonthlyHistoryFragment extends Fragment { + public static final String ARG_ITEM_ID = "item_id"; + TextView tvCurrentChildName; + TextView tvMealType; + TextView tvTimeFrame; - public void updateFoodCount(){ - int[] food = ChildDao.getCurrentChild().getAllFood(); - //tvFruitNum.setText(String.valueOf(food[Constants.FOOD_TYPE_FRUIT])); + public MonthlyHistoryFragment() { } - public Spinner setChildSpinner(final View root){ - final String[] namesArr = new String[Parent.getChildrensNamesAsArray().length + 1]; - for (int i = 0; i < Parent.getChildrensNamesAsArray().length; ++i) { - namesArr[i] = Parent.getChildrensNamesAsArray()[i]; - } - namesArr[Parent.getChildrensNamesAsArray().length] = "Add New Child"; - final ArrayAdapter spinnerChildArrayAdapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_spinner_item,namesArr); - spinnerChildArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - final Spinner spinner; - if(getArguments().getInt(ARG_SECTION_NUMBER) == 1){ - spinner = root.findViewById(R.id.spinner_child_select); - }else{spinner = root.findViewById(R.id.spinner_child_select_history);} + @Nullable + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } - spinner.setAdapter(spinnerChildArrayAdapter); + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_parent_history, container, false); + tvCurrentChildName = rootView.findViewById(R.id.section_label); + tvMealType = rootView.findViewById(R.id.tv_meal_type); + tvTimeFrame = rootView.findViewById(R.id.tv_history_time); + graphView = rootView.findViewById(R.id.gv_line_graph); + pieChartView = rootView.findViewById(R.id.pc_pie_chart); + + tvCurrentChildName.setText(ChildDao.getCurrentChild().getName()); + tvMealType.setText(Constants.MEAL_TYPES[Parent.getMealIndex()]); + tvTimeFrame.setText("Monthly"); + loadHistoryData(); - spinner.setSelection(spinnerChildCurrentSelection); + return rootView; + } + } - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - spinnerChildCurrentSelection = position; - if(position == namesArr.length-1){ - final EditText etChildName = root.findViewById(R.id.et_add_child); - final Button button = root.findViewById(R.id.button_add_child); - //TODO: null object reference - etChildName.setVisibility(View.VISIBLE); - button.setVisibility(View.VISIBLE); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - ChildDao.addChild(new Child(etChildName.getText().toString(), ChildDao.getHighestId()+1)); - Parent.setChildIndex(ChildDao.getHighestId()); - button.setVisibility(View.GONE); - etChildName.setVisibility(View.GONE); - setChildSpinner(root); - spinnerChildArrayAdapter.notifyDataSetChanged(); - } - }); - - }else {Parent.setChildIndex(position);} - } - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - return spinner; + public static class AddChildFragment extends Fragment { + public static final String ARG_ITEM_ID = "item_id"; + Button btnAddChild; + EditText etAddChild; + + public AddChildFragment() { } - public Spinner setMealSpinner(View root){ - final ArrayAdapter spinnerMealArrayAdapter = new ArrayAdapter<>(getContext(),android.R.layout.simple_spinner_item,Constants.MEAL_TYPES); - spinnerMealArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - final Spinner spinner; - if(getArguments().getInt(ARG_SECTION_NUMBER) == 1) { - spinner = root.findViewById(R.id.spinner_meal_type_food_config); - }else{spinner = root.findViewById(R.id.spinner_meal_type);} - spinner.setAdapter(spinnerMealArrayAdapter); - spinner.setSelection(spinnerMealTypeCurrentSelection); - - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - spinnerMealTypeCurrentSelection = position; - spinnerMealArrayAdapter.notifyDataSetChanged(); - } + @Nullable + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + final View rootView = inflater.inflate(R.layout.fragment_add_child, container, false); + btnAddChild = rootView.findViewById(R.id.button_add_child_fragment); + etAddChild = rootView.findViewById(R.id.et_add_child_fragment); + + btnAddChild.setOnClickListener(new View.OnClickListener() { @Override - public void onNothingSelected(AdapterView parent) { + public void onClick(View v) { + new Thread(new Runnable() { + @Override + public void run() { + ChildDao.addChild(new Child(etAddChild.getText().toString(), ChildDao.getHighestId() + 1)); + ChildDao.importChildrenFromDb(); + } + }).start(); + Toast.makeText(rootView.getContext(), etAddChild.getText().toString() + " Has Been Added", Toast.LENGTH_SHORT).show(); + etAddChild.setText(""); } }); - return spinner; + return rootView; } - } - public class SectionsPagerAdapter extends FragmentPagerAdapter { + public static class RemoveChildFragment extends Fragment { + public static final String ARG_ITEM_ID = "item_id"; + RemoveChildListAdapter listAdapter; + RecyclerView recyclerView; - public SectionsPagerAdapter(FragmentManager fm) { - super(fm); + public RemoveChildFragment() { } + @Nullable @Override - public Fragment getItem(int position) { - return PlaceholderFragment.newInstance(position + 1); + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); } + @Nullable @Override - public int getCount() { - return 4; + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_remove_child, container, false); + recyclerView = rootView.findViewById(R.id.recycler_view_remove_child); + recyclerView.setHasFixedSize(true); + listAdapter = new RemoveChildListAdapter(); + LinearLayoutManager layoutManager = new LinearLayoutManager(rootView.getContext()); + + recyclerView.setAdapter(listAdapter); + recyclerView.setLayoutManager(layoutManager); + return rootView; } } + public static class SelectChildFragment extends Fragment { + + public static final String ARG_ITEM_ID = "item_id"; + SelectChildListAdapter listAdapter; + RecyclerView recyclerView; + + public SelectChildFragment() { + } + + @Nullable + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_select_child, container, false); + recyclerView = rootView.findViewById(R.id.recycler_view_select_child); + recyclerView.setHasFixedSize(true); + listAdapter = new SelectChildListAdapter(); + LinearLayoutManager layoutManager = new LinearLayoutManager(rootView.getContext()); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(listAdapter); + + return rootView; + } + } } + diff --git a/app/src/main/java/com/example/gigapet/RemoveChildListAdapter.java b/app/src/main/java/com/example/gigapet/RemoveChildListAdapter.java new file mode 100644 index 0000000..6441e46 --- /dev/null +++ b/app/src/main/java/com/example/gigapet/RemoveChildListAdapter.java @@ -0,0 +1,65 @@ +package com.example.gigapet; + +import android.support.annotation.NonNull; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +public class RemoveChildListAdapter extends RecyclerView.Adapter { + String[] childrenNames = ChildDao.getChildrenNames(); + + public RemoveChildListAdapter() { + + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_name_list, parent, false); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) { + childrenNames = ChildDao.getChildrenNames(); + viewHolder.tvName.setText(childrenNames[i]); + final int pos = i; + viewHolder.vParentView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + new Thread(new Runnable() { + @Override + public void run() { + ChildDao.removeChild(ChildDao.getChildren().get(pos).getId()); + ChildDao.importChildrenFromDb(); + } + + }).start(); + + notifyDataSetChanged(); + return true; + } + }); + + } + + @Override + public int getItemCount() { + return ChildDao.getChildren().size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + TextView tvName; + View vParentView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvName = itemView.findViewById(R.id.child_name_recycler); + vParentView = itemView.findViewById(R.id.child_list_item_view); + } + } +} diff --git a/app/src/main/java/com/example/gigapet/SelectChildListAdapter.java b/app/src/main/java/com/example/gigapet/SelectChildListAdapter.java new file mode 100644 index 0000000..c4ffa77 --- /dev/null +++ b/app/src/main/java/com/example/gigapet/SelectChildListAdapter.java @@ -0,0 +1,54 @@ +package com.example.gigapet; + +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +public class SelectChildListAdapter extends RecyclerView.Adapter { + String[] childrenNames = ChildDao.getChildrenNames(); + + public SelectChildListAdapter(){ + + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_name_list, parent, false); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int i) { + childrenNames = ChildDao.getChildrenNames(); + viewHolder.tvName.setText(childrenNames[i]); + final int pos = i; + viewHolder.vParentView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ChildDao.setCurrentChildId(ChildDao.getChildren().get(i).getId()); + notifyDataSetChanged(); + } + }); + + } + + @Override + public int getItemCount() { + return ChildDao.getChildren().size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder { + TextView tvName; + View vParentView; + + public ViewHolder(@NonNull View itemView) { + super(itemView); + tvName = itemView.findViewById(R.id.child_name_recycler); + vParentView = itemView.findViewById(R.id.child_list_item_view); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/item_anim_slide_up.xml b/app/src/main/res/anim/item_anim_slide_up.xml new file mode 100644 index 0000000..9d0ee12 --- /dev/null +++ b/app/src/main/res/anim/item_anim_slide_up.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/layout_anim.xml b/app/src/main/res/anim/layout_anim.xml new file mode 100644 index 0000000..c6e2e10 --- /dev/null +++ b/app/src/main/res/anim/layout_anim.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/add_food.png b/app/src/main/res/drawable/add_food.png new file mode 100644 index 0000000..1aa9877 Binary files /dev/null and b/app/src/main/res/drawable/add_food.png differ diff --git a/app/src/main/res/drawable/add_food_selected.png b/app/src/main/res/drawable/add_food_selected.png new file mode 100644 index 0000000..1ac1184 Binary files /dev/null and b/app/src/main/res/drawable/add_food_selected.png differ diff --git a/app/src/main/res/drawable/breakfast_button_background.png b/app/src/main/res/drawable/breakfast_button_background.png new file mode 100644 index 0000000..250d254 Binary files /dev/null and b/app/src/main/res/drawable/breakfast_button_background.png differ diff --git a/app/src/main/res/drawable/breakfast_button_reg.png b/app/src/main/res/drawable/breakfast_button_reg.png new file mode 100644 index 0000000..6c99fb1 Binary files /dev/null and b/app/src/main/res/drawable/breakfast_button_reg.png differ diff --git a/app/src/main/res/drawable/breakfast_button_select.png b/app/src/main/res/drawable/breakfast_button_select.png new file mode 100644 index 0000000..16fd89d Binary files /dev/null and b/app/src/main/res/drawable/breakfast_button_select.png differ diff --git a/app/src/main/res/drawable/confirm_button_background.png b/app/src/main/res/drawable/confirm_button_background.png new file mode 100644 index 0000000..411d55a Binary files /dev/null and b/app/src/main/res/drawable/confirm_button_background.png differ diff --git a/app/src/main/res/drawable/daily_background.png b/app/src/main/res/drawable/daily_background.png new file mode 100644 index 0000000..0f3a123 Binary files /dev/null and b/app/src/main/res/drawable/daily_background.png differ diff --git a/app/src/main/res/drawable/daily_background_selected.png b/app/src/main/res/drawable/daily_background_selected.png new file mode 100644 index 0000000..f99af4a Binary files /dev/null and b/app/src/main/res/drawable/daily_background_selected.png differ diff --git a/app/src/main/res/drawable/dinner_background.png b/app/src/main/res/drawable/dinner_background.png new file mode 100644 index 0000000..01110e5 Binary files /dev/null and b/app/src/main/res/drawable/dinner_background.png differ diff --git a/app/src/main/res/drawable/dinner_background_selected.png b/app/src/main/res/drawable/dinner_background_selected.png new file mode 100644 index 0000000..28d8e7f Binary files /dev/null and b/app/src/main/res/drawable/dinner_background_selected.png differ diff --git a/app/src/main/res/drawable/game_view_background.png b/app/src/main/res/drawable/game_view_background.png new file mode 100644 index 0000000..6d18315 Binary files /dev/null and b/app/src/main/res/drawable/game_view_background.png differ diff --git a/app/src/main/res/drawable/go_back_button_background.png b/app/src/main/res/drawable/go_back_button_background.png new file mode 100644 index 0000000..d1abe57 Binary files /dev/null and b/app/src/main/res/drawable/go_back_button_background.png differ diff --git a/app/src/main/res/drawable/login_background.png b/app/src/main/res/drawable/login_background.png new file mode 100644 index 0000000..c06e5da Binary files /dev/null and b/app/src/main/res/drawable/login_background.png differ diff --git a/app/src/main/res/drawable/login_button_background.png b/app/src/main/res/drawable/login_button_background.png new file mode 100644 index 0000000..806f2bf Binary files /dev/null and b/app/src/main/res/drawable/login_button_background.png differ diff --git a/app/src/main/res/drawable/lunch_background.png b/app/src/main/res/drawable/lunch_background.png new file mode 100644 index 0000000..90f89d5 Binary files /dev/null and b/app/src/main/res/drawable/lunch_background.png differ diff --git a/app/src/main/res/drawable/lunch_background_selected.png b/app/src/main/res/drawable/lunch_background_selected.png new file mode 100644 index 0000000..8979923 Binary files /dev/null and b/app/src/main/res/drawable/lunch_background_selected.png differ diff --git a/app/src/main/res/drawable/main_background.png b/app/src/main/res/drawable/main_background.png new file mode 100644 index 0000000..cb2e677 Binary files /dev/null and b/app/src/main/res/drawable/main_background.png differ diff --git a/app/src/main/res/drawable/main_background2.png b/app/src/main/res/drawable/main_background2.png new file mode 100644 index 0000000..c59a8c3 Binary files /dev/null and b/app/src/main/res/drawable/main_background2.png differ diff --git a/app/src/main/res/drawable/monthly_background.png b/app/src/main/res/drawable/monthly_background.png new file mode 100644 index 0000000..02fcd1d Binary files /dev/null and b/app/src/main/res/drawable/monthly_background.png differ diff --git a/app/src/main/res/drawable/monthly_background_selected.png b/app/src/main/res/drawable/monthly_background_selected.png new file mode 100644 index 0000000..a442afd Binary files /dev/null and b/app/src/main/res/drawable/monthly_background_selected.png differ diff --git a/app/src/main/res/drawable/register_button_background.png b/app/src/main/res/drawable/register_button_background.png new file mode 100644 index 0000000..21209db Binary files /dev/null and b/app/src/main/res/drawable/register_button_background.png differ diff --git a/app/src/main/res/drawable/top_border.png b/app/src/main/res/drawable/top_border.png new file mode 100644 index 0000000..1a2374a Binary files /dev/null and b/app/src/main/res/drawable/top_border.png differ diff --git a/app/src/main/res/drawable/violet_happy.png b/app/src/main/res/drawable/violet_happy.png new file mode 100644 index 0000000..506c536 Binary files /dev/null and b/app/src/main/res/drawable/violet_happy.png differ diff --git a/app/src/main/res/drawable/weekly_background.png b/app/src/main/res/drawable/weekly_background.png new file mode 100644 index 0000000..38380ea Binary files /dev/null and b/app/src/main/res/drawable/weekly_background.png differ diff --git a/app/src/main/res/drawable/weekly_background_selected.png b/app/src/main/res/drawable/weekly_background_selected.png new file mode 100644 index 0000000..f3ee0f5 Binary files /dev/null and b/app/src/main/res/drawable/weekly_background_selected.png differ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index ed7612b..268bede 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -9,6 +9,7 @@ android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingBottom="@dimen/activity_vertical_margin" + android:background="@drawable/login_background" tools:context=".LoginActivity"> @@ -53,27 +54,29 @@ android:layout_height="wrap_content"> + android:layout_height="match_parent"> + android:background="#aaffffff" + android:layout_height="match_parent"> @@ -107,25 +111,28 @@ android:id="@+id/email_sign_in_button" style="?android:textAppearanceSmall" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:background="@drawable/login_button_background" + android:layout_height="50dp" + android:layout_marginLeft="50dp" + android:layout_marginRight="50dp" android:layout_marginTop="16dp" - android:text="@string/action_sign_in_short" android:textStyle="bold" />