Skip to content

Implement hot realod of Debug biometrics module#294

Merged
aivanovski merged 3 commits into
masterfrom
feature/implement-hot-reload-of-debug-biometrics-module
Jan 31, 2025
Merged

Implement hot realod of Debug biometrics module#294
aivanovski merged 3 commits into
masterfrom
feature/implement-hot-reload-of-debug-biometrics-module

Conversation

@aivanovski

@aivanovski aivanovski commented Jan 31, 2025

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced a new BiometricResolver interface for managing biometric interactions.
    • Enhanced biometric authentication management with a more flexible resolving mechanism.
  • Improvements

    • Simplified biometric module configuration.
    • Updated settings and fragment components to utilize the new biometric resolver pattern.
    • Modified string resource for the fake biometric setting to simplify user messaging.
  • Debug Enhancements

    • Added a DebugBiometricModule for improved testing and debugging of biometric functionalities.
  • Code Refactoring

    • Converted OnSettingsChangeListener to a functional interface.
    • Restructured dependency injection for biometric modules.
  • Chores

    • Removed deprecated fake biometric module.
    • Updated import statements across multiple components.

@coderabbitai

coderabbitai Bot commented Jan 31, 2025

Copy link
Copy Markdown

Walkthrough

The pull request introduces a comprehensive refactoring of the biometric authentication system in the PassNotes application. The changes primarily focus on introducing a new BiometricResolver pattern, replacing direct biometric interactor dependencies with a more flexible resolver mechanism. This involves renaming several classes from "Fake" to "Debug," modifying module configurations, and updating various components to use the new resolver approach. The changes aim to provide more dynamic and configurable biometric authentication handling across the application.

Changes

File Change Summary
app/src/debug/kotlin/com/ivanovsky/passnotes/injection/DebugModuleBuilder.kt Simplified module loading by directly including DebugBiometricModule.build(); removed conditional logic for biometric module loading.
app/src/main/kotlin/com/ivanovsky/passnotes/data/repository/settings/OnSettingsChangeListener.kt Converted to a functional interface for more concise usage.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricInteractor.kt Removed isBiometricSupported() method; added getAuthenticator() method.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricInteractorImpl.kt Added authenticator property and getAuthenticator() method.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricResolver.kt New interface for resolving biometric interactors.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricResolverImpl.kt New implementation of BiometricResolver.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricAuthenticatorImpl.kt Renamed from FakeBiometricAuthenticatorImpl to DebugBiometricAuthenticatorImpl.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricInteractorImpl.kt Replaced FakeBiometricInteractorImpl with DebugBiometricInteractorImpl; added getAuthenticator() method.
app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricResolverImpl.kt New class managing biometric interactions based on user settings.
app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/BiometricModule.kt Updated to use BiometricResolver and BiometricResolverImpl.
app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/DebugBiometricModule.kt New module for injecting debug-specific biometric resolver.
app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/FakeBiometricModule.kt Deleted module for fake biometric implementations.
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/groups/GroupsFragment.kt Updated biometric authenticator initialization to use BiometricResolver.
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/groups/GroupsViewModel.kt Updated constructor to use BiometricResolver instead of BiometricInteractor.
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/settings/app/AppSettingsViewModel.kt Updated to use BiometricResolver.
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockFragment.kt Updated biometric authenticator initialization to use BiometricResolver.
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockViewModel.kt Refactored to use BiometricResolver.
app/src/main/res/values/debug-strings.xml Updated fake biometric string resource.

Poem

🐰 Biometric Bunny's Resolver Dance
With resolvers hopping, modules bright,
Fake becomes debug, authentication's might!
Interactors leap through code so clean,
A rabbit's refactor, a technological scene! 🔐


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (1)
app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricInteractorImpl.kt (1)

Restore triggerBiometricDataInvalidated() to maintain testing capabilities

The removal of this method has created a critical gap in testing functionality:

  • The isBiometricDataInvalidated flag can only be set to false via clearStoredData()
  • There's no way to trigger the biometric invalidation state for testing
  • UnlockViewModel relies on this functionality for handling biometric invalidation scenarios
🔗 Analysis chain

Line range hint 13-50: Verify the impact of removing triggerBiometricDataInvalidated().

The removal of triggerBiometricDataInvalidated() method might impact testing capabilities. Let's verify if this method is still needed by any tests.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for any references to triggerBiometricDataInvalidated in test files
rg -t kotlin "triggerBiometricDataInvalidated" --glob "**/*Test*.kt"

Length of output: 68


Script:

#!/bin/bash
# Search for any references to triggerBiometricDataInvalidated in all Kotlin files
rg -t kotlin "triggerBiometricDataInvalidated"

