diff --git a/app/build.gradle b/app/build.gradle
index 0d456190..acb8df70 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -26,9 +26,9 @@ configurations {
android {
compileSdkVersion 30
- buildToolsVersion '29.0.3'
+ buildToolsVersion '30.0.2'
- viewBinding.enabled = true
+ buildFeatures.viewBinding = true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@@ -39,8 +39,8 @@ android {
minSdkVersion 16
targetSdkVersion 30
vectorDrawables.useSupportLibrary = true
- versionCode 58
- versionName "19.1"
+ versionCode 61
+ versionName "20"
}
buildTypes {
debug {
@@ -66,17 +66,17 @@ android {
}
dependencies {
- implementation 'com.google.firebase:firebase-analytics:19.0.0'
- implementation 'com.google.firebase:firebase-crashlytics:18.0.0'
- implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'com.google.firebase:firebase-analytics:19.0.2'
+ implementation 'com.google.firebase:firebase-crashlytics:18.2.3'
+ implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.cardview:cardview:1.0.0'
- implementation 'com.google.android.material:material:1.3.0'
+ implementation 'com.google.android.material:material:1.4.0'
implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
implementation 'com.darwinsys:hirondelle-date4j:1.5.1'
implementation 'com.github.prolificinteractive:material-calendarview:2.0.1'
implementation('com.joanzapata.iconify:android-iconify-fontawesome:2.2.2') { exclude group: "com.android.support" }
implementation('com.github.PhilJay:MPAndroidChart:v2.2.5') { exclude group: "com.android.support" }
implementation('org.greenrobot:eventbus:3.2.0') { exclude group: "com.android.support" }
- implementation 'com.google.code.gson:gson:2.8.5'
+ implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.jakewharton.timber:timber:4.7.1'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0da73cbc..7d77201d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -73,7 +73,7 @@
android:screenOrientation="portrait"/>
@@ -103,16 +103,6 @@
android:value=".activity.MainActivity"/>
-
-
-
-
loadedMonths = new HashSet<>();
- private List fullServingsDates;
- private List partialServingsDates;
-
- @SuppressWarnings("unchecked")
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- binding = ActivityHistoryBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
-
- fullServingsDates = new ArrayList<>();
- partialServingsDates = new ArrayList<>();
- if (savedInstanceState != null) {
- fullServingsDates = (ArrayList) savedInstanceState.getSerializable(Args.DATES_WITH_FULL_SERVINGS);
- partialServingsDates = (ArrayList) savedInstanceState.getSerializable(Args.DATES_WITH_PARTIAL_SERVINGS);
- }
-
- displayFoodHistory();
- }
-
- private void displayFoodHistory() {
- final Food food = getFood();
- if (food != null) {
- initCalendar(food.getId(), food.getRecommendedAmount());
-
- displayEntriesForVisibleMonths(Calendar.getInstance(), food.getId());
- }
- }
-
- private void initCalendar(final long foodId, final int recommendedServings) {
- fullServingsDates = new ArrayList<>();
- partialServingsDates = new ArrayList<>();
-
- binding.calendarView.setOnDateChangedListener((widget, date, selected) -> {
- setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent(DateUtil.getCalendarForYearMonthAndDay(date.getYear(), date.getMonth(), date.getDay()).getTime()));
- finish();
- });
-
- binding.calendarView.setOnMonthChangedListener((widget, date) -> displayEntriesForVisibleMonths(DateUtil.getCalendarForYearAndMonth(date.getYear(), date.getMonth()), foodId));
-
- binding.calendarLegend.setVisibility(recommendedServings > 1 ? View.VISIBLE : View.GONE);
- }
-
- private void displayEntriesForVisibleMonths(final Calendar cal, final long foodId) {
- ExecutorService executor = Executors.newSingleThreadExecutor();
- Handler handler = new Handler(Looper.getMainLooper());
-
- executor.execute(() -> {
- ColorDrawable bgLessThanRecServings = new ColorDrawable(
- ContextCompat.getColor(FoodHistoryActivity.this, R.color.legend_less_than_recommended_servings));
-
- ColorDrawable bgRecServings = new ColorDrawable(
- ContextCompat.getColor(FoodHistoryActivity.this, R.color.legend_recommended_servings));
-
- // We start 2 months in the past because this prevents "flickering" of dates when the user swipes to
- // the previous month. For instance, starting in February and swiping to January, the dates from
- // December that are shown in the January calendar will have their backgrounds noticeably flicker on.
- DateUtil.subtractTwoMonths(cal);
-
- int i = 0;
- do {
- final String monthStr = DateUtil.toStringYYYYMM(cal);
-
- if (!loadedMonths.contains(monthStr)) {
- final Map servings = DDServings.getServingsOfFoodInYearAndMonth(foodId,
- DateUtil.getYear(cal), DateUtil.getMonthOneBased(cal));
-
- loadedMonths.add(monthStr);
-
- for (Map.Entry serving : servings.entrySet()) {
- if (serving.getValue()) {
- fullServingsDates.add(serving.getKey().getDateTime());
- } else {
- partialServingsDates.add(serving.getKey().getDateTime());
- }
- }
- }
-
- DateUtil.addOneMonth(cal);
- i++;
- } while (i < 3);
-
- handler.post(() -> {
- ArrayList decorators = new ArrayList<>();
- decorators.add(new CalendarHistoryDecorator(fullServingsDates, bgRecServings));
- decorators.add(new CalendarHistoryDecorator(partialServingsDates, bgLessThanRecServings));
- binding.calendarView.addDecorators(decorators);
- });
- });
- }
-}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/FoodInfoActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/FoodInfoActivity.java
index d490cb30..4da87604 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/FoodInfoActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/FoodInfoActivity.java
@@ -7,7 +7,6 @@
import android.view.View;
import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
import org.nutritionfacts.dailydozen.Common;
import org.nutritionfacts.dailydozen.R;
@@ -57,13 +56,11 @@ public boolean onCreateOptionsMenu(Menu menu) {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.food_info_videos:
- openVideosInBrowser();
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ if (item.getItemId() == R.id.food_info_videos) {
+ openVideosInBrowser();
+ return true;
}
+ return super.onOptionsItemSelected(item);
}
private void displayFoodInfo() {
@@ -85,10 +82,10 @@ private void initImage(String foodName) {
private void initServingTypes(final Food food) {
final List servingSizes = FoodInfo.getServingSizes(food.getIdName(),
Prefs.getInstance(this).getUnitTypePref());
- final FoodServingsAdapter adapter = new FoodServingsAdapter(servingSizes);
initChangeUnitsButton();
- initList(binding.foodServingSizes, adapter);
+ binding.foodServingSizes.setAdapter(new FoodServingsAdapter(servingSizes));
+ binding.foodServingSizes.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
}
private void initChangeUnitsButton() {
@@ -99,14 +96,9 @@ private void initChangeUnitsButton() {
private void initFoodTypes(String foodName) {
final List foods = FoodInfo.getTypesOfFood(foodName);
final List videos = FoodInfo.getFoodVideosLink(foodName);
- final RecyclerView.Adapter adapter = new FoodTypeAdapter(foods, videos);
- initList(binding.foodTypes, adapter);
- }
-
- private void initList(final RecyclerView list, final RecyclerView.Adapter adapter) {
- list.setAdapter(adapter);
- list.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
+ binding.foodTypes.setAdapter(new FoodTypeAdapter(foods, videos));
+ binding.foodTypes.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
}
private void openVideosInBrowser() {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakHistoryActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/HistoryActivity.java
similarity index 74%
rename from app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakHistoryActivity.java
rename to app/src/main/java/org/nutritionfacts/dailydozen/activity/HistoryActivity.java
index 8bc35b1f..1c185755 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakHistoryActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/HistoryActivity.java
@@ -14,8 +14,8 @@
import org.nutritionfacts.dailydozen.Common;
import org.nutritionfacts.dailydozen.R;
import org.nutritionfacts.dailydozen.databinding.ActivityHistoryBinding;
+import org.nutritionfacts.dailydozen.model.DDServings;
import org.nutritionfacts.dailydozen.model.Day;
-import org.nutritionfacts.dailydozen.model.Tweak;
import org.nutritionfacts.dailydozen.model.TweakServings;
import org.nutritionfacts.dailydozen.util.CalendarHistoryDecorator;
import org.nutritionfacts.dailydozen.util.DateUtil;
@@ -31,9 +31,11 @@
import hirondelle.date4j.DateTime;
-public class TweakHistoryActivity extends TweakLoadingActivity {
+public class HistoryActivity extends InfoActivity {
private ActivityHistoryBinding binding;
+ private boolean isFoodHistory = false;
+
private final Set loadedMonths = new HashSet<>();
private List fullServingsDates;
private List partialServingsDates;
@@ -52,42 +54,45 @@ protected void onCreate(Bundle savedInstanceState) {
partialServingsDates = (ArrayList) savedInstanceState.getSerializable(Args.DATES_WITH_PARTIAL_SERVINGS);
}
- displayTweakHistory();
+ displayHistory();
}
- private void displayTweakHistory() {
- final Tweak tweak = getTweak();
- if (tweak != null) {
- initCalendar(tweak.getId(), tweak.getRecommendedAmount());
-
- displayEntriesForVisibleMonths(Calendar.getInstance(), tweak.getId());
+ private void displayHistory() {
+ if (getFood() != null) {
+ isFoodHistory = true;
+ initCalendar(getFood().getId(), getFood().getRecommendedAmount());
+ displayEntriesForVisibleMonths(Calendar.getInstance(), getFood().getId());
+ } else if (getTweak() != null) {
+ isFoodHistory = false;
+ initCalendar(getTweak().getId(), getTweak().getRecommendedAmount());
+ displayEntriesForVisibleMonths(Calendar.getInstance(), getTweak().getId());
}
}
- private void initCalendar(final long tweakId, final int recommendedServings) {
+ private void initCalendar(final long id, final int recommendedServings) {
fullServingsDates = new ArrayList<>();
partialServingsDates = new ArrayList<>();
binding.calendarView.setOnDateChangedListener((widget, date, selected) -> {
- setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent(DateUtil.getCalendarForYearMonthAndDay(date.getYear(), date.getMonth(), date.getDay()).getTime()));
+ setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent(date.getYear(), date.getMonth(), date.getDay()));
finish();
});
- binding.calendarView.setOnMonthChangedListener((widget, date) -> displayEntriesForVisibleMonths(DateUtil.getCalendarForYearAndMonth(date.getYear(), date.getMonth()), tweakId));
+ binding.calendarView.setOnMonthChangedListener((widget, date) -> displayEntriesForVisibleMonths(DateUtil.getCalendarForYearAndMonth(date.getYear(), date.getMonth()), id));
binding.calendarLegend.setVisibility(recommendedServings > 1 ? View.VISIBLE : View.GONE);
}
- private void displayEntriesForVisibleMonths(final Calendar cal, final long tweakId) {
+ private void displayEntriesForVisibleMonths(final Calendar cal, final long id) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());
executor.execute(() -> {
ColorDrawable bgLessThanRecServings = new ColorDrawable(
- ContextCompat.getColor(TweakHistoryActivity.this, R.color.legend_less_than_recommended_servings));
+ ContextCompat.getColor(HistoryActivity.this, R.color.legend_less_than_recommended_servings));
ColorDrawable bgRecServings = new ColorDrawable(
- ContextCompat.getColor(TweakHistoryActivity.this, R.color.legend_recommended_servings));
+ ContextCompat.getColor(HistoryActivity.this, R.color.legend_recommended_servings));
// We start 2 months in the past because this prevents "flickering" of dates when the user swipes to
// the previous month. For instance, starting in February and swiping to January, the dates from
@@ -99,8 +104,13 @@ private void displayEntriesForVisibleMonths(final Calendar cal, final long tweak
final String monthStr = DateUtil.toStringYYYYMM(cal);
if (!loadedMonths.contains(monthStr)) {
- final Map servings = TweakServings.getServingsOfTweakInYearAndMonth(tweakId,
- DateUtil.getYear(cal), DateUtil.getMonthOneBased(cal));
+ Map servings;
+
+ if (isFoodHistory) {
+ servings = DDServings.getServingsOfFoodInYearAndMonth(id, DateUtil.getYear(cal), DateUtil.getMonthOneBased(cal));
+ } else {
+ servings = TweakServings.getServingsOfTweakInYearAndMonth(id, DateUtil.getYear(cal), DateUtil.getMonthOneBased(cal));
+ }
loadedMonths.add(monthStr);
@@ -117,7 +127,6 @@ private void displayEntriesForVisibleMonths(final Calendar cal, final long tweak
i++;
} while (i < 3);
-
handler.post(() -> {
ArrayList decorators = new ArrayList<>();
decorators.add(new CalendarHistoryDecorator(fullServingsDates, bgRecServings));
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/InfoActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/InfoActivity.java
index f1116d67..341e07e7 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/InfoActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/InfoActivity.java
@@ -8,7 +8,6 @@
import androidx.appcompat.app.AppCompatActivity;
import org.nutritionfacts.dailydozen.Args;
-import org.nutritionfacts.dailydozen.R;
import org.nutritionfacts.dailydozen.model.Food;
import org.nutritionfacts.dailydozen.model.Tweak;
@@ -46,13 +45,11 @@ private void initActionBar() {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
}
+ return super.onOptionsItemSelected(item);
}
private void loadFoodOrTweakFromIntent() {
@@ -65,7 +62,9 @@ private void loadFoodOrTweakFromIntent() {
}
tweak = Tweak.getById(intent.getLongExtra(Args.TWEAK_ID, -1));
- setTitle(R.string.about_tweak);
+ if (tweak != null) {
+ setTitle(tweak.getName());
+ }
}
}
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/MainActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/MainActivity.java
index fc3910cd..3bff1cf1 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/MainActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/MainActivity.java
@@ -22,8 +22,7 @@
import org.nutritionfacts.dailydozen.BuildConfig;
import org.nutritionfacts.dailydozen.Common;
import org.nutritionfacts.dailydozen.R;
-import org.nutritionfacts.dailydozen.adapter.DailyDozenPagerAdapter;
-import org.nutritionfacts.dailydozen.adapter.TweaksPagerAdapter;
+import org.nutritionfacts.dailydozen.adapter.DatePagerAdapter;
import org.nutritionfacts.dailydozen.controller.Bus;
import org.nutritionfacts.dailydozen.controller.PermissionController;
import org.nutritionfacts.dailydozen.controller.Prefs;
@@ -123,6 +122,8 @@ protected void onResume() {
// morning to enter data. The app crashed immediately.
// Solutions tried: datePagerAdapter.notifyDataSetChanged() did not work
if (daysSinceEpoch < Day.getNumDaysSinceEpoch()) {
+ // Reset user selection so today's date is selected
+ binding.datePager.setCurrentItem(0);
initDatePager();
}
@@ -140,7 +141,7 @@ protected void onPause() {
}
@Override
- protected void onSaveInstanceState(Bundle outState) {
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(ALREADY_HANDLED_RESTORE_INTENT, alreadyHandledRestoreIntent);
}
@@ -186,57 +187,56 @@ private void toggleTweaksMenuItemVisibility() {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_toggle_modes:
- inDailyDozenMode = !inDailyDozenMode;
- if (inDailyDozenMode) {
- setTitle(R.string.app_name);
- item.setTitle(R.string.twenty_one_tweaks);
- } else {
- setTitle(R.string.twenty_one_tweaks);
- item.setTitle(R.string.app_name);
- }
- initDatePager();
- return true;
- case R.id.menu_latest_videos:
- Common.openUrlInExternalBrowser(this, R.string.url_latest_videos);
- return true;
- case R.id.menu_how_not_to_die:
- Common.openUrlInExternalBrowser(this, R.string.url_how_not_to_die);
- return true;
- case R.id.menu_cookbook:
- Common.openUrlInExternalBrowser(this, R.string.url_cookbook);
- return true;
- case R.id.menu_how_not_to_diet:
- Common.openUrlInExternalBrowser(this, R.string.url_how_not_to_diet);
- return true;
- case R.id.menu_daily_dozen_challenge:
- Common.openUrlInExternalBrowser(this, R.string.url_daily_dozen_challenge);
- return true;
- case R.id.menu_donate:
- Common.openUrlInExternalBrowser(this, R.string.url_donate);
- return true;
- case R.id.menu_subscribe:
- Common.openUrlInExternalBrowser(this, R.string.url_subscribe);
- return true;
- case R.id.menu_open_source:
- Common.openUrlInExternalBrowser(this, R.string.url_open_source);
- return true;
- case R.id.menu_daily_reminder_settings:
- startActivity(new Intent(this, DailyReminderSettingsActivity.class));
- return true;
- case R.id.menu_backup:
- backup();
- return true;
- case R.id.menu_about:
- startActivity(new Intent(this, AboutActivity.class));
- return true;
- case R.id.menu_debug:
- startActivityForResult(new Intent(this, DebugActivity.class), Args.DEBUG_SETTINGS_REQUEST);
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ int itemId = item.getItemId();
+ if (itemId == R.id.menu_toggle_modes) {
+ inDailyDozenMode = !inDailyDozenMode;
+ if (inDailyDozenMode) {
+ setTitle(R.string.app_name);
+ item.setTitle(R.string.twenty_one_tweaks);
+ } else {
+ setTitle(R.string.twenty_one_tweaks);
+ item.setTitle(R.string.app_name);
+ }
+ initDatePager();
+ return true;
+ } else if (itemId == R.id.menu_latest_videos) {
+ Common.openUrlInExternalBrowser(this, R.string.url_latest_videos);
+ return true;
+ } else if (itemId == R.id.menu_how_not_to_die) {
+ Common.openUrlInExternalBrowser(this, R.string.url_how_not_to_die);
+ return true;
+ } else if (itemId == R.id.menu_cookbook) {
+ Common.openUrlInExternalBrowser(this, R.string.url_cookbook);
+ return true;
+ } else if (itemId == R.id.menu_how_not_to_diet) {
+ Common.openUrlInExternalBrowser(this, R.string.url_how_not_to_diet);
+ return true;
+ } else if (itemId == R.id.menu_daily_dozen_challenge) {
+ Common.openUrlInExternalBrowser(this, R.string.url_daily_dozen_challenge);
+ return true;
+ } else if (itemId == R.id.menu_donate) {
+ Common.openUrlInExternalBrowser(this, R.string.url_donate);
+ return true;
+ } else if (itemId == R.id.menu_subscribe) {
+ Common.openUrlInExternalBrowser(this, R.string.url_subscribe);
+ return true;
+ } else if (itemId == R.id.menu_open_source) {
+ Common.openUrlInExternalBrowser(this, R.string.url_open_source);
+ return true;
+ } else if (itemId == R.id.menu_daily_reminder_settings) {
+ startActivity(new Intent(this, DailyReminderSettingsActivity.class));
+ return true;
+ } else if (itemId == R.id.menu_backup) {
+ backup();
+ return true;
+ } else if (itemId == R.id.menu_about) {
+ startActivity(new Intent(this, AboutActivity.class));
+ return true;
+ } else if (itemId == R.id.menu_debug) {
+ startActivityForResult(new Intent(this, DebugActivity.class), Args.DEBUG_SETTINGS_REQUEST);
+ return true;
}
+ return super.onOptionsItemSelected(item);
}
@Override
@@ -257,17 +257,18 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
private void initDatePager() {
+ // Record user's current date selection (value is 0 when unset)
+ int origDate = binding.datePager.getCurrentItem();
+
final FragmentStatePagerAdapter pagerAdapter;
- if (inDailyDozenMode) {
- pagerAdapter = new DailyDozenPagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
- } else {
- pagerAdapter = new TweaksPagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
- }
+
+ pagerAdapter = new DatePagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, inDailyDozenMode);
+
binding.datePager.setAdapter(pagerAdapter);
daysSinceEpoch = pagerAdapter.getCount();
- // Go to today's date by default
- binding.datePager.setCurrentItem(pagerAdapter.getCount(), false);
+ // Maintain user's selected date when switching adapters
+ binding.datePager.setCurrentItem(origDate != 0 ? origDate : daysSinceEpoch, false);
}
private void initDatePagerIndicator() {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/ServingsHistoryActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/ServingsHistoryActivity.java
index d88f087b..a7de3a5a 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/ServingsHistoryActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/ServingsHistoryActivity.java
@@ -22,14 +22,13 @@
import org.nutritionfacts.dailydozen.event.TimeRangeSelectedEvent;
import org.nutritionfacts.dailydozen.event.TimeScaleSelectedEvent;
import org.nutritionfacts.dailydozen.model.Day;
+import org.nutritionfacts.dailydozen.model.enums.HistoryType;
import org.nutritionfacts.dailydozen.model.enums.TimeScale;
-import org.nutritionfacts.dailydozen.task.LoadServingsHistoryTask;
+import org.nutritionfacts.dailydozen.task.LoadHistoryTask;
import org.nutritionfacts.dailydozen.task.ProgressListener;
import org.nutritionfacts.dailydozen.task.TaskRunner;
import org.nutritionfacts.dailydozen.task.params.LoadHistoryTaskParams;
-import java.util.Date;
-
import timber.log.Timber;
public class ServingsHistoryActivity extends AppCompatActivity
@@ -82,10 +81,11 @@ private void loadData() {
alreadyLoadingData = true;
LoadHistoryTaskParams loadHistoryTaskParams = new LoadHistoryTaskParams(
+ HistoryType.FoodServings,
binding.dailyServingsHistoryTimeScale.getSelectedTimeScale(),
binding.dailyServingsHistoryTimeRange.getSelectedYear(),
binding.dailyServingsHistoryTimeRange.getSelectedMonth());
- new TaskRunner().executeAsync(new LoadServingsHistoryTask(this, this, loadHistoryTaskParams));
+ new TaskRunner().executeAsync(new LoadHistoryTask(this, this, loadHistoryTaskParams));
}
}
@@ -164,7 +164,10 @@ public void onNothingSelected(AdapterView> parent) {
@Override
public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
- setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent((Date) e.getData()));
+ setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent(
+ binding.dailyServingsHistoryTimeRange.getSelectedYear(),
+ binding.dailyServingsHistoryTimeRange.getSelectedMonth(),
+ e.getXIndex() + 1)); // convert x-index (0-based index) to days by adding 1
finish();
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakInfoActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakInfoActivity.java
index 0d783be0..46a09156 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakInfoActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakInfoActivity.java
@@ -4,6 +4,7 @@
import android.text.TextUtils;
import org.nutritionfacts.dailydozen.Common;
+import org.nutritionfacts.dailydozen.R;
import org.nutritionfacts.dailydozen.databinding.ActivityTweakInfoBinding;
import org.nutritionfacts.dailydozen.model.FoodInfo;
import org.nutritionfacts.dailydozen.model.Tweak;
@@ -30,6 +31,8 @@ protected void onCreate(Bundle savedInstanceState) {
}
private void displayTweakInfo() {
+ setTitle(R.string.about_tweak);
+
final Tweak tweak = getTweak();
if (tweak != null && !TextUtils.isEmpty(tweak.getName())) {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakLoadingActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakLoadingActivity.java
deleted file mode 100644
index c6adbba1..00000000
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakLoadingActivity.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.nutritionfacts.dailydozen.activity;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.view.MenuItem;
-
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
-
-import org.nutritionfacts.dailydozen.Args;
-import org.nutritionfacts.dailydozen.model.Tweak;
-
-public abstract class TweakLoadingActivity extends AppCompatActivity {
- private Tweak tweak;
-
- public Tweak getTweak() {
- return tweak;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- initActionBar();
-
- loadFoodFromIntent();
-
- if (tweak == null) {
- finish();
- }
- }
-
- private void initActionBar() {
- final ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setHomeButtonEnabled(true);
- }
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- private void loadFoodFromIntent() {
- final Intent intent = getIntent();
- if (intent != null) {
- tweak = Tweak.getById(intent.getLongExtra(Args.TWEAK_ID, -1));
-
- if (tweak != null) {
- setTitle(tweak.getName());
- }
- }
- }
-}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakServingsHistoryActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakServingsHistoryActivity.java
index 3c381d2e..5352b249 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakServingsHistoryActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/TweakServingsHistoryActivity.java
@@ -22,14 +22,13 @@
import org.nutritionfacts.dailydozen.event.TimeRangeSelectedEvent;
import org.nutritionfacts.dailydozen.event.TimeScaleSelectedEvent;
import org.nutritionfacts.dailydozen.model.Day;
+import org.nutritionfacts.dailydozen.model.enums.HistoryType;
import org.nutritionfacts.dailydozen.model.enums.TimeScale;
-import org.nutritionfacts.dailydozen.task.LoadTweakServingsHistoryTask;
+import org.nutritionfacts.dailydozen.task.LoadHistoryTask;
import org.nutritionfacts.dailydozen.task.ProgressListener;
import org.nutritionfacts.dailydozen.task.TaskRunner;
import org.nutritionfacts.dailydozen.task.params.LoadHistoryTaskParams;
-import java.util.Date;
-
import timber.log.Timber;
public class TweakServingsHistoryActivity extends AppCompatActivity
@@ -82,10 +81,11 @@ private void loadData() {
alreadyLoadingData = true;
LoadHistoryTaskParams loadHistoryTaskParams = new LoadHistoryTaskParams(
+ HistoryType.Tweaks,
binding.dailyServingsHistoryTimeScale.getSelectedTimeScale(),
binding.dailyServingsHistoryTimeRange.getSelectedYear(),
binding.dailyServingsHistoryTimeRange.getSelectedMonth());
- new TaskRunner().executeAsync(new LoadTweakServingsHistoryTask(this, this, loadHistoryTaskParams));
+ new TaskRunner().executeAsync(new LoadHistoryTask(this, this, loadHistoryTaskParams));
}
}
@@ -164,7 +164,10 @@ public void onNothingSelected(AdapterView> parent) {
@Override
public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
- setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent((Date) e.getData()));
+ setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent(
+ binding.dailyServingsHistoryTimeRange.getSelectedYear(),
+ binding.dailyServingsHistoryTimeRange.getSelectedMonth(),
+ e.getXIndex() + 1)); // convert x-index (0-based index) to days by adding 1
finish();
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/activity/WeightHistoryActivity.java b/app/src/main/java/org/nutritionfacts/dailydozen/activity/WeightHistoryActivity.java
index 326e36c1..3fd5db00 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/activity/WeightHistoryActivity.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/activity/WeightHistoryActivity.java
@@ -22,14 +22,13 @@
import org.nutritionfacts.dailydozen.event.TimeRangeSelectedEvent;
import org.nutritionfacts.dailydozen.event.TimeScaleSelectedEvent;
import org.nutritionfacts.dailydozen.model.Day;
+import org.nutritionfacts.dailydozen.model.enums.HistoryType;
import org.nutritionfacts.dailydozen.model.enums.TimeScale;
import org.nutritionfacts.dailydozen.task.LoadWeightsHistoryTask;
import org.nutritionfacts.dailydozen.task.ProgressListener;
import org.nutritionfacts.dailydozen.task.TaskRunner;
import org.nutritionfacts.dailydozen.task.params.LoadHistoryTaskParams;
-import java.util.Date;
-
import timber.log.Timber;
public class WeightHistoryActivity extends AppCompatActivity
@@ -83,6 +82,7 @@ private void loadData() {
alreadyLoadingData = true;
LoadHistoryTaskParams loadHistoryTaskParams = new LoadHistoryTaskParams(
+ HistoryType.Weights,
TimeScale.DAYS,
binding.dailyServingsHistoryTimeRange.getSelectedYear(),
binding.dailyServingsHistoryTimeRange.getSelectedMonth());
@@ -163,7 +163,10 @@ public void onNothingSelected(AdapterView> parent) {
@Override
public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
- setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent((Date) e.getData()));
+ setResult(Args.SELECTABLE_DATE_REQUEST, Common.createShowDateIntent(
+ binding.dailyServingsHistoryTimeRange.getSelectedYear(),
+ binding.dailyServingsHistoryTimeRange.getSelectedMonth(),
+ e.getXIndex() + 1)); // convert x-index (0-based index) to days by adding 1
finish();
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/DailyDozenPagerAdapter.java b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/DatePagerAdapter.java
similarity index 53%
rename from app/src/main/java/org/nutritionfacts/dailydozen/adapter/DailyDozenPagerAdapter.java
rename to app/src/main/java/org/nutritionfacts/dailydozen/adapter/DatePagerAdapter.java
index 27e4e068..bf1877cc 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/DailyDozenPagerAdapter.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/DatePagerAdapter.java
@@ -1,27 +1,37 @@
package org.nutritionfacts.dailydozen.adapter;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
import org.nutritionfacts.dailydozen.fragment.DailyDozenFragment;
+import org.nutritionfacts.dailydozen.fragment.TweaksFragment;
import org.nutritionfacts.dailydozen.model.Day;
-public class DailyDozenPagerAdapter extends FragmentStatePagerAdapter {
- private int numDaysSinceEpoch;
+public class DatePagerAdapter extends FragmentStatePagerAdapter {
+ private final boolean inDailyDozenMode;
+ private final int numDaysSinceEpoch;
- public DailyDozenPagerAdapter(@NonNull FragmentManager fm, int behavior) {
+ public DatePagerAdapter(@NonNull FragmentManager fm, int behavior, boolean inDailyDozenMode) {
super(fm, behavior);
+ this.inDailyDozenMode = inDailyDozenMode;
this.numDaysSinceEpoch = Day.getNumDaysSinceEpoch();
}
+ @NonNull
@Override
public Fragment getItem(int position) {
- return DailyDozenFragment.newInstance(Day.getByOffsetFromEpoch(position));
+ if (inDailyDozenMode) {
+ return DailyDozenFragment.newInstance(Day.getByOffsetFromEpoch(position));
+ } else {
+ return TweaksFragment.newInstance(Day.getByOffsetFromEpoch(position));
+ }
}
+ @Nullable
@Override
public CharSequence getPageTitle(int position) {
return Day.getTabTitleForDay(position);
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodServingsAdapter.java b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodServingsAdapter.java
index 670c3519..16197cc5 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodServingsAdapter.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodServingsAdapter.java
@@ -6,6 +6,7 @@
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.nutritionfacts.dailydozen.Common;
@@ -19,6 +20,7 @@ public FoodServingsAdapter(List servingSizes) {
this.servingSizes = servingSizes;
}
+ @NonNull
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
@@ -26,7 +28,7 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
}
@Override
- public void onBindViewHolder(ViewHolder holder, int position) {
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final String servingSize = servingSizes.get(position);
if (!TextUtils.isEmpty(servingSize)) {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodTypeAdapter.java b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodTypeAdapter.java
index d16f79c5..25500b28 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodTypeAdapter.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/FoodTypeAdapter.java
@@ -6,6 +6,7 @@
import android.view.ViewGroup;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.nutritionfacts.dailydozen.Common;
@@ -22,13 +23,14 @@ public FoodTypeAdapter(List typesOfFood, List foodVideosLink) {
this.foodVideos = foodVideosLink;
}
+ @NonNull
@Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(FoodTypeItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
- public void onBindViewHolder(ViewHolder holder, int position) {
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
final String foodName = foodTypes.get(position);
if (!TextUtils.isEmpty(foodName)) {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/TweaksPagerAdapter.java b/app/src/main/java/org/nutritionfacts/dailydozen/adapter/TweaksPagerAdapter.java
deleted file mode 100644
index 2a41c59b..00000000
--- a/app/src/main/java/org/nutritionfacts/dailydozen/adapter/TweaksPagerAdapter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.nutritionfacts.dailydozen.adapter;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentStatePagerAdapter;
-
-import org.nutritionfacts.dailydozen.fragment.TweaksFragment;
-import org.nutritionfacts.dailydozen.model.Day;
-
-public class TweaksPagerAdapter extends FragmentStatePagerAdapter {
- private int numDaysSinceEpoch;
-
- public TweaksPagerAdapter(@NonNull FragmentManager fm, int behavior) {
- super(fm, behavior);
-
- numDaysSinceEpoch = Day.getNumDaysSinceEpoch();
- }
-
- @NonNull
- @Override
- public Fragment getItem(int position) {
- return TweaksFragment.newInstance(Day.getByOffsetFromEpoch(position));
- }
-
- @Nullable
- @Override
- public CharSequence getPageTitle(int position) {
- return Day.getTabTitleForDay(position);
- }
-
- @Override
- public int getCount() {
- return numDaysSinceEpoch;
- }
-}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/controller/Bus.java b/app/src/main/java/org/nutritionfacts/dailydozen/controller/Bus.java
index 928855de..348d5c73 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/controller/Bus.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/controller/Bus.java
@@ -66,7 +66,7 @@ public static void calculateStreaksComplete(final boolean success) {
post(new CalculateStreaksTaskCompleteEvent(success));
}
- public static void loadServingsHistoryCompleteEvent(final LoadHistoryCompleteEvent event) {
+ public static void loadHistoryCompleteEvent(final LoadHistoryCompleteEvent event) {
post(event);
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/controller/PermissionController.java b/app/src/main/java/org/nutritionfacts/dailydozen/controller/PermissionController.java
index 71cfefae..0ac9709f 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/controller/PermissionController.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/controller/PermissionController.java
@@ -26,10 +26,8 @@ public static void askForWriteExternalStorage(final Activity activity) {
public static boolean grantedWriteExternalStorage(int requestCode, int[] grantResults) {
boolean permissionGranted = false;
- switch (requestCode) {
- case WRITE_EXTERNAL_STORAGE_REQUEST:
- permissionGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
- break;
+ if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST) {
+ permissionGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
}
return permissionGranted;
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/exception/InvalidDateException.java b/app/src/main/java/org/nutritionfacts/dailydozen/exception/InvalidDateException.java
index fc5628b7..a7af4104 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/exception/InvalidDateException.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/exception/InvalidDateException.java
@@ -1,5 +1,7 @@
package org.nutritionfacts.dailydozen.exception;
+import androidx.annotation.NonNull;
+
public class InvalidDateException extends Exception {
private final String invalidDateString;
@@ -7,6 +9,7 @@ public InvalidDateException(String invalidDateString) {
this.invalidDateString = invalidDateString;
}
+ @NonNull
@Override
public String toString() {
return String.format("InvalidDateException{invalidDateString='%s'}", invalidDateString);
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/fragment/DailyDozenFragment.java b/app/src/main/java/org/nutritionfacts/dailydozen/fragment/DailyDozenFragment.java
index 8ffc1f06..4560195c 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/fragment/DailyDozenFragment.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/fragment/DailyDozenFragment.java
@@ -45,7 +45,7 @@ public static DailyDozenFragment newInstance(final Day day) {
@Nullable
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentDailyDozenBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@@ -138,18 +138,14 @@ private void showExplodingStarAnimation() {
binding.explodingStar.runAnimation(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
- if (binding.explodingStar != null) {
- binding.explodingStar.cancelAnimation();
- }
+ binding.explodingStar.cancelAnimation();
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
- if (binding.explodingStarContainer != null) {
- binding.explodingStarContainer.setVisibility(View.GONE);
- }
+ binding.explodingStarContainer.setVisibility(View.GONE);
askUserToRateAfterFirstStarExplosion();
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/fragment/TweaksFragment.java b/app/src/main/java/org/nutritionfacts/dailydozen/fragment/TweaksFragment.java
index 92943375..443f918b 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/fragment/TweaksFragment.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/fragment/TweaksFragment.java
@@ -41,7 +41,7 @@ public static TweaksFragment newInstance(final Day day) {
@Nullable
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentTweaksBinding.inflate(inflater, container, false);
return binding.getRoot();
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/model/Day.java b/app/src/main/java/org/nutritionfacts/dailydozen/model/Day.java
index 302f9774..16cd062b 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/model/Day.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/model/Day.java
@@ -2,6 +2,8 @@
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.activeandroid.query.Select;
@@ -95,7 +97,7 @@ public DateTime getDateTime() {
}
private void setDate(DateTime dateTime) {
- this.date = Long.valueOf(getDateString(dateTime));
+ this.date = Long.parseLong(getDateString(dateTime));
this.year = dateTime.getYear();
this.month = dateTime.getMonth();
@@ -106,6 +108,7 @@ public long getDate() {
return date;
}
+ @NonNull
@Override
public String toString() {
return getDateTime().format("WWW, MMM D", Locale.getDefault());
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/model/Food.java b/app/src/main/java/org/nutritionfacts/dailydozen/model/Food.java
index 4c8fbbf7..ecb7e547 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/model/Food.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/model/Food.java
@@ -2,6 +2,8 @@
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+
import com.activeandroid.ActiveAndroid;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
@@ -54,6 +56,7 @@ public Food(String name, String foodIdName, int recommendedServings) {
this.recommendedServings = recommendedServings;
}
+ @NonNull
@Override
public String toString() {
return name;
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/model/FoodInfo.java b/app/src/main/java/org/nutritionfacts/dailydozen/model/FoodInfo.java
index 2d3bf3bd..73616e7d 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/model/FoodInfo.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/model/FoodInfo.java
@@ -412,7 +412,7 @@ private static void initFoodTypeVideos(Resources res) {
}
public static List getFoodVideosLink(final String foodName) {
- return foodVideos.containsKey(foodName) ? foodVideos.get(foodName) : new ArrayList();
+ return foodVideos.containsKey(foodName) ? foodVideos.get(foodName) : new ArrayList<>();
}
private static void putFoodVideosLink(Resources res, String food, int videosId) {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/model/Tweak.java b/app/src/main/java/org/nutritionfacts/dailydozen/model/Tweak.java
index 63853446..b668037d 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/model/Tweak.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/model/Tweak.java
@@ -2,6 +2,8 @@
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+
import com.activeandroid.ActiveAndroid;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
@@ -53,6 +55,7 @@ public Tweak(String name, String idName, int recommendedAmount) {
this.recommendedAmount = recommendedAmount;
}
+ @NonNull
@Override
public String toString() {
return name;
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/model/enums/HistoryType.java b/app/src/main/java/org/nutritionfacts/dailydozen/model/enums/HistoryType.java
new file mode 100644
index 00000000..04017eb3
--- /dev/null
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/model/enums/HistoryType.java
@@ -0,0 +1,13 @@
+package org.nutritionfacts.dailydozen.model.enums;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+public abstract class HistoryType {
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Interface { }
+
+ public static final int FoodServings = 0;
+ public static final int Tweaks = 1;
+ public static final int Weights = 2;
+}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/model/pref/UpdateReminderPref.java b/app/src/main/java/org/nutritionfacts/dailydozen/model/pref/UpdateReminderPref.java
index c0a2249c..1362b6cf 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/model/pref/UpdateReminderPref.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/model/pref/UpdateReminderPref.java
@@ -3,6 +3,8 @@
import android.content.Context;
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+
import com.google.gson.annotations.SerializedName;
import org.nutritionfacts.dailydozen.util.DateUtil;
@@ -64,6 +66,7 @@ public List getReminderTimes() {
return reminderTimes;
}
+ @NonNull
@Override
public String toString() {
return TextUtils.join(", ", reminderTimes);
@@ -141,7 +144,9 @@ public int timeInMillis(String time) {
private int timeInMillis(String time, DateFormat format) {
try {
Date date = format.parse(time);
- return (int) date.getTime();
+ if (date != null) {
+ return (int) date.getTime();
+ }
} catch (ParseException e) {
if (format != twentyFourHourFormat) {
return timeInMillis(time, twentyFourHourFormat);
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateStreakTask.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateStreakTask.java
index 8c898ea0..681b27fd 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateStreakTask.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateStreakTask.java
@@ -2,20 +2,33 @@
import com.activeandroid.ActiveAndroid;
+import org.nutritionfacts.dailydozen.Servings;
import org.nutritionfacts.dailydozen.controller.Bus;
import org.nutritionfacts.dailydozen.model.DDServings;
import org.nutritionfacts.dailydozen.model.Day;
import org.nutritionfacts.dailydozen.model.Food;
+import org.nutritionfacts.dailydozen.model.Tweak;
+import org.nutritionfacts.dailydozen.model.TweakServings;
import java.util.List;
public class CalculateStreakTask extends BaseTask {
private final Day startingDay;
- private final Food food;
+ private Food food;
+ private Tweak tweak;
+
+ private boolean isFoodStreak;
public CalculateStreakTask(StreakTaskInput input) {
this.startingDay = input.getStartingDay();
- this.food = input.getFood();
+
+ if (input.getFood() != null) {
+ isFoodStreak = true;
+ this.food = input.getFood();
+ } else if (input.getTweak() != null) {
+ isFoodStreak = false;
+ this.tweak = input.getTweak();
+ }
}
@Override
@@ -29,7 +42,13 @@ public Boolean call() {
for (int i = 0; i < numDays; i++) {
final Day day = daysToCalculate.get(i);
- final DDServings servingsOnDate = DDServings.getByDateAndFood(day, food);
+ Servings servingsOnDate;
+ if (isFoodStreak) {
+ servingsOnDate = DDServings.getByDateAndFood(day, food);
+ } else {
+ servingsOnDate = TweakServings.getByDateAndTweak(day, tweak);
+ }
+
if (servingsOnDate != null) {
servingsOnDate.recalculateStreak();
servingsOnDate.save();
@@ -47,7 +66,11 @@ public Boolean call() {
@Override
public void setDataAfterLoading(Boolean success) {
if (success) {
- Bus.foodServingsChangedEvent(startingDay, food);
+ if (isFoodStreak) {
+ Bus.foodServingsChangedEvent(startingDay, food);
+ } else {
+ Bus.tweakServingsChangedEvent(startingDay, tweak);
+ }
}
}
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateTweakStreakTask.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateTweakStreakTask.java
deleted file mode 100644
index 34c7036b..00000000
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/CalculateTweakStreakTask.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.nutritionfacts.dailydozen.task;
-
-import com.activeandroid.ActiveAndroid;
-
-import org.nutritionfacts.dailydozen.controller.Bus;
-import org.nutritionfacts.dailydozen.model.Day;
-import org.nutritionfacts.dailydozen.model.Tweak;
-import org.nutritionfacts.dailydozen.model.TweakServings;
-
-import java.util.List;
-
-public class CalculateTweakStreakTask extends BaseTask {
- private final Day startingDay;
- private final Tweak tweak;
-
- public CalculateTweakStreakTask(StreakTaskInput input) {
- this.startingDay = input.getStartingDay();
- this.tweak = input.getTweak();
- }
-
- @Override
- public Boolean call() {
- final List daysToCalculate = startingDay.getDaysAfter();
- final int numDays = daysToCalculate.size();
-
- ActiveAndroid.beginTransaction();
-
- try {
- for (int i = 0; i < numDays; i++) {
- final Day day = daysToCalculate.get(i);
-
- final TweakServings servingsOnDate = TweakServings.getByDateAndTweak(day, tweak);
- if (servingsOnDate != null) {
- servingsOnDate.recalculateStreak();
- servingsOnDate.save();
- }
- }
-
- ActiveAndroid.setTransactionSuccessful();
- } finally {
- ActiveAndroid.endTransaction();
- }
-
- return true;
- }
-
- @Override
- public void setDataAfterLoading(Boolean success) {
- if (success) {
- Bus.tweakServingsChangedEvent(startingDay, tweak);
- }
- }
-}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadTweakServingsHistoryTask.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadHistoryTask.java
similarity index 71%
rename from app/src/main/java/org/nutritionfacts/dailydozen/task/LoadTweakServingsHistoryTask.java
rename to app/src/main/java/org/nutritionfacts/dailydozen/task/LoadHistoryTask.java
index 87f8746e..5dc4e0e3 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadTweakServingsHistoryTask.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadHistoryTask.java
@@ -17,8 +17,10 @@
import org.nutritionfacts.dailydozen.R;
import org.nutritionfacts.dailydozen.controller.Bus;
import org.nutritionfacts.dailydozen.event.LoadHistoryCompleteEvent;
+import org.nutritionfacts.dailydozen.model.DDServings;
import org.nutritionfacts.dailydozen.model.Day;
import org.nutritionfacts.dailydozen.model.TweakServings;
+import org.nutritionfacts.dailydozen.model.enums.HistoryType;
import org.nutritionfacts.dailydozen.model.enums.TimeScale;
import org.nutritionfacts.dailydozen.task.params.LoadHistoryTaskParams;
import org.nutritionfacts.dailydozen.util.DateUtil;
@@ -29,13 +31,13 @@
import timber.log.Timber;
-public class LoadTweakServingsHistoryTask extends BaseTask {
+public class LoadHistoryTask extends BaseTask {
private static final int MONTHS_IN_YEAR = 12;
private final ProgressListener progressListener;
private final Context context;
private final LoadHistoryTaskParams inputParams;
- public LoadTweakServingsHistoryTask(ProgressListener progressListener, Context context, LoadHistoryTaskParams inputParams) {
+ public LoadHistoryTask(ProgressListener progressListener, Context context, LoadHistoryTaskParams inputParams) {
this.progressListener = progressListener;
this.context = context;
this.inputParams = inputParams;
@@ -63,37 +65,37 @@ public void setUiForLoading() {
public void setDataAfterLoading(LoadHistoryCompleteEvent event) {
progressListener.hideProgressBar();
- Bus.loadServingsHistoryCompleteEvent(event);
+ Bus.loadHistoryCompleteEvent(event);
}
- // This method loads the last two months of servings into memory, but only shows the selected
+ // This method loads the last two months of history into memory, but only shows the selected
// month. This is because it needs to use the data from the month before to calculate the
// starting moving average.
private LoadHistoryCompleteEvent getChartDataInDays(final LoadHistoryTaskParams inputParams) {
final List history = Day.getLastTwoMonths(inputParams.getSelectedYear(), inputParams.getSelectedMonth());
- final int numDaysOfServings = history.size();
+ final int numDaysOfHistory = history.size();
- final List xLabels = new ArrayList<>(numDaysOfServings);
- final List barEntries = new ArrayList<>(numDaysOfServings);
- final List lineEntries = new ArrayList<>(numDaysOfServings);
+ final List xLabels = new ArrayList<>(numDaysOfHistory);
+ final List barEntries = new ArrayList<>(numDaysOfHistory);
+ final List lineEntries = new ArrayList<>(numDaysOfHistory);
float previousTrend = 0;
- for (int i = 0; i < numDaysOfServings; i++) {
+ for (int i = 0; i < numDaysOfHistory; i++) {
final Day day = history.get(i);
- final int totalServingsOnDate = TweakServings.getTotalTweakServingsOnDate(day);
+ final int totalOnDate = getTotalOnDate(day);
- previousTrend = calculateTrend(previousTrend, totalServingsOnDate);
+ previousTrend = calculateTrend(previousTrend, totalOnDate);
- // Only show the past days of servings in the selected month and year
+ // Only show the past days of history in the selected month and year
if (day.getYear() == inputParams.getSelectedYear() && day.getMonth() == inputParams.getSelectedMonth()) {
final int xIndex = xLabels.size();
xLabels.add(day.getDayOfWeek());
- barEntries.add(new BarEntry(totalServingsOnDate, xIndex));
+ barEntries.add(new BarEntry(totalOnDate, xIndex));
final Entry lineEntry = new Entry(previousTrend, xIndex);
// Here we set the optional data field on the Entry class. This gives the user the
@@ -102,10 +104,10 @@ private LoadHistoryCompleteEvent getChartDataInDays(final LoadHistoryTaskParams
lineEntries.add(lineEntry);
}
- progressListener.updateProgressBar(i + 1, numDaysOfServings);
+ progressListener.updateProgressBar(i + 1, numDaysOfHistory);
}
- return createCompleteEvent(createLineAndBarData(xLabels, lineEntries, barEntries), TimeScale.DAYS);
+ return createCompleteEvent(createLineAndBarData(xLabels, lineEntries, barEntries));
}
private LoadHistoryCompleteEvent getChartDataInMonths(final LoadHistoryTaskParams inputParams) {
@@ -118,17 +120,17 @@ private LoadHistoryCompleteEvent getChartDataInMonths(final LoadHistoryTaskParam
final List lineEntries = new ArrayList<>();
while (monthOneBased <= MONTHS_IN_YEAR) {
- final float averageTotalServingsInMonth = TweakServings.getAverageTotalTweakServingsInMonth(year, monthOneBased);
+ final float averageForMonth = getAverageForMonth(year, monthOneBased);
Timber.d("getChartDataInMonths: year [%s], monthOneBased [%s], average [%s]",
- year, monthOneBased, averageTotalServingsInMonth);
+ year, monthOneBased, averageForMonth);
- if (averageTotalServingsInMonth > 0) {
+ if (averageForMonth > 0) {
final int xIndex = xLabels.size();
xLabels.add(DateUtil.getShortNameOfMonth(monthOneBased));
- lineEntries.add(new Entry(averageTotalServingsInMonth, xIndex));
+ lineEntries.add(new Entry(averageForMonth, xIndex));
}
monthOneBased++;
@@ -136,7 +138,7 @@ private LoadHistoryCompleteEvent getChartDataInMonths(final LoadHistoryTaskParam
progressListener.updateProgressBar(i++, MONTHS_IN_YEAR);
}
- return createCompleteEvent(createLineData(xLabels, lineEntries), TimeScale.MONTHS);
+ return createCompleteEvent(createLineData(xLabels, lineEntries));
}
private LoadHistoryCompleteEvent getChartDataInYears() {
@@ -160,24 +162,23 @@ private LoadHistoryCompleteEvent getChartDataInYears() {
xLabels.add(String.valueOf(year));
- final float averageTotalServingsInYear = TweakServings.getAverageTotalTweakServingsInYear(year);
+ final float averageForYear = getAverageForYear(year);
Timber.d("getChartDataInYears: year [%s], average [%s]",
- year, averageTotalServingsInYear);
+ year, averageForYear);
- lineEntries.add(new Entry(averageTotalServingsInYear, xIndex));
+ lineEntries.add(new Entry(averageForYear, xIndex));
year++;
progressListener.updateProgressBar(i++, numYears);
}
- return createCompleteEvent(createLineData(xLabels, lineEntries), TimeScale.YEARS);
+ return createCompleteEvent(createLineData(xLabels, lineEntries));
}
- private LoadHistoryCompleteEvent createCompleteEvent(final CombinedData combinedData,
- @TimeScale.Interface final int timeScale) {
- return new LoadHistoryCompleteEvent(combinedData, timeScale);
+ private LoadHistoryCompleteEvent createCompleteEvent(final CombinedData combinedData) {
+ return new LoadHistoryCompleteEvent(combinedData, inputParams.getTimeScale());
}
private CombinedData createLineAndBarData(List xLabels, List lineEntries, List barEntries) {
@@ -206,7 +207,7 @@ private float calculateTrend(float previousTrend, int currentValue) {
}
private BarData getBarData(List xVals, List barEntries) {
- final BarDataSet dataSet = new BarDataSet(barEntries, context.getString(R.string.tweaks));
+ final BarDataSet dataSet = new BarDataSet(barEntries, getBarDataLabelForHistoryType());
dataSet.setColor(ContextCompat.getColor(context, R.color.colorPrimary));
dataSet.setValueTextColor(ContextCompat.getColor(context, android.R.color.white));
@@ -262,4 +263,48 @@ public String getFormattedValue(float value, Entry entry, int dataSetIndex, View
return decimalFormat.format(value);
}
}
+
+ private int getTotalOnDate(final Day day) {
+ switch (inputParams.getHistoryType()) {
+ case HistoryType.FoodServings:
+ return DDServings.getTotalServingsOnDate(day);
+ case HistoryType.Tweaks:
+ return TweakServings.getTotalTweakServingsOnDate(day);
+ default:
+ return 0;
+ }
+ }
+
+ private float getAverageForMonth(final int year, final int monthOneBased) {
+ switch (inputParams.getHistoryType()) {
+ case HistoryType.FoodServings:
+ return DDServings.getAverageTotalServingsInMonth(year, monthOneBased);
+ case HistoryType.Tweaks:
+ return TweakServings.getAverageTotalTweakServingsInMonth(year, monthOneBased);
+ default:
+ return 0;
+ }
+ }
+
+ private float getAverageForYear(final int year) {
+ switch (inputParams.getHistoryType()) {
+ case HistoryType.FoodServings:
+ return DDServings.getAverageTotalServingsInYear(year);
+ case HistoryType.Tweaks:
+ return TweakServings.getAverageTotalTweakServingsInYear(year);
+ default:
+ return 0;
+ }
+ }
+
+ private String getBarDataLabelForHistoryType() {
+ switch (inputParams.getHistoryType()) {
+ case HistoryType.FoodServings:
+ return context.getString(R.string.servings);
+ case HistoryType.Tweaks:
+ return context.getString(R.string.tweaks);
+ default:
+ return "";
+ }
+ }
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadServingsHistoryTask.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadServingsHistoryTask.java
deleted file mode 100644
index 6791b167..00000000
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadServingsHistoryTask.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package org.nutritionfacts.dailydozen.task;
-
-import android.content.Context;
-
-import androidx.core.content.ContextCompat;
-
-import com.github.mikephil.charting.data.BarData;
-import com.github.mikephil.charting.data.BarDataSet;
-import com.github.mikephil.charting.data.BarEntry;
-import com.github.mikephil.charting.data.CombinedData;
-import com.github.mikephil.charting.data.Entry;
-import com.github.mikephil.charting.data.LineData;
-import com.github.mikephil.charting.data.LineDataSet;
-import com.github.mikephil.charting.formatter.ValueFormatter;
-import com.github.mikephil.charting.utils.ViewPortHandler;
-
-import org.nutritionfacts.dailydozen.R;
-import org.nutritionfacts.dailydozen.controller.Bus;
-import org.nutritionfacts.dailydozen.event.LoadHistoryCompleteEvent;
-import org.nutritionfacts.dailydozen.model.DDServings;
-import org.nutritionfacts.dailydozen.model.Day;
-import org.nutritionfacts.dailydozen.model.enums.TimeScale;
-import org.nutritionfacts.dailydozen.task.params.LoadHistoryTaskParams;
-import org.nutritionfacts.dailydozen.util.DateUtil;
-
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import timber.log.Timber;
-
-public class LoadServingsHistoryTask extends BaseTask {
- private static final int MONTHS_IN_YEAR = 12;
- private final ProgressListener progressListener;
- private final Context context;
- private final LoadHistoryTaskParams inputParams;
-
- public LoadServingsHistoryTask(ProgressListener progressListener, Context context, LoadHistoryTaskParams inputParams) {
- this.progressListener = progressListener;
- this.context = context;
- this.inputParams = inputParams;
- }
-
- @Override
- public LoadHistoryCompleteEvent call() {
- switch (inputParams.getTimeScale()) {
- default:
- case TimeScale.DAYS:
- return getChartDataInDays(inputParams);
- case TimeScale.MONTHS:
- return getChartDataInMonths(inputParams);
- case TimeScale.YEARS:
- return getChartDataInYears();
- }
- }
-
- @Override
- public void setUiForLoading() {
- progressListener.showProgressBar(R.string.task_loading_servings_history_title);
- }
-
- @Override
- public void setDataAfterLoading(LoadHistoryCompleteEvent event) {
- progressListener.hideProgressBar();
-
- Bus.loadServingsHistoryCompleteEvent(event);
- }
-
- // This method loads the last two months of servings into memory, but only shows the selected
- // month. This is because it needs to use the data from the month before to calculate the
- // starting moving average.
- private LoadHistoryCompleteEvent getChartDataInDays(final LoadHistoryTaskParams inputParams) {
- final List history = Day.getLastTwoMonths(inputParams.getSelectedYear(), inputParams.getSelectedMonth());
-
- final int numDaysOfServings = history.size();
-
- final List xLabels = new ArrayList<>(numDaysOfServings);
- final List barEntries = new ArrayList<>(numDaysOfServings);
- final List lineEntries = new ArrayList<>(numDaysOfServings);
-
- float previousTrend = 0;
-
- for (int i = 0; i < numDaysOfServings; i++) {
- final Day day = history.get(i);
-
- final int totalServingsOnDate = DDServings.getTotalServingsOnDate(day);
-
- previousTrend = calculateTrend(previousTrend, totalServingsOnDate);
-
- // Only show the past days of servings in the selected month and year
- if (day.getYear() == inputParams.getSelectedYear() && day.getMonth() == inputParams.getSelectedMonth()) {
- final int xIndex = xLabels.size();
-
- xLabels.add(day.getDayOfWeek());
-
- barEntries.add(new BarEntry(totalServingsOnDate, xIndex));
-
- final Entry lineEntry = new Entry(previousTrend, xIndex);
- // Here we set the optional data field on the Entry class. This gives the user the
- // ability to tap on a value in the ServingsHistoryActivity and be taken to that date
- lineEntry.setData(DateUtil.convertDayToDate(day));
- lineEntries.add(lineEntry);
- }
-
- progressListener.updateProgressBar(i + 1, numDaysOfServings);
- }
-
- return createCompleteEvent(createLineAndBarData(xLabels, lineEntries, barEntries), TimeScale.DAYS);
- }
-
- private LoadHistoryCompleteEvent getChartDataInMonths(final LoadHistoryTaskParams inputParams) {
- int i = 0;
-
- int year = inputParams.getSelectedYear();
- int monthOneBased = 1;
-
- final List xLabels = new ArrayList<>();
- final List lineEntries = new ArrayList<>();
-
- while (monthOneBased <= MONTHS_IN_YEAR) {
- final float averageTotalServingsInMonth = DDServings.getAverageTotalServingsInMonth(year, monthOneBased);
-
- Timber.d("getChartDataInMonths: year [%s], monthOneBased [%s], average [%s]",
- year, monthOneBased, averageTotalServingsInMonth);
-
- if (averageTotalServingsInMonth > 0) {
- final int xIndex = xLabels.size();
-
- xLabels.add(DateUtil.getShortNameOfMonth(monthOneBased));
-
- lineEntries.add(new Entry(averageTotalServingsInMonth, xIndex));
- }
-
- monthOneBased++;
-
- progressListener.updateProgressBar(i++, MONTHS_IN_YEAR);
- }
-
- return createCompleteEvent(createLineData(xLabels, lineEntries), TimeScale.MONTHS);
- }
-
- private LoadHistoryCompleteEvent getChartDataInYears() {
- final Day firstDay = Day.getFirstDay();
- final int firstYear = firstDay.getYear();
- Timber.d("getChartDataInYears: firstYear [%s]", firstYear);
-
- final int currentYear = DateUtil.getCurrentYear();
- Timber.d("getChartDataInYears: currentYear [%s]", currentYear);
-
- final int numYears = currentYear - firstYear;
- int i = 0;
-
- int year = firstYear;
-
- final List xLabels = new ArrayList<>();
- final List lineEntries = new ArrayList<>();
-
- while (year <= currentYear) {
- final int xIndex = xLabels.size();
-
- xLabels.add(String.valueOf(year));
-
- final float averageTotalServingsInYear = DDServings.getAverageTotalServingsInYear(year);
-
- Timber.d("getChartDataInYears: year [%s], average [%s]",
- year, averageTotalServingsInYear);
-
- lineEntries.add(new Entry(averageTotalServingsInYear, xIndex));
-
- year++;
-
- progressListener.updateProgressBar(i++, numYears);
- }
-
- return createCompleteEvent(createLineData(xLabels, lineEntries), TimeScale.YEARS);
- }
-
- private LoadHistoryCompleteEvent createCompleteEvent(final CombinedData combinedData,
- @TimeScale.Interface final int timeScale) {
- return new LoadHistoryCompleteEvent(combinedData, timeScale);
- }
-
- private CombinedData createLineAndBarData(List xLabels, List lineEntries, List barEntries) {
- final CombinedData combinedData = createLineData(xLabels, lineEntries);
- combinedData.setData(getBarData(xLabels, barEntries));
- return combinedData;
- }
-
- private CombinedData createLineData(final List xLabels, final List lineEntries) {
- final CombinedData combinedData = new CombinedData(xLabels);
- combinedData.setData(getLineData(xLabels, lineEntries));
- return combinedData;
- }
-
- // Calculates an exponentially smoothed moving average with 10% smoothing
- private float calculateTrend(float previousTrend, int currentValue) {
- if (previousTrend == 0) {
- return currentValue;
- } else {
- // Tn = Tn-1 + 0.1 * (Vn - Tn-1)
- // Tn is Trend for day n (today)
- // Tn-1 is Trend for day n-1 (yesterday)
- // Vn is Value for day n (total servings today)
- return previousTrend + 0.1f * (currentValue - previousTrend);
- }
- }
-
- private BarData getBarData(List xVals, List barEntries) {
- final BarDataSet dataSet = new BarDataSet(barEntries, context.getString(R.string.servings));
-
- dataSet.setColor(ContextCompat.getColor(context, R.color.colorPrimary));
- dataSet.setValueTextColor(ContextCompat.getColor(context, android.R.color.white));
- dataSet.setValueTextSize(14);
-
- // We just want the value as an integer
- dataSet.setValueFormatter(new BarChartValueFormatter());
-
- return new BarData(xVals, dataSet);
- }
-
- private LineData getLineData(List xVals, List lineEntries) {
- final LineDataSet dataSet = new LineDataSet(lineEntries, context.getString(R.string.moving_average));
-
- final int color = ContextCompat.getColor(context, R.color.brown);
-
- dataSet.setColor(color);
- dataSet.setLineWidth(2.5f);
- dataSet.setCircleColor(color);
- dataSet.setFillColor(color);
- dataSet.setDrawValues(true);
- dataSet.setValueTextSize(12);
- dataSet.setValueTextColor(color);
-
- // Format the value labels to two decimal places
- dataSet.setValueFormatter(new LineChartValueFormatter());
-
- return new LineData(xVals, dataSet);
- }
-
- private static class BarChartValueFormatter implements ValueFormatter {
- private final DecimalFormat decimalFormat;
-
- BarChartValueFormatter() {
- decimalFormat = new DecimalFormat("#");
- }
-
- @Override
- public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
- return decimalFormat.format(value);
- }
- }
-
- private static class LineChartValueFormatter implements ValueFormatter {
- private final DecimalFormat decimalFormat;
-
- LineChartValueFormatter() {
- decimalFormat = new DecimalFormat("#.00");
- }
-
- @Override
- public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
- return decimalFormat.format(value);
- }
- }
-}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadWeightsHistoryTask.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadWeightsHistoryTask.java
index 4751f0da..7d903f04 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadWeightsHistoryTask.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/task/LoadWeightsHistoryTask.java
@@ -19,7 +19,6 @@
import org.nutritionfacts.dailydozen.event.LoadHistoryCompleteEvent;
import org.nutritionfacts.dailydozen.model.Day;
import org.nutritionfacts.dailydozen.model.Weights;
-import org.nutritionfacts.dailydozen.model.enums.TimeScale;
import org.nutritionfacts.dailydozen.task.params.LoadHistoryTaskParams;
import org.nutritionfacts.dailydozen.util.DateUtil;
@@ -27,10 +26,7 @@
import java.util.ArrayList;
import java.util.List;
-import timber.log.Timber;
-
public class LoadWeightsHistoryTask extends BaseTask {
- private static final int MONTHS_IN_YEAR = 12;
private final ProgressListener progressListener;
private final Context context;
private final LoadHistoryTaskParams inputParams;
@@ -43,15 +39,7 @@ public LoadWeightsHistoryTask(ProgressListener progressListener, Context context
@Override
public LoadHistoryCompleteEvent call() {
- switch (inputParams.getTimeScale()) {
- default:
- case TimeScale.DAYS:
- return getChartDataInDays(inputParams);
- case TimeScale.MONTHS:
- return getChartDataInMonths(inputParams);
- case TimeScale.YEARS:
- return getChartDataInYears();
- }
+ return getChartDataInDays(inputParams);
}
@Override
@@ -63,26 +51,26 @@ public void setUiForLoading() {
public void setDataAfterLoading(LoadHistoryCompleteEvent event) {
progressListener.hideProgressBar();
- Bus.loadServingsHistoryCompleteEvent(event);
+ Bus.loadHistoryCompleteEvent(event);
}
- // This method loads the last two months of servings into memory, but only shows the selected
+ // This method loads the last two months of history into memory, but only shows the selected
// month. This is because it needs to use the data from the month before to calculate the
// starting moving average.
private LoadHistoryCompleteEvent getChartDataInDays(final LoadHistoryTaskParams inputParams) {
final List history = Day.getLastTwoMonths(inputParams.getSelectedYear(), inputParams.getSelectedMonth());
- final int numDaysOfWeights = history.size();
+ final int numDaysOfHistory = history.size();
- final List xLabels = new ArrayList<>(numDaysOfWeights);
- final List barEntries = new ArrayList<>(numDaysOfWeights);
- final List lineEntries = new ArrayList<>(numDaysOfWeights);
+ final List xLabels = new ArrayList<>(numDaysOfHistory);
+ final List barEntries = new ArrayList<>(numDaysOfHistory);
+ final List lineEntries = new ArrayList<>(numDaysOfHistory);
float previousTrend = 0;
float minWeight = Float.MAX_VALUE;
float maxWeight = Float.MIN_VALUE;
- for (int i = 0; i < numDaysOfWeights; i++) {
+ for (int i = 0; i < numDaysOfHistory; i++) {
final Day day = history.get(i);
Weights weightsOnDay = Weights.getWeightsOnDay(day);
@@ -104,7 +92,7 @@ private LoadHistoryCompleteEvent getChartDataInDays(final LoadHistoryTaskParams
}
}
- // Only show the past days of servings in the selected month and year
+ // Only show the past days of history in the selected month and year
if (day.getYear() == inputParams.getSelectedYear() && day.getMonth() == inputParams.getSelectedMonth()) {
final int xIndex = xLabels.size();
@@ -116,90 +104,22 @@ private LoadHistoryCompleteEvent getChartDataInDays(final LoadHistoryTaskParams
final Entry lineEntry = new Entry(previousTrend, xIndex);
// Here we set the optional data field on the Entry class. This gives the user the
- // ability to tap on a value in the LoadWeightsHistoryTask and be taken to that date
+ // ability to tap on a value in the WeightHistoryActivity and be taken to that date
lineEntry.setData(DateUtil.convertDayToDate(day));
lineEntries.add(lineEntry);
}
- progressListener.updateProgressBar(i + 1, numDaysOfWeights);
+ progressListener.updateProgressBar(i + 1, numDaysOfHistory);
}
- final LoadHistoryCompleteEvent weightHistory = createCompleteEvent(createLineAndBarData(xLabels, lineEntries, barEntries), TimeScale.DAYS);
+ final LoadHistoryCompleteEvent weightHistory = createCompleteEvent(createLineAndBarData(xLabels, lineEntries, barEntries));
weightHistory.setMinVal(minWeight);
weightHistory.setMaxVal(maxWeight);
return weightHistory;
}
- private LoadHistoryCompleteEvent getChartDataInMonths(final LoadHistoryTaskParams inputParams) {
- int i = 0;
-
- int year = inputParams.getSelectedYear();
- int monthOneBased = 1;
-
- final List xLabels = new ArrayList<>();
- final List lineEntries = new ArrayList<>();
-
- while (monthOneBased <= MONTHS_IN_YEAR) {
- final float averageWeightInMonth = Weights.getAverageWeightInMonth(year, monthOneBased);
-
- Timber.d("getChartDataInMonths: year [%s], monthOneBased [%s], average weight [%s]",
- year, monthOneBased, averageWeightInMonth);
-
- if (averageWeightInMonth > 0) {
- final int xIndex = xLabels.size();
-
- xLabels.add(DateUtil.getShortNameOfMonth(monthOneBased));
-
- lineEntries.add(new Entry(averageWeightInMonth, xIndex));
- }
-
- monthOneBased++;
-
- progressListener.updateProgressBar(i++, MONTHS_IN_YEAR);
- }
-
- return createCompleteEvent(createLineData(xLabels, lineEntries), TimeScale.MONTHS);
- }
-
- private LoadHistoryCompleteEvent getChartDataInYears() {
- final Day firstDay = Day.getFirstDay();
- final int firstYear = firstDay.getYear();
- Timber.d("getChartDataInYears: firstYear [%s]", firstYear);
-
- final int currentYear = DateUtil.getCurrentYear();
- Timber.d("getChartDataInYears: currentYear [%s]", currentYear);
-
- final int numYears = currentYear - firstYear;
- int i = 0;
-
- int year = firstYear;
-
- final List xLabels = new ArrayList<>();
- final List lineEntries = new ArrayList<>();
-
- while (year <= currentYear) {
- final int xIndex = xLabels.size();
-
- xLabels.add(String.valueOf(year));
-
- final float averageWeightInYear = Weights.getAverageWeightInYear(year);
-
- Timber.d("getChartDataInYears: year [%s], average weight [%s]",
- year, averageWeightInYear);
-
- lineEntries.add(new Entry(averageWeightInYear, xIndex));
-
- year++;
-
- progressListener.updateProgressBar(i++, numYears);
- }
-
- return createCompleteEvent(createLineData(xLabels, lineEntries), TimeScale.YEARS);
- }
-
- private LoadHistoryCompleteEvent createCompleteEvent(final CombinedData combinedData,
- @TimeScale.Interface final int timeScale) {
- return new LoadHistoryCompleteEvent(combinedData, timeScale);
+ private LoadHistoryCompleteEvent createCompleteEvent(final CombinedData combinedData) {
+ return new LoadHistoryCompleteEvent(combinedData, inputParams.getTimeScale());
}
private CombinedData createLineAndBarData(List xLabels, List lineEntries, List barEntries) {
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/StreakTaskInput.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/StreakTaskInput.java
index 14f1a834..db4e9ee5 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/StreakTaskInput.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/task/StreakTaskInput.java
@@ -19,10 +19,16 @@ Day getStartingDay() {
}
public Food getFood() {
- return (Food) rda;
+ if (rda instanceof Food) {
+ return (Food) rda;
+ }
+ return null;
}
public Tweak getTweak() {
- return (Tweak) rda;
+ if (rda instanceof Tweak) {
+ return (Tweak) rda;
+ }
+ return null;
}
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/TaskRunner.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/TaskRunner.java
index bc358ea7..07e4c59f 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/TaskRunner.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/task/TaskRunner.java
@@ -13,7 +13,7 @@ public class TaskRunner {
public void executeAsync(CustomCallable callable) {
try {
callable.setUiForLoading();
- executor.execute(new RunnableTask(handler, callable));
+ executor.execute(new RunnableTask<>(handler, callable));
} catch (Exception e) {
e.printStackTrace();
}
@@ -32,7 +32,7 @@ public RunnableTask(Handler handler, CustomCallable callable) {
public void run() {
try {
final R result = callable.call();
- handler.post(new RunnableTaskForHandler(callable, result));
+ handler.post(new RunnableTaskForHandler<>(callable, result));
} catch (Exception e) {
e.printStackTrace();
}
@@ -40,8 +40,8 @@ public void run() {
}
public static class RunnableTaskForHandler implements Runnable {
- private CustomCallable callable;
- private R result;
+ private final CustomCallable callable;
+ private final R result;
public RunnableTaskForHandler(CustomCallable callable, R result) {
this.callable = callable;
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/task/params/LoadHistoryTaskParams.java b/app/src/main/java/org/nutritionfacts/dailydozen/task/params/LoadHistoryTaskParams.java
index 45ac58c9..7d6e1d2e 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/task/params/LoadHistoryTaskParams.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/task/params/LoadHistoryTaskParams.java
@@ -1,20 +1,30 @@
package org.nutritionfacts.dailydozen.task.params;
+import org.nutritionfacts.dailydozen.model.enums.HistoryType;
import org.nutritionfacts.dailydozen.model.enums.TimeScale;
public class LoadHistoryTaskParams {
+ @HistoryType.Interface
+ private final int historyType;
+
@TimeScale.Interface
- private int timeScale;
+ private final int timeScale;
- private int selectedYear;
- private int selectedMonth;
+ private final int selectedYear;
+ private final int selectedMonth;
- public LoadHistoryTaskParams(@TimeScale.Interface int timeScale, int selectedYear, int selectedMonth) {
+ public LoadHistoryTaskParams(@HistoryType.Interface int historyType, @TimeScale.Interface int timeScale, int selectedYear, int selectedMonth) {
+ this.historyType = historyType;
this.timeScale = timeScale;
this.selectedYear = selectedYear;
this.selectedMonth = selectedMonth;
}
+ @HistoryType.Interface
+ public int getHistoryType() {
+ return historyType;
+ }
+
@TimeScale.Interface
public int getTimeScale() {
return timeScale;
@@ -27,5 +37,4 @@ public int getSelectedYear() {
public int getSelectedMonth() {
return selectedMonth;
}
-
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/util/DateUtil.java b/app/src/main/java/org/nutritionfacts/dailydozen/util/DateUtil.java
index 95e7ba59..27871054 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/util/DateUtil.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/util/DateUtil.java
@@ -27,6 +27,7 @@ public static Calendar getCalendarForYearAndMonth(final int year, final int mont
final Calendar cal = getCalendarForToday();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, monthZeroBased);
+ cal.set(Calendar.DAY_OF_MONTH, 1);
return cal;
}
diff --git a/app/src/main/java/org/nutritionfacts/dailydozen/widget/RDACheckBoxes.java b/app/src/main/java/org/nutritionfacts/dailydozen/widget/RDACheckBoxes.java
index fc30ba32..03ac166c 100644
--- a/app/src/main/java/org/nutritionfacts/dailydozen/widget/RDACheckBoxes.java
+++ b/app/src/main/java/org/nutritionfacts/dailydozen/widget/RDACheckBoxes.java
@@ -15,7 +15,6 @@
import org.nutritionfacts.dailydozen.model.Tweak;
import org.nutritionfacts.dailydozen.model.TweakServings;
import org.nutritionfacts.dailydozen.task.CalculateStreakTask;
-import org.nutritionfacts.dailydozen.task.CalculateTweakStreakTask;
import org.nutritionfacts.dailydozen.task.StreakTaskInput;
import org.nutritionfacts.dailydozen.task.TaskRunner;
import org.nutritionfacts.dailydozen.view.ServingCheckBox;
@@ -183,6 +182,6 @@ private void onServingsChanged() {
}
private void onTweakServingsChanged() {
- new TaskRunner().executeAsync(new CalculateTweakStreakTask(new StreakTaskInput(day, rda)));
+ new TaskRunner().executeAsync(new CalculateStreakTask(new StreakTaskInput(day, rda)));
}
}
diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml
index b7a87be5..178140e3 100644
--- a/app/src/main/res/layout/activity_history.xml
+++ b/app/src/main/res/layout/activity_history.xml
@@ -49,20 +49,20 @@
+ android:layout_height="wrap_content"
+ app:drawableLeftCompat="@drawable/legend_icon_less_than_recommended_servings"
+ app:drawableStartCompat="@drawable/legend_icon_less_than_recommended_servings" />
+ android:layout_height="wrap_content"
+ app:drawableStartCompat="@drawable/legend_icon_recommended_servings"
+ app:drawableLeftCompat="@drawable/legend_icon_recommended_servings" />
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index d0213d84..a8ef816d 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -67,8 +67,8 @@
Моля, дайте ни обратна връзка в Google Play Store.
Изпратете обратна информация
Пропусни
- версия %s
- %d дни
+ версия %s
+ %d дни
Напомняне за Daily Dozen
Актуализиране на вашите порции за днес
Настройки за напомняне
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 9eba11f9..6333745f 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -39,8 +39,8 @@
Zu erstellender Verlauf
Verlauf
Blattgemüse
- Version %s
- %d Tage
+ Version %1$s
+ %1$d Tage
Lebensmittelinfo
Lebensmittel-Verlauf
Leinsamen
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 1d6e7f74..24d8fa39 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -67,8 +67,8 @@
Παρακαλώ δώστε μας τα σχόλιά στο Play Store.
Αποστολή σχολίων
Όχι τώρα
- εκδοχή %s
- %d ημέρες
+ εκδοχή %1$s
+ %1$d ημέρες
Υπενθύμιση Daily Dozen
Ενημερώστε τις μερίδες σας για σήμερα
Ρυθμίσεις Καθημερινής Υπενθύμισης
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index c238e50f..171ae42a 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -67,8 +67,8 @@
Danos tu opinión en la Play Store.
Dar mi opinión
Ahora no
- versión %s
- %d días
+ versión %1$s
+ %1$d días
Recordatorio de la Docena Diaria
Actualiza las porciones de hoy
Ajustes del recordatorio diario
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 687c2414..3b80d95f 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -68,8 +68,8 @@
Veuillez nous faire part de vos commentaires dans le Play Store.
Envoyer un commentaire
Pas maintenant
- version %s
- %d jours
+ version %1$s
+ %1$d jours
Rappel journalier
Mettez à jour vos portions pour aujourd\'hui
Paramètres du rappel quotidien
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index ba830c28..8cf1ad9e 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -67,8 +67,8 @@
Vi preghiamo di darci un feedback nel Play Store.
Dare un feedback
Non adesso
- versione %s
- %d giorni
+ versione %1$s
+ %1$d giorni
Promemoria quotidiano Dozen
Aggiorna le tue porzioni di oggi
Impostazioni promemoria quotidiano
@@ -654,7 +654,7 @@
Sia aumentando la viscosità o il numero di masticazioni, sia diminuendo la dimensione del morso e il tasso di consumo, dozzine di studi hanno dimostrato che, indipendentemente dal modo in cui aumentiamo la quantità di tempo in cui il cibo è in bocca, può portare a un ridotto apporto calorico. Quindi prolunga la durata del pasto ad almeno venti minuti per consentire ai segnali di sazietà naturale di avere pieno effetto. Come? Scegliendo cibi che richiedono più tempo per mangiarli e mangiarli in un modo che prolunga il tempo che rimangono in bocca. Pensa a cibi più voluminosi, più duri e più masticatori nei morsi più piccoli e ben masticati.
Come notato nella sezione Soppressione dell\'appetito, una revisione sistematica e una meta-analisi di studi randomizzati e controllati sulla perdita di peso hanno scoperto che circa un quarto di cucchiaino di cumino nero in polvere ogni giorno sembra ridurre l\'indice di massa corporea nell\'arco di un paio di mesi. Si noti che il cumino nero è diverso dal cumino normale, per il quale il dosaggio è diverso.
Studi randomizzati, in doppio cieco, controllati con placebo hanno scoperto che appena un cucchiaino da tè di aglio in polvere ogni giorno può ridurre il grasso corporeo ad un costo di forse due centesimi al giorno.
- Studi randomizzati e controllati hanno scoperto che ¼ di cucchiaino da tè a 1/2 cucchiaino da tè al giorno di zenzero macinato ha ridotto significativamente il peso corporeo per pochi centesimi al giorno. Può essere facile come mescolare la spezia macinata in una tazza di acqua calda. Nota: lo zenzero potrebbe funzionare meglio al mattino che alla sera. Il tè Chai è un modo gustoso di combinare i trucchi di tè verde e zenzero in un\'unica bevanda. In alternativa, per l\'attivazione delle BAT, puoi aggiungere un peperoncino jalapeño crudo o mezzo cucchiaino di polvere di peperoncino (o, presumibilmente, scaglie di peperoncino tritato) nella tua dieta quotidiana. Per aiutare a combattere il caldo, puoi affettare sottilmente o tritare finemente il jalapeño per ridurne il morso a piccoli aculei o mescolare il peperoncino in zuppa o il frullato vegetale intero che ho presentato in uno dei miei video di cucina su NutritionFacts.org .
+
Due cucchiaini di lievito alimentare, di birra o di lievito alimentare contengono all\'incirca la quantità di beta 1,3 / 1,6 glucani trovati in studi clinici randomizzati, in doppio cieco, controllati con placebo per facilitare la perdita di peso.
Le donne in sovrappeso sono state randomizzate ad aggiungere mezzo cucchiaino di cumino ai loro pranzi e le cene hanno battuto il gruppo di controllo di altri quattro chili e un centimetro in più dai loro fianchi. Ci sono anche prove a sostegno dell\'uso dello zafferano di spezie, ma un pizzico al giorno costerebbe un dollaro, mentre un cucchiaino di cumino costa meno di dieci centesimi.
Bere tre tazze al giorno tra i pasti (attendere almeno un\'ora dopo i pasti in modo da non interferire con l\'assorbimento del ferro). Durante i pasti, bere acqua, caffè nero o tè all\'ibisco mescolato 6: 1 con verbena al limone, ma non superare mai tre tazze di liquido all\'ora (importante dato il mio consiglio di precarico dell\'acqua). Sfrutta l\'effetto rinforzante della caffeina bevendo il tuo tè verde insieme a qualcosa di sano che vorresti ti piacesse di più, ma non consumare grandi quantità di caffeina entro sei ore prima di coricarsi. Prendere il tè senza dolcificante è la cosa migliore, ma se in genere addolcisci il tè con miele o zucchero, prova invece lo sciroppo di yacon.
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 6ea18798..ce8e74db 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -66,8 +66,8 @@
Zostaw nam opinię w sklepie Play.
Zostaw opinię
Nie teraz
- wersja %s
- %d dni
+ wersja %1$s
+ %1$d dni
Przypomnienie Codzienny Tuzin
Zaktualizuj swoje dzisiejsze porcje
Ustawienia codziennych przypomnień
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 24e1ff38..55766bc9 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -67,8 +67,8 @@
Por favor, dê-nos feedback na Play Store.
Deixar Feedback
Agora não
- versão %s
- %d dias
+ versão %1$s
+ %1$d dias
Lembrete do Daily Dozen
Atualize as suas porções de hoje
Configurações do Lembrete Diário
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 29404725..e97d085d 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -68,8 +68,8 @@
Spuneți-ne părerea în Magazinul Play.
Trimiteți părerea
Nu acum
- versiune %s
- %d zile
+ versiune %1$s
+ %1$d zile
Daily Dozen memento
Actualizați-vă porțile pentru ziua de azi
Setările pentru mementourile zilnice
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index f2f2d1f3..5cfeff0d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -68,8 +68,8 @@
Ждём Ваших отзывов в Play Store.
Оставить Отзыв
Не Сейчас
- версия %s
- %d дней
+ версия %1$s
+ %1$d дней
Напоминания Daily Dozen
Отметь сегодняшние порции
Настройки Ежедневных Напоминаний
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 2231d477..963969df 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -67,8 +67,8 @@
請在應用程式商店中給我們指教。
我有意見
稍後再說
- 版本 %s
- %d 天
+ 版本 %1$s
+ %1$d 天
每日十二要素提醒
更新您的今日份量
每日提醒設定
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 34304f41..2bc3dcfa 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -109,8 +109,8 @@
Please give us feedback in the Play Store.
Give Feedback
Not Now
- version %s
- %d days
+ version %1$s
+ %1$d days
Daily Dozen Reminder
Update your servings for today
Daily Reminder Settings
diff --git a/build.gradle b/build.gradle
index b37f1b28..0faffdc0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,9 +6,9 @@ buildscript {
google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.2.1'
- classpath 'com.google.gms:google-services:4.3.8'
- classpath 'com.google.firebase:firebase-crashlytics-gradle:2.6.1'
+ classpath 'com.android.tools.build:gradle:4.2.2'
+ classpath 'com.google.gms:google-services:4.3.10'
+ classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files