- Unchanged. Version number remains at v2.3.11
- Added
must_not_have_prompts_fileto theregister_loginendpoint to prevent creating a login for a user that already has a prompts file. - Improved logging.
- Added the ability to turn a
login_tokeninto alogin_hashtotoken_maker.py.
Technical Changes
- Device ID Generation: Implemented a more robust, unambiguous hex generator for internal device IDs.
- Admin Interface: Hidden advanced settings (Device ID configuration, "Dismiss Circle" toggle) by default. They can be revealed by tapping the "Admin Interface" title 5 times.
- Server Communication: The app now securely reports the
ANDROID_IDto the server during login.
Improvements
- Device Tracking:
- The
/register_loginendpoint now stores theandroid_idand maintains a history of logins per device in a newall/{device_id}sub-collection. - The
/directivesendpoint now logs the requestingdevice_idin the user's heartbeat data.
- The
New Features & Tools
- Statistics Generation: Added a new
statscommand tocreate_directive.pythat generates comprehensive user statistics from data dumps. - Tutorial Prompt Merging: Updated
apply_instructions_to_prompts.pyto support merging tutorial prompts from a separate JSON file.
Bug Fixes
- Login: Fixed a
flask-loginissue inhome_pagethat would make users unable to log in if they had an invalidremember_token. - Version Check: Fixed a bug so that the server side version check now correctly thinks v2.3.9 < v2.3.10.
Refactoring & Cleanup
- Code Cleanup: Removed several deprecated scripts (
dump_clips.py,phrases_to_prompts.py,upload_file.py,upload_mixed_prompts.py). - Lint: Addressed all lint warnings in python scripts.
Bug Fixes
- Save Endpoint Fix: Corrected a variable reference error in the
/saveendpoint that prevented prompt progress from being correctly updated. - Updated App version: The Android versionCode and versionName for the app hadn't been updated since v1.3.1 .
Technical Changes
- Enhanced Data Persistence: Improved
DataManagerwith thread-safe singleton initialization and locking for user settings and application status updates. - State Management: Refactored
AppStatusandUserSettingsretrieval to ensure reliable JSON parsing and consistent state synchronization with the persistent store.
New Features & User Interface
- Video Review Enhancements: The
/videopage now includes a "Show Clips" toggle, allowing administrators to preview individual clips directly in the browser with "Go to start/end" controls, or generateffplaycommands for local playback. - User Management Dashboard: Improved the
/userspage with color-coded heartbeat indicators (green for recent, blue for hours, purple for days, red for longer) to quickly assess user activity. - Registration Access: Added a direct "Register" link to the login page for easier account creation.
- Progress Tracking: Bug fix: The
/saveendpoint now tracks the maximum prompt index reached in each section, storing it inheartbeat/max_promptfor better progress monitoring.
Developer Tools
- Database Management: Added new commands to
create_directive.py(userData,saveDatabase,restoreUser,deleteUser) for backing up, restoring, and deleting user data, utilizing concurrent execution for performance. - Cleanup: Removed the deprecated
upload_apk.pyscript. - Documentation: Added technical summaries for both the Android app and
Python server to
README.md.
Refactoring
- Code Quality: Applied linting and improved docstrings across
main.pyandcreate_directive.py.
- Enhanced Security for Device Association: Implemented strict device ID checks during account attachment. The server now verifies if the requesting device matches the device ID previously associated with the username.
- Admin Override for Device ID: Added a "Remove previous device" option in the Admin Interface. This allows administrators to explicitly override the device ID mismatch error and associate a new device with an existing username.
- Accessibility: Added content descriptions to video player controls (Expand, Restart, Pause, Play) for better accessibility support.
- String Externalization: Extracted numerous hardcoded UI strings (Admin
interface labels, progress counters, error messages) into
strings.xmlfor better maintainability and localization support. - Progress Formatting: Improved the formatting of prompt progress indicators (e.g., "1 of 10", "50%").
- State Management Refactoring: Separated
overviewInstructionsShownstate into a newAppStatusclass, distinct fromUserSettings, to better categorize application state versus user preferences. - Robust Parsing: Added error handling for
PromptTypeparsing to default toTEXTif an unknown type is encountered.
New Features & User Interface
- Overview Instructions: Introduced a new global "Overview Instructions"
feature that can appear automatically for new users.
- Added an "Overview" button to the main Prompt Selection screen to review these instructions at any time.
- Instructions can now include an interactive Example Prompt in addition to text and video.
- Admin Controls: Added a "Reset Overview Instructions" button in the Admin settings to allow clearing the "viewed" status of instructions for testing or re-onboarding.
- Tablet Support: Improved layout constraints for the Prompt Selection screen on tablet devices.
Improvements & Internal Changes
- User Settings Storage: Migrated user preferences (like
enableDismissCountdownCircleand the newoverviewInstructionsShown) to a JSON-based storage format for better extensibility. - Data Parsing: Refactored
PromptsCollection,PromptsSection, andPromptparsing logic into dedicatedfromJsonfactory methods. - Resource Management: Updated the resource downloader to ensure assets for overview instructions and example prompts are properly cached.
- Dependencies: Added
kotlin-parcelizeplugin and updated the Android Gradle Plugin to8.13.1.
New Tools
- Instruction Management: Added
apply_instructions_to_prompts.py, a utility script to merge instruction data (including global overview and section-specific instructions) into prompt JSON files.
- App Version Enforcement: Implemented a mechanism to validate if the current app version is compatible with assigned prompts. The app now checks against server-side constraints and displays an incompatibility message if needed.
- Countdown Circle Logging: Dismissing the countdown circle now logs an event to the server for better tracking of user behavior.
- Directive Management: Added
setVersionRangeandlistUserscommands to the server'screate_directive.pytool to manage user version requirements and list registered users.
- Settings Architecture: Refactored Android
AppSettingsintoUserSettings(for preferences) andAppStatus(for system state) to better organize application data.
- Countdown Dismissal: Implemented a new feature to allow users to dismiss the countdown timer by tapping the circle. This feature is disabled by default.
- Admin Controls:
- Added a hidden mechanism (tapping the "Admin Interface" header 5 times) to enable the countdown dismissal feature.
- Added a "Disable Dismiss Circle" button to the Admin Interface to revert this setting.
- Settings Architecture: Introduced
AppSettingsto manage local app-specific settings, distinct from user prompts or global state. - Cleanup: Removed unused XML layout resources (
activity_load_data.xml).
New Features & User Interface
- Admin Interface Rework: The Admin interface has been completely rebuilt
using Jetpack Compose for a modern look and improved tablet/phone layouts. It
is now accessible via 3 taps on the app title in the Home Screen.
- Device ID and Username settings are now managed through dedicated input fields and buttons.
- Section Instructions: Introduced a new
InstructionsActivityto display section-specific instructions, which can include both text and video. - Prompt Selection Screen Redesign: The prompt selection screen has been redesigned with Jetpack Compose, featuring a cleaner interface and better handling of scrollable content for various screen sizes.
- Tablet Layout Enhancements: Improved adaptive layouts across the app for a better experience on tablet devices, including dynamic orientation settings and optimized component arrangements.
- Image Prompts with Text Flow: Integrated
TextFlowlibrary to intelligently wrap text around images in prompts, especially for smaller screens.
Improvements & Internal Changes
- Dependency Updates:
- Added
androidx.compose.material:material-icons-extended:1.7.8for additional UI icons. - Integrated
io.github.oleksandrbalan:textflow:1.2.1for advanced text layout capabilities.
- Added
- Data Manager Enhancements:
DataManagernow supports adefaultSectioninPromptsCollectionMetadata, allowing for pre-selection of a starting section.attachToAccountnow provides detailed error messages and automatically enables tutorial mode upon successful account attachment.- Improved robustness of prompt reloading and resource management, including parallel downloading of resources for efficiency.
- Upload Reliability: Introduced an
INTERRUPTEDstatus for uploads to better manage and communicate temporary upload failures. - Codebase Refactoring:
- Moved
LoadDataActivity,HomeScreenActivity, andPromptSelectActivityto thehomepackage, reflecting their updated roles. - Introduced
AdminViewModelfor better separation of concerns in the Admin interface logic. - Removed outdated XML layout files.
- Moved
- Copyright Update: Updated copyright year to 2025.
API Changes & Improvements
- Prompt File Requirement for Registration: The
/register_loginendpoint now supports amust_have_prompts_fileparameter, ensuring that new users have an associated prompts file before their login token is set. - User Authentication Feedback: The
is_authenticated_pageendpoint now returns the authenticated username for clearer status reporting.
Developer Tools
- Login Token Output: The
create_directive.pyscript now prints the generated login token in a structured JSON format.
- Countdown Dismissal: Reduced the number of taps required to dismiss the countdown circle from 5 to 3.
- State Persistence: Updated
DataManagerto ensure a default section is selected if one is not already set, and to guarantee that changes to the selected section are immediately saved to user preferences. - Code Refactoring: Extracted
ServerStatusandServerStateinto a dedicated file (ServerState.kt) and removed unused imports inHomeScreenActivity.
New Features & User Interface
- Redesigned Home Screen: The home screen (
HomeScreenActivity) has been completely refactored to use Jetpack Compose, offering a modern and more maintainable UI. This includes dynamic display of upload status and a more streamlined layout. - Configurable Countdown Circle: The
CountdownCirclenow supports an option to hide the countdown text.
Improvements & Internal Changes
- Dependency Updates:
- Updated
protobuf-javaliteto4.33.0. - Upgraded Compose UI version to
1.9.4. - Updated WorkManager to
2.11.0. - Added
androidx.lifecycle:lifecycle-viewmodel-composeandandroidx.compose.runtime:runtime-livedatafor better Compose integration. - Updated Kotlin version to
2.2.21. - Updated CameraX version to
1.5.1.
- Updated
- Enhanced Server Communication and Error Handling:
DataManagernow checks for active network connectivity before making server requests.- Introduced a new
ServerStateclass to provide more granular server connection status (e.g.,NO_INTERNET,NO_SERVER,SERVER_ERROR,NO_LOGIN,ACTIVE). - Improved the
pingServerlogic to use the/is_authenticatedendpoint for a more robust connection check. - Standardized error handling for server response codes across various
DataManagernetwork operations.
- Button Enhancements: The
PrimaryButtoncomposable now supports an optionalextraContentslot, allowing for embedded UI elements like the countdown circle. - String Resource Updates: Added new string resources for more detailed server status messages, upload progress, and updated existing messages in various languages.
- Color Resource: Added
very_light_grayto colors. - Skip Button Text: Changed the default text for the skip button from "Skip"
to "Bad Prompt" in
RecordingActivity.
API Changes & Improvements
- Authentication Endpoint: Added a new
/is_authenticatedendpoint for clients to check server connectivity and authentication status. - Standardized Unauthorized Responses: Several API endpoints (
/prompts,/upload,/verify,/save,/save_state,/directives,/directive_completed) now consistently return401 Unauthorizedfor invalid login tokens, instead of400 Bad Request.
Developer Tools
- Password Management: The
create_directive.pyscript now includes asetPasswordoperation, allowing for setting a specific password or generating a random one for a user. - Random Password Generation:
create_directive.pynow generates a random password forchangeUserif not explicitly provided.
New Features & User Interface
- Skip & Explain Workflow: Added the ability for users to skip a prompt
during recording.
- Clicking "Skip" triggers an "Explain" mode with a 15-second countdown.
- Users can record an explanation for why they are skipping the prompt.
- Added visual cues ("Explain" text overlay, countdown circle) during this phase.
- APK Download (Admin): Added a "Download APK" button to the "Load Data" (Admin) activity for easier app distribution.
Technical Changes
- Metadata Tracking: Updated
ClipDetailsto include anisSkipExplanationflag, allowing the server to distinguish between normal recordings and skip explanations.
New Features
- APK Download (Web): Added a direct "Download APK" link to the server's login and home pages.
- Dynamic APK Serving: The server now scans the storage bucket for APK files matching the version pattern and automatically serves the latest version, eliminating the need for hardcoded filenames.
New Features & User Interface
- Major UI Refactor to Jetpack Compose: The
RecordingActivityandHomeScreenActivityhave been completely rewritten using Jetpack Compose. - Structured Prompt Management: Introduced
PromptsCollectionand related classes to better organize main and tutorial prompts. - ViewModel Integration: Implemented
RecordingViewModelto manage UI state and logic forRecordingActivity. - Composable UI Elements: Created reusable UI components for buttons, indicators, and timers to ensure consistency.
- Configurable Countdown Circle: Updated the
CountdownCirclecomponent to support hiding the countdown text.
Improvements & Internal Changes
- Dependency Updates: Updated Kotlin to
2.2.20, Android Gradle Plugin to8.13.0, and various libraries to their latest stable versions. - Robust Background Uploads: Replaced
UploadServicewith a WorkManager-based solution for more reliable background data uploads. - Enhanced Data Management (
DataManager): RefactoredDataManagerwithMutexfor thread safety, improved persistence handling, and atomic saving operations. - Camera2 API Migration: Migrated
RecordingActivityfrom CameraX to the Camera2 API for finer control over video recording parameters. - Comprehensive String Resources: Added extensive string resources for better localization and UI clarity.
- Extended Color Palette: Added new color definitions for a richer UI design.
- Layout Cleanup: Removed manual constraint adjustments, leveraging Jetpack Compose for dynamic resizing.
- Copyright Update: Updated copyright notice to 2025.
API Changes & Improvements
- Dynamic APK Serving: The
/apkendpoint now dynamically serves the latest APK version found in the GCS bucket. - Simplified Prompt Directives: Consolidated prompt downloading into a
single
setPromptsdirective and addedreloadPromptsto refresh client data. - App Engine Scaling: Optimized
app.yamlto useF1instances with automatic scaling.
Developer Tools
- Video Post-processing Pipeline: Added
local_video_pipeline.pyto automate metadata dumping, downloading, and clip generation. - Enhanced Video Clipping: Updated
clip_video.pyto useffprobefor accurate keyframe identification and parallel processing. - Improved Video Downloading: Updated
download_videos.pyto use concurrent downloads and MD5 validation. - Metadata Dumping: Refined
dump_clips.pylogic for extracting video metadata into CSV and JSON formats. - Environment Setup: Updated
setup_local_env.shto includegoogle-cloud-cliandpyinkinstallation.