The PunctuOwlity Android app is the original version of the project — a native Java application using SQLite for persistent storage and Material Design components for the UI. It targets API 35 (Android 15) and supports devices back to API 21 (Android 5.0 Lollipop). The app declares theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/apursley2012/PunctuOwlity/llms.txt
Use this file to discover all available pages before exploring further.
SEND_SMS permission with telephony marked as optional (android:required="false"), so it installs and runs correctly on emulators and tablets that do not have a SIM card. This guide walks you through cloning the source, opening it in Android Studio, and running it on an emulator or physical device.
Prerequisites
- Android Studio — latest stable release (Hedgehog or newer recommended)
- JDK 11 or higher — the project sets
sourceCompatibilityandtargetCompatibilitytoJavaVersion.VERSION_11 - Android SDK with API 35 — install via Android Studio’s SDK Manager under SDK Platforms
- An emulator or USB-connected physical device running Android API 21 or higher
The project’s
build.gradle sets compileSdk 35, minSdk 21, and targetSdk 35. Make sure you have the API 35 platform installed in your SDK Manager before attempting to sync or build. The build file also applies the Kotlin Android and Kotlin Compose plugins, so Android Studio’s Kotlin support must be available even though the Activity source files are written in Java.Getting Started
Clone the repository
Clone the PunctuOwlity repository to your local machine:The Android source lives inside the
android-fixed-source/ directory. You do not need to open the root of the repository — Android Studio should be pointed directly at the Gradle project folder.Open the Android project in Android Studio
Launch Android Studio and choose File → Open (or Open from the Welcome screen). Navigate to:Select that folder and click OK. Android Studio will recognize the
build.gradle at the root of the module and treat it as a standard Gradle Android project.Wait for Gradle sync to complete
Android Studio will automatically begin a Gradle sync after the project opens. The sync downloads the declared dependencies —
appcompat, material, constraintlayout, gridlayout, lifecycle-runtime-ktx, and the Compose BOM — from Maven Central. This may take a minute or two on first run.Watch the Build panel at the bottom of Android Studio. When you see Gradle sync finished, the project is ready to build.If the sync fails with a missing SDK error, open File → Project Structure → SDK Location and confirm that the Android SDK path points to a valid installation that includes API 35.Select a run target and click Run
In the Android Studio toolbar, open the device dropdown (next to the run ▶ button) and select an existing AVD emulator or a connected physical device. If you need to create an emulator, go to Tools → Device Manager → Create Device and choose a phone profile with a system image at API 21 or higher.Click Run ▶ (or press
Shift+F10). Android Studio will compile the project, assemble a debug APK, install it on the selected device, and launch the app. The first screen you see will be the Login screen — LoginActivity is declared as the launcher activity in AndroidManifest.xml.Grant SMS permission when prompted
When
MainActivity starts, it immediately checks whether the SEND_SMS permission has already been granted by the OS. If the permission is not yet held, MainActivity launches SmsPermissionActivity before rendering the events grid. The app has declared android.permission.SEND_SMS in its manifest, and telephony hardware is marked android:required="false" so the app installs and runs on devices and emulators without cellular capability.- Tap Allow to trigger the Android system permission dialog. Once you grant the permission, the app proceeds to the events screen. Because the OS permission is now held,
MainActivitywill no longer launch this screen on future starts. - Tap Deny to proceed to the events screen without SMS alerts. Because the permission was never granted,
MainActivitywill check again and re-display this screen on every subsequent launch until you allow the permission.
Unlike the web app, the Android version does not store your SMS choice in a persistent preference — it reads the live OS permission state each time
MainActivity starts. Granting the permission is the only way to prevent the screen from appearing again.Create an account and add events
On the Login screen, tap Sign Up to open
SignupActivity. Enter a username and password, then tap Sign Up to create your account. The Android sign-up form collects a username (stored in the username column), a password, and a confirm-password field. Credentials are stored directly in the SQLite users table.Once logged in and past the SMS screen, you land on MainActivity — the events grid. Tap the floating + button to open AddEventActivity. Enter an event title, date, and time, then tap Save to write the record to the SQLite database. Your event will appear as a card in the two-column grid.Tap the edit icon on any card to reopen AddEventActivity pre-populated with that event’s data. Tap the delete icon to remove it permanently from the database.Package and Activity Reference
The application’s package name iscom.example.punctuowlityeventtracker. The five activities declared in AndroidManifest.xml are:
| Activity | Exported | Role |
|---|---|---|
LoginActivity | true (launcher) | Entry point — username + password login |
SignupActivity | false | New account registration |
SmsPermissionActivity | false | SMS permission request screen, shown from MainActivity when permission is not granted |
AddEventActivity | false | Add a new event or edit an existing one |
MainActivity | false | Events grid — browse, search, and manage events |
Database Schema
PunctuOwlity stores all data in a private SQLite database namedpunctuowlity.db, managed by the DatabaseHelper class (extends SQLiteOpenHelper). The database contains two tables:
DatabaseHelper exposes methods for inserting users (insertUser), authenticating (checkUser), and full CRUD on events (insertEvent, updateEvent, deleteEvent, getAllEvents, getEventById).
The SQLite database file
punctuowlity.db is private to the app’s data directory on the device (/data/data/com.example.punctuowlityeventtracker/databases/). It is not accessible to other apps and is removed when the app is uninstalled.