# Search for partial matches and usages of isBiometricDataInvalidated
rg -t kotlin "BiometricDataInvalidated" -A 2 -B 2

Length of output: 5008

🧹 Nitpick comments (5)
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockFragment.kt (1)

34-38: LGTM! Consider architectural improvements for better testability.

The lazy initialization using BiometricResolver is well implemented. However, consider these architectural improvements:

  1. Consider injecting the BiometricResolver through constructor or property injection instead of using GlobalInjector for better testability
  2. Consider adding error handling for the chain of calls
app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricResolver.kt (1)

3-5: Add KDoc documentation to explain the purpose of this interface.

Consider adding documentation to explain:

  • The purpose of this resolver interface
  • The role of the getInteractor() method
  • Any threading/lifecycle considerations
+/**
+ * Resolves and provides access to biometric authentication functionality.
+ * This interface allows for dynamic resolution of biometric interactors,
+ * enabling hot-reloading in debug builds.
+ */
 interface BiometricResolver {
+    /**
+     * Returns the biometric interactor instance.
+     * @return BiometricInteractor implementation
+     */
     fun getInteractor(): BiometricInteractor
 }
app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricResolverImpl.kt (1)

5-12: Document thread safety guarantees.

The implementation looks good. Consider adding documentation about thread safety, especially since this class might be accessed from different threads.

+/**
+ * Default implementation of BiometricResolver that creates and caches
+ * a single BiometricInteractor instance.
+ *
+ * Thread-safety: This implementation is thread-safe as it initializes
+ * the interactor instance during construction and only provides read-only
+ * access to it.
+ */
 class BiometricResolverImpl(
     context: Context
 ) : BiometricResolver {
app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/DebugBiometricModule.kt (1)

7-13: Add documentation explaining the purpose of this debug module.

Consider adding documentation to explain:

  • The purpose of this debug-specific module
  • When and how it should be used
  • How it differs from the regular BiometricModule
+/**
+ * Debug-specific Koin module that provides a BiometricResolver implementation
+ * suitable for testing and debugging. This module enables hot-reloading of
+ * biometric functionality during development.
+ */
 object DebugBiometricModule {
app/src/main/res/values/debug-strings.xml (1)

22-22: LGTM! Consider renaming to align with refactoring.

The removal of "(requires restart)" aligns well with the hot reload implementation. However, to maintain consistency with the broader refactoring pattern mentioned in the PR summary, consider renaming from "Fake" to "Debug".

Apply this diff to align with the new naming pattern:

-    <string name="fake_biometric_enabled" translatable="false">Use Fake Biometric</string>
+    <string name="debug_biometric_enabled" translatable="false">Use Debug Biometric</string>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1299f93 and b96e374.

📒 Files selected for processing (18)
  • app/src/debug/kotlin/com/ivanovsky/passnotes/injection/DebugModuleBuilder.kt (2 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/data/repository/settings/OnSettingsChangeListener.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricInteractor.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricInteractorImpl.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricResolver.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricResolverImpl.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricAuthenticatorImpl.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricInteractorImpl.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/usecases/DebugBiometricResolverImpl.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/BiometricModule.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/DebugBiometricModule.kt (1 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/FakeBiometricModule.kt (0 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/presentation/groups/GroupsFragment.kt (2 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/presentation/groups/GroupsViewModel.kt (3 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/presentation/settings/app/AppSettingsViewModel.kt (3 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockFragment.kt (2 hunks)
  • app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockViewModel.kt (5 hunks)
  • app/src/main/res/values/debug-strings.xml (1 hunks)
💤 Files with no reviewable changes (1)
  • app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/FakeBiometricModule.kt
✅ Files skipped from review due to trivial changes (1)
  • app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricAuthenticatorImpl.kt
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Run tests
🔇 Additional comments (19)
app/src/main/kotlin/com/ivanovsky/passnotes/data/repository/settings/OnSettingsChangeListener.kt (1)

3-5: Great use of Kotlin's functional interface!

Converting to a functional interface is a good improvement as it enables more concise lambda syntax for single-method interfaces, reducing boilerplate code while maintaining the same functionality. This change aligns well with Kotlin's idioms and best practices.

app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockFragment.kt (1)

13-14: LGTM! Import changes align with the new BiometricResolver pattern.

The import changes correctly reflect the architectural shift from direct BiometricAuthenticator usage to the new BiometricResolver pattern.

app/src/main/kotlin/com/ivanovsky/passnotes/presentation/groups/GroupsFragment.kt (4)

20-20: LGTM!

The new imports are correctly added to support the BiometricResolver pattern implementation.

Also applies to: 22-22


53-57: LGTM!

Properties are well-organized at the top of the class following Kotlin best practices.


59-65: LGTM!

The ViewModel initialization is simplified using the indexing operator while maintaining the same functionality.


68-72: Verify BiometricResolver integration.

The change to use BiometricResolver improves flexibility and aligns with the hot reload implementation. However, let's verify the integration across the codebase.

✅ Verification successful

BiometricResolver integration is properly implemented

The codebase shows consistent usage of BiometricResolver across all relevant components, with proper dependency injection and a clean architecture that supports both production and debug implementations. The changes align well with the hot reload implementation goal.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify BiometricResolver usage consistency across the codebase

# Check for any remaining direct BiometricAuthenticator injections
echo "Checking for direct BiometricAuthenticator injections..."
rg "BiometricAuthenticator\s+by\s+inject\(\)" -t kt

# Check for consistent BiometricResolver usage pattern
echo "Checking BiometricResolver usage pattern..."
rg "BiometricResolver.*getInteractor\(\).*getAuthenticator\(\)" -t kt

Length of output: 399


Script:

#!/bin/bash
# Search for BiometricAuthenticator and BiometricResolver usage patterns
echo "Checking BiometricAuthenticator initialization patterns..."
rg "BiometricAuthenticator.*by" --type-add "kotlin:*.kt" -t kotlin -C 2

echo -e "\nChecking BiometricResolver usage patterns..."
rg "BiometricResolver" --type-add "kotlin:*.kt" -t kotlin -C 2

echo -e "\nChecking getInteractor/getAuthenticator chain usage..."
rg "getInteractor\(\).*getAuthenticator\(\)" --type-add "kotlin:*.kt" -t kotlin -C 2

Length of output: 14494

app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/BiometricModule.kt (1)

11-11: LGTM! Clean dependency injection setup.

The module correctly provides the BiometricResolver interface, allowing for flexible implementations.

app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/debug/DebugBiometricModule.kt (1)

11-11: Verify the required dependencies for DebugBiometricResolverImpl.

The implementation requires 3 dependencies through get() calls. Let's verify these dependencies are properly documented and available in the DI container.

✅ Verification successful

All dependencies for DebugBiometricResolverImpl are properly provided

The three required dependencies are available in the DI container:

  • Settings from CoreModule
  • Context (Android framework dependency)
  • ResourceProvider from CoreModule
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find the constructor of DebugBiometricResolverImpl to verify its dependencies

# Search for the class definition and constructor
ast-grep --pattern 'class DebugBiometricResolverImpl($$$) {
  $$$
}'

# Search for any Koin module definitions that might provide these dependencies
rg "module \{" -A 10

Length of output: 8600


Script:

#!/bin/bash
# Find the DebugBiometricResolverImpl file
fd DebugBiometricResolverImpl

# Find and show the BiometricResolver interface
fd BiometricResolver

# Once we find the files, let's look at their content
rg -A 10 "class DebugBiometricResolverImpl"
rg -A 5 "interface BiometricResolver"

Length of output: 2243


Script:

#!/bin/bash
# Search for Settings provider in Koin modules
rg "Settings" app/src/main/kotlin/com/ivanovsky/passnotes/injection/modules/

Length of output: 2578

app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricInteractor.kt (1)

9-9: LGTM! Interface change aligns with resolver pattern.

The addition of getAuthenticator() method and removal of isBiometricSupported() reflects a good architectural decision to move towards a more flexible resolver pattern, which will better support hot reloading of the Debug biometrics module.

app/src/debug/kotlin/com/ivanovsky/passnotes/injection/DebugModuleBuilder.kt (1)

11-11: LGTM! Module builder changes support hot reload.

The simplification of module loading by directly including DebugBiometricModule and removing conditional logic is a good change that aligns with the hot reload capability objective.

Also applies to: 33-33

app/src/main/kotlin/com/ivanovsky/passnotes/domain/biometric/BiometricInteractorImpl.kt (1)

18-20: LGTM! Clean implementation of BiometricInteractor changes.

The implementation properly encapsulates the authenticator and provides a clean implementation of the new interface method.

app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/biometric/DebugBiometricInteractorImpl.kt (1)

13-15: LGTM! Clean implementation with proper dependency injection.

The implementation properly injects the ResourceProvider and maintains clean encapsulation of the authenticator.

Also applies to: 19-19, 22-22

app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/usecases/DebugBiometricResolverImpl.kt (4)

20-31: LGTM! Clean initialization and proper listener registration.

The constructor parameters and initialization logic are well-structured. The class properly initializes the mutable holder and settings listener, and registers the listener in the init block.


35-44: LGTM! Efficient settings change handling.

The settings change listener is focused and only triggers a reload when the relevant setting (TEST_TOGGLES) changes. The reload mechanism efficiently updates the underlying interactor through the mutable holder.


46-56: LGTM! Clear interactor instantiation logic with good logging.

The instantiation logic is clear and well-documented with logging. The method properly handles the debug vs. regular interactor creation based on settings.


58-80: LGTM! Thread-safe mutable holder implementation.

The MutableInteractorHolder implementation:

  • Uses MutableStateFlow for thread-safe updates
  • Properly delegates all BiometricInteractor methods
  • Maintains encapsulation of the underlying interactor
app/src/main/kotlin/com/ivanovsky/passnotes/presentation/settings/app/AppSettingsViewModel.kt (1)

11-11: LGTM! Clean transition to BiometricResolver pattern.

The changes correctly implement the transition from direct BiometricInteractor usage to the resolver pattern:

  • Updated import statement
  • Updated constructor parameter
  • Properly chained getInteractor() call to access biometric functionality

Also applies to: 22-22, 44-45

app/src/main/kotlin/com/ivanovsky/passnotes/presentation/unlock/UnlockViewModel.kt (1)

30-30: LGTM! Consistent implementation of BiometricResolver pattern.

The changes systematically implement the resolver pattern across the ViewModel:

  • Updated import and constructor parameter
  • Consistently used getInteractor() to access biometric functionality
  • Updated biometric availability check

Also applies to: 66-66, 201-202, 293-294, 914-915

app/src/main/kotlin/com/ivanovsky/passnotes/presentation/groups/GroupsViewModel.kt (1)

33-33: LGTM! Optimized BiometricResolver usage.

The changes efficiently implement the resolver pattern by caching the interactor:

private val biometricInteractor = biometricResolver.getInteractor()

This optimization avoids repeated calls to getInteractor() and improves performance.

Also applies to: 108-108, 185-185

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
app/src/automation/kotlin/com/ivanovsky/passnotes/injection/DebugModuleBuilder.kt (1)

Line range hint 24-24: Remove unused variable isLoadFakeBiometricModule.

The variable isLoadFakeBiometricModule is no longer used after removing the conditional biometric module loading logic.

Apply this diff to remove the unused variable:

-    val isLoadFakeBiometricModule = settings.testToggles?.isFakeBiometricEnabled ?: false
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2adfcef and ed94091.

📒 Files selected for processing (1)
  • app/src/automation/kotlin/com/ivanovsky/passnotes/injection/DebugModuleBuilder.kt (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Run tests
🔇 Additional comments (1)
app/src/automation/kotlin/com/ivanovsky/passnotes/injection/DebugModuleBuilder.kt (1)

34-34: Verify the removal of runtime biometric module configuration.

The change removes the ability to switch between different biometric modules at runtime using settings. Please confirm if this is intentional and that test scenarios requiring different biometric configurations are still supported.

Let's check if there are any test dependencies on this configuration:

✅ Verification successful

Runtime biometric configuration removal is intentional and safe

The change moves from runtime toggle to compile-time module selection, where debug builds use DebugBiometricModule and production builds use standard BiometricModule. This approach is cleaner and test scenarios are still fully supported through build variants rather than runtime toggles.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for tests that might depend on isFakeBiometricEnabled setting
rg -l "isFakeBiometricEnabled" "app/src/test" "app/src/androidTest"

# Search for potential biometric test configurations
rg -l "BiometricModule|FakeBiometric|DebugBiometric" "app/src/test" "app/src/androidTest"

Length of output: 151


Script:

#!/bin/bash
# Search for biometric-related files and configurations
rg -l "Biometric" --type kotlin

# Look for settings related to biometrics
rg -l "biometric.*settings|settings.*biometric" --type kotlin -i

# Find the DebugBiometricModule implementation
fd DebugBiometricModule.kt --type f --exec cat {}

Length of output: 5011


Script:

#!/bin/bash
# Check settings implementation for biometric configurations
cat app/src/main/kotlin/com/ivanovsky/passnotes/data/repository/settings/SettingsImpl.kt

# Examine debug biometric resolver implementation
cat app/src/main/kotlin/com/ivanovsky/passnotes/domain/test/usecases/DebugBiometricResolverImpl.kt

# Look for test toggles implementation
cat app/src/main/kotlin/com/ivanovsky/passnotes/data/entity/TestToggles.kt

Length of output: 17186

@aivanovski aivanovski merged commit 677d266 into master Jan 31, 2025
@aivanovski aivanovski deleted the feature/implement-hot-reload-of-debug-biometrics-module branch January 31, 2025 22:18
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