This repository holds the complete code for the CattleLog Android app, albeit with the redaction of all API keys, credentials, and private cattle records. The primary goals of CattleLog are to (1) provide employees of the VanWagner Family Farm with an efficient method of cattle record lookup via an intuitive user interface and (2) display requested cattle records in an aesthetically pleasing, organized manner.
If the code in this repository is compiled and executed, it will display data from a representative, toy database, which is available at https://github.com/Camoen/CattleLog-File-Processor-Public/blob/master/cattlelog_database.db.
A video demonstration of the app is available on YouTube: https://youtu.be/n9yGcRzhoyQ
Beyond the development of this Android app, existing farm data was processed, stored in a database format, and uploaded to a remote repository, where it could be accessed from within CattleLog. This preprocessing functionality was packaged as a reusable executable, called CattleLog File Processor, which allows the farm's record keeper to update CattleLog's backend database as often as necessary.
The main screen after startup displays a scrollable list of all cattle on the farm, ordered by tag number (denoted “Number”). Specific animals can be searched for by tag number, metal tag number, or barn name. Search values may be provided by the user either manually or vocally. The list of cattle is filtered in real time based on the input search value. Tapping on any row will result in the display of an animal's details.
Main Screen | Main Screen Search |
Another list view is available under the Heats tab. This scrollable list displays all cattle with a “next expected heat” date in a given range, as defined by the Next Expected Heats Query. In this view, results are ordered by next expected heat date, denoted “Heat Date”, and animals can be searched for by tag number or service sire. The list of cattle is filtered in real time based on the input search value. Tapping on any row will result in the display of an animal's details.
Heats List (screenshot taken on Nov. 15th)
Since heat cycles are not exact, it’s helpful to show all expected heats within a few days’ range of the current day (before and after). The date range specified by the app’s end users was “3 days before and after”. However, due to the unique way in which data is generated for CattleLog's backend, whenever the backend database is updated, all Next Expected Heat (NEH) dates prior to the current day are lost. For example, if the database is updated on January 4th, all NEH dates up to and including January 3rd are lost.
To account for this, CattleLog's getNextExpectedHeatsPreset
query returns all NEH dates between 3 days before and after the current day, but also includes all NEH dates between 18 and 21 days from the current day (an offset of one heat cycle, to account for any “before” dates that were lost in the database update). See the table below for an illustrative example of this query’s logic.
In this example, the "Heats" list is accessed on the 4th. The getNextExpectedHeatsPreset
query returns all cattle with a NEH date on the 1st through the 7th, plus all cattle with a NEH date on the 22nd through the 25th (between 18 and 21 days from the current day). These cattle are then used to populate the "Heats" list. To fully understand the logic behind this query, assume that the backend database was updated on the 3rd, resulting in the removal of all NEH dates on the 1st and 2nd. In the backend, these dates have simply been pushed forward one heat cycle, or 21 days. To account for these "lost" NEH dates, the query also returns NEH dates on the 22nd and 23rd (the 1st + 21 days and the 2nd + 21 days, respectively).
The code for the getNextExpectedHeatsPreset
query:
select * from (
select * from cattle
where DATE(NextExpHeat)
BETWEEN DATE(datetime('now','localtime', '-3 day'))
AND DATE(datetime('now','localtime', '3 day'))
UNION
select * from cattle
where DATE(NextExpHeat)
BETWEEN DATE(datetime('now','localtime', '18 day'))
AND DATE(datetime('now','localtime', '21 day'))
) ORDER BY DATE(NextExpHeat) ASC;
This tab displays an animal's identification details, genetic/heritage data, and reproduction information. The tab's layout was based on end user specifications, with the most important data near the top. Note that the four most important attributes ("Next Expected Heat Date", "Times Bred / Date", "Service Sire", and "Due Date") are larger, for improved readability. This tab also contains 10 user-defined fields; these fields may be modified in the future, as decided by the farm's record-keeper. Due to the fluctuating nature of the user-defined fields, a description for each is provided at the bottom of the tab (the descriptions are also easily updated by the farm's record-keeper). Data for this tab is provided by a combination of three input files (Report 1.csv
, Report 2.csv
, and Treatments.xls
, examples of which are available here: https://github.com/Camoen/CattleLog-File-Processor-Public/tree/master/Project%20Files)
Overview Tab (Top) | Overview Tab (Middle) | Overview Tab (Bottom) |
This tab contains a scrollable list of an animal's health events, such as medications, births, weanings, etc. More detail for some events may be provided in the Treatment Tab. Data for this tab is provided by an automatically generated CSV report (example provided at https://github.com/Camoen/CattleLog-File-Processor-Public/blob/master/Project%20Files/Report%203.csv).
Animal Details - Health Tab | Animal Details - Health Tab (cont.) |
This tab contains a scrollable list of an animal's treatments. This tab may provide a more detailed overview for specific events in the Health Tab. Data for this tab is provided by a manually generated XLS workbook (example provided at https://github.com/Camoen/CattleLog-File-Processor-Public/blob/master/Project%20Files/Treatments.xls).