Release v1.0.0 - RhoStudio UI - #17
Merged
Merged
Conversation
- Update Kotlin version from 2.0.21 to 2.1.0 in `libs.versions.toml` - Add `kotlin-parcelize` plugin configuration to version catalogs and project-level build files - Upgrade Java Toolchain and JVM target from version 11 to 17 - Migrate `kotlinOptions` to the new `kotlin` extension DSL for JVM target configuration Signed-off-by: Alexis Tercero <alexistercero55@gmail.com> #4
- Enable `android.enableJetifier` in `gradle.properties` to support legacy library migration - Add `androidx-fragment-ktx` version 1.8.9 to version catalog and include it as a dependency in `app/build.gradle.kts` Signed-off-by: Alexis Tercero <alexistercero55@gmail.com> #4
- Update application and activity theme from `Theme.UI` to `Theme.RhoStudio` - Set `launchMode` to `singleTop` for `MainActivity` - Remove redundant label and clean up whitespace in `MainActivity` declaration Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Add `gson`, `material` (Google), and Data Binding `compiler` dependencies to `libs.versions.toml` and `app/build.gradle.kts` - Enable `viewBinding` in `buildFeatures` - Explicitly configure `sourceSets` for `java` and `res` directories in `app/build.gradle.kts` - Apply `kapt` for the Data Binding compiler implementation Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Define `Theme.RhoStudio` with MaterialComponents DayNight configuration and standard brand colors - Add new Samsung device profiles (Galaxy A14 5G and A16 5G) to device streaming cache - Update `strings.xml` with comprehensive login validation messages, hints, and a success notification - Add `error` and `success` color resources to `colors.xml` - Rename `app_name` to "RhoStudio UI" Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Implement `LoginViewModel` to handle user input validation and authentication state - Integrate with `SessionManager` for login execution and session persistence - Add real-time validation for email and password fields using `LiveData` - Manage asynchronous login operations using coroutines with job cancellation logic - Provide utility methods for resetting the form and clearing UI messages (toasts and errors) Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Create `Credentials` data class in `com.rho.studio.ui.core.model` to manage user authentication data - Implement validation properties `isEmailValid` (using Android `Patterns`), `isPasswordValid` (minimum 6 characters), and a general `isValid` flag - Add `validationErrors` list to provide specific feedback for empty fields or malformed input - Include helper methods and properties like `isEmpty` and `clear()` for state management Signed-off-by: Alexis Tercero <alexis.tercero@rho.studio> Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Create `Credentials` data class in `com.rho.studio.ui.core.model` to manage user authentication data - Implement validation properties `isEmailValid` (using Android `Patterns`), `isPasswordValid` (minimum 6 characters), and a general `isValid` flag - Add `validationErrors` list to provide specific feedback for empty fields or malformed input - Include helper methods and properties like `isEmpty` and `clear()` for state management Signed-off-by: Alexis Tercero <alexis.tercero@rho.studio> Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Implement `User` and `UserPreferences` data classes in the `com.rho.studio.ui.core.model` package - Add `Parcelize` support to both classes for efficient data transfer between Android components - Include helper properties for `initials` and `displayName` based on user name or email - Add utility methods for formatting creation dates and calculating relative last login time Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Implement `User` and `UserPreferences` data classes in the `com.rho.studio.ui.core.model` package - Add `Parcelize` support to both classes for efficient data transfer between Android components - Include helper properties for `initials` and `displayName` based on user name or email - Add utility methods for formatting creation dates and calculating relative last login time Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Create `LoginFragment` to serve as the main orchestration layer for the authentication feature - Implement child fragment composition by embedding `LoginEmailFragment`, `LoginPasswordFragment`, and `LoginButtonFragment` - Add state observation for toast messages, errors, and loading states via `LoginViewModel` - Integrate with `BaseFragment` for standardized ViewBinding and ViewModel management - Include cleanup logic to reset transient UI states on view destruction Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Implement `LoginEmailFragment` as a reusable component within the auth feature - Integrate shared state using `LoginViewModel` scoped to the parent fragment - Implement 300ms input debouncing for email validation to optimize UI performance - Configure real-time error feedback via `TextInputLayout` by observing `emailError` - Utilize `BaseFragment` and Data Binding for standardized view initialization and cleanup Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Implement `LoginButtonFragment` to manage the login button and loading state - Use a shared `LoginViewModel` scoped to the parent fragment to synchronize form validation and loading states - Add a custom `BindingAdapter` for displaying toast messages from the ViewModel - Implement reactive UI updates for button enablement and progress bar visibility - Integrate with `BaseFragment` and Data Binding for consistent architecture Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Implement `LoginPasswordFragment` to handle secure password input with two-way data binding - Use a shared `LoginViewModel` scoped to the parent fragment for synchronized state management - Integrate a 300ms debounce mechanism on text changes to optimize validation performance - Add observers for real-time validation feedback through `TextInputLayout` error states Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
…and session management - Migrate `MainActivity` from `ComponentActivity` to `AppCompatActivity`. - Implement `SessionManager` and `LoginViewModel` initialization and observation logic. - Add "Single Activity" orchestrator logic to handle fragment navigation based on authentication state. - Implement a global `UncaughtExceptionHandler` for crash logging and reporting. - Introduce `initializeBinding`, `initializeManagers`, and `setupObservers` methods for better lifecycle management. - Update `ActivityMainBinding` integration to include `SessionManager` and lifecycle owner assignment. - Replace direct `LoginViewModel` binding in `onCreate` with a fragment-based approach using `LoginFragment`. - Add synchronization for global progress indicator and error handling via `SessionManager` observers. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Introduce `BaseViewModel` as an abstract base class for all ViewModels to inherit from. - Implement a `launchSafe` extension function on `viewModelScope` to provide a standardized, crash-safe way to launch coroutines. - Add a virtual `handleError` method for centralized exception handling, with a default implementation that prints the stack trace. This prevents uncaught exceptions in coroutines from crashing the app. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Updated the Android CI workflow to use JDK 17 and modified branch triggers. #9
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Refactor SessionManager to use SessionRepository for persistence - Decouple `SessionManager` from `SharedPreferences` and `Gson` by delegating data operations to a new `SessionRepository`. - Remove `loginSync`, `logoutSync`, and `WeakReference` to context to simplify the API and focus on coroutine-based flows. - Add a `checkInitialized()` validation to ensure `init()` is called before accessing manager methods. - Improve error handling and observability by adding structured logging and refining `LiveData` initializations. - Clean up internal helper methods for extracting user information and managing the session lifecycle. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
…ate handling - Update the generic `VM` type constraint from `ViewModel` to `BaseViewModel`. - Implement `setupCommonObservers` to automatically handle `isLoading`, `error`, and `toastMessage` states from the ViewModel. - Provide default implementations for `onError` and `onToastMessage` using `Toast`. - Add documentation explaining Data Binding initialization and lifecycle owner assignment. - Ensure error and toast messages are cleared in the ViewModel after being processed by the Fragment. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Add LiveData properties for `isLoading`, `error`, and `toastMessage` to provide a consistent foundation for UI communication. - Introduce `launchWithLoading` to automatically manage the `isLoading` state during coroutine execution. - Update `launchSafe` to return a `Job` and accept an optional `onError` callback for better caller control. - Implement job tracking and override `onCleared` to ensure all active coroutines are canceled, preventing potential memory leaks. - Expand centralized error handling to post messages to the `error` LiveData and provide methods to clear UI notifications. - CI/CD config updates. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Migrate `LoginViewModel` to inherit from `BaseViewModel`, leveraging `launchWithLoading` for standardized coroutine management and state handling. - Remove redundant LiveData properties for loading, errors, and toasts, utilizing base class implementations instead. - Update `LoginFragment` to override `onLoadingStateChanged` and remove boilerplate observers for shared UI states. - Implement a custom `handleError` override in `LoginViewModel` to provide specific context for authentication failures. - Guard against concurrent login attempts by checking the base loading state in `onLoginClick`. - Update `.gitignore` to include standard `.gradle/` and `build/` directories. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
…ginFragment.kt Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
…wModel - Introduce `HeaderViewModel` to source user data directly from `SessionManager`, decoupling the header from feature-specific ViewModels. - Update `PageHeaderFragment` to accept a title via a new `newInstance` factory method and set it in the ViewModel. - Modify `fragment_page_header.xml` to bind with `HeaderViewModel` and update text colors to `silver_gray`. - Update `HomeFragment` to initialize the header with the appropriate title resource. Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
Signed-off-by: Alexis Tercero <alexistercero55@gmail.com>
- Update Android CI/CD workflow configuration for release. - Update GitHub actions.
- Updated project title and description. - Added architecture details. - Removed outdated class diagrams.
AlexisTercero55
requested review from
MarkParedes,
alexistercero-rho-dev and
guslg325
July 23, 2026 23:10
5 tasks
alexistercero-rho-dev
left a comment
Collaborator
There was a problem hiding this comment.
Release completed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rho Studio UI App
An Android View System app.
Architecture
Current navigation graph
close #16
Rho.Studio®