Download Latest Version ExpiryManager-2.0.3.apk (6.8 MB)
Email in envelope

Get an email when there's a new version of ExpiryWatcher

Name Modified Size InfoDownloads / Week
Parent folder
ExpiryManager-0.1.2-sign-key.asc 2026-08-07 3.2 kB
README.md 2026-08-07 3.3 kB
ExpiryManager-0.1.2.apk 2026-08-07 6.7 MB
ExpiryManager-0.1.2.apk.asc 2026-08-07 488 Bytes
ExpiryManager-src-0.1.2.tar.gz 2026-08-07 83.3 kB
ExpiryManager-src-0.1.2.tar.gz.asc 2026-08-07 488 Bytes
Totals: 6 Items   6.7 MB 0

Expiry Manager

An Android app for tracking products (groceries, medicine, etc.) and documents (like ID cards) by expiry date.

Author: Bogdan Drozdowski, bogdro (at) users . sourceforge . net

License: GPLv3+

Project homepage: https://expirywatcher.sourceforge.io/.

Features

  • Main list of products sorted by expiry date, soonest first.
  • Add/edit screen for name, type, quantity + unit, and expiry date.
  • Barcode scanning (via ZXing embedded) that remembers and pre-fills the last-used name/type/quantity/unit for a given barcode (the expiry date is always entered fresh, since it's per-batch).
  • Export the full product list as a SQLite file through the Android share sheet.
  • Import a previously exported SQLite file, replacing the current list (with validation, a safety backup of the current data, and rollback on failure).
  • Daily expiry reminder notifications with a configurable lead time.

Tech stack

  • Java, minSdk 26 (Android 8.0+)
  • MVVM: Activity/Fragment + ViewModel + LiveData + Repository
  • Room for persistence (also doubles as the export/import file format — see below)
  • WorkManager for the daily expiry check
  • zxing-android-embedded for barcode scanning (no Google Play Services dependency)

Building

./gradlew assembleDebug

Requires an Android SDK (compileSdk/targetSdk 34) available via local.properties or the ANDROID_HOME/ANDROID_SDK_ROOT environment variable — set up automatically if you open the project in Android Studio.

Running tests

./gradlew connectedAndroidTest

Room DAO tests live under app/src/androidTest and run against an in-memory database on a connected device/emulator.

Project layout

app/src/main/java/bogdrosoft/expirymanager/
  data/            Room entities, DAOs, database, type converters
  repository/       ProductRepository — single source of truth for the UI layer
  ui/main/          Product list screen
  ui/addedit/       Add/edit product screen
  ui/settings/      Reminder lead-time and notification settings
  scan/             Barcode scanning helper (ZXing + CAMERA permission flow)
  export/           SQLite export (share sheet) and import (validate/backup/swap/rollback)
  reminder/         WorkManager expiry check, notifications, permission handling
  util/             Shared constants and SharedPreferences helpers

Notes on export/import

The Room database uses TRUNCATE journal mode rather than the default WAL, so the on-disk .db file is always a complete, single-file snapshot — no separate -wal/-shm files and no manual checkpoint step needed before copying it for export.

Import validates the picked file's schema (via the raw SQLite API, not Room) before touching anything, backs up the current database, and restores that backup automatically if the swap fails for any reason. On success, the app relaunches itself in a fresh process — Room's LiveData is bound to the connection it was created with, so this avoids stale in-memory state after swapping the underlying file.

Source: README.md, updated 2026-08-07