From c8599cf019c307cdedd67d0405aa5f9ac1d47b37 Mon Sep 17 00:00:00 2001 From: Casey Davenport Date: Mon, 28 Mar 2016 21:55:22 -0700 Subject: [PATCH] New dry-yeasts, fix some ingredient activities. --- AndroidManifest.xml | 4 +- assets/Yeasts/dry-yeasts-01.xml | 248 ++++++++++++++++++ res/layout/row_layout_edit_text.xml | 2 +- .../AddCustomFermentableActivity.java | 2 +- .../AddCustomMiscActivity.java | 5 + .../AddEditIngredientActivity.java | 8 +- .../IngredientActivities/AddMiscActivity.java | 22 +- .../EditCustomHopActivity.java | 6 +- .../EditCustomMiscActivity.java | 17 +- .../EditMiscActivity.java | 6 +- .../brews/frontend/MainActivity.java | 27 ++ .../brews/frontend/SettingsActivity.java | 63 +---- .../brews/tasks/ImportNewIngredients.java | 69 +++++ .../brews/tasks/ImportXmlIngredientsTask.java | 1 + .../brews/tasks/ResetIngredients.java | 72 +++++ src/com/biermacht/brews/utils/Constants.java | 9 + .../brews/utils/IngredientHandler.java | 122 ++++----- .../biermacht/brews/xml/BeerXmlReader.java | 9 + 18 files changed, 541 insertions(+), 151 deletions(-) create mode 100644 assets/Yeasts/dry-yeasts-01.xml create mode 100644 src/com/biermacht/brews/tasks/ImportNewIngredients.java create mode 100644 src/com/biermacht/brews/tasks/ResetIngredients.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8d4c9e7..80c2a38 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="26" + android:versionName="1.3.1"> + + + Safale US-05 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + US-05 + 15.0000000 + 22.2222222 + Medium + 80.00000000 + Produces well-balanced beers with low diacetyl. + Ales + 5 + 0 + FALSE + 50.28 ml + 59.0 F + 72.0 F + 0.0 pkg + 3/6/2011 +
+ + + Safbrew T-58 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + T-58 + 15.0000000 + 23.8888889 + Low + 75.00000000 + Estery and somewhat peppery. + Belgian ales + FALSE + 59.0 F + 75.0 F +
+ + + Saflager W-34/70 + 1 + Lager +
Dry
+ 0.0502753 + FALSE + Fermentis + W-34/70 + 11.6666667 + 15.0000000 + High + 83.0000000 + Good balance of floral and fruity aromas with clean flavor. + German lagers + FALSE + 54.0 F + 59.0 F +
+ + + Saflager S-23 + 1 + Lager +
Dry
+ 0.0502753 + FALSE + Fermentis + S-23 + 12.0000000 + 15.0000000 + High + 82.0000000 + Produces fruity, estery notes. + Continental lagers + FALSE + 54.0 F + 59.0 F +
+ + + Safale S-04 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + S-04 + 15.0000000 + 20.0000000 + High + 75.0000000 + English ale yeast selected for fast fermentation. + English ales, cask ales. + FALSE + 59.0 F + 68.0 F +
+ + + Safbrew S-33 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + S-33 + 15.0000000 + 20.0000000 + Powdery + 70.0000000 + General purpose ale yeast with neutral flavor profiles. + Specialty ales and trappist styles. + FALSE + 59.0 F + 68.0 F +
+ + + Safbrew WB-06 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + WB-06 + 18.0000000 + 24.0000000 + Low + 86.0000000 + Subtle estery and phenol flavors - banana and clover. + Wheat beers. + FALSE + 64.0 F + 75.0 F +
+ + + Safbrew BE-256 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + BE-256 + 15.0000000 + 20.0000000 + High + 82.0000000 + Subtle, well-balanced aromas. Ferments fast. + High alcohol beers, abbey style beers. + FALSE + 59.0 F + 68.0 F +
+ + + Safale K-97 + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Fermentis + K-97 + 15.0000000 + 20.0000000 + High + 81.0000000 + Suitable for ales with low esters. + Belgian wheat beers, ales. + FALSE + 59.0 F + 68.0 F +
+ + + Saflager S-198 + 1 + Lager +
Dry
+ 0.0502753 + FALSE + Fermentis + S-198 + 10.000000 + 14.0000000 + High + 84.0000000 + Popular with commercial breweries - neutral flavor. + Wide rage of lagers, Pilsners. + FALSE + 50.0 F + 57.2 F +
+ + + Belle Saison + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Danstar + Belle Saison + 17.2222222 + 26.6666667 + Low + 92.0000000 + Belgian strain chosen for Saison beers. + Saison. + FALSE + 63.0 F + 80.0 F +
+ + + Nottingham + 1 + Ale +
Dry
+ 0.0502753 + FALSE + Danstar + Nottingham + 17.0000000 + 20.0000000 + High + 80.0000000 + Slightly estery, almost neutral. + British Ales. + FALSE + 62.6 F + 68.0 F +
+ +
diff --git a/res/layout/row_layout_edit_text.xml b/res/layout/row_layout_edit_text.xml index a337adb..b26ec6a 100644 --- a/res/layout/row_layout_edit_text.xml +++ b/res/layout/row_layout_edit_text.xml @@ -42,7 +42,7 @@ android:layout_marginRight="20dp" android:layout_marginLeft="20dp" android:layout_marginBottom="5dp" - android:text="Beer Style" + android:text="" android:background="@color/transparent"/> diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomFermentableActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomFermentableActivity.java index f55d815..271aad3 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomFermentableActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomFermentableActivity.java @@ -41,7 +41,7 @@ public void onCreate(Bundle savedInstanceState) { descriptionViewTitle.setText("Description"); // Set views - Log.d("AddCustomFermentableActivity::onCreate", "Initializing views"); + Log.d("AddCustomFerm", "Initializing views"); this.registerViews(Arrays.asList(descriptionView)); this.setViews(Arrays.asList(nameView, fermentableTypeSpinner, timeView, amountView, colorView, gravityView, descriptionView)); if (! haveRecipe()) { diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomMiscActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomMiscActivity.java index 97e6445..f524c23 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomMiscActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/AddCustomMiscActivity.java @@ -30,6 +30,11 @@ public void onCreate(Bundle savedInstanceState) { // Set initial values misc = new Misc("Custom misc"); setValues(misc); + + + // Units are configurable via the spinner - don't include the units + // in the amount title. + amountViewTitle.setText("Amount"); } @Override diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/AddEditIngredientActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/AddEditIngredientActivity.java index 424a4bb..3d7c6fd 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/AddEditIngredientActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/AddEditIngredientActivity.java @@ -4,6 +4,7 @@ import android.support.v7.app.AlertDialog; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.TextView; @@ -109,7 +110,12 @@ else if (i.getShortDescription().toLowerCase().contains(s.toString().toLowerCase } public void setInitialSearchableListSelection() { - // Set to second item (first is the "create new" placeholder) + if (filteredList.size() <= 1) { + // If there are no items in the list, we can't set an initial selection. + // If there is only a single item in the list, no need to set an initial selection. + Log.d("AddEditIngredientActivi", "filteredList size <= 1, do not set list selection"); + return; + } searchableListListener.onItemClick(null, null, 1, 1); } diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/AddMiscActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/AddMiscActivity.java index f64f6d0..1be6290 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/AddMiscActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/AddMiscActivity.java @@ -116,7 +116,7 @@ public void onCreate(Bundle savedInstanceState) { public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { units = unitsArray.get(position); - Log.d("AddMiscActivity::onItemSelected", "Misc units selected: " + units); + Log.d("AddMiscActivity", "Misc units selected: " + units); } public void onNothingSelected(AdapterView parentView) { @@ -129,7 +129,7 @@ public void onNothingSelected(AdapterView parentView) { public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { type = typeArray.get(position); - Log.d("AddMiscActivity::onItemSelected", "Misc type selected: " + type); + Log.d("AddMiscActivity", "Misc type selected: " + type); } public void onNothingSelected(AdapterView parentView) { @@ -141,17 +141,22 @@ public void onNothingSelected(AdapterView parentView) { useSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + // Can't do anything if the misc is null. + if (misc == null) { + Log.d("AddMiscActivity", "No misc available"); + return; + } + use = useArray.get(position); misc.setUse(use); - Log.d("AddMiscActivity::onItemSelected", "Misc use selected: " + use); + Log.d("AddMiscActivity", "Misc use selected: " + use); if (use.equals(Misc.USE_BOTTLING)) { timeView.setVisibility(View.GONE); } else { timeView.setVisibility(View.VISIBLE); - String units = misc.getTimeUnits(); - timeViewTitle.setText(use + " Time" + " (" + units + ")"); + timeViewTitle.setText(use + " Time" + " (" + misc.getTimeUnits() + ")"); } } @@ -180,13 +185,13 @@ public void onMissedClick(View v) { @Override public void getList() { // Get the list of ingredients to show - Log.d("AddMiscActivity::getList", "Getting miscs list"); + Log.d("AddMiscActivity", "Getting miscs list"); ingredientList = new ArrayList(); ingredientList.addAll(ingredientHandler.getMiscsList()); // Add a placeholder ingredient. When selected, allows user to create // a new custom ingredient. - Log.d("AddMiscActivity::getList", "Adding placeholder ingredient"); + Log.d("AddMiscActivity", "Adding placeholder ingredient"); PlaceholderIngredient i = new PlaceholderIngredient("Create new"); i.setShortDescription("Create a custom misc"); ingredientList.add(0, i); @@ -195,7 +200,7 @@ public void getList() { @Override public void createSpinner() { // Set up spinner - Log.d("AddMiscActivity::createSpinner", "Creating misc spinner"); + Log.d("AddMiscActivity", "Creating misc spinner"); adapter = new IngredientSpinnerAdapter(this, ingredientList, "Misc Selector", true); adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); spinnerView.setAdapter(adapter); @@ -237,6 +242,7 @@ public void onItemClick(AdapterView parentView, View selectedItemView, int po } public void setValues(Misc m) { + Log.d("AddMiscActivity", "Setting text view values from misc: " + misc.getName()); nameViewText.setText(m.getName()); searchableListViewText.setText(m.getName()); timeViewText.setText(String.format("%d", mRecipe.getBoilTime())); diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomHopActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomHopActivity.java index 2b6b5a6..801c4b4 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomHopActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomHopActivity.java @@ -24,21 +24,19 @@ public void onCreate(Bundle savedInstanceState) { } @Override - public void acquireValues() throws Exception { - super.acquireValues(); - } - public void setInitialSearchableListSelection() { // Don't set the searchable list selector. // Initial values are set based on the ingredient we are passed // through the intent. } + @Override public void onFinished() { DatabaseAPI.updateIngredient(hop, hop.getDatabaseId()); finish(); } + @Override public void onDeletePressed() { DatabaseAPI.deleteIngredientWithId(ingredientId, hop.getDatabaseId()); finish(); diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomMiscActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomMiscActivity.java index 3de187e..f3154a2 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomMiscActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/EditCustomMiscActivity.java @@ -1,6 +1,7 @@ package com.biermacht.brews.frontend.IngredientActivities; import android.os.Bundle; +import android.util.Log; import com.biermacht.brews.database.DatabaseAPI; @@ -17,28 +18,26 @@ public void onCreate(Bundle savedInstanceState) { mainView.removeView(timeView); // Set views we want visible - this.setViews(Arrays.asList(nameView, unitsSpinner, useSpinner, typeSpinner)); + this.setViews(Arrays.asList(nameView, + unitsSpinner, + useSpinner, + typeSpinner)); // Set values for the given misc. setValues(misc); } + @Override public void setInitialSearchableListSelection() { // Don't set the searchable list selector. // Initial values are set based on the ingredient passed // via the Intent. } - @Override - public void acquireValues() throws Exception { - super.acquireValues(); - misc.setShortDescription("Custom misc"); - misc.setUseFor("Custom"); - } - @Override public void onFinished() { - DatabaseAPI.updateIngredient(misc, misc.getDatabaseId()); + boolean update = DatabaseAPI.updateIngredient(misc, misc.getDatabaseId()); + Log.d("EditCustomMisc", "Misc updated? " + update); finish(); } diff --git a/src/com/biermacht/brews/frontend/IngredientActivities/EditMiscActivity.java b/src/com/biermacht/brews/frontend/IngredientActivities/EditMiscActivity.java index a0340cb..392d89b 100644 --- a/src/com/biermacht/brews/frontend/IngredientActivities/EditMiscActivity.java +++ b/src/com/biermacht/brews/frontend/IngredientActivities/EditMiscActivity.java @@ -41,15 +41,15 @@ public void getValuesFromIntent() { @Override public void getList() { super.getList(); - Log.d("EditMiscActivity::getList", "Getting miscs list"); + Log.d("EditMiscActivity", "Getting miscs list"); // Remove the placeholder ingredient - Log.d("EditMiscActivity::getList", "Removing placeholder ingredient"); + Log.d("EditMiscActivity", "Removing placeholder ingredient"); ingredientList.remove(0); // If this misc is not in the array, add it if (! ingredientList.contains(misc)) { - Log.d("EditMiscActivity::getList", "Adding custom misc to list: " + misc.getName()); + Log.d("EditMiscActivity", "Adding custom misc to list: " + misc.getName()); ingredientList.add(0, misc); } } diff --git a/src/com/biermacht/brews/frontend/MainActivity.java b/src/com/biermacht/brews/frontend/MainActivity.java index 36c5dc5..dcb0b5d 100644 --- a/src/com/biermacht/brews/frontend/MainActivity.java +++ b/src/com/biermacht/brews/frontend/MainActivity.java @@ -41,8 +41,10 @@ import com.biermacht.brews.frontend.fragments.StrikeWaterCalculatorFragment; import com.biermacht.brews.frontend.fragments.ViewStylesFragment; import com.biermacht.brews.recipe.Recipe; +import com.biermacht.brews.tasks.ImportNewIngredients; import com.biermacht.brews.tasks.ImportXmlIngredientsTask; import com.biermacht.brews.tasks.InitializeTask; +import com.biermacht.brews.tasks.ResetIngredients; import com.biermacht.brews.utils.Constants; import com.biermacht.brews.utils.DriveActivity; import com.biermacht.brews.utils.IngredientHandler; @@ -125,6 +127,7 @@ public void onCreate(Bundle savedInstanceState) { // This is the first time the app has been used. Mark that the app has been opened, and // perform first-time use setup task. preferences.edit().putBoolean(Constants.PREF_USED_BEFORE, true).commit(); + preferences.edit().putInt(Constants.PREF_NEW_INGRE_VERSION, Constants.NEW_INGREDIENTS_VERSION).commit(); new ImportXmlIngredientsTask(this).execute(""); // Create the master recipe - used as placeholder for stuff @@ -134,6 +137,30 @@ public void onCreate(Bundle savedInstanceState) { // Async Initialize Assets on startup. This loads styles and mash profiles for faster // access later. new InitializeTask(ingredientHandler).execute(""); + + // Check if we need to update the ingredients database with new entries. + // This occurs when new ingredients are added to the app. + int lastVersion = preferences.getInt(Constants.PREF_NEW_INGRE_VERSION, 0); + + Log.d("MainActivity", "Ingredients version, was: " + lastVersion + ", now: " + Constants.NEW_INGREDIENTS_VERSION); + while (lastVersion < Constants.NEW_INGREDIENTS_VERSION) { + // Increment the version. + lastVersion++; + + // Perform and actions for this version. + switch (lastVersion) { + case 1: + Log.d("MainActivity", "Importing new dry yeasts"); + new ImportNewIngredients(this, "Yeasts/dry-yeasts-01.xml").execute(""); + break; + default: + Log.w("MainActivity", "No action for version: " + lastVersion); + break; + } + } + + // Update shared preferences. + preferences.edit().putInt(Constants.PREF_NEW_INGRE_VERSION, Constants.NEW_INGREDIENTS_VERSION).commit(); } // Initialize storage for imported recipes diff --git a/src/com/biermacht/brews/frontend/SettingsActivity.java b/src/com/biermacht/brews/frontend/SettingsActivity.java index b5d3b94..2549b04 100644 --- a/src/com/biermacht/brews/frontend/SettingsActivity.java +++ b/src/com/biermacht/brews/frontend/SettingsActivity.java @@ -18,13 +18,12 @@ import com.biermacht.brews.database.DatabaseAPI; import com.biermacht.brews.frontend.IngredientActivities.AddEditActivity; import com.biermacht.brews.frontend.adapters.SpinnerAdapter; -import com.biermacht.brews.ingredient.Ingredient; import com.biermacht.brews.recipe.Recipe; +import com.biermacht.brews.tasks.ResetIngredients; import com.biermacht.brews.utils.Constants; import com.biermacht.brews.utils.Units; import com.biermacht.brews.xml.RecipeXmlWriter; -import java.io.IOException; import java.util.ArrayList; public class SettingsActivity extends AddEditActivity { @@ -51,7 +50,7 @@ public class SettingsActivity extends AddEditActivity { // Data storage public String unitSystem; - public Context appContext; + public Context context; @Override public void onCreate(Bundle savedInstanceState) { @@ -70,7 +69,7 @@ public void onCreate(Bundle savedInstanceState) { resetIngredientsView.setOnClickListener(onClickListener); // Store context for use in async tasks - appContext = this; + context = this; // Remove views we don't want mainView.removeView(spinnerView); @@ -280,7 +279,7 @@ protected void onPostExecute(String result) { @Override protected void onPreExecute() { super.onPreExecute(); - progress = new ProgressDialog(appContext); + progress = new ProgressDialog(context); progress.setMessage("Exporting all recipes..."); progress.setIndeterminate(false); progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); @@ -316,7 +315,7 @@ protected void onPostExecute(String result) { @Override protected void onPreExecute() { super.onPreExecute(); - progress = new ProgressDialog(appContext); + progress = new ProgressDialog(context); progress.setMessage("Deleting all recipes..."); progress.setIndeterminate(false); progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); @@ -336,59 +335,13 @@ private AlertDialog.Builder resetIngredients() { .setPositiveButton(R.string.reset, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { - new ResetIngredients().execute(""); + new ResetIngredients(context, + "Resetting ingredient database...") + .execute(""); } }) .setNegativeButton(R.string.cancel, null); } - - /** - * Async task to reset the default ingredient database. - */ - private class ResetIngredients extends AsyncTask { - - private ProgressDialog progress; - - @Override - protected String doInBackground(String... params) { - Log.d("ResetIngredients", "Deleting all 'permanent' ingredients"); - for (Ingredient ing : DatabaseAPI.getIngredients(Constants.DATABASE_PERMANENT)) { - DatabaseAPI.deleteIngredientWithId(ing.getId(), ing.getDatabaseId()); - } - - Log.d("ResetIngredients", "Re-initializing ingredient assets"); - try { - ingredientHandler.importIngredients(); - } catch (IOException e) { - Log.e("ResetIngredients", e.toString()); - } - - return "Executed"; - } - - @Override - protected void onPostExecute(String result) { - super.onPostExecute(result); - progress.dismiss(); - Log.d("ResetIngredients", "Finished exporting recipes"); - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - progress = new ProgressDialog(appContext); - progress.setMessage("Resetting ingredient database..."); - progress.setIndeterminate(false); - progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); - progress.setCancelable(false); - progress.show(); - } - - @Override - protected void onProgressUpdate(Void... values) { - } - } - } diff --git a/src/com/biermacht/brews/tasks/ImportNewIngredients.java b/src/com/biermacht/brews/tasks/ImportNewIngredients.java new file mode 100644 index 0000000..ec8503f --- /dev/null +++ b/src/com/biermacht/brews/tasks/ImportNewIngredients.java @@ -0,0 +1,69 @@ +package com.biermacht.brews.tasks; + +import android.app.ProgressDialog; +import android.content.Context; +import android.os.AsyncTask; +import android.util.Log; + +import com.biermacht.brews.database.DatabaseAPI; +import com.biermacht.brews.ingredient.Ingredient; +import com.biermacht.brews.utils.Constants; +import com.biermacht.brews.utils.IngredientHandler; + +import java.io.IOException; + +/** + * Async task to reset the default ingredient database. + */ +public class ImportNewIngredients extends AsyncTask { + + private ProgressDialog progress; + private Context context; + private IngredientHandler ingredientHandler; + private String message; + private String filePath; + + public ImportNewIngredients(Context c, String filePath) { + super(); + + this.context = c; + this.ingredientHandler = new IngredientHandler(c); + this.message = "Importing new ingredients"; + this.filePath = filePath; + } + + @Override + protected String doInBackground(String... params) { + Log.d("ResetIngredients", "Installing ingredients from: " + filePath); + try { + // Imports ingredients from the file path. + ingredientHandler.importIngredients(filePath); + } catch (IOException e) { + Log.e("ResetIngredients", e.toString()); + } + + return "Executed"; + } + + @Override + protected void onPostExecute(String result) { + super.onPostExecute(result); + progress.dismiss(); + Log.d("ResetIngredients", "Finished resetting ingredients"); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + progress = new ProgressDialog(this.context); + progress.setMessage(this.message); + progress.setIndeterminate(false); + progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progress.setCancelable(false); + progress.show(); + } + + @Override + protected void onProgressUpdate(Void... values) { + } +} \ No newline at end of file diff --git a/src/com/biermacht/brews/tasks/ImportXmlIngredientsTask.java b/src/com/biermacht/brews/tasks/ImportXmlIngredientsTask.java index b6a6f61..1cf320d 100644 --- a/src/com/biermacht/brews/tasks/ImportXmlIngredientsTask.java +++ b/src/com/biermacht/brews/tasks/ImportXmlIngredientsTask.java @@ -11,6 +11,7 @@ public class ImportXmlIngredientsTask extends AsyncTask { private Context context; private ProgressDialog progress; + private String message; public ImportXmlIngredientsTask(Context c) { super(); diff --git a/src/com/biermacht/brews/tasks/ResetIngredients.java b/src/com/biermacht/brews/tasks/ResetIngredients.java new file mode 100644 index 0000000..79bce28 --- /dev/null +++ b/src/com/biermacht/brews/tasks/ResetIngredients.java @@ -0,0 +1,72 @@ +package com.biermacht.brews.tasks; + +import android.app.ProgressDialog; +import android.content.Context; +import android.os.AsyncTask; +import android.util.Log; + +import com.biermacht.brews.database.DatabaseAPI; +import com.biermacht.brews.frontend.MainActivity; +import com.biermacht.brews.ingredient.Ingredient; +import com.biermacht.brews.utils.Constants; +import com.biermacht.brews.utils.IngredientHandler; + +import java.io.IOException; + +/** + * Async task to reset the default ingredient database. + */ +public class ResetIngredients extends AsyncTask { + + private ProgressDialog progress; + private Context context; + private IngredientHandler ingredientHandler; + private String message; + + public ResetIngredients(Context c, String message) { + super(); + + this.context = c; + this.ingredientHandler = new IngredientHandler(c); + this.message = message; + } + + @Override + protected String doInBackground(String... params) { + Log.d("ResetIngredients", "Deleting all 'permanent' ingredients"); + for (Ingredient ing : DatabaseAPI.getIngredients(Constants.DATABASE_PERMANENT)) { + DatabaseAPI.deleteIngredientWithId(ing.getId(), ing.getDatabaseId()); + } + + Log.d("ResetIngredients", "Re-initializing ingredient assets"); + try { + ingredientHandler.importIngredients(); + } catch (IOException e) { + Log.e("ResetIngredients", e.toString()); + } + + return "Executed"; + } + + @Override + protected void onPostExecute(String result) { + super.onPostExecute(result); + progress.dismiss(); + Log.d("ResetIngredients", "Finished resetting ingredients"); + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + progress = new ProgressDialog(this.context); + progress.setMessage(this.message); + progress.setIndeterminate(false); + progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); + progress.setCancelable(false); + progress.show(); + } + + @Override + protected void onProgressUpdate(Void... values) { + } +} \ No newline at end of file diff --git a/src/com/biermacht/brews/utils/Constants.java b/src/com/biermacht/brews/utils/Constants.java index eeb0e8e..af3b46c 100644 --- a/src/com/biermacht/brews/utils/Constants.java +++ b/src/com/biermacht/brews/utils/Constants.java @@ -6,8 +6,11 @@ import com.biermacht.brews.recipe.MashProfile; import com.biermacht.brews.recipe.MashStep; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; public class Constants { @@ -73,6 +76,12 @@ public class Constants { public static final String PREF_MEAS_SYSTEM = "com.biermacht.brews.measurementSystem"; public static final String PREF_FIXED_RATIOS = "com.biermacht.brews.waterToGrainRatiosFixed"; + // Value of this preference indicates the last time ingredients were updated. + public static final String PREF_NEW_INGRE_VERSION = "com.biermacht.brews.newIngredientsVersion"; + + // Incremented when new ingredients are available. + public static int NEW_INGREDIENTS_VERSION = 1; + // Activity for result return codes public static final int RESULT_DELETED = 1; public static final int RESULT_OK = 2; diff --git a/src/com/biermacht/brews/utils/IngredientHandler.java b/src/com/biermacht/brews/utils/IngredientHandler.java index 1b83ddc..62d4e56 100644 --- a/src/com/biermacht/brews/utils/IngredientHandler.java +++ b/src/com/biermacht/brews/utils/IngredientHandler.java @@ -73,6 +73,12 @@ public void importIngredients() throws IOException { Constants.OWNER_NONE); } + public void importIngredients(String filePath) throws IOException { + DatabaseAPI.addIngredientList(Constants.DATABASE_PERMANENT, + getIngredientsFromXml(filePath), + Constants.OWNER_NONE); + } + /** * Returns a list of valid fermentables for use in recipes * @@ -202,21 +208,9 @@ public ArrayList getMashProfileList() { */ private ArrayList getFermentablesFromXml() throws IOException { ArrayList list = new ArrayList(); - BeerXmlReader myXMLHandler = new BeerXmlReader(); - SAXParserFactory spf = SAXParserFactory.newInstance(); - AssetManager am = mContext.getAssets(); - for (String s : am.list("Fermentables")) { - try { - SAXParser sp = spf.newSAXParser(); - InputStream is = am.open("Fermentables/" + s); - sp.parse(is, myXMLHandler); - - list.addAll(myXMLHandler.getFermentables()); - Collections.sort(list, new RecipeIngredientsComparator()); - } catch (Exception e) { - Log.e("getFermentablesFromXml", e.toString()); - } + for (String s : mContext.getAssets().list("Fermentables")) { + list.addAll(getIngredientsFromXml("Fermentables/" + s)); } return list; @@ -230,21 +224,9 @@ private ArrayList getFermentablesFromXml() throws IOException { */ private ArrayList getYeastsFromXml() throws IOException { ArrayList list = new ArrayList(); - BeerXmlReader myXMLHandler = new BeerXmlReader(); - SAXParserFactory spf = SAXParserFactory.newInstance(); - AssetManager am = mContext.getAssets(); - for (String s : am.list("Yeasts")) { - try { - SAXParser sp = spf.newSAXParser(); - InputStream is = am.open("Yeasts/" + s); - sp.parse(is, myXMLHandler); - - list.addAll(myXMLHandler.getYeasts()); - Collections.sort(list, new RecipeIngredientsComparator()); - } catch (Exception e) { - Log.e("getYeastsFromXml", e.toString()); - } + for (String s : mContext.getAssets().list("Yeasts")) { + list.addAll(getIngredientsFromXml("Yeasts/" + s)); } return list; @@ -258,21 +240,9 @@ private ArrayList getYeastsFromXml() throws IOException { */ private ArrayList getHopsFromXml() throws IOException { ArrayList list = new ArrayList(); - BeerXmlReader myXMLHandler = new BeerXmlReader(); - SAXParserFactory spf = SAXParserFactory.newInstance(); - AssetManager am = mContext.getAssets(); - for (String s : am.list("Hops")) { - try { - SAXParser sp = spf.newSAXParser(); - InputStream is = am.open("Hops/" + s); - sp.parse(is, myXMLHandler); - - list.addAll(myXMLHandler.getHops()); - Collections.sort(list, new RecipeIngredientsComparator()); - } catch (Exception e) { - Log.e("getHopsFromXml", e.toString()); - } + for (String s : mContext.getAssets().list("Hops")) { + list.addAll(getIngredientsFromXml("Hops/" + s)); } Log.d("IngredientHandler", "Got " + list.size() + " hops from XML"); @@ -280,58 +250,76 @@ private ArrayList getHopsFromXml() throws IOException { } /** - * Gets hops from XMl files in assets/Hops + * Gets Styles from XMl files in assets/Styles * - * @return ArrayList of Ingredient Objects + * @return ArrayList of BeerStyle Objects * @throws IOException */ private ArrayList getStylesFromXml() throws IOException { ArrayList list = new ArrayList(); + + for (String s : mContext.getAssets().list("Styles")) { + list.addAll(getStylesFromXml("Styles/" + s)); + } + + Collections.sort(list, new BeerStyleComparator()); + return list; + } + + private ArrayList getStylesFromXml(String filePath) throws IOException { + ArrayList list = new ArrayList(); BeerXmlReader myXMLHandler = new BeerXmlReader(); SAXParserFactory spf = SAXParserFactory.newInstance(); - AssetManager am = mContext.getAssets(); - for (String s : am.list("Styles")) { - try { - SAXParser sp = spf.newSAXParser(); - InputStream is = am.open("Styles/" + s); - sp.parse(is, myXMLHandler); + try { + SAXParser sp = spf.newSAXParser(); + InputStream is = mContext.getAssets().open(filePath); + sp.parse(is, myXMLHandler); - list.addAll(myXMLHandler.getBeerStyles()); - Collections.sort(list, new BeerStyleComparator()); - } catch (Exception e) { - Log.e("getStylesFromXml", e.toString()); - } + list.addAll(myXMLHandler.getBeerStyles()); + } catch (Exception e) { + Log.e("getStylesFromXml", e.toString()); } return list; } /** - * Gets miscs from XMl files in assets/Hops + * Gets Miscs from XMl files in assets/Miscs * * @return ArrayList of Ingredient Objects * @throws IOException */ private ArrayList getMiscsFromXml() throws IOException { ArrayList list = new ArrayList(); + + for (String s : mContext.getAssets().list("Miscs")) { + list.addAll(getIngredientsFromXml("Miscs/" + s)); + } + + Collections.sort(list, new RecipeIngredientsComparator()); + return list; + } + + private ArrayList getIngredientsFromXml(String filePath) throws IOException { + ArrayList list = new ArrayList(); BeerXmlReader myXMLHandler = new BeerXmlReader(); SAXParserFactory spf = SAXParserFactory.newInstance(); - AssetManager am = mContext.getAssets(); - for (String s : am.list("Miscs")) { - try { - SAXParser sp = spf.newSAXParser(); - InputStream is = am.open("Miscs/" + s); - sp.parse(is, myXMLHandler); + Log.d("IngredientHandler", "Importing ingredients from: " + filePath); - list.addAll(myXMLHandler.getMiscs()); - Collections.sort(list, new RecipeIngredientsComparator()); - } catch (Exception e) { - Log.e("getMiscsFromXml", e.toString()); - } + try { + SAXParser sp = spf.newSAXParser(); + InputStream is = mContext.getAssets().open(filePath); + sp.parse(is, myXMLHandler); + + list.addAll(myXMLHandler.getAllIngredients()); + } catch (Exception e) { + Log.e("IngredientHandler", e.toString()); } + Collections.sort(list, new RecipeIngredientsComparator()); + Log.d("IngredientHandler", filePath + " had " + list.size() + " ingredients"); return list; } diff --git a/src/com/biermacht/brews/xml/BeerXmlReader.java b/src/com/biermacht/brews/xml/BeerXmlReader.java index 7456833..e76119a 100644 --- a/src/com/biermacht/brews/xml/BeerXmlReader.java +++ b/src/com/biermacht/brews/xml/BeerXmlReader.java @@ -118,6 +118,15 @@ public ArrayList getMashSteps() { return mashStepList; } + public ArrayList getAllIngredients() { + ArrayList l = new ArrayList<>(); + l.addAll(this.fermList); + l.addAll(this.hopList); + l.addAll(this.yeastList); + l.addAll(this.getMiscs()); + return l; + } + /** * This gets called whenever we encounter a new start element. In this function we create the new * object to be populated and set the type of what we are looking at so we can properly parse the