diff --git a/.buildkite/commands/lint.sh b/.buildkite/commands/lint.sh index ef471bb8db79..1a0783fc4f5e 100755 --- a/.buildkite/commands/lint.sh +++ b/.buildkite/commands/lint.sh @@ -6,26 +6,20 @@ fi "$(dirname "${BASH_SOURCE[0]}")/restore-cache.sh" -echo "--- :rubygems: Setting up Gems" -install_gems - -echo "--- :globe_with_meridians: Check Locales Declaration Consistency" -bundle exec fastlane check_declared_locales_consistency app:"$1" - echo "--- :microscope: Linting" if [ "$1" = "wordpress" ]; then - ./gradlew lintWordpressRelease + ./gradlew lintWordpressDebug exit 0 fi if [ "$1" = "jetpack" ]; then set +e - ./gradlew lintJetpackRelease + ./gradlew lintJetpackDebug lint_exit_code=$? set -e - upload_sarif_to_github "WordPress/build/reports/lint-results-jetpackRelease.sarif" + upload_sarif_to_github "WordPress/build/reports/lint-results-jetpackDebug.sarif" exit $lint_exit_code fi diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index c5b4ba3c3f39..4c1773f69076 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -59,6 +59,17 @@ steps: artifact_paths: - "**/build/reports/detekt/detekt.html" + - label: "🌐 Locale Consistency" + command: | + if .buildkite/commands/should-skip-job.sh --job-type validation; then + exit 0 + fi + + install_gems + bundle exec fastlane check_declared_locales_consistency app:wordpress + bundle exec fastlane check_declared_locales_consistency app:jetpack + plugins: [$CI_TOOLKIT] + - label: "🕵️ Lint WordPress" command: ".buildkite/commands/lint.sh wordpress" plugins: [$CI_TOOLKIT] @@ -71,6 +82,26 @@ steps: artifact_paths: - "**/build/reports/lint-results*.*" + - label: "🕵️ Lint libs:editor" + command: | + if .buildkite/commands/should-skip-job.sh --job-type lint; then + exit 0 + fi + + .buildkite/commands/restore-cache.sh + ./gradlew :libs:editor:lint + plugins: [$CI_TOOLKIT] + + - label: "🕵️ Lint libs:image-editor" + command: | + if .buildkite/commands/should-skip-job.sh --job-type lint; then + exit 0 + fi + + .buildkite/commands/restore-cache.sh + ./gradlew :libs:image-editor:lint + plugins: [$CI_TOOLKIT] + ################# # Diff Reports ################# diff --git a/build.gradle b/build.gradle index 2a28f5f0841b..f9c06bfc41aa 100644 --- a/build.gradle +++ b/build.gradle @@ -99,7 +99,7 @@ subprojects { android { lint { warningsAsErrors = true - checkDependencies true + checkDependencies false checkGeneratedSources = true lintConfig file("${project.rootDir}/config/lint/lint.xml") baseline file("${project.rootDir}/config/lint/baseline.xml") diff --git a/config/lint/baseline.xml b/config/lint/baseline.xml index 18a259cbf4e6..bc47a3859360 100644 --- a/config/lint/baseline.xml +++ b/config/lint/baseline.xml @@ -1,5 +1,5 @@ - + @@ -63,7 +63,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -74,7 +74,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -85,7 +85,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -96,7 +96,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -107,7 +107,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -118,164 +118,10 @@ errorLine2=" ~~~~~~"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + errorLine1=" private val productsStore = mock<ProductsStore> { on { fetchProducts(any()) } doReturn mock() }" + errorLine2=" ~~~~~~"> + column="92"/> + message="'org.wordpress.android.fluxc.tools.FormattableContent' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt" + line="16" + column="5"/> + message="'org.wordpress.android.fluxc.tools.FormattableRange' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt" + line="19" + column="5"/> + message="'org.wordpress.android.fluxc.tools.FormattableMedia' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/util/FormattableContentUtilsTest.kt" + line="22" + column="5"/> - - - - - - - - - - - - - - - - - - - - + message="'org.wordpress.android.fluxc.tools.FormattableMeta.Titles' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> @@ -1200,270 +782,6 @@ column="32"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1856,7 +1075,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -1992,105 +1211,6 @@ column="5"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2483,7 +1438,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -2494,18 +1449,18 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -2516,7 +1471,7 @@ errorLine2=" ~~~~~~"> @@ -2527,7 +1482,7 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -2538,21 +1493,10 @@ errorLine2=" ~~~~~~~~~~~~~~~~~~"> - - - - @@ -2632,4940 +1576,2344 @@ + message="'org.wordpress.android.ui.jetpack.common.JetpackListItemState.DescriptionState' is a data class, so mocking it should not be necessary" + errorLine1=" whenever(threatDetailsListItemsBuilder.buildFixableThreatDescription(any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/builders/ScanStateListItemsBuilderTest.kt" + line="180" + column="97"/> + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel.Fixable' is a data class, so mocking it should not be necessary" + errorLine1=" val threats = listOf(threat.copy(baseThreatModel = baseThreatModel.copy(fixable = mock())))" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/builders/ScanStateListItemsBuilderTest.kt" + line="277" + column="91"/> + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel.Fixable' is a data class, so mocking it should not be necessary" + errorLine1=" val threats = listOf(threat.copy(baseThreatModel = baseThreatModel.copy(fixable = mock())))" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/builders/ScanStateListItemsBuilderTest.kt" + line="668" + column="95"/> + message="'org.wordpress.android.fluxc.model.scan.ScanStateModel' is a data class, so mocking it should not be necessary" + errorLine1=" whenever(fetchScanStateUseCase.fetchScanState(site)).thenReturn(flowOf(Success(mock())))" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/ScanViewModelTest.kt" + line="692" + column="92"/> + message="'org.wordpress.android.ui.sitecreation.domains.DomainModel' is a data class, so mocking it should not be necessary" + errorLine1=" viewModel.onDomainSelected(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitecreation/domains/SiteCreationDomainsViewModelTest.kt" + line="349" + column="36"/> + message="'org.wordpress.android.fluxc.store.ProductsStore.OnProductsFetched' is a data class, so mocking it should not be necessary" + errorLine1=" whenever(productsStore.fetchProducts(any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitecreation/domains/SiteCreationDomainsViewModelTest.kt" + line="358" + column="65"/> + message="'org.wordpress.android.ui.sitecreation.domains.DomainModel' is a data class, so mocking it should not be necessary" + errorLine1=" private fun mockDomain(name: String = "", free: Boolean = true) = mock<DomainModel> {" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/sitecreation/domains/SiteCreationDomainsViewModelTest.kt" + line="613" + column="71"/> + message="'org.wordpress.android.fluxc.network.rest.wpcom.transactions.TransactionsRestClient.CreateShoppingCartResponse' is a data class, so mocking it should not be necessary" + errorLine1="val CART_SUCCESS = OnShoppingCartCreated(mock<CreateShoppingCartResponse>())" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationFixtures.kt" + line="57" + column="42"/> + message="'org.wordpress.android.fluxc.store.TransactionsStore.CreateShoppingCartError' is a data class, so mocking it should not be necessary" + errorLine1="val CART_ERROR = OnShoppingCartCreated(mock<CreateShoppingCartError>())" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationFixtures.kt" + line="58" + column="40"/> + message="'org.wordpress.android.ui.sitemonitor.SiteMonitorUiState.GenericError' is a data class, so mocking it should not be necessary" + errorLine1=" whenever(mapper.toGenericError(any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitemonitor/SiteMonitorTabViewModelSliceTest.kt" + line="52" + column="59"/> + message="'org.wordpress.android.ui.sitemonitor.SiteMonitorUiState.NoNetworkError' is a data class, so mocking it should not be necessary" + errorLine1=" whenever(mapper.toNoNetworkError(any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitemonitor/SiteMonitorTabViewModelSliceTest.kt" + line="53" + column="61"/> + message="'org.wordpress.android.ui.sitemonitor.SiteMonitorUiState.Prepared' is a data class, so mocking it should not be necessary" + errorLine1=" whenever(mapper.toPrepared(any(), any(), any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitemonitor/SiteMonitorTabViewModelSliceTest.kt" + line="54" + column="69"/> + message="'org.wordpress.android.util.UriWrapper' is a data class, so mocking it should not be necessary" + errorLine1=" val navigateAction = startLinkHandler.buildNavigateAction(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/deeplinks/handlers/StartLinkHandlerTest.kt" + line="58" + column="67"/> + message="'org.wordpress.android.util.UriWrapper' is a data class, so mocking it should not be necessary" + errorLine1=" val navigateAction = startLinkHandler.buildNavigateAction(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/deeplinks/handlers/StartLinkHandlerTest.kt" + line="67" + column="67"/> + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/usecases/StartScanUseCaseTest.kt" + line="32" + column="5"/> + message="'org.wordpress.android.ui.reader.subfilter.SubfilterListItem.Site' is a data class, so mocking it should not be necessary" + errorLine1=" val filter: Site = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/subfilter/SubFilterViewModelTest.kt" + line="453" + column="28"/> + message="'org.wordpress.android.ui.reader.subfilter.SubfilterListItem.Tag' is a data class, so mocking it should not be necessary" + errorLine1=" val filter: Tag = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/subfilter/SubFilterViewModelTest.kt" + line="472" + column="27"/> + message="'org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.SubscribersChartItem' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/subscribers/usecases/SubscribersChartUseCaseTest.kt" + line="43" + column="5"/> + message="'org.wordpress.android.ui.suggestion.Suggestion' is a data class, so mocking it should not be necessary" + errorLine1=" val nonEmptyList = listOf(mock<Suggestion>())" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/suggestion/SuggestionViewModelTest.kt" + line="107" + column="35"/> + message="'org.wordpress.android.ui.suggestion.Suggestion' is a data class, so mocking it should not be necessary" + errorLine1=" val nonEmptyList = listOf(mock<Suggestion>())" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/suggestion/SuggestionViewModelTest.kt" + line="129" + column="35"/> + message="'org.wordpress.android.ui.suggestion.Suggestion' is a data class, so mocking it should not be necessary" + errorLine1=" val listWithMoreThanOne = listOf<Suggestion>(mock(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/suggestion/SuggestionViewModelTest.kt" + line="217" + column="54"/> + message="'org.wordpress.android.ui.suggestion.Suggestion' is a data class, so mocking it should not be necessary" + errorLine1=" val listWithMoreThanOne = listOf<Suggestion>(mock(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/suggestion/SuggestionViewModelTest.kt" + line="217" + column="62"/> + message="'org.wordpress.android.ui.suggestion.Suggestion' is a data class, so mocking it should not be necessary" + errorLine1=" val listWithMoreThanOne = listOf<Suggestion>(mock(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/suggestion/SuggestionViewModelTest.kt" + line="237" + column="54"/> + message="'org.wordpress.android.ui.suggestion.Suggestion' is a data class, so mocking it should not be necessary" + errorLine1=" val listWithMoreThanOne = listOf<Suggestion>(mock(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/suggestion/SuggestionViewModelTest.kt" + line="237" + column="62"/> + message="'org.wordpress.android.fluxc.model.dashboard.CardModel.TodaysStatsCardModel' is a data class, so mocking it should not be necessary" + errorLine1=" val params = todaysStatsViewModelSlice.getTodaysStatsBuilderParams(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/todaysstats/TodaysStatsViewModelSliceTest.kt" + line="73" + column="80"/> + message="'org.wordpress.android.fluxc.model.dashboard.CardModel.TodaysStatsCardModel' is a data class, so mocking it should not be necessary" + errorLine1=" val params = todaysStatsViewModelSlice.getTodaysStatsBuilderParams(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/todaysstats/TodaysStatsViewModelSliceTest.kt" + line="87" + column="80"/> + message="'org.wordpress.android.fluxc.model.dashboard.CardModel.TodaysStatsCardModel' is a data class, so mocking it should not be necessary" + errorLine1=" val params = todaysStatsViewModelSlice.getTodaysStatsBuilderParams(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/todaysstats/TodaysStatsViewModelSliceTest.kt" + line="106" + column="76"/> + message="'org.wordpress.android.fluxc.model.dashboard.CardModel.TodaysStatsCardModel' is a data class, so mocking it should not be necessary" + errorLine1=" val params = todaysStatsViewModelSlice.getTodaysStatsBuilderParams(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/todaysstats/TodaysStatsViewModelSliceTest.kt" + line="115" + column="76"/> + message="'org.wordpress.android.fluxc.model.dashboard.CardModel.TodaysStatsCardModel' is a data class, so mocking it should not be necessary" + errorLine1=" val params = todaysStatsViewModelSlice.getTodaysStatsBuilderParams(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/cards/dashboard/todaysstats/TodaysStatsViewModelSliceTest.kt" + line="132" + column="76"/> + message="'org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.ValueWithChartItem' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalCommentsUseCaseTest.kt" + line="73" + column="5"/> + message="'org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Text' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + message="'org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.ValueWithChartItem' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + message="'org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Text' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + message="'org.wordpress.android.fluxc.persistence.comments.CommentsDao.CommentEntity' is a data class, so mocking it should not be necessary" + errorLine1=" val comment: CommentEntity = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/comments/unified/UnrepliedCommentsUtilsTest.kt" + line="38" + column="38"/> + message="'org.wordpress.android.fluxc.persistence.comments.CommentsDao.CommentEntity' is a data class, so mocking it should not be necessary" + errorLine1=" val comment: CommentEntity = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/comments/unified/UnrepliedCommentsUtilsTest.kt" + line="49" + column="38"/> + message="'org.wordpress.android.fluxc.persistence.comments.CommentsDao.CommentEntity' is a data class, so mocking it should not be necessary" + errorLine1=" val comment: CommentEntity = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/comments/unified/UnrepliedCommentsUtilsTest.kt" + line="63" + column="38"/> + message="'org.wordpress.android.fluxc.persistence.comments.CommentsDao.CommentEntity' is a data class, so mocking it should not be necessary" + errorLine1=" val comment: CommentEntity = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/comments/unified/UnrepliedCommentsUtilsTest.kt" + line="77" + column="38"/> + message="'org.wordpress.android.fluxc.persistence.comments.CommentsDao.CommentEntity' is a data class, so mocking it should not be necessary" + errorLine1=" val comment: CommentEntity = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/comments/unified/UnrepliedCommentsUtilsTest.kt" + line="93" + column="38"/> + message="'org.wordpress.android.fluxc.persistence.comments.CommentsDao.CommentEntity' is a data class, so mocking it should not be necessary" + errorLine1=" val comment: CommentEntity = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/comments/unified/UnrepliedCommentsUtilsTest.kt" + line="106" + column="38"/> + message="'org.wordpress.android.util.UriWrapper' is a data class, so mocking it should not be necessary" + errorLine1=" val uri = mock<UriWrapper>()" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/deeplinks/UriTestHelper.kt" + line="8" + column="15"/> + message="'org.wordpress.android.util.UriWrapper' is a data class, so mocking it should not be necessary" + errorLine1=" val uri = mock<UriWrapper>()" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/deeplinks/UriTestHelper.kt" + line="23" + column="15"/> + errorLine1=" val uri = mock<UriWrapper>()" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/deeplinks/UriTestHelper.kt" + line="41" + column="15"/> + errorLine1=" val uri = mock<UriWrapper>()" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/deeplinks/UriTestHelper.kt" + line="60" + column="15"/> - - - - + message="'org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Chips' is a data class, so mocking it should not be necessary" + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/ViewsAndVisitorsUseCaseTest.kt" + line="71" + column="5"/> + message="'org.wordpress.android.fluxc.model.stats.time.VisitsAndViewsModel.PeriodData' is a data class, so mocking it should not be necessary" + errorLine1=" private val periodData: PeriodData = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/workers/weeklyroundup/WeeklyRoundupDataTest.kt" + line="15" + column="42"/> + message="'org.wordpress.android.workers.weeklyroundup.WeeklyRoundupNotification' is a data class, so mocking it should not be necessary" + errorLine1=" val notification: WeeklyRoundupNotification = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/workers/weeklyroundup/WeeklyRoundupNotifierTest.kt" + line="125" + column="55"/> + message="'org.wordpress.android.fluxc.model.stats.time.VisitsAndViewsModel.PeriodData' is a data class, so mocking it should not be necessary" + errorLine1=" private val first: PeriodData = mock {" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/workers/weeklyroundup/WeeklyRoundupRepositoryTest.kt" + line="31" + column="37"/> + message="'org.wordpress.android.fluxc.model.stats.time.VisitsAndViewsModel.PeriodData' is a data class, so mocking it should not be necessary" + errorLine1=" private val second: PeriodData = mock {" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/workers/weeklyroundup/WeeklyRoundupRepositoryTest.kt" + line="35" + column="38"/> + message="'org.wordpress.android.fluxc.model.stats.time.VisitsAndViewsModel.PeriodData' is a data class, so mocking it should not be necessary" + errorLine1=" private val third: PeriodData = mock {" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/workers/weeklyroundup/WeeklyRoundupRepositoryTest.kt" + line="39" + column="37"/> + message="'org.wordpress.android.fluxc.model.XPostSiteModel' is a data class, so mocking it should not be necessary" + errorLine1=" testCapability(XPostsResult.dbResult(listOf(mock())), null, true)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/posts/editor/XPostsCapabilityCheckerTest.kt" + line="32" + column="53"/> + message="'org.wordpress.android.fluxc.model.XPostSiteModel' is a data class, so mocking it should not be necessary" + errorLine1=" testCapability(XPostsResult.dbResult(emptyList()), Companion.apiResult(listOf(mock())), true)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/posts/editor/XPostsCapabilityCheckerTest.kt" + line="37" + column="87"/> + message="'org.wordpress.android.fluxc.model.XPostSiteModel' is a data class, so mocking it should not be necessary" + errorLine1=" testCapability(XPostsResult.Unknown, XPostsResult.apiResult(listOf(mock())), true)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/posts/editor/XPostsCapabilityCheckerTest.kt" + line="52" + column="76"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.Result' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" whenever(fetchCampaignListUseCase.execute(any(), any(), any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/BlazeCardViewModelSliceTest.kt" + line="138" + column="84"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.Result' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" whenever(fetchCampaignListUseCase.execute(any(), any(), any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/BlazeCardViewModelSliceTest.kt" + line="153" + column="84"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.Result' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" whenever(mostRecentCampaignUseCase.execute(any())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/mysite/BlazeCardViewModelSliceTest.kt" + line="168" + column="71"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val draftActions = useCase.setupPageActions(DRAFTS, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="56" + column="61"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val trashedActions = useCase.setupPageActions(TRASHED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="68" + column="64"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" uploadUiState = mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="89" + column="29"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" uploadUiState = mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="114" + column="29"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="142" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="166" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="187" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="210" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, remoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="229" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="251" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val scheduledActions = useCase.setupPageActions(SCHEDULED, mock(), site, defaultRemoteId)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="269" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val publishedActions = useCase.setupPageActions(PUBLISHED, mock(), site, defaultRemoteId, true)" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemActionsUseCaseTest.kt" + line="318" + column="68"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()" + errorLine2=" ~~~~~~"> - - - - + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemLabelsUseCaseTest.kt" + line="66" + column="13"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val (labels, _) = useCase.createLabels(PostModel().apply { setIsLocalDraft(true) }, mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemLabelsUseCaseTest.kt" + line="73" + column="93"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val (labels, _) = useCase.createLabels(PostModel().apply { setIsLocallyChanged(true) }, mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemLabelsUseCaseTest.kt" + line="79" + column="97"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val (labels, _) = useCase.createLabels(PostModel(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemLabelsUseCaseTest.kt" + line="86" + column="61"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()" + errorLine2=" ~~~~~~"> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemLabelsUseCaseTest.kt" + line="322" + column="13"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/CreatePageListItemLabelsUseCaseTest.kt" + line="333" + column="22"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.usecase.social.ShareLimit' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/posts/EditorJetpackSocialViewModelTest.kt" + line="393" + column="25"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.usecase.social.ShareLimit' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/posts/EditorJetpackSocialViewModelTest.kt" + line="430" + column="25"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val threats = listOf<ThreatModel>(mock(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/usecases/FetchScanHistoryUseCaseTest.kt" + line="93" + column="43"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val threats = listOf<ThreatModel>(mock(), mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/usecases/FetchScanHistoryUseCaseTest.kt" + line="93" + column="51"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.mediapicker.MediaItem.Identifier' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/mediapicker/loader/MediaLoaderTest.kt" + line="29" + column="5"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.mediapicker.MediaItem.Identifier' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" @Mock" + errorLine2=" ^"> + file="src/test/java/org/wordpress/android/ui/mediapicker/loader/MediaLoaderTest.kt" + line="32" + column="5"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.uistate.ProgressBarUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/PageListViewModelTest.kt" + line="367" + column="17"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/PostPageListLabelColorUseCaseTest.kt" + line="120" + column="13"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/PostPageListLabelColorUseCaseTest.kt" + line="135" + column="13"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.viewmodel.pages.PostModelUploadUiStateUseCase.PostUploadUiState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/viewmodel/pages/PostPageListLabelColorUseCaseTest.kt" + line="151" + column="13"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.reblog.ReblogState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" whenever(reblogUseCase.onReblogSiteSelected(anyInt(), anyOrNull())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModelTest.kt" + line="199" + column="88"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModelTest.kt" + line="787" + column="17"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" title = mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModelTest.kt" + line="799" + column="21"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiDimen' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" featuredImageCornerRadius = mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModelTest.kt" + line="801" + column="41"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.discover.ReaderCardUiState.ReaderInterestsCardUiState.ChipStyle' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ReaderInterestsCardUiState(readerTagList.map { ReaderInterestUiState("", "", mock(), mock()) })" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/discover/ReaderDiscoverViewModelTest.kt" + line="820" + column="94"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.reblog.ReblogState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(mock())" + errorLine2=" ~~~~~~"> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.discover.ReaderNavigationEvents' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(mock())" + errorLine2=" ~~~~~~"> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.reblog.ReblogState' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" whenever(reblogUseCase.onReblogSiteSelected(ArgumentMatchers.anyInt(), anyOrNull())).thenReturn(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModelTest.kt" + line="327" + column="105"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" blogName = mock()," + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/viewmodels/ReaderPostDetailViewModelTest.kt" + line="1276" + column="32"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ThreatItemState(1L, true, mock(), mock(), mock(), 0, 0, 0) {" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListViewModelTest.kt" + line="71" + column="39"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ThreatItemState(1L, true, mock(), mock(), mock(), 0, 0, 0) {" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListViewModelTest.kt" + line="71" + column="47"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ThreatItemState(1L, true, mock(), mock(), mock(), 0, 0, 0) {" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListViewModelTest.kt" + line="71" + column="55"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ThreatItemState(1L, true, UiStringText(date), mock(), mock(), 0, 0, 0) {" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListViewModelTest.kt" + line="157" + column="59"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.utils.UiString' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" ThreatItemState(1L, true, UiStringText(date), mock(), mock(), 0, 0, 0) {" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryListViewModelTest.kt" + line="157" + column="67"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(FetchScanHistoryUseCase.FetchScanHistoryState.Success(listOf(mock())))" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryViewModelTest.kt" + line="46" + column="86"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(FetchScanHistoryUseCase.FetchScanHistoryState.Success(listOf(mock())))" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryViewModelTest.kt" + line="99" + column="86"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.fluxc.model.scan.threat.ThreatModel' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" .thenReturn(FetchScanHistoryUseCase.FetchScanHistoryState.Success(listOf(mock())))" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/jetpack/scan/history/ScanHistoryViewModelTest.kt" + line="113" + column="86"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.sitecreation.SiteCreationResult.Created' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1="val RESULT_CREATED = mock<Created>()" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/test/java/org/wordpress/android/ui/sitecreation/SiteCreationFixtures.kt" + line="60" + column="22"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.subfilter.SubfilterListItem' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val filter: SubfilterListItem = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/subfilter/SubFilterViewModelTest.kt" + line="408" + column="41"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.reader.subfilter.SubfilterListItem' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" val filter: SubfilterListItem = mock()" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/reader/subfilter/SubFilterViewModelTest.kt" + line="433" + column="41"/> + id="DoNotMockSealedClass" + message="'org.wordpress.android.ui.posts.EditPostRepository.UpdatePostResult' is a sealed type and has a restricted type hierarchy, use a subtype instead." + errorLine1=" (invocation.getArgument(0) as OnPostUpdatedFromUIListener).onPostUpdatedFromUI(mock())" + errorLine2=" ~~~~~~"> + file="src/test/java/org/wordpress/android/ui/posts/editor/media/UploadMediaUseCaseTest.kt" + line="86" + column="96"/> + id="TrimLambda" + message="The lambda argument (`{ it <= ' ' }`) is unnecessary" + errorLine1=" author = authorName.trim { it <= ' ' }" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/comments/unified/CommentListUiUtils.kt" + line="33" + column="38"/> + id="TrimLambda" + message="The lambda argument (`{ it <= ' ' }`) is unnecessary" + errorLine1=" val trimmedPostTitle = postTitle.trim { it <= ' ' }" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/comments/unified/CommentListUiUtils.kt" + line="35" + column="47"/> + id="TrimLambda" + message="The lambda argument (`{ it <= ' ' }`) is unnecessary" + errorLine1=" if (name.trim { it <= ' ' }.isEmpty()) {" + errorLine2=" ~~~~~~~~~~~~~"> + id="TrimLambda" + message="The lambda argument (`{ it <= ' ' }`) is unnecessary" + errorLine1=" !TextUtils.isEmpty(s.toString().trim { it <= ' ' })" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt" + line="242" + column="58"/> + id="TrimLambda" + message="The lambda argument (`{ it <= ' ' }`) is unnecessary" + errorLine1=" !TextUtils.isEmpty(s.toString().trim { it <= ' ' })" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/ReaderCommentListActivity.kt" + line="242" + column="58"/> + id="TrimLambda" + message="The lambda argument (`{ it <= ' ' }`) is unnecessary" + errorLine1=" if (doLike && likeActor != null && likeActor.trim { it <= ' ' }.isNotEmpty()) {" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/ReaderPostPagerActivity.kt" + line="694" + column="59"/> + id="InflateParams" + message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)" + errorLine1=" val rootView = requireActivity().layoutInflater.inflate(R.layout.stats_widget_site_selector, null)" + errorLine2=" ~~~~"> + file="src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/configuration/StatsWidgetSiteSelectionDialogFragment.kt" + line="27" + column="102"/> + id="InflateParams" + message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)" + errorLine1=" val layout = LayoutInflater.from(context).inflate(R.layout.support_email_and_name_dialog, null)" + errorLine2=" ~~~~"> + file="src/main/java/org/wordpress/android/support/SupportHelper.kt" + line="97" + column="95"/> + id="InflateParams" + message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout's root element)" + errorLine1=" mContentView = LayoutInflater.from(view.getContext()).inflate(R.layout.dialog_snackbar, null);" + errorLine2=" ~~~~"> + file="src/main/java/org/wordpress/android/widgets/WPDialogSnackbar.java" + line="53" + column="97"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="503" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="507" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="549" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="554" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="559" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="564" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="569" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="574" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="579" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="584" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="589" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="594" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="599" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="604" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="609" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="614" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="619" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="624" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="629" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="634" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="639" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="644" + column="17"/> + id="IntentFilterUniqueDataAttributes" + message="Consider splitting data tag into multiple tags with individual attributes to avoid confusion" + errorLine1=" <data" + errorLine2=" ^"> + file="src/main/AndroidManifest.xml" + line="649" + column="17"/> + id="VectorRaster" + message="Limit vector icons sizes to 200×200 to keep icon drawing fast; see https://developer.android.com/studio/write/vector-asset-studio#when for more" + errorLine1=" android:width="400dp"" + errorLine2=" ~~~~~"> + file="src/main/res/drawable/drake_empty_results_400dp.xml" + line="4" + column="20"/> + id="VectorRaster" + message="Limit vector icons sizes to 200×200 to keep icon drawing fast; see https://developer.android.com/studio/write/vector-asset-studio#when for more" + errorLine1=" android:width="229dp"" + errorLine2=" ~~~~~"> + file="src/main/res/drawable-night/img_jetpack_empty_state.xml" + line="2" + column="20"/> + id="VectorRaster" + message="Limit vector icons sizes to 200×200 to keep icon drawing fast; see https://developer.android.com/studio/write/vector-asset-studio#when for more" + errorLine1=" android:width="229dp"" + errorLine2=" ~~~~~"> + file="src/main/res/drawable/img_jetpack_empty_state.xml" + line="2" + column="20"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/wpColorOnSurfaceMedium" />" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/blogging_reminders_prompt_switch.xml" + line="58" + column="13"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="@color/on_surface_emphasis_medium_surface_selector"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/blogging_reminders_tip.xml" + line="19" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="@color/placeholder"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/debug_settings_feature.xml" + line="76" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/colorOnSurface" />" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/home_page_picker_titlebar.xml" + line="14" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/wpColorActionModeIcon"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/media_picker_customize_action_layout.xml" + line="17" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/colorOnPrimary"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/modal_layout_picker_category.xml" + line="16" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/colorOnSurface" />" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout-land/modal_layout_picker_titlebar.xml" + line="14" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/colorOnSurface" />" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/modal_layout_picker_titlebar.xml" + line="14" + column="9"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="@color/prepublishing_toolbar_icon_color" />" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/prepublishing_toolbar.xml" + line="24" + column="13"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="@color/prepublishing_toolbar_icon_color"/>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/prepublishing_toolbar.xml" + line="45" + column="13"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/colorOnSurface"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/reader_interests_fragment_layout.xml" + line="28" + column="13"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/wpColorOnSurfaceMedium"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/reader_listitem_comment.xml" + line="155" + column="25"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/wpColorOnSurfaceMedium"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/reader_listitem_comment.xml" + line="194" + column="25"/> + id="UseAppTint" + message="Must use `app:tint` instead of `android:tint`" + errorLine1=" android:tint="?attr/colorOnSurface" />" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/layout/site_creation_intents_titlebar.xml" + line="14" + column="9"/> + id="UseCompatLoadingForDrawables" + message="Use `ResourcesCompat.getDrawable()`" + errorLine1=" val drawable = context.resources.getDrawable(drawableResId, context.theme)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/util/ColorUtils.kt" + line="23" + column="24"/> + id="UseCompatLoadingForDrawables" + message="Use `AppCompatResources.getDrawable()`" + errorLine1=" icon = context.getDrawable(it)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/jetpack/common/viewholders/JetpackButtonViewHolder.kt" + line="53" + column="20"/> + id="UseCompatLoadingForDrawables" + message="Use `AppCompatResources.getDrawable()`" + errorLine1=" icon = context.getDrawable(it)" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/jetpack/common/viewholders/JetpackButtonViewHolder.kt" + line="53" + column="20"/> + id="UseCompatLoadingForDrawables" + message="Use `ResourcesCompat.getDrawable()`" + errorLine1=" prefList.setOverscrollFooter(res.getDrawable(android.R.color.transparent));" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java" + line="967" + column="38"/> + id="SetJavaScriptEnabled" + message="Using `setJavaScriptEnabled` can introduce XSS vulnerabilities into your application, review carefully" + errorLine1=" mWebView.getSettings().setJavaScriptEnabled(true);" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/publicize/PublicizeWebViewFragment.java" + line="110" + column="9"/> + id="InsecureBaseConfiguration" + message="Insecure Base Configuration" + errorLine1=" <base-config cleartextTrafficPermitted="true">" + errorLine2=" ~~~~"> + file="src/main/res/xml/network_security_config.xml" + line="6" + column="45"/> + id="WebViewClientOnReceivedSslError" + message="Permitting connections with SSL-related errors could allow eavesdroppers to intercept data sent by your app, which impacts the privacy of your users. Consider canceling the connections by invoking `SslErrorHandler#cancel()`." + errorLine1=" handler.proceed();" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/util/WPWebViewClient.java" + line="58" + column="13"/> + id="SensitiveExternalPath" + message="Sensitive info like PII should not be stored or shared via `<external-path>`" + errorLine1=" <external-path" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/res/xml/provider_paths.xml" + line="3" + column="6"/> + id="WeakPrng" + message="`java.util.Random` should only be used for non-security contexts as it is not a cryptographically secure PRNG" + errorLine1=" Random randomNum = new Random();" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/notifications/receivers/NotificationsPendingDraftsReceiver.java" + line="99" + column="44"/> + id="WeakPrng" + message="`java.util.Random` should only be used for non-security contexts as it is not a cryptographically secure PRNG" + errorLine1=" Random randomNum = new Random();" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/notifications/receivers/NotificationsPendingDraftsReceiver.java" + line="108" + column="44"/> + id="WeakPrng" + message="`java.util.Random` should only be used for non-security contexts as it is not a cryptographically secure PRNG" + errorLine1=" sNotificationData.mNotificationId = (new Random()).nextInt();" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/uploads/PostUploadNotifier.java" + line="138" + column="50"/> + id="WeakPrng" + message="`java.util.Random` should only be used for non-security contexts as it is not a cryptographically secure PRNG" + errorLine1=" private static final Random RANDOM = new Random();" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java" + line="54" + column="42"/> + id="TapjackingVulnerable" + message="Add the `android:filterTouchesWhenObscured` attribute to protect this UI element from tapjacking / overlay attacks" + errorLine1=" <CheckBox" + errorLine2=" ~~~~~~~~"> + file="src/main/res/layout/debug_settings_feature.xml" + line="59" + column="6"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/notifications/adapters/CursorRecyclerViewAdapter.java" + line="91" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/notifications/adapters/CursorRecyclerViewAdapter.java" + line="95" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/notifications/adapters/CursorRecyclerViewAdapter.java" + line="105" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/notifications/adapters/CursorRecyclerViewAdapter.java" + line="112" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/whatsnew/FeatureAnnouncementListAdapter.kt" + line="59" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/whatsnew/FeatureAnnouncementListAdapter.kt" + line="83" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java" + line="132" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java" + line="573" + column="17"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java" + line="581" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java" + line="595" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java" + line="633" + column="17"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java" + line="668" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/prefs/MultiSelectRecyclerViewAdapter.java" + line="72" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/pages/PageParentAdapter.kt" + line="43" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" recyclerView.adapter?.notifyDataSetChanged()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/pages/PageParentFragment.kt" + line="235" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/pages/PageParentSearchAdapter.kt" + line="42" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" mPeopleAdapter.notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java" + line="277" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/people/PeopleListFragment.java" + line="320" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" mNotConnectedRecyclerView.getAdapter().notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserDialogFragment.java" + line="178" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/publicize/adapters/PublicizeConnectionAdapter.java" + line="75" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderBlogAdapter.java" + line="324" + column="17"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java" + line="633" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java" + line="653" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderCommentAdapter.java" + line="746" + column="17"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java" + line="687" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderPostAdapter.java" + line="928" + column="17"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSearchSuggestionRecyclerAdapter.java" + line="109" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSiteSearchAdapter.java" + line="44" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSiteSearchAdapter.java" + line="50" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderSiteSearchAdapter.java" + line="57" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderTagAdapter.java" + line="210" + column="17"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/reader/adapters/ReaderUserAdapter.java" + line="130" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/prefs/SiteSettingsTagListActivity.java" + line="493" + column="13"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged()" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/stats/refresh/lists/widget/configuration/StatsWidgetSiteAdapter.kt" + line="27" + column="9"/> + id="NotifyDataSetChanged" + message="It will always be more efficient to use more specific change events if you can. Rely on `notifyDataSetChanged` as a last resort." + errorLine1=" notifyDataSetChanged();" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/java/org/wordpress/android/ui/posts/TagsRecyclerViewAdapter.java" + line="80" + column="25"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1=" <LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/blogging_prompt_card_compact.xml" + line="67" + column="10"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1=" <LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/stats_all_time_widget_preview.xml" + line="8" + column="6"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1=" <LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/stats_minified_widget_preview.xml" + line="8" + column="6"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1=" <LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/stats_today_widget_preview.xml" + line="8" + column="6"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1=" <LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/stats_views_widget_preview.xml" + line="8" + column="6"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1=" <LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/stats_week_views_widget_preview.xml" + line="8" + column="6"/> + id="UseCompoundDrawables" + message="This tag and its children can be replaced by one `<TextView/>` and a compound drawable" + errorLine1="<LinearLayout" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/res/layout/stats_widget_title_light.xml" + line="2" + column="2"/> + message="Very long vector path (6830 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector." + errorLine1=" android:pathData="M35.938,26.125C42.354,26.125 48.104,27.542 53.188,30.375C58.271,33.208 62.25,37.167 65.125,42.25C68,47.333 69.438,53.208 69.438,59.875C69.438,66.542 68,72.437 65.125,77.563C62.25,82.688 58.271,86.667 53.188,89.5C48.104,92.333 42.354,93.75 35.938,93.75C31.187,93.75 26.833,92.833 22.875,91C18.917,89.167 15.563,86.5 12.813,83L12.813,117.25L0.813,117.25L0.813,26.75L12.313,26.75L12.313,37.25C14.979,33.583 18.354,30.813 22.438,28.938C26.521,27.062 31.021,26.125 35.938,26.125ZM34.938,83.25C39.188,83.25 43,82.271 46.375,80.313C49.75,78.354 52.417,75.604 54.375,72.063C56.333,68.521 57.313,64.458 57.313,59.875C57.313,55.292 56.333,51.229 54.375,47.688C52.417,44.146 49.75,41.417 46.375,39.5C43,37.583 39.188,36.625 34.938,36.625C30.771,36.625 27,37.604 23.625,39.563C20.25,41.521 17.583,44.25 15.625,47.75C13.667,51.25 12.688,55.292 12.688,59.875C12.688,64.458 13.646,68.521 15.563,72.063C17.479,75.604 20.146,78.354 23.563,80.313C26.979,82.271 30.771,83.25 34.938,83.25ZM113.438,93.75C106.854,93.75 100.938,92.292 95.688,89.375C90.437,86.458 86.333,82.438 83.375,77.313C80.417,72.187 78.938,66.375 78.938,59.875C78.938,53.375 80.417,47.563 83.375,42.438C86.333,37.312 90.437,33.313 95.688,30.438C100.938,27.562 106.854,26.125 113.438,26.125C120.021,26.125 125.917,27.562 131.125,30.438C136.333,33.313 140.417,37.312 143.375,42.438C146.333,47.563 147.813,53.375 147.813,59.875C147.813,66.375 146.333,72.187 143.375,77.313C140.417,82.438 136.333,86.458 131.125,89.375C125.917,92.292 120.021,93.75 113.438,93.75ZM113.438,83.25C117.688,83.25 121.5,82.271 124.875,80.313C128.25,78.354 130.896,75.604 132.813,72.063C134.729,68.521 135.688,64.458 135.688,59.875C135.688,55.292 134.729,51.229 132.813,47.688C130.896,44.146 128.25,41.417 124.875,39.5C121.5,37.583 117.688,36.625 113.438,36.625C109.187,36.625 105.375,37.583 102,39.5C98.625,41.417 95.958,44.146 94,47.688C92.042,51.229 91.063,55.292 91.063,59.875C91.063,64.458 92.042,68.521 94,72.063C95.958,75.604 98.625,78.354 102,80.313C105.375,82.271 109.187,83.25 113.438,83.25ZM261.813,26.75L237.063,93L225.563,93L206.438,42.75L187.063,93L175.563,93L150.938,26.75L162.313,26.75L181.563,79.5L201.563,26.75L211.688,26.75L231.313,79.75L251.063,26.75L261.813,26.75ZM330.938,60.25C330.938,61.167 330.854,62.375 330.688,63.875L276.938,63.875C277.688,69.708 280.25,74.396 284.625,77.938C289,81.479 294.437,83.25 300.938,83.25C308.854,83.25 315.229,80.583 320.063,75.25L326.688,83C323.688,86.5 319.958,89.167 315.5,91C311.042,92.833 306.063,93.75 300.563,93.75C293.562,93.75 287.354,92.313 281.938,89.438C276.521,86.562 272.333,82.542 269.375,77.375C266.417,72.208 264.938,66.375 264.938,59.875C264.938,53.458 266.375,47.667 269.25,42.5C272.125,37.333 276.083,33.313 281.125,30.438C286.167,27.562 291.854,26.125 298.188,26.125C304.521,26.125 310.167,27.562 315.125,30.438C320.083,33.313 323.958,37.333 326.75,42.5C329.542,47.667 330.938,53.583 330.938,60.25ZM298.188,36.25C292.437,36.25 287.625,38 283.75,41.5C279.875,45 277.604,49.583 276.938,55.25L319.438,55.25C318.771,49.667 316.5,45.104 312.625,41.563C308.75,38.021 303.938,36.25 298.188,36.25ZM358.063,37.875C360.146,34.042 363.229,31.125 367.313,29.125C371.396,27.125 376.354,26.125 382.188,26.125L382.188,37.75C381.521,37.667 380.604,37.625 379.438,37.625C372.937,37.625 367.833,39.562 364.125,43.438C360.417,47.313 358.563,52.833 358.563,60L358.563,93L346.563,93L346.563,26.75L358.063,26.75L358.063,37.875ZM455.188,60.25C455.188,61.167 455.104,62.375 454.938,63.875L401.188,63.875C401.938,69.708 404.5,74.396 408.875,77.938C413.25,81.479 418.687,83.25 425.188,83.25C433.104,83.25 439.479,80.583 444.313,75.25L450.938,83C447.938,86.5 444.208,89.167 439.75,91C435.292,92.833 430.313,93.75 424.813,93.75C417.812,93.75 411.604,92.313 406.188,89.438C400.771,86.562 396.583,82.542 393.625,77.375C390.667,72.208 389.188,66.375 389.188,59.875C389.188,53.458 390.625,47.667 393.5,42.5C396.375,37.333 400.333,33.313 405.375,30.438C410.417,27.562 416.104,26.125 422.438,26.125C428.771,26.125 434.417,27.562 439.375,30.438C444.333,33.313 448.208,37.333 451,42.5C453.792,47.667 455.188,53.583 455.188,60.25ZM422.438,36.25C416.687,36.25 411.875,38 408,41.5C404.125,45 401.854,49.583 401.188,55.25L443.688,55.25C443.021,49.667 440.75,45.104 436.875,41.563C433,38.021 428.188,36.25 422.438,36.25ZM533.313,0.25L533.313,93L521.813,93L521.813,82.5C519.146,86.167 515.771,88.958 511.688,90.875C507.604,92.792 503.104,93.75 498.188,93.75C491.771,93.75 486.021,92.333 480.938,89.5C475.854,86.667 471.875,82.688 469,77.563C466.125,72.437 464.688,66.542 464.688,59.875C464.688,53.208 466.125,47.333 469,42.25C471.875,37.167 475.854,33.208 480.938,30.375C486.021,27.542 491.771,26.125 498.188,26.125C502.938,26.125 507.312,27.021 511.313,28.813C515.313,30.604 518.646,33.25 521.313,36.75L521.313,0.25L533.313,0.25ZM499.188,83.25C503.354,83.25 507.146,82.271 510.563,80.313C513.979,78.354 516.646,75.604 518.563,72.063C520.479,68.521 521.438,64.458 521.438,59.875C521.438,55.292 520.479,51.229 518.563,47.688C516.646,44.146 513.979,41.417 510.563,39.5C507.146,37.583 503.354,36.625 499.188,36.625C494.937,36.625 491.125,37.583 487.75,39.5C484.375,41.417 481.708,44.146 479.75,47.688C477.792,51.229 476.813,55.292 476.813,59.875C476.813,64.458 477.792,68.521 479.75,72.063C481.708,75.604 484.375,78.354 487.75,80.313C491.125,82.271 494.937,83.25 499.188,83.25ZM622.813,26.125C629.229,26.125 634.979,27.542 640.063,30.375C645.146,33.208 649.125,37.167 652,42.25C654.875,47.333 656.313,53.208 656.313,59.875C656.313,66.542 654.875,72.437 652,77.563C649.125,82.688 645.146,86.667 640.063,89.5C634.979,92.333 629.229,93.75 622.813,93.75C617.896,93.75 613.396,92.792 609.313,90.875C605.229,88.958 601.854,86.167 599.188,82.5L599.188,93L587.688,93L587.688,0.25L599.688,0.25L599.688,36.75C602.354,33.25 605.688,30.604 609.688,28.813C613.688,27.021 618.063,26.125 622.813,26.125ZM621.813,83.25C626.063,83.25 629.875,82.271 633.25,80.313C636.625,78.354 639.292,75.604 641.25,72.063C643.208,68.521 644.188,64.458 644.188,59.875C644.188,55.292 643.208,51.229 641.25,47.688C639.292,44.146 636.625,41.417 633.25,39.5C629.875,37.583 626.063,36.625 621.813,36.625C617.646,36.625 613.854,37.583 610.438,39.5C607.021,41.417 604.354,44.146 602.438,47.688C600.521,51.229 599.563,55.292 599.563,59.875C599.563,64.458 600.521,68.521 602.438,72.063C604.354,75.604 607.021,78.354 610.438,80.313C613.854,82.271 617.646,83.25 621.813,83.25ZM728.688,26.75L696.563,99.625C693.729,106.375 690.417,111.125 686.625,113.875C682.833,116.625 678.271,118 672.938,118C669.688,118 666.542,117.479 663.5,116.438C660.458,115.396 657.938,113.875 655.938,111.875L661.063,102.875C664.479,106.125 668.438,107.75 672.938,107.75C675.854,107.75 678.292,106.979 680.25,105.438C682.208,103.896 683.979,101.25 685.563,97.5L687.688,92.875L658.438,26.75L670.938,26.75L694.063,79.75L716.938,26.75L728.688,26.75Z"" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> @@ -7635,6 +3983,28 @@ column="1"/> + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -7971,17 +4231,6 @@ column="6"/> - - - - - - - - diff --git a/config/lint/lint.xml b/config/lint/lint.xml index 17d667000d83..67e6eb4141d1 100644 --- a/config/lint/lint.xml +++ b/config/lint/lint.xml @@ -24,18 +24,10 @@ - - - - - - - - - - - - + + + + @@ -55,6 +47,12 @@ + + + + + + diff --git a/fastlane/lanes/localization.rb b/fastlane/lanes/localization.rb index 0f922f15aa39..528c817646cc 100644 --- a/fastlane/lanes/localization.rb +++ b/fastlane/lanes/localization.rb @@ -278,10 +278,8 @@ JETPACK_MAIN_STRINGS_PATH = File.join(PROJECT_ROOT_FOLDER, 'WordPress', 'src', 'jetpack', 'res', 'values', 'strings.xml').freeze JETPACK_FROZEN_STRINGS_DIR_PATH = File.join(FASTLANE_FOLDER, 'jetpack_resources', 'values').freeze LOCAL_LIBRARIES_STRINGS_PATHS = [ - # NOTE: for those we don't set `add_ignore_attr` to true because we currently use `checkDependencies true` in `WordPress/build.gradle` - # Which will correctly detect strings from the app's `strings.xml` being used by one of the module. - { library: 'Image Editor', strings_path: './libs/image-editor/src/main/res/values/strings.xml', source_id: 'module:image-editor' }, - { library: 'Editor', strings_path: './libs/editor/src/main/res/values/strings.xml', source_id: 'module:editor' } + { library: 'Image Editor', strings_path: './libs/image-editor/src/main/res/values/strings.xml', source_id: 'module:image-editor', add_ignore_attr: true }, + { library: 'Editor', strings_path: './libs/editor/src/main/res/values/strings.xml', source_id: 'module:editor', add_ignore_attr: true } ].freeze REMOTE_LIBRARIES_STRINGS_PATHS = [ {