- Created a comprehensive user testing plan document to validate the app's usability, reliability, accessibility, and resilience. - Included various test scenarios covering onboarding, product scanning, manual barcode entry, and accessibility features. chore: update dependencies for code quality tools - Added ktlint version 12.2.0 for Kotlin code style enforcement. - Added detekt version 1.23.7 for static code analysis. chore: increment version numbers - Updated MINOR version to 32 and CODE to 43 in version.properties to reflect recent changes.
167 lines
16 KiB
XML
167 lines
16 KiB
XML
<?xml version="1.0" ?>
|
|
<SmellBaseline>
|
|
<ManuallySuppressedIssues></ManuallySuppressedIssues>
|
|
<CurrentIssues>
|
|
<ID>CyclomaticComplexMethod:ListDetailScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ItemDetailSheet( item: ListDetailViewModel.ShoppingListItemUi, otherLists: List<com.safebite.app.data.local.database.entity.ShoppingListEntity>, categories: List<String>, onDismiss: () -> Unit, onUpdateNote: (String) -> Unit, onUpdateCategory: (String) -> Unit, onUpdateEmoji: (String?) -> Unit, onToggleTag: (String) -> Unit, onUpdateImage: (String?) -> Unit, onMoveTo: (Long) -> Unit, onDelete: () -> Unit, onOpenProduct: (() -> Unit)?, onRequestCrop: (Bitmap) -> Unit, )</ID>
|
|
<ID>CyclomaticComplexMethod:ListDetailScreen.kt$@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable fun ListDetailScreen( listId: Long, listName: String, onBack: () -> Unit, onOpenScanner: () -> Unit, onOpenProduct: (String) -> Unit, onOpenCatalog: (Long) -> Unit = {}, viewModel: ListDetailViewModel = hiltViewModel(), )</ID>
|
|
<ID>CyclomaticComplexMethod:ListSortScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ListSortScreen( listId: Long, onBack: () -> Unit, viewModel: ListsViewModel = hiltViewModel(), )</ID>
|
|
<ID>CyclomaticComplexMethod:ListsScreen.kt$@Composable private fun ShoppingListCard( item: ListsViewModel.ShoppingListWithStats, isEditMode: Boolean, onClick: () -> Unit, onSettingsClick: () -> Unit, )</ID>
|
|
<ID>FunctionOnlyReturningConstant:Screen.kt$Screen.ListEdit$fun new()</ID>
|
|
<ID>FunctionOnlyReturningConstant:Screen.kt$Screen.ProfileEdit$fun new()</ID>
|
|
<ID>LongMethod:AllergenAnalysisEngine.kt$AllergenAnalysisEngine$fun analyze( product: Product, profiles: List<UserProfile>, source: DataSource, language: DetectionLanguage = DetectionLanguage.BOTH, healthStrictness: HealthStrictness = HealthStrictness.NORMAL, ): ScanResult</ID>
|
|
<ID>LongMethod:IconPickerSheet.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun IconPickerSheet( currentEmoji: String, categories: List<String>, onDismiss: () -> Unit, onSelectIcon: (String) -> Unit, catalogProvider: CatalogProvider = hiltViewModel<ListDetailViewModel>().catalog, )</ID>
|
|
<ID>LongMethod:ImageCropBottomSheet.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ImageCropBottomSheet( bitmap: Bitmap, onCropComplete: (String?) -> Unit, onDismiss: () -> Unit, sheetState: SheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), )</ID>
|
|
<ID>LongMethod:ListDetailScreen.kt$@Composable private fun ItemDetailPanel( pending: ListDetailViewModel.PendingItem, onQuantity: (Int?) -> Unit, onVariant: (String?) -> Unit, onToggleTag: (String) -> Unit, onNote: (String) -> Unit, )</ID>
|
|
<ID>LongMethod:ListDetailScreen.kt$@OptIn(ExperimentalFoundationApi::class) @Composable private fun ListDetailContent( ready: ListDetailViewModel.UiState.Ready, catalogDomains: List<com.safebite.app.data.local.database.relation.DomainWithCategoriesAndItems>, recentlyExpanded: Boolean, onToggleRecently: () -> Unit, expandedDomains: Map<String, Boolean>, onToggleDomain: (String) -> Unit, expandedRoomCategories: Map<String, Boolean>, onToggleRoomCategory: (String) -> Unit, onTapActive: (Long) -> Unit, onLongPressActive: (Long) -> Unit, onTapRecent: (Long) -> Unit, onLongPressRecent: (Long) -> Unit, onTapCatalogItem: (com.safebite.app.data.local.database.entity.CatalogItemEntity) -> Unit, )</ID>
|
|
<ID>LongMethod:ListDetailScreen.kt$@OptIn(ExperimentalFoundationApi::class) @Composable private fun Tile( data: TileData, onTap: () -> Unit, onLongPress: () -> Unit, )</ID>
|
|
<ID>LongMethod:ListDetailScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ItemDetailSheet( item: ListDetailViewModel.ShoppingListItemUi, otherLists: List<com.safebite.app.data.local.database.entity.ShoppingListEntity>, categories: List<String>, onDismiss: () -> Unit, onUpdateNote: (String) -> Unit, onUpdateCategory: (String) -> Unit, onUpdateEmoji: (String?) -> Unit, onToggleTag: (String) -> Unit, onUpdateImage: (String?) -> Unit, onMoveTo: (Long) -> Unit, onDelete: () -> Unit, onOpenProduct: (() -> Unit)?, onRequestCrop: (Bitmap) -> Unit, )</ID>
|
|
<ID>LongMethod:ListDetailScreen.kt$@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable fun ListDetailScreen( listId: Long, listName: String, onBack: () -> Unit, onOpenScanner: () -> Unit, onOpenProduct: (String) -> Unit, onOpenCatalog: (Long) -> Unit = {}, viewModel: ListDetailViewModel = hiltViewModel(), )</ID>
|
|
<ID>LongMethod:ListNameImageScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ListNameImageScreen( listId: Long, onBack: () -> Unit, viewModel: ListsViewModel = hiltViewModel(), )</ID>
|
|
<ID>LongMethod:ListSettingsScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ListSettingsScreen( listId: Long, onBack: () -> Unit, onOpenSort: () -> Unit, onOpenRegion: () -> Unit, onOpenNameImage: () -> Unit, onOpenMembers: () -> Unit, viewModel: ListsViewModel = hiltViewModel(), )</ID>
|
|
<ID>LongMethod:ListSortScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ListSortScreen( listId: Long, onBack: () -> Unit, viewModel: ListsViewModel = hiltViewModel(), )</ID>
|
|
<ID>LongMethod:ListsScreen.kt$@Composable private fun ShoppingListCard( item: ListsViewModel.ShoppingListWithStats, isEditMode: Boolean, onClick: () -> Unit, onSettingsClick: () -> Unit, )</ID>
|
|
<ID>LongMethod:ProductNotFoundScreen.kt$@OptIn(androidx.compose.material3.ExperimentalMaterial3Api::class) @Composable fun ProductNotFoundScreen( barcode: String, onBack: () -> Unit, onOpenOcr: () -> Unit, onManualSubmit: (String) -> Unit, onScanAgain: () -> Unit, )</ID>
|
|
<ID>LongMethod:ResultScreen.kt$@OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) @Composable private fun ResultContent( result: ScanResult, onScanAgain: () -> Unit, onOcr: () -> Unit, onAddToList: () -> Unit, onOpenAlternatives: () -> Unit, )</ID>
|
|
<ID>LongMethod:TrackingScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun TrackingScreen( onOpenHistoryItem: (String) -> Unit, onOpenScanner: () -> Unit, viewModel: TrackingViewModel = hiltViewModel(), )</ID>
|
|
<ID>LongParameterList:ListDetailScreen.kt$( item: ListDetailViewModel.ShoppingListItemUi, otherLists: List<com.safebite.app.data.local.database.entity.ShoppingListEntity>, categories: List<String>, onDismiss: () -> Unit, onUpdateNote: (String) -> Unit, onUpdateCategory: (String) -> Unit, onUpdateEmoji: (String?) -> Unit, onToggleTag: (String) -> Unit, onUpdateImage: (String?) -> Unit, onMoveTo: (Long) -> Unit, onDelete: () -> Unit, onOpenProduct: (() -> Unit)?, onRequestCrop: (Bitmap) -> Unit, )</ID>
|
|
<ID>LongParameterList:ListDetailScreen.kt$( ready: ListDetailViewModel.UiState.Ready, catalogDomains: List<com.safebite.app.data.local.database.relation.DomainWithCategoriesAndItems>, recentlyExpanded: Boolean, onToggleRecently: () -> Unit, expandedDomains: Map<String, Boolean>, onToggleDomain: (String) -> Unit, expandedRoomCategories: Map<String, Boolean>, onToggleRoomCategory: (String) -> Unit, onTapActive: (Long) -> Unit, onLongPressActive: (Long) -> Unit, onTapRecent: (Long) -> Unit, onLongPressRecent: (Long) -> Unit, onTapCatalogItem: (com.safebite.app.data.local.database.entity.CatalogItemEntity) -> Unit, )</ID>
|
|
<ID>LongParameterList:OnboardingScreen.kt$( name: String, onNameChange: (String) -> Unit, avatar: String, onAvatarChange: (String) -> Unit, isDefault: Boolean, onSetDefault: (Boolean) -> Unit, allergenLevels: Map<AllergenType, AllergenLevel>, onSetAllergenLevel: (AllergenType, AllergenLevel) -> Unit, restrictions: Set<DietaryRestriction>, onToggleRestriction: (DietaryRestriction) -> Unit, customItems: List<CustomDietItem>, onAddCustomItem: (String, CustomItemTag) -> Unit, onRemoveCustomItem: (CustomDietItem) -> Unit, onNext: () -> Unit, )</ID>
|
|
<ID>MagicNumber:AllergenGrid.kt$0xFFE74C3C</ID>
|
|
<ID>MagicNumber:AllergenGrid.kt$0xFFF39C12</ID>
|
|
<ID>MagicNumber:AllergenGrid.kt$0xFFFDEDEC</ID>
|
|
<ID>MagicNumber:AllergenGrid.kt$0xFFFEF5E7</ID>
|
|
<ID>MagicNumber:AllergenGrid.kt$3</ID>
|
|
<ID>MagicNumber:CatalogScreens.kt$3</ID>
|
|
<ID>MagicNumber:CatalogViewModel.kt$CatalogViewModel$5_000</ID>
|
|
<ID>MagicNumber:Charts.kt$0.4f</ID>
|
|
<ID>MagicNumber:Charts.kt$0.5f</ID>
|
|
<ID>MagicNumber:Charts.kt$0xFFE3E2EC</ID>
|
|
<ID>MagicNumber:Charts.kt$360f</ID>
|
|
<ID>MagicNumber:CreateListScreen.kt$1.5f</ID>
|
|
<ID>MagicNumber:DashboardScreen.kt$3_600_000</ID>
|
|
<ID>MagicNumber:DashboardScreen.kt$604_800_000</ID>
|
|
<ID>MagicNumber:DashboardScreen.kt$60_000</ID>
|
|
<ID>MagicNumber:DashboardScreen.kt$86_400_000</ID>
|
|
<ID>MagicNumber:DashboardViewModel.kt$DashboardViewModel$19</ID>
|
|
<ID>MagicNumber:DashboardViewModel.kt$DashboardViewModel$4</ID>
|
|
<ID>MagicNumber:DashboardViewModel.kt$DashboardViewModel$5</ID>
|
|
<ID>MagicNumber:DashboardViewModel.kt$DashboardViewModel$5000</ID>
|
|
<ID>MagicNumber:DashboardViewModel.kt$DashboardViewModel$8</ID>
|
|
<ID>MagicNumber:FamilyViewModel.kt$FamilyViewModel$5_000</ID>
|
|
<ID>MagicNumber:Feedback.kt$0.5f</ID>
|
|
<ID>MagicNumber:Feedback.kt$0.8f</ID>
|
|
<ID>MagicNumber:Feedback.kt$500f</ID>
|
|
<ID>MagicNumber:HealthClassifier.kt$HealthClassifier$3</ID>
|
|
<ID>MagicNumber:HealthClassifier.kt$HealthClassifier$4</ID>
|
|
<ID>MagicNumber:HomeViewModel.kt$HomeViewModel$3</ID>
|
|
<ID>MagicNumber:HomeViewModel.kt$HomeViewModel$5_000</ID>
|
|
<ID>MagicNumber:IconPickerSheet.kt$3</ID>
|
|
<ID>MagicNumber:IconPickerSheet.kt$90f</ID>
|
|
<ID>MagicNumber:ImageCropBottomSheet.kt$0.15f</ID>
|
|
<ID>MagicNumber:ImageCropBottomSheet.kt$0.85f</ID>
|
|
<ID>MagicNumber:ImageCropBottomSheet.kt$0xFF1976D2</ID>
|
|
<ID>MagicNumber:ImageCropBottomSheet.kt$85</ID>
|
|
<ID>MagicNumber:ListDetailScreen.kt$0xFF26A69A</ID>
|
|
<ID>MagicNumber:ListDetailScreen.kt$3</ID>
|
|
<ID>MagicNumber:ListDetailScreen.kt$5</ID>
|
|
<ID>MagicNumber:ListDetailViewModel.kt$ListDetailViewModel$3</ID>
|
|
<ID>MagicNumber:ListDetailViewModel.kt$ListDetailViewModel$4</ID>
|
|
<ID>MagicNumber:ListDetailViewModel.kt$ListDetailViewModel$5000</ID>
|
|
<ID>MagicNumber:ListNameImageScreen.kt$1.5f</ID>
|
|
<ID>MagicNumber:ListSettingsScreen.kt$1.2f</ID>
|
|
<ID>MagicNumber:ListSortScreen.kt$1.02f</ID>
|
|
<ID>MagicNumber:ListsScreen.kt$1.02f</ID>
|
|
<ID>MagicNumber:ListsScreen.kt$3</ID>
|
|
<ID>MagicNumber:ListsScreen.kt$8</ID>
|
|
<ID>MagicNumber:ListsViewModel.kt$ListsViewModel$3</ID>
|
|
<ID>MagicNumber:ListsViewModel.kt$ListsViewModel$5000</ID>
|
|
<ID>MagicNumber:MainScreen.kt$15</ID>
|
|
<ID>MagicNumber:MainScreen.kt$200</ID>
|
|
<ID>MagicNumber:NavGraph.kt$200</ID>
|
|
<ID>MagicNumber:NavGraph.kt$24</ID>
|
|
<ID>MagicNumber:NavGraph.kt$250</ID>
|
|
<ID>MagicNumber:NetworkModule.kt$NetworkModule$15</ID>
|
|
<ID>MagicNumber:NetworkModule.kt$NetworkModule$20</ID>
|
|
<ID>MagicNumber:OcrCaptureScreen.kt$0xAA000000</ID>
|
|
<ID>MagicNumber:OcrCaptureScreen.kt$300</ID>
|
|
<ID>MagicNumber:OnboardingScreen.kt$3</ID>
|
|
<ID>MagicNumber:OnboardingScreen.kt$4</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFF1E8E3E</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFF2E7D32</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFF2ECC71</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFF3498DB</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFF7CB342</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFC62828</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFE74C3C</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFE8F8F5</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFEF6C00</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFF39C12</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFF57C00</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFFBC02D</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFFDEDEC</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$0xFFFEF5E7</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$3</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$50.0</ID>
|
|
<ID>MagicNumber:ProductDetailScreen.kt$6.0</ID>
|
|
<ID>MagicNumber:ProfileComponents.kt$0xFF9575CD</ID>
|
|
<ID>MagicNumber:ProfileComponents.kt$0xFFFFA000</ID>
|
|
<ID>MagicNumber:ProfileViewModel.kt$ProfileViewModel$5_000</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFF1E8E3E</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFF2E7D32</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFF558B2F</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFF757575</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFF7CB342</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFFC62828</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFFEF6C00</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFFF57C00</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$0xFFFBC02D</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$10</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$250</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$3</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$4</ID>
|
|
<ID>MagicNumber:ResultScreen.kt$8</ID>
|
|
<ID>MagicNumber:ResultViewModel.kt$ResultViewModel$5000</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$0.3f</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$0.8f</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$0x99000000</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$0xB3000000</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$0xFF00E676</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$13</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$1800</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$60</ID>
|
|
<ID>MagicNumber:ScannerScreen.kt$8</ID>
|
|
<ID>MagicNumber:SettingsViewModel.kt$SettingsViewModel$5_000</ID>
|
|
<ID>MagicNumber:SplashScreen.kt$0.6f</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$11</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$12</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$23</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$24</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$30</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$365</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$5</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$59</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$5_000</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$60</ID>
|
|
<ID>MagicNumber:TrackingViewModel.kt$TrackingViewModel$7</ID>
|
|
<ID>SwallowedException:ScannerScreen.kt$t: Throwable</ID>
|
|
<ID>TooManyFunctions:CatalogDao.kt$CatalogDao</ID>
|
|
<ID>TooManyFunctions:ListDetailViewModel.kt$ListDetailViewModel : ViewModel</ID>
|
|
<ID>TooManyFunctions:ShoppingListDao.kt$ShoppingListDao</ID>
|
|
<ID>TooManyFunctions:ShoppingListRepositoryImpl.kt$ShoppingListRepositoryImpl : ShoppingListRepository</ID>
|
|
<ID>UnusedParameter:FamilyScreen.kt$onDelete: () -> Unit</ID>
|
|
<ID>UnusedParameter:FamilyScreen.kt$onOpenSettings: () -> Unit</ID>
|
|
<ID>UnusedParameter:FamilyScreen.kt$onSetDefault: () -> Unit</ID>
|
|
<ID>UnusedParameter:IconPickerSheet.kt$count: Int</ID>
|
|
<ID>UnusedParameter:ListDetailScreen.kt$onAddCustom: () -> Unit</ID>
|
|
<ID>UnusedParameter:ListDetailScreen.kt$onUpdateImage: (String?) -> Unit</ID>
|
|
<ID>UnusedParameter:ListsScreen.kt$onOpenScanner: () -> Unit</ID>
|
|
<ID>UnusedParameter:OcrCaptureScreen.kt$onCapture: () -> Unit</ID>
|
|
<ID>UnusedParameter:OnboardingScreen.kt$rationale: Boolean</ID>
|
|
<ID>UnusedParameter:ProductDetailScreen.kt$onOpenProduct: (String) -> Unit</ID>
|
|
<ID>UnusedParameter:TrackingScreen.kt$onOpenScanner: () -> Unit</ID>
|
|
<ID>UnusedPrivateProperty:ListDetailScreen.kt$val expandedCategories = remember { mutableStateMapOf<String, Boolean>() }</ID>
|
|
<ID>UnusedPrivateProperty:ListsScreen.kt$val scope = rememberCoroutineScope()</ID>
|
|
<ID>UnusedPrivateProperty:OcrCaptureScreen.kt$val context = LocalContext.current</ID>
|
|
</CurrentIssues>
|
|
</SmellBaseline>
|