[BWA-60] Configure detekt scanning (#178)

This commit is contained in:
Patrick Honkonen 2024-08-29 13:50:17 -04:00 committed by GitHub
parent b49d8a18a2
commit 5758b34dcf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 1054 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.crashlytics)
alias(libs.plugins.detekt)
alias(libs.plugins.hilt)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose.compiler)
@ -144,6 +145,14 @@ dependencies {
testImplementation(libs.square.turbine)
androidTestImplementation(libs.bundles.tests.instrumented)
detektPlugins(libs.detekt.detekt.formatting)
detektPlugins(libs.detekt.detekt.rules)
}
detekt {
config.from(files("$rootDir/detekt-config.yml"))
baseline = file("$rootDir/detekt-baseline.xml")
}
kover {

373
detekt-baseline.xml Normal file
View File

@ -0,0 +1,373 @@
<?xml version="1.0" ?>
<SmellBaseline>
<ManuallySuppressedIssues></ManuallySuppressedIssues>
<CurrentIssues>
<ID>ChainWrapping:EditItemScreen.kt$+</ID>
<ID>ChainWrapping:RootNavViewModel.kt$RootNavViewModel$&amp;&amp;</ID>
<ID>CyclomaticComplexMethod:BitwardenExportParser.kt$BitwardenExportParser$private fun ExportJsonData.ExportItem.toAuthenticatorItemEntity(): AuthenticatorItemEntity</ID>
<ID>EmptyFunctionBlock:MainViewModelTest.kt$MainViewModelTest${ }</ID>
<ID>LongMethod:AuthenticatorNavBarScreen.kt$@Composable private fun AuthenticatorBottomAppBar( navController: NavController, verificationCodesTabClickedAction: () -&gt; Unit, settingsTabClickedAction: () -&gt; Unit, modifier: Modifier = Modifier, )</ID>
<ID>LongMethod:BitwardenExportParser.kt$BitwardenExportParser$private fun ExportJsonData.ExportItem.toAuthenticatorItemEntity(): AuthenticatorItemEntity</ID>
<ID>LongMethod:EditItemScreen.kt$@Composable fun EditItemContent( modifier: Modifier = Modifier, viewState: EditItemState.ViewState.Content, onIssuerNameTextChange: (String) -&gt; Unit = {}, onUsernameTextChange: (String) -&gt; Unit = {}, onToggleFavorite: (Boolean) -&gt; Unit = {}, onTypeOptionClicked: (AuthenticatorItemType) -&gt; Unit = {}, onTotpCodeTextChange: (String) -&gt; Unit = {}, onAlgorithmOptionClicked: (AuthenticatorItemAlgorithm) -&gt; Unit = {}, onRefreshPeriodOptionClicked: (AuthenticatorRefreshPeriodOption) -&gt; Unit = {}, onNumberOfDigitsChanged: (Int) -&gt; Unit = {}, onExpandAdvancedOptionsClicked: () -&gt; Unit = {}, )</ID>
<ID>LongMethod:EditItemScreen.kt$@Composable private fun AdvancedOptions( modifier: Modifier = Modifier, viewState: EditItemState.ViewState.Content, onExpandStateChange: () -&gt; Unit, onAlgorithmOptionClicked: (AuthenticatorItemAlgorithm) -&gt; Unit, onTypeOptionClicked: (AuthenticatorItemType) -&gt; Unit, onRefreshPeriodOptionClicked: (AuthenticatorRefreshPeriodOption) -&gt; Unit, onNumberOfDigitsChanged: (Int) -&gt; Unit, )</ID>
<ID>LongMethod:EditItemScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun EditItemScreen( viewModel: EditItemViewModel = hiltViewModel(), onNavigateBack: () -&gt; Unit = { }, )</ID>
<ID>LongMethod:EditItemViewModel.kt$EditItemViewModel$private fun handleItemDataReceive(action: EditItemAction.Internal.EditItemDataReceive)</ID>
<ID>LongMethod:ExpandableFloatingActionButton.kt$@Composable fun &lt;T : ExpandableFabOption&gt; ExpandableFloatingActionButton( modifier: Modifier = Modifier, label: Text?, items: List&lt;T&gt;, expandableFabState: MutableState&lt;ExpandableFabState&gt; = rememberExpandableFabState(), expandableFabIcon: ExpandableFabIcon, onStateChange: (expandableFabState: ExpandableFabState) -&gt; Unit = { }, )</ID>
<ID>LongMethod:ExportScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ExportScreen( viewModel: ExportViewModel = hiltViewModel(), intentManager: IntentManager = LocalIntentManager.current, onNavigateBack: () -&gt; Unit, )</ID>
<ID>LongMethod:ImportingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ImportingScreen( viewModel: ImportingViewModel = hiltViewModel(), intentManager: IntentManager = LocalIntentManager.current, onNavigateBack: () -&gt; Unit, )</ID>
<ID>LongMethod:ItemListingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun EmptyItemListingContent( modifier: Modifier = Modifier, appTheme: AppTheme, scrollBehavior: TopAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior( rememberTopAppBarState() ), onAddCodeClick: () -&gt; Unit, onScanQuCodeClick: () -&gt; Unit, onEnterSetupKeyClick: () -&gt; Unit, )</ID>
<ID>LongMethod:ItemListingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ItemListingScreen( viewModel: ItemListingViewModel = hiltViewModel(), intentManager: IntentManager = LocalIntentManager.current, permissionsManager: PermissionsManager = LocalPermissionsManager.current, onNavigateBack: () -&gt; Unit, onNavigateToSearch: () -&gt; Unit, onNavigateToQrCodeScanner: () -&gt; Unit, onNavigateToManualKeyEntry: () -&gt; Unit, onNavigateToEditItemScreen: (id: String) -&gt; Unit, )</ID>
<ID>LongMethod:ItemListingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ItemListingContent( state: ItemListingState.ViewState.Content, scrollBehavior: TopAppBarScrollBehavior, onNavigateToSearch: () -&gt; Unit, onScanQrCodeClick: () -&gt; Unit, onEnterSetupKeyClick: () -&gt; Unit, onItemClick: (String) -&gt; Unit, onEditItemClick: (String) -&gt; Unit, onDeleteItemClick: (String) -&gt; Unit, )</ID>
<ID>LongMethod:ItemSearchScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ItemSearchScreen( viewModel: ItemSearchViewModel = hiltViewModel(), onNavigateBack: () -&gt; Unit, )</ID>
<ID>LongMethod:RootNavScreen.kt$@Composable fun RootNavScreen( viewModel: RootNavViewModel = hiltViewModel(), navController: NavHostController = rememberNavController(), onSplashScreenRemoved: () -&gt; Unit = {}, onExitApplication: () -&gt; Unit, )</ID>
<ID>LongMethod:SettingsScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsScreen( viewModel: SettingsViewModel = hiltViewModel(), biometricsManager: BiometricsManager = LocalBiometricsManager.current, intentManager: IntentManager = LocalIntentManager.current, onNavigateToTutorial: () -&gt; Unit, onNavigateToExport: () -&gt; Unit, onNavigateToImport: () -&gt; Unit, )</ID>
<ID>LongMethod:TutorialScreen.kt$@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @Composable fun TutorialScreen( viewModel: TutorialViewModel = hiltViewModel(), onTutorialFinished: () -&gt; Unit, )</ID>
<ID>LongMethod:UnlockScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun UnlockScreen( viewModel: UnlockViewModel = hiltViewModel(), biometricsManager: BiometricsManager = LocalBiometricsManager.current, onUnlocked: () -&gt; Unit, )</ID>
<ID>LongParameterList:AuthenticatorNavBarNavigation.kt$( onNavigateBack: () -&gt; Unit, onNavigateToSearch: () -&gt; Unit, onNavigateToQrCodeScanner: () -&gt; Unit, onNavigateToManualKeyEntry: () -&gt; Unit, onNavigateToEditItem: (itemId: String) -&gt; Unit, onNavigateToExport: () -&gt; Unit, onNavigateToImport: () -&gt; Unit, onNavigateToTutorial: () -&gt; Unit, )</ID>
<ID>LongParameterList:ItemListingGraphNavigation.kt$( navController: NavController, navigateBack: () -&gt; Unit, navigateToSearch: () -&gt; Unit, navigateToQrCodeScanner: () -&gt; Unit, navigateToManualKeyEntry: () -&gt; Unit, navigateToEditItem: (String) -&gt; Unit, navigateToExport: () -&gt; Unit, navigateToImport: () -&gt; Unit, navigateToTutorial: () -&gt; Unit, )</ID>
<ID>MagicNumber:ItemListingViewModel.kt$ItemListingViewModel$10</ID>
<ID>MagicNumber:ItemListingViewModel.kt$ItemListingViewModel$30</ID>
<ID>MagicNumber:ItemListingViewModel.kt$ItemListingViewModel$5</ID>
<ID>MagicNumber:ItemListingViewModel.kt$ItemListingViewModel$6</ID>
<ID>MagicNumber:ItemSearchViewModel.kt$ItemSearchViewModel$8</ID>
<ID>MagicNumber:SettingsDiskSourceImpl.kt$SettingsDiskSourceImpl$7</ID>
<ID>MatchingDeclarationName:ExportVaultFormat.kt$ExportFormat</ID>
<ID>MaxLineLength:AegisExportParser.kt$AegisExportParser$private</ID>
<ID>MaxLineLength:BitwardenExportParser.kt$BitwardenExportParser$"${TotpCodeManager.TOTP_CODE_PREFIX}/$name?${TotpCodeManager.SECRET_PARAM}=$otpString"</ID>
<ID>MaxLineLength:FeatureFlag.kt$FeatureFlag$*</ID>
<ID>MaxLineLength:ImportingScreen.kt$launcher.launch(intentManager.createFileChooserIntent(event.importFileFormat.mimeType))</ID>
<ID>MaxLineLength:ItemListingViewModel.kt$ItemListingViewModel$private</ID>
<ID>MaxLineLength:ItemSearchViewModel.kt$ItemSearchViewModel$private</ID>
<ID>MaxLineLength:TutorialScreen.kt$R.string.when_using_2_step_verification_youll_enter_your_username_and_password_and_a_code_generated_in_this_app</ID>
<ID>MaxLineLength:TwoFasExportParser.kt$TwoFasExportParser$private</ID>
<ID>MaximumLineLength:TutorialScreen.kt$ </ID>
<ID>NoBlankLineBeforeRbrace:AuthenticatorDatabase.kt$AuthenticatorDatabase$ </ID>
<ID>NoBlankLineBeforeRbrace:AuthenticatorDiskSource.kt$AuthenticatorDiskSource$ </ID>
<ID>NoBlankLineBeforeRbrace:AuthenticatorManagerModule.kt$AuthenticatorManagerModule$ </ID>
<ID>NoBlankLineBeforeRbrace:AuthenticatorRepositoryModule.kt$AuthenticatorRepositoryModule$ </ID>
<ID>NoBlankLineBeforeRbrace:AuthenticatorSdkModule.kt$AuthenticatorSdkModule$ </ID>
<ID>NoBlankLineBeforeRbrace:AuthenticatorSdkSourceImpl.kt$AuthenticatorSdkSourceImpl$ </ID>
<ID>NoBlankLineBeforeRbrace:ExportDataResult.kt$ExportDataResult$ </ID>
<ID>NoBlankLineBeforeRbrace:FeatureFlagDiskSourceTest.kt$FeatureFlagDiskSourceTest$ </ID>
<ID>NoBlankLineBeforeRbrace:ImportManager.kt$ImportManager$ </ID>
<ID>NoBlankLineBeforeRbrace:MainViewModel.kt$MainViewModel$ </ID>
<ID>NoBlankLineBeforeRbrace:QrCodeAnalyzerImpl.kt$QrCodeAnalyzerImpl$ </ID>
<ID>NoBlankLineBeforeRbrace:UnlockViewModel.kt$UnlockEvent$ </ID>
<ID>NoConsecutiveBlankLines:BaseViewModelTest.kt$ </ID>
<ID>NoConsecutiveBlankLines:FeatureFlag.kt$ </ID>
<ID>NoConsecutiveBlankLines:ZonedDateTimeSerializerTest.kt$ </ID>
<ID>SpacingAroundColon:AuthenticatorManagerModule.kt$AuthenticatorManagerModule$:</ID>
<ID>SpacingAroundCurly:ItemSearchScreen.kt${</ID>
<ID>TooGenericExceptionCaught:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl$e: Exception</ID>
<ID>TooGenericExceptionCaught:ImportManagerImpl.kt$ImportManagerImpl$e: Throwable</ID>
<ID>TooGenericExceptionCaught:ItemListingViewModel.kt$ItemListingViewModel$e: Throwable</ID>
<ID>TooManyFunctions:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl : AuthenticatorRepository</ID>
<ID>TooManyFunctions:EditItemViewModel.kt$EditItemViewModel : BaseViewModel</ID>
<ID>TooManyFunctions:ItemListingViewModel.kt$ItemListingViewModel : BaseViewModel</ID>
<ID>TooManyFunctions:ItemSearchViewModel.kt$ItemSearchViewModel : BaseViewModel</ID>
<ID>TooManyFunctions:SettingsViewModel.kt$SettingsViewModel : BaseViewModel</ID>
<ID>TrailingCommaOnCallSite:AuthRepositoryModule.kt$AuthRepositoryModule$( authDiskSource = authDiskSource )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorDatabase.kt$AuthenticatorDatabase$[ AuthenticatorItemEntity::class ]</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorDiskModule.kt$AuthenticatorDiskModule$( context = app, klass = AuthenticatorDatabase::class.java, name = "authenticator_database" )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorDiskSourceImpl.kt$AuthenticatorDiskSourceImpl$( forceItemsFlow, itemDao.getAllItems() )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorManagerModule.kt$AuthenticatorManagerModule$( authenticatorSdkSource = authenticatorSdkSource, dispatcherManager = dispatcherManager, clock = clock )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorNavBarNavigation.kt$( onNavigateBack = onNavigateBack, onNavigateToSearch = onNavigateToSearch, onNavigateToQrCodeScanner = onNavigateToQrCodeScanner, onNavigateToManualKeyEntry = onNavigateToManualKeyEntry, onNavigateToEditItem = onNavigateToEditItem, onNavigateToExport = onNavigateToExport, onNavigateToImport = onNavigateToImport, onNavigateToTutorial = onNavigateToTutorial )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorNavBarScreen.kt$( isVisible = false, onClick = { // Do nothing }, modifier = Modifier .fillMaxWidth() .height(appBarHeightPx.toDp()) )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorNavigation.kt$( navController = navController, navigateBack = onNavigateBack, navigateToSearch = { navController.navigateToSearch() }, navigateToQrCodeScanner = { navController.navigateToQrCodeScanScreen() }, navigateToManualKeyEntry = { navController.navigateToManualCodeEntryScreen() }, navigateToEditItem = { navController.navigateToEditItem(itemId = it) }, navigateToExport = { navController.navigateToExport() }, navigateToImport = { navController.navigateToImporting() }, navigateToTutorial = { navController.navigateToSettingsTutorial() } )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorNavigation.kt$( onNavigateBack = onNavigateBack, onNavigateToSearch = { navController.navigateToSearch() }, onNavigateToQrCodeScanner = { navController.navigateToQrCodeScanScreen() }, onNavigateToManualKeyEntry = { navController.navigateToManualCodeEntryScreen() }, onNavigateToEditItem = { navController.navigateToEditItem(itemId = it) }, onNavigateToExport = { navController.navigateToExport() }, onNavigateToImport = { navController.navigateToImporting() }, onNavigateToTutorial = { navController.navigateToSettingsTutorial() } )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorNavigation.kt$( startDestination = AUTHENTICATOR_NAV_BAR_ROUTE, route = AUTHENTICATOR_GRAPH_ROUTE )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl$( ExportJsonData( encrypted = false, items = authenticatorDiskSource .getItems() .firstOrNull() .orEmpty() .map { it.toExportJsonItem() }, ) )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl$( id = itemId, key = updateItemRequest.key, accountName = updateItemRequest.accountName, type = updateItemRequest.type, period = updateItemRequest.period, digits = updateItemRequest.digits, issuer = updateItemRequest.issuer, userId = null, favorite = updateItemRequest.favorite )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl$( importFileFormat = format, byteArray = it )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl$( onSuccess = { it }, onFailure = { ImportDataResult.Error() } )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorSdkSourceImpl.kt$AuthenticatorSdkSourceImpl$( PasswordGeneratorRequest( lowercase = true, uppercase = true, numbers = true, special = true, length = 7.toUByte(), avoidAmbiguous = true, minLowercase = null, minUppercase = null, minNumber = null, minSpecial = null ) )</ID>
<ID>TrailingCommaOnCallSite:AuthenticatorSdkSourceImpl.kt$AuthenticatorSdkSourceImpl$( lowercase = true, uppercase = true, numbers = true, special = true, length = 7.toUByte(), avoidAmbiguous = true, minLowercase = null, minUppercase = null, minNumber = null, minSpecial = null )</ID>
<ID>TrailingCommaOnCallSite:BitwardenExportParser.kt$BitwardenExportParser$( items = exportData .items .filter { it.login?.totp != null } .toAuthenticatorItemEntities() )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.AlgorithmOptionClick(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.ExpandAdvancedOptionsClick )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.FavoriteToggleClick(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.IssuerNameTextChange(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.NumberOfDigitsOptionClick(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.RefreshPeriodOptionClick(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.TotpCodeTextChange(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.TypeOptionClick(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( EditItemAction.UsernameTextChange(it) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( context, event.message(resources), Toast.LENGTH_LONG )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( dialogState = state.dialog, onDismissRequest = { viewModel.trySendAction(EditItemAction.DismissDialog) } )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( iconData = IconData.Local( iconRes = if (viewState.isAdvancedOptionsExpanded) { R.drawable.ic_chevron_up } else { R.drawable.ic_chevron_down } ), contentDescription = stringResource( id = R.string.collapse_advanced_options ), tint = MaterialTheme.colorScheme.primary )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( iconRes = if (viewState.isAdvancedOptionsExpanded) { R.drawable.ic_chevron_up } else { R.drawable.ic_chevron_down } )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( id = R.string.collapse_advanced_options )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( id = R.string.refresh_period_seconds, it.seconds )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( indication = rememberRipple( bounded = true, color = MaterialTheme.colorScheme.primary, ), interactionSource = remember { MutableInteractionSource() } )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp), viewState = viewState, onExpandStateChange = onExpandAdvancedOptionsClicked, onAlgorithmOptionClicked = onAlgorithmOptionClicked, onTypeOptionClicked = onTypeOptionClicked, onRefreshPeriodOptionClicked = onRefreshPeriodOptionClicked, onNumberOfDigitsChanged = onNumberOfDigitsChanged )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( modifier = Modifier .fillMaxWidth(), label = stringResource(id = R.string.refresh_period), options = refreshPeriodOptionsWithStrings.values.toImmutableList(), selectedOption = stringResource( id = R.string.refresh_period_seconds, viewState.itemData.refreshPeriod.seconds, ), onOptionSelected = remember(viewState) { { selectedOption -&gt; val selectedOptionName = refreshPeriodOptionsWithStrings .entries .first { it.value == selectedOption } .key onRefreshPeriodOptionClicked(selectedOptionName) } } )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( modifier = Modifier .imePadding() .padding(innerPadding), viewState = viewState, onIssuerNameTextChange = remember(viewModel) { { viewModel.trySendAction( EditItemAction.IssuerNameTextChange(it) ) } }, onUsernameTextChange = remember(viewModel) { { viewModel.trySendAction( EditItemAction.UsernameTextChange(it) ) } }, onToggleFavorite = remember(viewModel) { { viewModel.trySendAction( EditItemAction.FavoriteToggleClick(it) ) } }, onTypeOptionClicked = remember(viewModel) { { viewModel.trySendAction( EditItemAction.TypeOptionClick(it) ) } }, onTotpCodeTextChange = remember(viewModel) { { viewModel.trySendAction( EditItemAction.TotpCodeTextChange(it) ) } }, onAlgorithmOptionClicked = remember(viewModel) { { viewModel.trySendAction( EditItemAction.AlgorithmOptionClick(it) ) } }, onRefreshPeriodOptionClicked = remember(viewModel) { { viewModel.trySendAction( EditItemAction.RefreshPeriodOptionClick(it) ) } }, onNumberOfDigitsChanged = remember(viewModel) { { viewModel.trySendAction( EditItemAction.NumberOfDigitsOptionClick(it) ) } }, onExpandAdvancedOptionsClicked = remember(viewModel) { { viewModel.trySendAction( EditItemAction.ExpandAdvancedOptionsClick ) } } )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( title = dialogState.title, message = dialogState.message )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( title = stringResource( id = R.string.edit_item, ), scrollBehavior = scrollBehavior, navigationIcon = painterResource(id = R.drawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(EditItemAction.CancelClick) } }, actions = { BitwardenTextButton( label = stringResource(id = R.string.save), onClick = remember(viewModel) { { viewModel.trySendAction(EditItemAction.SaveClick) } }, modifier = Modifier.semantics { testTag = "SaveButton" }, ) } )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( viewState = EditItemState.ViewState.Content( isAdvancedOptionsExpanded = false, itemData = EditItemData( refreshPeriod = AuthenticatorRefreshPeriodOption.THIRTY, totpCode = "123456", type = AuthenticatorItemType.TOTP, username = "account name", issuer = "issuer", algorithm = AuthenticatorItemAlgorithm.SHA1, digits = 6, favorite = false, ), minDigitsAllowed = 5, maxDigitsAllowed = 10, ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemScreen.kt$( viewState = EditItemState.ViewState.Content( isAdvancedOptionsExpanded = true, itemData = EditItemData( refreshPeriod = AuthenticatorRefreshPeriodOption.THIRTY, totpCode = "123456", type = AuthenticatorItemType.TOTP, username = "account name", issuer = "issuer", algorithm = AuthenticatorItemAlgorithm.SHA1, digits = 6, favorite = true, ), minDigitsAllowed = 5, maxDigitsAllowed = 10, ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( AuthenticatorItemEntity( id = state.itemId, key = content.itemData.totpCode.trim(), accountName = content.itemData.username?.trim(), type = content.itemData.type, algorithm = content.itemData.algorithm, period = content.itemData.refreshPeriod.seconds, digits = content.itemData.digits, issuer = content.itemData.issuer.trim(), favorite = content.itemData.favorite, ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( R.string.saving.asText() )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( algorithm = action.algorithmOption )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( dialog = EditItemState.DialogState.Generic( title = R.string.an_error_has_occurred.asText(), message = R.string.key_is_invalid.asText() ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( dialog = EditItemState.DialogState.Generic( title = R.string.an_error_has_occurred.asText(), message = R.string.validation_field_required.asText(R.string.key.asText()), ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( dialog = EditItemState.DialogState.Generic( title = R.string.an_error_has_occurred.asText(), message = R.string.validation_field_required.asText(R.string.name.asText()), ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( dialog = EditItemState.DialogState.Loading( R.string.saving.asText() ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( digits = action.digits )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( favorite = action.favorite )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( initialState = savedStateHandle[KEY_STATE] ?: EditItemState( itemId = EditItemArgs(savedStateHandle).itemId, viewState = EditItemState.ViewState.Loading, dialog = null, ) )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( isAdvancedOptionsExpanded = currentContent.isAdvancedOptionsExpanded.not() )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( issuer = action.issuerName )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( message = R.string.generic_error_message.asText() )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( refreshPeriod = action.period )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( title = R.string.an_error_has_occurred.asText(), message = R.string.key_is_invalid.asText() )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( totpCode = action.totpCode )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( type = action.typeOption )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( username = action.username )</ID>
<ID>TrailingCommaOnCallSite:EditItemViewModel.kt$EditItemViewModel$( viewState = EditItemState.ViewState.Loading )</ID>
<ID>TrailingCommaOnCallSite:ExpandableFloatingActionButton.kt$( onFabOptionClick = { expandableFabState.value = expandableFabState.value.toggleValue() onStateChange(expandableFabState.value) expandableFabOption.onFabOptionClick() }, expandableFabOption = expandableFabOption )</ID>
<ID>TrailingCommaOnCallSite:ExportScreen.kt$( modifier = Modifier .padding(paddingValues) .fillMaxSize(), state = state, onExportFormatOptionSelected = remember(viewModel) { { viewModel.trySendAction(ExportAction.ExportFormatOptionSelect(it)) } }, onExportClick = { shouldShowConfirmationPrompt = true } )</ID>
<ID>TrailingCommaOnCallSite:ExportScreen.kt$( modifier = modifier .imePadding() .verticalScroll(rememberScrollState()) )</ID>
<ID>TrailingCommaOnCallSite:ExportScreen.kt$( text = dialog.message )</ID>
<ID>TrailingCommaOnCallSite:ExportScreen.kt$( visibilityState = BasicDialogState.Shown( title = dialog.title, message = dialog.message, ), onDismissRequest = remember(viewModel) { { viewModel.trySendAction(ExportAction.DialogDismiss) } } )</ID>
<ID>TrailingCommaOnCallSite:ExportScreen.kt$( visibilityState = LoadingDialogState.Shown( text = dialog.message ) )</ID>
<ID>TrailingCommaOnCallSite:ExportViewModel.kt$ExportViewModel$( ExportAction.Internal.SaveExportDataToUriResultReceive( result = result ) )</ID>
<ID>TrailingCommaOnCallSite:ExportViewModel.kt$ExportViewModel$( initialState = ExportState(dialogState = null, exportFormat = ExportFormat.JSON) )</ID>
<ID>TrailingCommaOnCallSite:ExportViewModel.kt$ExportViewModel$( result = result )</ID>
<ID>TrailingCommaOnCallSite:FakeFeatureFlagRepository.kt$( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive(LocalFeatureFlag.BitwardenAuthenticationEnabled.defaultValue) )</ID>
<ID>TrailingCommaOnCallSite:FakeFeatureFlagRepository.kt$( featureFlags = mapOf( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive(LocalFeatureFlag.BitwardenAuthenticationEnabled.defaultValue) ) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagDiskSourceTest.kt$( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive(true) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagDiskSourceTest.kt$( featureFlags = mapOf( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive(true) ) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagDiskSourceTest.kt$FeatureFlagDiskSourceTest$( FEATURE_FLAGS_CONFIGURATION_JSON )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagDiskSourceTest.kt$FeatureFlagDiskSourceTest$( fakeSharedPreferences.getString(featureFlagsConfigKey, null)!! )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagManagerTest.kt$( mapOf( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive(true), ) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagManagerTest.kt$FeatureFlagManagerTest$( featureFlags = emptyMap() )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagRepositoryImpl.kt$FeatureFlagRepositoryImpl$( LocalFeatureFlag.BitwardenAuthenticationEnabled.defaultValue )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagRepositoryImpl.kt$FeatureFlagRepositoryImpl$( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive( LocalFeatureFlag.BitwardenAuthenticationEnabled.defaultValue ) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagRepositoryImpl.kt$FeatureFlagRepositoryImpl$( mapOf( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive( LocalFeatureFlag.BitwardenAuthenticationEnabled.defaultValue ) ) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagRepositoryTest.kt$( featureFlags = mapOf( LocalFeatureFlag.BitwardenAuthenticationEnabled.name to JsonPrimitive(LocalFeatureFlag.BitwardenAuthenticationEnabled.defaultValue), ) )</ID>
<ID>TrailingCommaOnCallSite:FeatureFlagRepositoryTest.kt$FeatureFlagRepositoryTest$( FEATURE_FLAGS_CONFIG, fakeFeatureFlagDiskSource.featureFlagsConfiguration )</ID>
<ID>TrailingCommaOnCallSite:ImportingScreen.kt$( modifier = modifier .imePadding() .verticalScroll(rememberScrollState()) )</ID>
<ID>TrailingCommaOnCallSite:ImportingScreen.kt$( text = dialog.message )</ID>
<ID>TrailingCommaOnCallSite:ImportingScreen.kt$( visibilityState = BasicDialogState.Shown( title = dialog.title, message = dialog.message, ), onDismissRequest = remember(viewModel) { { viewModel.trySendAction(ImportAction.DialogDismiss) } } )</ID>
<ID>TrailingCommaOnCallSite:ImportingScreen.kt$( visibilityState = LoadingDialogState.Shown( text = dialog.message ) )</ID>
<ID>TrailingCommaOnCallSite:ImportingViewModel.kt$ImportingViewModel$( ImportEvent.ShowToast( message = R.string.import_success.asText(), ) )</ID>
<ID>TrailingCommaOnCallSite:ImportingViewModel.kt$ImportingViewModel$( dialogState = ImportState.DialogState.Error( title = R.string.an_error_has_occurred.asText(), message = result.message ?: R.string.import_vault_failure.asText(), ) )</ID>
<ID>TrailingCommaOnCallSite:ImportingViewModel.kt$ImportingViewModel$( initialState = ImportState(importFileFormat = ImportFileFormat.BITWARDEN_JSON) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingExpandableFabAction.kt$ItemListingExpandableFabAction.EnterSetupKey$( label, icon, onEnterSetupKeyClick )</ID>
<ID>TrailingCommaOnCallSite:ItemListingExpandableFabAction.kt$ItemListingExpandableFabAction.ScanQrCode$( label, icon, onScanQrCodeClick )</ID>
<ID>TrailingCommaOnCallSite:ItemListingGraphNavigation.kt$( navController = navController, onNavigateToExport = navigateToExport, onNavigateToImport = navigateToImport, onNavigateToTutorial = navigateToTutorial )</ID>
<ID>TrailingCommaOnCallSite:ItemListingGraphNavigation.kt$( onNavigateBack = { navController.popBackStack() } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingGraphNavigation.kt$( onNavigateBack = { navController.popBackStack() }, onNavigateToQrCodeScreen = { navController.popBackStack() navController.navigateToQrCodeScanScreen() } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingGraphNavigation.kt$( route = ITEM_LISTING_GRAPH_ROUTE, navOptions = navOptions )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( ItemListingAction.DeleteItemClick(it) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( ItemListingAction.EditItemClick(it) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( ItemListingAction.ItemClick(it) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( ItemListingAction.SearchClick )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( ItemListingExpandableFabAction.ScanQrCode( label = R.string.scan_a_qr_code.asText(), icon = IconResource( iconPainter = painterResource(id = R.drawable.ic_camera), contentDescription = stringResource(id = R.string.scan_a_qr_code), testTag = "ScanQRCodeButton", ), onScanQrCodeClick = onScanQrCodeClick, ), ItemListingExpandableFabAction.EnterSetupKey( label = R.string.enter_key_manually.asText(), icon = IconResource( iconPainter = painterResource(id = R.drawable.ic_keyboard_24px), contentDescription = stringResource(id = R.string.enter_key_manually), testTag = "EnterSetupKeyButton", ), onEnterSetupKeyClick = onEnterSetupKeyClick ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( ItemListingExpandableFabAction.ScanQrCode( label = R.string.scan_a_qr_code.asText(), icon = IconResource( iconPainter = painterResource(id = R.drawable.ic_camera), contentDescription = stringResource(id = R.string.scan_a_qr_code), testTag = "ScanQRCodeButton", ), onScanQrCodeClick = onScanQuCodeClick ), ItemListingExpandableFabAction.EnterSetupKey( label = R.string.enter_key_manually.asText(), icon = IconResource( iconPainter = painterResource(id = R.drawable.ic_keyboard_24px), contentDescription = stringResource(id = R.string.enter_key_manually), testTag = "EnterSetupKeyButton", ), onEnterSetupKeyClick = onEnterSetupKeyClick, ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( appTheme = state.appTheme, scrollBehavior = scrollBehavior, onAddCodeClick = remember(viewModel) { { launcher.launch(Manifest.permission.CAMERA) } }, onScanQuCodeClick = remember(viewModel) { { launcher.launch(Manifest.permission.CAMERA) } }, onEnterSetupKeyClick = remember(viewModel) { { viewModel.trySendAction(ItemListingAction.EnterSetupKeyClick) } } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( context, event.message(context.resources), Toast.LENGTH_LONG )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( currentState, scrollBehavior, onNavigateToSearch = remember(viewModel) { { viewModel.trySendAction( ItemListingAction.SearchClick ) } }, onScanQrCodeClick = remember(viewModel) { { launcher.launch(Manifest.permission.CAMERA) } }, onEnterSetupKeyClick = remember(viewModel) { { viewModel.trySendAction(ItemListingAction.EnterSetupKeyClick) } }, onItemClick = remember(viewModel) { { viewModel.trySendAction( ItemListingAction.ItemClick(it) ) } }, onEditItemClick = remember(viewModel) { { viewModel.trySendAction( ItemListingAction.EditItemClick(it) ) } }, onDeleteItemClick = remember(viewModel) { { viewModel.trySendAction( ItemListingAction.DeleteItemClick(it) ) } } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( id = when (appTheme) { AppTheme.DARK -&gt; R.drawable.ic_empty_vault_dark AppTheme.LIGHT -&gt; R.drawable.ic_empty_vault_light AppTheme.DEFAULT -&gt; R.drawable.ic_empty_vault } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( label = R.string.enter_key_manually.asText(), icon = IconResource( iconPainter = painterResource(id = R.drawable.ic_keyboard_24px), contentDescription = stringResource(id = R.string.enter_key_manually), testTag = "EnterSetupKeyButton", ), onEnterSetupKeyClick = onEnterSetupKeyClick )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( label = R.string.scan_a_qr_code.asText(), icon = IconResource( iconPainter = painterResource(id = R.drawable.ic_camera), contentDescription = stringResource(id = R.string.scan_a_qr_code), testTag = "ScanQRCodeButton", ), onScanQrCodeClick = onScanQuCodeClick )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( rememberTopAppBarState() )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( title = stringResource(id = R.string.delete), message = dialog.message(), confirmButtonText = stringResource(id = R.string.ok), dismissButtonText = stringResource(id = R.string.cancel), onConfirmClick = { onConfirmDeleteClick(dialog.itemId) }, onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( title = stringResource(id = R.string.verification_codes), scrollBehavior = scrollBehavior, actions = { BitwardenSearchActionItem( contentDescription = stringResource(id = R.string.search_codes), onClick = onNavigateToSearch, ) } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingScreen.kt$( title = stringResource(id = R.string.verification_codes), scrollBehavior = scrollBehavior, navigationIcon = null, actions = { } )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( ItemListingAction.Internal.DeleteItemReceive( authenticatorRepository.hardDeleteItem(action.itemId) ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( ItemListingEvent.ShowToast( message = R.string.value_has_been_copied.asText(action.authCode) ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( authenticatorData = action.data, clearDialogState = false )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( authenticatorData = authenticatorData.data, clearDialogState = false )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( authenticatorData = authenticatorData.data, clearDialogState = true )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( authenticatorData = state.data, clearDialogState = true )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( authenticatorRepository.hardDeleteItem(action.itemId) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( byteArray = otpParam.secret.toByteArray() )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( dialog = ItemListingState.DialogState.DeleteConfirmationPrompt( message = R.string.do_you_really_want_to_permanently_delete_cipher.asText(), itemId = action.itemId, ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( dialog = ItemListingState.DialogState.Error( title = R.string.an_error_has_occurred.asText(), message = R.string.authenticator_key_read_error.asText(), ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( dialog = ItemListingState.DialogState.Error( title = R.string.an_error_has_occurred.asText(), message = R.string.generic_error_message.asText(), ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( initialState = ItemListingState( settingsRepository.appTheme, settingsRepository.authenticatorAlertThresholdSeconds, viewState = ItemListingState.ViewState.Loading, dialog = null ) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( message = R.string.internet_connection_required_title .asText() .concat(R.string.internet_connection_required_message.asText()) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( message = R.string.value_has_been_copied.asText(action.authCode) )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( settingsRepository.appTheme, settingsRepository.authenticatorAlertThresholdSeconds, viewState = ItemListingState.ViewState.Loading, dialog = null )</ID>
<ID>TrailingCommaOnCallSite:ItemListingViewModel.kt$ItemListingViewModel$( viewState = ItemListingState.ViewState.Loading )</ID>
<ID>TrailingCommaOnCallSite:ItemSearchNavigation.kt$( onNavigateBack = onNavigateBack )</ID>
<ID>TrailingCommaOnCallSite:ItemSearchScreen.kt$( viewState = viewState, modifier = innerModifier )</ID>
<ID>TrailingCommaOnCallSite:ItemSearchViewModel.kt$ItemSearchViewModel$( authenticatorData = authenticatorData, clearDialogState = false )</ID>
<ID>TrailingCommaOnCallSite:ItemSearchViewModel.kt$ItemSearchViewModel$( initialState = ItemSearchState( searchTerm = "", viewState = ItemSearchState.ViewState.Loading, dialogState = null, ) )</ID>
<ID>TrailingCommaOnCallSite:ItemSearchViewModel.kt$ItemSearchViewModel$( message = R.string.there_are_no_items_that_match_the_search.asText() )</ID>
<ID>TrailingCommaOnCallSite:ItemSearchViewModel.kt$ItemSearchViewModel$( searchTerm = currentState.searchTerm, viewState = authenticatorData .filterAndOrganize(state.searchTerm) .toViewState(searchTerm = state.searchTerm), dialogState = currentState.dialogState.takeUnless { clearDialogState } )</ID>
<ID>TrailingCommaOnCallSite:MainActivity.kt$MainActivity$( MainAction.ReceiveFirstIntent( intent = intent ) )</ID>
<ID>TrailingCommaOnCallSite:MainActivity.kt$MainActivity$( MainAction.ReceiveNewIntent(intent = intent) )</ID>
<ID>TrailingCommaOnCallSite:MainActivity.kt$MainActivity$( intent = intent )</ID>
<ID>TrailingCommaOnCallSite:MainActivity.kt$MainActivity$( onSplashScreenRemoved = { shouldShowSplashScreen = false }, onExitApplication = { finishAffinity() } )</ID>
<ID>TrailingCommaOnCallSite:MainActivity.kt$MainActivity$( theme = state.theme )</ID>
<ID>TrailingCommaOnCallSite:MainViewModel.kt$MainViewModel$( MainState( theme = settingsRepository.appTheme ) )</ID>
<ID>TrailingCommaOnCallSite:MainViewModel.kt$MainViewModel$( theme = settingsRepository.appTheme )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryScreen.kt$( dialog.message )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryScreen.kt$( title = dialog.title, message = dialog.message )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryScreen.kt$( visibilityState = BasicDialogState.Shown( title = dialog.title, message = dialog.message ), onDismissRequest = remember(state) { { viewModel.trySendAction(ManualCodeEntryAction.DismissDialog) } } )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryScreen.kt$( visibilityState = LoadingDialogState.Shown( dialog.message ) )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( AuthenticatorItemEntity( id = UUID.randomUUID().toString(), key = state.code, issuer = state.issuer, accountName = "", userId = null, type = if (state.code.startsWith("steam://")) { AuthenticatorItemType.STEAM } else { AuthenticatorItemType.TOTP }, favorite = false, ) )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( dialog = ManualCodeEntryState.DialogState.Error( message = R.string.key_is_invalid.asText() ) )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( dialog = ManualCodeEntryState.DialogState.Error( message = R.string.key_is_required.asText() ) )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( dialog = ManualCodeEntryState.DialogState.Error( message = R.string.name_is_required.asText() ) )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( dialog = ManualCodeEntryState.DialogState.Error( title = R.string.an_error_has_occurred.asText(), message = R.string.generic_error_message.asText(), ) )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( message = R.string.key_is_invalid.asText() )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( message = R.string.key_is_required.asText() )</ID>
<ID>TrailingCommaOnCallSite:ManualCodeEntryViewModel.kt$ManualCodeEntryViewModel$( message = R.string.name_is_required.asText() )</ID>
<ID>TrailingCommaOnCallSite:QrCodeAnalyzerImpl.kt$QrCodeAnalyzerImpl$( DecodeHintType.POSSIBLE_FORMATS to arrayListOf(BarcodeFormat.QR_CODE), DecodeHintType.ALSO_INVERTED to true )</ID>
<ID>TrailingCommaOnCallSite:RootNavScreen.kt$( onUnlocked = { viewModel.trySendAction(RootNavAction.Internal.AppUnlocked) } )</ID>
<ID>TrailingCommaOnCallSite:RootNavViewModel.kt$RootNavViewModel$( initialState = RootNavState( hasSeenWelcomeGuide = settingsRepository.hasSeenWelcomeTutorial, navState = RootNavState.NavState.Splash, ) )</ID>
<ID>TrailingCommaOnCallSite:SearchHandlers.kt$SearchHandlers.Companion$( onBackClick = { viewModel.trySendAction(ItemSearchAction.BackClick) }, onDismissRequest = { viewModel.trySendAction(ItemSearchAction.DismissDialogClick) }, onItemClick = { viewModel.trySendAction(ItemSearchAction.ItemClick(it)) }, onSearchTermChange = { viewModel.trySendAction(ItemSearchAction.SearchTermChange(it)) } )</ID>
<ID>TrailingCommaOnCallSite:SettingsDiskSourceImpl.kt$SettingsDiskSourceImpl$( ALERT_THRESHOLD_SECONDS_KEY, thresholdSeconds )</ID>
<ID>TrailingCommaOnCallSite:SettingsNavigation.kt$( onNavigateBack = { navController.popBackStack() } )</ID>
<ID>TrailingCommaOnCallSite:SettingsNavigation.kt$( onTutorialFinished = { navController.popBackStack() } )</ID>
<ID>TrailingCommaOnCallSite:SettingsNavigation.kt$( route = SETTINGS_ROUTE )</ID>
<ID>TrailingCommaOnCallSite:SettingsNavigation.kt$( startDestination = SETTINGS_ROUTE, route = SETTINGS_GRAPH_ROUTE )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( SettingsAction.SecurityClick.UnlockWithBiometricToggle(it) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( id = R.drawable.ic_navigate_next )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( modifier = Modifier .padding(innerPadding) .fillMaxSize() .verticalScroll(state = rememberScrollState()) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( modifier = Modifier.padding(horizontal = 16.dp), label = stringResource(id = R.string.appearance) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( modifier = Modifier.padding(horizontal = 16.dp), label = stringResource(id = R.string.data) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( modifier = Modifier.padding(horizontal = 16.dp), label = stringResource(id = R.string.help) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( modifier = Modifier.padding(horizontal = 16.dp), label = stringResource(id = R.string.security) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( modifier = modifier, label = stringResource(id = R.string.about) )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( onExportClick = remember(viewModel) { { viewModel.trySendAction(SettingsAction.DataClick.ExportClick) } }, onImportClick = remember(viewModel) { { viewModel.trySendAction(SettingsAction.DataClick.ImportClick) } }, onBackupClick = remember(viewModel) { { viewModel.trySendAction(SettingsAction.DataClick.BackupClick) } } )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( state = state, biometricsManager = biometricsManager, onBiometricToggle = remember(viewModel) { { viewModel.trySendAction( SettingsAction.SecurityClick.UnlockWithBiometricToggle(it) ) } } )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( text = stringResource(id = R.string.export), onClick = onExportClick, modifier = modifier, withDivider = true, content = { Icon( modifier = Modifier .mirrorIfRtl() .size(24.dp), painter = painterResource(id = R.drawable.ic_navigate_next), contentDescription = null, tint = MaterialTheme.colorScheme.onSurface, ) } )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( text = stringResource(id = R.string.import_vault), onClick = onImportClick, modifier = modifier, withDivider = true, content = { Icon( modifier = Modifier .mirrorIfRtl() .size(24.dp), painter = painterResource(id = R.drawable.ic_navigate_next), contentDescription = null, tint = MaterialTheme.colorScheme.onSurface, ) } )</ID>
<ID>TrailingCommaOnCallSite:SettingsScreen.kt$( title = stringResource(id = R.string.settings), scrollBehavior = scrollBehavior )</ID>
<ID>TrailingCommaOnCallSite:SettingsViewModel.kt$SettingsViewModel$( appearance = it.appearance.copy(language = language) )</ID>
<ID>TrailingCommaOnCallSite:SettingsViewModel.kt$SettingsViewModel$( appearance = it.appearance.copy(theme = theme) )</ID>
<ID>TrailingCommaOnCallSite:SettingsViewModel.kt$SettingsViewModel$( clock, settingsRepository.appLanguage, settingsRepository.appTheme, settingsRepository.isUnlockWithBiometricsEnabled, settingsRepository.isCrashLoggingEnabled )</ID>
<ID>TrailingCommaOnCallSite:SettingsViewModel.kt$SettingsViewModel$( initialState = savedStateHandle[KEY_STATE] ?: createInitialState( clock, settingsRepository.appLanguage, settingsRepository.appTheme, settingsRepository.isUnlockWithBiometricsEnabled, settingsRepository.isCrashLoggingEnabled ) )</ID>
<ID>TrailingCommaOnCallSite:SettingsViewModel.kt$SettingsViewModel.Companion$( appearance = SettingsState.Appearance( language = appLanguage, theme = appTheme, ), isUnlockWithBiometricsEnabled = unlockWithBiometricsEnabled, isSubmitCrashLogsEnabled = isSubmitCrashLogsEnabled, dialog = null, version = R.string.version .asText() .concat(": ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})".asText()), copyrightInfo = copyrightInfo )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( R.string.scan_the_qr_code_in_your_2_step_verification_settings_for_any_account )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( R.string.use_your_device_camera_to_scan_codes )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( R.string.when_using_2_step_verification_youll_enter_your_username_and_password_and_a_code_generated_in_this_app )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( TutorialAction.ContinueClick )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( TutorialAction.TutorialPageChange(pagerState.targetPage) )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( modifier = Modifier .height(50.dp) .fillMaxWidth(), horizontalArrangement = Arrangement.Center )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( modifier = Modifier .padding(8.dp) .background(color, CircleShape) .size(10.dp) )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( modifier = Modifier .padding(innerPadding), verticalArrangement = Arrangement.Center )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( onTutorialFinished = {} )</ID>
<ID>TrailingCommaOnCallSite:TutorialScreen.kt$( painter = painterResource(id = R.drawable.ic_tutorial_2fa), contentDescription = stringResource(id = R.string.unique_codes) )</ID>
<ID>TrailingCommaOnCallSite:TutorialViewModel.kt$TutorialState.QrScannerSlide$( continueButtonText = R.string.continue_button.asText(), isLastPage = false )</ID>
<ID>TrailingCommaOnCallSite:TutorialViewModel.kt$TutorialState.UniqueCodesSlide$( continueButtonText = R.string.get_started.asText(), isLastPage = true )</ID>
<ID>TrailingCommaOnCallSite:TutorialViewModel.kt$TutorialViewModel$( initialState = TutorialState.IntroSlide )</ID>
<ID>TrailingCommaOnCallSite:TwoFasExportParser.kt$TwoFasExportParser$( items = exportData.services.toAuthenticatorItemEntities() )</ID>
<ID>TrailingCommaOnCallSite:UnlockScreen.kt$( modifier = Modifier .padding(innerPadding) .fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally )</ID>
<ID>TrailingCommaOnCallSite:UnlockScreen.kt$( title = R.string.an_error_has_occurred.asText(), message = dialog.message )</ID>
<ID>TrailingCommaOnCallSite:UnlockScreen.kt$( visibilityState = LoadingDialogState.Shown(R.string.loading.asText()) )</ID>
<ID>TrailingCommaOnCallSite:UnlockViewModel.kt$UnlockViewModel$( dialog = UnlockState.Dialog.Error( message = R.string.too_many_failed_biometric_attempts.asText(), ) )</ID>
<ID>TrailingCommaOnCallSite:UnlockViewModel.kt$UnlockViewModel$( initialState = savedStateHandle[KEY_STATE] ?: run { UnlockState( isBiometricsEnabled = settingsRepository.isUnlockWithBiometricsEnabled, isBiometricsValid = biometricsEncryptionManager.isBiometricIntegrityValid(), dialog = null, ) } )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(color = MaterialTheme.colorScheme.primary), onClick = onItemClick, onLongClick = { shouldShowDropdownMenu = true } )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( painter = painterResource(id = R.drawable.ic_edit_item), contentDescription = stringResource(R.string.edit_item) )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( startIcon = IconData.Local(R.drawable.ic_login_item), issuer = "Sample Label", supportingLabel = "Supporting Label", authCode = "1234567890".chunked(3).joinToString(" "), timeLeftSeconds = 15, periodSeconds = 30, onCopyClick = {}, onItemClick = {}, modifier = Modifier.padding(horizontal = 16.dp), alertThresholdSeconds = 7 )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( text = { Text(text = stringResource(id = R.string.delete_item)) }, onClick = { shouldShowDropdownMenu = false onDeleteItemClick() }, leadingIcon = { Icon( painter = painterResource(id = R.drawable.ic_delete_item), contentDescription = stringResource(id = R.string.delete_item), ) } )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( text = { Text(text = stringResource(id = R.string.edit_item)) }, onClick = { shouldShowDropdownMenu = false onEditItemClick() }, leadingIcon = { Icon( painter = painterResource(id = R.drawable.ic_edit_item), contentDescription = stringResource(R.string.edit_item) ) } )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( timeLeftSeconds = timeLeftSeconds, periodSeconds = periodSeconds, alertThresholdSeconds = alertThresholdSeconds )</ID>
<ID>TrailingCommaOnCallSite:VaultVerificationCodeItem.kt$( vertical = 8.dp, horizontal = 16.dp )</ID>
<ID>TrailingCommaOnDeclarationSite:ItemSearchViewModel.kt$SortPriority</ID>
<ID>UndocumentedPublicClass:AegisExportParser.kt$AegisExportParser : ExportParser</ID>
<ID>UndocumentedPublicClass:AegisJsonExport.kt$AegisJsonExport</ID>
<ID>UndocumentedPublicClass:AegisJsonExport.kt$AegisJsonExport$Database</ID>
<ID>UndocumentedPublicClass:AegisJsonExport.kt$AegisJsonExport.Database$Entry</ID>
<ID>UndocumentedPublicClass:AegisJsonExport.kt$AegisJsonExport.Database$Group</ID>
<ID>UndocumentedPublicClass:AegisJsonExport.kt$AegisJsonExport.Database.Entry$Info</ID>
<ID>UndocumentedPublicClass:AuthRepositoryImpl.kt$AuthRepositoryImpl : AuthRepository</ID>
<ID>UndocumentedPublicClass:AuthenticatorApplication.kt$AuthenticatorApplication : Application</ID>
<ID>UndocumentedPublicClass:AuthenticatorDiskSourceImpl.kt$AuthenticatorDiskSourceImpl : AuthenticatorDiskSource</ID>
<ID>UndocumentedPublicClass:AuthenticatorRepositoryImpl.kt$AuthenticatorRepositoryImpl : AuthenticatorRepository</ID>
<ID>UndocumentedPublicClass:AuthenticatorSdkSourceImpl.kt$AuthenticatorSdkSourceImpl : AuthenticatorSdkSource</ID>
<ID>UndocumentedPublicClass:BitwardenExportParser.kt$BitwardenExportParser : ExportParser</ID>
<ID>UndocumentedPublicClass:EditItemViewModel.kt$EditItemAction$ExpandAdvancedOptionsClick : EditItemAction</ID>
<ID>UndocumentedPublicClass:ExpandableFloatingActionButton.kt$ExpandableFabIcon</ID>
<ID>UndocumentedPublicClass:ExpandableFloatingActionButton.kt$ExpandableFabOption</ID>
<ID>UndocumentedPublicClass:ExpandableFloatingActionButton.kt$ExpandableFabState</ID>
<ID>UndocumentedPublicClass:ExpandableFloatingActionButton.kt$ExpandableFabState$Collapsed : ExpandableFabState</ID>
<ID>UndocumentedPublicClass:ExpandableFloatingActionButton.kt$ExpandableFabState$Expanded : ExpandableFabState</ID>
<ID>UndocumentedPublicClass:ExportDataResult.kt$ExportDataResult$Error : ExportDataResult</ID>
<ID>UndocumentedPublicClass:ExportDataResult.kt$ExportDataResult$Success : ExportDataResult</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction$CloseButtonClick : ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction$ConfirmExportClick : ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction$DialogDismiss : ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction$ExportFormatOptionSelect : ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction$ExportLocationReceive : ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction$Internal : ExportAction</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportAction.Internal$SaveExportDataToUriResultReceive : Internal</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportEvent</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportEvent$NavigateBack : ExportEvent</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportEvent$NavigateToSelectExportDestination : ExportEvent</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportEvent$ShowToast : ExportEvent</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportState</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportState$DialogState</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportState.DialogState$Error : DialogState</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportState.DialogState$Loading : DialogState</ID>
<ID>UndocumentedPublicClass:ExportViewModel.kt$ExportViewModel : BaseViewModel</ID>
<ID>UndocumentedPublicClass:FileManagerImpl.kt$FileManagerImpl : FileManager</ID>
<ID>UndocumentedPublicClass:ImportDataResult.kt$ImportDataResult$Error : ImportDataResult</ID>
<ID>UndocumentedPublicClass:ImportDataResult.kt$ImportDataResult$Success : ImportDataResult</ID>
<ID>UndocumentedPublicClass:ItemListingExpandableFabAction.kt$ItemListingExpandableFabAction : ExpandableFabOption</ID>
<ID>UndocumentedPublicClass:ItemListingExpandableFabAction.kt$ItemListingExpandableFabAction$EnterSetupKey : ItemListingExpandableFabAction</ID>
<ID>UndocumentedPublicClass:ItemListingExpandableFabAction.kt$ItemListingExpandableFabAction$ScanQrCode : ItemListingExpandableFabAction</ID>
<ID>UndocumentedPublicClass:ItemListingViewModel.kt$ItemListingState.DialogState$DeleteConfirmationPrompt : DialogState</ID>
<ID>UndocumentedPublicClass:LastPassJsonExport.kt$LastPassJsonExport</ID>
<ID>UndocumentedPublicClass:LastPassJsonExport.kt$LastPassJsonExport$Account</ID>
<ID>UndocumentedPublicClass:LastPassJsonExport.kt$LastPassJsonExport$Folder</ID>
<ID>UndocumentedPublicClass:LastPassJsonExport.kt$LastPassJsonExport.Account$BackupInfo</ID>
<ID>UndocumentedPublicClass:LastPassJsonExport.kt$LastPassJsonExport.Account$FolderData</ID>
<ID>UndocumentedPublicClass:MainActivity.kt$MainActivity : AppCompatActivity</ID>
<ID>UndocumentedPublicClass:ManualCodeEntryViewModel.kt$ManualCodeEntryState$DialogState : Parcelable</ID>
<ID>UndocumentedPublicClass:ManualCodeEntryViewModel.kt$ManualCodeEntryState.DialogState$Error : DialogState</ID>
<ID>UndocumentedPublicClass:ManualCodeEntryViewModel.kt$ManualCodeEntryState.DialogState$Loading : DialogState</ID>
<ID>UndocumentedPublicClass:PlatformDiskModule.kt$PlatformDiskModule</ID>
<ID>UndocumentedPublicClass:PlatformNetworkModule.kt$PlatformNetworkModule</ID>
<ID>UndocumentedPublicClass:RootNavViewModel.kt$RootNavState$NavState : Parcelable</ID>
<ID>UndocumentedPublicClass:RootNavViewModel.kt$RootNavViewModel : BaseViewModel</ID>
<ID>UndocumentedPublicClass:SettingsViewModel.kt$SettingsAction.SecurityClick$UnlockWithBiometricToggle : SecurityClick</ID>
<ID>UndocumentedPublicClass:SettingsViewModel.kt$SettingsState$Dialog : Parcelable</ID>
<ID>UndocumentedPublicClass:SettingsViewModel.kt$SettingsState.Dialog$Loading : Dialog</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport$Group</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport$Service</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport.Service$Badge</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport.Service$Icon</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport.Service$Order</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport.Service$Otp</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport.Service.Icon$IconCollection</ID>
<ID>UndocumentedPublicClass:TwoFasJsonExport.kt$TwoFasJsonExport.Service.Icon$Label</ID>
<ID>UndocumentedPublicFunction:AuthenticatorItemAlgorithm.kt$AuthenticatorItemAlgorithm.Companion$fun fromStringOrNull(value: String): AuthenticatorItemAlgorithm?</ID>
<ID>UndocumentedPublicFunction:AuthenticatorItemEntity.kt$AuthenticatorItemEntity$fun toOtpAuthUriString(): String</ID>
<ID>UndocumentedPublicFunction:AuthenticatorItemType.kt$AuthenticatorItemType.Companion$fun fromStringOrNull(value: String): AuthenticatorItemType?</ID>
<ID>UndocumentedPublicFunction:AuthenticatorSdkSource.kt$AuthenticatorSdkSource$suspend fun generateBiometricsKey(): Result&lt;String&gt;</ID>
<ID>UndocumentedPublicFunction:AuthenticatorTheme.kt$@Composable fun AuthenticatorTheme( theme: AppTheme = AppTheme.DEFAULT, dynamicColor: Boolean = false, content: @Composable () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:EditItemScreen.kt$@Composable fun EditItemContent( modifier: Modifier = Modifier, viewState: EditItemState.ViewState.Content, onIssuerNameTextChange: (String) -&gt; Unit = {}, onUsernameTextChange: (String) -&gt; Unit = {}, onToggleFavorite: (Boolean) -&gt; Unit = {}, onTypeOptionClicked: (AuthenticatorItemType) -&gt; Unit = {}, onTotpCodeTextChange: (String) -&gt; Unit = {}, onAlgorithmOptionClicked: (AuthenticatorItemAlgorithm) -&gt; Unit = {}, onRefreshPeriodOptionClicked: (AuthenticatorRefreshPeriodOption) -&gt; Unit = {}, onNumberOfDigitsChanged: (Int) -&gt; Unit = {}, onExpandAdvancedOptionsClicked: () -&gt; Unit = {}, )</ID>
<ID>UndocumentedPublicFunction:EditItemViewModel.kt$AuthenticatorRefreshPeriodOption.Companion$fun fromSeconds(seconds: Int)</ID>
<ID>UndocumentedPublicFunction:ExpandableFloatingActionButton.kt$@Composable fun &lt;T : ExpandableFabOption&gt; ExpandableFloatingActionButton( modifier: Modifier = Modifier, label: Text?, items: List&lt;T&gt;, expandableFabState: MutableState&lt;ExpandableFabState&gt; = rememberExpandableFabState(), expandableFabIcon: ExpandableFabIcon, onStateChange: (expandableFabState: ExpandableFabState) -&gt; Unit = { }, )</ID>
<ID>UndocumentedPublicFunction:ExpandableFloatingActionButton.kt$@Composable fun rememberExpandableFabState()</ID>
<ID>UndocumentedPublicFunction:ExpandableFloatingActionButton.kt$ExpandableFabState$fun isExpanded()</ID>
<ID>UndocumentedPublicFunction:ExpandableFloatingActionButton.kt$ExpandableFabState$fun toggleValue()</ID>
<ID>UndocumentedPublicFunction:ExportNavigation.kt$fun NavController.navigateToExport(navOptions: NavOptions? = null)</ID>
<ID>UndocumentedPublicFunction:ExportNavigation.kt$fun NavGraphBuilder.exportDestination( onNavigateBack: () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:ExportScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ExportScreen( viewModel: ExportViewModel = hiltViewModel(), intentManager: IntentManager = LocalIntentManager.current, onNavigateBack: () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:ImportingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ImportingScreen( viewModel: ImportingViewModel = hiltViewModel(), intentManager: IntentManager = LocalIntentManager.current, onNavigateBack: () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:ItemListingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable @Preview(showBackground = true) fun EmptyListingContentPreview()</ID>
<ID>UndocumentedPublicFunction:SearchHandlers.kt$SearchHandlers.Companion$fun create(viewModel: ItemSearchViewModel): SearchHandlers</ID>
<ID>UndocumentedPublicFunction:SettingsScreen.kt$@Composable fun SecuritySettings( state: SettingsState, biometricsManager: BiometricsManager = LocalBiometricsManager.current, onBiometricToggle: (Boolean) -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:SettingsScreen.kt$@Composable fun VaultSettings( modifier: Modifier = Modifier, onExportClick: () -&gt; Unit, onImportClick: () -&gt; Unit, onBackupClick: () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:SettingsViewModel.kt$SettingsViewModel.Companion$fun createInitialState( clock: Clock, appLanguage: AppLanguage, appTheme: AppTheme, unlockWithBiometricsEnabled: Boolean, isSubmitCrashLogsEnabled: Boolean, ): SettingsState</ID>
<ID>UndocumentedPublicFunction:TutorialNavigation.kt$fun NavController.navigateToSettingsTutorial(navOptions: NavOptions? = null)</ID>
<ID>UndocumentedPublicFunction:TutorialNavigation.kt$fun NavController.navigateToTutorial(navOptions: NavOptions? = null)</ID>
<ID>UndocumentedPublicFunction:TutorialNavigation.kt$fun NavGraphBuilder.tutorialDestination(onTutorialFinished: () -&gt; Unit)</ID>
<ID>UndocumentedPublicFunction:TutorialNavigation.kt$fun NavGraphBuilder.tutorialSettingsDestination(onTutorialFinished: () -&gt; Unit)</ID>
<ID>UndocumentedPublicFunction:TutorialScreen.kt$@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class) @Composable fun TutorialScreen( viewModel: TutorialViewModel = hiltViewModel(), onTutorialFinished: () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:TutorialScreen.kt$@Preview @Composable fun TutorialScreenPreview()</ID>
<ID>UndocumentedPublicFunction:UnlockScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun UnlockScreen( viewModel: UnlockViewModel = hiltViewModel(), biometricsManager: BiometricsManager = LocalBiometricsManager.current, onUnlocked: () -&gt; Unit, )</ID>
<ID>UndocumentedPublicFunction:VerificationCodeItemExtensions.kt$fun List&lt;VerificationCodeItem&gt;.toViewState( alertThresholdSeconds: Int, ): ItemListingState.ViewState</ID>
<ID>UndocumentedPublicFunction:VerificationCodeItemExtensions.kt$fun VerificationCodeItem.toDisplayItem(alertThresholdSeconds: Int)</ID>
</CurrentIssues>
</SmellBaseline>

668
detekt-config.yml Normal file
View File

@ -0,0 +1,668 @@
build:
maxIssues: 0
excludeCorrectable: false
weights:
config:
validation: true
warningsAsErrors: false
excludes: ''
processors:
active: true
exclude:
- 'DetektProgressListener'
console-reports:
active: true
exclude:
- 'ProjectStatisticsReport'
- 'ComplexityReport'
- 'NotificationReport'
- 'FileBasedFindingsReport'
output-reports:
active: true
exclude:
comments:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**', '**ServiceImpl.kt' ]
AbsentOrWrongFileLicense:
active: false
licenseTemplateFile: 'license.template'
CommentOverPrivateFunction:
active: false
CommentOverPrivateProperty:
active: false
EndOfSentenceFormat:
active: false
endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)'
UndocumentedPublicClass:
active: true
searchInNestedClass: true
searchInInnerClass: true
searchInInnerObject: true
searchInInnerInterface: true
UndocumentedPublicFunction:
active: true
ignoreAnnotated: [ 'Module', 'POST', 'PUT', 'DELETE', 'GET', 'PATCH' ]
UndocumentedPublicProperty:
active: false
complexity:
active: true
ComplexCondition:
active: true
threshold: 4
ComplexInterface:
active: false
threshold: 10
includeStaticDeclarations: false
includePrivateDeclarations: false
CyclomaticComplexMethod:
active: true
threshold: 15
ignoreSingleWhenExpression: true
ignoreSimpleWhenEntries: false
ignoreNestingFunctions: false
nestingFunctions: [ run, let, apply, with, also, use, forEach, isNotNull, ifNull ]
LabeledExpression:
active: false
ignoredLabels: [ ]
LargeClass:
active: true
threshold: 600
LongMethod:
active: true
threshold: 60
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
LongParameterList:
active: true
functionThreshold: 6
constructorThreshold: 7
ignoreDefaultParameters: false
ignoreDataClasses: true
ignoreAnnotated: [ 'Composable', 'dagger.Provides' ]
MethodOverloading:
active: false
threshold: 6
NestedBlockDepth:
active: true
threshold: 4
ReplaceSafeCallChainWithRun:
active: false
StringLiteralDuplication:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
threshold: 3
ignoreAnnotation: true
excludeStringsWithLessThan5Characters: true
ignoreStringsRegex: '$^'
TooManyFunctions:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
thresholdInFiles: 11
thresholdInClasses: 11
thresholdInInterfaces: 11
thresholdInObjects: 11
thresholdInEnums: 11
ignoreDeprecated: false
ignorePrivate: false
ignoreOverridden: false
ignoreAnnotated: [ 'Module' ]
coroutines:
active: true
GlobalCoroutineUsage:
active: false
RedundantSuspendModifier:
active: false
SuspendFunWithFlowReturnType:
active: false
empty-blocks:
active: true
EmptyCatchBlock:
active: true
allowedExceptionNameRegex: '_|(ignore|expected).*'
EmptyClassBlock:
active: true
EmptyDefaultConstructor:
active: true
EmptyDoWhileBlock:
active: true
EmptyElseBlock:
active: true
EmptyFinallyBlock:
active: true
EmptyForBlock:
active: true
EmptyFunctionBlock:
active: true
ignoreOverridden: false
EmptyIfBlock:
active: true
EmptyInitBlock:
active: true
EmptyKtFile:
active: true
EmptySecondaryConstructor:
active: true
EmptyTryBlock:
active: true
EmptyWhenBlock:
active: true
EmptyWhileBlock:
active: true
exceptions:
active: true
ExceptionRaisedInUnexpectedLocation:
active: false
methodNames: [ toString, hashCode, equals, finalize ]
InstanceOfCheckForException:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
NotImplementedDeclaration:
active: false
PrintStackTrace:
active: false
RethrowCaughtException:
active: false
ReturnFromFinally:
active: false
ignoreLabeled: false
SwallowedException:
active: false
ignoredExceptionTypes:
- InterruptedException
- NumberFormatException
- ParseException
- MalformedURLException
allowedExceptionNameRegex: '_|(ignore|expected).*'
ThrowingExceptionFromFinally:
active: false
ThrowingExceptionInMain:
active: false
ThrowingExceptionsWithoutMessageOrCause:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
exceptions:
- IllegalArgumentException
- IllegalStateException
- IOException
ThrowingNewInstanceOfSameException:
active: false
TooGenericExceptionCaught:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
exceptionNames:
- ArrayIndexOutOfBoundsException
- Error
- Exception
- IllegalMonitorStateException
- NullPointerException
- IndexOutOfBoundsException
- RuntimeException
- Throwable
allowedExceptionNameRegex: '_|(ignore|expected).*'
TooGenericExceptionThrown:
active: true
exceptionNames:
- Error
- Exception
- Throwable
- RuntimeException
formatting:
active: true
android: false
autoCorrect: true
AnnotationOnSeparateLine:
active: false
autoCorrect: true
AnnotationSpacing:
active: false
autoCorrect: true
ArgumentListWrapping:
active: false
autoCorrect: true
ChainWrapping:
active: true
autoCorrect: true
CommentSpacing:
active: true
autoCorrect: true
EnumEntryNameCase:
active: false
autoCorrect: true
Filename:
active: false
FinalNewline:
active: true
autoCorrect: true
insertFinalNewLine: true
ImportOrdering:
active: false
autoCorrect: true
layout: 'idea'
Indentation:
active: false
autoCorrect: true
indentSize: 4
MaximumLineLength:
active: true
maxLineLength: 120
ModifierOrdering:
active: true
autoCorrect: true
MultiLineIfElse:
active: true
autoCorrect: true
NoBlankLineBeforeRbrace:
active: true
autoCorrect: true
NoConsecutiveBlankLines:
active: true
autoCorrect: true
NoEmptyClassBody:
active: true
autoCorrect: true
NoEmptyFirstLineInMethodBlock:
active: false
autoCorrect: true
NoLineBreakAfterElse:
active: true
autoCorrect: true
NoLineBreakBeforeAssignment:
active: true
autoCorrect: true
NoMultipleSpaces:
active: true
autoCorrect: true
NoSemicolons:
active: true
autoCorrect: true
NoTrailingSpaces:
active: true
autoCorrect: true
NoUnitReturn:
active: true
autoCorrect: true
NoUnusedImports:
active: true
autoCorrect: true
NoWildcardImports:
active: true
PackageName:
active: true
autoCorrect: true
ParameterListWrapping:
active: true
autoCorrect: true
SpacingAroundColon:
active: true
autoCorrect: true
SpacingAroundComma:
active: true
autoCorrect: true
SpacingAroundCurly:
active: true
autoCorrect: true
SpacingAroundDot:
active: true
autoCorrect: true
SpacingAroundDoubleColon:
active: false
autoCorrect: true
SpacingAroundKeyword:
active: true
autoCorrect: true
SpacingAroundOperators:
active: true
autoCorrect: true
SpacingAroundParens:
active: true
autoCorrect: true
SpacingAroundRangeOperator:
active: true
autoCorrect: true
SpacingBetweenDeclarationsWithAnnotations:
active: false
autoCorrect: true
SpacingBetweenDeclarationsWithComments:
active: false
autoCorrect: true
StringTemplate:
active: true
autoCorrect: true
TrailingCommaOnCallSite:
active: true
autoCorrect: true
useTrailingCommaOnCallSite: true
TrailingCommaOnDeclarationSite:
active: true
autoCorrect: true
useTrailingCommaOnDeclarationSite: true
libraries:
active: true
ForbiddenPublicDataClass:
active: false
LibraryCodeMustSpecifyReturnType:
active: true
LibraryEntitiesShouldNotBePublic:
active: false
naming:
active: true
ClassNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
classPattern: '[A-Z][a-zA-Z0-9]*'
ConstructorParameterNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
parameterPattern: '[a-z][A-Za-z0-9]*'
privateParameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
EnumNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
enumEntryPattern: '[A-Z][_a-zA-Z0-9]*'
ForbiddenClassName:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
forbiddenName: [ ]
FunctionMaxLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
maximumFunctionNameLength: 30
FunctionMinLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
minimumFunctionNameLength: 3
FunctionNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
functionPattern: '([a-z][a-zA-Z0-9]*)|(`.*`)'
excludeClassPattern: '$^'
ignoreAnnotated: [ 'Composable' ]
FunctionParameterNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
parameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
InvalidPackageDeclaration:
active: false
rootPackage: ''
MatchingDeclarationName:
active: true
mustBeFirst: true
MemberNameEqualsClassName:
active: true
NonBooleanPropertyPrefixedWithIs:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
ObjectPropertyNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
constantPattern: '[A-Za-z][_A-Za-z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*'
PackageNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*'
TopLevelPropertyNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**', '**/compose/**' ]
constantPattern: '[A-Z][_A-Z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*'
VariableMaxLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
maximumVariableNameLength: 64
VariableMinLength:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
minimumVariableNameLength: 1
VariableNaming:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
variablePattern: '[a-z][A-Za-z0-9]*'
privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
performance:
active: true
ArrayPrimitive:
active: true
ForEachOnRange:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
SpreadOperator:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
UnnecessaryTemporaryInstantiation:
active: true
potential-bugs:
active: true
Deprecation:
active: false
EqualsAlwaysReturnsTrueOrFalse:
active: true
EqualsWithHashCodeExist:
active: true
ExplicitGarbageCollectionCall:
active: true
HasPlatformType:
active: false
IgnoredReturnValue:
active: false
restrictToConfig: true
returnValueAnnotations: [ '*.CheckReturnValue', '*.CheckResult' ]
ImplicitDefaultLocale:
active: false
ImplicitUnitReturnType:
active: false
allowExplicitReturnType: true
InvalidRange:
active: true
IteratorHasNextCallsNextMethod:
active: true
IteratorNotThrowingNoSuchElementException:
active: true
LateinitUsage:
active: false
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
ignoreAnnotated: [ ]
ignoreOnClassesPattern: ''
MapGetWithNotNullAssertionOperator:
active: false
NullableToStringCall:
active: false
UnconditionalJumpStatementInLoop:
active: false
UnnecessaryNotNullOperator:
active: false
UnnecessarySafeCall:
active: false
UnreachableCode:
active: true
UnsafeCallOnNullableType:
active: true
UnsafeCast:
active: false
UselessPostfixExpression:
active: false
WrongEqualsTypeParameter:
active: true
style:
active: true
BracesOnIfStatements:
active: false
ClassOrdering:
active: false
CollapsibleIfStatements:
active: false
DataClassContainsFunctions:
active: false
conversionFunctionPrefix: [ 'to' ]
DataClassShouldBeImmutable:
active: false
EqualsNullCall:
active: true
EqualsOnSignatureLine:
active: false
ExplicitCollectionElementAccessMethod:
active: false
ExplicitItLambdaParameter:
active: false
ExpressionBodySyntax:
active: false
includeLineWrapping: false
ForbiddenComment:
active: true
comments: [ 'FIXME:', 'STOPSHIP:' ]
allowedPatterns: ''
ForbiddenImport:
active: false
imports: [ ]
forbiddenPatterns: ''
ForbiddenMethodCall:
active: false
methods: [ 'kotlin.io.println', 'kotlin.io.print' ]
ForbiddenVoid:
active: false
ignoreOverridden: false
ignoreUsageInGenerics: false
FunctionOnlyReturningConstant:
active: true
ignoreOverridableFunction: true
excludedFunctions: [ 'describeContents' ]
ignoreAnnotated: [ 'dagger.Provides' ]
LoopWithTooManyJumpStatements:
active: true
maxJumpCount: 1
MagicNumber:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
ignoreNumbers: [ '-1', '0', '0.5', '1', '2' ]
ignoreHashCodeFunction: true
ignorePropertyDeclaration: false
ignoreLocalVariableDeclaration: false
ignoreConstantDeclaration: true
ignoreCompanionObjectPropertyDeclaration: true
ignoreAnnotation: false
ignoreNamedArgument: true
ignoreEnums: false
ignoreRanges: false
MandatoryBracesLoops:
active: false
MaxLineLength:
active: true
maxLineLength: 100
excludePackageStatements: true
excludeImportStatements: true
excludeCommentStatements: false
MayBeConst:
active: true
ModifierOrder:
active: true
NestedClassesVisibility:
active: false
NewLineAtEndOfFile:
active: true
NoTabs:
active: false
OptionalAbstractKeyword:
active: true
OptionalUnit:
active: false
BracesOnWhenStatements:
active: false
PreferToOverPairSyntax:
active: false
ProtectedMemberInFinalClass:
active: true
RedundantExplicitType:
active: false
RedundantVisibilityModifierRule:
active: false
ReturnCount:
active: false
max: 2
excludedFunctions: [ 'equals' ]
excludeLabeled: false
excludeReturnFromLambda: true
excludeGuardClauses: false
SafeCast:
active: true
SerialVersionUIDInSerializableClass:
active: false
SpacingBetweenPackageAndImports:
active: false
ThrowsCount:
active: true
max: 2
TrailingWhitespace:
active: false
UnderscoresInNumericLiterals:
active: false
acceptableLength: 5
UnnecessaryAbstractClass:
active: true
ignoreAnnotated: [ 'Module' ]
UnnecessaryAnnotationUseSiteTarget:
active: false
UnnecessaryApply:
active: false
UnnecessaryInheritance:
active: true
UnnecessaryLet:
active: false
UnnecessaryParentheses:
active: false
UntilInsteadOfRangeTo:
active: false
UnusedImports:
active: false
UnusedPrivateClass:
active: true
UnusedPrivateMember:
active: false
allowedNames: '(_|ignored|expected|serialVersionUID)'
UseArrayLiteralsInAnnotations:
active: false
UseCheckNotNull:
active: false
UseCheckOrError:
active: false
UseDataClass:
active: false
ignoreAnnotated: [ ]
allowVars: false
UseEmptyCounterpart:
active: false
UseIfInsteadOfWhen:
active: false
UseRequire:
active: false
UseRequireNotNull:
active: false
UselessCallOnNotNull:
active: true
UtilityClassWithPublicConstructor:
active: true
ignoreAnnotated: [ 'Module' ]
VarCouldBeVal:
active: false
WildcardImport:
active: true
excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**' ]
excludeImports: [ 'java.util.*', 'kotlinx.android.synthetic.*' ]

View File

@ -28,6 +28,7 @@ androdixAutofill = "1.1.0"
androidxWork = "2.9.1"
bitwardenSdk = "0.4.0-20240314.115913-173"
crashlytics = "3.0.2"
detekt = "1.23.6"
espresso = "3.6.1"
fastlaneScreengrab = "2.1.1"
firebaseBom = "33.2.0"
@ -91,6 +92,8 @@ androidx-test-espresso = { module = "androidx.test.espresso:espresso-core", vers
androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "androidxWork" }
bitwarden-sdk = { module = "com.bitwarden:sdk-android", version.ref = "bitwardenSdk" }
bumptech-glide = { module = "com.github.bumptech.glide:compose", version.ref = "glide" }
detekt-detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" }
detekt-detekt-rules = { module = "io.gitlab.arturbosch.detekt:detekt-rules-libraries", version.ref = "detekt" }
fastlane-screengrab = { module = "tools.fastlane:screengrab", version.ref = "fastlaneScreengrab" }
google-firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" }
google-firebase-cloud-messaging = { module = "com.google.firebase:firebase-messaging-ktx" }
@ -122,6 +125,7 @@ zxing-zxing-core = { module = "com.google.zxing:core", version.ref = "zxing" }
[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "crashlytics" }
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
google-protobuf = { id = "com.google.protobuf", version.ref = "googleProtoBufPlugin" }
google-services = { id = "com.google.gms.google-services", version.ref = "googleServices" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }