Skip to content

mvvm: move network node actions to NetworkScreenViewModel#46

Open
Kteja03 wants to merge 1 commit intomainfrom
mvvm-network-discovery
Open

mvvm: move network node actions to NetworkScreenViewModel#46
Kteja03 wants to merge 1 commit intomainfrom
mvvm-network-discovery

Conversation

@Kteja03
Copy link
Collaborator

@Kteja03 Kteja03 commented Mar 5, 2026

  • Moved node interaction logic from NetworkScreen UI into NetworkScreenViewModel.
  • This keeps the UI layer focused on rendering and navigation while the ViewModel handles network related actions only.

@gemini-code-assist
Copy link

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request refactors the network screen's architecture by relocating network node interaction logic from the UI layer to its corresponding ViewModel. This change improves the separation of concerns, making the UI more declarative and focused on presentation, while centralizing network operations and business logic within the ViewModel. The update ensures a cleaner and more maintainable codebase by adhering more closely to the MVVM pattern.

Highlights

  • Refactored Network Node Actions: Moved the logic for handling network node interactions, specifically requesting and pushing user information, from the NetworkScreen UI composable to the NetworkScreenViewModel.
  • Improved Separation of Concerns: Enhanced the MVVM architecture by ensuring the UI layer (NetworkScreen.kt) is solely responsible for rendering and navigation, while the ViewModel (NetworkScreenViewModel.kt) manages all network-related actions and business logic.
  • New ViewModel Functionality: Introduced a new onNodeSelected function in NetworkScreenViewModel to encapsulate the actions performed when a network node is selected, including error handling for network requests.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • app/src/main/java/com/greybox/projectmesh/viewModel/NetworkScreenViewModel.kt
    • Added a new public function onNodeSelected to handle remote user information requests and pushes.
    • Encapsulated network interaction logic, including error handling, within the new onNodeSelected function.
    • Applied minor formatting adjustments by adding blank lines for readability.
  • app/src/main/java/com/greybox/projectmesh/views/NetworkScreen.kt
    • Removed direct dependencies on AppServer and InetAddress by deleting their imports and instantiation.
    • Delegated network node interaction logic from the onClick handler of WifiListItem to the NetworkScreenViewModel's new onNodeSelected function.
    • Removed unused imports related to HomeScreenViewModel and Kodein's instance.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request successfully refactors the application by moving network node interaction logic from the NetworkScreen UI to the NetworkScreenViewModel. This is a great improvement that aligns with MVVM best practices, making the UI layer cleaner and more focused on its core responsibilities. My review identified one critical issue in the new onNodeSelected function where a blocking network call is made on the main thread, which could cause the application to crash. I've provided a suggestion to address this.

fun onNodeSelected(ipAddress: String) {
viewModelScope.launch {
try {
val addr = InetAddress.getByName(ipAddress)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

InetAddress.getByName(ipAddress) is a blocking network call. Since viewModelScope.launch defaults to the main dispatcher, this could lead to a NetworkOnMainThreadException and cause your app to crash. You should perform this operation on a background thread using withContext(Dispatchers.IO).

You will also need to add import kotlinx.coroutines.Dispatchers and import kotlinx.coroutines.withContext at the top of the file.

Suggested change
val addr = InetAddress.getByName(ipAddress)
val addr = withContext(Dispatchers.IO) { InetAddress.getByName(ipAddress) }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant