Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v28 #258

Draft
wants to merge 31 commits into
base: master
Choose a base branch
from
Draft

v28 #258

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
89fdbd4
Upgrade gradle to latest version
slavick Oct 17, 2024
e6b6835
Upgrade firebase dependencies
slavick Oct 17, 2024
b6410e6
Increase minSdkVersion from 21 to 26 to get access to java.time
slavick Oct 17, 2024
fd973bc
Replace com.darwinsys:hirondelle-date4j with java.time
slavick Oct 18, 2024
8b7d501
Refactor to use LocalDate instead of LocalDateTime
slavick Oct 19, 2024
6b67b97
Remove date4j license mentions
slavick Oct 19, 2024
a02bb95
Fix "can be replaced with 'List.sort()'" warnings
slavick Oct 19, 2024
ee265a2
Fix code warning
slavick Oct 19, 2024
2561037
Fix warnings caused by increasing minSdkVersion to 26
slavick Oct 19, 2024
8eacb70
Enable automatic per-app language preference support by following htt…
slavick Oct 19, 2024
5063f53
Remove unused imports
slavick Oct 20, 2024
892a1a1
Remove default zone id args
slavick Oct 21, 2024
dab421b
Deduplicate DateTimeFormatters and remove default locale args
slavick Oct 21, 2024
d70c55b
Update firebase-crashlytics
slavick Oct 27, 2024
898ab1e
Change format from "day of year" to "day of month"
slavick Oct 30, 2024
357d4ff
Upgrade to latest gradle
slavick Nov 2, 2024
e7edcf9
Remove getMonthNum in favor of getMonthValue
slavick Nov 2, 2024
a8c3096
Fix build.gradle warnings
slavick Nov 2, 2024
10e7950
Improve performance of getDaysAfter by removing unnecessary type conv…
slavick Nov 3, 2024
ab8f15a
Calculate streaks during restore
slavick Nov 3, 2024
20e4435
Use date long instead of string
slavick Nov 3, 2024
cb140f0
Simplify recalculateStreak
slavick Nov 3, 2024
c4cedf1
Update versionCode and versionName
slavick Nov 3, 2024
8286c3e
Replace deprecated `androidx.viewpager.widget.ViewPager` with `androi…
slavick Nov 10, 2024
b1b26e6
Replace deprecated function call
slavick Nov 10, 2024
022aab9
Undo changes to fragment_tweaks.xml
slavick Nov 10, 2024
d74b55b
Remove deprecated ProgressDialogs from history activities. Not replac…
slavick Nov 11, 2024
4b67c80
Replace ProgressDialog with ProgressBar
slavick Nov 11, 2024
14a0b88
Simplify day change detection algorithm
slavick Nov 30, 2024
0f70e1f
Add loading indicator when changing time scale
slavick Dec 6, 2024
150345e
Call recreate to fix rendering issue after backing up data
slavick Dec 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ configurations {
}

android {
androidResources {
generateLocaleConfig = true
}
buildFeatures {
buildConfig = true
viewBinding = true
Expand All @@ -30,13 +33,13 @@ android {
}
defaultConfig {
applicationId "org.nutritionfacts.dailydozen"
minSdkVersion 21
minSdkVersion 26
multiDexEnabled true
compileSdk 34
targetSdkVersion 34
vectorDrawables.useSupportLibrary = true
versionCode 91
versionName "27"
versionCode 92
versionName "28"
}
buildTypes {
debug {
Expand All @@ -50,7 +53,7 @@ android {
}
}

flavorDimensions "store"
flavorDimensions = ["store"]
productFlavors {
play {
dimension "store"
Expand All @@ -63,13 +66,13 @@ android {
}

dependencies {
implementation 'com.google.firebase:firebase-analytics:22.1.0'
implementation 'com.google.firebase:firebase-crashlytics:19.1.0'
implementation 'com.google.firebase:firebase-analytics:22.1.2'
implementation 'com.google.firebase:firebase-crashlytics:19.2.1'
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.1.0'
implementation 'com.google.android.material:material:1.12.0'
implementation fileTree(include: ['*.jar'], dir: 'libs')
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" }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.nutritionfacts.dailydozen.activity;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
Expand All @@ -25,8 +24,6 @@
public class DebugActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener, ProgressListener {
private ActivityDebugBinding binding;

private ProgressDialog progressDialog;

private int historyToGenerate;

@Override
Expand Down Expand Up @@ -144,29 +141,19 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis

@Override
public void showProgressBar(int titleId) {
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle(titleId);
progressDialog.show();
binding.debugProgressBarContainer.setVisibility(View.VISIBLE);
binding.debugProgressText.setText(titleId);
binding.debugProgressBar.setProgress(0);
}

@Override
public void updateProgressBar(int current, int total) {
progressDialog.setProgress(current);
progressDialog.setMax(total);
binding.debugProgressBar.setProgress(current);
binding.debugProgressBar.setMax(total);
}

@Override
public void hideProgressBar() {
try {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
} catch (Exception e) {
Timber.e("hideProgressBar: Exception while trying to dismiss progress dialog");
} finally {
progressDialog = null;
}
binding.debugProgressBarContainer.setVisibility(View.GONE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.nutritionfacts.dailydozen.util.CalendarHistoryDecorator;
import org.nutritionfacts.dailydozen.util.DateUtil;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
Expand All @@ -29,16 +30,14 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import hirondelle.date4j.DateTime;

public class HistoryActivity extends InfoActivity {
private ActivityHistoryBinding binding;

private boolean isFoodHistory = false;

private final Set<String> loadedMonths = new HashSet<>();
private List<DateTime> fullServingsDates;
private List<DateTime> partialServingsDates;
private List<LocalDate> fullServingsDates;
private List<LocalDate> partialServingsDates;

@SuppressWarnings("unchecked")
@Override
Expand All @@ -50,8 +49,8 @@ protected void onCreate(Bundle savedInstanceState) {
fullServingsDates = new ArrayList<>();
partialServingsDates = new ArrayList<>();
if (savedInstanceState != null) {
fullServingsDates = (ArrayList<DateTime>) savedInstanceState.getSerializable(Args.DATES_WITH_FULL_SERVINGS);
partialServingsDates = (ArrayList<DateTime>) savedInstanceState.getSerializable(Args.DATES_WITH_PARTIAL_SERVINGS);
fullServingsDates = (ArrayList<LocalDate>) savedInstanceState.getSerializable(Args.DATES_WITH_FULL_SERVINGS);
partialServingsDates = (ArrayList<LocalDate>) savedInstanceState.getSerializable(Args.DATES_WITH_PARTIAL_SERVINGS);
}

displayHistory();
Expand Down Expand Up @@ -116,9 +115,9 @@ private void displayEntriesForVisibleMonths(final Calendar cal, final long id) {

for (Map.Entry<Day, Boolean> serving : servings.entrySet()) {
if (serving.getValue()) {
fullServingsDates.add(serving.getKey().getDateTime());
fullServingsDates.add(serving.getKey().getDate());
} else {
partialServingsDates.add(serving.getKey().getDateTime());
partialServingsDates.add(serving.getKey().getDate());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package org.nutritionfacts.dailydozen.activity;

import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import org.greenrobot.eventbus.Subscribe;
import org.nutritionfacts.dailydozen.Args;
Expand All @@ -42,23 +40,18 @@
import org.nutritionfacts.dailydozen.util.NotificationUtil;

import java.io.File;
import java.time.LocalDate;
import java.util.Date;

import hirondelle.date4j.DateTime;
import timber.log.Timber;

public class MainActivity extends AppCompatActivity implements ProgressListener {
private static final String ALREADY_HANDLED_RESTORE_INTENT = "already_handled_restore_intent";

private ActivityMainBinding binding;

private ProgressDialog progressDialog;

private MenuItem menuToggleModes;

private Handler dayChangeHandler;
private Runnable dayChangeRunnable;

private int daysSinceEpoch;

private boolean alreadyHandledRestoreIntent;
Expand All @@ -72,7 +65,6 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(binding.getRoot());

initDatePager();
initDatePagerIndicator();

calculateStreaksAfterDatabaseUpgradeToV2();

Expand Down Expand Up @@ -115,29 +107,20 @@ protected void onResume() {

NotificationUtil.dismissUpdateReminderNotification(this);

// If the app is sent to the background and brought back to the foreground the next day, a crash results when
// the adapter is found to return a different value from getCount() without notifyDataSetChanged() having been
// called first. This is an attempt to fix that, but I am not sure that it works.
// This bug was found by entering some data before bed and then bringing the app back to the foreground in the
// morning to enter data. The app crashed immediately.
// Solutions tried: datePagerAdapter.notifyDataSetChanged() did not work
// If the app is sent to the background and brought back to the foreground the next day,
// this code will change to today's date.
if (daysSinceEpoch < Day.getNumDaysSinceEpoch()) {
// Reset user selection so today's date is selected
binding.datePager.setCurrentItem(0);
initDatePager();
Bus.displayLatestDate();
}

startDayChangeHandler();

checkIfOpenedForRestore(getIntent());
}

@Override
protected void onPause() {
super.onPause();
Bus.unregister(this);

stopDayChangeHandler();
}

@Override
Expand Down Expand Up @@ -258,7 +241,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
break;
case Args.SELECTABLE_DATE_REQUEST:
if (data != null && data.hasExtra(Args.DATE)) {
setDatePagerDate(DateUtil.convertDateToDateTime((Date) data.getSerializableExtra(Args.DATE)));
setDatePagerDate(DateUtil.convertToLocalDate((Date) data.getSerializableExtra(Args.DATE)));
}
break;
}
Expand All @@ -268,24 +251,15 @@ private void initDatePager() {
// Record user's current date selection (value is 0 when unset)
int origDate = binding.datePager.getCurrentItem();

final FragmentStatePagerAdapter pagerAdapter;

pagerAdapter = new DatePagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT, inDailyDozenMode);
final FragmentStateAdapter pagerAdapter = new DatePagerAdapter(getSupportFragmentManager(), getLifecycle(), inDailyDozenMode);

binding.datePager.setAdapter(pagerAdapter);
daysSinceEpoch = pagerAdapter.getCount();
daysSinceEpoch = pagerAdapter.getItemCount();

// Maintain user's selected date when switching adapters
binding.datePager.setCurrentItem(origDate != 0 ? origDate : daysSinceEpoch, false);
}

private void initDatePagerIndicator() {
binding.datePagerIndicator.setTextColor(ContextCompat.getColor(this, android.R.color.white));
binding.datePagerIndicator.setBackgroundResource(R.color.colorPrimary);
binding.datePagerIndicator.setTabIndicatorColorResource(R.color.colorAccent);
binding.datePagerIndicator.setDrawFullUnderline(false);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Expand Down Expand Up @@ -392,64 +366,34 @@ public void onEvent(CalculateStreaksTaskCompleteEvent event) {
}
}

private void startDayChangeHandler() {
if (dayChangeRunnable == null) {
dayChangeRunnable = () -> {
initDatePager();
startDayChangeHandler();
};
}

stopDayChangeHandler();

dayChangeHandler = new Handler();
dayChangeHandler.postDelayed(dayChangeRunnable, Day.getMillisUntilMidnight());
}

private void stopDayChangeHandler() {
if (dayChangeHandler != null && dayChangeRunnable != null) {
dayChangeHandler.removeCallbacks(dayChangeRunnable);
dayChangeHandler = null;
}
}

@Subscribe
public void onEvent(DisplayDateEvent event) {
setDatePagerDate(event.getDate());
}

private void setDatePagerDate(final DateTime dateTime) {
if (dateTime != null) {
Timber.d("Changing displayed date to %s", dateTime.toString());
binding.datePager.setCurrentItem(Day.getNumDaysSinceEpoch(dateTime));
private void setDatePagerDate(final LocalDate date) {
if (date != null) {
Timber.d("Changing displayed date to %s", date.toString());
binding.datePager.setCurrentItem(Day.getNumDaysSinceEpoch(date));
}
}

@Override
public void showProgressBar(int titleId) {
progressDialog = new ProgressDialog(this);
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setTitle(titleId);
progressDialog.show();
binding.progressBarContainer.setVisibility(View.VISIBLE);
binding.progressText.setText(titleId);
binding.progressBar.setProgress(0);
}

@Override
public void updateProgressBar(int current, int total) {
progressDialog.setProgress(current);
progressDialog.setMax(total);
binding.progressBar.setProgress(current);
binding.progressBar.setMax(total);
}

@Override
public void hideProgressBar() {
try {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
} catch (Exception e) {
Timber.e("hideProgressBar: Exception while trying to dismiss progress dialog");
} finally {
progressDialog = null;
}
binding.progressBarContainer.setVisibility(View.GONE);
this.recreate();
}
}
Loading