{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D16","name":"Bus Factor","shortDescription":{"text":"Bus Factor"},"helpUri":"https://codehealth.canine.dev/dimensions/D16"},{"id":"D19","name":"Documentation Quality","shortDescription":{"text":"Documentation Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D19"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"]}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"]}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D37","name":"Vulnerability-disclosure Policy","shortDescription":{"text":"Vulnerability-disclosure Policy"},"helpUri":"https://codehealth.canine.dev/dimensions/D37","relationships":[{"target":{"id":"CWE-1059","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1059"]}}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"DeviceMappedEncoderBitrateProvider.getBitrateMultiplierFromMapping (cyclomatic 526): DeviceMappedEncoderBitrateProvider.getBitrateMultiplierFromMapping has cyclomatic complexity 526 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a2d3c9982d74142a99025b275d3df6dcbf8a5e08972311ba5e1d551c74b119"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecVideoRenderer.evaluateDeviceNeedsSetOutputSurfaceWorkaround (cyclomatic 163): MediaCodecVideoRenderer.evaluateDeviceNeedsSetOutputSurfaceWorkaround has cyclomatic complexity 163 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":2541}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c57c9fcdd073ed8a8ba53463e5e6f354c96bb1045227cf0b05758156ad3211c"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsPlaylistParser.parseMediaPlaylist (cyclomatic 83): HlsPlaylistParser.parseMediaPlaylist has cyclomatic complexity 83 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e47f9a221d37332df96f312743aeb06dd1d4202e7253f99710f2fc27a969a3d"}},{"ruleId":"D1","level":"warning","message":{"text":"Ac3Util.parseAc3SyncframeInfo (cyclomatic 71): Ac3Util.parseAc3SyncframeInfo has cyclomatic complexity 71 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"85a5bf8da7abdb018262c5f3f36262fbf56aa8459c026b1bed0a3f3e768db9ba"}},{"ruleId":"D1","level":"warning","message":{"text":"Track.initializeOutput (cyclomatic 66): Track.initializeOutput has cyclomatic complexity 66 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":2053}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d933af6707f72d21b9d2a7266ec5913f80422f04fadcc9b46302174d618b933"}},{"ruleId":"D1","level":"warning","message":{"text":"MatroskaExtractor.integerElement (cyclomatic 61): MatroskaExtractor.integerElement has cyclomatic complexity 61 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"f100017570e0dac2497834bda076a554c08311456401c363e63a0f2095fc4ef4"}},{"ruleId":"D1","level":"warning","message":{"text":"AtomParsers.parseStbl (cyclomatic 57): AtomParsers.parseStbl has cyclomatic complexity 57 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c35319a5d697257ed76ec0a2e8035d0a38aad5af78142df729f87ef780e9cd0"}},{"ruleId":"D1","level":"warning","message":{"text":"AtomParsers.parseAudioSampleEntry (cyclomatic 54): AtomParsers.parseAudioSampleEntry has cyclomatic complexity 54 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1503}}}],"partialFingerprints":{"codehealthFindingId/v1":"732793a5c1b53f066eaf931a0ecd06c2a76838cacf1808d9926bfa51e3ee39f0"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImplInternal.handleMessage (cyclomatic 49): ExoPlayerImplInternal.handleMessage has cyclomatic complexity 49 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"36d00e2205a9b6d1522f1f648c13355ccbae571ba2ae83b520d7cacb5d14dd3f"}},{"ruleId":"D1","level":"warning","message":{"text":"AtomParsers.parseVideoSampleEntry (cyclomatic 47): AtomParsers.parseVideoSampleEntry has cyclomatic complexity 47 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1173}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcdef1fc72043898871cde23129539b6ef4984b97d18cd804f4fac26deae8d49"}},{"ruleId":"D1","level":"warning","message":{"text":"Id3Decoder.decodeFrame (cyclomatic 45): Id3Decoder.decodeFrame has cyclomatic complexity 45 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"31482187b22f3850682515ab798dc6e3d878434737bc7fbbaa82940e74873436"}},{"ruleId":"D1","level":"warning","message":{"text":"Cea708Decoder.handleC1Command (cyclomatic 45): Cea708Decoder.handleC1Command has cyclomatic complexity 45 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef99ba4ca88ba6b5cd6e0125f8266a2741330e1303dc7f5e0208870173959aac"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaMetricsListener.getErrorInfo (cyclomatic 45): MediaMetricsListener.getErrorInfo has cyclomatic complexity 45 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":698}}}],"partialFingerprints":{"codehealthFindingId/v1":"11ae3b195aead3648efec03a99b750dac4be84a4e0be5e401782b2dc067b0575"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImplInternal.doSomeWork (cyclomatic 43): ExoPlayerImplInternal.doSomeWork has cyclomatic complexity 43 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1009}}}],"partialFingerprints":{"codehealthFindingId/v1":"857682a44bf30f51231887efe0ee7d6659c66c45be10c130cf534416b833d1a5"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsPlaylistParser.parseMultivariantPlaylist (cyclomatic 40): HlsPlaylistParser.parseMultivariantPlaylist has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"9833c25fe460d4af67781f5f3fedb20a60fd7ad88b8f77eb360dd798e3828b87"}},{"ruleId":"D1","level":"warning","message":{"text":"Format.toLogString (cyclomatic 40): Format.toLogString has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/Format.java"},"region":{"startLine":1143}}}],"partialFingerprints":{"codehealthFindingId/v1":"eca7a1a15381031ec9aaa77fd5fbffe1fd9fbb0de5dba55f7154ae9c83095310"}},{"ruleId":"D1","level":"warning","message":{"text":"MimeTypes.getMediaMimeType (cyclomatic 39): MimeTypes.getMediaMimeType has cyclomatic complexity 39 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88d9ad39214ecc83723e1b6d63cef9282c88a6d0106ead52d7a362218439b19"}},{"ruleId":"D1","level":"warning","message":{"text":"SimpleBasePlayer.updateStateAndInformListeners (cyclomatic 39): SimpleBasePlayer.updateStateAndInformListeners has cyclomatic complexity 39 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":3287}}}],"partialFingerprints":{"codehealthFindingId/v1":"388ddfe3f775e9d2d030ced75e94c4a4d0aed479586c81008b60757cfb66420b"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecRenderer.feedInputBuffer (cyclomatic 37): MediaCodecRenderer.feedInputBuffer has cyclomatic complexity 37 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1221}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bad7792e83e9bb41b29e4b14f45dbed71f291836a373d18e10099828d742749"}},{"ruleId":"D1","level":"warning","message":{"text":"MessageListener.handleRtspResponse (cyclomatic 35): MessageListener.handleRtspResponse has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"96736695186411367b7e6cfeb5ccf62e59ba0b41c5b26d0f1600c535e4113f7d"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlDecoder.parseStyleAttributes (cyclomatic 35): TtmlDecoder.parseStyleAttributes has cyclomatic complexity 35 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba557e8b120151d14d04a8b249c01c616ec26ec93ae99155ac588a83c1bd6a64"}},{"ruleId":"D1","level":"warning","message":{"text":"MatroskaExtractor.binaryElement (cyclomatic 35): MatroskaExtractor.binaryElement has cyclomatic complexity 35 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":1150}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbad2b4d83701d69fac31d1167912f952590f1b2634388420fae11d9c9fb8058"}},{"ruleId":"D1","level":"warning","message":{"text":"Builder.populate (cyclomatic 35): Builder.populate has cyclomatic complexity 35 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"35968f713ad85819691b275532cb88822345137859d9f5939d757937cd7c432f"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultAudioSink.handleBuffer (cyclomatic 34): DefaultAudioSink.handleBuffer has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"f63839bb1967f070515ccc1a16c0a4adff828f185163468ae02079779579bd29"}},{"ruleId":"D1","level":"warning","message":{"text":"DvbParser.generateDefault8BitClutEntries (cyclomatic 34): DvbParser.generateDefault8BitClutEntries has cyclomatic complexity 34 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"53875ac6fa44d3bfe4bca2afd731cef2261969bbf18a7fdcf56005e0a5896a6d"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaMetadata.toBundle (cyclomatic 34): MediaMetadata.toBundle has cyclomatic complexity 34 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"25e7456b58337917d257eb69a3c3442825a541322ebc53a902e2269caf1d22ff"}},{"ruleId":"D1","level":"warning","message":{"text":"TextInformationFrame.populateMediaMetadata (cyclomatic 33): TextInformationFrame.populateMediaMetadata has cyclomatic complexity 33 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/TextInformationFrame.java"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"b88337bd346c6d9879c8bf18ffa1588fb84fbb8e463abfee34ee1518be413f7d"}},{"ruleId":"D1","level":"warning","message":{"text":"RtspHeaders.convertToStandardHeaderName (cyclomatic 33): RtspHeaders.convertToStandardHeaderName has cyclomatic complexity 33 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca5ebf526eb1f1033722f52ff53a47ccb7754d6313f0f948f87b911b09938658"}},{"ruleId":"D1","level":"warning","message":{"text":"NalUnitUtil.parseH265SpsNalUnitPayload (cyclomatic 32): NalUnitUtil.parseH265SpsNalUnitPayload has cyclomatic complexity 32 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd32443a03e35822208a4a681e468466205e9f3982c71e42773cf14ed9bb817c"}},{"ruleId":"D1","level":"warning","message":{"text":"MetadataUtil.parseIlstElement (cyclomatic 32): MetadataUtil.parseIlstElement has cyclomatic complexity 32 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtil.java"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"994ef1fbfcdcd34414aea2a80a2ad2fef73ddebf1f9e332cffc216b072beb92e"}},{"ruleId":"D1","level":"warning","message":{"text":"FileTypes.inferFileTypeFromUri (cyclomatic 30): FileTypes.inferFileTypeFromUri has cyclomatic complexity 30 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/FileTypes.java"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f06d8db55008ac68d1dc9ce6951a15a6c472d3c18e8877314d5943228bd40a"}},{"ruleId":"D1","level":"warning","message":{"text":"NalUnitUtil.parseSpsNalUnitPayload (cyclomatic 30): NalUnitUtil.parseSpsNalUnitPayload has cyclomatic complexity 30 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"2234348afad8ae7c7bef4d48e6468c096acc0a8d49870c3d3623304e2228131f"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionDescriptionParser.parse (cyclomatic 29): SessionDescriptionParser.parse has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4954f7bb8f67bac0dbc9506b427e3f024d73c96626404fea35e26811f8b5bc63"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlRenderUtil.applyStylesToSpan (cyclomatic 29): TtmlRenderUtil.applyStylesToSpan has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d87100e0d27ee9172a3a0c6edab74e312188a6b87ddefe9b7a33bac1199608a"}},{"ruleId":"D1","level":"warning","message":{"text":"MatroskaExtractor.endMasterElement (cyclomatic 29): MatroskaExtractor.endMasterElement has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f3df36a4b69b20e82d255bc46433d5c2d9317a44e03b3cb4f7ba85a4822d416"}},{"ruleId":"D1","level":"warning","message":{"text":"SampleReader.appendToNalUnit (cyclomatic 29): SampleReader.appendToNalUnit has cyclomatic complexity 29 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"bccb32185be08ed491d87e2889a430b412a8b1b78ced3d915625b4386bc3004c"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultDashChunkSource.getNextChunk (cyclomatic 28): DefaultDashChunkSource.getNextChunk has cyclomatic complexity 28 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f9fee48181c764308fff91298d94979942552e0fd4cff98d77fedff06b92723"}},{"ruleId":"D1","level":"warning","message":{"text":"TextRenderer.render (cyclomatic 28): TextRenderer.render has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6c389dc9ba73e4d4715b7cd00dce6554b86cd99828a920b5df6c6b0fb1f2438"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecUtil.isCodecUsableDecoder (cyclomatic 28): MediaCodecUtil.isCodecUsableDecoder has cyclomatic complexity 28 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5d7d001b85281d7037ab528bc13297249243b62c6ee01442439a4febf046c7"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultExtractorsFactory.addExtractorsForFileType (cyclomatic 28): DefaultExtractorsFactory.addExtractorsForFileType has cyclomatic complexity 28 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"c891975dcab34d0e1371fae22e8b86b7311221cf08cf0733115c513e83410fbf"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsMediaPeriod.buildAndPrepareMainSampleStreamWrapper (cyclomatic 27): HlsMediaPeriod.buildAndPrepareMainSampleStreamWrapper has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3bc1871006caf56ba9aeeb8142776c44e7c2ac78961ee262a7c15012e6aea17"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsSampleStreamWrapper.selectTracks (cyclomatic 27): HlsSampleStreamWrapper.selectTracks has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"639b0e7e0d43f13af773ab5779dfbf932cb1fb0bc9749d556177abf5b23fbe67"}},{"ruleId":"D1","level":"warning","message":{"text":"SubtitlePainter.setupTextLayout (cyclomatic 27): SubtitlePainter.setupTextLayout has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitlePainter.java"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"e6f3cf3d39c12264684c14e080ce99aaf5cc7adeced04c582ea024c327dfe47e"}},{"ruleId":"D1","level":"warning","message":{"text":"NalUnitUtil.skipShortTermReferencePictureSets (cyclomatic 27): NalUnitUtil.skipShortTermReferencePictureSets has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"27c33d1fbc79b4ddb0fedb52f8a3d827a6986707c8bbd89b9a2b0ea76b39ce92"}},{"ruleId":"D1","level":"warning","message":{"text":"MatroskaExtractor.writeSampleData (cyclomatic 27): MatroskaExtractor.writeSampleData has cyclomatic complexity 27 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":1469}}}],"partialFingerprints":{"codehealthFindingId/v1":"166934a7038de42c2be0c8f15198c6d9c2eea5bfe94c34d0a9873f4d1111df14"}},{"ruleId":"D1","level":"warning","message":{"text":"SampleListLoader.readEntry (cyclomatic 26): SampleListLoader.readEntry has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"71019111734cdf1e997cd75e5691bbc20464fb20d56ebb5fb32144c2f790f317"}},{"ruleId":"D1","level":"warning","message":{"text":"AacUtil.parseAudioSpecificConfig (cyclomatic 26): AacUtil.parseAudioSpecificConfig has cyclomatic complexity 26 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java"},"region":{"startLine":206}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7962374cdc2dedfff1d9898d1444184fdbdcae83413c6ed305feae370568748"}},{"ruleId":"D1","level":"warning","message":{"text":"StyledPlayerView.\u003Cinit\u003E (cyclomatic 26): StyledPlayerView.\u003Cinit\u003E has cyclomatic complexity 26 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"34ad2a10a05227d07c08836cc1e478182b1f699fb2fd3a272b6e08cfea24ab4a"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecVideoRenderer.processOutputBuffer (cyclomatic 26): MediaCodecVideoRenderer.processOutputBuffer has cyclomatic complexity 26 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"76304355340c3aff0c25e16befcbba2d9be799ab373d20352228b375d74ffe15"}},{"ruleId":"D1","level":"warning","message":{"text":"PlayerView.\u003Cinit\u003E (cyclomatic 25): PlayerView.\u003Cinit\u003E has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"c315c646a9c4143a6f1d24d7b581e5b81f12b261661b9475cbbf14a776e2c765"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecRenderer.onInputFormatChanged (cyclomatic 25): MediaCodecRenderer.onInputFormatChanged has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"0180d9b86a3852bc794065d85239018d4fbc9aea577d2261b11ec17da7ccf2a2"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImpl.updatePlaybackInfo (cyclomatic 25): ExoPlayerImpl.updatePlaybackInfo has cyclomatic complexity 25 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":1960}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee94f0e109249b9487cfd9b960d00d3b6494bdcb889682f98edb23fae47b5576"}},{"ruleId":"D1","level":"warning","message":{"text":"SessionCallback.buildAllowedCommands (cyclomatic 24): SessionCallback.buildAllowedCommands has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionCallback.java"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"4184bf5d3d56c5392f99646420da71f565579e8c7dbd0a1f500da651538a2248"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultMediaMetadataProvider.getMetadata (cyclomatic 24): DefaultMediaMetadataProvider.getMetadata has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":1045}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba9ed5800898d74070a4f1f17394c9df2a6b139c177f55419b4f366e20bea0d5"}},{"ruleId":"D1","level":"warning","message":{"text":"DashManifestParser.parseMediaPresentationDescription (cyclomatic 24): DashManifestParser.parseMediaPresentationDescription has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0058b17eacb4e7d2cb895d670dd0a1dedcd60fcea1aeb7762944b91b44e239f"}},{"ruleId":"D1","level":"warning","message":{"text":"DashMediaSource.updateLiveConfiguration (cyclomatic 24): DashMediaSource.updateLiveConfiguration has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"25f99fbbf7c8dbd6095f8a8a06bf63a276bf69b713f012ef35ba59e52be2cfea"}},{"ruleId":"D1","level":"warning","message":{"text":"Cea608Decoder.decode (cyclomatic 24): Cea608Decoder.decode has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"0552bdd2a21839f8c99faecf3ea1649e6c1db0244c47566055404aa238ac9524"}},{"ruleId":"D1","level":"warning","message":{"text":"StyledPlayerControlView.\u003Cinit\u003E (cyclomatic 24): StyledPlayerControlView.\u003Cinit\u003E has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8006b06ea3c2fd9878c598845d2a9b6246a1a4e2a81d2b348bf8454f9312c89"}},{"ruleId":"D1","level":"warning","message":{"text":"PlaybackStatsTracker.onEvents (cyclomatic 24): PlaybackStatsTracker.onEvents has cyclomatic complexity 24 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"42431e8484cc940f454f3e11d4a1dbdf824f5e2f7da5e076ee1ac613e304df80"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecInfo.canReuseCodec (cyclomatic 24): MediaCodecInfo.canReuseCodec has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b3252bacbc660dc64b95dc389f2c5e18db6f37f2e65da2eea4c42e25d8f3b7f"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultTsPayloadReaderFactory.createPayloadReader (cyclomatic 24): DefaultTsPayloadReaderFactory.createPayloadReader has cyclomatic complexity 24 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe815527d1a8785e5c89cdd98c62192aeb859df27fbb52d3772d83d1da7d8dbd"}},{"ruleId":"D1","level":"warning","message":{"text":"H262Reader.consume (cyclomatic 24): H262Reader.consume has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"89dbfd4bf6f27722526a336f3a276c4719892d0e0f38aa79774e8c1e8d8c5937"}},{"ruleId":"D1","level":"warning","message":{"text":"PmtReader.consume (cyclomatic 24): PmtReader.consume has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"c49c6d60fdd7bf6ece889571c58cada3f64970a780c1246d468bca96921dd2d2"}},{"ruleId":"D1","level":"warning","message":{"text":"TransformerActivity.createVideoEffectsFromBundle (cyclomatic 23): TransformerActivity.createVideoEffectsFromBundle has cyclomatic complexity 23 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/TransformerActivity.java"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"45908a01834e823d26d30bad7b87662241d0f90234283e33cd9febaebfa393fe"}},{"ruleId":"D1","level":"warning","message":{"text":"CronetDataSource.open (cyclomatic 23): CronetDataSource.open has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ea882e8497ffa1a833a1485c8696bcca45ab85fd35ac6bfc2e954cf1aca354"}},{"ruleId":"D1","level":"warning","message":{"text":"PlayerCommandQueue.processPendingCommandOnHandler (cyclomatic 23): PlayerCommandQueue.processPendingCommandOnHandler has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerCommandQueue.java"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"01d4b996d82246d33a7456bff9ea3f46026cd77ec4300a3bcbf764358c8b5490"}},{"ruleId":"D1","level":"warning","message":{"text":"SegmentDownloader.download (cyclomatic 23): SegmentDownloader.download has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"378c305e8ea44729f8f566ed67349c918488e75676123860274ba99ef8d1c77a"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlStyle.inherit (cyclomatic 23): TtmlStyle.inherit has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"443120528257667b13b60ba939dc7d4c0683875b64f9095cce3c855c5115dbaa"}},{"ruleId":"D1","level":"warning","message":{"text":"WebViewSubtitleOutput.updateWebView (cyclomatic 23): WebViewSubtitleOutput.updateWebView has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/WebViewSubtitleOutput.java"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"98b23bbf8a959e4972f3f6c720c91046e3720a3a967284d8c623a722ffcbb6c5"}},{"ruleId":"D1","level":"warning","message":{"text":"CacheDataSource.openNextSource (cyclomatic 23): CacheDataSource.openNextSource has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"4676c3739fdedb442ef3793be1db367d370d288ee1ea0423b6aa5b01fe34f9a7"}},{"ruleId":"D1","level":"warning","message":{"text":"RawResourceDataSource.open (cyclomatic 23): RawResourceDataSource.open has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d7b1257dface6f895f4107b52be059292b4a350a9169212b1c145056c3c1bb"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecRenderer.drainOutputBuffer (cyclomatic 23): MediaCodecRenderer.drainOutputBuffer has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"86d577269f760033eb61712ba4746432ccb9b9b85783929f04c9a6da5652c7e6"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecUtil.getDecoderInfosInternal (cyclomatic 23): MediaCodecUtil.getDecoderInfosInternal has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"fff4c0947a69c55b82e2e7b975f8da94b9e3fedeb4686894d96cc648edea7dec"}},{"ruleId":"D1","level":"warning","message":{"text":"Sniffer.sniffInternal (cyclomatic 23): Sniffer.sniffInternal has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Sniffer.java"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72617b412958f486c12c37c75bd5e92df76ccff66e842129176af4515591124"}},{"ruleId":"D1","level":"warning","message":{"text":"PsExtractor.read (cyclomatic 23): PsExtractor.read has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a244b37c0f54951603c6a1d63e4cd23f30d13139e5e2336397f4ab3bab3aeee"}},{"ruleId":"D1","level":"warning","message":{"text":"TsExtractor.read (cyclomatic 23): TsExtractor.read has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"03df08d29d6e9474a49ccf78f27de5fa209ea184da862c1db1e06ce4deb0dd38"}},{"ruleId":"D1","level":"warning","message":{"text":"AdTagLoader.handleTimelineOrPositionChanged (cyclomatic 22): AdTagLoader.handleTimelineOrPositionChanged has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"787c82cb28584a98fa48a5f75626fd17ed9ef58a694fb9713cd2683a632c85f2"}},{"ruleId":"D1","level":"warning","message":{"text":"ToInt16PcmAudioProcessor.queueInput (cyclomatic 22): ToInt16PcmAudioProcessor.queueInput has cyclomatic complexity 22 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/audio/ToInt16PcmAudioProcessor.java"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"ddc5e3b6179fd395debced26586867348d82f315db9e36b7ac3e5a674be3fe73"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultAudioSink.writeBuffer (cyclomatic 22): DefaultAudioSink.writeBuffer has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd2f78fefe7f5dbd20847541f827e6d96516351bc717309fef948e27b8b2290a"}},{"ruleId":"D1","level":"warning","message":{"text":"DashManifestParser.parseAdaptationSet (cyclomatic 22): DashManifestParser.parseAdaptationSet has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"af85bd8490c9a0d13b6ad2436df9ff536c357653d6c10f8c3a6d0734affd8218"}},{"ruleId":"D1","level":"warning","message":{"text":"WebvttCssParser.parseStyleDeclaration (cyclomatic 22): WebvttCssParser.parseStyleDeclaration has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a45d8962bf1c4a7fae647cc228d19d05db584227a6fcc6bb05a5f7369c63d21"}},{"ruleId":"D1","level":"warning","message":{"text":"StyledPlayerControlView.updateTimeline (cyclomatic 22): StyledPlayerControlView.updateTimeline has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1185}}}],"partialFingerprints":{"codehealthFindingId/v1":"a83aaf293cea9388b2dae8e90693087613b80872b3374750e113b424270856dc"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImplInternal.resolvePositionForPlaylistChange (cyclomatic 22): ExoPlayerImplInternal.resolvePositionForPlaylistChange has cyclomatic complexity 22 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":2655}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d4db620efb50a9492e0b6d035ed7c861deb0c0c2b5fb36c5a991aa4bc88928a"}},{"ruleId":"D1","level":"warning","message":{"text":"Ac4Util.parseAc4SyncframeInfo (cyclomatic 21): Ac4Util.parseAc4SyncframeInfo has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"8889fb5141905c5da5d3b821a7d77e37096efd318d19fe9d415bc997312576ee"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlDecoder.parseRegionAttributes (cyclomatic 21): TtmlDecoder.parseRegionAttributes has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"a63ca930dc5c1fdbb7b04efbfd1a6b027ab704f7f17c6d4a2c6a7750a643fb20"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultHttpDataSource.open (cyclomatic 21): DefaultHttpDataSource.open has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ba696e20df3f58c0828de84172b14b1ec9a8c128e62ea498654e5638641f53e"}},{"ruleId":"D1","level":"warning","message":{"text":"FragmentedMp4Extractor.readAtomHeader (cyclomatic 21): FragmentedMp4Extractor.readAtomHeader has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"90c10e44ad1d436c2ff53390e7613aa7da8c3515c728ebf8e8d664457049431d"}},{"ruleId":"D1","level":"warning","message":{"text":"FragmentedMp4Extractor.readSample (cyclomatic 21): FragmentedMp4Extractor.readSample has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":1351}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe1f2080f27f29bb699c730e6a7729e91ab8ebec84350e222e27704756453557"}},{"ruleId":"D1","level":"warning","message":{"text":"PesReader.consume (cyclomatic 21): PesReader.consume has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PesReader.java"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"15dc5bece0db826a79c896c860e21a0638b7f77c731c8e36e2a16aa186fb227a"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultEncoderFactory.createForVideoEncoding (cyclomatic 21): DefaultEncoderFactory.createForVideoEncoding has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactory.java"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe5b555b7d88091dc3b1cde6c5494b15bd44ce48cbcfa5ea548d7ed999f84a58"}},{"ruleId":"D1","level":"warning","message":{"text":"WebServerDispatcher.dispatch (cyclomatic 21): WebServerDispatcher.dispatch has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/WebServerDispatcher.java"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"f41b3ef81fef34cf73d6e787dacb0da497e33ec68874dc4142a7246dba70c194"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImplInternal.maybeTriggerPendingMessages (cyclomatic 21): ExoPlayerImplInternal.maybeTriggerPendingMessages has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1655}}}],"partialFingerprints":{"codehealthFindingId/v1":"e593a94e25675fe639f471627b9f23c76614f80568d9d92a4e1f242222300ec9"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImplInternal.maybeUpdateReadingPeriod (cyclomatic 21): ExoPlayerImplInternal.maybeUpdateReadingPeriod has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":2091}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ea82a01e9008158153a634ef8f6de1c96b1ca7d8d560e6094c85beb180f46b9"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadService.onStartCommand (cyclomatic 20): DownloadService.onStartCommand has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4fa02fbeac834e4fe32d253db09adbb93a4c4f084b06932abd1f5476f93a134"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsChunkSource.getNextChunk (cyclomatic 20): HlsChunkSource.getNextChunk has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a7268e5b2e6ac64d1d4afc0ba2a708bb4a582a8c25cd459a9ca58b24ba78c05"}},{"ruleId":"D1","level":"warning","message":{"text":"RtpVp9Reader.validateVp9Descriptor (cyclomatic 20): RtpVp9Reader.validateVp9Descriptor has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp9Reader.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"5647cb932d04a20fee39c6533c02270508abe6afcde06261201a56f4f3939867"}},{"ruleId":"D1","level":"warning","message":{"text":"CueBuilder.buildCurrentLine (cyclomatic 20): CueBuilder.buildCurrentLine has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java"},"region":{"startLine":1054}}}],"partialFingerprints":{"codehealthFindingId/v1":"44dd0b1560a0207b5e7a04b5a28d04e2458c7824983a47ac1aef87a6125ef408"}},{"ruleId":"D1","level":"warning","message":{"text":"DvbParser.parseSubtitlingSegment (cyclomatic 20): DvbParser.parseSubtitlingSegment has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa1c029031133f6d10609a6ce5db26876766a70a00b84f32b4fd6e44a3546425"}},{"ruleId":"D1","level":"warning","message":{"text":"SpannedToHtmlConverter.getOpeningTag (cyclomatic 20): SpannedToHtmlConverter.getOpeningTag has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"1312508e1830f87c938006e0d85b32db38dd8a2d33a2821a6379c4831131d9da"}},{"ruleId":"D1","level":"warning","message":{"text":"ComponentListener.onClick (cyclomatic 20): ComponentListener.onClick has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1696}}}],"partialFingerprints":{"codehealthFindingId/v1":"a48318e66097364a10c6392a54472474d4242fda9d5413be03781f872aefab3f"}},{"ruleId":"D1","level":"warning","message":{"text":"FinalShaderProgramWrapper.ensureConfigured (cyclomatic 20): FinalShaderProgramWrapper.ensureConfigured has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/effect/src/main/java/com/google/android/exoplayer2/effect/FinalShaderProgramWrapper.java"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"74ba010440b6aa7c1615d840fab299d5e3b0bbbb4bba274598daabe543f962bf"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaMetadata.fromBundle (cyclomatic 20): MediaMetadata.fromBundle has cyclomatic complexity 20 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"b704596b54ab0238c875bad29be7c03637bfb144d6bb609df9df3b8de1e2e310"}},{"ruleId":"D1","level":"warning","message":{"text":"ExoPlayerImplInternal.resetInternal (cyclomatic 20): ExoPlayerImplInternal.resetInternal has cyclomatic complexity 20 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1441}}}],"partialFingerprints":{"codehealthFindingId/v1":"ded160d7493b782b3207e4d92cd7458eea1652fb240b591fa8894d761012ac87"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecAudioRenderer.supportsFormat (cyclomatic 19): MediaCodecAudioRenderer.supportsFormat has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d056b55f410dcd7d0c1e49eab0756705d58d2ae2b877705dfaea9db6a655bb9"}},{"ruleId":"D1","level":"warning","message":{"text":"DashManifestParser.parseContentProtection (cyclomatic 19): DashManifestParser.parseContentProtection has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"be98ee520f4d4e020227fc2d6584e6f1be004934c8f0692dc9267cb6d618d54c"}},{"ruleId":"D1","level":"warning","message":{"text":"Cea708Decoder.processCurrentPacket (cyclomatic 19): Cea708Decoder.processCurrentPacket has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"e237dfb4656da07420b940ee0e6011490055409cfa6d9e6ecfdbbf536c13faa3"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlDecoder.parseNode (cyclomatic 19): TtmlDecoder.parseNode has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"a138f0324686c1326a825a34576a72ed7d29d53d037acf585416ebae5d4d2a99"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlNode.cleanUpText (cyclomatic 19): TtmlNode.cleanUpText has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a73e0a8f655962d7301f14cea8a890ec3d994247609b355d9ee058820c724fe"}},{"ruleId":"D1","level":"warning","message":{"text":"WebvttCueParser.parseCueText (cyclomatic 19): WebvttCueParser.parseCueText has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e3a3bb261de0b628d368981ad7ad030055a576b5e76a21d6b54bdbd2e99e9c6"}},{"ruleId":"D1","level":"warning","message":{"text":"DownloadNotificationHelper.buildProgressNotification (cyclomatic 19): DownloadNotificationHelper.buildProgressNotification has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac7558708aca9cb7716a31db33b388c5821eec7069a7f889c5463624e1320366"}},{"ruleId":"D1","level":"warning","message":{"text":"PlayerControlView.updateTimeline (cyclomatic 19): PlayerControlView.updateTimeline has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":947}}}],"partialFingerprints":{"codehealthFindingId/v1":"d104fd33e8252aae165dfe830a74fd56849739586d438ec12016ae48ef87a5c0"}},{"ruleId":"D1","level":"warning","message":{"text":"NotificationBroadcastReceiver.onReceive (cyclomatic 19): NotificationBroadcastReceiver.onReceive has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java"},"region":{"startLine":1536}}}],"partialFingerprints":{"codehealthFindingId/v1":"c859b3738631130816006a96f5e5133a0d6c6050e195adc9f72ff9786e4befda"}},{"ruleId":"D1","level":"warning","message":{"text":"NalUnitUtil.findNalUnit (cyclomatic 19): NalUnitUtil.findNalUnit has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"b11552b47c4ef7fcade47d5be0a98389a061bb0c3402b19c9cc24f272adf1990"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecVideoRenderer.getCodecMaxInputSize (cyclomatic 19): MediaCodecVideoRenderer.getCodecMaxInputSize has cyclomatic complexity 19 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"b93577f6f4ec04c4554310c4d4261b4132ce38c1cca926929dc4d7b43473dd7b"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecVideoRenderer.handleMessage (cyclomatic 19): MediaCodecVideoRenderer.handleMessage has cyclomatic complexity 19 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":659}}}],"partialFingerprints":{"codehealthFindingId/v1":"11cad81efb170ba687003f6751779aec3ef51c4c7ebabc8d47273a58790ec39f"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecVideoRenderer.supportsFormat (cyclomatic 19): MediaCodecVideoRenderer.supportsFormat has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"10326b9996e6131f3a46e6dbbb4cffa11e41c4b8338261410fa40166e59cff5b"}},{"ruleId":"D1","level":"warning","message":{"text":"PlaybackStatsTracker.build (cyclomatic 19): PlaybackStatsTracker.build has cyclomatic complexity 19 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"eef0c02890a264e9fbda3f32915d5920c687b92233e5628b972b19ab1dfde3ae"}},{"ruleId":"D1","level":"warning","message":{"text":"AviExtractor.read (cyclomatic 19): AviExtractor.read has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/avi/AviExtractor.java"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa473bd8de2bf8b7c3b9ade07b6888cedb8340c4e68cb1e7a2aa9612aa6286a3"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsSampleStreamWrapper.buildTracksFromSampleStreams (cyclomatic 18): HlsSampleStreamWrapper.buildTracksFromSampleStreams has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":1372}}}],"partialFingerprints":{"codehealthFindingId/v1":"4631c4bbe9f04acc385359bf4133ffcdf2d854c42d0e883c34960c4dbf94fdb4"}},{"ruleId":"D1","level":"warning","message":{"text":"ProgressiveMediaPeriod.selectTracks (cyclomatic 18): ProgressiveMediaPeriod.selectTracks has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"94706a40ca684555191e6acde0299cad05aaa26435472115b46894bfe22d3f7b"}},{"ruleId":"D1","level":"warning","message":{"text":"Cue.fromBundle (cyclomatic 18): Cue.fromBundle has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ba8e26ce0260cb28234c34c3ae05c781cada46d939e9400540c70a4dd7963f8"}},{"ruleId":"D1","level":"warning","message":{"text":"StyledPlayerControlView.dispatchMediaKeyEvent (cyclomatic 18): StyledPlayerControlView.dispatchMediaKeyEvent has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd4b2abad0cbc4881b97c1222f93c44c205690d4c769df55bb5307d99cf0e362"}},{"ruleId":"D1","level":"warning","message":{"text":"CmcdHeadersFactory.createHttpRequestHeaders (cyclomatic 18): CmcdHeadersFactory.createHttpRequestHeaders has cyclomatic complexity 18 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"03451237f2aba1f36dcd4867a21f1292905b128aafe491dfbe9b845ecbaa7e6b"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecVideoRenderer.setOutput (cyclomatic 18): MediaCodecVideoRenderer.setOutput has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"2d021f75602a33685bbfd21165d86fe56cd95c1c076d5973bff32390353f723b"}},{"ruleId":"D1","level":"warning","message":{"text":"PlaybackStatsTracker.resolveNewPlaybackState (cyclomatic 18): PlaybackStatsTracker.resolveNewPlaybackState has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":697}}}],"partialFingerprints":{"codehealthFindingId/v1":"4111d64c201ee17e85a518da842254b8be9d0275f0d52ea7ffff9327dfe6c2d3"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultEbmlReader.read (cyclomatic 18): DefaultEbmlReader.read has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/DefaultEbmlReader.java"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d0af8d043c9946055b76d897eaa18101930c84fc057887de8d823a9e48049e"}},{"ruleId":"D1","level":"warning","message":{"text":"Mp3Extractor.synchronize (cyclomatic 18): Mp3Extractor.synchronize has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d1fb704ac330a3367616607fae8bc8e3c8e9c305f7b2f50c45b0e24d7732c8d"}},{"ruleId":"D1","level":"warning","message":{"text":"TransformerInternal.endInternal (cyclomatic 18): TransformerInternal.endInternal has cyclomatic complexity 18 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b6236cf2f495d0e8d9acba9bcdf85df86b19fc6c825f333346f9c1bcbe22d95"}},{"ruleId":"D1","level":"warning","message":{"text":"ImaServerSideAdInsertionUriBuilder.build (cyclomatic 17): ImaServerSideAdInsertionUriBuilder.build has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f28eab330d0723419983400af35db7f1b3917851ac33fc47a9ef0a8709881ae"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaSessionConnector.invalidateMediaSessionPlaybackState (cyclomatic 17): MediaSessionConnector.invalidateMediaSessionPlaybackState has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":772}}}],"partialFingerprints":{"codehealthFindingId/v1":"f6febb4cb9ca172826aca13c9a148130e13b72af4663c3c839218130b1ea8f9d"}},{"ruleId":"D1","level":"warning","message":{"text":"OpusDecoder.\u003Cinit\u003E (cyclomatic 17): OpusDecoder.\u003Cinit\u003E has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ab65af7db64668502d886cabeebfde488860061a5d733e5f3b4eb6a1d129557"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultDashChunkSource.onChunkLoadError (cyclomatic 17): DefaultDashChunkSource.onChunkLoadError has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"48e00e8d3164b687a5dfdf71107321135a31d4a28ac001679893c0e9b9ec7003"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsChunkSource.getNextMediaSequenceAndPartIndex (cyclomatic 17): HlsChunkSource.getNextMediaSequenceAndPartIndex has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java"},"region":{"startLine":799}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ec7342af3cbc2e1bf5b3e9f50806e714569b761240a289a429c7629dfe58fd0"}},{"ruleId":"D1","level":"warning","message":{"text":"HlsMediaPeriod.selectTracks (cyclomatic 17): HlsMediaPeriod.selectTracks has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"b794f0fc98c7e3595f20b0d917eec1748ba4b961db7b4f8825b058666ffc3180"}},{"ruleId":"D1","level":"warning","message":{"text":"Cea608Decoder.handleMiscCode (cyclomatic 17): Cea608Decoder.handleMiscCode has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java"},"region":{"startLine":641}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f518625b88990fc7ccf8b9ac768f807dfb820dee29ae6b7e796e9ebe5a6f700"}},{"ruleId":"D1","level":"warning","message":{"text":"DvbParser.decode (cyclomatic 17): DvbParser.decode has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bbb01493897a0d8ff3141ccd8d46c25e4de3e25d6c2bcebf59352a8f4ab3fce"}},{"ruleId":"D1","level":"warning","message":{"text":"SsaDecoder.createCue (cyclomatic 17): SsaDecoder.createCue has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f71cc0c3eef5ee58e3a07a2922c606186dda7e4b343d2e52033131a804bec49"}},{"ruleId":"D1","level":"warning","message":{"text":"TtmlDecoder.decode (cyclomatic 17): TtmlDecoder.decode has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa13047e724a21d4590373df29cc2b702e9e701e02c45dfea4813b580401f79c"}},{"ruleId":"D1","level":"warning","message":{"text":"VideoTrackInfo.\u003Cinit\u003E (cyclomatic 17): VideoTrackInfo.\u003Cinit\u003E has cyclomatic complexity 17 (threshold 15). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":3249}}}],"partialFingerprints":{"codehealthFindingId/v1":"657d89238c83b250e0bdafbdd0d6b224dee959a5274a67cb1a28d3f65c31ac61"}},{"ruleId":"D1","level":"warning","message":{"text":"PlayerControlView.updateProgress (cyclomatic 17): PlayerControlView.updateProgress has cyclomatic complexity 17 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1019}}}],"partialFingerprints":{"codehealthFindingId/v1":"e32b11bf1fe3fd3002e7dc9d0ad6ac511b230c71ef699ce89b51d88471a5d2a7"}},{"ruleId":"D1","level":"warning","message":{"text":"StyledPlayerView.setPlayer (cyclomatic 17): StyledPlayerView.setPlayer has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1c58f15ba0b7d12e6109a7650a77208ea9ce637d6bf6acc0f1acad99c3cfbd6"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecRenderer.render (cyclomatic 17): MediaCodecRenderer.render has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"96a0ddc1054bf0a34dc9fb008b0bc4a54eab1de64d64afd154fd5f900ced556a"}},{"ruleId":"D1","level":"warning","message":{"text":"AdtsReader.checkSyncPositionValid (cyclomatic 17): AdtsReader.checkSyncPositionValid has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"023df955cbf26d851bb866af61c14a68c73c26770ffa965ce74a91860aca86d4"}},{"ruleId":"D1","level":"warning","message":{"text":"PmtReader.readEsInfo (cyclomatic 17): PmtReader.readEsInfo has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"215f8a77a2c8d38fffd72100d9b6e142c30e3320b5693f2089b7f0b25abd236d"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration (cyclomatic 17): MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration has cyclomatic complexity 17 (threshold 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaPeriodAsserts.java"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"3851abe328993faba47e2a7c1006c5cc43a93c3a2d832f0acd2b99529df591f7"}},{"ruleId":"D1","level":"warning","message":{"text":"State.\u003Cinit\u003E (cyclomatic 17): State.\u003Cinit\u003E has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"3242a99f5b71a81dc131b4ad3b2f261fce72208ff8bcdde330cc2d67b8946661"}},{"ruleId":"D1","level":"warning","message":{"text":"ComponentListener.onPositionDiscontinuity (cyclomatic 16): ComponentListener.onPositionDiscontinuity has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"595506f059698a30048f2b49730c027f245fcdc7c051dc2d6d19ec25761ddc04"}},{"ruleId":"D1","level":"warning","message":{"text":"OkHttpDataSource.open (cyclomatic 16): OkHttpDataSource.open has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"ada748fc148bed256afd3356d614aac4559129ebc1183164ea5f61caf0f792f2"}},{"ruleId":"D1","level":"warning","message":{"text":"AudioCapabilities.getEncodingAndChannelConfigForPassthrough (cyclomatic 16): AudioCapabilities.getEncodingAndChannelConfigForPassthrough has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"070e52f740be98b9c7b65cbb40f5d032b0929f97a2a79a0dd06a5fb7040eda70"}},{"ruleId":"D1","level":"warning","message":{"text":"DefaultAudioSink.configure (cyclomatic 16): DefaultAudioSink.configure has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"29d2f2db463c14381e582f52f2ac4e3bf07926a3aa35ecd49423f702d33e8eee"}},{"ruleId":"D1","level":"warning","message":{"text":"DashManifestParser.parseRepresentation (cyclomatic 16): DashManifestParser.parseRepresentation has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b19dd5949459dabb8c9ee0208c146972403690dd47516e5e6e814c8c5858deb"}},{"ruleId":"D1","level":"warning","message":{"text":"ElementParser.parse (cyclomatic 16): ElementParser.parse has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca365eece1dd74c5284f7a12790fa6f0afaeaf6a478d1a63cd736e1875671add"}},{"ruleId":"D1","level":"warning","message":{"text":"QualityLevelParser.fourCCToMimeType (cyclomatic 16): QualityLevelParser.fourCCToMimeType has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java"},"region":{"startLine":777}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a7cbb3aca5b7e8292a6ddd1431fa9c83287872737da95d2c2f1bc0a8b57bb9b"}},{"ruleId":"D1","level":"warning","message":{"text":"StyledPlayerControlView.updateProgress (cyclomatic 16): StyledPlayerControlView.updateProgress has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1264}}}],"partialFingerprints":{"codehealthFindingId/v1":"a404cb03f358f4377d3eb6373caac58522e46da6059fab789b3c8409de1a30d2"}},{"ruleId":"D1","level":"warning","message":{"text":"ContentDataSource.open (cyclomatic 16): ContentDataSource.open has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"928552bf298bf5c0508cd757ca1a1c197885adbe5cbd495127b6d86246432118"}},{"ruleId":"D1","level":"warning","message":{"text":"DecoderVideoRenderer.processOutputBuffer (cyclomatic 16): DecoderVideoRenderer.processOutputBuffer has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"4532d295bd238c97563ac530c01668a8e7bf91dc81241415986342e9012cd93a"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecRenderer.maybeInitCodecOrBypass (cyclomatic 16): MediaCodecRenderer.maybeInitCodecOrBypass has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"a24961752385204e747d15f5f6b30dd49142a21a92074d4825d4bf97e38e9d3a"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaCodecUtil.applyWorkarounds (cyclomatic 16): MediaCodecUtil.applyWorkarounds has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"18ff98bece19e43c286114effeb14216168791c68d86674c2936112d94b19c7e"}},{"ruleId":"D1","level":"warning","message":{"text":"MatroskaExtractor.startMasterElement (cyclomatic 16): MatroskaExtractor.startMasterElement has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":662}}}],"partialFingerprints":{"codehealthFindingId/v1":"a01cb5b3615ee475d418f98b795704b62eb10d60765a01c2db38a71ef18bd71d"}},{"ruleId":"D1","level":"warning","message":{"text":"FragmentedMp4Extractor.parseSampleGroups (cyclomatic 16): FragmentedMp4Extractor.parseSampleGroups has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":1164}}}],"partialFingerprints":{"codehealthFindingId/v1":"068fa762f1921c43584c94e2bc4d2f7fd344192351358abfbc5a3e9866195a87"}},{"ruleId":"D1","level":"warning","message":{"text":"Mp4Extractor.readSample (cyclomatic 16): Mp4Extractor.readSample has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"f5f26a946be97c9ae4c83be4a09b22401ff58732d34690722bb3efbe170e03a4"}},{"ruleId":"D1","level":"warning","message":{"text":"EnumerateDecodersTest.codecCapabilitiesToString (cyclomatic 16): EnumerateDecodersTest.codecCapabilitiesToString has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/EnumerateDecodersTest.java"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"74d280069b40e381c21716e4ea62f136fba6d983eb3d6f8f4e9ffcbb54bf2489"}},{"ruleId":"D1","level":"warning","message":{"text":"MediaPeriodQueue.getMediaPeriodInfoForContent (cyclomatic 16): MediaPeriodQueue.getMediaPeriodInfoForContent has cyclomatic complexity 16 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":955}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bdc08e693cd25c7105c1f439f7ce208eb175aba5a83307578b95b1926470c07"}},{"ruleId":"D2","level":"warning","message":{"text":"DeviceMappedEncoderBitrateProvider.getBitrateMultiplierFromMapping (cognitive 796): DeviceMappedEncoderBitrateProvider.getBitrateMultiplierFromMapping has cognitive complexity 796 (threshold 15). Drivers by points: match/switch 796 (nesting depth added 597). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bbc573c3bff8151f907b23a85aebe6bb3ec40c8867221213967aca3151fdb8f"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsPlaylistParser.parseMediaPlaylist (cognitive 744): HlsPlaylistParser.parseMediaPlaylist has cognitive complexity 744 (threshold 15). Drivers by points: if/else 660, ternaries 57, loops 16, boolean chains 11 (nesting depth added 659). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":639}}}],"partialFingerprints":{"codehealthFindingId/v1":"9981a1adbcf976baf5aaa920a816c029b81f4ff257e80b326bf1942603c1e983"}},{"ruleId":"D2","level":"warning","message":{"text":"Ac3Util.parseAc3SyncframeInfo (cognitive 257): Ac3Util.parseAc3SyncframeInfo has cognitive complexity 257 (threshold 15). Drivers by points: if/else 233, boolean chains 10, loops 6, ternaries 6, match/switch 2 (nesting depth added 186). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"4186071c0439d9c8d33ed7f14dad2fa885848f3c892938b23a4d8cfe5f68e186"}},{"ruleId":"D2","level":"warning","message":{"text":"AtomParsers.parseVideoSampleEntry (cognitive 166): AtomParsers.parseVideoSampleEntry has cognitive complexity 166 (threshold 15). Drivers by points: if/else 110, ternaries 34, match/switch 15, boolean chains 6, loops 1 (nesting depth added 122). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1173}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf561d87bc0053ce421b965e3ea0464b0a2ddbd43f6e98cd1de6dd4d333fa7c5"}},{"ruleId":"D2","level":"warning","message":{"text":"MatroskaExtractor.binaryElement (cognitive 116): MatroskaExtractor.binaryElement has cognitive complexity 116 (threshold 15). Drivers by points: if/else 57, loops 44, ternaries 11, boolean chains 3, match/switch 1 (nesting depth added 87). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":1150}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3ea0696d6afd7e0280a1f3760406cfdeb9a35a4daa3cdfcaf91c92e38bcc3a2"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.generateDefault8BitClutEntries (cognitive 112): DvbParser.generateDefault8BitClutEntries has cognitive complexity 112 (threshold 15). Drivers by points: ternaries 105, if/else 3, match/switch 3, loops 1 (nesting depth added 81). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"f0f5c948cecb457c26a7664ca15d740a13e06c3bba347eab5abd9d164cbcac6d"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsPlaylistParser.parseMultivariantPlaylist (cognitive 111): HlsPlaylistParser.parseMultivariantPlaylist has cognitive complexity 111 (threshold 15). Drivers by points: if/else 94, ternaries 9, boolean chains 3, loops 3, match/switch 2 (nesting depth added 70). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":332}}}],"partialFingerprints":{"codehealthFindingId/v1":"9de933b6b10ceafae9e0fe6556fbfc2ea61dd5fa626b2634ce87172bfa21f9fa"}},{"ruleId":"D2","level":"warning","message":{"text":"AtomParsers.parseStbl (cognitive 105): AtomParsers.parseStbl has cognitive complexity 105 (threshold 15). Drivers by points: if/else 58, loops 23, boolean chains 12, ternaries 12 (nesting depth added 46). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"b656eac5cb97aea2fb65dd83eb2254da2641c75750ef4644115ad7294223c30d"}},{"ruleId":"D2","level":"warning","message":{"text":"AtomParsers.parseAudioSampleEntry (cognitive 83): AtomParsers.parseAudioSampleEntry has cognitive complexity 83 (threshold 15). Drivers by points: if/else 67, boolean chains 8, ternaries 7, loops 1 (nesting depth added 28). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1503}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9a10733f2d8ac21d98ecc9d0ad36fab970d372afeb74127abb8cbaead24d119"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetricsListener.getErrorInfo (cognitive 76): MediaMetricsListener.getErrorInfo has cognitive complexity 76 (threshold 15). Drivers by points: if/else 58, boolean chains 14, ternaries 4 (nesting depth added 26). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":698}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f91b20773264f2485d0835f5a3ed7a3b087c7d1642a93c3448c0411a839f1b0"}},{"ruleId":"D2","level":"warning","message":{"text":"MatroskaExtractor.writeSampleData (cognitive 75): MatroskaExtractor.writeSampleData has cognitive complexity 75 (threshold 15). Drivers by points: if/else 59, loops 9, ternaries 5, boolean chains 2 (nesting depth added 45). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":1469}}}],"partialFingerprints":{"codehealthFindingId/v1":"bdbfd03ce5882f78aa83c9f6ab0bf3b33ef2de3fda0c5064c0cf1232e0e71b22"}},{"ruleId":"D2","level":"warning","message":{"text":"NalUnitUtil.skipShortTermReferencePictureSets (cognitive 70): NalUnitUtil.skipShortTermReferencePictureSets has cognitive complexity 70 (threshold 15). Drivers by points: if/else 30, loops 22, ternaries 11, boolean chains 7 (nesting depth added 42). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"4436c3472338829450e88ac7dfaa0fe3b3463a57fdba7233c1b544d86c07384f"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultAudioSink.handleBuffer (cognitive 68): DefaultAudioSink.handleBuffer has cognitive complexity 68 (threshold 15). Drivers by points: if/else 61, boolean chains 5, error handling 2 (nesting depth added 33). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8778ef346f5b4bb909653a4d08469ca0fbf06c33fdfc84f5b86859a6d9854e6"}},{"ruleId":"D2","level":"warning","message":{"text":"NalUnitUtil.parseSpsNalUnitPayload (cognitive 67): NalUnitUtil.parseSpsNalUnitPayload has cognitive complexity 67 (threshold 15). Drivers by points: if/else 35, ternaries 24, loops 6, boolean chains 2 (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0aea05a312940f1931d905d6d4f9ecb3648afadf8ef0d458ee213bc745a8af8"}},{"ruleId":"D2","level":"warning","message":{"text":"Track.initializeOutput (cognitive 64): Track.initializeOutput has cognitive complexity 64 (threshold 15). Drivers by points: if/else 45, ternaries 12, boolean chains 6, match/switch 1 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":2053}}}],"partialFingerprints":{"codehealthFindingId/v1":"360b56ed7f5edb797536505692f7850a5b4e63ea1fad3be5c3e64cb697574aef"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsSampleStreamWrapper.selectTracks (cognitive 61): HlsSampleStreamWrapper.selectTracks has cognitive complexity 61 (threshold 15). Drivers by points: if/else 42, loops 9, boolean chains 5, ternaries 5 (nesting depth added 32). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"d094d9e85654c88a83c1ede75800b499f6a0a32467b6fccec63b7e9bf4a3129d"}},{"ruleId":"D2","level":"warning","message":{"text":"MimeTypes.getMediaMimeType (cognitive 61): MimeTypes.getMediaMimeType has cognitive complexity 61 (threshold 15). Drivers by points: if/else 43, boolean chains 10, ternaries 8 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java"},"region":{"startLine":398}}}],"partialFingerprints":{"codehealthFindingId/v1":"8aef687e9a04a187c96ceee9484851b7ffe41ca6f57a8b567f84588d0690d0ce"}},{"ruleId":"D2","level":"warning","message":{"text":"Format.toLogString (cognitive 61): Format.toLogString has cognitive complexity 61 (threshold 15). Drivers by points: if/else 57, boolean chains 2, loops 2 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/Format.java"},"region":{"startLine":1143}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b8acae640e0aee649b8521c81797c5b81078658d84d9d4184fa4cd088488093"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerCommandQueue.processPendingCommandOnHandler (cognitive 60): PlayerCommandQueue.processPendingCommandOnHandler has cognitive complexity 60 (threshold 15). Drivers by points: if/else 35, error handling 12, loops 8, ternaries 3, boolean chains 2 (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerCommandQueue.java"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"979a4cfb975fb7daf46c229ad2ec1fcc882f61a42fa7be2db62e6f3162190c4d"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parseMediaPresentationDescription (cognitive 60): DashManifestParser.parseMediaPresentationDescription has cognitive complexity 60 (threshold 15). Drivers by points: if/else 35, ternaries 23, boolean chains 1, loops 1 (nesting depth added 34). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"16ea931c22732454ba7d75cb9f23c272734713904f6d10db9154335cdf94bc27"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerControlView.updateTimeline (cognitive 60): StyledPlayerControlView.updateTimeline has cognitive complexity 60 (threshold 15). Drivers by points: if/else 38, ternaries 12, loops 9, boolean chains 1 (nesting depth added 39). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1185}}}],"partialFingerprints":{"codehealthFindingId/v1":"a585b878201fbf80883b4353a1ef7d10ef7cc8d7e7f71d1911cd60c2a09abd2e"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.doSomeWork (cognitive 60): ExoPlayerImplInternal.doSomeWork has cognitive complexity 60 (threshold 15). Drivers by points: if/else 34, boolean chains 18, loops 4, ternaries 4 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1009}}}],"partialFingerprints":{"codehealthFindingId/v1":"24e05ef9bb564e730debfc83e2bc1c7d5e9f8397a79128103ce2f1784b780c92"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultMediaMetadataProvider.getMetadata (cognitive 59): DefaultMediaMetadataProvider.getMetadata has cognitive complexity 59 (threshold 15). Drivers by points: if/else 49, loops 7, boolean chains 2, ternaries 1 (nesting depth added 36). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":1045}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab898932fca97c10cecf828616e00ddf6d0c4a351c54a2bc14ca5a54e02e1918"}},{"ruleId":"D2","level":"warning","message":{"text":"H262Reader.consume (cognitive 58): H262Reader.consume has cognitive complexity 58 (threshold 15). Drivers by points: if/else 37, ternaries 16, boolean chains 4, loops 1 (nesting depth added 34). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"c171e42d926103806a354e6ec64b52f4f832c2e744d7f7b30584c4c7b025b57e"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerControlView.updateTimeline (cognitive 55): PlayerControlView.updateTimeline has cognitive complexity 55 (threshold 15). Drivers by points: if/else 34, ternaries 11, loops 9, boolean chains 1 (nesting depth added 37). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":947}}}],"partialFingerprints":{"codehealthFindingId/v1":"9690483c1998a0bf8e91669888bac08dd1ca160c92d2a24582650b6b9d57da97"}},{"ruleId":"D2","level":"warning","message":{"text":"Id3Decoder.decodeFrame (cognitive 54): Id3Decoder.decodeFrame has cognitive complexity 54 (threshold 15). Drivers by points: if/else 27, boolean chains 17, ternaries 10 (nesting depth added 8). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac0c76bd1560cb90943251bb70d9a40d82615d150614500d619b7a95fd2f9bb9"}},{"ruleId":"D2","level":"warning","message":{"text":"WebvttCueParser.parseCueText (cognitive 53): WebvttCueParser.parseCueText has cognitive complexity 53 (threshold 15). Drivers by points: if/else 32, ternaries 13, loops 6, match/switch 2 (nesting depth added 34). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"828b289aa0f5e191c6e24c7eb84125a5fc55022f08227737b01e733e6ed02517"}},{"ruleId":"D2","level":"warning","message":{"text":"NalUnitUtil.parseH265SpsNalUnitPayload (cognitive 53): NalUnitUtil.parseH265SpsNalUnitPayload has cognitive complexity 53 (threshold 15). Drivers by points: if/else 35, ternaries 9, loops 6, boolean chains 3 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":543}}}],"partialFingerprints":{"codehealthFindingId/v1":"fec86cfc22b04aaff43ca0f322746c2ac363e70114cedcb9525c61f3d6154e22"}},{"ruleId":"D2","level":"warning","message":{"text":"TextRenderer.render (cognitive 52): TextRenderer.render has cognitive complexity 52 (threshold 15). Drivers by points: if/else 44, error handling 3, loops 3, boolean chains 2 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/text/TextRenderer.java"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"831da4f73f1f72a16a1554919834ba8fb047770fb4852b3380f641468d4b2f7e"}},{"ruleId":"D2","level":"warning","message":{"text":"PlaybackStatsTracker.resolveNewPlaybackState (cognitive 52): PlaybackStatsTracker.resolveNewPlaybackState has cognitive complexity 52 (threshold 15). Drivers by points: if/else 30, ternaries 19, boolean chains 3 (nesting depth added 35). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":697}}}],"partialFingerprints":{"codehealthFindingId/v1":"38d59f18a4c77f3a801c72a6aa8048c999efe3749a4317afeca18fc518d12181"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.feedInputBuffer (cognitive 51): MediaCodecRenderer.feedInputBuffer has cognitive complexity 51 (threshold 15). Drivers by points: if/else 40, boolean chains 5, error handling 4, loops 2 (nesting depth added 11). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1221}}}],"partialFingerprints":{"codehealthFindingId/v1":"764fa11a586acced103674fe88db87ade1cae6048335abc0ddf81e5ed03bb65c"}},{"ruleId":"D2","level":"warning","message":{"text":"NotificationBroadcastReceiver.onReceive (cognitive 50): NotificationBroadcastReceiver.onReceive has cognitive complexity 50 (threshold 15). Drivers by points: if/else 48, boolean chains 2 (nesting depth added 32). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java"},"region":{"startLine":1536}}}],"partialFingerprints":{"codehealthFindingId/v1":"713a977d016f3a8f1f0fca211a8dc30185ed497ccc186819b875b207435d93bb"}},{"ruleId":"D2","level":"warning","message":{"text":"FragmentedMp4Extractor.readSample (cognitive 47): FragmentedMp4Extractor.readSample has cognitive complexity 47 (threshold 15). Drivers by points: if/else 37, ternaries 5, loops 4, boolean chains 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":1351}}}],"partialFingerprints":{"codehealthFindingId/v1":"7631dbddda0dc651d19c82e25091deb1df89d303858e65f63dc0793dcf6282e0"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionCallback.buildAllowedCommands (cognitive 45): SessionCallback.buildAllowedCommands has cognitive complexity 45 (threshold 15). Drivers by points: if/else 40, boolean chains 4, ternaries 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionCallback.java"},"region":{"startLine":220}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b20250d6a30154805c982e4ed7d288f39329783ffc3eb3821e95c2aaa0b7b18"}},{"ruleId":"D2","level":"warning","message":{"text":"SegmentDownloader.download (cognitive 45): SegmentDownloader.download has cognitive complexity 45 (threshold 15). Drivers by points: if/else 32, loops 6, error handling 4, boolean chains 2, ternaries 1 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1290d6a236e8429799e58bdc09da6d889f8d6674af6f3ca788012c826544934"}},{"ruleId":"D2","level":"warning","message":{"text":"WebvttCssParser.parseStyleDeclaration (cognitive 45): WebvttCssParser.parseStyleDeclaration has cognitive complexity 45 (threshold 15). Drivers by points: if/else 43, boolean chains 2 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssParser.java"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2bb378beaa99f7e8d2c1291261a2372f8fbeb078eee0beeaf5c1e5e3de9295d"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultTrackSelector.selectTracksForType (cognitive 45): DefaultTrackSelector.selectTracksForType has cognitive complexity 45 (threshold 15). Drivers by points: if/else 29, loops 15, boolean chains 1 (nesting depth added 32). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":2749}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a07eb066b78ea86e488669f7aa7574ba0650fa18bcc856058ff5198ead685b"}},{"ruleId":"D2","level":"warning","message":{"text":"SpannedToHtmlConverter.getOpeningTag (cognitive 45): SpannedToHtmlConverter.getOpeningTag has cognitive complexity 45 (threshold 15). Drivers by points: match/switch 19, ternaries 14, if/else 12 (nesting depth added 29). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/SpannedToHtmlConverter.java"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f53b818c8dab339a575ad2d7d731956ed9cebe7d809877c9644e2e4fd60743f"}},{"ruleId":"D2","level":"warning","message":{"text":"SampleReader.appendToNalUnit (cognitive 45): SampleReader.appendToNalUnit has cognitive complexity 45 (threshold 15). Drivers by points: if/else 42, boolean chains 3 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java"},"region":{"startLine":353}}}],"partialFingerprints":{"codehealthFindingId/v1":"10265d213efd517760a8be8363ba0412fb460fe9b94ac1aabbd9c4925d7f6921"}},{"ruleId":"D2","level":"warning","message":{"text":"WebViewSubtitleOutput.updateWebView (cognitive 44): WebViewSubtitleOutput.updateWebView has cognitive complexity 44 (threshold 15). Drivers by points: ternaries 19, if/else 14, match/switch 5, loops 4, boolean chains 2 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/WebViewSubtitleOutput.java"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"77805433f3207c6c361404d5897853ccebaf846956b0747f0dd01d724f0d3331"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecVideoRenderer.processOutputBuffer (cognitive 44): MediaCodecVideoRenderer.processOutputBuffer has cognitive complexity 44 (threshold 15). Drivers by points: if/else 37, error handling 4, boolean chains 3 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":1121}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cfd0eb66c2ff03fdca0d7668bbd8de98cabfcd24bca7351b74ab63e9d73031f"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecInfo.canReuseCodec (cognitive 43): MediaCodecInfo.canReuseCodec has cognitive complexity 43 (threshold 15). Drivers by points: if/else 34, boolean chains 6, ternaries 3 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f45bcf519602527b1a0e2bf91037bf85e7de0cab425ec3226c037495ca1f5c2"}},{"ruleId":"D2","level":"warning","message":{"text":"Sniffer.sniffInternal (cognitive 43): Sniffer.sniffInternal has cognitive complexity 43 (threshold 15). Drivers by points: if/else 34, boolean chains 4, loops 4, ternaries 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Sniffer.java"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd86bab8c6bf7f70bedf3037750ea38557538fd509d2372e1f36e2642983737d"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.handleMessage (cognitive 43): ExoPlayerImplInternal.handleMessage has cognitive complexity 43 (threshold 15). Drivers by points: if/else 21, error handling 7, ternaries 7, loops 4, boolean chains 3, match/switch 1 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"bceefca43a18e3153c4593d8c2d9b47a207324b74fa06b7a5e9bc04b7f3dc648"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsMediaPeriod.buildAndPrepareMainSampleStreamWrapper (cognitive 42): HlsMediaPeriod.buildAndPrepareMainSampleStreamWrapper has cognitive complexity 42 (threshold 15). Drivers by points: if/else 18, loops 12, boolean chains 11, ternaries 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"78332651937f31f0ec6df83bd7d7a8543f8c54d8a393da01c55a26f3802eaa0d"}},{"ruleId":"D2","level":"warning","message":{"text":"Cea708Decoder.handleC1Command (cognitive 42): Cea708Decoder.handleC1Command has cognitive complexity 42 (threshold 15). Drivers by points: if/else 31, loops 10, match/switch 1 (nesting depth added 21). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf95ca6f56e336df8a44ea8bbb1f57fe0098299419ac0edeb1cc6f014a810ed5"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlDecoder.decode (cognitive 42): TtmlDecoder.decode has cognitive complexity 42 (threshold 15). Drivers by points: if/else 33, error handling 8, loops 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ee9674df6136e85e35dcd9281539edae4ee0b091cec7c2647763e56d053d9fc"}},{"ruleId":"D2","level":"warning","message":{"text":"ComponentListener.onClick (cognitive 42): ComponentListener.onClick has cognitive complexity 42 (threshold 15). Drivers by points: if/else 41, boolean chains 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1696}}}],"partialFingerprints":{"codehealthFindingId/v1":"da30a93ded731964878cc0731dadd39689eb73c1da779d5e791f1c150e3a6279"}},{"ruleId":"D2","level":"warning","message":{"text":"CacheDataSource.openNextSource (cognitive 42): CacheDataSource.openNextSource has cognitive complexity 42 (threshold 15). Drivers by points: if/else 31, error handling 5, boolean chains 3, ternaries 3 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"775c276ab519a52fe737d82b33ffbc1b80209528c234c1092465cb3dd196b915"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.drainOutputBuffer (cognitive 42): MediaCodecRenderer.drainOutputBuffer has cognitive complexity 42 (threshold 15). Drivers by points: if/else 31, boolean chains 6, error handling 5 (nesting depth added 18). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1855}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3dd517add24e5d6e30e7fbbfec2cd3e91a9546426e77889b991cae88567985f"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaUtil.handleAdPeriodRemovedFromTimeline (cognitive 41): ImaUtil.handleAdPeriodRemovedFromTimeline has cognitive complexity 41 (threshold 15). Drivers by points: if/else 36, boolean chains 3, loops 2 (nesting depth added 27). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"88d3c83aad310cb3d112667498032e7c62281bbbcdab6e90596e410e1b985d08"}},{"ruleId":"D2","level":"warning","message":{"text":"RtpVp9Reader.validateVp9Descriptor (cognitive 41): RtpVp9Reader.validateVp9Descriptor has cognitive complexity 41 (threshold 15). Drivers by points: if/else 34, loops 6, boolean chains 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp9Reader.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba8ad29555e006d4c8b09e5222a5febc1743c06cff775ab607fc95bff5b7e166"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlDecoder.parseRegionAttributes (cognitive 41): TtmlDecoder.parseRegionAttributes has cognitive complexity 41 (threshold 15). Drivers by points: if/else 23, error handling 14, match/switch 4 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"536ecd8b7ee7f02c3532be6ad79d824d0babfc038d752f399f922499632471bf"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parseAdaptationSet (cognitive 40): DashManifestParser.parseAdaptationSet has cognitive complexity 40 (threshold 15). Drivers by points: if/else 27, ternaries 11, loops 2 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":391}}}],"partialFingerprints":{"codehealthFindingId/v1":"cada20f5057de22552b20e69641ccd65d25b668d305adc57e2ad94948241cb0b"}},{"ruleId":"D2","level":"warning","message":{"text":"Cea608Decoder.decode (cognitive 40): Cea608Decoder.decode has cognitive complexity 40 (threshold 15). Drivers by points: if/else 34, boolean chains 3, ternaries 2, loops 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e4b2b267adcdad634e824c94f8a672d15644dbdece4356022a9d898a1cb0248"}},{"ruleId":"D2","level":"warning","message":{"text":"SubtitlePainter.setupTextLayout (cognitive 40): SubtitlePainter.setupTextLayout has cognitive complexity 40 (threshold 15). Drivers by points: if/else 24, ternaries 9, loops 3, boolean chains 2, match/switch 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitlePainter.java"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"74199a73a851357431e03b2da6c6ac4e14e90158d2721d1370d17043e8ee7bb2"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleBasePlayer.updateStateAndInformListeners (cognitive 40): SimpleBasePlayer.updateStateAndInformListeners has cognitive complexity 40 (threshold 15). Drivers by points: if/else 33, boolean chains 5, ternaries 2 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":3287}}}],"partialFingerprints":{"codehealthFindingId/v1":"42d2bd2542e8b864881d6712c648c01c3b3ab834e07b97acf6929380e677428f"}},{"ruleId":"D2","level":"warning","message":{"text":"CronetDataSource.open (cognitive 39): CronetDataSource.open has cognitive complexity 39 (threshold 15). Drivers by points: if/else 21, ternaries 10, boolean chains 4, error handling 4 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"2825170736b9de79a50f07a229655505d2fba49a8187d610772e51b1e36a2b52"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsMediaPeriod.getStreamKeys (cognitive 39): HlsMediaPeriod.getStreamKeys has cognitive complexity 39 (threshold 15). Drivers by points: if/else 17, loops 15, ternaries 6, boolean chains 1 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b3b1780d16b5afa1345d909193dfcd09d8c5a7ca26797b396b074b9d16433b0"}},{"ruleId":"D2","level":"warning","message":{"text":"ElementParser.parse (cognitive 39): ElementParser.parse has cognitive complexity 39 (threshold 15). Drivers by points: if/else 35, match/switch 2, boolean chains 1, loops 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"2da38736b52187a32f145c0e0dfe321a8558c7789ecdfccd66a44cac30b74660"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.resolvePositionForPlaylistChange (cognitive 39): ExoPlayerImplInternal.resolvePositionForPlaylistChange has cognitive complexity 39 (threshold 15). Drivers by points: if/else 29, boolean chains 5, ternaries 5 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":2655}}}],"partialFingerprints":{"codehealthFindingId/v1":"35474b6d9082b63ad46deadaefdec3a0e27ff0812cc119a9b098ba6ee1599488"}},{"ruleId":"D2","level":"warning","message":{"text":"AdTagLoader.handleTimelineOrPositionChanged (cognitive 38): AdTagLoader.handleTimelineOrPositionChanged has cognitive complexity 38 (threshold 15). Drivers by points: if/else 26, boolean chains 7, loops 4, ternaries 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":867}}}],"partialFingerprints":{"codehealthFindingId/v1":"82b7cce3b4a274c8e4ffb95c8e97df9611d9873f82033e0ff76aa7d33fa1f788"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsMediaPeriod.selectTracks (cognitive 38): HlsMediaPeriod.selectTracks has cognitive complexity 38 (threshold 15). Drivers by points: if/else 20, loops 9, ternaries 8, boolean chains 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java"},"region":{"startLine":291}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a7ebb1974508381d45a5f9a5df4ff05638e0a3da97980d4959b4b2c9113e55"}},{"ruleId":"D2","level":"warning","message":{"text":"SessionDescriptionParser.parse (cognitive 38): SessionDescriptionParser.parse has cognitive complexity 38 (threshold 15). Drivers by points: if/else 34, match/switch 2, error handling 1, loops 1 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/SessionDescriptionParser.java"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"d952c88cc69ff398979841f9205451ef718fb4eed755f99edd89a4ed1b6346a8"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecVideoRenderer.getCodecMaxSize (cognitive 38): MediaCodecVideoRenderer.getCodecMaxSize has cognitive complexity 38 (threshold 15). Drivers by points: ternaries 20, if/else 12, error handling 4, boolean chains 1, loops 1 (nesting depth added 24). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":2391}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ceb2162c660187b46619f5652d28f460af9931fb4602b0b17fe45fe3bbd31da"}},{"ruleId":"D2","level":"warning","message":{"text":"MatroskaExtractor.endMasterElement (cognitive 38): MatroskaExtractor.endMasterElement has cognitive complexity 38 (threshold 15). Drivers by points: if/else 29, boolean chains 4, loops 4, match/switch 1 (nesting depth added 17). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":726}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8df32f0a1778790d6029a66d40c541724827efa5ef6a28ef184c8e7a660ce04"}},{"ruleId":"D2","level":"warning","message":{"text":"TransformerInternal.endInternal (cognitive 38): TransformerInternal.endInternal has cognitive complexity 38 (threshold 15). Drivers by points: if/else 23, error handling 10, loops 5 (nesting depth added 20). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6078e6ced87f1f7f1262e4be8f0ab53ce349235c30d67a55de0c44609724676"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultAudioSink.writeBuffer (cognitive 37): DefaultAudioSink.writeBuffer has cognitive complexity 37 (threshold 15). Drivers by points: if/else 34, boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":1097}}}],"partialFingerprints":{"codehealthFindingId/v1":"c91df290e78d572d403f23e23aa9759658a02e6c7434c001bfe5c8d67844fdcb"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsChunkSource.getNextMediaSequenceAndPartIndex (cognitive 37): HlsChunkSource.getNextMediaSequenceAndPartIndex has cognitive complexity 37 (threshold 15). Drivers by points: ternaries 16, if/else 14, boolean chains 4, loops 3 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java"},"region":{"startLine":799}}}],"partialFingerprints":{"codehealthFindingId/v1":"045c44996bdb6aa518704b60bec9d81cf687a6de1daef7b83a206cf6eb944d5c"}},{"ruleId":"D2","level":"warning","message":{"text":"Cea708Decoder.processCurrentPacket (cognitive 37): Cea708Decoder.processCurrentPacket has cognitive complexity 37 (threshold 15). Drivers by points: if/else 34, loops 3 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"61e92e158f2836cfceeae55fd3e6d6cc419096576df323408bb6204303d55fe2"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlStyle.inherit (cognitive 37): TtmlStyle.inherit has cognitive complexity 37 (threshold 15). Drivers by points: if/else 31, boolean chains 6 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"868faeb539cd12119222d1ca64d3f313d5c7ec0db923d3d26e30abca90cba0c8"}},{"ruleId":"D2","level":"warning","message":{"text":"RawResourceDataSource.open (cognitive 37): RawResourceDataSource.open has cognitive complexity 37 (threshold 15). Drivers by points: if/else 23, ternaries 6, error handling 5, boolean chains 3 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java"},"region":{"startLine":122}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e8f153a4b92c07282f81081d9e9f09ff25c4ca049bd1a29900619cbce481901"}},{"ruleId":"D2","level":"warning","message":{"text":"PesReader.consume (cognitive 37): PesReader.consume has cognitive complexity 37 (threshold 15). Drivers by points: if/else 20, ternaries 11, match/switch 4, boolean chains 1, loops 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PesReader.java"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"01e3e4269f15c12f18ecbc27637d95af1599c7a7f2a9357b622a4be95a8a5890"}},{"ruleId":"D2","level":"warning","message":{"text":"PmtReader.consume (cognitive 37): PmtReader.consume has cognitive complexity 37 (threshold 15). Drivers by points: if/else 24, ternaries 6, boolean chains 5, loops 2 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java"},"region":{"startLine":587}}}],"partialFingerprints":{"codehealthFindingId/v1":"a82d49594c7a9e097bdc026cdff6701719a7aceddae3a5cd2e215a4b31f591f4"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultDashChunkSource.getNextChunk (cognitive 36): DefaultDashChunkSource.getNextChunk has cognitive complexity 36 (threshold 15). Drivers by points: if/else 22, boolean chains 8, loops 3, ternaries 3 (nesting depth added 7). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":323}}}],"partialFingerprints":{"codehealthFindingId/v1":"f92cdc1ccc855b3af44deed3b128ddbb16a3eac21414b997a0d767ce33da2f6a"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.onInputFormatChanged (cognitive 36): MediaCodecRenderer.onInputFormatChanged has cognitive complexity 36 (threshold 15). Drivers by points: if/else 28, boolean chains 7, match/switch 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1487}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f3f6adfb13fd27502416912f8fbeb5c61e9734d266e5459eae521fd45e31d7b"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp3Extractor.synchronize (cognitive 36): Mp3Extractor.synchronize has cognitive complexity 36 (threshold 15). Drivers by points: if/else 30, ternaries 3, boolean chains 2, loops 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3a8fde6401ff7a6c819f44abfa383285eb1a8b0a1738bf1084d0381a2e4b0a8"}},{"ruleId":"D2","level":"warning","message":{"text":"FragmentedMp4Extractor.readAtomHeader (cognitive 36): FragmentedMp4Extractor.readAtomHeader has cognitive complexity 36 (threshold 15). Drivers by points: if/else 32, boolean chains 2, loops 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a86639bb8cf135ccc5f3b75b0b5d1b6a03eb9bb42ea4fd81fb544f51ea0901a"}},{"ruleId":"D2","level":"warning","message":{"text":"MessageListener.handleRtspResponse (cognitive 35): MessageListener.handleRtspResponse has cognitive complexity 35 (threshold 15). Drivers by points: if/else 18, ternaries 6, boolean chains 3, error handling 3, loops 3, match/switch 2 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspClient.java"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"286b52c72431ab80b526c1197a43d39d58cccd7d3484704ae05542070edd9e39"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlRenderUtil.applyStylesToSpan (cognitive 35): TtmlRenderUtil.applyStylesToSpan has cognitive complexity 35 (threshold 15). Drivers by points: if/else 23, ternaries 8, boolean chains 2, match/switch 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6b8910433fc9fc34a864ddf583e054b27106f0e78ca5f8ba503b511d2b6f89a"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultHttpDataSource.open (cognitive 35): DefaultHttpDataSource.open has cognitive complexity 35 (threshold 15). Drivers by points: if/else 15, ternaries 12, error handling 5, boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java"},"region":{"startLine":373}}}],"partialFingerprints":{"codehealthFindingId/v1":"89c28d001005110b11c1a9193a836f63fcc9a0cfa7345853cbb9d64dfc3ce2ad"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetricsListener.resolveNewPlaybackState (cognitive 35): MediaMetricsListener.resolveNewPlaybackState has cognitive complexity 35 (threshold 15). Drivers by points: if/else 22, ternaries 11, boolean chains 2 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":451}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc6525f79f9b33579a7bba7f698f9b9e6bb0f4670815c75d43065d0c2bce62a2"}},{"ruleId":"D2","level":"warning","message":{"text":"SectionReader.consume (cognitive 35): SectionReader.consume has cognitive complexity 35 (threshold 15). Drivers by points: if/else 34, loops 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/SectionReader.java"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"702e3bdc1c161d886f82763b13e08f98f15a16ea893f5fdd272ab9047e6a52a7"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsSampleStreamWrapper.buildTracksFromSampleStreams (cognitive 34): HlsSampleStreamWrapper.buildTracksFromSampleStreams has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15, ternaries 10, loops 6, boolean chains 3 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":1372}}}],"partialFingerprints":{"codehealthFindingId/v1":"374ec47cc83b54629101fa8bfaa295b07415138c305e64a43a6e7660b80bbd45"}},{"ruleId":"D2","level":"warning","message":{"text":"Builder.populate (cognitive 34): Builder.populate has cognitive complexity 34 (threshold 15). Drivers by points: if/else 34. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"de5e81b9e0fa80d66cb696de015c6cc5ea1abb8bcf446f0f6b6d8c3c8a0f4f4e"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parseRepresentation (cognitive 33): DashManifestParser.parseRepresentation has cognitive complexity 33 (threshold 15). Drivers by points: if/else 30, ternaries 2, loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"39c5106b3796b1f8a5a8adc4fb5b575a1802910a6ed6b20b7703e21ea7d37dff"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecVideoRenderer.setOutput (cognitive 33): MediaCodecVideoRenderer.setOutput has cognitive complexity 33 (threshold 15). Drivers by points: if/else 27, boolean chains 5, ternaries 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":711}}}],"partialFingerprints":{"codehealthFindingId/v1":"5317937c63c14a23c0a364b40b1a7ef0600c95ca057fb1df501fd67f9b6b6ac4"}},{"ruleId":"D2","level":"warning","message":{"text":"H263Reader.consume (cognitive 33): H263Reader.consume has cognitive complexity 33 (threshold 15). Drivers by points: if/else 28, ternaries 3, boolean chains 1, loops 1 (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"c966ca1e0b55c180f67dd2612fb8f02ab172401d0c1bfb08a6b124cfc681aac9"}},{"ruleId":"D2","level":"warning","message":{"text":"PmtReader.readEsInfo (cognitive 33): PmtReader.readEsInfo has cognitive complexity 33 (threshold 15). Drivers by points: if/else 23, loops 10 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java"},"region":{"startLine":719}}}],"partialFingerprints":{"codehealthFindingId/v1":"24875d076a3a890afcc08f2a09fe7dc99238a4ba6cc8335f0cdde58653e0fb49"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetadata.toBundle (cognitive 33): MediaMetadata.toBundle has cognitive complexity 33 (threshold 15). Drivers by points: if/else 33. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8d12287657ee47625e9b6daa8a4bb80dbeaf8a598541d9e64065cf058a3cef8"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.maybeUpdateReadingPeriod (cognitive 33): ExoPlayerImplInternal.maybeUpdateReadingPeriod has cognitive complexity 33 (threshold 15). Drivers by points: if/else 16, boolean chains 8, ternaries 5, loops 4 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":2091}}}],"partialFingerprints":{"codehealthFindingId/v1":"0812c70301121dc1c6cdb2e15c18cbce777ddfb00e094d4b9f88981e65a8e394"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaUtil.splitAdPlaybackStateForPeriods (cognitive 32): ImaUtil.splitAdPlaybackStateForPeriods has cognitive complexity 32 (threshold 15). Drivers by points: if/else 23, boolean chains 5, loops 4 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb98c0c3c2429b6312b2eafe6d93aa96e6a5140f19760052d6fa132dfe8600ba"}},{"ruleId":"D2","level":"warning","message":{"text":"Id3Decoder.validateFrames (cognitive 32): Id3Decoder.validateFrames has cognitive complexity 32 (threshold 15). Drivers by points: if/else 29, boolean chains 2, loops 1 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"0efeaaf3c84c56dd0eb70426ccbd62c60c0839bd0946b83e4621bedc32a842c9"}},{"ruleId":"D2","level":"warning","message":{"text":"UrlTemplate.parseTemplate (cognitive 32): UrlTemplate.parseTemplate has cognitive complexity 32 (threshold 15). Drivers by points: if/else 24, match/switch 6, boolean chains 1, loops 1 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/UrlTemplate.java"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef47f92d31a3e59d307cb7e1d5bb3262735eede1a0f59b223a2613b738baa850"}},{"ruleId":"D2","level":"warning","message":{"text":"RtspHeaders.convertToStandardHeaderName (cognitive 32): RtspHeaders.convertToStandardHeaderName has cognitive complexity 32 (threshold 15). Drivers by points: if/else 32. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspHeaders.java"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e9d2e519ab62deec182ac34f82cbcf30d58f68ec2e52a51e0429b7d88d0a9e8"}},{"ruleId":"D2","level":"warning","message":{"text":"ProgressiveMediaPeriod.selectTracks (cognitive 32): ProgressiveMediaPeriod.selectTracks has cognitive complexity 32 (threshold 15). Drivers by points: if/else 16, loops 11, boolean chains 4, ternaries 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"2032c2714e75b00d33394bd9ad1b1fc473f2da580dcb65e6a238affbf69d4a90"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerView.\u003Cinit\u003E (cognitive 32): StyledPlayerView.\u003Cinit\u003E has cognitive complexity 32 (threshold 15). Drivers by points: if/else 18, error handling 6, boolean chains 4, match/switch 2, ternaries 2 (nesting depth added 6). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"a67e0ac437c2aa3e65fbec329f4e48ac992403d842dcf923304a4e1a2752fa42"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecUtil.getDecoderInfosInternal (cognitive 32): MediaCodecUtil.getDecoderInfosInternal has cognitive complexity 32 (threshold 15). Drivers by points: if/else 17, boolean chains 11, error handling 3, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"e83a69f85389ddffa4288d5c9228c43b3b5e268aa1c6ef2429c633d07b085a71"}},{"ruleId":"D2","level":"warning","message":{"text":"MetadataUtil.parseIlstElement (cognitive 32): MetadataUtil.parseIlstElement has cognitive complexity 32 (threshold 15). Drivers by points: if/else 29, boolean chains 3 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtil.java"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"52f5304098b31dbdd79edd99ae13e35b076a057b261433fc4f8fe2a359ed4e2a"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultEncoderFactory.createForVideoEncoding (cognitive 32): DefaultEncoderFactory.createForVideoEncoding has cognitive complexity 32 (threshold 15). Drivers by points: if/else 26, boolean chains 4, ternaries 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultEncoderFactory.java"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"4ca52d73277d1f82ea9654224f4de5204ba4e5d23993cb52648ff37cd0080deb"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.decode (cognitive 31): DvbParser.decode has cognitive complexity 31 (threshold 15). Drivers by points: if/else 20, ternaries 5, loops 4, boolean chains 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"b05a042cc6c61eddfe3944fa05128abe45b69326a3b5cb90b27470da8101d2ee"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerView.\u003Cinit\u003E (cognitive 31): PlayerView.\u003Cinit\u003E has cognitive complexity 31 (threshold 15). Drivers by points: if/else 18, error handling 6, boolean chains 4, match/switch 2, ternaries 1 (nesting depth added 6). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb956291707cdedac32beb91b762963416eb0a80cac95f4f7e4106414436bada"}},{"ruleId":"D2","level":"warning","message":{"text":"VorbisUtil.readFloors (cognitive 31): VorbisUtil.readFloors has cognitive complexity 31 (threshold 15). Drivers by points: loops 21, if/else 8, match/switch 2 (nesting depth added 21). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"92e4644f479591516eb5b0ab444813f9007a77ab485b85fe5168ad11532e21d9"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration (cognitive 31): MediaPeriodAsserts.assertGetStreamKeysAndManifestFilterIntegration has cognitive complexity 31 (threshold 15). Drivers by points: loops 19, if/else 11, boolean chains 1 (nesting depth added 15). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/MediaPeriodAsserts.java"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3a36754effdde5d0e10f382c3edfb270adf243d168bfb2036854f262ae8d7ed"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultAudioSink.configure (cognitive 30): DefaultAudioSink.configure has cognitive complexity 30 (threshold 15). Drivers by points: if/else 19, ternaries 5, loops 3, error handling 2, boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":637}}}],"partialFingerprints":{"codehealthFindingId/v1":"08c9d987461fefb9ad6deafaa3381457727c821d6496f973afb92ae775ed6400"}},{"ruleId":"D2","level":"warning","message":{"text":"ConcatenatingMediaSource2.maybeCreateConcatenatedTimeline (cognitive 30): ConcatenatingMediaSource2.maybeCreateConcatenatedTimeline has cognitive complexity 30 (threshold 15). Drivers by points: if/else 17, loops 5, ternaries 5, boolean chains 3 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource2.java"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"22a8fa5ab6a62f1da42bda842016f7375463566f5564443eb15ba2b4d07ed68f"}},{"ruleId":"D2","level":"warning","message":{"text":"FileTypes.inferFileTypeFromUri (cognitive 30): FileTypes.inferFileTypeFromUri has cognitive complexity 30 (threshold 15). Drivers by points: if/else 19, boolean chains 11. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/FileTypes.java"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"954da941a6b2991d9a923899fa3ce76ac01439c61ea9a812c486ca1476057996"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp4Extractor.readSample (cognitive 30): Mp4Extractor.readSample has cognitive complexity 30 (threshold 15). Drivers by points: if/else 25, loops 4, boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fe74f40b26e3529536417548b1065c85f7571e7113d5484dbe6c2f076fedf28"}},{"ruleId":"D2","level":"warning","message":{"text":"PsExtractor.read (cognitive 30): PsExtractor.read has cognitive complexity 30 (threshold 15). Drivers by points: if/else 23, boolean chains 4, ternaries 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab60e6b5aa464fe994265a594ae8efadd5ddffb99470b2981183f2abe7ac0a3"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.resetInternal (cognitive 30): ExoPlayerImplInternal.resetInternal has cognitive complexity 30 (threshold 15). Drivers by points: if/else 14, error handling 6, ternaries 5, loops 3, boolean chains 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1441}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cae33fc258231f53e8aefd4bdbe52460d222d3d8d3fd7a109734688aaea515b"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.seekToInternal (cognitive 30): ExoPlayerImplInternal.seekToInternal has cognitive complexity 30 (threshold 15). Drivers by points: if/else 22, ternaries 5, boolean chains 3 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1180}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2295cb20c4358351db240641a86748afc43abd0699d5704baa9505b927139a3"}},{"ruleId":"D2","level":"warning","message":{"text":"Ac4Util.parseAc4SyncframeInfo (cognitive 29): Ac4Util.parseAc4SyncframeInfo has cognitive complexity 29 (threshold 15). Drivers by points: if/else 20, boolean chains 5, match/switch 3, ternaries 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/Ac4Util.java"},"region":{"startLine":135}}}],"partialFingerprints":{"codehealthFindingId/v1":"061deef8477639a467afeef290a002385378df6a292c3290e01e0b3ba016c6e1"}},{"ruleId":"D2","level":"warning","message":{"text":"MergingMediaPeriod.selectTracks (cognitive 29): MergingMediaPeriod.selectTracks has cognitive complexity 29 (threshold 15). Drivers by points: if/else 16, ternaries 7, loops 6 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb757999c5d110889fe00c16454f565d38cc293ada71cb4e456eb0c97e7ee16d"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerControlView.dispatchMediaKeyEvent (cognitive 29): StyledPlayerControlView.dispatchMediaKeyEvent has cognitive complexity 29 (threshold 15). Drivers by points: if/else 21, match/switch 5, boolean chains 3 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1470}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff43cce3d46ddeb13815a1ca8a477ab9ec0f287acf6b86f826839c772d71de6d"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.maybeInitCodecOrBypass (cognitive 29): MediaCodecRenderer.maybeInitCodecOrBypass has cognitive complexity 29 (threshold 15). Drivers by points: if/else 20, error handling 6, boolean chains 3 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":506}}}],"partialFingerprints":{"codehealthFindingId/v1":"993bbdb7b146ee72a9c34dd19d271116a08314d6baf615b99c8a80e987c4c39d"}},{"ruleId":"D2","level":"warning","message":{"text":"TsExtractor.read (cognitive 29): TsExtractor.read has cognitive complexity 29 (threshold 15). Drivers by points: if/else 21, boolean chains 4, ternaries 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsExtractor.java"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"c17a2e3c70cb689a53d24f5fcf2e719fdb8a66a383bc4f0952ca3dec15df21f2"}},{"ruleId":"D2","level":"warning","message":{"text":"TransformerActivity.createVideoEffectsFromBundle (cognitive 28): TransformerActivity.createVideoEffectsFromBundle has cognitive complexity 28 (threshold 15). Drivers by points: if/else 13, loops 9, error handling 3, match/switch 2, boolean chains 1 (nesting depth added 8). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"demos/transformer/src/main/java/com/google/android/exoplayer2/transformerdemo/TransformerActivity.java"},"region":{"startLine":433}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4afc9c6ba97799f3cb557755f264f863d9416bdcb23d77a7dc6abd1e7c96510"}},{"ruleId":"D2","level":"warning","message":{"text":"PlaybackStatsTracker.onEvents (cognitive 28): PlaybackStatsTracker.onEvents has cognitive complexity 28 (threshold 15). Drivers by points: if/else 22, boolean chains 4, ternaries 2 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b62742cd6994247a0e2c7784d47c5391e6839ccaa94b4abab0c00bec1291b3"}},{"ruleId":"D2","level":"warning","message":{"text":"MatroskaExtractor.integerElement (cognitive 28): MatroskaExtractor.integerElement has cognitive complexity 28 (threshold 15). Drivers by points: if/else 20, match/switch 7, boolean chains 1 (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":843}}}],"partialFingerprints":{"codehealthFindingId/v1":"74758f2b1ac1c68e3c0a4481cee27e9544d0b2fb332fdbdeb3337e65b0a4a268"}},{"ruleId":"D2","level":"warning","message":{"text":"LatmReader.parseStreamMuxConfig (cognitive 28): LatmReader.parseStreamMuxConfig has cognitive complexity 28 (threshold 15). Drivers by points: if/else 22, loops 4, boolean chains 1, ternaries 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9151e625337a93396ff38f1989a531f5807753cac8a5bb3334c9a43d5f0ddcc"}},{"ruleId":"D2","level":"warning","message":{"text":"State.\u003Cinit\u003E (cognitive 28): State.\u003Cinit\u003E has cognitive complexity 28 (threshold 15). Drivers by points: if/else 20, boolean chains 5, ternaries 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc540b1484b3a8763c470d1cf60b1cbb0b1f1c2e35da754db54b06798640b22"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parseContentProtection (cognitive 27): DashManifestParser.parseContentProtection has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15, loops 5, boolean chains 4, match/switch 2, ternaries 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"abdd1c94d94180c58183907da5e56de8903a9848b51e63c179078b716547a653"}},{"ruleId":"D2","level":"warning","message":{"text":"CueBuilder.buildCurrentLine (cognitive 27): CueBuilder.buildCurrentLine has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15, boolean chains 6, ternaries 5, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java"},"region":{"startLine":1054}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd0da8e644a11cd106df631d9dbedfb4f0b943d1ce95b52b0d2fdedf788833b6"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.parseSubtitlingSegment (cognitive 27): DvbParser.parseSubtitlingSegment has cognitive complexity 27 (threshold 15). Drivers by points: if/else 24, boolean chains 2, match/switch 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":268}}}],"partialFingerprints":{"codehealthFindingId/v1":"42e744f05f63d382cc51a0ab79a3618f69ae496b2fb1aa9c4768f0a6329ed20f"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlDecoder.parseStyleAttributes (cognitive 27): TtmlDecoder.parseStyleAttributes has cognitive complexity 27 (threshold 15). Drivers by points: match/switch 14, error handling 9, if/else 3, loops 1 (nesting depth added 17). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":497}}}],"partialFingerprints":{"codehealthFindingId/v1":"7122762231d079edf61112c85e22857fc7f03c2cbe4159a6c3f1daa992eb5c4f"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecUtil.isCodecUsableDecoder (cognitive 27): MediaCodecUtil.isCodecUsableDecoder has cognitive complexity 27 (threshold 15). Drivers by points: boolean chains 18, if/else 9. To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":532}}}],"partialFingerprints":{"codehealthFindingId/v1":"294da16639fb4cb21c5eafcefca432903b71c41a573ba6d0dcfa562f2fa433f3"}},{"ruleId":"D2","level":"warning","message":{"text":"MatroskaExtractor.commitSampleToOutput (cognitive 27): MatroskaExtractor.commitSampleToOutput has cognitive complexity 27 (threshold 15). Drivers by points: if/else 21, loops 5, boolean chains 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":1394}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c16be8e567bee3f03379854b9f76d90323a24abb86ce6beb3f9e6c49e2d818"}},{"ruleId":"D2","level":"warning","message":{"text":"VorbisUtil.skipBook (cognitive 27): VorbisUtil.skipBook has cognitive complexity 27 (threshold 15). Drivers by points: if/else 22, loops 4, boolean chains 1 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java"},"region":{"startLine":545}}}],"partialFingerprints":{"codehealthFindingId/v1":"31516520a18a507494a4520e0e3fcbc549c23edb38a9e9db8f34cdb938b1a466"}},{"ruleId":"D2","level":"warning","message":{"text":"WebServerDispatcher.dispatch (cognitive 27): WebServerDispatcher.dispatch has cognitive complexity 27 (threshold 15). Drivers by points: if/else 15, boolean chains 5, ternaries 5, match/switch 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/WebServerDispatcher.java"},"region":{"startLine":264}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2542e12f1f3a3967974cce97b46e0558ea6e0e7428ed6be4dbf33642422d9c1"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImpl.updatePlaybackInfo (cognitive 27): ExoPlayerImpl.updatePlaybackInfo has cognitive complexity 27 (threshold 15). Drivers by points: if/else 22, boolean chains 3, loops 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":1960}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0f5dd78cf158f9e4f15800381847a1ac6e0e459bdc78fd1883fe0b64faeacf5"}},{"ruleId":"D2","level":"warning","message":{"text":"AppInfoTableDecoder.parseAit (cognitive 26): AppInfoTableDecoder.parseAit has cognitive complexity 26 (threshold 15). Drivers by points: loops 14, if/else 10, boolean chains 1, ternaries 1 (nesting depth added 16). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/dvbsi/AppInfoTableDecoder.java"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"009d130f223b40c29776c5b7e82ac9fba9d677af9f2addd0ee5f69719a1a54f8"}},{"ruleId":"D2","level":"warning","message":{"text":"DashMediaPeriod.getGroupedAdaptationSetIndices (cognitive 26): DashMediaPeriod.getGroupedAdaptationSetIndices has cognitive complexity 26 (threshold 15). Drivers by points: if/else 19, loops 7 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"35cdca719a3e2b572041ec6df00b6d6ce3de15a6c26a5f6f70c6a7cb70f163a1"}},{"ruleId":"D2","level":"warning","message":{"text":"DashMediaSource.onManifestLoadCompleted (cognitive 26): DashMediaSource.onManifestLoadCompleted has cognitive complexity 26 (threshold 15). Drivers by points: if/else 20, ternaries 3, boolean chains 2, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":603}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd688cd67133e1a2abf823e73f6c776892a2774382263c2410519e226afc815a"}},{"ruleId":"D2","level":"warning","message":{"text":"MergingMediaPeriod.readDiscontinuity (cognitive 26): MergingMediaPeriod.readDiscontinuity has cognitive complexity 26 (threshold 15). Drivers by points: if/else 21, loops 5 (nesting depth added 17). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java"},"region":{"startLine":227}}}],"partialFingerprints":{"codehealthFindingId/v1":"41022d3a98c756fdb9022319dcbe071f4418ee9657dff6e4b75cd049710bc816"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerView.setPlayer (cognitive 26): StyledPlayerView.setPlayer has cognitive complexity 26 (threshold 15). Drivers by points: if/else 23, boolean chains 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java"},"region":{"startLine":559}}}],"partialFingerprints":{"codehealthFindingId/v1":"7640309a758ab6473569b82ddd7ec98e79ab6b3d2766ffa581de88d73d3f800a"}},{"ruleId":"D2","level":"warning","message":{"text":"ColorParser.parseColorInternal (cognitive 26): ColorParser.parseColorInternal has cognitive complexity 26 (threshold 15). Drivers by points: if/else 19, ternaries 7 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab5feade928ca0ea5e8a0b2a666773f41303b3dff53fcaae2de81b03f787004"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultEbmlReader.read (cognitive 26): DefaultEbmlReader.read has cognitive complexity 26 (threshold 15). Drivers by points: if/else 21, boolean chains 2, match/switch 2, loops 1 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/DefaultEbmlReader.java"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7233020d937e359f1faff8db2e0ef08d4acc3aad1e018359c192847234a9b5c"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.reselectTracksInternal (cognitive 26): ExoPlayerImplInternal.reselectTracksInternal has cognitive complexity 26 (threshold 15). Drivers by points: if/else 21, loops 3, boolean chains 2 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1740}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b7704a4d44100c0980d25a2b76d77f6ee03eefdaa3091fd37ed8843aeedf86b"}},{"ruleId":"D2","level":"warning","message":{"text":"AdTagLoader.handlePlayerStateChanged (cognitive 25): AdTagLoader.handlePlayerStateChanged has cognitive complexity 25 (threshold 15). Drivers by points: if/else 13, loops 7, boolean chains 5 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":833}}}],"partialFingerprints":{"codehealthFindingId/v1":"127b978be92c1bdb5616402512f05125a87fff8176ebf87b8d7be62c48c21194"}},{"ruleId":"D2","level":"warning","message":{"text":"OkHttpDataSource.open (cognitive 25): OkHttpDataSource.open has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 10, if/else 9, error handling 4, boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"90534dfe7e4a1e8d7d8569c0f90e0b867f63b6f2528fb837ade68f1838f705b0"}},{"ruleId":"D2","level":"warning","message":{"text":"DecoderAudioRenderer.render (cognitive 25): DecoderAudioRenderer.render has cognitive complexity 25 (threshold 15). Drivers by points: error handling 14, if/else 7, loops 4 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c4fc611618aa13557c526034ace859285c2fbb317eb7666a3f99b61fc220070"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.paintPixelDataSubBlock (cognitive 25): DvbParser.paintPixelDataSubBlock has cognitive complexity 25 (threshold 15). Drivers by points: ternaries 13, if/else 9, match/switch 2, loops 1 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":682}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1a9d54d89046722c98a1fc1d0c7061580a46dab360d156fed0153341fdc7a5a"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlNode.cleanUpText (cognitive 25): TtmlNode.cleanUpText has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12, loops 7, boolean chains 6 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"b038ddee89ccc5d6123a70fe8c5beaf6f012eb7277595b6a11d76d04042d674e"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetricsListener.reportTrackChangeEvent (cognitive 25): MediaMetricsListener.reportTrackChangeEvent has cognitive complexity 25 (threshold 15). Drivers by points: if/else 25 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":526}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9d6b1d5cc16e014bc506bac2e2a64205e38f523d975825a3a8799f5cb631a1c"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.maybeInitCodecWithFallback (cognitive 25): MediaCodecRenderer.maybeInitCodecWithFallback has cognitive complexity 25 (threshold 15). Drivers by points: if/else 18, error handling 6, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1003}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7f5246dfd8dfbaa1cc889b01cc31b0180fecd181d440ec3a3cee61cd6eb1fc"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.render (cognitive 25): MediaCodecRenderer.render has cognitive complexity 25 (threshold 15). Drivers by points: if/else 12, loops 8, boolean chains 4, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":793}}}],"partialFingerprints":{"codehealthFindingId/v1":"60343eb75e41d605d4d955a656f1d00f2df380fbc3ed81710e843f9fcd7461a8"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp4Extractor.getSeekPoints (cognitive 25): Mp4Extractor.getSeekPoints has cognitive complexity 25 (threshold 15). Drivers by points: if/else 20, boolean chains 2, loops 2, ternaries 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java"},"region":{"startLine":304}}}],"partialFingerprints":{"codehealthFindingId/v1":"42b90e45c66661e6eb9f10850356ffec2b06c069855e593942b19a6afd62181b"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp4Extractor.readAtomHeader (cognitive 25): Mp4Extractor.readAtomHeader has cognitive complexity 25 (threshold 15). Drivers by points: if/else 24, boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8012e621fa5020789e6d44940bedde8836750cbaf304d6d9ef7af3f98d73e8a"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImpl.maskTimelineAndPosition (cognitive 25): ExoPlayerImpl.maskTimelineAndPosition has cognitive complexity 25 (threshold 15). Drivers by points: if/else 11, ternaries 11, boolean chains 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":2415}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c9ffc0760f5a0d7695323e7ed908f9aeb3a50e66dee536aae67c21b3a99edf6"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.maybeTriggerPendingMessages (cognitive 25): ExoPlayerImplInternal.maybeTriggerPendingMessages has cognitive complexity 25 (threshold 15). Drivers by points: boolean chains 9, ternaries 8, if/else 5, loops 3 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1655}}}],"partialFingerprints":{"codehealthFindingId/v1":"7183e49119c78a10ed4bd8f4f18dbb93519deeae49e8b9f610bc440f48b61119"}},{"ruleId":"D2","level":"warning","message":{"text":"Task.run (cognitive 24): Task.run has cognitive complexity 24 (threshold 15). Drivers by points: if/else 17, error handling 5, loops 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java"},"region":{"startLine":1336}}}],"partialFingerprints":{"codehealthFindingId/v1":"1083f0ffa9ff202b434ba61ee0ab196a5f02b29cf754ed03d8dbbe0958cab396"}},{"ruleId":"D2","level":"warning","message":{"text":"DashMediaSource.updateLiveConfiguration (cognitive 24): DashMediaSource.updateLiveConfiguration has cognitive complexity 24 (threshold 15). Drivers by points: if/else 18, boolean chains 6. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":944}}}],"partialFingerprints":{"codehealthFindingId/v1":"437f1526c4503cc73e3572a7a11bab98671fd42587525e955c5d69ceb5312eef"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultMediaSourceFactory.createMediaSource (cognitive 24): DefaultMediaSourceFactory.createMediaSource has cognitive complexity 24 (threshold 15). Drivers by points: if/else 20, loops 2, boolean chains 1, ternaries 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fd7b42c59618f9959ab0bc795c20fdc8c9b688b7001d51fd30c4cb0ae23a2d6"}},{"ruleId":"D2","level":"warning","message":{"text":"SsaDecoder.createCue (cognitive 24): SsaDecoder.createCue has cognitive complexity 24 (threshold 15). Drivers by points: if/else 20, boolean chains 4 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDecoder.java"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"632f1b48556b67e2f916431326ab272eeac8abf29c4dead32583ccc6b2c0e3e4"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlNode.traverseForText (cognitive 24): TtmlNode.traverseForText has cognitive complexity 24 (threshold 15). Drivers by points: loops 12, if/else 8, boolean chains 3, ternaries 1 (nesting depth added 12). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlNode.java"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1b84394357956d1dc7625bc7731a19288c1d901378a5677126fd11ecc572a60"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerControlView.\u003Cinit\u003E (cognitive 24): StyledPlayerControlView.\u003Cinit\u003E has cognitive complexity 24 (threshold 15). Drivers by points: if/else 20, ternaries 4. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfa6910edb1117f514744fa658ebcb5aecf5ae7fdc48ed93602819dc775c2397"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleCache.loadDirectory (cognitive 24): SimpleCache.loadDirectory has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16, boolean chains 4, ternaries 3, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java"},"region":{"startLine":586}}}],"partialFingerprints":{"codehealthFindingId/v1":"18f0d1f73f0d5f32615851577c77bc48f1df9758bf9a5998ed99b45ba0f3fb0e"}},{"ruleId":"D2","level":"warning","message":{"text":"ContentDataSource.open (cognitive 24): ContentDataSource.open has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16, ternaries 5, error handling 2, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"04c32e3724ab4cefa38b7d421165f32115f16b6a947670fd8b4bb4ae44b99b16"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecVideoRenderer.supportsFormat (cognitive 24): MediaCodecVideoRenderer.supportsFormat has cognitive complexity 24 (threshold 15). Drivers by points: if/else 15, ternaries 4, boolean chains 3, loops 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18a04b1ed2dee4f4488149d98e0b2625296b25d0941de5d5b19b79076f401b0"}},{"ruleId":"D2","level":"warning","message":{"text":"AviExtractor.read (cognitive 24): AviExtractor.read has cognitive complexity 24 (threshold 15). Drivers by points: if/else 21, boolean chains 2, match/switch 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/avi/AviExtractor.java"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee99effed11cd1c4cb9a317fe68f9b4d632ddc09ac0e8a1a8b3b3182c3f6c739"}},{"ruleId":"D2","level":"warning","message":{"text":"AdtsReader.checkSyncPositionValid (cognitive 24): AdtsReader.checkSyncPositionValid has cognitive complexity 24 (threshold 15). Drivers by points: if/else 22, boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java"},"region":{"startLine":387}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa02e3df483707cd0e9e26860ea615e894ff28d30a304790b549dfd19f21b620"}},{"ruleId":"D2","level":"warning","message":{"text":"CeaUtil.consume (cognitive 24): CeaUtil.consume has cognitive complexity 24 (threshold 15). Drivers by points: if/else 19, boolean chains 4, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/CeaUtil.java"},"region":{"startLine":51}}}],"partialFingerprints":{"codehealthFindingId/v1":"590c7733315df82c7f5f945a569dfe7005e3de6a7b0292b8488cf250b6466c53"}},{"ruleId":"D2","level":"warning","message":{"text":"ComponentListener.onPositionDiscontinuity (cognitive 23): ComponentListener.onPositionDiscontinuity has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14, boolean chains 6, ternaries 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java"},"region":{"startLine":836}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9a6a17cd1871aaa6f4a087f0b9c359c44f49f91707190c5a759dee08777f1f3"}},{"ruleId":"D2","level":"warning","message":{"text":"ServerSideAdInsertionMediaSource.setAdPlaybackStates (cognitive 23): ServerSideAdInsertionMediaSource.setAdPlaybackStates has cognitive complexity 23 (threshold 15). Drivers by points: if/else 17, loops 5, boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSource.java"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9bf8cde738d1f397bf4ec7f6662ee694ab1a28b1bf05fa8a48d00ddd7a0bd91"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsSampleStreamWrapper.onLoadError (cognitive 23): HlsSampleStreamWrapper.onLoadError has cognitive complexity 23 (threshold 15). Drivers by points: if/else 17, boolean chains 4, ternaries 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":912}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e66ced006894c580c0a3da76ce8cc054161a40d9e1dd32cb7db4048d2601bc2"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtractingLoadable.load (cognitive 23): ExtractingLoadable.load has cognitive complexity 23 (threshold 15). Drivers by points: if/else 14, boolean chains 3, error handling 3, loops 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java"},"region":{"startLine":1007}}}],"partialFingerprints":{"codehealthFindingId/v1":"9bf9f234f1119ab856ae53807b21d43929c9f6dee7e4890771a6b7cdac29632d"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlDecoder.parseNode (cognitive 23): TtmlDecoder.parseNode has cognitive complexity 23 (threshold 15). Drivers by points: if/else 18, boolean chains 2, match/switch 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":644}}}],"partialFingerprints":{"codehealthFindingId/v1":"b24c673c669c69dbd0870c4eb7a85faae4b500c26db2a89a6a7104da2ba62598"}},{"ruleId":"D2","level":"warning","message":{"text":"CmcdHeadersFactory.createHttpRequestHeaders (cognitive 23): CmcdHeadersFactory.createHttpRequestHeaders has cognitive complexity 23 (threshold 15). Drivers by points: if/else 15, boolean chains 3, loops 3, ternaries 2 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java"},"region":{"startLine":196}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae6f961be87a32b82cc587938064c3f0d8bb58d73c39cbcb726ef5cb1da72fbc"}},{"ruleId":"D2","level":"warning","message":{"text":"Util.getCurrentDisplayModeSize (cognitive 23): Util.getCurrentDisplayModeSize has cognitive complexity 23 (threshold 15). Drivers by points: if/else 15, boolean chains 3, error handling 3, ternaries 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/Util.java"},"region":{"startLine":2590}}}],"partialFingerprints":{"codehealthFindingId/v1":"0bba5ba9b54309c9c82bc31344e161790f24f87cde2adb3ce1278fd86bbdb1e3"}},{"ruleId":"D2","level":"warning","message":{"text":"VorbisUtil.readResidues (cognitive 23): VorbisUtil.readResidues has cognitive complexity 23 (threshold 15). Drivers by points: if/else 12, loops 11 (nesting depth added 15). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"b68921ad4cf26879a7216e69305056730eb4b61c922f0cf111a4b45f800917a1"}},{"ruleId":"D2","level":"warning","message":{"text":"FakeRenderer.render (cognitive 23): FakeRenderer.render has cognitive complexity 23 (threshold 15). Drivers by points: if/else 22, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeRenderer.java"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"0124a23f8079d69d8df41fe1fef660020a777d4e5d5ab43a6d0934bafcf1274c"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioProcessingPipeline.processData (cognitive 22): AudioProcessingPipeline.processData has cognitive complexity 22 (threshold 15). Drivers by points: if/else 10, ternaries 7, loops 3, boolean chains 2 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/audio/AudioProcessingPipeline.java"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5adee689c86ffe22fa0c929bec60bc5d4a392c70e730112f9981c46ccb72f12"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadHelper.runTrackSelection (cognitive 22): DownloadHelper.runTrackSelection has cognitive complexity 22 (threshold 15). Drivers by points: loops 15, if/else 7 (nesting depth added 14). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java"},"region":{"startLine":764}}}],"partialFingerprints":{"codehealthFindingId/v1":"a18bf5562bd652d93b41ae0a6c31182983336222a42c5da80eead907b25e0edf"}},{"ruleId":"D2","level":"warning","message":{"text":"SharedMediaPeriod.selectTracks (cognitive 22): SharedMediaPeriod.selectTracks has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11, ternaries 6, loops 3, boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSource.java"},"region":{"startLine":808}}}],"partialFingerprints":{"codehealthFindingId/v1":"08794751adee6b1c5565c4d69a68388f0aba2b8bdffa46d30962576d4a56eda6"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parseSegmentList (cognitive 22): DashManifestParser.parseSegmentList has cognitive complexity 22 (threshold 15). Drivers by points: if/else 11, ternaries 10, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"262b3bbd012998541e7b1f6931c262f5310042e513aafe1f3a00b66e69f825c9"}},{"ruleId":"D2","level":"warning","message":{"text":"DashMediaPeriod.selectNewStreams (cognitive 22): DashMediaPeriod.selectNewStreams has cognitive complexity 22 (threshold 15). Drivers by points: if/else 19, loops 2, boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"c60c5a1a6f8fd385706b4453f90b81d4592cbfad3c9e69d708ed20ab3f3310a7"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsChunkSource.getNextChunk (cognitive 22): HlsChunkSource.getNextChunk has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13, ternaries 5, boolean chains 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java"},"region":{"startLine":384}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d74b0cafc9a9152701216ab39dd967e2eee4081d88287454816b6f90f5cc967"}},{"ruleId":"D2","level":"warning","message":{"text":"RtpH263Reader.consume (cognitive 22): RtpH263Reader.consume has cognitive complexity 22 (threshold 15). Drivers by points: if/else 18, boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH263Reader.java"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"aeedad3293cd985cf7d8bc41183f3b8eab2b97a6cfbb27c1d634977eb359abda"}},{"ruleId":"D2","level":"warning","message":{"text":"MaskingMediaSource.onChildSourceInfoRefreshed (cognitive 22): MaskingMediaSource.onChildSourceInfoRefreshed has cognitive complexity 22 (threshold 15). Drivers by points: if/else 16, ternaries 6 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaSource.java"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e98169180125c567e30002e2d78bda71669ae4648613144232a77dfe451a62"}},{"ruleId":"D2","level":"warning","message":{"text":"ProgressiveMediaPeriod.maybeFinishPrepare (cognitive 22): ProgressiveMediaPeriod.maybeFinishPrepare has cognitive complexity 22 (threshold 15). Drivers by points: if/else 16, boolean chains 4, loops 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java"},"region":{"startLine":753}}}],"partialFingerprints":{"codehealthFindingId/v1":"468075976336812ceabec019af1fc733d38426ebcd245e7846290db80f72983a"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.generateDefault4BitClutEntries (cognitive 22): DvbParser.generateDefault4BitClutEntries has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 18, if/else 3, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":566}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e7cbc1e946c65e81c465942b56b3a653c5ec5582c234c16374263218b72c18d"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.paint4BitPixelCodeString (cognitive 22): DvbParser.paint4BitPixelCodeString has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12, match/switch 5, ternaries 3, boolean chains 1, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"6b8d166d4698dc926e0da1578142531d2a105fb82dc5927a464483c6a4084705"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultTrackSelector.maybeConfigureRenderersForTunneling (cognitive 22): DefaultTrackSelector.maybeConfigureRenderersForTunneling has cognitive complexity 22 (threshold 15). Drivers by points: if/else 18, boolean chains 3, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":2933}}}],"partialFingerprints":{"codehealthFindingId/v1":"667468f2b3d918309b6d365ca2e3f08a4e2fd9bdb36adaa09dbbee4bf1eb7b04"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerView.setPlayer (cognitive 22): PlayerView.setPlayer has cognitive complexity 22 (threshold 15). Drivers by points: if/else 20, boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":571}}}],"partialFingerprints":{"codehealthFindingId/v1":"b6dfa81e1ddf38b54fc84253282b3a796815911ac2ddd3349029490df866b933"}},{"ruleId":"D2","level":"warning","message":{"text":"PlaybackStatsListener.onEvents (cognitive 22): PlaybackStatsListener.onEvents has cognitive complexity 22 (threshold 15). Drivers by points: ternaries 18, if/else 2, boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"b618fdb34fa5c2ddb458141810c0072119567a5f7ca85f23ac73539b21c39acf"}},{"ruleId":"D2","level":"warning","message":{"text":"FinalShaderProgramWrapper.ensureConfigured (cognitive 22): FinalShaderProgramWrapper.ensureConfigured has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12, boolean chains 6, ternaries 4 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/effect/src/main/java/com/google/android/exoplayer2/effect/FinalShaderProgramWrapper.java"},"region":{"startLine":396}}}],"partialFingerprints":{"codehealthFindingId/v1":"2fc73e7c61dd204ecba53d0670d7f6b70890478276f6af4845e3effb0b03c35c"}},{"ruleId":"D2","level":"warning","message":{"text":"FragmentedMp4Extractor.parseSampleGroups (cognitive 22): FragmentedMp4Extractor.parseSampleGroups has cognitive complexity 22 (threshold 15). Drivers by points: if/else 20, boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":1164}}}],"partialFingerprints":{"codehealthFindingId/v1":"2093f1430f3795bc27bb3e561603484bda7411c0162834dc13b9128946198d80"}},{"ruleId":"D2","level":"warning","message":{"text":"OggPacket.populate (cognitive 22): OggPacket.populate has cognitive complexity 22 (threshold 15). Drivers by points: if/else 17, boolean chains 2, ternaries 2, loops 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"64636dec69b53e229e62930c89b4dd497de70de80fe9c428e6eaf66e15fa197d"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImpl.handlePlaybackInfo (cognitive 22): ExoPlayerImpl.handlePlaybackInfo has cognitive complexity 22 (threshold 15). Drivers by points: if/else 12, ternaries 4, boolean chains 3, loops 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":1903}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3bc88e97c6e1b6f69e7194fe991aae71c9b38b44eafbc5e56c4fe013a017ef1"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.handleMediaSourceListInfoRefreshed (cognitive 22): ExoPlayerImplInternal.handleMediaSourceListInfoRefreshed has cognitive complexity 22 (threshold 15). Drivers by points: if/else 13, boolean chains 3, loops 3, ternaries 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1890}}}],"partialFingerprints":{"codehealthFindingId/v1":"75ac376048859666c19eccc0529f8bccd9d9fdec9e7c4373df0e5eaeb1713563"}},{"ruleId":"D2","level":"warning","message":{"text":"AdTagLoader.setupAdsRendering (cognitive 21): AdTagLoader.setupAdsRendering has cognitive complexity 21 (threshold 15). Drivers by points: if/else 16, loops 3, boolean chains 1, ternaries 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":600}}}],"partialFingerprints":{"codehealthFindingId/v1":"be1ef7af0ab9710f09a8b4001c1486f62ebd31a4f3c7a1d605a21ff85382df39"}},{"ruleId":"D2","level":"warning","message":{"text":"OpusDecoder.decode (cognitive 21): OpusDecoder.decode has cognitive complexity 21 (threshold 15). Drivers by points: if/else 17, ternaries 3, boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b4321eb6944b3db573d2bd37e1b25a79e70b8466e8b64a884cac9b80250d3f9"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecAudioRenderer.supportsFormat (cognitive 21): MediaCodecAudioRenderer.supportsFormat has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10, ternaries 5, boolean chains 4, loops 2 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"d39c132477a8bf07d3cddd03f50016637f21adefdff19d9076d370033e9e5ecf"}},{"ruleId":"D2","level":"warning","message":{"text":"FrameworkMediaDrm.getSchemeData (cognitive 21): FrameworkMediaDrm.getSchemeData has cognitive complexity 21 (threshold 15). Drivers by points: if/else 11, loops 6, boolean chains 4 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java"},"region":{"startLine":365}}}],"partialFingerprints":{"codehealthFindingId/v1":"edcdbfbb779b2318834c3d712004bb876673d745c00a8416e3be231ceeda6da8"}},{"ruleId":"D2","level":"warning","message":{"text":"DashMediaSource.processManifest (cognitive 21): DashMediaSource.processManifest has cognitive complexity 21 (threshold 15). Drivers by points: if/else 16, boolean chains 3, loops 1, ternaries 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":848}}}],"partialFingerprints":{"codehealthFindingId/v1":"c50f66a8fa923ae0b695ee1dbe56a7b8cede91669b0324ec4fe3e2d7c927b3f8"}},{"ruleId":"D2","level":"warning","message":{"text":"RtpVp8Reader.validateVp8Descriptor (cognitive 21): RtpVp8Reader.validateVp8Descriptor has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, boolean chains 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp8Reader.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8221cf81d28467daceffe6267aac7dc4548050fdb2996b9b933a63edb367670"}},{"ruleId":"D2","level":"warning","message":{"text":"Cea708Decoder.decode (cognitive 21): Cea708Decoder.decode has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, boolean chains 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfefc3e90c66af4387af96798ace0adc62d159d86d89d2aeebd81efdfb09c5e4"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadNotificationHelper.buildProgressNotification (cognitive 21): DownloadNotificationHelper.buildProgressNotification has cognitive complexity 21 (threshold 15). Drivers by points: if/else 16, boolean chains 2, match/switch 2, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ui/DownloadNotificationHelper.java"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac1e2585c0179371cbb3fa1146ce769cee917a259e047bf36ac62f92b32457c0"}},{"ruleId":"D2","level":"warning","message":{"text":"NalUnitUtil.findNalUnit (cognitive 21): NalUnitUtil.findNalUnit has cognitive complexity 21 (threshold 15). Drivers by points: boolean chains 8, if/else 8, ternaries 4, loops 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":751}}}],"partialFingerprints":{"codehealthFindingId/v1":"55799701dabb5fb239076d1666f8ce8602cda08793ce8516f581d29ec288e28d"}},{"ruleId":"D2","level":"warning","message":{"text":"PlaybackStats.merge (cognitive 21): PlaybackStats.merge has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, loops 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java"},"region":{"startLine":247}}}],"partialFingerprints":{"codehealthFindingId/v1":"87c3414c3a0888c4fd45d58d475341d24bf184dff50f0e74a85bd3285019ffab"}},{"ruleId":"D2","level":"warning","message":{"text":"MatrixUtils.clipConvexPolygonToNdcRange (cognitive 21): MatrixUtils.clipConvexPolygonToNdcRange has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, loops 3 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/effect/src/main/java/com/google/android/exoplayer2/effect/MatrixUtils.java"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6d330ed804df1de1032578161ad848749c91795e92e285d7513f0a335370416"}},{"ruleId":"D2","level":"warning","message":{"text":"FragmentedMp4Extractor.parseTrun (cognitive 21): FragmentedMp4Extractor.parseTrun has cognitive complexity 21 (threshold 15). Drivers by points: ternaries 9, if/else 7, boolean chains 4, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":1016}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba6a32c6cb72f8338edeefed1b391988832ba2585d88bccd7c533efba156b862"}},{"ruleId":"D2","level":"warning","message":{"text":"MetadataUtil.setFormatMetadata (cognitive 21): MetadataUtil.setFormatMetadata has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, loops 3 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/MetadataUtil.java"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4e55a82dc0db2e9b51651b7b2e4377a888e7f91a72e530fc453238d4dae0ef2"}},{"ruleId":"D2","level":"warning","message":{"text":"AdtsExtractor.calculateAverageFrameSize (cognitive 21): AdtsExtractor.calculateAverageFrameSize has cognitive complexity 21 (threshold 15). Drivers by points: if/else 19, error handling 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b59157d90aed27b2b6b83a0ddf6193069b487cfd9b67c6ce6944a7e0367a6d8"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetadata.fromBundle (cognitive 21): MediaMetadata.fromBundle has cognitive complexity 21 (threshold 15). Drivers by points: if/else 20, ternaries 1 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":1306}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f83b639bfba6852f3b18201fb1b8284114f2ac413786246312106e753e01ae3"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaPeriodQueue.getFollowingMediaPeriodInfoOfCurrentPeriod (cognitive 21): MediaPeriodQueue.getFollowingMediaPeriodInfoOfCurrentPeriod has cognitive complexity 21 (threshold 15). Drivers by points: if/else 18, boolean chains 3 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":804}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c6fb8fe2e2648f21c0ba9135bb45c60a0c2f85333d6cc4c5008880026bf4006"}},{"ruleId":"D2","level":"warning","message":{"text":"SampleListLoader.readEntry (cognitive 20): SampleListLoader.readEntry has cognitive complexity 20 (threshold 15). Drivers by points: loops 9, if/else 7, match/switch 2, ternaries 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"demos/main/src/main/java/com/google/android/exoplayer2/demo/SampleChooserActivity.java"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"0dd6794e544346e08e0898c4ce073a03a6baa99d1fc55f9169ed563720c57413"}},{"ruleId":"D2","level":"warning","message":{"text":"OpusDecoder.\u003Cinit\u003E (cognitive 20): OpusDecoder.\u003Cinit\u003E has cognitive complexity 20 (threshold 15). Drivers by points: if/else 14, boolean chains 4, ternaries 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/opus/src/main/java/com/google/android/exoplayer2/ext/opus/OpusDecoder.java"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef8dbdd9b0bc38d66b33b903842e0317ff55474ddddb147df9a7559a47df50e"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioCapabilities.getEncodingAndChannelConfigForPassthrough (cognitive 20): AudioCapabilities.getEncodingAndChannelConfigForPassthrough has cognitive complexity 20 (threshold 15). Drivers by points: if/else 13, boolean chains 5, ternaries 2 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/AudioCapabilities.java"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9cb58805181d8fe3570baf70a09c717e6a126e230b5fb6bea8f64e1bdd920e9"}},{"ruleId":"D2","level":"warning","message":{"text":"AudioTimestampPoller.maybePollTimestamp (cognitive 20): AudioTimestampPoller.maybePollTimestamp has cognitive complexity 20 (threshold 15). Drivers by points: if/else 18, boolean chains 1, match/switch 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTimestampPoller.java"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"abb9e6442c64338541cca87fdfac1f3d57d337ae108536537e74544ada2ed40e"}},{"ruleId":"D2","level":"warning","message":{"text":"MpegAudioUtil.getFrameSize (cognitive 20): MpegAudioUtil.getFrameSize has cognitive complexity 20 (threshold 15). Drivers by points: if/else 12, ternaries 7, boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"73ed08dbb9b6561f08a5e951e62dabface328ecd778f28acc21f60a6f2ad0190"}},{"ruleId":"D2","level":"warning","message":{"text":"Header.setForHeaderData (cognitive 20): Header.setForHeaderData has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10, ternaries 9, boolean chains 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"860e706464f7bf68560738820ed2a490fee3848603362719d1dbb93746e22ddf"}},{"ruleId":"D2","level":"warning","message":{"text":"Id3Decoder.decodeHeader (cognitive 20): Id3Decoder.decodeHeader has cognitive complexity 20 (threshold 15). Drivers by points: if/else 19, boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":167}}}],"partialFingerprints":{"codehealthFindingId/v1":"5cf87cd1afd7bb8b15e4aaf77db06762965a8e92b37c3db51435b2d993ca3d77"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsSampleStreamWrapper.getBufferedPositionUs (cognitive 20): HlsSampleStreamWrapper.getBufferedPositionUs has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9, ternaries 7, loops 4 (nesting depth added 12). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":713}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68f04fb888d82b389055d1002c8f058317d17c045d87e34038c0677fb379d17"}},{"ruleId":"D2","level":"warning","message":{"text":"QualityLevelParser.parseStartTag (cognitive 20): QualityLevelParser.parseStartTag has cognitive complexity 20 (threshold 15). Drivers by points: if/else 14, match/switch 5, boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java"},"region":{"startLine":695}}}],"partialFingerprints":{"codehealthFindingId/v1":"17582dfcf303ab38f05df7e9d3be73e29a0ca851634def8b3a7f1febce959c53"}},{"ruleId":"D2","level":"warning","message":{"text":"SubripDecoder.decode (cognitive 20): SubripDecoder.decode has cognitive complexity 20 (threshold 15). Drivers by points: if/else 13, loops 5, error handling 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/subrip/SubripDecoder.java"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"2daf3701a378056d85ece12da7e2039c3f4ec25979283fe9bcb7c3ffc98b801a"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerControlViewLayoutManager.onLayoutWidthChanged (cognitive 20): StyledPlayerControlViewLayoutManager.onLayoutWidthChanged has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, loops 7, boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java"},"region":{"startLine":645}}}],"partialFingerprints":{"codehealthFindingId/v1":"cacf9e91a5cf9b8ae436dcf2635d428c118443ac051919a9da8b37e1e79d35d0"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerControlViewLayoutManager.updateLayoutForSizeChange (cognitive 20): StyledPlayerControlViewLayoutManager.updateLayoutForSizeChange has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, ternaries 7, boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"05a4850f804e246d53409ffbedaff43b25394a3d057965a24ce582e677360fdf"}},{"ruleId":"D2","level":"warning","message":{"text":"TrackSelectionView.updateViews (cognitive 20): TrackSelectionView.updateViews has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10, loops 6, ternaries 3, boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/TrackSelectionView.java"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"bef034c3bca3adb3639ba3decb5490b1eb9dc0a8a8366ce132bfdf0506ccdb31"}},{"ruleId":"D2","level":"warning","message":{"text":"AviExtractor.readMoviChunks (cognitive 20): AviExtractor.readMoviChunks has cognitive complexity 20 (threshold 15). Drivers by points: if/else 16, ternaries 4 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/avi/AviExtractor.java"},"region":{"startLine":418}}}],"partialFingerprints":{"codehealthFindingId/v1":"786ff972fb60acd0ab837a4d2491f83a0060a3c6e45a8667e1b58681ce8dff30"}},{"ruleId":"D2","level":"warning","message":{"text":"ScriptTagPayloadReader.parsePayload (cognitive 20): ScriptTagPayloadReader.parsePayload has cognitive complexity 20 (threshold 15). Drivers by points: if/else 15, loops 3, boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/flv/ScriptTagPayloadReader.java"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"e752f0cd32fcf9df643325773e2ed3bf6f245699a868066d42df09700d49ac72"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp4Extractor.processMoovAtom (cognitive 20): Mp4Extractor.processMoovAtom has cognitive complexity 20 (threshold 15). Drivers by points: if/else 13, ternaries 4, boolean chains 2, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java"},"region":{"startLine":494}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16434afe637ad98aad4ddbf5646e540543e2714d7f86822ac7b1051cbb73d0b"}},{"ruleId":"D2","level":"warning","message":{"text":"Ac4Reader.consume (cognitive 20): Ac4Reader.consume has cognitive complexity 20 (threshold 15). Drivers by points: if/else 13, ternaries 4, match/switch 2, loops 1 (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Reader.java"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"6be7401696f6242a22033ba6ed2ee87013b7873ce65d09eec8a3cbfc39660548"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultExtractorsFactory.addExtractorsForFileType (cognitive 20): DefaultExtractorsFactory.addExtractorsForFileType has cognitive complexity 20 (threshold 15). Drivers by points: ternaries 12, if/else 7, match/switch 1 (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/DefaultExtractorsFactory.java"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"69445594622de373ba57e06143b7987baa09ab03a39d022cff3da7bb5b8cd3ba"}},{"ruleId":"D2","level":"warning","message":{"text":"VorbisUtil.readMappings (cognitive 20): VorbisUtil.readMappings has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, loops 9 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java"},"region":{"startLine":416}}}],"partialFingerprints":{"codehealthFindingId/v1":"90e5b84552fa38d8b2b5579a738884fdab5d3f512d19c2c11f4e82d137b17048"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultCodec.\u003Cinit\u003E (cognitive 20): DefaultCodec.\u003Cinit\u003E has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10, ternaries 7, boolean chains 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultCodec.java"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"a06734797aee7c636dda9ea785b980fd7e37b495cd51b849afe9a76ed5c5fd5f"}},{"ruleId":"D2","level":"warning","message":{"text":"FakeDataSource.read (cognitive 20): FakeDataSource.read has cognitive complexity 20 (threshold 15). Drivers by points: if/else 18, boolean chains 1, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeDataSource.java"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"99f18618ee6acdd6ac46fab1a097cc50fa6e51478b27631e80c699ecdecb7939"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImplInternal.seekToPeriodPosition (cognitive 20): ExoPlayerImplInternal.seekToPeriodPosition has cognitive complexity 20 (threshold 15). Drivers by points: if/else 11, loops 6, boolean chains 3 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1300}}}],"partialFingerprints":{"codehealthFindingId/v1":"727af4aa135a119a061a947e7c02bd69690c2bcb3c877a4ca027d35978cae4c2"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultMediaItemConverter.toMediaItem (cognitive 19): DefaultMediaItemConverter.toMediaItem has cognitive complexity 19 (threshold 15). Drivers by points: if/else 19 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/DefaultMediaItemConverter.java"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"73f6d4ee0c33e5c9d06136a72713f04cce44c66a232c6884a693875f0de9064e"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaSessionConnector.invalidateMediaSessionPlaybackState (cognitive 19): MediaSessionConnector.invalidateMediaSessionPlaybackState has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8, ternaries 7, boolean chains 3, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":772}}}],"partialFingerprints":{"codehealthFindingId/v1":"60f09f693f51cca898818d1c10cbf8fc4c1cd77072f20a5bebb537201450a8d2"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetadataProvider.sameAs (cognitive 19): MediaMetadataProvider.sameAs has cognitive complexity 19 (threshold 15). Drivers by points: if/else 15, boolean chains 3, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":411}}}],"partialFingerprints":{"codehealthFindingId/v1":"86224c090816b0ff88c96eb35fea4c01a192f595dbf9fab81108b0071ec83f6e"}},{"ruleId":"D2","level":"warning","message":{"text":"VpxDecoder.decode (cognitive 19): VpxDecoder.decode has cognitive complexity 19 (threshold 15). Drivers by points: if/else 16, boolean chains 2, ternaries 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/VpxDecoder.java"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba00f7eabfc6c3b6d3c6fae69ad0d094f396e05990917df2ae73800a8518692"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecAudioRenderer.onOutputFormatChanged (cognitive 19): MediaCodecAudioRenderer.onOutputFormatChanged has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12, loops 4, boolean chains 2, error handling 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java"},"region":{"startLine":505}}}],"partialFingerprints":{"codehealthFindingId/v1":"0d990fdfbb4f54ee5459ce6f43887bd47a65896fd9303ec6c1331a9081bb204c"}},{"ruleId":"D2","level":"warning","message":{"text":"DownloadService.onStartCommand (cognitive 19): DownloadService.onStartCommand has cognitive complexity 19 (threshold 15). Drivers by points: if/else 16, boolean chains 2, match/switch 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java"},"region":{"startLine":616}}}],"partialFingerprints":{"codehealthFindingId/v1":"df3a0c034ec2890db7a0269b7230cd907e0241effbffc6d27d7770258285d228"}},{"ruleId":"D2","level":"warning","message":{"text":"SegmentDownloader.execute (cognitive 19): SegmentDownloader.execute has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14, error handling 4, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/SegmentDownloader.java"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"2704f9b7cc7d2a77816cb64c80dabc38933c4e22a388e9e6ed6bef7238af2bc1"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultDashChunkSource.onChunkLoadError (cognitive 19): DefaultDashChunkSource.onChunkLoadError has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13, boolean chains 6 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":519}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9ca59ae21565abd522a5765b8ef8927893afffb026476d010da629aaf9d8d4e"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsSampleStreamWrapper.readData (cognitive 19): HlsSampleStreamWrapper.readData has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8, loops 5, boolean chains 3, ternaries 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":633}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a1c98d4fd15dc16a6ca4248e0a0c561abe535f2ec58e918432bd0eeaf714cf4"}},{"ruleId":"D2","level":"warning","message":{"text":"InternalListener.onPlaybackStarted (cognitive 19): InternalListener.onPlaybackStarted has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14, loops 3, boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java"},"region":{"startLine":612}}}],"partialFingerprints":{"codehealthFindingId/v1":"835f987f5d931ba26a624bc7403a033c53642ffd67f36e0397efc2669515c4cb"}},{"ruleId":"D2","level":"warning","message":{"text":"SsMediaSource.processManifest (cognitive 19): SsMediaSource.processManifest has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11, ternaries 5, loops 2, boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java"},"region":{"startLine":544}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bada45bb6c42a0dcc4eb3399a64b04f35f1716458f77bb68123119d0c067fd6"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlDecoder.parseHeader (cognitive 19): TtmlDecoder.parseHeader has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14, loops 5 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":281}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb79680397c408a8681a7eb5f649c0f8f165f05edd293a54c8c0e94d4f663cd0"}},{"ruleId":"D2","level":"warning","message":{"text":"TrackSelectionView.onTrackViewClicked (cognitive 19): TrackSelectionView.onTrackViewClicked has cognitive complexity 19 (threshold 15). Drivers by points: if/else 16, boolean chains 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/TrackSelectionView.java"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e33e3a22b90fc3f37ce980e6806260a4ac319bccdf6b4311c315c2d8d0e7f0f"}},{"ruleId":"D2","level":"warning","message":{"text":"Projection.createEquirectangular (cognitive 19): Projection.createEquirectangular has cognitive complexity 19 (threshold 15). Drivers by points: loops 6, boolean chains 5, if/else 4, ternaries 4 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/spherical/Projection.java"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"557d95427024b187ea0aac384df517b9830be010fefcb3a69498fd901299a9a9"}},{"ruleId":"D2","level":"warning","message":{"text":"ProjectionDecoder.parseMesh (cognitive 19): ProjectionDecoder.parseMesh has cognitive complexity 19 (threshold 15). Drivers by points: if/else 10, loops 7, boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionDecoder.java"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"604cede6f424d30f7f0a39124f9b924056a293e0e808edcccd07747181ca6808"}},{"ruleId":"D2","level":"warning","message":{"text":"PlaybackStatsTracker.build (cognitive 19): PlaybackStatsTracker.build has cognitive complexity 19 (threshold 15). Drivers by points: ternaries 14, if/else 3, boolean chains 2 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":592}}}],"partialFingerprints":{"codehealthFindingId/v1":"9fe014c408b837ae21377cfd5a7217c6404b075aa1b33a0c7f5fe02b5c874683"}},{"ruleId":"D2","level":"warning","message":{"text":"Mp3Extractor.readSample (cognitive 19): Mp3Extractor.readSample has cognitive complexity 19 (threshold 15). Drivers by points: if/else 17, boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/Mp3Extractor.java"},"region":{"startLine":300}}}],"partialFingerprints":{"codehealthFindingId/v1":"def0e8d87aa57fc2b0bd89cf1fd18b6732f5f81d7cad1693636628ef937a42fc"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaServerSideAdInsertionUriBuilder.build (cognitive 18): ImaServerSideAdInsertionUriBuilder.build has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, boolean chains 3, loops 2, ternaries 2 (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java"},"region":{"startLine":257}}}],"partialFingerprints":{"codehealthFindingId/v1":"93f228784e0fc34aec8a20e7209764560efde42fd90b55d3296b745cce8e0655"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaUtil.getAdGroupAndIndexInVodMultiPeriodTimeline (cognitive 18): ImaUtil.getAdGroupAndIndexInVodMultiPeriodTimeline has cognitive complexity 18 (threshold 15). Drivers by points: if/else 15, loops 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java"},"region":{"startLine":854}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf2f55eefbf7fb89e04bc546842366af6896e4231dd6d212516afcb050d178c6"}},{"ruleId":"D2","level":"warning","message":{"text":"Sonic.findPitchPeriod (cognitive 18): Sonic.findPitchPeriod has cognitive complexity 18 (threshold 15). Drivers by points: if/else 16, boolean chains 1, ternaries 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/audio/Sonic.java"},"region":{"startLine":297}}}],"partialFingerprints":{"codehealthFindingId/v1":"245fd2593c492f4f2038e3c8a95f7c778335b81856f30f7735c2ce5f5da9a29f"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultDrmSessionManager.acquireSession (cognitive 18): DefaultDrmSessionManager.acquireSession has cognitive complexity 18 (threshold 15). Drivers by points: if/else 16, loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java"},"region":{"startLine":463}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6e3c93eb801b2fbfea2a472f9607e2d961b84b73976158c2a365d879324a87"}},{"ruleId":"D2","level":"warning","message":{"text":"MetadataRenderer.readMetadata (cognitive 18): MetadataRenderer.readMetadata has cognitive complexity 18 (threshold 15). Drivers by points: if/else 17, boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/metadata/MetadataRenderer.java"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cf0f3e5f0e1ee19d11181c29f6d0dd0d1793c6cc3543ba85ebca736746d5bb8"}},{"ruleId":"D2","level":"warning","message":{"text":"ChunkSampleStream.seekToUs (cognitive 18): ChunkSampleStream.seekToUs has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, loops 6, boolean chains 1 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"e112ae66bc93db71bb46444777a2cf310df06947492c995baf60e67b6806955a"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parsePeriod (cognitive 18): DashManifestParser.parsePeriod has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12, ternaries 5, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f526463e682e987089845b5de89214b373fffe30585e5cf8912bba555f36f4"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultDashChunkSource.newMediaChunk (cognitive 18): DefaultDashChunkSource.newMediaChunk has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 10, if/else 5, loops 2, boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dde66a31ea5a8c1d7c43c100e7340db50f25769ceb8f223dc6501b98852a534"}},{"ruleId":"D2","level":"warning","message":{"text":"TtmlRenderUtil.resolveStyle (cognitive 18): TtmlRenderUtil.resolveStyle has cognitive complexity 18 (threshold 15). Drivers by points: loops 9, if/else 7, boolean chains 2 (nesting depth added 8). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"da26f29997edcace58faba5ec5ee8c421503422486872003f857462c5e442480"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerControlView.updatePlayPauseButton (cognitive 18): PlayerControlView.updatePlayPauseButton has cognitive complexity 18 (threshold 15). Drivers by points: ternaries 8, boolean chains 5, if/else 5 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":827}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba10e5fa3296388e161715ea0e12c6cebb7d6c4e9894e27384fff85078f4b9ae"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerControlView.updateProgress (cognitive 18): PlayerControlView.updateProgress has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7, boolean chains 6, ternaries 5 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1019}}}],"partialFingerprints":{"codehealthFindingId/v1":"a30f8949cf0a455d2d5b92ef9d845531a063154366149fe258510b9075b4a15c"}},{"ruleId":"D2","level":"warning","message":{"text":"LoadTask.handleMessage (cognitive 18): LoadTask.handleMessage has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, ternaries 4, error handling 2, match/switch 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/Loader.java"},"region":{"startLine":464}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1aea4e4bc25e8bbf7375c88628c1f789baa7d05abaf03c06fd27b623c039e7a"}},{"ruleId":"D2","level":"warning","message":{"text":"NalUnitUtil.skipH265ScalingList (cognitive 18): NalUnitUtil.skipH265ScalingList has cognitive complexity 18 (threshold 15). Drivers by points: if/else 8, loops 7, ternaries 3 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":841}}}],"partialFingerprints":{"codehealthFindingId/v1":"959d9429a0b414fc7e479a557823abbe4476095e9ed098283d3a8b8b9067e60b"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleDecoder.decode (cognitive 18): SimpleDecoder.decode has cognitive complexity 18 (threshold 15). Drivers by points: if/else 12, error handling 4, boolean chains 1, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/decoder/src/main/java/com/google/android/exoplayer2/decoder/SimpleDecoder.java"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"465d604112c49331f64809b71ebc714c15f4752205e760f95cdb54ec94f46f43"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecUtil.applyWorkarounds (cognitive 18): MediaCodecUtil.applyWorkarounds has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, boolean chains 6, ternaries 1 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":642}}}],"partialFingerprints":{"codehealthFindingId/v1":"79601f03dd19114e66cafa10ee00c546585cd0f45db0407a0b0fb0ce3c25eaf8"}},{"ruleId":"D2","level":"warning","message":{"text":"AtomParsers.parseTkhd (cognitive 18): AtomParsers.parseTkhd has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10, ternaries 4, boolean chains 3, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":911}}}],"partialFingerprints":{"codehealthFindingId/v1":"881370940637f26b480f2386b63a9597c00ba1a76a16d332911ac14f600fe266"}},{"ruleId":"D2","level":"warning","message":{"text":"FragmentedMp4Extractor.onEmsgLeafAtomRead (cognitive 18): FragmentedMp4Extractor.onEmsgLeafAtomRead has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, loops 5, boolean chains 1, match/switch 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":621}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3d73896007a18d41d3c19643b4aa10bfd41799e24534d365347c9efa3843618"}},{"ruleId":"D2","level":"warning","message":{"text":"AdtsReader.findNextSample (cognitive 18): AdtsReader.findNextSample has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13, boolean chains 2, match/switch 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f2bf2b8dc96aecbe10589eebaad4440146f0ad483736f6db9c5b843be9063d"}},{"ruleId":"D2","level":"warning","message":{"text":"H263Reader.parseCsdBuffer (cognitive 18): H263Reader.parseCsdBuffer has cognitive complexity 18 (threshold 15). Drivers by points: if/else 15, loops 3 (nesting depth added 5). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java"},"region":{"startLine":236}}}],"partialFingerprints":{"codehealthFindingId/v1":"43630165fdeae3cc990435341ded2593931fc549879ffbc65d18b230e49abf6d"}},{"ruleId":"D2","level":"warning","message":{"text":"ExoPlayerImpl.evaluateMediaItemTransitionReason (cognitive 18): ExoPlayerImpl.evaluateMediaItemTransitionReason has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13, boolean chains 5 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":2216}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab6a820207f520739e114e9ae6b18f29784f3adb08ebdade06eb7e49d379c1d5"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaPeriodQueue.updateQueuedPeriods (cognitive 18): MediaPeriodQueue.updateQueuedPeriods has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11, boolean chains 3, ternaries 3, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"861150147a0b38ab04b1c07ea569dd768fb33226fefc56be016b1fef8ad97656"}},{"ruleId":"D2","level":"warning","message":{"text":"AdTagLoader.playAdInternal (cognitive 17): AdTagLoader.playAdInternal has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, loops 7, boolean chains 2 (nesting depth added 5). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":981}}}],"partialFingerprints":{"codehealthFindingId/v1":"14b46e80a9f4a74f9523dcb7453f5b686299fd4df0b95a93d8660775438127b0"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaServerSideAdInsertionUriBuilder.createStreamRequest (cognitive 17): ImaServerSideAdInsertionUriBuilder.createStreamRequest has cognitive complexity 17 (threshold 15). Drivers by points: if/else 14, loops 2, boolean chains 1 (nesting depth added 3). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionUriBuilder.java"},"region":{"startLine":334}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1ca54b666f729a02de25ccc34f41d72d8e9d3fd1a43320df0bec691016deff7"}},{"ruleId":"D2","level":"warning","message":{"text":"IcyHeaders.parse (cognitive 17): IcyHeaders.parse has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12, error handling 4, ternaries 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/icy/IcyHeaders.java"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"080230848fe4b12646085a8c9e2b776ab490e280580edcecddc7f7b28f443120"}},{"ruleId":"D2","level":"warning","message":{"text":"AdsMediaSource.maybeUpdateAdMediaSources (cognitive 17): AdsMediaSource.maybeUpdateAdMediaSources has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13, loops 3, boolean chains 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"504a5f0614a59b4b13282f8d0148d75942403c370d02828ae2f37c0e78f599fe"}},{"ruleId":"D2","level":"warning","message":{"text":"ChunkSampleStream.continueLoading (cognitive 17): ChunkSampleStream.continueLoading has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12, loops 4, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java"},"region":{"startLine":568}}}],"partialFingerprints":{"codehealthFindingId/v1":"885e2a02144915d3a63ac1945a2faef76f8d8640b589d3229e928c6e944340aa"}},{"ruleId":"D2","level":"warning","message":{"text":"MultiSegmentBase.getSegmentNum (cognitive 17): MultiSegmentBase.getSegmentNum has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, ternaries 7, loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/SegmentBase.java"},"region":{"startLine":178}}}],"partialFingerprints":{"codehealthFindingId/v1":"2962ca2a51ca557ab5af9134cd08ee67e5d71ebf0707650bb99e133e51afc1c1"}},{"ruleId":"D2","level":"warning","message":{"text":"RtspMediaPeriod.selectTracks (cognitive 17): RtspMediaPeriod.selectTracks has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12, loops 3, boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java"},"region":{"startLine":193}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1124f4cbfc8b30da9a9c82987c4dc52b63e4e28c63ce9df73b552302ae8897b"}},{"ruleId":"D2","level":"warning","message":{"text":"ClippingSampleStream.readData (cognitive 17): ClippingSampleStream.readData has cognitive complexity 17 (threshold 15). Drivers by points: if/else 6, ternaries 6, boolean chains 5 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaPeriod.java"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"e775d0faea33c76257297f4ace0c02f012f1a7b5fb5ee857824fb6cc207e151d"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.paint2BitPixelCodeString (cognitive 17): DvbParser.paint2BitPixelCodeString has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7, match/switch 5, ternaries 3, boolean chains 1, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e26eba460d2051e8e551b6b182df8598177b00b8a463a6f19b326ba1dc38ccb"}},{"ruleId":"D2","level":"warning","message":{"text":"CueBuilder.build (cognitive 17): CueBuilder.build has cognitive complexity 17 (threshold 15). Drivers by points: ternaries 8, if/else 7, boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/pgs/PgsDecoder.java"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"97d58d3e2cc5e4eab0a26307d3f52f5dfe50832cb7bcb356e94988a3e05ba8a7"}},{"ruleId":"D2","level":"warning","message":{"text":"Cue.fromBundle (cognitive 17): Cue.fromBundle has cognitive complexity 17 (threshold 15). Drivers by points: if/else 15, boolean chains 2. To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java"},"region":{"startLine":873}}}],"partialFingerprints":{"codehealthFindingId/v1":"1836f646cc94fdff16b4d23912ca39c5048217fea26ea8f945eecaacdf379fcc"}},{"ruleId":"D2","level":"warning","message":{"text":"VideoTrackInfo.\u003Cinit\u003E (cognitive 17): VideoTrackInfo.\u003Cinit\u003E has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 13, if/else 2, loops 1, ternaries 1 (nesting depth added 1). To reduce it, name the conditions: bind each compound test to a well-named local or a small predicate function, so the body reads as a sequence of named decisions rather than a chain of operators."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":3249}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc40a3cebbdffd6d1b09a73ecd62baccac980ebfd7a62e1cb475dd25d1a3d307"}},{"ruleId":"D2","level":"warning","message":{"text":"TrackSelectionUtil.buildTracks (cognitive 17): TrackSelectionUtil.buildTracks has cognitive complexity 17 (threshold 15). Drivers by points: loops 11, if/else 5, boolean chains 1 (nesting depth added 10). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionUtil.java"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"178688639610fc5ef4ac084153f384b86b02bda33f7e5e7bae1337e483cbac82"}},{"ruleId":"D2","level":"warning","message":{"text":"PlayerNotificationManager.createNotification (cognitive 17): PlayerNotificationManager.createNotification has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9, boolean chains 3, loops 3, ternaries 2 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java"},"region":{"startLine":1211}}}],"partialFingerprints":{"codehealthFindingId/v1":"95d7af19cc2dc5fc1db8786db6861085c50adabb16c20388502a28dcf0b1c14e"}},{"ruleId":"D2","level":"warning","message":{"text":"StyledPlayerControlView.updateProgress (cognitive 17): StyledPlayerControlView.updateProgress has cognitive complexity 17 (threshold 15). Drivers by points: if/else 7, boolean chains 5, ternaries 5 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1264}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e679af6649d98f595e8a21610bfd70af96392cac7148d0e2457edfed341649e"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultHttpDataSource.makeConnection (cognitive 17): DefaultHttpDataSource.makeConnection has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9, boolean chains 7, loops 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java"},"region":{"startLine":529}}}],"partialFingerprints":{"codehealthFindingId/v1":"499cb9e29e3197556b59ed693b80b12b70db212c95056f1188b5d96829344064"}},{"ruleId":"D2","level":"warning","message":{"text":"TimestampAdjuster.sharedInitializeOrWait (cognitive 17): TimestampAdjuster.sharedInitializeOrWait has cognitive complexity 17 (threshold 15). Drivers by points: if/else 13, loops 3, boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/TimestampAdjuster.java"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68bf3741040fec3763fae005e9d5fedb234f0f4c7df17e7b607a1b483699b87"}},{"ruleId":"D2","level":"warning","message":{"text":"UriUtil.removeDotSegments (cognitive 17): UriUtil.removeDotSegments has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10, ternaries 4, boolean chains 2, loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/UriUtil.java"},"region":{"startLine":183}}}],"partialFingerprints":{"codehealthFindingId/v1":"c63642d7a2405ba625248d7cf3d07e80417565a32f1e61d3ec55019e7daf385e"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaMetricsListener.maybeReportTrackChanges (cognitive 17): MediaMetricsListener.maybeReportTrackChanges has cognitive complexity 17 (threshold 15). Drivers by points: if/else 15, boolean chains 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":375}}}],"partialFingerprints":{"codehealthFindingId/v1":"eace79c5dc25df4967ec8ed4cb2cede08ec15b655d4d11756a892de7fa589091"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecInfo.isFormatSupported (cognitive 17): MediaCodecInfo.isFormatSupported has cognitive complexity 17 (threshold 15). Drivers by points: if/else 12, boolean chains 5 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java"},"region":{"startLine":261}}}],"partialFingerprints":{"codehealthFindingId/v1":"6bc3af93ef1466c39a59bbafce357d7243f2945238b30688eb4345e3847fff02"}},{"ruleId":"D2","level":"warning","message":{"text":"Ac4Extractor.sniff (cognitive 17): Ac4Extractor.sniff has cognitive complexity 17 (threshold 15). Drivers by points: if/else 14, loops 2, boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.java"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6d123b2d3e54d287860ac1c1dd8bb746406d7758bd5ac1329eac29ce70663e5"}},{"ruleId":"D2","level":"warning","message":{"text":"PsScrSeeker.searchForScrValueInBuffer (cognitive 17): PsScrSeeker.searchForScrValueInBuffer has cognitive complexity 17 (threshold 15). Drivers by points: if/else 16, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsBinarySearchSeeker.java"},"region":{"startLine":96}}}],"partialFingerprints":{"codehealthFindingId/v1":"383ef77442625f93bc41a1e9c2eb1857de1852589398596511f57526d8a5f278"}},{"ruleId":"D2","level":"warning","message":{"text":"InAppMuxer.writeMetadata (cognitive 17): InAppMuxer.writeMetadata has cognitive complexity 17 (threshold 15). Drivers by points: if/else 16, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/InAppMuxer.java"},"region":{"startLine":222}}}],"partialFingerprints":{"codehealthFindingId/v1":"32eba479807d94b6c129e47213417f271f6825637279d9c3f7a577f643882d65"}},{"ruleId":"D2","level":"warning","message":{"text":"ExtractorAsserts.consumeTestData (cognitive 17): ExtractorAsserts.consumeTestData has cognitive complexity 17 (threshold 15). Drivers by points: if/else 8, loops 4, boolean chains 3, error handling 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/ExtractorAsserts.java"},"region":{"startLine":512}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7b8dd1e4b6efaea76b7d4c02a476ec42367c3128368240437658f98e76ac3f8"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaPeriodQueue.getMediaPeriodInfoForContent (cognitive 17): MediaPeriodQueue.getMediaPeriodInfoForContent has cognitive complexity 17 (threshold 15). Drivers by points: boolean chains 8, ternaries 6, if/else 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":955}}}],"partialFingerprints":{"codehealthFindingId/v1":"0007415328f188fc030acb7633094374e635afa27c29dc7c371aabb9f83691d9"}},{"ruleId":"D2","level":"warning","message":{"text":"ImaUtil.maybeCorrectPreviouslyUnknownAdDurations (cognitive 16): ImaUtil.maybeCorrectPreviouslyUnknownAdDurations has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12, loops 3, boolean chains 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java"},"region":{"startLine":575}}}],"partialFingerprints":{"codehealthFindingId/v1":"8cb2ed3c257b06d9b129d15f775ab39d2e96c1f2d9de23aa8b67407a64c87e4f"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultMediaItemConverter.convertToExoPlayerMediaItem (cognitive 16): DefaultMediaItemConverter.convertToExoPlayerMediaItem has cognitive complexity 16 (threshold 15). Drivers by points: if/else 15, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/DefaultMediaItemConverter.java"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"47b2ba1b38f8ce28317b669973d8ed0f419e9e468ca54cce2b8739ed8ef86dc8"}},{"ruleId":"D2","level":"warning","message":{"text":"ChannelMixingMatrix.\u003Cinit\u003E (cognitive 16): ChannelMixingMatrix.\u003Cinit\u003E has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, boolean chains 3, loops 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/audio/ChannelMixingMatrix.java"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"25b4cb4f3cfa8b991931053318945d817a7d50785e259c7a98db143ae985f863"}},{"ruleId":"D2","level":"warning","message":{"text":"DecoderAudioRenderer.drainOutputBuffer (cognitive 16): DecoderAudioRenderer.drainOutputBuffer has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, error handling 3 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":402}}}],"partialFingerprints":{"codehealthFindingId/v1":"89e52ae5ba33ebcfac53d111f8f991c4446204f68faa5bba0f2a45d6ed76437e"}},{"ruleId":"D2","level":"warning","message":{"text":"DrmInitData.createSessionCreationData (cognitive 16): DrmInitData.createSessionCreationData has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, loops 4, boolean chains 1, ternaries 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/drm/DrmInitData.java"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"013bb0871e6b49f1b7cb98a11126087de56a7edb92c41eb989e2b9875d4efcc5"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultDrmSession.doLicense (cognitive 16): DefaultDrmSession.doLicense has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12, boolean chains 3, match/switch 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java"},"region":{"startLine":437}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d2a3b42b8a9dadbde09682bc2333cce219ae9f8c4d6835cafe69938f3c9e63f"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaPreparer.handleMessage (cognitive 16): MediaPreparer.handleMessage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, loops 6, error handling 2, match/switch 1 (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c8c4ade7fe3a1b1a643753309b410e30cc3b9791961380645808d190adf63c0"}},{"ruleId":"D2","level":"warning","message":{"text":"ChunkSampleStream.onLoadError (cognitive 16): ChunkSampleStream.onLoadError has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, ternaries 2, boolean chains 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"4fe590d78b0a093328b36d1c629fc2bceb38f8dee1051defc7daf1274550760d"}},{"ruleId":"D2","level":"warning","message":{"text":"DashManifestParser.parseSegmentTemplate (cognitive 16): DashManifestParser.parseSegmentTemplate has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 10, if/else 5, loops 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":1016}}}],"partialFingerprints":{"codehealthFindingId/v1":"7bb49faa33581e097d0de5127ed984d2d67a98814378fa70aa8849fcbd88fc44"}},{"ruleId":"D2","level":"warning","message":{"text":"DashDownloader.addSegmentsForAdaptationSet (cognitive 16): DashDownloader.addSegmentsForAdaptationSet has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, loops 3, error handling 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"527fde1253cff9506becac1289597e7b1ee6746c250f7d71c39bc7bdda344e0c"}},{"ruleId":"D2","level":"warning","message":{"text":"DashMediaPeriod.releaseOrphanEmbeddedStreams (cognitive 16): DashMediaPeriod.releaseOrphanEmbeddedStreams has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, boolean chains 2, loops 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"0574fdfa73ebea7605099bf845ee971637a4f5710f5537dddab0655374d85796"}},{"ruleId":"D2","level":"warning","message":{"text":"HlsMediaChunk.createInstance (cognitive 16): HlsMediaChunk.createInstance has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 9, boolean chains 4, if/else 3 (nesting depth added 3). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"d71b5486fd3cab7cd4659a3f83386e4de63fc553a8672e4a51f0e4426438c5bd"}},{"ruleId":"D2","level":"warning","message":{"text":"RtpVp9Reader.consume (cognitive 16): RtpVp9Reader.consume has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, boolean chains 3 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp9Reader.java"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"88a538ad739119a0ee92786cc9b0e20fc8a244eae515dc07ba1ff7634e2f4895"}},{"ruleId":"D2","level":"warning","message":{"text":"RtpExtractor.read (cognitive 16): RtpExtractor.read has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, loops 2, boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtpExtractor.java"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9990bd795cb3e9614a1a64efbbe0e453321e2189250b0972b10fc207d2adcf7"}},{"ruleId":"D2","level":"warning","message":{"text":"SampleQueue.sampleMetadata (cognitive 16): SampleQueue.sampleMetadata has cognitive complexity 16 (threshold 15). Drivers by points: if/else 15, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java"},"region":{"startLine":608}}}],"partialFingerprints":{"codehealthFindingId/v1":"7acc4d60deb7aa38f3d530068a367b4bbd16d7b6d29500c6b69ee17bbd616ae6"}},{"ruleId":"D2","level":"warning","message":{"text":"DvbParser.paint8BitPixelCodeString (cognitive 16): DvbParser.paint8BitPixelCodeString has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, ternaries 3, boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":862}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f9ef9a1ea4f508f3e5a1c59204e5907f99ca158608619fb984779895e0da577"}},{"ruleId":"D2","level":"warning","message":{"text":"WebvttDecoder.decode (cognitive 16): WebvttDecoder.decode has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, loops 2, error handling 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoder.java"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6310d1e214c4f32c95265061f16a0bd8e9f14ceccd7ac485ca4f8b0efb1afa0"}},{"ruleId":"D2","level":"warning","message":{"text":"Util.parseXsDuration (cognitive 16): Util.parseXsDuration has cognitive complexity 16 (threshold 15). Drivers by points: ternaries 14, if/else 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/Util.java"},"region":{"startLine":1414}}}],"partialFingerprints":{"codehealthFindingId/v1":"474e2be889efee1d27750fed09161bc6e077b891022aeda08c1c9957948e7bf7"}},{"ruleId":"D2","level":"warning","message":{"text":"EventLogger.onTracksChanged (cognitive 16): EventLogger.onTracksChanged has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7, loops 6, boolean chains 3 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"be39539a636e50b611951cfe3e411669a7c5b62b09a955232ee7f0b44b17f90a"}},{"ruleId":"D2","level":"warning","message":{"text":"DecoderVideoRenderer.processOutputBuffer (cognitive 16): DecoderVideoRenderer.processOutputBuffer has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, boolean chains 5, ternaries 1 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java"},"region":{"startLine":830}}}],"partialFingerprints":{"codehealthFindingId/v1":"b17cf3861df5a8007f4ae5014339840f81cc2ac2a1a9ea8d3930e8970160dae9"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecVideoRenderer.getCodecMaxInputSize (cognitive 16): MediaCodecVideoRenderer.getCodecMaxInputSize has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9, boolean chains 6, match/switch 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":882}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7eea3ba8c161ae96fc6ce701d40994917997600308b78a509f334f137d4f7e3"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecVideoRenderer.getCodecMaxValues (cognitive 16): MediaCodecVideoRenderer.getCodecMaxValues has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, boolean chains 2, loops 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":1807}}}],"partialFingerprints":{"codehealthFindingId/v1":"86bfa1a7434edee8d10f17272398debf81c34165b91ed550edf4f6f885232ed8"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaCodecRenderer.bypassRead (cognitive 16): MediaCodecRenderer.bypassRead has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12, match/switch 2, boolean chains 1, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":2312}}}],"partialFingerprints":{"codehealthFindingId/v1":"c104ce913e3410ab0669cd24a5c27e729166b0944c65177c5cf14490988f69c4"}},{"ruleId":"D2","level":"warning","message":{"text":"FlacExtractor.findFrame (cognitive 16): FlacExtractor.findFrame has cognitive complexity 16 (threshold 15). Drivers by points: if/else 10, error handling 3, loops 3 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/flac/FlacExtractor.java"},"region":{"startLine":350}}}],"partialFingerprints":{"codehealthFindingId/v1":"1f4ff916f7b20d4ff15e4fffb728a439ff8b4187bc073186bc55e7cd13900520"}},{"ruleId":"D2","level":"warning","message":{"text":"Sniffer.sniff (cognitive 16): Sniffer.sniff has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9, boolean chains 4, loops 2, ternaries 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/Sniffer.java"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"51e8737a937ee745065ab8720f3477028e9f18d326f0d94fb5c39a40109efb0b"}},{"ruleId":"D2","level":"warning","message":{"text":"Ac3Extractor.sniff (cognitive 16): Ac3Extractor.sniff has cognitive complexity 16 (threshold 15). Drivers by points: if/else 14, loops 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"880d9a270d0b4a43d3d612d11598bebfffaea94937a5c30dce0ed6c9dea00294"}},{"ruleId":"D2","level":"warning","message":{"text":"Ac3Reader.consume (cognitive 16): Ac3Reader.consume has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, match/switch 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"61d72bfbde839a83aff23446c1ae642b7367921b594f7f79f1c1940872d82bbd"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultTsPayloadReaderFactory.getClosedCaptionFormats (cognitive 16): DefaultTsPayloadReaderFactory.getClosedCaptionFormats has cognitive complexity 16 (threshold 15). Drivers by points: if/else 12, loops 4 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DefaultTsPayloadReaderFactory.java"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"179fa321218c718b42fc0817d7e5b9de5db6fa1ea496681f38a25f80a15bef63"}},{"ruleId":"D2","level":"warning","message":{"text":"DtsReader.consume (cognitive 16): DtsReader.consume has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, match/switch 2, loops 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/DtsReader.java"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"0df6eae264f24acecf297693b4ad1fa8e6e557f95b3524e0394fe51073ff7778"}},{"ruleId":"D2","level":"warning","message":{"text":"LatmReader.consume (cognitive 16): LatmReader.consume has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, match/switch 2, loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/LatmReader.java"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"583a5b3e1f8dd42ac57c2513da2e074db4ebea7501dc38b4bd2041cbdafabb80"}},{"ruleId":"D2","level":"warning","message":{"text":"TsPcrSeeker.searchForPcrValueInBuffer (cognitive 16): TsPcrSeeker.searchForPcrValueInBuffer has cognitive complexity 16 (threshold 15). Drivers by points: if/else 15, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsBinarySearchSeeker.java"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"11fa66951b9071ff47ee3fed5e3ece92f09105543609400950b09e3c2c985886"}},{"ruleId":"D2","level":"warning","message":{"text":"EnumerateDecodersTest.codecCapabilitiesToString (cognitive 16): EnumerateDecodersTest.codecCapabilitiesToString has cognitive complexity 16 (threshold 15). Drivers by points: if/else 11, boolean chains 5 (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"playbacktests/src/androidTest/java/com/google/android/exoplayer2/playbacktests/gts/EnumerateDecodersTest.java"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc82a8700a00898e3f506006dcbc55bd0194d65dfb67a8269a0424da0a3d337e"}},{"ruleId":"D2","level":"warning","message":{"text":"DefaultRenderersFactoryAsserts.assertExtensionRendererCreated (cognitive 16): DefaultRenderersFactoryAsserts.assertExtensionRendererCreated has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13, loops 3 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/DefaultRenderersFactoryAsserts.java"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"eecce1ac27989fbc7b4f14c08cd957dd9524a0e7a4a3cbf6a91a46ca018970f1"}},{"ruleId":"D2","level":"warning","message":{"text":"FakeSampleStream.writeData (cognitive 16): FakeSampleStream.writeData has cognitive complexity 16 (threshold 15). Drivers by points: if/else 14, boolean chains 1, loops 1 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeSampleStream.java"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"b1249f14271eb9931aa48a1fe6acde1a11d6da9d2632383788f7367ca21a8beb"}},{"ruleId":"D2","level":"warning","message":{"text":"TestUtil.extractSeekMap (cognitive 16): TestUtil.extractSeekMap has cognitive complexity 16 (threshold 15). Drivers by points: loops 8, if/else 5, boolean chains 3 (nesting depth added 6). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java"},"region":{"startLine":363}}}],"partialFingerprints":{"codehealthFindingId/v1":"acf5e48bbe2d39d5af4e91bd1f7521e3e076219a6ad12422f678502a8b6ef53d"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleBasePlayer.buildStateForNewPosition (cognitive 16): SimpleBasePlayer.buildStateForNewPosition has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9, boolean chains 7 (nesting depth added 2). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":3893}}}],"partialFingerprints":{"codehealthFindingId/v1":"5c9d2a7397d045712d40531925590e8d2bca6605c4da9cf3087db75c997a84ff"}},{"ruleId":"D2","level":"warning","message":{"text":"SimpleBasePlayer.getPositionDiscontinuityReason (cognitive 16): SimpleBasePlayer.getPositionDiscontinuityReason has cognitive complexity 16 (threshold 15). Drivers by points: if/else 9, boolean chains 4, ternaries 3 (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":3650}}}],"partialFingerprints":{"codehealthFindingId/v1":"fed365b2e1f5bf4aa741b68f36753061664950590fa5abfccc09bfa1351c944b"}},{"ruleId":"D2","level":"warning","message":{"text":"MediaPeriodQueue.resolvePeriodIndexToWindowSequenceNumber (cognitive 16): MediaPeriodQueue.resolvePeriodIndexToWindowSequenceNumber has cognitive complexity 16 (threshold 15). Drivers by points: if/else 14, loops 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":577}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44b23dc08c23791fa53aad9d5d0ead240240246a7d4f61dfebdeb978712df4c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ExoPlayerImpl: TooManyMethods \u2014 176 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"78feae63587aa747c3db457470888e015c5fd1e4cd9df95f112d9bdd9ebbe91f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Util: TooManyMethods \u2014 154 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/Util.java"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"8787306a6a023f36670a7d1c45b2bb1e6cbcfb91d7152f83c1c952e6f6477f25"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/ExoPlayerImpl.java: FileTooLong \u2014 2339 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1b873d747322c2b779c739ac61adcae9cd1ddc4dbdafc0b19f6fa0fe4c7c0a62"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SimpleExoPlayer: TooManyMethods \u2014 140 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"4eafa8168aab6158feb35c2dc228c8375691cd659fb75e8de19b352070dcfec0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: trackselection/DefaultTrackSelector.java: FileTooLong \u2014 2240 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"00a312173ae1f70ab1e1a0eb0f0d758ba099f5345bf9eb090aac9934280f1a5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/ExoPlayerImplInternal.java: FileTooLong \u2014 2191 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e04057a4ffc938d9df75e561f266ee4e76ecdd1251673f28676d10f115f0b54"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/SimpleBasePlayer.java: FileTooLong \u2014 2181 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8ed24b73b18d9a96ac836d0816fffb41b079aa37240911fadb04f69f9af876e"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ForwardingPlayer: TooManyMethods \u2014 129 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"d9ac09d9cb88c88e73eecbeb35e6c1a82ca3756e22470107f54256a70311b7ed"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SimpleBasePlayer: TooManyMethods \u2014 129 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"0160d414b2533bc39d66b375319c62a4ead8769680643e27d372e2bce1182985"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ExoPlayerImplInternal: TooManyMethods \u2014 125 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"2764d0134ef1ee0404ab90e86d6f21cc3c31b338bb94826be1ad24a2ab6b556b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mkv/MatroskaExtractor.java: FileTooLong \u2014 1857 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: MatroskaExtractor (87-2561). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c88175b3b31a6e72081df8a299508507678886141fdf122425410c70bbab472a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: video/MediaCodecVideoRenderer.java: FileTooLong \u2014 1684 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87e7fab5fe3de1261834580cf14786cccb9c247a868724ece3437586bae75f6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaCodecRenderer: TooManyMethods \u2014 96 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"45ebd74c2991d8261c6d70885ff0e499fbba644f59a6f0f3fa59d2320ac7e5f1"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: manifest/DashManifestParser.java: FileTooLong \u2014 1533 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: DashManifestParser (74-2102). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"46555a4a5a35d719cd2349813ea0aba845b0c8ff7016df990255ed8bedc95ba2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mp4/AtomParsers.java: FileTooLong \u2014 1518 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2c25e6016ea6bd83cc97858aea154b8c47eafb43bd446b03794ae0743582aee7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: util/Util.java: FileTooLong \u2014 1489 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/Util.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"25932e9c9e33dfa7d0807c0e3a503889b1c2e430e27b0994250cb98abe698939"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DefaultAnalyticsCollector: TooManyMethods \u2014 86 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultAnalyticsCollector.java"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"a360ab92590f24d33ec4b91636a8e637719b91d0b4e855788c9eac6f9a49d4b9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mediacodec/MediaCodecRenderer.java: FileTooLong \u2014 1420 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: MediaCodecRenderer (98-2599). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22d812416faf984d32a288c5651b28dd942789463c507dac045bcc18ee6ad23"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaCodecVideoRenderer: TooManyMethods \u2014 84 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"cde5c60c671634e4996cac8aaecee1a90bb9ac019fd289db27bea014ab7f8e48"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: audio/DefaultAudioSink.java: FileTooLong \u2014 1400 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: DefaultAudioSink (85-2280). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aea050c8ee465069750509d9508e205891ea73558ef04c7b12ad809ad6bf073e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: transformer/DeviceMappedEncoderBitrateProvider.java: FileTooLong \u2014 1393 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b126a0f8a768b3c39bb3700d7c8148fcac190050ffcd1c80f3df4d3a8d6658"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/StyledPlayerControlView.java: FileTooLong \u2014 1351 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: StyledPlayerControlView (197-2150). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"af9cc93d3f11813641f73691e13effeff245ed8c641711e320c4ba27c26a008c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StyledPlayerView: TooManyMethods \u2014 81 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"fdc0236b4ba5e917004b9df87d123d90a3edd0dc969d575a83248f24e1a3c137"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DashManifestParser: TooManyMethods \u2014 75 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9db0529ad8b85799a1789eb5718d755f9b7b1e4a9e6991b3d9b9ed0ef41a0c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mp4/FragmentedMp4Extractor.java: FileTooLong \u2014 1238 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: FragmentedMp4Extractor (78-1914). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68962bd274a122804922bbccc5a3c7ff44313d960c84ba27cff3715fdb9d538d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PlayerView: TooManyMethods \u2014 74 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"c5694f8dfadab1bcc93c44253083d613eaeca4c59f634bf810ee924d4362dac2"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StubPlayer: TooManyMethods \u2014 74 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/StubPlayer.java"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"78f71dad4569872a35ba535646b1202524b0eac825d786db4f4a1f20728bb5fd"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/MediaItem.java: FileTooLong \u2014 1226 significant lines (blank, comment-only and punctuation-only lines excluded), about 98% of them inside a single declaration: MediaItem (49-2302). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5beba659167245e71d817f10d6bc7467f7f234da6ee9f713b1811a0e65af4fcf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StyledPlayerControlView: TooManyMethods \u2014 71 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b363a62fac00fcfc11d6519108d4865b6d9922ae2cbf11a716b41737c5738ca"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hls/HlsSampleStreamWrapper.java: FileTooLong \u2014 1153 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9bb16bce7e96155e5567c188f1b170c0b4cf0b7b380f476b468294a94508080"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: EventLogger: TooManyMethods \u2014 69 methods. Most of these members implement analytics.AnalyticsListener (46 of 62 members), so moving them onto a smaller type would remove them from that contract rather than reduce it. To reduce it, split the contract instead: give each cohesive group of operations its own smaller interface and its own implementing type. Where the contract has to stay whole, move the work behind these members into collaborator types, so what is left here is a forward per member rather than a responsibility per member."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"83ef6bca2641ca164c277cb2752c755a96327993fc79779680793670f9d5cec7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DefaultAudioSink: TooManyMethods \u2014 67 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"1edbad45a1e7b1f1eff52c72abce946d72363c06843fec44a52c702844c6fbf8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 66 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":746}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28042a68f9dfeada89fcada1acd24905e5b1da32b0fba0c19e6d5ed1f8be63b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StubExoPlayer: TooManyMethods \u2014 65 methods. Most of these members implement exoplayer2.ExoPlayer (57 of 58 members), so moving them onto a smaller type would remove them from that contract rather than reduce it. To reduce it, split the contract instead: give each cohesive group of operations its own smaller interface and its own implementing type. Where the contract has to stay whole, move the work behind these members into collaborator types, so what is left here is a forward per member rather than a responsibility per member."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"67a56a9eee5615f776cb1e851e103c404041abe2195e2f0c2394786f3ffcd742"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BasePlayer: TooManyMethods \u2014 64 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/BasePlayer.java"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e995804f34744bc0fcb69b036a1969e17b6d3928eb2606d1075d36d43747c88"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: HlsSampleStreamWrapper: TooManyMethods \u2014 62 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"23e764200362c144659d4f575b696a02405b3c19ff5af56fd792ab8c0c7dcfe0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: playlist/HlsPlaylistParser.java: FileTooLong \u2014 1032 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: HlsPlaylistParser (76-1334). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b6ad19cf4686850253c2ef89b894c56eada4ad4a72a9ed27449cf01dfd19b9f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cea/Cea708Decoder.java: FileTooLong \u2014 1018 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: Cea708Decoder (57-1468). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"347f6dececc935ec49727d6ae6b096c8590ca3f5130e1c506895e443b59d1d86"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dash/DashMediaSource.java: FileTooLong \u2014 1008 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e289e0671663d50ea229165a91864c3f912731bac7003c938c489d525f2cdc1"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ConcatenatingMediaSource: TooManyMethods \u2014 59 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"582484b45983b334eb6ae22c8d1d843fcb6837cb883f75c1e8301411a0b5a1d7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ima/AdTagLoader.java: FileTooLong \u2014 982 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa191b88eaaf3846bd136d2a24cf16740854020f733c5abfb8c53862b9f83c34"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mediacodec/MediaCodecUtil.java: FileTooLong \u2014 970 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e1705de1d1dfb886b014ef2ea29d84e916dde840b5b09bfc28ffc77b53a492"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SampleQueue: TooManyMethods \u2014 58 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java"},"region":{"startLine":63}}}],"partialFingerprints":{"codehealthFindingId/v1":"28fc1059783883fa881a20bfca8d0e94dc85468b062a1471f30e6dd34b893b7c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ParametersBuilder: TooManyMethods \u2014 58 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":129}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5f37307838839974d1cec3b4ec2b7d9b1102897fdfc8bfdd0322e863b80e5aa"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ParsableByteArray: TooManyMethods \u2014 57 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"caa36975cd627ed1d91554516380e8e2368c5d7ea948ca3c61aeb7a62bb92e0e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ima/ImaServerSideAdInsertionMediaSource.java: FileTooLong \u2014 945 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: ImaServerSideAdInsertionMediaSource (122-1470). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaServerSideAdInsertionMediaSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ab4db8d399bdc5946716d4c18fbd0ad7c1a0498ea79e8c0a60e84723393b071"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cast/CastPlayer.java: FileTooLong \u2014 940 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: CastPlayer (88-1506). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/cast/src/main/java/com/google/android/exoplayer2/ext/cast/CastPlayer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0828a525f98b9a427d18ca50adbd1e91049d35d940d858e76fc9ec2950c59472"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DefaultTimeBar: TooManyMethods \u2014 56 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java"},"region":{"startLine":134}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea6023b2693e1f46109485ac131e03de26be681d7ca04a09ffd5a8f9bfaf1562"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ads/ServerSideAdInsertionMediaSource.java: FileTooLong \u2014 886 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d316852f9a61c1a5113477e8c4eb84707d27d83a1fdce744c2df561751b4ae8"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AdTagLoader: TooManyMethods \u2014 53 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/AdTagLoader.java"},"region":{"startLine":89}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1f125e91e1368cc296858d0a2683937f9555b7a4d6eb86047a1aefc6fc4d219"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/MediaMetadata.java: FileTooLong \u2014 875 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: MediaMetadata (50-1459). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1600fa735b8de172db59b10a5a1332af5fddf7702e7dd57e5e18713386925df"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: offline/DownloadManager.java: FileTooLong \u2014 866 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: DownloadManager (78-1415). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a68144e72cbc5d7742e36b6939a912489c484bfd151a8b8fb761b2a0be781181"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: analytics/DefaultAnalyticsCollector.java: FileTooLong \u2014 851 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: DefaultAnalyticsCollector (76-1207). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/DefaultAnalyticsCollector.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c7754334e0b7207f9b4031b724d1aec29ed7526d94ea8288da733b251f9bcd4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/StyledPlayerView.java: FileTooLong \u2014 842 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: StyledPlayerView (180-1687). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f4ccccbda6163ebd7f3dfdf0a485d7c1eb0e9b0c3126a0d07a7cb36bcf3c2bf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PlaybackStats: TooManyMethods \u2014 50 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeab9b77b880200da69a2977a392d3553183f7017735150e946e0fd4afb854ae"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dvb/DvbParser.java: FileTooLong \u2014 828 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"24bdd9eb6fcaeff8bb0bab8a41f21db05fbce4df177249e333128cab94ce1c72"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SessionPlayerConnector: TooManyMethods \u2014 49 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f649eacdf72c7f4641b12bd0a197e9d11df681d27724bc352aee8d13e0a94f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DecoderVideoRenderer: TooManyMethods \u2014 49 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c0757189c6a110ac662d28fe4f998f64b8fd4ac86d1f3244be0e5846a411f4a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PlayerControlView: TooManyMethods \u2014 49 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"607213892837a0e5a6fa7579008ae79d068ac911378b69d3a8f8ad6ffd6826d0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/SimpleExoPlayer.java: FileTooLong \u2014 812 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: SimpleExoPlayer (61-1334). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"03bd6765cefa23c02bf148903b3625e12f9153404f86a6bc8d3faa72dcfb7244"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PlayerWrapper: TooManyMethods \u2014 48 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerWrapper.java"},"region":{"startLine":59}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcf09ace0978dd77237f0c268ff9f09156478a6b2637b352741e53211e5c0534"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FragmentedMp4Extractor: TooManyMethods \u2014 47 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"339f6ff93b86be1bb9bd7ebc46b857abee101a2508b57887f9b9c7ba738f8bed"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SpannedSubject: TooManyMethods \u2014 47 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"95eb387391d57553cbb9ff62d2e990b4bda5a7a3fa7760828712e2631df7ec3d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaCodecAudioRenderer: TooManyMethods \u2014 46 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9841ef2e41afb4c9bd193133edbf3f4a8961ad6a1c5542ba277350988d34943"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 46 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/ActionSchedule.java"},"region":{"startLine":106}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcac984726603a2a904cea099a12d2df48fe1156a77ea471540910df6db27c99"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: source/ProgressiveMediaPeriod.java: FileTooLong \u2014 765 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e5d55aacc885509970385a74906ab9e48d12828723656c67297761112bcefee"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 45 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c6c77b6b01a7b25c84d3ff5f5004bfa5249b4a125553f3be77aa0b50b1b16a0"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: BaseRenderer: TooManyMethods \u2014 45 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/BaseRenderer.java"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"c23edae3ca4cfa34a396cdbe15cd9fd7e6b4d5a36c1d827fc0617ad15d377676"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dash/DefaultDashChunkSource.java: FileTooLong \u2014 750 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: DefaultDashChunkSource (71-1048). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e52b27023afc5b7e132b575044bfdbcfcf48a0ba6704ebe850749494a6c7066c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/Timeline.java: FileTooLong \u2014 745 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/Timeline.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3db0d86395656e3e5143a619af0e54be19ab805eef6424d11d2fb426191048f"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/PlayerView.java: FileTooLong \u2014 743 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: PlayerView (259-1560). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"425e7e0ba2233a6a896764efa66ec1b1e6b39d6bae798fff977bc0a77d004c12"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/PlayerNotificationManager.java: FileTooLong \u2014 742 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: PlayerNotificationManager (180-1580). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa95f0a91e9ce07d806231c3e070580d83d9f24674b193295a02b5b679b80a42"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/PlayerControlView.java: FileTooLong \u2014 736 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"45990d4f0763263938ba8778b6e9ced6aed4256e470eee7a7ed81b22334de010"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ProgressiveMediaPeriod: TooManyMethods \u2014 44 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java"},"region":{"startLine":80}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee4f8525875d3dd61187e7cfdbe67d0d9dc70775098939f3e27b7c7872d83736"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Boxes: TooManyMethods \u2014 44 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/muxer/src/main/java/com/google/android/exoplayer2/muxer/Boxes.java"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cb70c704cb187e674f504431e89dc2c1a05f774c08ee8cf1bc1de734e924b1e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mediasession/MediaSessionConnector.java: FileTooLong \u2014 728 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: MediaSessionConnector (107-1438). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"20441098d5ff9c97ec173f4966a504f12f9a794ae002b5285c8e5ca68528c94b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: dash/DashMediaPeriod.java: FileTooLong \u2014 723 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec5897d30f3628b3c61c4960022703c2704fbe376e0e88925652dd6b5246aeaf"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ads/AdPlaybackState.java: FileTooLong \u2014 713 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: AdPlaybackState (58-1235). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"60ba6ccd87c65bd97d31550e3fccfa5ca8c937e15a15f8b5c457590194947c56"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SimpleCache: TooManyMethods \u2014 42 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"73cf300d3f5ca781b254129b4ae8001cd7e9228d0cc3c5a3cddd51f55eb5f258"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/Format.java: FileTooLong \u2014 698 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: Format (126-1453). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/Format.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"78c89d55cbf726ac97bd7dd8a8e47c41ba03c17eee1bc3002f58849862fa3909"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 41 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaItem.java"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd61c67c72b188f48196f051175a12e2b742471b1f53ec6841ce1d1c67cb49cf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 41 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":53}}}],"partialFingerprints":{"codehealthFindingId/v1":"df82d37d182aeb584c2b46add7f6e59d8c2dbfb43d20991bdf35d5a193b4efbf"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaCodecUtil: TooManyMethods \u2014 41 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"2dc21589095f6e0c9ea8c22e795762782478b0c2f524da548ded8903884f7d6b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cronet/CronetDataSource.java: FileTooLong \u2014 674 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"555b860fc4566ff6d96e886db1e729b699bdaa578ffa545d512f4d048e2c9309"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: analytics/MediaMetricsListener.java: FileTooLong \u2014 672 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: MediaMetricsListener (94-900). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e14dd8a6d7a0853439db962b1e9412003f9884e86872d3944c5881d4c8f1f10"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: webvtt/WebvttCueParser.java: FileTooLong \u2014 670 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: WebvttCueParser (73-991). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed2ea13d71c0bbf38b48c8ae6aff2848a2bc799a84815d0508a8b05bd9ee3835"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ForwardingListener: TooManyMethods \u2014 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java"},"region":{"startLine":933}}}],"partialFingerprints":{"codehealthFindingId/v1":"e957a144398d42a22a1e995bbb12b57e2e2713bc04fe46e9c9afd56910076522"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DecoderAudioRenderer: TooManyMethods \u2014 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"97f4a119419b6279e52b56b3ff95fc63ed033f5923789f2b5028b7cd99110830"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DownloadService: TooManyMethods \u2014 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"8a5afa8887edec26cf7bc6f51e4dcdd096471b75165d54bdb043a487cfe806d9"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DefaultTrackSelector: TooManyMethods \u2014 40 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87ae37b4791af33e656ebf2fdb5a3814fba59e2b27aac48bd22ccbbca84d3ce"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hls/HlsMediaPeriod.java: FileTooLong \u2014 655 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: HlsMediaPeriod (73-942). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ab1e727128857158b2836671b040c1ad1571ad7f2aeb29189018ead88cf27e6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ttml/TtmlDecoder.java: FileTooLong \u2014 651 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: TtmlDecoder (75-898). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db24ac1f13f1ad8643d301787790675bfd2890aff468ee1c2e4d8495e921a447"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 39 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"9eda8f8df480e71a518b3822e46a85ba6eaaa0af1b8d11edf78048400c3e1a8a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: GlUtil: TooManyMethods \u2014 39 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/GlUtil.java"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"bbcd4c5220085f3c7df465bb927f767f4684e6956aa9b8847561ef360601342c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ComponentListener: TooManyMethods \u2014 39 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java"},"region":{"startLine":2892}}}],"partialFingerprints":{"codehealthFindingId/v1":"5503a3a6ccb4d24434cd59bed89af4650ab87a63cca570c1e003ffe8836a9d53"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TtmlStyle: TooManyMethods \u2014 39 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlStyle.java"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"629737f1e5c507aeed9cc66b1a040a1608f85060e4ad047d91a14a583262c86c"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: upstream/DefaultBandwidthMeter.java: FileTooLong \u2014 649 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: DefaultBandwidthMeter (48-882). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bab1863bbd9634972e02e9a723315b899447c8d062618ba04e628e1d1ffb7e38"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: muxer/Boxes.java: FileTooLong \u2014 637 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/muxer/src/main/java/com/google/android/exoplayer2/muxer/Boxes.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f9eecf38b02274231f9c78e59e31ca86e23b6b8470ed2a28cf21345ce638553"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaPeriodQueue: TooManyMethods \u2014 38 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"e05fb9a3474995e7c84e9212603ed1e97750a7b3320b01c03f2735dc2d1dfe73"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/C.java: FileTooLong \u2014 622 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: C (55-1341). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/C.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"225bd26b7b8c0f0ce8a27f37b96fe71ed0c749b30287a329135ad5163cc1dd6e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ui/DefaultTimeBar.java: FileTooLong \u2014 621 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: DefaultTimeBar (134-992). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff32046580f0156c271df7e12281bdd4e9777b7366be76c588cb84c4d1302e9d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: experimental/ExperimentalBandwidthMeter.java: FileTooLong \u2014 617 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: ExperimentalBandwidthMeter (50-838). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f382c8f0d037dea0d7db6fc9da1a1abfd98f5d5b923ba68eeb7f82b6713bae04"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaSessionConnector: TooManyMethods \u2014 37 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/mediasession/src/main/java/com/google/android/exoplayer2/ext/mediasession/MediaSessionConnector.java"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"0acfd339698bb92356333093fdfe4d29459f35dd90be8752ca5d237783773ee5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaMetricsListener: TooManyMethods \u2014 37 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9ba6941b9613cafc335f567a023108c989c08ab7f705ea1d98dda7c28a4ce2a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DashMediaPeriod: TooManyMethods \u2014 37 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"33b9f6efe1edca353c0910a4fbbde2c00d35300bdb7c5001acb0011cf6a1210d"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MatroskaExtractor: TooManyMethods \u2014 37 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"87d3f129928f3fc38bac4d5067cec8457dba92c535531dcbab6889e9e43447a8"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: truth/SpannedSubject.java: FileTooLong \u2014 616 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: SpannedSubject (56-1269). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"be43b8daea66909ab1308f12a6997897fe08ff6aa1fcb17fa29f966a918cbc6a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: hls/HlsChunkSource.java: FileTooLong \u2014 609 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"94c6c3f76fa42d4f21ffb64461072e16bdb33f25c52f724c2d687cf7baac313d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: ima/ImaUtil.java: FileTooLong \u2014 608 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a17df5b4c135a12db6d3a9021264bbc8ba913bff04d149b1167dbb3d2af6e5e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: mp4/Mp4Extractor.java: FileTooLong \u2014 606 significant lines (blank, comment-only and punctuation-only lines excluded), about 93% of them inside a single declaration: Mp4Extractor (71-974). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"206f9d8b376c879fe62874367bf2f473091c1571fa0e0fbfa84b554fee90f507"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: util/NalUnitUtil.java: FileTooLong \u2014 605 significant lines (blank, comment-only and punctuation-only lines excluded), about 99% of them inside a single declaration: NalUnitUtil (36-968). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ca583b8ad7f8b32399ad50a255520e744c9431b309ea49ff3f144443d42ca7"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 36 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/Format.java"},"region":{"startLine":137}}}],"partialFingerprints":{"codehealthFindingId/v1":"455fa84c4d56a403d70c8488043b2f82f5def564654e86f4653df54ec136dbe3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AdPlaybackState: TooManyMethods \u2014 36 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/source/ads/AdPlaybackState.java"},"region":{"startLine":58}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ff2561c104b02e8d0354f75c48e12586afeedfc55766bd57eb59225f68afdc3"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 36 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d3e103b038eb635f1dd65ef007e2290f2055a7137638d471a216c4cce6cf8f6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: MediaCodecInfo: TooManyMethods \u2014 36 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"278c3143db761927e4756f856c3dc0948b6d6cc1857afc85a4ded0ecd9a22f4b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: analytics/PlaybackStatsListener.java: FileTooLong \u2014 596 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: PlaybackStatsListener (64-879). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"93ec86bba234c7444d286cbf16b44c607b644207edbf02659b204a2baf04a044"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: id3/Id3Decoder.java: FileTooLong \u2014 595 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: Id3Decoder (46-897). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b94b4b4a7fec8a61d219d7688cdbd80d51e2d2308feb94f2ad0ce6d52e342e2d"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: playlist/DefaultHlsPlaylistTracker.java: FileTooLong \u2014 594 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: DefaultHlsPlaylistTracker (60-869). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecd0783551c53393d734132975f529e2bc833bde31f734ec71e6507691915239"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/MediaPeriodQueue.java: FileTooLong \u2014 587 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1cf68f584904e26ace5ae2269c743e7250dab923a0abc7cf0f7eced7c230bbcc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: audio/MediaCodecAudioRenderer.java: FileTooLong \u2014 587 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: MediaCodecAudioRenderer (94-978). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7773738b32098af2a901bb65633e5b1093f9a013c979e89bac78dddef70d1677"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: offline/DownloadHelper.java: FileTooLong \u2014 586 significant lines (blank, comment-only and punctuation-only lines excluded), about 90% of them inside a single declaration: DownloadHelper (99-1071). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"4efdf0a8386cc8985e8b7f9b70ac2d9cc6bed005848c12e0a4a1815ad257b1f5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DownloadManager: TooManyMethods \u2014 35 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"896269124d78feb48ef4982dccea9d3d58ef692a080917382df95604d13cf7f6"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: SharedMediaPeriod: TooManyMethods \u2014 35 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionMediaSource.java"},"region":{"startLine":627}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb7002be4563b3ce878de4125df7a6d9e60f9567785a88dadad56138a628fb17"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: exoplayer2/ForwardingPlayer.java: FileTooLong \u2014 577 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/ForwardingPlayer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c907acf93892d2ff01a5d1325ab06ef740c4c77177886b4fcb0618d50649cf37"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: trackselection/TrackSelectionParameters.java: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded), about 95% of them inside a single declaration: TrackSelectionParameters (75-1173). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelectionParameters.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"10f0919591ef86cc7c60d1fa305107bc4b367ecc0f16d0b337eeec229fa0647a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: source/ConcatenatingMediaSource.java: FileTooLong \u2014 569 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e92bae73b3feb59ba99c27bb844d3f4e0a1c79d0b2ceaf007f1830b9072da66"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FlacDecoderJni: TooManyMethods \u2014 34 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/flac/src/main/java/com/google/android/exoplayer2/ext/flac/FlacDecoderJni.java"},"region":{"startLine":40}}}],"partialFingerprints":{"codehealthFindingId/v1":"eba3ea2be09de88fee78b91277893f9a0090eef0dc2094430cf538939dc4d5c5"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: FrameworkMediaDrm: TooManyMethods \u2014 34 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/drm/FrameworkMediaDrm.java"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f3c51e645b4e68a75fc8f1e7e535d86ea85eae5fa36164172324842bcb0ed9c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: PlayerNotificationManager: TooManyMethods \u2014 34 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerNotificationManager.java"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"6420d4a5b4a5d6ddfcb5a35c31793b0e263adfbf506dd967775f4e55f2401237"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: source/SampleQueue.java: FileTooLong \u2014 562 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/SampleQueue.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3afbe9c275e84ef7a7a8d432e04cbcca89bfaeb0f76bbdb47acbac0efa28fbcc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Builder: TooManyMethods \u2014 33 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/text/Cue.java"},"region":{"startLine":417}}}],"partialFingerprints":{"codehealthFindingId/v1":"439c2347d00992b479fdd39b9df17e566a7033b7d480fa97aee1a422c87ac9ed"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: NoSampleRenderer: TooManyMethods \u2014 33 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/NoSampleRenderer.java"},"region":{"startLine":36}}}],"partialFingerprints":{"codehealthFindingId/v1":"315ba6acbc16f68839e90fc3981ac2cc7da7fed87adbbcdf5e4031ce75dd17ee"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DownloadHelper: TooManyMethods \u2014 33 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"985250470e49e3729e85996d7e0bf963481fd2ba7065307144ebb37df55fb45f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AtomParsers: TooManyMethods \u2014 33 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"98ef89580b137f7a845923b4fc544e14b6781006a11129b3c45249e3e25c855f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: TestUtil: TooManyMethods \u2014 33 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/TestUtil.java"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"896c00a93c77341b8b820dd73b957b5a562aaff0b3f57ed471a71f29c81d37c7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: chunk/ChunkSampleStream.java: FileTooLong \u2014 550 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: ChunkSampleStream (61-893). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6df0045637fd71be9a64b4dea00593f8a1c8ada9fc86178ff56b1d9b670203d7"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: cache/CachedContentIndex.java: FileTooLong \u2014 549 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"786c36920d4d5aa16e8621b7ea6dbbfad607e8df220b8e2d94cde14554b9b3bb"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: audio/DecoderAudioRenderer.java: FileTooLong \u2014 548 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"027e7e9ede1f65b6d797b776c49f6ac8bd74f9961b7d3917050064c8e017f1db"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: video/DecoderVideoRenderer.java: FileTooLong \u2014 542 significant lines (blank, comment-only and punctuation-only lines excluded), about 92% of them inside a single declaration: DecoderVideoRenderer (82-976). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd24bdf3099cf66daf50aaa5b98b2a23f54eed45f503900a45f936af949ef15e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: manifest/SsManifestParser.java: FileTooLong \u2014 542 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: SsManifestParser (62-806). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifestParser.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eeb830fe1f5af05e9ba539077fa57289e122f504e0929c6e7c8a31f858a4e721"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: testutil/Action.java: FileTooLong \u2014 536 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/Action.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"74371bf31141b3e457396f14e6701c267741161898fd200ce2b4c10187da8aef"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: upstream/DefaultHttpDataSource.java: FileTooLong \u2014 535 significant lines (blank, comment-only and punctuation-only lines excluded), about 94% of them inside a single declaration: DefaultHttpDataSource (69-915). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"183662b3e92ab00841001d7bc20d14cac8f2bd9dca9035a6509897e966cb8b80"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: drm/DefaultDrmSessionManager.java: FileTooLong \u2014 534 significant lines (blank, comment-only and punctuation-only lines excluded), about 91% of them inside a single declaration: DefaultDrmSessionManager (76-990). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"32b3147a13404f56d3b8341f061c5259c43da09312eb788125c70bbcb6a950cc"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: ChunkSampleStream: TooManyMethods \u2014 32 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0cbc061951651ffb45c20b0876ab2e621a22733e7a7d64f69ae4138c8c3de77"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: DashMediaSource: TooManyMethods \u2014 32 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f04122885a20ce119d4096ced30f9743f5a03e02eed4d7657663becc25184a"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: analytics/PlaybackStats.java: FileTooLong \u2014 533 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: PlaybackStats (44-1110). Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3946e4ab7c411330638e3a765b1d6f714c7c1ddbff7a817ab5aefafede9cedf5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: transformer/TransformerInternal.java: FileTooLong \u2014 524 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformerInternal.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa9c851197ed1f9c41ac81cb9e484a8b72ff52f77ff903fec69aa6896e299efe"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: rtsp/RtspMediaPeriod.java: FileTooLong \u2014 522 significant lines (blank, comment-only and punctuation-only lines excluded). To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaPeriod.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fca3aea0f10a19f97a1af7b93f9a1aa647528a1f7d06414e20c46180caee6254"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: StyledPlayerControlViewLayoutManager: TooManyMethods \u2014 31 methods. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"410a1dfcb802594cc76272908c7727840cb307b51ef12a38d0d40bc5b576951a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 5): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:496-518 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:730-752 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1097-1119 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1208-1230 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1258-1280 \u2014 all 5 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:496\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"5dcd09c1e7465c2c92fbae8624b95d7bf369713ed396d17e952bc2563b3f5bbc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:130-152 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:397-419 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:130\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad92568049bd49b7282b1c786f36702785f30b682dd68c800a3e749fa1347499"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:246-268 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:806-828 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:246\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb272dea8deb5f44109dfb5ced9608fa8b3f5ebb7330c6169acd443af5d1f03a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:759-781 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1112-1134 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:759\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":759}}}],"partialFingerprints":{"codehealthFindingId/v1":"19cb3e3e6f82297548d5bc25f0500dc2fcd59c9c47a1a9c13e8a9679c49cf8cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (23 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1224-1246 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1514-1536 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1224\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":1224}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b6b7293ad581bde2ef031ac7e2e0f80d7e1530d168323343faf57a7aeb3cd06"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1235-1256 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1326-1348 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1235\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1235}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdd22cd2fccdb1c36ce3746de1cad46ce2abf099a6805700db185a782617e71e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:84-105 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:805-826 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:84\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":84}}}],"partialFingerprints":{"codehealthFindingId/v1":"56a323a1183f11d68c6afaaf3622c467574ab87ec7348a924df169f45345d812"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:902-923 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1152-1173 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:902\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":902}}}],"partialFingerprints":{"codehealthFindingId/v1":"b63ec95eaf65c0653f882e1d0d0f968ded5e35611b1825ca5e95e13fcc154742"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1025-1046 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1069-1090 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1025\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":1025}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb5f657f2f76f287633975a540c12870f9be8ede51c71da308eed70358d9a7c2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 3): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:927-947 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1024-1044 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1068-1088 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:927\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":927}}}],"partialFingerprints":{"codehealthFindingId/v1":"e36b3ab5a986ca902900c8d892ce1df33c4baa669a73d6efb5919ac4ac8e3576"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:422-442 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1371-1391 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:422\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"95f2d17dfd2e808b1759977ad0995a491f602fa945ec3821a6885de3ee9be338"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:677-697 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1563-1583 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:677\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":677}}}],"partialFingerprints":{"codehealthFindingId/v1":"32b6267fc9a2ac5eda36671498084c8e75b31fc35ebbd2c943a0a0f03a21c5cd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:701-721 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1014-1034 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:701\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":701}}}],"partialFingerprints":{"codehealthFindingId/v1":"3893af3508bd2dab3d545675559a7c778a2062f58c88d51a71664552c79450d6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:964-984 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1017-1037 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:964\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":964}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3e038a293d39f16b21a2276700a54bfe13e447fc71acd45ca5c6ed3cc375a0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (21 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1138-1158 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1175-1195 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1138\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":1138}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66823358b1505890278f1d6e2bd3abf0a7e2bab2837e45cfa5bf9919df679ae"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 3): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:210-229 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:784-803 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1520-1539 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:210\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"b22b8a5c37a2d7dd2167455efd6edcf662d680227f8d8d9080ba62b7fd0a17cb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:484-503 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/FlacStreamMetadata.java:331-350 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:484\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java"},"region":{"startLine":484}}}],"partialFingerprints":{"codehealthFindingId/v1":"b813c3910fbe6348dffaa08265a2b429c34b135934973c04089035166c48f7c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:828-847 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:1134-1153 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java:828\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DeviceMappedEncoderBitrateProvider.java"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca6c979177fff49d96a5f5728d7b991d2517bf4b05d98f7b6cf46da24655d43c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:492-510 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:727-745 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:492\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"093318fc48a798fd6471fd3291fa8e7425f11020739dbae25e29b4be36c3afaf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:445-463 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:429-447 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:445\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":445}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c31a8e62302b135e223749588c0add9e61a6c2eb2b9595e751f729b092f608f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:707-724 | library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java:685-702 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:707\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":707}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9562514eda60f778068afb85503bb7fcc9fd8f892aa00cd270b47d7c956a3c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java:136-153 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.java:146-163 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java:136\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6a92e1035ad37d2331e53f4f737b45b2d4cfbb3db02cda9c0a5486ba34764dd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:778-794 | library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java:390-406 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:778\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":778}}}],"partialFingerprints":{"codehealthFindingId/v1":"bff33ed20a241695641a58586228b7bbf4e927e32b917e639bb5df33c13bf908"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH264Reader.java:119-135 | library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH265Reader.java:113-129 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH264Reader.java:119\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH264Reader.java"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"f11126259d82fbce8b0daf90154d142de2df4d9670de7db48fbce28a6389a572"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH264Reader.java:270-286 | library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH265Reader.java:235-251 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH264Reader.java:270\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpH264Reader.java"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"b85ba3505ed96c3f2b1a214518712338704f404a6ddc4b796dd7784fb4b6bd57"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java:374-390 | library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java:420-436 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java:374\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlDecoder.java"},"region":{"startLine":374}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a65db3b1bc409a43ef4e2b4f938355f80f1ec0b0eec4892ce263b3fa5b6a34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:388-404 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:415-431 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":388}}}],"partialFingerprints":{"codehealthFindingId/v1":"daad04c1fe91959eb33b2f3ea62ec3836c010ca9ea53fc029d32ca647cf67192"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:486-501 | library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java:724-739 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:486\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"506eaa70547d8a694465a5f14a1e9482e376097e497ce15f4f6876bcf21d9510"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java:306-321 | library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaSource.java:339-356 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java:306\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaSource.java"},"region":{"startLine":306}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3cb826ced6ea772bfb8721dd73745412f8f1def8193233b605dd1219c6134d1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1282-1297 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1475-1490 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1282\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1282}}}],"partialFingerprints":{"codehealthFindingId/v1":"881892be2e0df22f2895236f2907f48417d4ec00710dcba7e3b04d6497d853d2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java:1198-1213 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java:1563-1579 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java:1198\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1198}}}],"partialFingerprints":{"codehealthFindingId/v1":"49236eadf16257d1572d97ae85eb3238569fcc0fcb3f5ebc30ca4e85e7e91bb2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:153-168 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java:167-182 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:153\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"bcf816d54e42f69c63cac24b817e4f445c33f13684bc5b25adeb838f8bda36ea"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java:155-170 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java:158-174 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"65518589e49e05d62cf5d11534b0dfa058639cfcbdb1c53ac7e4c6a42bf451c0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp8Reader.java:127-142 | library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp9Reader.java:127-141 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp8Reader.java:127\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/reader/RtpVp8Reader.java"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"50e30d308971a83273f036a42be11244d2fc9a4545bb65d5d4a3191492e84867"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java:112-126 | library/extractor/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java:685-699 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java:112\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRenderUtil.java"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0a7a350d1ad23be64c1cd7a232a33ab35fb34187ed78036c506e47bd6d9e57e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:328-342 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:305-319 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:328\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4132b493d43e4e29509cbcffbcedde02b3e2d89d53e4081b09960041f1afb66"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java:229-243 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java:251-265 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java:229\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"e107099aea8afb6b20234e65fe1a2ee228af9f5a26c0d0d3747a5a8eb7fc352c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:782-796 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:826-840 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:782\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":782}}}],"partialFingerprints":{"codehealthFindingId/v1":"4128f8e946208137bd76ed5ab36bdec56a7734142967fe0502050ec6c5eed5d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PesReader.java:250-264 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java:397-411 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PesReader.java:250\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PesReader.java"},"region":{"startLine":250}}}],"partialFingerprints":{"codehealthFindingId/v1":"052dcfa73be2d46ab84ad4b00c8316fab71b7cf1dbae6bb012552787c4c0b184"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:393-407 | library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:418-432 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:393\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java"},"region":{"startLine":393}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d985544491eb7ede5dac242ed5a460601c0f2d88738aa0f6f5b01299025cc3c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2569-2582 | library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2587-2600 | library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2605-2620 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2605\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":2569}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae53a5aea58a3c6e9967f7ead8d34ff8fe3955c3404a2511ae73ab8922372803"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 3): library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:483-496 | library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:502-515 | library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:521-535 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java:483\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java"},"region":{"startLine":483}}}],"partialFingerprints":{"codehealthFindingId/v1":"43ae0333d8fced6558952c2378b30533ef017a6d4dc66a38bfcd947732c56870"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java:330-343 | library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java:414-427 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java:330\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java"},"region":{"startLine":330}}}],"partialFingerprints":{"codehealthFindingId/v1":"3865aef36668e348b756d7baf0c4e4e72b1455f2ad973eb693387e2d416dd846"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java:425-438 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java:851-864 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java:425\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java"},"region":{"startLine":425}}}],"partialFingerprints":{"codehealthFindingId/v1":"77701e945f575e2fdba917f7478d2ba51c3d3c914864fada2e6f09117a9f9bd8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:779-792 | library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:837-850 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:779\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":779}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f7a4df7f24a5301873de9e327f37d83fd715adfff9ba73734d02222a4be0b7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java:809-824 | library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java:1768-1781 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":809}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f873dd51129501af6c9a4ec41be9342b4e76c7c183ab2b1d33c6b4a074a135d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:477-490 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:463-476 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"72ffba99c1cab9984129c79f6b3d58462ca55eb146c8c695588e9c45e227de87"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:585-598 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:573-586 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:585\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":585}}}],"partialFingerprints":{"codehealthFindingId/v1":"d7ff2b3a88fb3e4b7b2344aa7e1aba2ec9a7a4ca3d3136e8d55eea9ff8ab0f04"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java:150-163 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Reader.java:152-165 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java:150\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Reader.java"},"region":{"startLine":150}}}],"partialFingerprints":{"codehealthFindingId/v1":"a559da4d718b61cad17878817b3c2d0e0f093a4cca3b4b6b60b0dbb586ef9a6d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java:725-737 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java:775-787 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java"},"region":{"startLine":725}}}],"partialFingerprints":{"codehealthFindingId/v1":"8983a13c24d858edb6304a1fef0e5a6551654a627bd876fba92f74c59b3363c5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java:316-328 | library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java:517-529 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"dab8342db87100e551dff76baac4cf57467eb4b6233a95f32fc7dbf697a2732e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java:70-82 | library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java:384-396 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java:70\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaDialogueFormat.java"},"region":{"startLine":70}}}],"partialFingerprints":{"codehealthFindingId/v1":"61efd91266523a108b7229d31290bc5d22ee56c1b003c2440f9967214368af41"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:908-920 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1100-1112 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:908\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":908}}}],"partialFingerprints":{"codehealthFindingId/v1":"384d34ea32ee3db30a463b0bc1a24bf112d6adfac435ebd04a26b223c15dc51b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:797-809 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:803-815 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:797\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":797}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cc332caba31998aa7b0ebafe5543b57c1530425234a59b97168a3fc1e636e04"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1491-1503 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1606-1618 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1491\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1491}}}],"partialFingerprints":{"codehealthFindingId/v1":"aad4d66707c8bce772b84e1eaeb0613651da1c7d16f4f3768723bb91d4e3380b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java:131-143 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java:169-181 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java:131\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlViewLayoutManager.java"},"region":{"startLine":131}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb00215702efaaf177b40afa9c7f2aebde6bbf4630965d66d3bbed72e4cf004b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/effect/src/main/java/com/google/android/exoplayer2/effect/ColorLutShaderProgram.java:61-73 | library/effect/src/main/java/com/google/android/exoplayer2/effect/HslShaderProgram.java:59-71 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/effect/src/main/java/com/google/android/exoplayer2/effect/ColorLutShaderProgram.java"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"44f2284e9b72e85bd2f349abd963575ce6d79f1f74ceede1bc6abbf71b17aee9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java:79-91 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac4Extractor.java:87-99 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java:79\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/Ac3Extractor.java"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a87ab5f1d7f8748973a1105429899dc5d4ef1dff39c9a57a6e53495752021ab"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:234-248 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsExtractor.java:111-123 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:234\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"06c0710a0ea4b2f97c64af7797dc0b2830cd886aacb5bacfdcc1ea306100166b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java:156-167 | demos/surface/src/main/java/com/google/android/exoplayer2/surfacedemo/MainActivity.java:200-211 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java:156\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"demos/gl/src/main/java/com/google/android/exoplayer2/gldemo/MainActivity.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"72b9b20ab77c89dbaf10bbc3d7bb107383ad8ab35a466a65a7d3cfc3f11bad92"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java:537-548 | library/datasource/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java:772-783 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"f40dc69422560e23f5637765e3eeb5bc4c26be8d0cedf2248d0883719dd4fa59"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:667-678 | library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java:751-762 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:667\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b04d1a2f8a4602019bef8650dd31e750f003fc6fa0150a48a5c8a382eb9989"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java:125-136 | library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java:189-200 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java:125\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/audio/MpegAudioUtil.java"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5ac210ba0cb55e2b2aec88b76817fc81e4fb6b57a33af75ef1f7679c1c52c7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java:453-464 | library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java:513-524 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":453}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce3daa3d1b7bac23878e17ce7d35f9ff1e08fd47fb4b52abe4912a000578df89"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:422-433 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:704-715 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:422\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3e0ea5141ee3743031f988baaaa2a3d98e2f1aad7ee665411a757ac8404366c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:536-547 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:657-668 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:536\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcd2ba135271529814396f6e2ee7f2ff9e6a5ced4f43d75cdca02af094489def"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:859-870 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1011-1022 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:859\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":859}}}],"partialFingerprints":{"codehealthFindingId/v1":"f921148276e32cce5f356963b7c5e295cb9880d1d223dd4cfca19b462dd88e70"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1106-1117 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1381-1392 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1106}}}],"partialFingerprints":{"codehealthFindingId/v1":"08cbcc50fa9eb1c837216f704ba4dec66339df7e1a1f5dd643ce16a7992f513b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1190-1201 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1486-1497 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1190\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1190}}}],"partialFingerprints":{"codehealthFindingId/v1":"69d1f6de77a39d887751153fb546c00bd38e26e1bd591f06218a472a7cc6437d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1149-1160 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1234-1245 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1149\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1149}}}],"partialFingerprints":{"codehealthFindingId/v1":"d8b62d4878e4480497b050263d644358752b5d673119b6a92f9df299e8f6afa1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java:477-488 | library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java:646-657 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java:477\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"31fbc5d3b057b3149942b9058b1ee02cac9f39a0afeda6b15fe035ea2fcce735"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:739-750 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderUtil.java:397-410 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d73f7e9ce96154944484f05d607068a2b42470f9a1bb8b83fc340ff0015ee2c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java:368-379 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java:372-383 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java:368\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/FragmentedMp4Extractor.java"},"region":{"startLine":368}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d9eedb5bbc94b6120bc02de37a13edaa42948874b0bc3b4023abfe72ffc90fd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultDecoderFactory.java:74-85 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultDecoderFactory.java:131-143 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultDecoderFactory.java:74\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/DefaultDecoderFactory.java"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"91b3304884cbec4136382449043c576673ddb40d33dfdfdd41449988c45ea32b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java:328-339 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformationResult.java:359-370 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java"},"region":{"startLine":328}}}],"partialFingerprints":{"codehealthFindingId/v1":"7980cb9b034bc051288a406ca8712d51696334a28dad5212dcad161da0245ddf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:157-167 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:424-434 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:706-716 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:157\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8914995e2ea3eb1d065ecf68121e2ccae5eeca7bc14664e085a57d8e13f272d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3): library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java:128-138 | library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java:177-187 | library/datasource/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java:256-266 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java:128\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/AssetDataSource.java"},"region":{"startLine":128}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf7880a0ab67a1f238bb78f5195a8b2859f360752e97994f6cd8def53de9483"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:298-309 | library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java:191-201 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java:298\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"09e247dbcacc97e9119fb6ac85bb0a0a848f759b25c30e968dc6d97631075fa4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java:654-664 | library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java:697-707 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/id3/Id3Decoder.java"},"region":{"startLine":654}}}],"partialFingerprints":{"codehealthFindingId/v1":"49702b5c74dc7ed0c2ba5b9f9d7a426901d5d4bf2a25f4a6a64c3d3c4f328176"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java:127-137 | library/core/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java:100-110 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java:127\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java"},"region":{"startLine":127}}}],"partialFingerprints":{"codehealthFindingId/v1":"28dd8bb118da57e6a5dbfa5e9477bfb9a50383ee8af1bbf5d571d7cca368be0e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:341-351 | library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java:298-308 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:341\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":341}}}],"partialFingerprints":{"codehealthFindingId/v1":"64632c500ce6eb94126686ffd8606e2f6c28ec9b8e02250007f827a93be82c46"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:989-999 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1229-1239 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:989\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":989}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ceb6b9ad55356fa82c7b2cb75f096e3b962046efa40d8b21da695c9c4be4905"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1053-1063 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1290-1300 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1053}}}],"partialFingerprints":{"codehealthFindingId/v1":"155464d5b9150681b31152277b2491a3ce31c975ae483c8abe9926ffb1eca4c9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:697-707 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:701-711 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":697}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a9d38fec3f4c65f6809f7b16b10c89af02d51ca9a9c96ee72c50b7a5622307b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:259-269 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:249-259 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:259\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":259}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1ad9bc66639cf31f045e10f4cea295618c0c70c22ff301298d97b864c4d5f8d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java:177-187 | library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java:194-204 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java:177\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"377a664fd2729a805b20fc9425515041d2c1ee32641bd487dd22083178359a19"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsBinarySearchSeeker.java:115-125 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsBinarySearchSeeker.java:119-129 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsBinarySearchSeeker.java:115\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsBinarySearchSeeker.java"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66c3e6c30a0c913ab576db6cf5c9dbb85eab942c34753c5977b9bb8a151fd2f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 27): extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java:156-165 | library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java:2045-2054 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifest.java:112-121 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaPeriod.java:141-150 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java:211-220 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java:341-350 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java:149-158 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java:230-239 | library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java:137-146 | library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaPeriod.java:86-95 | library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java:187-196 | library/core/src/main/java/com/google/android/exoplayer2/source/SinglePeriodTimeline.java:296-305 | library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:1048-1057 | library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java:151-160 | library/extractor/src/main/java/com/google/android/exoplayer2/text/ssa/SsaStyle.java:351-360 | library/extractor/src/main/java/com/google/android/exoplayer2/text/ttml/TtmlRegion.java:67-76 | library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java:94-103 | library/container/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java:151-160 | library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsListener.java:470-479 | library/effect/src/main/java/com/google/android/exoplayer2/effect/FinalShaderProgramWrapper.java:143-152 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Track.java:106-115 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java:557-566 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/VorbisUtil.java:110-119 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java:311-320 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformationResult.java:342-351 | library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java:250-259 | library/core/src/main/java/com/google/android/exoplayer2/PlaybackInfo.java:180-189 \u2014 there are 27 copies across 25 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 27 sites; resolving a subset leaves the remainder to drift apart. Note what the matched lines are: every one of them assigns one field to another, so the block is a hand-written mapper between two data shapes rather than behaviour with a helper inside it. Extracting one shared function only works if both sites map the SAME pair of types in the same direction \u2014 check that first, because inverse or differently-typed mappers have no single function they can both call. Where they do not, the moves that exist are a generated or reflective mapper, a common embedded/base type the fields live on once, or accepting the run and covering it with a test that fails when a field is added to one side only."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaUtil.java"},"region":{"startLine":156}}}],"partialFingerprints":{"codehealthFindingId/v1":"34c51102adee7810ac43d4701ef5e1793b2dd2356fc2f55c097e45fcbd8526c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:1226-1235 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java:516-525 | library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java:593-602 | library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStats.java:608-617 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/Transformer.java:598-607 | testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTimeline.java:254-263 \u2014 there are 6 copies across 5 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. Note what the matched lines are: every one of them assigns one field to another, so the block is a hand-written mapper between two data shapes rather than behaviour with a helper inside it. Extracting one shared function only works if both sites map the SAME pair of types in the same direction \u2014 check that first, because inverse or differently-typed mappers have no single function they can both call. Where they do not, the moves that exist are a generated or reflective mapper, a common embedded/base type the fields live on once, or accepting the run and covering it with a test that fails when a field is added to one side only."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":1226}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7847849ae8018f96b19d56c1965cfe0afaaa9dfdb46b50b4bab1b0539b9221a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:501-510 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:778-787 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:812-821 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:545-554 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:822-831 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:856-865 \u2014 there are 6 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:501\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"601c4089f44fdd334deaabf8b7332c5fcca5cf9ba0d262b32d2454004baf309a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 6): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:620-629 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:777-786 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:811-820 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:664-673 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:821-830 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:855-864 \u2014 there are 6 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:620\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":620}}}],"partialFingerprints":{"codehealthFindingId/v1":"adf0eb058fa139992d7cd6c3f57c13c6e4af896e2429ee81b5b60eb4ac7991d7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4): library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java:409-418 | library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java:532-541 | library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java:694-703 | library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java:790-799 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/CmcdHeadersFactory.java"},"region":{"startLine":409}}}],"partialFingerprints":{"codehealthFindingId/v1":"11fae5d5b77fb7b70ca0a9bae86d5a15fcd5ea78f0ebf387dfa0782f8e91c475"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportException.java:359-368 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformationException.java:348-357 | library/common/src/main/java/com/google/android/exoplayer2/PlaybackException.java:394-403 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere all 3 call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made 3 times. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportException.java:359\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportException.java"},"region":{"startLine":359}}}],"partialFingerprints":{"codehealthFindingId/v1":"110600e47a06bad91a56ffebce2edafc8514d8fd2739559dc659dfd5a495b07b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java:469-478 | library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecInfo.java:210-219 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"114c85302fd48e3264024a40caa447dbdaf0d3440d9a19a56e1b3044a7826d58"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java:104-113 | library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java:94-103 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"316d3abcf2388d3874a93c18f982cfeebc851e59ce56dd2668cba272b15df12b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:1115-1124 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:1149-1158 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":1115}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7e9fb0f4fe3eb9b82be9b1108d88f368e4fce759a4f48d1552db46996d9f32c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java:3561-3570 | library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java:3724-3735 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java:3561\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":3561}}}],"partialFingerprints":{"codehealthFindingId/v1":"63efc6ffd37225b3884293da6846012a3d6fa0f34d59cf7b9984a3d697bcd9fc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:508-517 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:494-503 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:508\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":508}}}],"partialFingerprints":{"codehealthFindingId/v1":"c87ec448771980d77ba5740db7aa892e329d7520290fc6fbde6ffc72a933381b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1419-1428 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1521-1530 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1419\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1419}}}],"partialFingerprints":{"codehealthFindingId/v1":"32e4a584b6ca76c540d0f8f79195b37cb0c6783239d924d5fef0dbe2fff4d2ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:708-717 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:752-761 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:708\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":708}}}],"partialFingerprints":{"codehealthFindingId/v1":"f1a73a995e78d8822fa12dc49f65efe0857c4edfef188db9848ae1421ac5281b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/util/Util.java:1221-1230 | library/common/src/main/java/com/google/android/exoplayer2/util/Util.java:1254-1263 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/Util.java"},"region":{"startLine":1221}}}],"partialFingerprints":{"codehealthFindingId/v1":"24402858945cee2770cd216ed9aa1a242fd874854bc73b73715981f417106861"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java:536-545 | library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java:1483-1492 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java:536\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e5f02cec76ad969e14afafa278fa532e19fac0b1c2fb731b8eba05680f391ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java:327-336 | library/core/src/main/java/com/google/android/exoplayer2/analytics/PlaybackStatsListener.java:294-303 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java:327\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/analytics/MediaMetricsListener.java"},"region":{"startLine":327}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9a34c009f0a95066ca846875d784bcf1d77a26977b32ee19e558f309982158f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java:324-333 | library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java:345-354 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java:324\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecBufferEnqueuer.java"},"region":{"startLine":324}}}],"partialFingerprints":{"codehealthFindingId/v1":"766a4549dfd445ae0e20e1660db300e0c649e8aece029707ddd9761510ee9806"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:558-568 | library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:577-586 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:558\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"faf5a252a5f29ecda5745e94cebfc5ba57ce30a529a90f7070b4f9a1830937d4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:572-581 | library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:597-607 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:572\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b9f23717a3ae8ff1755ca34e8404342387860e1bb663d497cc1298baafca3bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:784-793 | library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:813-822 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:784\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java"},"region":{"startLine":784}}}],"partialFingerprints":{"codehealthFindingId/v1":"83f108ddc925aa3bbb0e9091e60ce68db299d64a52286516b8771623f042c02a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/effect/src/main/java/com/google/android/exoplayer2/effect/OverlayShaderProgram.java:195-204 | library/effect/src/main/java/com/google/android/exoplayer2/effect/OverlayShaderProgram.java:256-265 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/effect/src/main/java/com/google/android/exoplayer2/effect/OverlayShaderProgram.java:195\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/effect/src/main/java/com/google/android/exoplayer2/effect/OverlayShaderProgram.java"},"region":{"startLine":195}}}],"partialFingerprints":{"codehealthFindingId/v1":"07e5425835d2310759bfe4efc02396c31599cbd00df6570d0d6dc7ece3251d49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java:1248-1257 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java:1262-1271 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java:1248\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/AtomParsers.java"},"region":{"startLine":1248}}}],"partialFingerprints":{"codehealthFindingId/v1":"6621545cafe129bdad81b12d5961caf427e9a5d1421d24443a15b7fc2f069b62"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:133-142 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java:146-155 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:133\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java"},"region":{"startLine":133}}}],"partialFingerprints":{"codehealthFindingId/v1":"e28c1e09aaa3a0c579648b3855ee77093a8293ff1e7cfe4340c7e3fc283b8b90"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:177-186 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java:193-202 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:177\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d099e17eead57bee4537103e18921c726df749173e9ea561dbea73f024cbb23"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:176-185 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:213-222 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:176\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"26e7ebf581f1fdcbc9e688b7dfb60faa7047e64bcaaf7812c099df339386ac08"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java:240-249 | testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java:256-265 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java:240\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/TimelineAsserts.java"},"region":{"startLine":240}}}],"partialFingerprints":{"codehealthFindingId/v1":"d68713b1126caa2977a2c0c8b14bb965986dc8fda34a12fcffe66657014c3974"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerCommandQueue.java:419-427 | extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerCommandQueue.java:457-465 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerCommandQueue.java:419\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/PlayerCommandQueue.java"},"region":{"startLine":419}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b40e0de46726c5b6676cecf71302bfdf52399f13bffbc30606d2f089b1494bb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java:147-155 | library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java:134-142 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java:147\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java"},"region":{"startLine":147}}}],"partialFingerprints":{"codehealthFindingId/v1":"df25ec1c41c0dfbc5ed7a8b426eefbe6c403c62624cde1f49b5b576fac6754f1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:718-726 | library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java:532-540 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java:718\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java"},"region":{"startLine":718}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d278b7ad5dad470696c651e5b5c80142b41a33b6accc1826fed29d2ccfeea98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:724-733 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:932-940 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:724\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":724}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfa4727ba8c705b812f3fbc2131910420f78e61eb18ee22f2a5b18d0f352d646"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:475-483 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:525-533 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:475\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":475}}}],"partialFingerprints":{"codehealthFindingId/v1":"136688d18886b5668a3bc268e8e0e8d4a7efdba52b555e11b7837b9650899c36"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1359-1367 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1429-1437 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1359\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1359}}}],"partialFingerprints":{"codehealthFindingId/v1":"b65ea4428b8bd53c81553e397b33a7381d1fa020603bd2cb99b8ee5bc7f719e5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/CombinedParallelSampleBandwidthEstimator.java:174-182 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/SplitParallelSampleBandwidthEstimator.java:170-178 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/CombinedParallelSampleBandwidthEstimator.java:174\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/CombinedParallelSampleBandwidthEstimator.java"},"region":{"startLine":174}}}],"partialFingerprints":{"codehealthFindingId/v1":"7563243f0afa77618b15a1bc0153e2a8bfda1a39fd05743d05cb41a9f42ef557"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/CombinedParallelSampleBandwidthEstimator.java:194-202 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/SplitParallelSampleBandwidthEstimator.java:192-200 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/CombinedParallelSampleBandwidthEstimator.java"},"region":{"startLine":194}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c71dd2a466a08de193a125824fc869466cc0385a1a1f46cfb4f378afe3820a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:490-498 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:534-542 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:490\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"34fc96339bfbc5774e866ee377b5a453d999273af8387aea26b0d0fe26b61c8b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/util/Util.java:1080-1088 | library/common/src/main/java/com/google/android/exoplayer2/util/Util.java:1112-1120 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/Util.java"},"region":{"startLine":1080}}}],"partialFingerprints":{"codehealthFindingId/v1":"5813129bbabf5f317db2828f4dea3bc41958531c84ac7beef522f433da92fee1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:346-354 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H263Reader.java:418-426 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java:346\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H262Reader.java"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"500fd27ecb73e103e94d59e63304be85fa7d8691c7e3c2cf8a27fdf882a1d856"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:155-163 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsDurationReader.java:142-150 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java"},"region":{"startLine":155}}}],"partialFingerprints":{"codehealthFindingId/v1":"9db848fb8195f303bb10cd710fa960576b52298c6c9276fa5ff086eff504df0b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java:192-200 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/TsDurationReader.java:178-186 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/PsDurationReader.java"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"3786e734a5e7bbb6ad7fd12b1af983e3bb69244eeeefc89d32e7020677b1d0a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderUtil.java:318-326 | testutils/src/main/java/com/google/android/exoplayer2/testutil/DecodeOneFrameUtil.java:235-243 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderUtil.java:318\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncoderUtil.java"},"region":{"startLine":318}}}],"partialFingerprints":{"codehealthFindingId/v1":"be2d6cd71e9099746845c20f45188892d1f77e1bc5e8c6a12752062d4910a644"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 6): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:584-591 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:753-760 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:767-774 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:628-635 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:797-804 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:811-818 \u2014 there are 6 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 6 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:584\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":584}}}],"partialFingerprints":{"codehealthFindingId/v1":"3067a590e1943567d760922cc872a3f93c9af7f188ce65eafafa9412b4c7f692"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:572-579 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:694-701 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:616-623 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:738-745 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:572\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e3c06e45a18e798c1d4fe70c91467e5d2a1735b5d40a98d9282376fa0f038f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:598-605 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:680-687 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:642-649 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:724-731 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:598\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":598}}}],"partialFingerprints":{"codehealthFindingId/v1":"81797d42e6b9554703d472429830c059334e13564d211f33ae9f46000734a973"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java:180-187 | library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceScheduleCommand.java:159-166 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java:180\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/metadata/scte35/SpliceInsertCommand.java"},"region":{"startLine":180}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc7e279a43ea3031d6946a3f45e81cb6fd8ffeca5b8ee3d93bde6cbb10bee1bd"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:435-442 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:746-753 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:435\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"384bd1a1c5ca25b94a9902a3bcf08d2c79168e55d4faa89ddd616373cb045ca3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:941-948 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:994-1002 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:941\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":941}}}],"partialFingerprints":{"codehealthFindingId/v1":"8882ef271e8858b5b170fb1e281a3007876eccd229da53e551d57f8a4b308990"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:143-150 | library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:174-181 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:143\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"c083543fdeebce32292b3d6cfae8c46aead5d7fcf54e701230ddbd95d144c9b4"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java:550-557 | library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java:435-442 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java:550\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67f1406d40f91565d7105bd9d4d230244097ae8257782ff808a183181185297"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:567-574 | library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:590-597 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:567\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"617603874b9193d8b9b28f23efc09365962cbaf29ee63c1d19d7a4847f2485ed"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:439-446 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:484-491 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:439\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7a5e61e21e8e9705bed1f75ddce2658c1b4cee0a31ef6bd16dc1fd150737f47"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:462-469 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:501-508 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":462}}}],"partialFingerprints":{"codehealthFindingId/v1":"d47b1315d8c16bee9b244384cc78e57ed06e96c4ca8f690c2b460ea3d89af06f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:701-708 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:827-834 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:701\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":701}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4162a2ebd92bd5dc9c6249ed5cf147694fb09181e6e53ae10a4a9f0c01e8b85"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1000-1007 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1245-1252 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1000\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1000}}}],"partialFingerprints":{"codehealthFindingId/v1":"0deedcc5a7f64255308ea952902ecc16210d277fed2e1413e8d08ab43eb387cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1217-1224 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1553-1560 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1217}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b8fea68309fa5f4e611972e5c49be544e83f17eed5570f24f81f4bc0a691dd0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1342-1349 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1412-1419 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1342\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1342}}}],"partialFingerprints":{"codehealthFindingId/v1":"689b423aceb1019bb2c059aaa25b285ac5e02963d2b969d799ba855d7adaed3c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java:1433-1440 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java:1535-1542 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java"},"region":{"startLine":1433}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3f79993396068bf47d5a104bb223a214d2a275dbc16f78b55936ae5b691d6e3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:429-436 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:473-480 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:429\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":429}}}],"partialFingerprints":{"codehealthFindingId/v1":"b4a45c2ffede84fd8c62d85b8f0ee889a93fcf7c4569afb18e8ff6c23e54be15"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:828-835 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:872-879 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:828\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":828}}}],"partialFingerprints":{"codehealthFindingId/v1":"ca3dcbbdc1b5f62f8a0ac041d5cb24636d546cd834fd5cec23b33719c93d67f2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionDecoder.java:104-111 | library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionDecoder.java:152-159 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionDecoder.java:104\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/video/spherical/ProjectionDecoder.java"},"region":{"startLine":104}}}],"partialFingerprints":{"codehealthFindingId/v1":"30ed9aa9b9244331ea23907f725799a6415eea67c13e3d9f7a8cb2e8584ca84d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:875-882 | testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:914-921 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:875\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java"},"region":{"startLine":875}}}],"partialFingerprints":{"codehealthFindingId/v1":"75e289e32efa09844dce000e21c3c3b967279af84f97173529d3db511fb03201"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java:200-207 | testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java:213-220 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"0419aa8b32213b8c7c22b4359d6c90f2cb462ee3b09cc781e3fc9e68d55a18ce"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java:97-104 | library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java:1036-1043 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note what the matched lines are: every one of them assigns one field to another, so the block is a hand-written mapper between two data shapes rather than behaviour with a helper inside it. Extracting one shared function only works if both sites map the SAME pair of types in the same direction \u2014 check that first, because inverse or differently-typed mappers have no single function they can both call. Where they do not, the moves that exist are a generated or reflective mapper, a common embedded/base type the fields live on once, or accepting the run and covering it with a test that fails when a field is added to one side only."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":97}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6e9d24c67b57334bcaeaad22711b5b8a158d5de273d5ef04a756c3d1ce693e6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java:114-121 | library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java:1054-1061 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note what the matched lines are: every one of them assigns one field to another, so the block is a hand-written mapper between two data shapes rather than behaviour with a helper inside it. Extracting one shared function only works if both sites map the SAME pair of types in the same direction \u2014 check that first, because inverse or differently-typed mappers have no single function they can both call. Where they do not, the moves that exist are a generated or reflective mapper, a common embedded/base type the fields live on once, or accepting the run and covering it with a test that fails when a field is added to one side only."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/MediaMetadata.java"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"b10b70e1039eb2baca991dc3c71d7ce7af53fcb7ecb73cdf9466ed11f8dd5b01"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:200-207 | library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:966-973 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note what the matched lines are: every one of them assigns one field to another, so the block is a hand-written mapper between two data shapes rather than behaviour with a helper inside it. Extracting one shared function only works if both sites map the SAME pair of types in the same direction \u2014 check that first, because inverse or differently-typed mappers have no single function they can both call. Where they do not, the moves that exist are a generated or reflective mapper, a common embedded/base type the fields live on once, or accepting the run and covering it with a test that fails when a field is added to one side only."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"d732012b55141613da80cf14c18a33b25ea4e222435675fd23f369b55dc71c4e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:1259-1266 | library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:1621-1628 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note what the matched lines are: every one of them assigns one field to another, so the block is a hand-written mapper between two data shapes rather than behaviour with a helper inside it. Extracting one shared function only works if both sites map the SAME pair of types in the same direction \u2014 check that first, because inverse or differently-typed mappers have no single function they can both call. Where they do not, the moves that exist are a generated or reflective mapper, a common embedded/base type the fields live on once, or accepting the run and covering it with a test that fails when a field is added to one side only."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":1259}}}],"partialFingerprints":{"codehealthFindingId/v1":"a0db01b185ae5df57f6b0991b41ee303dd7e1e91b3eee2ce8f6c477a26b43415"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 26): library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:465-471 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:516-522 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:529-535 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:542-548 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:557-563 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:570-576 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:580-586 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:616-622 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:661-667 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:692-698 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:733-739 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:740-746 | library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:763-769 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:509-515 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:560-566 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:573-579 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:586-592 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:601-607 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:614-620 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:624-630 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:660-666 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:705-711 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:736-742 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:777-783 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:784-790 | library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultBandwidthMeter.java:807-813 \u2014 there are 26 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 26 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java:465\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/upstream/experimental/ExperimentalBandwidthMeter.java"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"9acaa8254a709b2dc2c61bc7bf9b3f2b877b4086346fd933bfdb91d33bc3199c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionUtil.java:231-237 | library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionUtil.java:268-274 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionUtil.java:231\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/ads/ServerSideAdInsertionUtil.java"},"region":{"startLine":231}}}],"partialFingerprints":{"codehealthFindingId/v1":"a44dd6358ca67f7b4621ff2f6bc38c23e44b68bc981fcd3d9e97fca3ff9452c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:308-314 | library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java:331-337 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMessageUtil.java"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"4923e08de17265c8982f71a02be51ab8ad3db8f899e75a954fbaf7918cc8f210"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java:700-707 | library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java:738-744 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java"},"region":{"startLine":700}}}],"partialFingerprints":{"codehealthFindingId/v1":"02f65fb3f9ed7434e955e317f564fa60779a9b413093618a514c5e8d21c27cbf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:609-615 | library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:625-631 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:609\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":609}}}],"partialFingerprints":{"codehealthFindingId/v1":"224c2bf980b5d97a82a0615a64707be943edc6cff21022eac3e3ba1430c90a36"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:414-420 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:435-441 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":414}}}],"partialFingerprints":{"codehealthFindingId/v1":"039551b9acc240028d22dc8b42f5320c9b1dbbc6a4b7c34541da82ab624a07c8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1177-1183 | library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java:1471-1477 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java:1177\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerControlView.java"},"region":{"startLine":1177}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6fef658af91020f924b45165729af2199160247e87e017c6d93885e79cb522f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java:166-172 | library/datasource/src/main/java/com/google/android/exoplayer2/upstream/RawResourceDataSource.java:245-251 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/datasource/src/main/java/com/google/android/exoplayer2/upstream/ContentDataSource.java"},"region":{"startLine":166}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b5caf4e0c760706b270c060e4ebebc254831ffa516e51874a395587769886c3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java:2519-2525 | library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecUtil.java:608-614 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java:2519\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java"},"region":{"startLine":2519}}}],"partialFingerprints":{"codehealthFindingId/v1":"423f68e41d02f25afff6f2ec3e843ba20e99a1b122f8088b31194d7cd702f098"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java:54-60 | library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/UserDataReader.java:53-59 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java:54\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/SeiReader.java"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"5a7b10dc951dc20ab25d0088cbc375bd817dfd1e99e7f2ab4231c63c32781d98"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/AudioSamplePipeline.java:82-88 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/EncodedSamplePipeline.java:61-67 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/AudioSamplePipeline.java"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"532652a0a6b02d320ee4f6ff463e41748eb605b3d0e82b19a0ab55a045478896"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java:354-360 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformationResult.java:385-391 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"0fdccd2205bb09cad89203ecc6928cd823167d4d8b2cd9de736f7a99bb904a00"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java:372-378 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/TransformationResult.java:403-409 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExportResult.java"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"346a9249c3d69ebe584937e64ed46682afd20958481bc1b45f3b55320e4fe1cc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaPeriod.java:157-163 | testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaPeriod.java:268-274 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaPeriod.java:157\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveMediaPeriod.java"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"db3115082704544494584066a4259cd02995de6242a983b596f7920501ee1b03"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java:378-384 | library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java:391-397 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java:378\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"8decc4d03ff17469e976081044e49bf91a795751f05628c213e8b9b89e677ca1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:890-895 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:941-946 | library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:994-999 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java:890\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java"},"region":{"startLine":890}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8e5d05b672f77be467c2b360e6bb5e431d9e3cbcafac5be35af1d5a8a61e24"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:602-607 | library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:610-615 | library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:626-631 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java:602\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/extractor/src/main/java/com/google/android/exoplayer2/text/dvb/DvbParser.java"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"32ce957c410a99251596b3257883167c9373675b42729759f233a35319e7f4f8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:214-219 | testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:251-257 | testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:570-577 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java:570\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/truth/SpannedSubject.java"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"418f43104a9ce73a18db0cc43dbc77157b798e29e9827dd81ac633a9db5c5727"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java:153-160 | testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java:194-201 | testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java:210-215 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"5753546889e024afc2adf6a71457c3218aaa2a90046358b5a1ba61f2743aec9d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleViewUtils.java:71-76 | library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleViewUtils.java:94-100 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleViewUtils.java:71\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/ui/src/main/java/com/google/android/exoplayer2/ui/SubtitleViewUtils.java"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"11af11ccc04e246a786790b06c9ebf50200fa8e04087df43c2f61ff6ca24d10e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java:199-204 | robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java:279-284 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java:199\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"robolectricutils/src/main/java/com/google/android/exoplayer2/robolectric/TestPlayerRunHelper.java"},"region":{"startLine":199}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f33f0a0b9c5a5dcc340db4134c558855440f4a4df856942039dbe6553201557"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:1690-1695 | library/common/src/main/java/com/google/android/exoplayer2/Timeline.java:416-421 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":1690}}}],"partialFingerprints":{"codehealthFindingId/v1":"26c430684e2bf7a11bbece01cd0c978d97c2c941b943823e2fd0bf9b9aa737ad"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java:207-211 | testutils/src/main/java/com/google/android/exoplayer2/testutil/OggFileAudioBufferSink.java:235-239 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java:207\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/audio/TeeAudioProcessor.java"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"40121596c2f5e5f532efa8fd9c7137659f934bbf8ca139de4287ad2477eba2f9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:449-453 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:753-757 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:449\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":449}}}],"partialFingerprints":{"codehealthFindingId/v1":"229f7e4a0ad3ea7349a3437bb26e94e52ab603a85bfd9f98383196ac635443f6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:943-947 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:1026-1030 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c05e39f3ca905c7c24c3ef9ac958015d845f018d4b016f2ab314b2427b1b063"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:1542-1546 | library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:1554-1558 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java:1542\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java"},"region":{"startLine":1542}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9f5a1b9b39c0dde166ed6d7e6d9cd497cdab379f33c2a103ebb6a26ef81ae50"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java:204-208 | library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java:130-134 \u2014 the copies sit in sibling files of one directory: extract the block into a single shared function in that directory and call it from each site, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java:204\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/source/SilenceMediaSource.java"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"ecc87c1353b3065b594e4f7d3e4200b9e90c3ed8ecb8e6987bd3627958569339"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java:107-111 | library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java:115-119 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java:107\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/ColorParser.java"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a97643be753c56da392587d66d1419c11ab3ffffcf46e95fb2c68bf28e4bf3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java:351-355 | library/common/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java:363-367 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/util/ParsableByteArray.java"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"33fb455188acf093ae259ba3d0029079fb6e9e6fa22cee8e28dfb9b59389e822"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FloatAudioMixingAlgorithm.java:107-111 | library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FloatAudioMixingAlgorithm.java:158-162 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FloatAudioMixingAlgorithm.java:107\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/FloatAudioMixingAlgorithm.java"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c91e2efe2151eec9bb4a5e633581387b04859915addac5cbcb282a1dfbf1872"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2107-2111 | library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2165-2169 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java:2107\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":2107}}}],"partialFingerprints":{"codehealthFindingId/v1":"6363f2a59317c12aa953ea8dcb757072db435c3eae31074d91e9524a1a4d2082"}},{"ruleId":"D19","level":"note","message":{"text":"The ExoPlayer website is hosted on GitHub Pages and uses Jekyll static site generation, but there is no link from the documentation to the actual site itself (the body of this README does not show a link).: Add a link to the live ExoPlayer website so readers can verify the docs point to the real site."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"docs/README.md"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"658a1fcbe2fbe9ba75c57941dc3989474d7d2c26cc3790fe553f72f0fe2955db"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a22eddbf8ddda35ad86020345ce126f7b6412c136745c18dc724b99742aee6ba"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"c4a5b565456764e17181b729fb84bad552bc72bbd02207229fd295311557d5b5"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D34","level":"note","message":{"text":"Dormant codebase: 895 of 903 significant files have no living knowledge \u2014 the codebase as a whole is dormant, not 895 separate risks. Re-engage owners or document before change."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"4c69f1e54b7dd6fe9029dd02df6ba8f8145b789f2f18dbdaa086c40ded49dba6"}},{"ruleId":"D34","level":"note","message":{"text":"Largest orphaned file: One of the largest files with no living knowledge remaining \u2014 a reasonable place to start a read-through before the aggregate risk above bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/common/src/main/java/com/google/android/exoplayer2/SimpleBasePlayer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"feac313888c60cbb6ff17b8630c627e2b8eeea2ac2b4e672e9527192f31cd65c"}},{"ruleId":"D34","level":"note","message":{"text":"Largest orphaned file: One of the largest files with no living knowledge remaining \u2014 a reasonable place to start a read-through before the aggregate risk above bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"213e8991aad5bf3708ef680374e2dc5d463864321d66ade1056f2ec0448707ce"}},{"ruleId":"D34","level":"note","message":{"text":"Largest orphaned file: One of the largest files with no living knowledge remaining \u2014 a reasonable place to start a read-through before the aggregate risk above bites."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"84aec856a64d918215641f6967b7e36e8bd506df2dc4241147bcf3e7e5e2aa94"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ExoAssetLoaderVideoRenderer.java \u2194 VideoSamplePipeline.java: \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExoAssetLoaderVideoRenderer.java\u0060 and \u0060library/transformer/src/main/java/com/google/android/exoplayer2/transformer/VideoSamplePipeline.java\u0060 change together 55% of the time (6 of the 11 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well). They sit in the same directory, and in this ecosystem sibling files there normally share one namespace/package \u2014 so a direct reference between them needs no import and this pass cannot see whether one exists. Read the pair before acting: if one file only DECLARES what the other consumes (a constants/types file beside its user), the co-change is definitional and the question is whether the split earns its keep; if they duplicate structure, extract the common part into a shared function or type they both call; if neither holds, the coupling is hidden and worth breaking."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"library/transformer/src/main/java/com/google/android/exoplayer2/transformer/ExoAssetLoaderVideoRenderer.java"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a9df7f889d46d8d762fc7e1ff7e71e03a42a8e41560cdedc8d5522c94d255f5"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1059","guid":"a2381a08-60f6-9554-a8b8-f3018cfaaca5","name":"Insufficient Technical Documentation","shortDescription":{"text":"Insufficient Technical Documentation"},"helpUri":"https://cwe.mitre.org/data/definitions/1059.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Command Injection","shortDescription":{"text":"Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"OS Command Injection","shortDescription":{"text":"OS Command Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Cross-site Scripting (XSS)","shortDescription":{"text":"Cross-site Scripting (XSS)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"SQL Injection","shortDescription":{"text":"SQL Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Code Injection","shortDescription":{"text":"Code Injection"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":3,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}