diff --git a/.circleci/config.yml b/.circleci/config.yml index c9f040ad..6ef7ac08 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +version: 3 jobs: build: docker: @@ -18,7 +18,7 @@ jobs: command: ./gradlew -Pqc ktlintCheck - run: name: static analysis - command: ./gradlew -Pqc detektCheck + command: ./gradlew -Pqc detektMain - run: name: build command: ./gradlew assembleDebug diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt index b8c2e312..9683bd25 100644 --- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt +++ b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/IndexesSerializer.kt @@ -25,6 +25,7 @@ private val indexesSerializer get() = object : ObjectSerializer(SERIALI .writeObject>(context, item.artists, artistListSerializer) } + @Suppress("ReturnCount") override fun deserializeObject( context: SerializationContext, input: SerializerInput, diff --git a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt index d818aed0..0af30335 100644 --- a/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt +++ b/core/cache/src/main/kotlin/org/moire/ultrasonic/cache/serializers/MusicFolderSerializer.kt @@ -22,6 +22,7 @@ private val musicFolderSerializer = object : ObjectSerializer(SERIA output.writeString(item.id).writeString(item.name) } + @Suppress("ReturnCount") override fun deserializeObject( context: SerializationContext, input: SerializerInput, diff --git a/dependencies.gradle b/dependencies.gradle index 074b77a4..e99ed16e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -9,7 +9,7 @@ ext.versions = [ androidxcore : "1.5.0-rc01", ktlint : "0.37.1", ktlintGradle : "9.2.1", - detekt : "1.0.0.RC6-4", + detekt : "1.16.0", jacoco : "0.8.5", preferences : "1.1.1", media : "1.3.0", @@ -49,7 +49,7 @@ ext.gradlePlugins = [ gradle : "com.android.tools.build:gradle:$versions.gradlePlugin", kotlin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin", ktlintGradle : "org.jlleitschuh.gradle:ktlint-gradle:$versions.ktlintGradle", - detekt : "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$versions.detekt", + detekt : "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$versions.detekt", jacoco : "org.jacoco:org.jacoco.core:$versions.jacoco", ] diff --git a/detekt-baseline-debug.xml b/detekt-baseline-debug.xml new file mode 100644 index 00000000..fff5d6ce --- /dev/null +++ b/detekt-baseline-debug.xml @@ -0,0 +1,261 @@ + + + + + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun finishActivity() + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun getFields(): Boolean + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun setFields() + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun testConnection() + CommentOverPrivateFunction:FileLoggerTree.kt$FileLoggerTree$ private fun getNextLogFile() + CommentOverPrivateFunction:FileLoggerTree.kt$FileLoggerTree$ private fun getNumberedFile(next: Boolean) + CommentOverPrivateFunction:MediaPlayerService.kt$MediaPlayerService$ private fun buildForegroundNotification( playerState: PlayerState, currentPlaying: DownloadFile? ): Notification + CommentOverPrivateFunction:RESTMusicService.kt$RESTMusicService$ @Throws(Exception::class) private fun search2( criteria: SearchCriteria ): SearchResult + CommentOverPrivateFunction:RESTMusicService.kt$RESTMusicService$ @Throws(Exception::class) private fun searchOld( criteria: SearchCriteria ): SearchResult + CommentOverPrivateFunction:ServerRowAdapter.kt$ServerRowAdapter$ private fun popupMenuItemClick(menuItem: MenuItem, position: Int): Boolean + CommentOverPrivateFunction:ServerRowAdapter.kt$ServerRowAdapter$ private fun serverMenuClick(view: View, position: Int) + CommentOverPrivateFunction:ServerSelectorFragment.kt$ServerSelectorFragment$ private fun editServer(index: Int) + CommentOverPrivateFunction:ServerSelectorFragment.kt$ServerSelectorFragment$ private fun onServerDeleted(index: Int) + CommentOverPrivateFunction:ServerSelectorFragment.kt$ServerSelectorFragment$ private fun setActiveServer(index: Int) + CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private fun loadServerSettingFromPreferences( preferenceId: Int, serverId: Int, settings: SharedPreferences ): ServerSetting? + CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun areIndexesMissing(): Boolean + CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun reindexSettings() + ComplexCondition:DownloadHandler.kt$DownloadHandler.<no name provided>$!append && !playNext && !unpin && !background + ComplexCondition:DownloadHandler.kt$DownloadHandler.<no name provided>$!isOffline(activity) && isArtist && Util.getShouldUseId3Tags(activity) + ComplexCondition:EditServerFragment.kt$EditServerFragment$urlString != urlString.trim(' ') || urlString.contains("@") || url.host.isNullOrBlank() + ComplexCondition:FilePickerAdapter.kt$FilePickerAdapter$currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || currentDirectory.absolutePath == "/storage/emulated" || currentDirectory.absolutePath == "/mnt" + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$Util.getGaplessPlaybackPreference(context) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && ( playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED ) + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$playerState !== PlayerState.IDLE && playerState !== PlayerState.DOWNLOADING && playerState !== PlayerState.PREPARING + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$!isPartial || downloadFile.isWorkDone && abs(duration - pos) < 1000 + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$Util.getGaplessPlaybackPreference(context) && nextPlaying != null && nextPlayerState === PlayerState.PREPARED + ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.IDLE || localMediaPlayer.playerState === PlayerState.DOWNLOADING || localMediaPlayer.playerState === PlayerState.PREPARING + ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.PAUSED || localMediaPlayer.playerState === PlayerState.COMPLETED || localMediaPlayer.playerState === PlayerState.STOPPED + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled && !deleteEnabled && !isOffline(context) + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled && !isOffline(context) && selection.size > pinnedCount + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$entry != null && !entry.isDirectory && !entry.isVideo + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment.<no name provided>$Util.getShouldShowAllSongsByArtist(context) && musicDirectory.findChild(allSongsId) == null && musicDirectory.getChildren(true, false).size == musicDirectory.getChildren(true, true).size + ComplexCondition:ServerSettingsModel.kt$ServerSettingsModel$url.isNullOrEmpty() || userName.isNullOrEmpty() || isMigrated + ComplexCondition:SongView.kt$SongView$TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || song.isVideo && Util.getVideoPlayerType(this.context) !== VideoPlayerType.FLASH + ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$id != null && view != null && view is ImageView + ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$username != null && view != null && view is ImageView + ComplexMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String + ComplexMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute() + ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean + ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun getFields(): Boolean + ComplexMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + ComplexMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun fileLister(currentDirectory: File) + ComplexMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun doPlay(downloadFile: DownloadFile, position: Int, start: Boolean) + ComplexMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun setupNext(downloadFile: DownloadFile) + ComplexMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler() + ComplexMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun enableButtons() + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateDisplay(refresh: Boolean) + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$protected override fun done(result: Pair<MusicDirectory, Boolean>) + ComplexMethod:SelectArtistFragment.kt$SelectArtistFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + ComplexMethod:ServerRowAdapter.kt$ServerRowAdapter$ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? + ComplexMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean) + ComplexMethod:SongView.kt$SongView$private fun updateDownloadStatus(downloadFile: DownloadFile) + ComplexMethod:SongView.kt$SongView$public override fun update() + EmptyCatchBlock:LocalMediaPlayer.kt$LocalMediaPlayer${ } + EmptyDefaultConstructor:VideoPlayer.kt$VideoPlayer$() + EmptyFunctionBlock:SongView.kt$SongView${} + FunctionNaming:ThemeChangedEventDistributor.kt$ThemeChangedEventDistributor$fun RaiseThemeChangedEvent() + ImplicitDefaultLocale:DownloadFile.kt$DownloadFile$String.format("DownloadFile (%s)", song) + ImplicitDefaultLocale:DownloadFile.kt$DownloadFile.DownloadTask$String.format("Download of '%s' was cancelled", song) + ImplicitDefaultLocale:DownloadFile.kt$DownloadFile.DownloadTask$String.format("DownloadTask (%s)", song) + ImplicitDefaultLocale:EditServerFragment.kt$EditServerFragment.<no name provided>$String.format( "%s %s", resources.getString(R.string.settings_connection_failure), getErrorMessage(error) ) + ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Failed to write log to %s", file) + ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Log file rotated, logging into file %s", file?.name) + ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Logging into file %s", file?.name) + ImplicitDefaultLocale:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$String.format("BufferTask (%s)", downloadFile) + ImplicitDefaultLocale:LocalMediaPlayer.kt$LocalMediaPlayer.CheckCompletionTask$String.format("CheckCompletionTask (%s)", downloadFile) + ImplicitDefaultLocale:ShareHandler.kt$ShareHandler$String.format("%d:%s", timeSpanAmount, timeSpanType) + ImplicitDefaultLocale:ShareHandler.kt$ShareHandler.<no name provided>$String.format("%s\n\n%s", Util.getShareGreeting(context), result.url) + ImplicitDefaultLocale:SongView.kt$SongView$String.format("%02d.", trackNumber) + ImplicitDefaultLocale:SongView.kt$SongView$String.format("%s ", bitRate) + ImplicitDefaultLocale:SongView.kt$SongView$String.format("%s > %s", suffix, transcodedSuffix) + LargeClass:DownloadFile.kt$DownloadFile + LargeClass:DownloadHandler.kt$DownloadHandler + LargeClass:EditServerFragment.kt$EditServerFragment : FragmentOnBackPressedHandler + LargeClass:FilePickerAdapter.kt$FilePickerAdapter : Adapter + LargeClass:LocalMediaPlayer.kt$LocalMediaPlayer + LargeClass:MediaPlayerService.kt$MediaPlayerService : Service + LargeClass:NavigationActivity.kt$NavigationActivity : AppCompatActivity + LargeClass:RESTMusicService.kt$RESTMusicService : MusicService + LargeClass:SelectAlbumFragment.kt$SelectAlbumFragment : Fragment + LargeClass:SelectAlbumFragment.kt$SelectAlbumFragment$LoadTask : FragmentBackgroundTask + LargeClass:SelectArtistFragment.kt$SelectArtistFragment : Fragment + LargeClass:ServerSettingsModel.kt$ServerSettingsModel : ViewModel + LargeClass:SongView.kt$SongView : UpdateViewCheckable + LongMethod:APIMusicDirectoryConverter.kt$fun MusicDirectoryChild.toDomainEntity(): MusicDirectory.Entry + LongMethod:ActiveServerProvider.kt$ActiveServerProvider$ fun getActiveServer(): ServerSetting + LongMethod:ArtistListModel.kt$ArtistListModel$private suspend fun loadFromServer(refresh: Boolean, swipe: SwipeRefreshLayout) + LongMethod:ArtistRowAdapter.kt$ArtistRowAdapter$override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) + LongMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String + LongMethod:DownloadFile.kt$DownloadFile$private fun updateModificationDate(file: File) + LongMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute() + LongMethod:DownloadHandler.kt$DownloadHandler$fun download( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List<MusicDirectory.Entry?> ) + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$@Throws(Exception::class) private fun getSongsForArtist( id: String, songs: MutableCollection<MusicDirectory.Entry> ) + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$@Throws(Exception::class) private fun getSongsRecursively( parent: MusicDirectory, songs: MutableList<MusicDirectory.Entry> ) + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$@Throws(Throwable::class) override fun doInBackground(): List<MusicDirectory.Entry> + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$override fun done(songs: List<MusicDirectory.Entry>) + LongMethod:EditServerFragment.kt$EditServerFragment$ private fun finishActivity() + LongMethod:EditServerFragment.kt$EditServerFragment$ private fun getFields(): Boolean + LongMethod:EditServerFragment.kt$EditServerFragment$override fun onSaveInstanceState(savedInstanceState: Bundle) + LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewStateRestored(savedInstanceState: Bundle?) + LongMethod:EditServerFragment.kt$EditServerFragment.<no name provided>$@Throws(Throwable::class) override fun doInBackground(): Boolean + LongMethod:FileLoggerTree.kt$FileLoggerTree$ override fun log(priority: Int, tag: String?, message: String, t: Throwable?) + LongMethod:FileLoggerTree.kt$FileLoggerTree$ private fun getNextLogFile() + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$fun createNewFolder() + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun fileLister(currentDirectory: File) + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun getKitKatStorageItems(storages: List<File>): LinkedList<FileListItem> + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun getStorageItems(): LinkedList<FileListItem> + LongMethod:FilePickerDialog.kt$FilePickerDialog$private fun initialize(context: Context) + LongMethod:ImageLoaderProvider.kt$ImageLoaderProvider$@Synchronized fun getImageLoader(): ImageLoader + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized fun setPlayerState(playerState: PlayerState) + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun doPlay(downloadFile: DownloadFile, position: Int, start: Boolean) + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun setupNext(downloadFile: DownloadFile) + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$fun init() + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$fun release() + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$override fun onCompletion(mediaPlayer: MediaPlayer) + LongMethod:MediaPlayerService.kt$MediaPlayerService$ private fun buildForegroundNotification( playerState: PlayerState, currentPlaying: DownloadFile? ): Notification + LongMethod:MediaPlayerService.kt$MediaPlayerService$@Synchronized fun setNextPlaying() + LongMethod:MediaPlayerService.kt$MediaPlayerService$override fun onCreate() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun addActions( context: Context, notificationBuilder: NotificationCompat.Builder, playerState: PlayerState, song: MusicDirectory.Entry? ): IntArray + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun generateAction(context: Context, requestCode: Int): NotificationCompat.Action? + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnCurrentPlayingChangedHandler() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnPlayerStateChangedHandler() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState) + LongMethod:MediaStoreService.kt$MediaStoreService$fun saveInMediaStore(downloadFile: DownloadFile) + LongMethod:NavigationActivity.kt$NavigationActivity$// TODO Test if this works with external Intents // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here override fun onNewIntent(intent: Intent?) + LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?) + LongMethod:NavigationActivity.kt$NavigationActivity$private fun showNowPlaying() + LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(IOException::class) private fun savePlaylist( name: String?, context: Context, playlist: MusicDirectory ) + LongMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun downloadBackground(save: Boolean, songs: List<MusicDirectory.Entry?>) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun enableButtons() + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun playAll(shuffle: Boolean = false, append: Boolean = false) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateDisplay(refresh: Boolean) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.<no name provided>$override fun done(result: Pair<MusicDirectory, Boolean>) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.<no name provided>$override fun load(service: MusicService): MusicDirectory + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$protected fun createHeader( entries: List<MusicDirectory.Entry>, name: CharSequence?, songCount: Int ): View? + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$protected override fun done(result: Pair<MusicDirectory, Boolean>) + LongMethod:SelectArtistFragment.kt$SelectArtistFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:SelectArtistFragment.kt$SelectArtistFragment$private fun onArtistMenuItemSelected(menuItem: MenuItem, artist: Artist): Boolean + LongMethod:ServerRowAdapter.kt$ServerRowAdapter$ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? + LongMethod:ServerRowAdapter.kt$ServerRowAdapter$ private fun popupMenuItemClick(menuItem: MenuItem, position: Int): Boolean + LongMethod:ServerRowAdapter.kt$ServerRowAdapter$ private fun serverMenuClick(view: View, position: Int) + LongMethod:ServerSelectorFragment.kt$ServerSelectorFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:ServerSettingsModel.kt$ServerSettingsModel$ fun migrateFromPreferences(): Boolean + LongMethod:ServerSettingsModel.kt$ServerSettingsModel$ private fun loadServerSettingFromPreferences( preferenceId: Int, serverId: Int, settings: SharedPreferences ): ServerSetting? + LongMethod:ShareHandler.kt$ShareHandler$private fun showDialog( fragment: Fragment, shareDetails: ShareDetails, swipe: SwipeRefreshLayout?, cancellationToken: CancellationToken ) + LongMethod:SongView.kt$SongView$fun setLayout(song: MusicDirectory.Entry) + LongMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean) + LongMethod:SongView.kt$SongView$private fun updateDownloadStatus(downloadFile: DownloadFile) + LongMethod:SongView.kt$SongView$public override fun update() + LongMethod:SubsonicUncaughtExceptionHandler.kt$SubsonicUncaughtExceptionHandler$override fun uncaughtException(thread: Thread, throwable: Throwable) + LongMethod:UApp.kt$UApp$override fun onCreate() + LongParameterList:ArtistRowAdapter.kt$ArtistRowAdapter$( private var artistList: List<Artist>, private var selectFolderHeader: SelectMusicFolderView?, val onArtistClick: (Artist) -> Unit, val onContextMenuClick: (MenuItem, Artist) -> Boolean, private val imageLoader: ImageLoader ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List<MusicDirectory.Entry?> ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, id: String, name: String?, isShare: Boolean, isDirectory: Boolean, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, id: String, name: String?, save: Boolean, append: Boolean, autoplay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, id: String?, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean ) + LongParameterList:ServerRowAdapter.kt$ServerRowAdapter$( private var context: Context, private var data: Array<ServerSetting>, private val model: ServerSettingsModel, private val activeServerProvider: ActiveServerProvider, private val manageMode: Boolean, private val serverDeletedCallback: ((Int) -> Unit), private val serverEditRequestedCallback: ((Int) -> Unit) ) + MagicNumber:ActiveServerProvider.kt$ActiveServerProvider$8192 + MagicNumber:AudioFocusHandler.kt$AudioFocusHandler$0.1f + MagicNumber:DownloadFile.kt$DownloadFile$100 + MagicNumber:DownloadFile.kt$DownloadFile.DownloadTask$10 + MagicNumber:DownloadFile.kt$DownloadFile.DownloadTask$1000L + MagicNumber:DownloadFile.kt$DownloadFile.DownloadTask$60 + MagicNumber:DownloadHandler.kt$DownloadHandler$500 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$100 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$3 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$4 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$5 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$6 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$7 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer$100 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer$1000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$1000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$60000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$100000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$1000L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$1024L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$8 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$86400L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$8L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.CheckCompletionTask$5000L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.PositionCache$50L + MagicNumber:MediaPlayerService.kt$MediaPlayerService$100 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$1000 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$256 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$3 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$4 + MagicNumber:MediaPlayerService.kt$MediaPlayerService.Companion$19 + MagicNumber:MediaPlayerService.kt$MediaPlayerService.Companion$50L + MagicNumber:RESTMusicService.kt$RESTMusicService$206 + MagicNumber:RESTMusicService.kt$RESTMusicService$5 + MagicNumber:SelectAlbumFragment.kt$SelectAlbumFragment$10 + MagicNumber:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$10 + MagicNumber:SelectMusicFolderView.kt$SelectMusicFolderView$10 + MagicNumber:SongView.kt$SongView$3 + MagicNumber:SongView.kt$SongView$4 + MagicNumber:SongView.kt$SongView$60 + NestedBlockDepth:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute() + NestedBlockDepth:DownloadHandler.kt$DownloadHandler$private fun downloadRecursively( fragment: Fragment, id: String, name: String?, isShare: Boolean, isDirectory: Boolean, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean ) + NestedBlockDepth:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler() + NestedBlockDepth:SelectAlbumFragment.kt$SelectAlbumFragment$private fun getAlbum(refresh: Boolean, id: String?, name: String?, parentId: String?) + ReturnCount:ActiveServerProvider.kt$ActiveServerProvider$ fun getActiveServer(): ServerSetting + ReturnCount:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String + ReturnCount:FileLoggerTree.kt$FileLoggerTree$ private fun getNextLogFile() + ReturnCount:MediaPlayerService.kt$MediaPlayerService$private fun generateAction(context: Context, requestCode: Int): NotificationCompat.Action? + ReturnCount:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + ReturnCount:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + ReturnCount:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean + ReturnCount:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onOptionsItemSelected(item: MenuItem): Boolean + ReturnCount:ServerRowAdapter.kt$ServerRowAdapter$ private fun popupMenuItemClick(menuItem: MenuItem, position: Int): Boolean + SpreadOperator:MediaPlayerService.kt$MediaPlayerService$(*compactActions) + SwallowedException:DownloadFile.kt$DownloadFile$catch (e: Exception) { Timber.w("Failed to set last-modified date on %s", file) } + SwallowedException:DownloadFile.kt$DownloadFile$catch (ex: IOException) { Timber.w("Failed to rename file %s to %s", completeFile, saveFile) } + SwallowedException:LocalMediaPlayer.kt$LocalMediaPlayer$catch (e: Throwable) { // Froyo or lower } + SwallowedException:LocalMediaPlayer.kt$LocalMediaPlayer$catch (e: Throwable) { } + SwallowedException:MediaPlayerService.kt$MediaPlayerService$catch (x: IndexOutOfBoundsException) { // Ignored } + SwallowedException:NavigationActivity.kt$NavigationActivity$catch (e: Resources.NotFoundException) { destination.id.toString() } + ThrowsCount:ApiCallResponseChecker.kt$ApiCallResponseChecker.Companion$@Throws(SubsonicRESTException::class, IOException::class) fun checkResponseSuccessful(response: Response<out SubsonicResponse>) + TooGenericExceptionCaught:ArtistListModel.kt$ArtistListModel$exception: Exception + TooGenericExceptionCaught:DownloadFile.kt$DownloadFile$e: Exception + TooGenericExceptionCaught:DownloadFile.kt$DownloadFile.DownloadTask$x: Exception + TooGenericExceptionCaught:FileLoggerTree.kt$FileLoggerTree$x: Throwable + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$e: Throwable + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$ex: Exception + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$exception: Throwable + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$x: Exception + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer.PositionCache$e: Exception + TooGenericExceptionCaught:MediaPlayerService.kt$MediaPlayerService$e: Exception + TooGenericExceptionCaught:MediaPlayerService.kt$MediaPlayerService$x: IndexOutOfBoundsException + TooGenericExceptionCaught:SelectAlbumFragment.kt$SelectAlbumFragment$exception: Exception + TooGenericExceptionCaught:SongView.kt$SongView$e: Exception + TooGenericExceptionCaught:SubsonicUncaughtExceptionHandler.kt$SubsonicUncaughtExceptionHandler$x: Throwable + TooGenericExceptionCaught:VideoPlayer.kt$VideoPlayer$e: Exception + TooGenericExceptionThrown:DownloadFile.kt$DownloadFile.DownloadTask$throw Exception(String.format("Download of '%s' was cancelled", song)) + TooManyFunctions:LocalMediaPlayer.kt$LocalMediaPlayer + TooManyFunctions:MediaPlayerService.kt$MediaPlayerService : Service + TooManyFunctions:RESTMusicService.kt$RESTMusicService : MusicService + TooManyFunctions:SelectAlbumFragment.kt$SelectAlbumFragment : Fragment + TopLevelPropertyNaming:SubsonicUncaughtExceptionHandler.kt$private const val filename = "ultrasonic-stacktrace.txt" + UnusedPrivateMember:RESTMusicService.kt$RESTMusicService.Companion$private const val INDEXES_FOLDER_STORAGE_NAME = "indexes_folder" + UselessCallOnNotNull:FileLoggerTree.kt$FileLoggerTree$fileList.isNullOrEmpty() + UselessCallOnNotNull:FileLoggerTree.kt$FileLoggerTree.Companion$fileList.isNullOrEmpty() + UtilityClassWithPublicConstructor:CommunicationErrorHandler.kt$CommunicationErrorHandler + UtilityClassWithPublicConstructor:FragmentTitle.kt$FragmentTitle + VariableNaming:SelectMusicFolderView.kt$SelectMusicFolderView$private val MENU_GROUP_MUSIC_FOLDER = 10 + + diff --git a/detekt-baseline-main.xml b/detekt-baseline-main.xml new file mode 100644 index 00000000..5d93fbb0 --- /dev/null +++ b/detekt-baseline-main.xml @@ -0,0 +1,55 @@ + + + + + ComplexCondition:SubsonicAPIClient.kt$SubsonicAPIClient$contentType != null && contentType.type().equals("application", true) && contentType.subtype().equals("json", true) + ComplexMethod:AlbumListType.kt$AlbumListType.Companion$@JvmStatic fun fromName(typeName: String): AlbumListType + ComplexMethod:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$@JvmStatic @Throws(IllegalArgumentException::class) fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions + ComplexMethod:SubsonicError.kt$SubsonicError.Companion$fun getError(code: Int, message: String) + EmptyFunctionBlock:SubsonicAPIClient.kt$SubsonicAPIClient.<no name provided>${} + LargeClass:ApiVersionCheckWrapper.kt$ApiVersionCheckWrapper : SubsonicAPIDefinition + LargeClass:SubsonicAPIDefinition.kt$SubsonicAPIDefinition + LongMethod:SubsonicAPIClient.kt$SubsonicAPIClient$private inline fun handleStreamResponse(apiCall: () -> Response<ResponseBody>): StreamResponse + LongMethod:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$@JvmStatic @Throws(IllegalArgumentException::class) fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions + MagicNumber:PasswordExt.kt$0xFF + MagicNumber:PasswordExt.kt$4 + MagicNumber:PasswordMD5Interceptor.kt$PasswordMD5Interceptor$16 + MagicNumber:StreamResponse.kt$StreamResponse$200 + MagicNumber:StreamResponse.kt$StreamResponse$300 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$10 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$11 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$12 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$13 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$14 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$15 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$16 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$3 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$4 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$5 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$6 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$7 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$8 + MagicNumber:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$9 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$10 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$20 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$30 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$40 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$41 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$50 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$60 + MagicNumber:SubsonicError.kt$SubsonicError.Companion$70 + MagicNumber:SubsonicError.kt$SubsonicError.IncompatibleClientProtocolVersion$20 + MagicNumber:SubsonicError.kt$SubsonicError.IncompatibleServerProtocolVersion$30 + MagicNumber:SubsonicError.kt$SubsonicError.RequestedDataWasNotFound$70 + MagicNumber:SubsonicError.kt$SubsonicError.RequiredParamMissing$10 + MagicNumber:SubsonicError.kt$SubsonicError.TokenAuthNotSupportedForLDAP$41 + MagicNumber:SubsonicError.kt$SubsonicError.TrialPeriodIsOver$60 + MagicNumber:SubsonicError.kt$SubsonicError.UserNotAuthorizedForOperation$50 + MagicNumber:SubsonicError.kt$SubsonicError.WrongUsernameOrPassword$40 + ReturnCount:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$@JvmStatic @Throws(IllegalArgumentException::class) fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions + SwallowedException:VersionAwareJacksonConverterFactory.kt$VersionAwareJacksonConverterFactory.VersionAwareResponseBodyConverter$catch (e: IllegalArgumentException) { // no-op } + ThrowsCount:SubsonicAPIVersions.kt$SubsonicAPIVersions.Companion$@JvmStatic @Throws(IllegalArgumentException::class) fun getClosestKnownClientApiVersion(apiVersion: String): SubsonicAPIVersions + TooManyFunctions:ApiVersionCheckWrapper.kt$ApiVersionCheckWrapper : SubsonicAPIDefinition + UnusedPrivateMember:AlbumListType.kt$AlbumListType.Companion$private operator fun String.contains(other: String) + + diff --git a/detekt-baseline-release.xml b/detekt-baseline-release.xml new file mode 100644 index 00000000..fff5d6ce --- /dev/null +++ b/detekt-baseline-release.xml @@ -0,0 +1,261 @@ + + + + + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun finishActivity() + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun getFields(): Boolean + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun setFields() + CommentOverPrivateFunction:EditServerFragment.kt$EditServerFragment$ private fun testConnection() + CommentOverPrivateFunction:FileLoggerTree.kt$FileLoggerTree$ private fun getNextLogFile() + CommentOverPrivateFunction:FileLoggerTree.kt$FileLoggerTree$ private fun getNumberedFile(next: Boolean) + CommentOverPrivateFunction:MediaPlayerService.kt$MediaPlayerService$ private fun buildForegroundNotification( playerState: PlayerState, currentPlaying: DownloadFile? ): Notification + CommentOverPrivateFunction:RESTMusicService.kt$RESTMusicService$ @Throws(Exception::class) private fun search2( criteria: SearchCriteria ): SearchResult + CommentOverPrivateFunction:RESTMusicService.kt$RESTMusicService$ @Throws(Exception::class) private fun searchOld( criteria: SearchCriteria ): SearchResult + CommentOverPrivateFunction:ServerRowAdapter.kt$ServerRowAdapter$ private fun popupMenuItemClick(menuItem: MenuItem, position: Int): Boolean + CommentOverPrivateFunction:ServerRowAdapter.kt$ServerRowAdapter$ private fun serverMenuClick(view: View, position: Int) + CommentOverPrivateFunction:ServerSelectorFragment.kt$ServerSelectorFragment$ private fun editServer(index: Int) + CommentOverPrivateFunction:ServerSelectorFragment.kt$ServerSelectorFragment$ private fun onServerDeleted(index: Int) + CommentOverPrivateFunction:ServerSelectorFragment.kt$ServerSelectorFragment$ private fun setActiveServer(index: Int) + CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private fun loadServerSettingFromPreferences( preferenceId: Int, serverId: Int, settings: SharedPreferences ): ServerSetting? + CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun areIndexesMissing(): Boolean + CommentOverPrivateFunction:ServerSettingsModel.kt$ServerSettingsModel$ private suspend fun reindexSettings() + ComplexCondition:DownloadHandler.kt$DownloadHandler.<no name provided>$!append && !playNext && !unpin && !background + ComplexCondition:DownloadHandler.kt$DownloadHandler.<no name provided>$!isOffline(activity) && isArtist && Util.getShouldUseId3Tags(activity) + ComplexCondition:EditServerFragment.kt$EditServerFragment$urlString != urlString.trim(' ') || urlString.contains("@") || url.host.isNullOrBlank() + ComplexCondition:FilePickerAdapter.kt$FilePickerAdapter$currentDirectory.absolutePath == "/" || currentDirectory.absolutePath == "/storage" || currentDirectory.absolutePath == "/storage/emulated" || currentDirectory.absolutePath == "/mnt" + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$Util.getGaplessPlaybackPreference(context) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && ( playerState === PlayerState.STARTED || playerState === PlayerState.PAUSED ) + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer$playerState !== PlayerState.IDLE && playerState !== PlayerState.DOWNLOADING && playerState !== PlayerState.PREPARING + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$!isPartial || downloadFile.isWorkDone && abs(duration - pos) < 1000 + ComplexCondition:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$Util.getGaplessPlaybackPreference(context) && nextPlaying != null && nextPlayerState === PlayerState.PREPARED + ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.IDLE || localMediaPlayer.playerState === PlayerState.DOWNLOADING || localMediaPlayer.playerState === PlayerState.PREPARING + ComplexCondition:MediaPlayerService.kt$MediaPlayerService$localMediaPlayer.playerState === PlayerState.PAUSED || localMediaPlayer.playerState === PlayerState.COMPLETED || localMediaPlayer.playerState === PlayerState.STOPPED + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled && !deleteEnabled && !isOffline(context) + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$enabled && !isOffline(context) && selection.size > pinnedCount + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment$entry != null && !entry.isDirectory && !entry.isVideo + ComplexCondition:SelectAlbumFragment.kt$SelectAlbumFragment.<no name provided>$Util.getShouldShowAllSongsByArtist(context) && musicDirectory.findChild(allSongsId) == null && musicDirectory.getChildren(true, false).size == musicDirectory.getChildren(true, true).size + ComplexCondition:ServerSettingsModel.kt$ServerSettingsModel$url.isNullOrEmpty() || userName.isNullOrEmpty() || isMigrated + ComplexCondition:SongView.kt$SongView$TextUtils.isEmpty(transcodedSuffix) || transcodedSuffix == suffix || song.isVideo && Util.getVideoPlayerType(this.context) !== VideoPlayerType.FLASH + ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$id != null && view != null && view is ImageView + ComplexCondition:SubsonicImageLoaderProxy.kt$SubsonicImageLoaderProxy$username != null && view != null && view is ImageView + ComplexMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String + ComplexMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute() + ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun areFieldsChanged(): Boolean + ComplexMethod:EditServerFragment.kt$EditServerFragment$ private fun getFields(): Boolean + ComplexMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + ComplexMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun fileLister(currentDirectory: File) + ComplexMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun doPlay(downloadFile: DownloadFile, position: Int, start: Boolean) + ComplexMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun setupNext(downloadFile: DownloadFile) + ComplexMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler() + ComplexMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun enableButtons() + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateDisplay(refresh: Boolean) + ComplexMethod:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$protected override fun done(result: Pair<MusicDirectory, Boolean>) + ComplexMethod:SelectArtistFragment.kt$SelectArtistFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + ComplexMethod:ServerRowAdapter.kt$ServerRowAdapter$ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? + ComplexMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean) + ComplexMethod:SongView.kt$SongView$private fun updateDownloadStatus(downloadFile: DownloadFile) + ComplexMethod:SongView.kt$SongView$public override fun update() + EmptyCatchBlock:LocalMediaPlayer.kt$LocalMediaPlayer${ } + EmptyDefaultConstructor:VideoPlayer.kt$VideoPlayer$() + EmptyFunctionBlock:SongView.kt$SongView${} + FunctionNaming:ThemeChangedEventDistributor.kt$ThemeChangedEventDistributor$fun RaiseThemeChangedEvent() + ImplicitDefaultLocale:DownloadFile.kt$DownloadFile$String.format("DownloadFile (%s)", song) + ImplicitDefaultLocale:DownloadFile.kt$DownloadFile.DownloadTask$String.format("Download of '%s' was cancelled", song) + ImplicitDefaultLocale:DownloadFile.kt$DownloadFile.DownloadTask$String.format("DownloadTask (%s)", song) + ImplicitDefaultLocale:EditServerFragment.kt$EditServerFragment.<no name provided>$String.format( "%s %s", resources.getString(R.string.settings_connection_failure), getErrorMessage(error) ) + ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Failed to write log to %s", file) + ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Log file rotated, logging into file %s", file?.name) + ImplicitDefaultLocale:FileLoggerTree.kt$FileLoggerTree$String.format("Logging into file %s", file?.name) + ImplicitDefaultLocale:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$String.format("BufferTask (%s)", downloadFile) + ImplicitDefaultLocale:LocalMediaPlayer.kt$LocalMediaPlayer.CheckCompletionTask$String.format("CheckCompletionTask (%s)", downloadFile) + ImplicitDefaultLocale:ShareHandler.kt$ShareHandler$String.format("%d:%s", timeSpanAmount, timeSpanType) + ImplicitDefaultLocale:ShareHandler.kt$ShareHandler.<no name provided>$String.format("%s\n\n%s", Util.getShareGreeting(context), result.url) + ImplicitDefaultLocale:SongView.kt$SongView$String.format("%02d.", trackNumber) + ImplicitDefaultLocale:SongView.kt$SongView$String.format("%s ", bitRate) + ImplicitDefaultLocale:SongView.kt$SongView$String.format("%s > %s", suffix, transcodedSuffix) + LargeClass:DownloadFile.kt$DownloadFile + LargeClass:DownloadHandler.kt$DownloadHandler + LargeClass:EditServerFragment.kt$EditServerFragment : FragmentOnBackPressedHandler + LargeClass:FilePickerAdapter.kt$FilePickerAdapter : Adapter + LargeClass:LocalMediaPlayer.kt$LocalMediaPlayer + LargeClass:MediaPlayerService.kt$MediaPlayerService : Service + LargeClass:NavigationActivity.kt$NavigationActivity : AppCompatActivity + LargeClass:RESTMusicService.kt$RESTMusicService : MusicService + LargeClass:SelectAlbumFragment.kt$SelectAlbumFragment : Fragment + LargeClass:SelectAlbumFragment.kt$SelectAlbumFragment$LoadTask : FragmentBackgroundTask + LargeClass:SelectArtistFragment.kt$SelectArtistFragment : Fragment + LargeClass:ServerSettingsModel.kt$ServerSettingsModel : ViewModel + LargeClass:SongView.kt$SongView : UpdateViewCheckable + LongMethod:APIMusicDirectoryConverter.kt$fun MusicDirectoryChild.toDomainEntity(): MusicDirectory.Entry + LongMethod:ActiveServerProvider.kt$ActiveServerProvider$ fun getActiveServer(): ServerSetting + LongMethod:ArtistListModel.kt$ArtistListModel$private suspend fun loadFromServer(refresh: Boolean, swipe: SwipeRefreshLayout) + LongMethod:ArtistRowAdapter.kt$ArtistRowAdapter$override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) + LongMethod:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String + LongMethod:DownloadFile.kt$DownloadFile$private fun updateModificationDate(file: File) + LongMethod:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute() + LongMethod:DownloadHandler.kt$DownloadHandler$fun download( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List<MusicDirectory.Entry?> ) + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$@Throws(Exception::class) private fun getSongsForArtist( id: String, songs: MutableCollection<MusicDirectory.Entry> ) + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$@Throws(Exception::class) private fun getSongsRecursively( parent: MusicDirectory, songs: MutableList<MusicDirectory.Entry> ) + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$@Throws(Throwable::class) override fun doInBackground(): List<MusicDirectory.Entry> + LongMethod:DownloadHandler.kt$DownloadHandler.<no name provided>$override fun done(songs: List<MusicDirectory.Entry>) + LongMethod:EditServerFragment.kt$EditServerFragment$ private fun finishActivity() + LongMethod:EditServerFragment.kt$EditServerFragment$ private fun getFields(): Boolean + LongMethod:EditServerFragment.kt$EditServerFragment$override fun onSaveInstanceState(savedInstanceState: Bundle) + LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewStateRestored(savedInstanceState: Bundle?) + LongMethod:EditServerFragment.kt$EditServerFragment.<no name provided>$@Throws(Throwable::class) override fun doInBackground(): Boolean + LongMethod:FileLoggerTree.kt$FileLoggerTree$ override fun log(priority: Int, tag: String?, message: String, t: Throwable?) + LongMethod:FileLoggerTree.kt$FileLoggerTree$ private fun getNextLogFile() + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$fun createNewFolder() + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun fileLister(currentDirectory: File) + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun getKitKatStorageItems(storages: List<File>): LinkedList<FileListItem> + LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun getStorageItems(): LinkedList<FileListItem> + LongMethod:FilePickerDialog.kt$FilePickerDialog$private fun initialize(context: Context) + LongMethod:ImageLoaderProvider.kt$ImageLoaderProvider$@Synchronized fun getImageLoader(): ImageLoader + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized fun setPlayerState(playerState: PlayerState) + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun doPlay(downloadFile: DownloadFile, position: Int, start: Boolean) + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun setupNext(downloadFile: DownloadFile) + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$fun init() + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$fun release() + LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$override fun onCompletion(mediaPlayer: MediaPlayer) + LongMethod:MediaPlayerService.kt$MediaPlayerService$ private fun buildForegroundNotification( playerState: PlayerState, currentPlaying: DownloadFile? ): Notification + LongMethod:MediaPlayerService.kt$MediaPlayerService$@Synchronized fun setNextPlaying() + LongMethod:MediaPlayerService.kt$MediaPlayerService$override fun onCreate() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun addActions( context: Context, notificationBuilder: NotificationCompat.Builder, playerState: PlayerState, song: MusicDirectory.Entry? ): IntArray + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun generateAction(context: Context, requestCode: Int): NotificationCompat.Action? + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnCurrentPlayingChangedHandler() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnPlayerStateChangedHandler() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler() + LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState) + LongMethod:MediaStoreService.kt$MediaStoreService$fun saveInMediaStore(downloadFile: DownloadFile) + LongMethod:NavigationActivity.kt$NavigationActivity$// TODO Test if this works with external Intents // android.intent.action.SEARCH and android.media.action.MEDIA_PLAY_FROM_SEARCH calls here override fun onNewIntent(intent: Intent?) + LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?) + LongMethod:NavigationActivity.kt$NavigationActivity$private fun showNowPlaying() + LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + LongMethod:RESTMusicService.kt$RESTMusicService$@Throws(IOException::class) private fun savePlaylist( name: String?, context: Context, playlist: MusicDirectory ) + LongMethod:RestErrorMapper.kt$ fun SubsonicRESTException.getLocalizedErrorMessage(context: Context): String + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun downloadBackground(save: Boolean, songs: List<MusicDirectory.Entry?>) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun enableButtons() + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun playAll(shuffle: Boolean = false, append: Boolean = false) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment$private fun updateDisplay(refresh: Boolean) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.<no name provided>$override fun done(result: Pair<MusicDirectory, Boolean>) + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.<no name provided>$override fun load(service: MusicService): MusicDirectory + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$protected fun createHeader( entries: List<MusicDirectory.Entry>, name: CharSequence?, songCount: Int ): View? + LongMethod:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$protected override fun done(result: Pair<MusicDirectory, Boolean>) + LongMethod:SelectArtistFragment.kt$SelectArtistFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:SelectArtistFragment.kt$SelectArtistFragment$private fun onArtistMenuItemSelected(menuItem: MenuItem, artist: Artist): Boolean + LongMethod:ServerRowAdapter.kt$ServerRowAdapter$ override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? + LongMethod:ServerRowAdapter.kt$ServerRowAdapter$ private fun popupMenuItemClick(menuItem: MenuItem, position: Int): Boolean + LongMethod:ServerRowAdapter.kt$ServerRowAdapter$ private fun serverMenuClick(view: View, position: Int) + LongMethod:ServerSelectorFragment.kt$ServerSelectorFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) + LongMethod:ServerSettingsModel.kt$ServerSettingsModel$ fun migrateFromPreferences(): Boolean + LongMethod:ServerSettingsModel.kt$ServerSettingsModel$ private fun loadServerSettingFromPreferences( preferenceId: Int, serverId: Int, settings: SharedPreferences ): ServerSetting? + LongMethod:ShareHandler.kt$ShareHandler$private fun showDialog( fragment: Fragment, shareDetails: ShareDetails, swipe: SwipeRefreshLayout?, cancellationToken: CancellationToken ) + LongMethod:SongView.kt$SongView$fun setLayout(song: MusicDirectory.Entry) + LongMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean) + LongMethod:SongView.kt$SongView$private fun updateDownloadStatus(downloadFile: DownloadFile) + LongMethod:SongView.kt$SongView$public override fun update() + LongMethod:SubsonicUncaughtExceptionHandler.kt$SubsonicUncaughtExceptionHandler$override fun uncaughtException(thread: Thread, throwable: Throwable) + LongMethod:UApp.kt$UApp$override fun onCreate() + LongParameterList:ArtistRowAdapter.kt$ArtistRowAdapter$( private var artistList: List<Artist>, private var selectFolderHeader: SelectMusicFolderView?, val onArtistClick: (Artist) -> Unit, val onContextMenuClick: (MenuItem, Artist) -> Boolean, private val imageLoader: ImageLoader ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, append: Boolean, save: Boolean, autoPlay: Boolean, playNext: Boolean, shuffle: Boolean, songs: List<MusicDirectory.Entry?> ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, id: String, name: String?, isShare: Boolean, isDirectory: Boolean, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, id: String, name: String?, save: Boolean, append: Boolean, autoplay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean ) + LongParameterList:DownloadHandler.kt$DownloadHandler$( fragment: Fragment, id: String?, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean ) + LongParameterList:ServerRowAdapter.kt$ServerRowAdapter$( private var context: Context, private var data: Array<ServerSetting>, private val model: ServerSettingsModel, private val activeServerProvider: ActiveServerProvider, private val manageMode: Boolean, private val serverDeletedCallback: ((Int) -> Unit), private val serverEditRequestedCallback: ((Int) -> Unit) ) + MagicNumber:ActiveServerProvider.kt$ActiveServerProvider$8192 + MagicNumber:AudioFocusHandler.kt$AudioFocusHandler$0.1f + MagicNumber:DownloadFile.kt$DownloadFile$100 + MagicNumber:DownloadFile.kt$DownloadFile.DownloadTask$10 + MagicNumber:DownloadFile.kt$DownloadFile.DownloadTask$1000L + MagicNumber:DownloadFile.kt$DownloadFile.DownloadTask$60 + MagicNumber:DownloadHandler.kt$DownloadHandler$500 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$100 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$3 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$4 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$5 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$6 + MagicNumber:FileLoggerTree.kt$FileLoggerTree$7 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer$100 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer$1000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$1000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.<no name provided>$60000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$100000 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$1000L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$1024L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$8 + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$86400L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.BufferTask$8L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.CheckCompletionTask$5000L + MagicNumber:LocalMediaPlayer.kt$LocalMediaPlayer.PositionCache$50L + MagicNumber:MediaPlayerService.kt$MediaPlayerService$100 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$1000 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$256 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$3 + MagicNumber:MediaPlayerService.kt$MediaPlayerService$4 + MagicNumber:MediaPlayerService.kt$MediaPlayerService.Companion$19 + MagicNumber:MediaPlayerService.kt$MediaPlayerService.Companion$50L + MagicNumber:RESTMusicService.kt$RESTMusicService$206 + MagicNumber:RESTMusicService.kt$RESTMusicService$5 + MagicNumber:SelectAlbumFragment.kt$SelectAlbumFragment$10 + MagicNumber:SelectAlbumFragment.kt$SelectAlbumFragment.LoadTask$10 + MagicNumber:SelectMusicFolderView.kt$SelectMusicFolderView$10 + MagicNumber:SongView.kt$SongView$3 + MagicNumber:SongView.kt$SongView$4 + MagicNumber:SongView.kt$SongView$60 + NestedBlockDepth:DownloadFile.kt$DownloadFile.DownloadTask$override fun execute() + NestedBlockDepth:DownloadHandler.kt$DownloadHandler$private fun downloadRecursively( fragment: Fragment, id: String, name: String?, isShare: Boolean, isDirectory: Boolean, save: Boolean, append: Boolean, autoPlay: Boolean, shuffle: Boolean, background: Boolean, playNext: Boolean, unpin: Boolean, isArtist: Boolean ) + NestedBlockDepth:MediaPlayerService.kt$MediaPlayerService$private fun setupOnSongCompletedHandler() + NestedBlockDepth:SelectAlbumFragment.kt$SelectAlbumFragment$private fun getAlbum(refresh: Boolean, id: String?, name: String?, parentId: String?) + ReturnCount:ActiveServerProvider.kt$ActiveServerProvider$ fun getActiveServer(): ServerSetting + ReturnCount:CommunicationErrorHandler.kt$CommunicationErrorHandler.Companion$fun getErrorMessage(error: Throwable, context: Context): String + ReturnCount:FileLoggerTree.kt$FileLoggerTree$ private fun getNextLogFile() + ReturnCount:MediaPlayerService.kt$MediaPlayerService$private fun generateAction(context: Context, requestCode: Int): NotificationCompat.Action? + ReturnCount:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getAvatar( context: Context, username: String?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + ReturnCount:RESTMusicService.kt$RESTMusicService$@Throws(Exception::class) override fun getCoverArt( context: Context, entry: MusicDirectory.Entry?, size: Int, saveToFile: Boolean, highQuality: Boolean ): Bitmap? + ReturnCount:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onContextItemSelected(menuItem: MenuItem): Boolean + ReturnCount:SelectAlbumFragment.kt$SelectAlbumFragment$override fun onOptionsItemSelected(item: MenuItem): Boolean + ReturnCount:ServerRowAdapter.kt$ServerRowAdapter$ private fun popupMenuItemClick(menuItem: MenuItem, position: Int): Boolean + SpreadOperator:MediaPlayerService.kt$MediaPlayerService$(*compactActions) + SwallowedException:DownloadFile.kt$DownloadFile$catch (e: Exception) { Timber.w("Failed to set last-modified date on %s", file) } + SwallowedException:DownloadFile.kt$DownloadFile$catch (ex: IOException) { Timber.w("Failed to rename file %s to %s", completeFile, saveFile) } + SwallowedException:LocalMediaPlayer.kt$LocalMediaPlayer$catch (e: Throwable) { // Froyo or lower } + SwallowedException:LocalMediaPlayer.kt$LocalMediaPlayer$catch (e: Throwable) { } + SwallowedException:MediaPlayerService.kt$MediaPlayerService$catch (x: IndexOutOfBoundsException) { // Ignored } + SwallowedException:NavigationActivity.kt$NavigationActivity$catch (e: Resources.NotFoundException) { destination.id.toString() } + ThrowsCount:ApiCallResponseChecker.kt$ApiCallResponseChecker.Companion$@Throws(SubsonicRESTException::class, IOException::class) fun checkResponseSuccessful(response: Response<out SubsonicResponse>) + TooGenericExceptionCaught:ArtistListModel.kt$ArtistListModel$exception: Exception + TooGenericExceptionCaught:DownloadFile.kt$DownloadFile$e: Exception + TooGenericExceptionCaught:DownloadFile.kt$DownloadFile.DownloadTask$x: Exception + TooGenericExceptionCaught:FileLoggerTree.kt$FileLoggerTree$x: Throwable + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$e: Throwable + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$ex: Exception + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$exception: Throwable + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer$x: Exception + TooGenericExceptionCaught:LocalMediaPlayer.kt$LocalMediaPlayer.PositionCache$e: Exception + TooGenericExceptionCaught:MediaPlayerService.kt$MediaPlayerService$e: Exception + TooGenericExceptionCaught:MediaPlayerService.kt$MediaPlayerService$x: IndexOutOfBoundsException + TooGenericExceptionCaught:SelectAlbumFragment.kt$SelectAlbumFragment$exception: Exception + TooGenericExceptionCaught:SongView.kt$SongView$e: Exception + TooGenericExceptionCaught:SubsonicUncaughtExceptionHandler.kt$SubsonicUncaughtExceptionHandler$x: Throwable + TooGenericExceptionCaught:VideoPlayer.kt$VideoPlayer$e: Exception + TooGenericExceptionThrown:DownloadFile.kt$DownloadFile.DownloadTask$throw Exception(String.format("Download of '%s' was cancelled", song)) + TooManyFunctions:LocalMediaPlayer.kt$LocalMediaPlayer + TooManyFunctions:MediaPlayerService.kt$MediaPlayerService : Service + TooManyFunctions:RESTMusicService.kt$RESTMusicService : MusicService + TooManyFunctions:SelectAlbumFragment.kt$SelectAlbumFragment : Fragment + TopLevelPropertyNaming:SubsonicUncaughtExceptionHandler.kt$private const val filename = "ultrasonic-stacktrace.txt" + UnusedPrivateMember:RESTMusicService.kt$RESTMusicService.Companion$private const val INDEXES_FOLDER_STORAGE_NAME = "indexes_folder" + UselessCallOnNotNull:FileLoggerTree.kt$FileLoggerTree$fileList.isNullOrEmpty() + UselessCallOnNotNull:FileLoggerTree.kt$FileLoggerTree.Companion$fileList.isNullOrEmpty() + UtilityClassWithPublicConstructor:CommunicationErrorHandler.kt$CommunicationErrorHandler + UtilityClassWithPublicConstructor:FragmentTitle.kt$FragmentTitle + VariableNaming:SelectMusicFolderView.kt$SelectMusicFolderView$private val MENU_GROUP_MUSIC_FOLDER = 10 + + diff --git a/detekt-config.yml b/detekt-config.yml index 4674fd6a..34c3446c 100644 --- a/detekt-config.yml +++ b/detekt-config.yml @@ -1,6 +1,3 @@ -autoCorrect: true -failFast: false - build: maxIssues: 0 weights: @@ -42,26 +39,24 @@ complexity: LongMethod: threshold: 20 LongParameterList: - threshold: 5 + functionThreshold: 5 + constructorThreshold: 5 LargeClass: threshold: 150 ComplexMethod: threshold: 10 TooManyFunctions: - threshold: 20 + thresholdInFiles: 20 + thresholdInClasses: 20 + thresholdInInterfaces: 20 ComplexCondition: threshold: 3 LabeledExpression: active: false -code-smell: - active: true - FeatureEnvy: - threshold: 0.5 - weight: 0.45 - base: 0.5 formatting: + autoCorrect: true active: false style: @@ -78,17 +73,10 @@ style: maxLineLength: 120 excludePackageStatements: false excludeImportStatements: false - NamingConventionViolation: - active: true - variablePattern: '^(_)?[a-z$][a-zA-Z$0-9]*$' - constantPattern: '^([A-Z_]*|serialVersionUID)$' - methodPattern: '^[a-z\s`$][a-zA-Z\s$0-9`]*$' - classPattern: '[A-Z$][a-zA-Z$]*' - enumEntryPattern: '^[A-Z$][a-zA-Z_$0-9]*$' comments: active: true - CommentOverPrivateMethod: + CommentOverPrivateFunction: active: true CommentOverPrivateProperty: active: true @@ -99,12 +87,3 @@ comments: searchInInnerInterface: true UndocumentedPublicFunction: active: false - -# *experimental feature* -# Migration rules can be defined in the same config file or a new one -migration: - active: false - imports: - # your.package.Class: new.package.or.Class - # for example: - # io.gitlab.arturbosch.detekt.api.Rule: io.gitlab.arturbosch.detekt.rule.Rule diff --git a/gradle_scripts/code_quality.gradle b/gradle_scripts/code_quality.gradle index 9b9a5308..b4c49e1b 100644 --- a/gradle_scripts/code_quality.gradle +++ b/gradle_scripts/code_quality.gradle @@ -20,11 +20,13 @@ if (isCodeQualityEnabled) { apply plugin: "io.gitlab.arturbosch.detekt" detekt { - version = versions.detekt - profile("main") { - config = "${rootProject.projectDir}/detekt-config.yml" - } + buildUponDefaultConfig = true + toolVersion = versions.detekt + baseline = file("${rootProject.projectDir}/detekt-baseline.xml") + config = files("${rootProject.projectDir}/detekt-config.yml") } } + tasks.detekt.jvmTarget = "1.8" } + }