diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index ecf718e..c6ab167 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -27,9 +27,8 @@ jobs: - name: Run ktlint run: ./gradlew ktlintCheck -# TODO: Detekt rules are not fully respected on this code right now. -# - name: Run detekt -# run: ./gradlew detekt + - name: Run detekt + run: ./gradlew detekt - name: Run unit tests run: ./gradlew testDebugUnitTest diff --git a/app/detekt-baseline.xml b/app/detekt-baseline.xml index f504878..1dd8d30 100644 --- a/app/detekt-baseline.xml +++ b/app/detekt-baseline.xml @@ -2,61 +2,62 @@ - ComplexCondition:BinButton.kt$isActuallyConfirming && (!enabled || cacheState == CacheManagementState.IdleEmpty || cacheState == CacheManagementState.Clearing) - ComplexCondition:TreeherderApksScreen.kt$!fenixInstallerViewModel.isLoading && fenixInstallerViewModel.errorMessage == null && (fenixInstallerViewModel.relevantPushComment != null || fenixInstallerViewModel.relevantPushAuthor != null) - CyclomaticComplexMethod:BinButton.kt$@Composable fun BinButton( cacheState: CacheManagementState, onConfirm: () -> Unit, enabled: Boolean ) - CyclomaticComplexMethod:CurrentInstallState.kt$@Composable fun CurrentInstallState( appState: AppState?, apkDisplayDateString: String, modifier: Modifier = Modifier ) - CyclomaticComplexMethod:ProfileViewModel.kt$ProfileViewModel$fun downloadArtifact(artifactUiModel: ArtifactUiModel, context: Context) - CyclomaticComplexMethod:ProfileViewModel.kt$ProfileViewModel$fun searchByAuthor(context: Context) - CyclomaticComplexMethod:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun FenixInstallerApp( fenixInstallerViewModel: FenixInstallerViewModel, onNavigateUp: () -> Unit, ) + ComplexCondition:BinButton.kt$isActuallyConfirming && ( !enabled || cacheState == CacheManagementState.IdleEmpty || cacheState == CacheManagementState.Clearing ) + ComplexCondition:TreeherderApksScreen.kt$!tryFoxViewModel.isLoading && tryFoxViewModel.errorMessage == null && (tryFoxViewModel.relevantPushComment != null || tryFoxViewModel.relevantPushAuthor != null) + CyclomaticComplexMethod:BinButton.kt$@Composable fun BinButton( cacheState: CacheManagementState, onConfirm: () -> Unit, enabled: Boolean, ) + CyclomaticComplexMethod:ProfileScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileScreen( modifier: Modifier = Modifier, onNavigateUp: () -> Unit, profileViewModel: ProfileViewModel, ) + CyclomaticComplexMethod:ProfileViewModel.kt$ProfileViewModel$fun searchByAuthor() + CyclomaticComplexMethod:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun TryFoxMainScreen( tryFoxViewModel: TryFoxViewModel, onNavigateUp: () -> Unit, ) + EmptyDefaultConstructor:BinButton.kt$CacheStateProvider$() ForbiddenComment:PushCommentCard.kt$/* TODO: Potentially handle click, e.g. view author profile or filter by author */ ForbiddenComment:TreeherderApksScreen.kt$// TODO: Consider creating a specific string resource for \"Download failed\" if it's a common prefix for user-facing errors. - FunctionNaming:AbiChip.kt$@Composable fun AbiChip( abi: AbiUiModel ) - FunctionNaming:AppCard.kt$@Composable fun AppCard( job: JobDetailsUiModel, viewModel: FenixInstallerViewModel ) - FunctionNaming:AppCard.kt$@Composable private fun DisplayArtifactCard( artifact: ArtifactUiModel, viewModel: FenixInstallerViewModel, context: Context ) + FunctionNaming:AbiChip.kt$@Composable fun AbiChip( abi: AbiUiModel, ) + FunctionNaming:AppCard.kt$@Composable fun AppCard( job: JobDetailsUiModel, viewModel: TryFoxViewModel, ) + FunctionNaming:AppCard.kt$@Composable private fun DisplayArtifactCard( artifact: ArtifactUiModel, viewModel: TryFoxViewModel, ) FunctionNaming:AppIcon.kt$@Composable fun AppIcon(appName: String, modifier: Modifier = Modifier) - FunctionNaming:ArchiveGroupCard.kt$@Composable fun ArchiveGroupCard( modifier: Modifier = Modifier, apks: List<ApkUiModel>, homeViewModel: HomeViewModel, context: Context, appState: AppState? ) - FunctionNaming:ArtifactCard.kt$@OptIn(ExperimentalMaterial3Api::class) // Needed for AssistChip @Composable fun ArtifactCard( downloadState: DownloadState, abi: AbiUiModel, onDownloadClick: () -> Unit, onInstallClick: (File) -> Unit ) - FunctionNaming:BinButton.kt$@Composable fun BinButton( cacheState: CacheManagementState, onConfirm: () -> Unit, enabled: Boolean ) - FunctionNaming:BinButton.kt$@Preview(showBackground = true, name = "Completion Cycle Simulation (Button initially enabled)") @Composable fun BinButtonCompletionCyclePreview() - FunctionNaming:BinButton.kt$@Preview(showBackground = true, name = "Confirming State (Enabled)") @Composable fun BinButtonConfirmingPreview() - FunctionNaming:BinButton.kt$@Preview(showBackground = true, name = "Disabled (Clearing State)") @Composable fun BinButtonLoadingPreview() - FunctionNaming:BinButton.kt$@Preview(showBackground = true, name = "Disabled (IdleEmpty State)") @Composable fun BinButtonDisabledIdleEmptyPreview() - FunctionNaming:BinButton.kt$@Preview(showBackground = true, name = "Disabled (e.g. Downloading)") @Composable fun BinButtonDisabledDownloadingPreview() - FunctionNaming:BinButton.kt$@Preview(showBackground = true, name = "Enabled (IdleNonEmpty State)") @Composable fun BinButtonIdleNonEmptyPreview() - FunctionNaming:CurrentInstallState.kt$@Composable fun CurrentInstallState( appState: AppState?, apkDisplayDateString: String, modifier: Modifier = Modifier ) + FunctionNaming:ArchiveGroupCard.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ArchiveGroupCard( modifier: Modifier = Modifier, apks: List<ApkUiModel>, onDownloadClick: (ApkUiModel) -> Unit, onInstallClick: (File) -> Unit, onOpenAppClick: () -> Unit, appState: AppState?, onDateSelected: (LocalDate) -> Unit, userPickedDate: LocalDate?, appName: String, errorMessage: String?, isLoading: Boolean, dateValidator: (LocalDate) -> Boolean, onClearDate: () -> Unit, ) + FunctionNaming:ArchiveGroupCard.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ArchiveGroupAbiSelector( apks: List<ApkUiModel>, onDownloadClick: (ApkUiModel) -> Unit, onInstallClick: (File) -> Unit, ) + FunctionNaming:ArchiveGroupCard.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ArchiveGroupHeader( appName: String, version: String, date: String, onDateSelected: (LocalDate) -> Unit, onOpenAppClick: () -> Unit, userPickedDate: LocalDate?, isDatePickerEnabled: Boolean, dateValidator: (LocalDate) -> Boolean, onClearDate: () -> Unit, ) + FunctionNaming:ArtifactCard.kt$@OptIn(ExperimentalMaterial3Api::class) // Needed for AssistChip @Composable fun ArtifactCard( downloadState: DownloadState, abi: AbiUiModel, onDownloadClick: () -> Unit, onInstallClick: (File) -> Unit, ) + FunctionNaming:BinButton.kt$@BinButtonPreview @Composable fun BinButtonDisabledDownloadingPreview( @PreviewParameter(CacheStateProvider::class) state: CacheManagementState, ) + FunctionNaming:BinButton.kt$@Composable fun BinButton( cacheState: CacheManagementState, onConfirm: () -> Unit, enabled: Boolean, ) + FunctionNaming:BinButton.kt$@Preview( showBackground = true, name = "Completion Cycle Simulation (Button initially enabled)", widthDp = 100, heightDp = 100, ) @Composable fun BinButtonCompletionCyclePreview() + FunctionNaming:CurrentInstallState.kt$@Composable fun CurrentInstallState( appState: AppState?, modifier: Modifier = Modifier, ) FunctionNaming:DownloadButton.kt$@Composable fun DownloadButton( downloadState: DownloadState, onDownloadClick: () -> Unit, onInstallClick: (File) -> Unit, ) - FunctionNaming:ExpandableListView.kt$@Composable fun ExpandableListView( title: String, initiallyExpanded: Boolean = false, content: @Composable () -> Unit ) - FunctionNaming:HomeScreen.kt$@Composable fun AppNightlyComponent( state: FocusApksState, appState: AppState?, homeViewModel: HomeViewModel, // Kept for actions like downloadNightlyApk context: Context // Kept for actions within ApkCard potentially ) - FunctionNaming:HomeScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( modifier: Modifier = Modifier, onNavigateToTreeherder: () -> Unit, onNavigateToProfile: () -> Unit, homeViewModel: HomeViewModel = viewModel() // Assuming ViewModel is provided by Hilt or default factory later ) - FunctionNaming:MainActivity.kt$MainActivity$@Composable fun AppNavigation(mainActivityViewModel: FenixInstallerViewModel) + FunctionNaming:ExpandableListView.kt$@Composable fun ExpandableListView( title: String, initiallyExpanded: Boolean = false, content: @Composable () -> Unit, ) + FunctionNaming:HomeScreen.kt$@Composable fun AppComponent( app: AppUiModel, onDownloadClick: (ApkUiModel) -> Unit, onInstallClick: (File) -> Unit, onOpenAppClick: (String) -> Unit, onDateSelected: (String, LocalDate) -> Unit, dateValidator: (LocalDate) -> Boolean, onClearDate: (String) -> Unit, ) + FunctionNaming:HomeScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( modifier: Modifier = Modifier, onNavigateToTreeherder: () -> Unit, onNavigateToProfile: () -> Unit, homeViewModel: HomeViewModel = viewModel(), ) + FunctionNaming:MainActivity.kt$MainActivity$@Composable fun AppNavigation(mainActivityViewModel: TryFoxViewModel) FunctionNaming:ProfileScreen.kt$@Composable private fun ErrorState(errorMessage: String, modifier: Modifier = Modifier) - FunctionNaming:ProfileScreen.kt$@Composable private fun JobCard( job: JobDetailsUiModel, profileViewModel: ProfileViewModel, context: Context ) - FunctionNaming:ProfileScreen.kt$@Composable private fun ProfileSearchButton( onClick: () -> Unit, enabled: Boolean, isLoading: Boolean, modifier: Modifier = Modifier ) - FunctionNaming:ProfileScreen.kt$@OptIn(ExperimentalComposeUiApi::class) @Composable private fun UserSearchCard( email: String, onEmailChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, modifier: Modifier = Modifier ) - FunctionNaming:ProfileScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileScreen( modifier: Modifier = Modifier, onNavigateUp: () -> Unit, profileViewModel: ProfileViewModel ) + FunctionNaming:ProfileScreen.kt$@Composable private fun JobCard( job: JobDetailsUiModel, profileViewModel: ProfileViewModel, ) + FunctionNaming:ProfileScreen.kt$@Composable private fun ProfileSearchButton( onClick: () -> Unit, enabled: Boolean, isLoading: Boolean, modifier: Modifier = Modifier, ) + FunctionNaming:ProfileScreen.kt$@OptIn(ExperimentalComposeUiApi::class) @Composable private fun UserSearchCard( email: String, onEmailChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, modifier: Modifier = Modifier, ) + FunctionNaming:ProfileScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileScreen( modifier: Modifier = Modifier, onNavigateUp: () -> Unit, profileViewModel: ProfileViewModel, ) FunctionNaming:PushCommentCard.kt$@Composable fun PushCommentCard(comment: String, author: String?, revision: String) - FunctionNaming:Theme.kt$@Composable fun FenixInstallerTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ dynamicColor: Boolean = true, content: @Composable () -> Unit ) + FunctionNaming:Theme.kt$@Composable fun TryFoxTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ dynamicColor: Boolean = true, content: @Composable () -> Unit, ) FunctionNaming:TreeherderApksScreen.kt$@Composable fun ErrorState(errorMessage: String) FunctionNaming:TreeherderApksScreen.kt$@Composable fun LoadingState() - FunctionNaming:TreeherderApksScreen.kt$@Composable fun SearchButton( // This is the local SearchButton onClick: () -> Unit, enabled: Boolean, isLoading: Boolean, modifier: Modifier = Modifier ) - FunctionNaming:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun FenixInstallerApp( fenixInstallerViewModel: FenixInstallerViewModel, onNavigateUp: () -> Unit, ) - FunctionNaming:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchSection( selectedProject: String, onProjectSelected: (String) -> Unit, revision: String, onRevisionChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean ) - LongMethod:AppCard.kt$@Composable fun AppCard( job: JobDetailsUiModel, viewModel: FenixInstallerViewModel ) - LongMethod:ArchiveGroupCard.kt$@Composable fun ArchiveGroupCard( modifier: Modifier = Modifier, apks: List<ApkUiModel>, homeViewModel: HomeViewModel, context: Context, appState: AppState? ) - LongMethod:BinButton.kt$@Composable fun BinButton( cacheState: CacheManagementState, onConfirm: () -> Unit, enabled: Boolean ) - LongMethod:CurrentInstallState.kt$@Composable fun CurrentInstallState( appState: AppState?, apkDisplayDateString: String, modifier: Modifier = Modifier ) - LongMethod:HomeScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( modifier: Modifier = Modifier, onNavigateToTreeherder: () -> Unit, onNavigateToProfile: () -> Unit, homeViewModel: HomeViewModel = viewModel() // Assuming ViewModel is provided by Hilt or default factory later ) - LongMethod:MainActivity.kt$MainActivity$@Composable fun AppNavigation(mainActivityViewModel: FenixInstallerViewModel) - LongMethod:ProfileScreen.kt$@OptIn(ExperimentalComposeUiApi::class) @Composable private fun UserSearchCard( email: String, onEmailChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, modifier: Modifier = Modifier ) - LongMethod:ProfileScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileScreen( modifier: Modifier = Modifier, onNavigateUp: () -> Unit, profileViewModel: ProfileViewModel ) - LongMethod:ProfileViewModel.kt$ProfileViewModel$fun downloadArtifact(artifactUiModel: ArtifactUiModel, context: Context) - LongMethod:ProfileViewModel.kt$ProfileViewModel$fun searchByAuthor(context: Context) + FunctionNaming:TreeherderApksScreen.kt$@Composable fun SearchButton( // This is the local SearchButton onClick: () -> Unit, enabled: Boolean, isLoading: Boolean, modifier: Modifier = Modifier, ) + FunctionNaming:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchSection( selectedProject: String, onProjectSelected: (String) -> Unit, revision: String, onRevisionChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, ) + FunctionNaming:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun TryFoxMainScreen( tryFoxViewModel: TryFoxViewModel, onNavigateUp: () -> Unit, ) + LongMethod:AppCard.kt$@Composable fun AppCard( job: JobDetailsUiModel, viewModel: TryFoxViewModel, ) + LongMethod:ArchiveGroupCard.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ArchiveGroupCard( modifier: Modifier = Modifier, apks: List<ApkUiModel>, onDownloadClick: (ApkUiModel) -> Unit, onInstallClick: (File) -> Unit, onOpenAppClick: () -> Unit, appState: AppState?, onDateSelected: (LocalDate) -> Unit, userPickedDate: LocalDate?, appName: String, errorMessage: String?, isLoading: Boolean, dateValidator: (LocalDate) -> Boolean, onClearDate: () -> Unit, ) + LongMethod:ArchiveGroupCard.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable private fun ArchiveGroupHeader( appName: String, version: String, date: String, onDateSelected: (LocalDate) -> Unit, onOpenAppClick: () -> Unit, userPickedDate: LocalDate?, isDatePickerEnabled: Boolean, dateValidator: (LocalDate) -> Boolean, onClearDate: () -> Unit, ) + LongMethod:BinButton.kt$@Composable fun BinButton( cacheState: CacheManagementState, onConfirm: () -> Unit, enabled: Boolean, ) + LongMethod:HomeScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun HomeScreen( modifier: Modifier = Modifier, onNavigateToTreeherder: () -> Unit, onNavigateToProfile: () -> Unit, homeViewModel: HomeViewModel = viewModel(), ) + LongMethod:HomeViewModel.kt$HomeViewModel$fun initialLoad() + LongMethod:MainActivity.kt$MainActivity$@Composable fun AppNavigation(mainActivityViewModel: TryFoxViewModel) + LongMethod:ProfileScreen.kt$@OptIn(ExperimentalComposeUiApi::class) @Composable private fun UserSearchCard( email: String, onEmailChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, modifier: Modifier = Modifier, ) + LongMethod:ProfileScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileScreen( modifier: Modifier = Modifier, onNavigateUp: () -> Unit, profileViewModel: ProfileViewModel, ) + LongMethod:ProfileViewModel.kt$ProfileViewModel$fun downloadArtifact(artifactUiModel: ArtifactUiModel) + LongMethod:ProfileViewModel.kt$ProfileViewModel$fun searchByAuthor() LongMethod:PushCommentCard.kt$@Composable fun PushCommentCard(comment: String, author: String?, revision: String) - LongMethod:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun FenixInstallerApp( fenixInstallerViewModel: FenixInstallerViewModel, onNavigateUp: () -> Unit, ) - LongMethod:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchSection( selectedProject: String, onProjectSelected: (String) -> Unit, revision: String, onRevisionChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean ) - LongParameterList:TreeherderApksScreen.kt$( selectedProject: String, onProjectSelected: (String) -> Unit, revision: String, onRevisionChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean ) - MagicNumber:AppGraphBindings.kt$AppGraphBindings$30 + LongMethod:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun SearchSection( selectedProject: String, onProjectSelected: (String) -> Unit, revision: String, onRevisionChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, ) + LongMethod:TreeherderApksScreen.kt$@OptIn(ExperimentalMaterial3Api::class) @Composable fun TryFoxMainScreen( tryFoxViewModel: TryFoxViewModel, onNavigateUp: () -> Unit, ) + LongParameterList:ArchiveGroupCard.kt$( appName: String, version: String, date: String, onDateSelected: (LocalDate) -> Unit, onOpenAppClick: () -> Unit, userPickedDate: LocalDate?, isDatePickerEnabled: Boolean, dateValidator: (LocalDate) -> Boolean, onClearDate: () -> Unit, ) + LongParameterList:ArchiveGroupCard.kt$( modifier: Modifier = Modifier, apks: List<ApkUiModel>, onDownloadClick: (ApkUiModel) -> Unit, onInstallClick: (File) -> Unit, onOpenAppClick: () -> Unit, appState: AppState?, onDateSelected: (LocalDate) -> Unit, userPickedDate: LocalDate?, appName: String, errorMessage: String?, isLoading: Boolean, dateValidator: (LocalDate) -> Boolean, onClearDate: () -> Unit, ) + LongParameterList:HomeScreen.kt$( app: AppUiModel, onDownloadClick: (ApkUiModel) -> Unit, onInstallClick: (File) -> Unit, onOpenAppClick: (String) -> Unit, onDateSelected: (String, LocalDate) -> Unit, dateValidator: (LocalDate) -> Boolean, onClearDate: (String) -> Unit, ) + LongParameterList:TreeherderApksScreen.kt$( selectedProject: String, onProjectSelected: (String) -> Unit, revision: String, onRevisionChange: (String) -> Unit, onSearchClick: () -> Unit, isLoading: Boolean, ) MagicNumber:BinButton.kt$200 MagicNumber:BinButton.kt$2000L MagicNumber:BinButton.kt$300 @@ -67,95 +68,85 @@ MagicNumber:Color.kt$0xFFCCC2DC MagicNumber:Color.kt$0xFFD0BCFF MagicNumber:Color.kt$0xFFEFB8C8 - MagicNumber:CurrentInstallState.kt$31 - MagicNumber:CurrentInstallState.kt$7 MagicNumber:FenixRepository.kt$FenixRepository$10 MagicNumber:FenixRepository.kt$FenixRepository$1024 MagicNumber:FenixRepository.kt$FenixRepository$4 MagicNumber:HomeViewModel.kt$HomeViewModel$10 + MagicNumber:HomeViewModel.kt$HomeViewModel$12 + MagicNumber:HomeViewModel.kt$HomeViewModel$13 + MagicNumber:HomeViewModel.kt$HomeViewModel$2021 + MagicNumber:HomeViewModel.kt$HomeViewModel$2023 + MagicNumber:HomeViewModel.kt$HomeViewModel$21 + MagicNumber:HomeViewModel.kt$HomeViewModel$7 MagicNumber:JobDetailsSerializer.kt$JobDetailsSerializer$14 MagicNumber:JobDetailsSerializer.kt$JobDetailsSerializer$3 MagicNumber:JobDetailsSerializer.kt$JobDetailsSerializer$4 MagicNumber:JobDetailsSerializer.kt$JobDetailsSerializer$5 + MagicNumber:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$10 MagicNumber:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$3 MagicNumber:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$4 + MagicNumber:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$404 MagicNumber:TreeherderApksScreen.kt$0.5f - MatchingDeclarationName:JobUiModel.kt$JobDetailsUiModel - MatchingDeclarationName:UiModels.kt$DownloadState MaxLineLength:AbiChip.kt$label = { Text(abi.name ?: stringResource(id = R.string.abi_chip_unknown_abi_name), style = MaterialTheme.typography.labelSmall) } MaxLineLength:AppCard.kt$ErrorState(errorMessage = stringResource(id = R.string.app_card_download_failed_message, errorMessage ?: stringResource(id = R.string.common_unknown_error))) MaxLineLength:AppCard.kt$contentDescription = if (isExpanded) stringResource(id = R.string.app_card_collapse_description) else stringResource(id = R.string.app_card_expand_description) MaxLineLength:AppCard.kt$text = stringResource(id = R.string.app_card_unsupported_apks_title, unsupportedArtifacts.size) - MaxLineLength:AppGraphBindings.kt$AppGraphBindings$fun MaxLineLength:AppIcon.kt$appName.contains("fenix-nightly", ignoreCase = true) -> R.drawable.ic_fenix_nightly to R.string.app_icon_firefox_nightly_description - MaxLineLength:ArchiveGroupCard.kt$Text(stringResource(id = R.string.archive_group_card_no_apk_details), style = MaterialTheme.typography.bodyMedium) - MaxLineLength:ArchiveGroupCard.kt$Text(stringResource(id = R.string.archive_group_card_no_apks_for_date), style = MaterialTheme.typography.bodyMedium, modifier = Modifier.padding(top = 8.dp)) - MaxLineLength:BinButton.kt$if - MaxLineLength:BinButton.kt$val contentDescRes = if (isActuallyConfirming) R.string.bin_button_confirm_clear_cache_description else R.string.bin_button_clear_cache_description - MaxLineLength:BinButton.kt$var currentCacheState by remember { mutableStateOf<CacheManagementState>(CacheManagementState.IdleNonEmpty) } - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.d("FenixInstallerViewModel", "Download action for $downloadKey - already in progress or downloaded. State: ${artifactUiModel.downloadState}") - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.d("FenixInstallerViewModel", "Found push ID: $pushId for project: $selectedProject, revision: $revision") - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.d("FenixInstallerViewModel", "Starting job/artifact search for project: $selectedProject, revision: $revision") - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.e("FenixInstallerViewModel", "Error fetching artifacts for task ID $taskId: ${artifactsResult.message}", artifactsResult.cause) - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.e("FenixInstallerViewModel", "Error fetching/parsing jobs for push ID $pushId: ${jobsResult.message}", jobsResult.cause) - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.i("FenixInstallerViewModel", "Download completed for $downloadKey at ${result.data.absolutePath}") - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.i("FenixInstallerViewModel", "Preparing to fetch artifacts for job: '${netJob.jobName}' (TaskID: ${netJob.taskId})") - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$Log.i("FenixInstallerViewModel", "Setting project to: ${project ?: "default (try)"}, revision from deep link to: $newRevision and triggering search.") - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$if - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$private - MaxLineLength:FenixInstallerViewModel.kt$FenixInstallerViewModel$updateArtifactDownloadState(taskId, artifactUiModel.name, DownloadState.DownloadFailed(result.message)) + MaxLineLength:AppIcon.kt$appName.contains("reference", ignoreCase = true) -> R.drawable.ic_reference_browser to R.string.app_icon_reference_browser_description + MaxLineLength:ArchiveGroupCard.kt$initialSelectedDateMillis = initialDate.atStartOfDayIn(TimeZone.currentSystemDefault()).toEpochMilliseconds() + MaxLineLength:ArchiveGroupCard.kt$val initialDate = userPickedDate ?: parseDateToLocalDate(date) ?: Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date + MaxLineLength:DateUtils.kt$Instant.fromEpochMilliseconds(parseDateToMillis(dateString)).toLocalDateTime(TimeZone.currentSystemDefault()).date + MaxLineLength:FakeMozillaPackageManager.kt$FakeMozillaPackageManager$get() = apps["org.mozilla.reference.browser"] ?: AppState("Reference Browser", "org.mozilla.reference.browser", null, null) MaxLineLength:FenixRepository.kt$FenixRepository$if MaxLineLength:FenixRepository.kt$FenixRepository$logcat(LogPriority.ERROR, TAG) { "Download failed for URL $downloadUrl: ${e.message}\n${Log.getStackTraceString(e)}" } MaxLineLength:FenixRepository.kt$FenixRepository$logcat(LogPriority.ERROR, TAG) { "Exception during file I/O stream operations: ${e.message}\n${Log.getStackTraceString(e)}" } MaxLineLength:FenixRepository.kt$FenixRepository$logcat(LogPriority.WARN, TAG) { "Exception closing InputStream: ${e.message}\n${Log.getStackTraceString(e)}" } MaxLineLength:FenixRepository.kt$FenixRepository$logcat(LogPriority.WARN, TAG) { "Exception closing OutputStream: ${e.message}\n${Log.getStackTraceString(e)}" } - MaxLineLength:HomeScreen.kt$Column - MaxLineLength:HomeScreen.kt$Text(stringResource(id = R.string.home_fetching_nightly_builds), modifier = Modifier.padding(top = 8.dp)) - MaxLineLength:HomeScreen.kt$val currentCacheState = (screenState as? HomeScreenState.Loaded)?.cacheManagementState ?: CacheManagementState.IdleEmpty - MaxLineLength:HomeViewModel.kt$HomeViewModel$it.copy(fenixBuildsState = errorState, isDownloadingAnyFile = checkIsDownloading(errorState, it.focusBuildsState)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$it.copy(fenixBuildsState = newState, isDownloadingAnyFile = checkIsDownloading(newState, it.focusBuildsState)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$it.copy(focusBuildsState = errorState, isDownloadingAnyFile = checkIsDownloading(it.fenixBuildsState, errorState)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$it.copy(focusBuildsState = newState, isDownloadingAnyFile = checkIsDownloading(it.fenixBuildsState, newState)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$private - MaxLineLength:HomeViewModel.kt$HomeViewModel$return if (!isFenixPopulated && !isFocusPopulated) CacheManagementState.IdleEmpty else CacheManagementState.IdleNonEmpty - MaxLineLength:HomeViewModel.kt$HomeViewModel$updateApkDownloadStateInScreenState(apkInfo.appName, apkInfo.uniqueKey, DownloadState.DownloadFailed(result.message)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$updateApkDownloadStateInScreenState(apkInfo.appName, apkInfo.uniqueKey, DownloadState.Downloaded(result.data)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$updateApkDownloadStateInScreenState(apkInfo.appName, apkInfo.uniqueKey, DownloadState.InProgress(progress)) - MaxLineLength:HomeViewModel.kt$HomeViewModel$val - MaxLineLength:HomeViewModel.kt$HomeViewModel$val fenixDownloading = (fenixState as? FocusApksState.Success)?.apks?.any { it.downloadState is DownloadState.InProgress } == true - MaxLineLength:HomeViewModel.kt$HomeViewModel$val focusDownloading = (focusState as? FocusApksState.Success)?.apks?.any { it.downloadState is DownloadState.InProgress } == true - MaxLineLength:HomeViewModel.kt$HomeViewModel$val isCompatible = deviceSupportedAbis.any { deviceAbi -> deviceAbi.equals(parsedApk.abiName, ignoreCase = true) } - MaxLineLength:HomeViewModel.kt$HomeViewModel$val newState = if (apks.isEmpty()) FocusApksState.Error("No Fenix nightly builds found.") else FocusApksState.Success(apks) - MaxLineLength:HomeViewModel.kt$HomeViewModel$val newState = if (apks.isEmpty()) FocusApksState.Error("No Focus nightly builds found.") else FocusApksState.Success(apks) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertEquals("Cache state should be IdleEmpty when cache is empty", CacheManagementState.IdleEmpty, state!!.cacheManagementState) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertEquals("Cache state should be IdleNonEmpty", CacheManagementState.IdleNonEmpty, state!!.cacheManagementState) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertEquals("Error fetching Fenix nightly builds: $errorMessage", (state.fenixBuildsState as FocusApksState.Error).message) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue("DownloadState should be DownloadFailed", failedApkInfo!!.downloadState is DownloadState.DownloadFailed) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue("Initial HomeScreenState should be InitialLoading", viewModel.homeScreenState.value is HomeScreenState.InitialLoading) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue((loadedState.fenixBuildsState as FocusApksState.Success).apks.first().downloadState is DownloadState.Downloaded) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue((loadedState.fenixBuildsState as FocusApksState.Success).apks.first().downloadState is DownloadState.NotDownloaded) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$fullUrl = "http://fake.url/$dateRaw-$appName-$version-android-$abi/$appName-$version.multi.android-$abi.apk" + MaxLineLength:HomeScreen.kt$contentDescription = stringResource(id = R.string.home_search_treeherder_button_description) + MaxLineLength:HomeViewModel.kt$HomeViewModel$is NetworkResult.Error -> ApksResult.Error("Error fetching $appName nightly builds for $date: ${result.message}") + MaxLineLength:HomeViewModel.kt$HomeViewModel$is NetworkResult.Error -> ApksResult.Error("Error fetching $appName nightly builds: ${result.message}") + MaxLineLength:HomeViewModel.kt$HomeViewModel$isDownloadingAnyFile = if (newCacheState is CacheManagementState.IdleEmpty) false else currentState.isDownloadingAnyFile + MaxLineLength:HomeViewModel.kt$HomeViewModel$val updatedApks = apksResult.apks.map { it.copy(downloadState = DownloadState.NotDownloaded) } + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$"https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/mobile.v2.$appName.nightly.latest.$abi/artifacts/public/target.$abi.apk" + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertEquals(CacheManagementState.IdleEmpty, loadedState.cacheManagementState, "Cache state should be IdleEmpty after clear") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertEquals(CacheManagementState.IdleNonEmpty, loadedState.cacheManagementState, "Cache state should be IdleNonEmpty initially") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertEquals(CacheManagementState.IdleNonEmpty, state!!.cacheManagementState, "Cache state should be IdleNonEmpty") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue(failedApkInfo!!.downloadState is DownloadState.DownloadFailed, "DownloadState should be DownloadFailed") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue(fenixStateAfterClear.apks.first().downloadState is DownloadState.NotDownloaded, "Fenix APK download state should be NotDownloaded after clear") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue(fenixSuccessStatePre.apks.first().downloadState is DownloadState.Downloaded, "Fenix APK download state should be Downloaded") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue(rbStateAfterClear.apks.first().downloadState is DownloadState.NotDownloaded, "RB APK download state should be NotDownloaded after clear") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue(rbSuccessStatePre.apks.first().downloadState is DownloadState.Downloaded, "RB APK download state should be Downloaded") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$assertTrue(viewModel.homeScreenState.value is HomeScreenState.InitialLoading, "Initial HomeScreenState should be InitialLoading") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$fun MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$private - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$val mockFenixAppState = AppState(name = testFenixAppName, packageName = "org.mozilla.fenix", version = "123", installDateMillis = 0L) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$viewModel.deviceSupportedAbisForTesting = listOf("arm64-v8a", "x86_64", "armeabi-v7a") - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds()).thenReturn(NetworkResult.Success(listOf(fenixParsed))) - MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFocusNightlyBuilds()).thenReturn(NetworkResult.Success(listOf(focusParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$val fenixCacheActualDir = File(tempCacheDir, "${fenixApkUiForCache.appName}/${fenixApkUiForCache.date.take(10)}") + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds(anyOrNull())).thenReturn(NetworkResult.Success(emptyList())) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds(anyOrNull())).thenReturn(NetworkResult.Success(listOf(fenixParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds(anyOrNull())).thenReturn(NetworkResult.Success(listOf(olderFenixParsed, newerFenixParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds(eq(selectedDate))).thenReturn(NetworkResult.Success(listOf(dateSpecificParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds(eq(selectedDate))).thenReturn(NetworkResult.Success(listOf(fenixParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFenixNightlyBuilds(null)).thenReturn(NetworkResult.Success(listOf(initialParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFocusNightlyBuilds(anyOrNull())).thenReturn(NetworkResult.Success(emptyList())) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getFocusNightlyBuilds(anyOrNull())).thenReturn(NetworkResult.Success(listOf(focusParsed))) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getReferenceBrowserNightlyBuilds()).thenReturn(NetworkResult.Success(emptyList())) + MaxLineLength:HomeViewModelTest.kt$HomeViewModelTest$whenever(mockMozillaArchiveRepository.getReferenceBrowserNightlyBuilds()).thenReturn(NetworkResult.Success(listOf(rbParsed))) MaxLineLength:JobDetailsSerializer.kt$JobDetailsSerializer$throw SerializationException("JsonArray too short to deserialize into JobDetails. Size: ${jsonArray.size}, expected at least 15 elements.") MaxLineLength:JobDetailsSerializer.kt$JobDetailsSerializer$val jsonArray = jsonInput.decodeJsonElement() as? JsonArray ?: throw SerializationException("Expected JsonArray") MaxLineLength:JobDetailsSerializer.kt$JobDetailsSerializer$val jsonInput = decoder as? JsonDecoder ?: throw SerializationException("This deserializer can only be used with JSON") - MaxLineLength:MainActivity.kt$MainActivity$"TreeherderSearchWithArgs composable: project='${project}', revision='${revision}' from NavBackStackEntry. ID: ${backStackEntry.id}" + MaxLineLength:MainActivity.kt$MainActivity$"TreeherderSearchWithArgs composable: project='$project', revision='$revision' from NavBackStackEntry. ID: ${backStackEntry.id}" + MaxLineLength:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$override suspend fun getFenixNightlyBuilds(date: LocalDate?): NetworkResult<List<ParsedNightlyApk>> + MaxLineLength:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$override suspend fun getFocusNightlyBuilds(date: LocalDate?): NetworkResult<List<ParsedNightlyApk>> MaxLineLength:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$private suspend - MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$ParsedNightlyApk(fenixDirString1, fenixDate1, fenixAppName, fenixVersion, fenixAbi1, fenixFullUrl1, fenixFileName1) - MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$ParsedNightlyApk(fenixDirString2, fenixDate2, fenixAppName, fenixVersion, fenixAbi2, fenixFullUrl2, fenixFileName2) - MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$whenever(mockApiService.getHtmlPage(MozillaArchiveRepositoryImpl.fenixArchiveUrl)).thenThrow(RuntimeException(errorMessage)) - MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$whenever(mockApiService.getHtmlPage(MozillaArchiveRepositoryImpl.focusArchiveUrl)).thenThrow(RuntimeException(errorMessage)) + MaxLineLength:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl.Companion$private const val REFERENCE_BROWSER_TASK_BASE_URL = "https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/mobile.v2.reference-browser.nightly.latest." + MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$private val fenixFullUrl1 = "https://archive.mozilla.org/pub/fenix/nightly/$YEAR/$MONTH/$fenixDirString1$fenixFileName1" + MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$private val fenixFullUrl2 = "https://archive.mozilla.org/pub/fenix/nightly/$YEAR/$MONTH/$fenixDirString2$fenixFileName2" + MaxLineLength:MozillaArchiveRepositoryImplTest.kt$MozillaArchiveRepositoryImplTest$private val focusFullUrl = "https://archive.mozilla.org/pub/focus/nightly/$YEAR/$MONTH/$focusDirString$focusFileName" MaxLineLength:ProfileScreen.kt$PushCommentCard(comment = push.pushComment, author = push.author, revision = push.revision ?: "unknown_revision") MaxLineLength:ProfileScreen.kt$contentDescription = stringResource(id = R.string.profile_screen_clear_email_description) MaxLineLength:ProfileScreen.kt$items MaxLineLength:ProfileViewModel.kt$ProfileViewModel$determinedPushComment = pushResult.revisions.firstOrNull()?.comments ?: "No comment" MaxLineLength:ProfileViewModel.kt$ProfileViewModel$if MaxLineLength:ProfileViewModel.kt$ProfileViewModel$logcat(LogPriority.DEBUG, TAG) { "getPushesByAuthor success, processing ${result.data.results.size} pushes" } - MaxLineLength:ProfileViewModel.kt$ProfileViewModel$logcat(LogPriority.ERROR, TAG) { "Error checking cache status: ${e.message}\n${Log.getStackTraceString(e)}" } MaxLineLength:ProfileViewModel.kt$ProfileViewModel$logcat(LogPriority.VERBOSE, TAG) { "Download progress for ${artifactUiModel.name}: $bytesDownloaded / $totalBytes ($currentProgressFloat)" } MaxLineLength:ProfileViewModel.kt$ProfileViewModel$logcat(LogPriority.VERBOSE, TAG) { "No jobs with artifacts for push ID: ${pushResult.id}" } MaxLineLength:ProfileViewModel.kt$ProfileViewModel$logcat(LogPriority.VERBOSE, TAG) { "No signed, non-test jobs for push ID: ${pushResult.id}" } @@ -168,52 +159,47 @@ MaxLineLength:PushCommentCard.kt$style = MaterialTheme.typography.bodyMedium.copy(color = MaterialTheme.colorScheme.onSecondaryContainer) MaxLineLength:TreeherderApksScreen.kt$// Re-using the SearchButton from ProfileScreen implies it's either moved to a common composables location or defined here. MaxLineLength:TreeherderApksScreen.kt$// TODO: Consider creating a specific string resource for \"Download failed\" if it's a common prefix for user-facing errors. + MaxLineLength:TreeherderApksScreen.kt$// This case should ideally be handled by the PushCommentCard itself not rendering if both are empty/null MaxLineLength:TreeherderApksScreen.kt$// this would need refactoring to a common composable. The current `SearchButton` defined below seems tailored for this screen. - MaxLineLength:TreeherderApksScreen.kt$//This case should ideally be handled by the PushCommentCard itself not rendering if both are empty/null MaxLineLength:TreeherderApksScreen.kt$Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(id = R.string.common_back_button_description)) MaxLineLength:TreeherderApksScreen.kt$contentDescription = stringResource(id = R.string.treeherder_apks_search_button_description) MaxLineLength:TreeherderApksScreen.kt$if - MaxLineLength:TreeherderApksScreen.kt$isLoading = fenixInstallerViewModel.isLoading && fenixInstallerViewModel.selectedJobs.isEmpty() && fenixInstallerViewModel.relevantPushComment == null - MaxLineLength:TreeherderApksScreen.kt$onProjectSelected = { actualProjectValue -> fenixInstallerViewModel.updateSelectedProject(actualProjectValue) } + MaxLineLength:TreeherderApksScreen.kt$isLoading = tryFoxViewModel.isLoading && tryFoxViewModel.selectedJobs.isEmpty() && tryFoxViewModel.relevantPushComment == null + MaxLineLength:TreeherderApksScreen.kt$onProjectSelected = { actualProjectValue -> tryFoxViewModel.updateSelectedProject(actualProjectValue) } MaxLineLength:TreeherderApksScreen.kt$shape = RoundedCornerShape(topStart = 0.dp, bottomStart = 0.dp, topEnd = 12.dp, bottomEnd = 12.dp) MaxLineLength:TreeherderApksScreen.kt$shape = RoundedCornerShape(topStart = 8.dp, bottomStart = 8.dp, topEnd = 0.dp, bottomEnd = 0.dp) - MaxLineLength:TreeherderApksScreen.kt$text = stringResource(id = R.string.treeherder_apks_jobs_found_message, fenixInstallerViewModel.selectedJobs.size) + MaxLineLength:TreeherderApksScreen.kt$text = stringResource(id = R.string.treeherder_apks_jobs_found_message, tryFoxViewModel.selectedJobs.size) MaxLineLength:TreeherderApksScreen.kt$} - MaxLineLength:UserDataRepository.kt$private - NestedBlockDepth:HomeViewModel.kt$HomeViewModel$private fun isAppCachePopulated(appSpecificCacheDir: File): Boolean - NewLineAtEndOfFile:AbiChip.kt$org.mozilla.tryfox.ui.composables.AbiChip.kt - NewLineAtEndOfFile:AbiUiModel.kt$org.mozilla.tryfox.ui.models.AbiUiModel.kt - NewLineAtEndOfFile:Color.kt$org.mozilla.tryfox.ui.theme.Color.kt - NewLineAtEndOfFile:ExampleUnitTest.kt$org.mozilla.tryfox.ExampleUnitTest.kt - NewLineAtEndOfFile:ExpandableListView.kt$org.mozilla.tryfox.ui.composables.ExpandableListView.kt - NewLineAtEndOfFile:FocusApksState.kt$org.mozilla.tryfox.ui.models.FocusApksState.kt - NewLineAtEndOfFile:JobDetailsSerializer.kt$org.mozilla.tryfox.data.JobDetailsSerializer.kt - NewLineAtEndOfFile:JobDetailsSerializerTest.kt$org.mozilla.tryfox.JobDetailsSerializerTest.kt - NewLineAtEndOfFile:JobUiModel.kt$org.mozilla.tryfox.ui.models.JobUiModel.kt - NewLineAtEndOfFile:Theme.kt$org.mozilla.tryfox.ui.theme.Theme.kt - NewLineAtEndOfFile:Type.kt$org.mozilla.tryfox.ui.theme.Type.kt - NewLineAtEndOfFile:UiModels.kt$org.mozilla.tryfox.data.UiModels.kt - ReturnCount:FenixInstallerViewModel.kt$FenixInstallerViewModel$fun getDownloadedFile(artifactName: String, context: Context, taskId: String): File? - ReturnCount:HomeViewModel.kt$HomeViewModel$private fun isAppCachePopulated(appSpecificCacheDir: File): Boolean - ReturnCount:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$private fun parseNightlyBuildsFromHtml( html: String, archiveUrl: String, // This parameter is the fully constructed URL for the month app: String // "fenix" or "focus" ): List<ParsedNightlyApk> - ReturnCount:ProfileViewModel.kt$ProfileViewModel$fun getDownloadedFile(artifactName: String, context: Context, taskId: String): File? - SwallowedException:CurrentInstallState.kt$e: Exception - SwallowedException:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$e: Exception - TooGenericExceptionCaught:CurrentInstallState.kt$e: Exception - TooGenericExceptionCaught:FenixInstallerViewModel.kt$FenixInstallerViewModel$e: Exception + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.d("FenixInstallerViewModel", "Download action for $downloadKey - already in progress or downloaded. State: ${artifactUiModel.downloadState}") + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.d("FenixInstallerViewModel", "Found push ID: $pushId for project: $selectedProject, revision: $revision") + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.d("FenixInstallerViewModel", "Starting job/artifact search for project: $selectedProject, revision: $revision") + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.e("FenixInstallerViewModel", "Error fetching artifacts for task ID $taskId: ${artifactsResult.message}", artifactsResult.cause) + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.e("FenixInstallerViewModel", "Error fetching/parsing jobs for push ID $pushId: ${jobsResult.message}", jobsResult.cause) + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.i("FenixInstallerViewModel", "Download completed for $downloadKey at ${result.data.absolutePath}") + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.i("FenixInstallerViewModel", "Preparing to fetch artifacts for job: '${netJob.jobName}' (TaskID: ${netJob.taskId})") + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$Log.i("FenixInstallerViewModel", "Setting project to: ${project ?: "default (try)"}, revision from deep link to: $newRevision and triggering search.") + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$if + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$private + MaxLineLength:TryFoxViewModel.kt$TryFoxViewModel$updateArtifactDownloadState(taskId, artifactUiModel.name, DownloadState.DownloadFailed(result.message)) + ReturnCount:DateUtils.kt$@OptIn(FormatStringsInDatetimeFormats::class) fun parseDateToMillis(dateString: String): Long + ReturnCount:DefaultCacheManager.kt$DefaultCacheManager$private fun isAppCachePopulated(appName: String): Boolean + ReturnCount:HomeViewModel.kt$HomeViewModel$private fun getLatestApks(apks: List<ParsedNightlyApk>): List<ParsedNightlyApk> + ReturnCount:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$private fun parseNightlyBuildsFromHtml( html: String, archiveUrl: String, app: String, date: LocalDate?, ): List<ParsedNightlyApk> + ReturnCount:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$private suspend fun getNightlyBuilds(appName: String, date: LocalDate? = null): NetworkResult<List<ParsedNightlyApk>> + SwallowedException:DateUtils.kt$e: Exception + SwallowedException:HomeViewModelTest.kt$HomeViewModelTest$e: Exception + TooGenericExceptionCaught:DateUtils.kt$e: Exception + TooGenericExceptionCaught:DefaultCacheManager.kt$DefaultCacheManager$e: Exception + TooGenericExceptionCaught:DefaultMozillaPackageManager.kt$DefaultMozillaPackageManager$e: Exception TooGenericExceptionCaught:FenixRepository.kt$FenixRepository$e: Exception - TooGenericExceptionCaught:HomeViewModel.kt$HomeViewModel$e: Exception TooGenericExceptionCaught:JobDetailsSerializer.kt$JobDetailsSerializer$e: Exception TooGenericExceptionCaught:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$e: Exception - TooGenericExceptionCaught:MozillaPackageManager.kt$MozillaPackageManager$e: Exception - TooGenericExceptionCaught:ProfileViewModel.kt$ProfileViewModel$e: Exception - TooManyFunctions:AppGraphBindings.kt$AppGraphBindings - TooManyFunctions:FenixInstallerViewModel.kt$FenixInstallerViewModel : ViewModel TooManyFunctions:HomeViewModel.kt$HomeViewModel : ViewModel - UnusedPrivateProperty:HomeViewModelTest.kt$HomeViewModelTest$private val testDateFormatted = testDateRaw.formatApkDateForTest() + TooManyFunctions:TryFoxViewModel.kt$TryFoxViewModel : ViewModel + UnusedParameter:MozillaArchiveRepositoryImpl.kt$MozillaArchiveRepositoryImpl$app: String + UnusedPrivateProperty:AppCard.kt$val context = LocalContext.current + UnusedPrivateProperty:HomeViewModel.kt$HomeViewModel$private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO + UnusedPrivateProperty:HomeViewModel.kt$HomeViewModel.Companion$private const val TAG = "HomeViewModel" UnusedPrivateProperty:TreeherderApksScreen.kt$private const val TAG = "FenixInstallerScreen" - WildcardImport:ExampleUnitTest.kt$import org.junit.Assert.* - WildcardImport:HomeViewModelTest.kt$import kotlinx.coroutines.test.* - WildcardImport:HomeViewModelTest.kt$import org.junit.Assert.*